From 8d4303a8a83742119aa659a233e78fd800f5761a Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 11 May 2019 15:33:36 +0530 Subject: [PATCH 001/166] Hide home, hide feedback, update logo --- src/lab/exp5/Introduction.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lab/exp5/Introduction.html b/src/lab/exp5/Introduction.html index c0f11e55..c8853d03 100644 --- a/src/lab/exp5/Introduction.html +++ b/src/lab/exp5/Introduction.html @@ -40,7 +40,7 @@ - + @@ -57,15 +57,15 @@ @@ -143,7 +143,7 @@

U
REGISTRATION
LOGIN
--> - Community + Sakshat Portal Outreach Portal @@ -155,7 +155,7 @@

U
FEEDBACK
SAKSHAT PORTAL
-->

Contact us

- Feedback + support@vlabs.ac.in From f07d7e1b7ed9558c8cfa6ebae52dd9afbf1b1671 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 11 May 2019 15:40:49 +0530 Subject: [PATCH 002/166] Hide home, hide feedback, update logo --- src/lab/exp5/Introduction.html | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/lab/exp5/Introduction.html b/src/lab/exp5/Introduction.html index c8853d03..6d773900 100644 --- a/src/lab/exp5/Introduction.html +++ b/src/lab/exp5/Introduction.html @@ -56,17 +56,17 @@ --> From 801335631cbb2cf67c2248124ef78adfad1f5c74 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 11 May 2019 15:49:48 +0530 Subject: [PATCH 003/166] Hide home, hide feedback, update logo, update discipline name --- src/lab/exp5/Introduction.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lab/exp5/Introduction.html b/src/lab/exp5/Introduction.html index 6d773900..551c396c 100644 --- a/src/lab/exp5/Introduction.html +++ b/src/lab/exp5/Introduction.html @@ -88,7 +88,7 @@
-

Computer Science & EngineeringPattern Recognition Lab +

Computer Science & EngineeringPattern Recognition Lab  →List Of Experiments

From 79aba1eb4a30fd3990f1a755afde67d342ab4a4b Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 11 May 2019 15:53:42 +0530 Subject: [PATCH 004/166] Bayesian Classification: Hided home, hided fee --- src/lab/exp5/Introduction.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/lab/exp5/Introduction.html b/src/lab/exp5/Introduction.html index 551c396c..8a0176b3 100644 --- a/src/lab/exp5/Introduction.html +++ b/src/lab/exp5/Introduction.html @@ -56,15 +56,16 @@ --> From 27fa73a619ba4682d915ef42ea5502e5e83c3bdb Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 11 May 2019 15:54:13 +0530 Subject: [PATCH 005/166] Bayesian Classification: Hided home, hided feedback, updated logo, updated discipline name --- src/lab/exp5/Introduction.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lab/exp5/Introduction.html b/src/lab/exp5/Introduction.html index 8a0176b3..4dac8c58 100644 --- a/src/lab/exp5/Introduction.html +++ b/src/lab/exp5/Introduction.html @@ -56,9 +56,9 @@ -->
+ +
+
+

Add Data

+
+ + + +
+
+ +
+

Steps

+
+ + + +
+
+ +
+

Learning Parameter

+ +
+
- -

Learning Parameter

-
- -
-
+ +
+
+

Status

+

Status

+
+ +
+

Value of a

+

[]

+
+
- + + \ No newline at end of file diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js new file mode 100644 index 00000000..5d7c2eb1 --- /dev/null +++ b/SRIP/Codes/exp3.js @@ -0,0 +1,10 @@ +/*Creating Graph1*/ +var xaxis = [-1.00, -0.75, -0.50, -0.25, 0.00, 0.25, 0.50, 0.75, 1.00]; +var ctx = document.getElementById("graph1"); +var myChart = new Chart(ctx, { + type: 'line', + data: { + labels: xaxis + } + +}); \ No newline at end of file diff --git a/SRIP/Libraries/Chart.js b/SRIP/Libraries/Chart.js new file mode 100644 index 00000000..4c50e09b --- /dev/null +++ b/SRIP/Libraries/Chart.js @@ -0,0 +1,14680 @@ +/*! + * Chart.js v2.8.0 + * https://www.chartjs.org + * (c) 2019 Chart.js Contributors + * Released under the MIT License + */ +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(function() { try { return require('moment'); } catch(e) { } }()) : +typeof define === 'function' && define.amd ? define(['require'], function(require) { return factory(function() { try { return require('moment'); } catch(e) { } }()); }) : +(global.Chart = factory(global.moment)); +}(this, (function (moment) { 'use strict'; + +moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment; + +/* MIT license */ + +var conversions = { + rgb2hsl: rgb2hsl, + rgb2hsv: rgb2hsv, + rgb2hwb: rgb2hwb, + rgb2cmyk: rgb2cmyk, + rgb2keyword: rgb2keyword, + rgb2xyz: rgb2xyz, + rgb2lab: rgb2lab, + rgb2lch: rgb2lch, + + hsl2rgb: hsl2rgb, + hsl2hsv: hsl2hsv, + hsl2hwb: hsl2hwb, + hsl2cmyk: hsl2cmyk, + hsl2keyword: hsl2keyword, + + hsv2rgb: hsv2rgb, + hsv2hsl: hsv2hsl, + hsv2hwb: hsv2hwb, + hsv2cmyk: hsv2cmyk, + hsv2keyword: hsv2keyword, + + hwb2rgb: hwb2rgb, + hwb2hsl: hwb2hsl, + hwb2hsv: hwb2hsv, + hwb2cmyk: hwb2cmyk, + hwb2keyword: hwb2keyword, + + cmyk2rgb: cmyk2rgb, + cmyk2hsl: cmyk2hsl, + cmyk2hsv: cmyk2hsv, + cmyk2hwb: cmyk2hwb, + cmyk2keyword: cmyk2keyword, + + keyword2rgb: keyword2rgb, + keyword2hsl: keyword2hsl, + keyword2hsv: keyword2hsv, + keyword2hwb: keyword2hwb, + keyword2cmyk: keyword2cmyk, + keyword2lab: keyword2lab, + keyword2xyz: keyword2xyz, + + xyz2rgb: xyz2rgb, + xyz2lab: xyz2lab, + xyz2lch: xyz2lch, + + lab2xyz: lab2xyz, + lab2rgb: lab2rgb, + lab2lch: lab2lch, + + lch2lab: lch2lab, + lch2xyz: lch2xyz, + lch2rgb: lch2rgb +}; + + +function rgb2hsl(rgb) { + var r = rgb[0]/255, + g = rgb[1]/255, + b = rgb[2]/255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, l; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g)/ delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + l = (min + max) / 2; + + if (max == min) + s = 0; + else if (l <= 0.5) + s = delta / (max + min); + else + s = delta / (2 - max - min); + + return [h, s * 100, l * 100]; +} + +function rgb2hsv(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, v; + + if (max == 0) + s = 0; + else + s = (delta/max * 1000)/10; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g) / delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + v = ((max / 255) * 1000) / 10; + + return [h, s, v]; +} + +function rgb2hwb(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + h = rgb2hsl(rgb)[0], + w = 1/255 * Math.min(r, Math.min(g, b)), + b = 1 - 1/255 * Math.max(r, Math.max(g, b)); + + return [h, w * 100, b * 100]; +} + +function rgb2cmyk(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255, + c, m, y, k; + + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; + return [c * 100, m * 100, y * 100, k * 100]; +} + +function rgb2keyword(rgb) { + return reverseKeywords[JSON.stringify(rgb)]; +} + +function rgb2xyz(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255; + + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y *100, z * 100]; +} + +function rgb2lab(rgb) { + var xyz = rgb2xyz(rgb), + x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function rgb2lch(args) { + return lab2lch(rgb2lab(args)); +} + +function hsl2rgb(hsl) { + var h = hsl[0] / 360, + s = hsl[1] / 100, + l = hsl[2] / 100, + t1, t2, t3, rgb, val; + + if (s == 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) + t2 = l * (1 + s); + else + t2 = l + s - l * s; + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * - (i - 1); + t3 < 0 && t3++; + t3 > 1 && t3--; + + if (6 * t3 < 1) + val = t1 + (t2 - t1) * 6 * t3; + else if (2 * t3 < 1) + val = t2; + else if (3 * t3 < 2) + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + else + val = t1; + + rgb[i] = val * 255; + } + + return rgb; +} + +function hsl2hsv(hsl) { + var h = hsl[0], + s = hsl[1] / 100, + l = hsl[2] / 100, + sv, v; + + if(l === 0) { + // no need to do calc on black + // also avoids divide by 0 error + return [0, 0, 0]; + } + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + v = (l + s) / 2; + sv = (2 * s) / (l + s); + return [h, sv * 100, v * 100]; +} + +function hsl2hwb(args) { + return rgb2hwb(hsl2rgb(args)); +} + +function hsl2cmyk(args) { + return rgb2cmyk(hsl2rgb(args)); +} + +function hsl2keyword(args) { + return rgb2keyword(hsl2rgb(args)); +} + + +function hsv2rgb(hsv) { + var h = hsv[0] / 60, + s = hsv[1] / 100, + v = hsv[2] / 100, + hi = Math.floor(h) % 6; + + var f = h - Math.floor(h), + p = 255 * v * (1 - s), + q = 255 * v * (1 - (s * f)), + t = 255 * v * (1 - (s * (1 - f))), + v = 255 * v; + + switch(hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +} + +function hsv2hsl(hsv) { + var h = hsv[0], + s = hsv[1] / 100, + v = hsv[2] / 100, + sl, l; + + l = (2 - s) * v; + sl = s * v; + sl /= (l <= 1) ? l : 2 - l; + sl = sl || 0; + l /= 2; + return [h, sl * 100, l * 100]; +} + +function hsv2hwb(args) { + return rgb2hwb(hsv2rgb(args)) +} + +function hsv2cmyk(args) { + return rgb2cmyk(hsv2rgb(args)); +} + +function hsv2keyword(args) { + return rgb2keyword(hsv2rgb(args)); +} + +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +function hwb2rgb(hwb) { + var h = hwb[0] / 360, + wh = hwb[1] / 100, + bl = hwb[2] / 100, + ratio = wh + bl, + i, v, f, n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + if ((i & 0x01) != 0) { + f = 1 - f; + } + n = wh + f * (v - wh); // linear interpolation + + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + + return [r * 255, g * 255, b * 255]; +} + +function hwb2hsl(args) { + return rgb2hsl(hwb2rgb(args)); +} + +function hwb2hsv(args) { + return rgb2hsv(hwb2rgb(args)); +} + +function hwb2cmyk(args) { + return rgb2cmyk(hwb2rgb(args)); +} + +function hwb2keyword(args) { + return rgb2keyword(hwb2rgb(args)); +} + +function cmyk2rgb(cmyk) { + var c = cmyk[0] / 100, + m = cmyk[1] / 100, + y = cmyk[2] / 100, + k = cmyk[3] / 100, + r, g, b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + return [r * 255, g * 255, b * 255]; +} + +function cmyk2hsl(args) { + return rgb2hsl(cmyk2rgb(args)); +} + +function cmyk2hsv(args) { + return rgb2hsv(cmyk2rgb(args)); +} + +function cmyk2hwb(args) { + return rgb2hwb(cmyk2rgb(args)); +} + +function cmyk2keyword(args) { + return rgb2keyword(cmyk2rgb(args)); +} + + +function xyz2rgb(xyz) { + var x = xyz[0] / 100, + y = xyz[1] / 100, + z = xyz[2] / 100, + r, g, b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r = (r * 12.92); + + g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g = (g * 12.92); + + b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b = (b * 12.92); + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; +} + +function xyz2lab(xyz) { + var x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function xyz2lch(args) { + return lab2lch(xyz2lab(args)); +} + +function lab2xyz(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + x, y, z, y2; + + if (l <= 8) { + y = (l * 100) / 903.3; + y2 = (7.787 * (y / 100)) + (16 / 116); + } else { + y = 100 * Math.pow((l + 16) / 116, 3); + y2 = Math.pow(y / 100, 1/3); + } + + x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); + + z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); + + return [x, y, z]; +} + +function lab2lch(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + hr, h, c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + if (h < 0) { + h += 360; + } + c = Math.sqrt(a * a + b * b); + return [l, c, h]; +} + +function lab2rgb(args) { + return xyz2rgb(lab2xyz(args)); +} + +function lch2lab(lch) { + var l = lch[0], + c = lch[1], + h = lch[2], + a, b, hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + return [l, a, b]; +} + +function lch2xyz(args) { + return lab2xyz(lch2lab(args)); +} + +function lch2rgb(args) { + return lab2rgb(lch2lab(args)); +} + +function keyword2rgb(keyword) { + return cssKeywords[keyword]; +} + +function keyword2hsl(args) { + return rgb2hsl(keyword2rgb(args)); +} + +function keyword2hsv(args) { + return rgb2hsv(keyword2rgb(args)); +} + +function keyword2hwb(args) { + return rgb2hwb(keyword2rgb(args)); +} + +function keyword2cmyk(args) { + return rgb2cmyk(keyword2rgb(args)); +} + +function keyword2lab(args) { + return rgb2lab(keyword2rgb(args)); +} + +function keyword2xyz(args) { + return rgb2xyz(keyword2rgb(args)); +} + +var cssKeywords = { + aliceblue: [240,248,255], + antiquewhite: [250,235,215], + aqua: [0,255,255], + aquamarine: [127,255,212], + azure: [240,255,255], + beige: [245,245,220], + bisque: [255,228,196], + black: [0,0,0], + blanchedalmond: [255,235,205], + blue: [0,0,255], + blueviolet: [138,43,226], + brown: [165,42,42], + burlywood: [222,184,135], + cadetblue: [95,158,160], + chartreuse: [127,255,0], + chocolate: [210,105,30], + coral: [255,127,80], + cornflowerblue: [100,149,237], + cornsilk: [255,248,220], + crimson: [220,20,60], + cyan: [0,255,255], + darkblue: [0,0,139], + darkcyan: [0,139,139], + darkgoldenrod: [184,134,11], + darkgray: [169,169,169], + darkgreen: [0,100,0], + darkgrey: [169,169,169], + darkkhaki: [189,183,107], + darkmagenta: [139,0,139], + darkolivegreen: [85,107,47], + darkorange: [255,140,0], + darkorchid: [153,50,204], + darkred: [139,0,0], + darksalmon: [233,150,122], + darkseagreen: [143,188,143], + darkslateblue: [72,61,139], + darkslategray: [47,79,79], + darkslategrey: [47,79,79], + darkturquoise: [0,206,209], + darkviolet: [148,0,211], + deeppink: [255,20,147], + deepskyblue: [0,191,255], + dimgray: [105,105,105], + dimgrey: [105,105,105], + dodgerblue: [30,144,255], + firebrick: [178,34,34], + floralwhite: [255,250,240], + forestgreen: [34,139,34], + fuchsia: [255,0,255], + gainsboro: [220,220,220], + ghostwhite: [248,248,255], + gold: [255,215,0], + goldenrod: [218,165,32], + gray: [128,128,128], + green: [0,128,0], + greenyellow: [173,255,47], + grey: [128,128,128], + honeydew: [240,255,240], + hotpink: [255,105,180], + indianred: [205,92,92], + indigo: [75,0,130], + ivory: [255,255,240], + khaki: [240,230,140], + lavender: [230,230,250], + lavenderblush: [255,240,245], + lawngreen: [124,252,0], + lemonchiffon: [255,250,205], + lightblue: [173,216,230], + lightcoral: [240,128,128], + lightcyan: [224,255,255], + lightgoldenrodyellow: [250,250,210], + lightgray: [211,211,211], + lightgreen: [144,238,144], + lightgrey: [211,211,211], + lightpink: [255,182,193], + lightsalmon: [255,160,122], + lightseagreen: [32,178,170], + lightskyblue: [135,206,250], + lightslategray: [119,136,153], + lightslategrey: [119,136,153], + lightsteelblue: [176,196,222], + lightyellow: [255,255,224], + lime: [0,255,0], + limegreen: [50,205,50], + linen: [250,240,230], + magenta: [255,0,255], + maroon: [128,0,0], + mediumaquamarine: [102,205,170], + mediumblue: [0,0,205], + mediumorchid: [186,85,211], + mediumpurple: [147,112,219], + mediumseagreen: [60,179,113], + mediumslateblue: [123,104,238], + mediumspringgreen: [0,250,154], + mediumturquoise: [72,209,204], + mediumvioletred: [199,21,133], + midnightblue: [25,25,112], + mintcream: [245,255,250], + mistyrose: [255,228,225], + moccasin: [255,228,181], + navajowhite: [255,222,173], + navy: [0,0,128], + oldlace: [253,245,230], + olive: [128,128,0], + olivedrab: [107,142,35], + orange: [255,165,0], + orangered: [255,69,0], + orchid: [218,112,214], + palegoldenrod: [238,232,170], + palegreen: [152,251,152], + paleturquoise: [175,238,238], + palevioletred: [219,112,147], + papayawhip: [255,239,213], + peachpuff: [255,218,185], + peru: [205,133,63], + pink: [255,192,203], + plum: [221,160,221], + powderblue: [176,224,230], + purple: [128,0,128], + rebeccapurple: [102, 51, 153], + red: [255,0,0], + rosybrown: [188,143,143], + royalblue: [65,105,225], + saddlebrown: [139,69,19], + salmon: [250,128,114], + sandybrown: [244,164,96], + seagreen: [46,139,87], + seashell: [255,245,238], + sienna: [160,82,45], + silver: [192,192,192], + skyblue: [135,206,235], + slateblue: [106,90,205], + slategray: [112,128,144], + slategrey: [112,128,144], + snow: [255,250,250], + springgreen: [0,255,127], + steelblue: [70,130,180], + tan: [210,180,140], + teal: [0,128,128], + thistle: [216,191,216], + tomato: [255,99,71], + turquoise: [64,224,208], + violet: [238,130,238], + wheat: [245,222,179], + white: [255,255,255], + whitesmoke: [245,245,245], + yellow: [255,255,0], + yellowgreen: [154,205,50] +}; + +var reverseKeywords = {}; +for (var key in cssKeywords) { + reverseKeywords[JSON.stringify(cssKeywords[key])] = key; +} + +var convert = function() { + return new Converter(); +}; + +for (var func in conversions) { + // export Raw versions + convert[func + "Raw"] = (function(func) { + // accept array or plain args + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + return conversions[func](arg); + } + })(func); + + var pair = /(\w+)2(\w+)/.exec(func), + from = pair[1], + to = pair[2]; + + // export rgb2hsl and ["rgb"]["hsl"] + convert[from] = convert[from] || {}; + + convert[from][to] = convert[func] = (function(func) { + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + + var val = conversions[func](arg); + if (typeof val == "string" || val === undefined) + return val; // keyword + + for (var i = 0; i < val.length; i++) + val[i] = Math.round(val[i]); + return val; + } + })(func); +} + + +/* Converter does lazy conversion and caching */ +var Converter = function() { + this.convs = {}; +}; + +/* Either get the values for a space or + set the values for a space, depending on args */ +Converter.prototype.routeSpace = function(space, args) { + var values = args[0]; + if (values === undefined) { + // color.rgb() + return this.getValues(space); + } + // color.rgb(10, 10, 10) + if (typeof values == "number") { + values = Array.prototype.slice.call(args); + } + + return this.setValues(space, values); +}; + +/* Set the values for a space, invalidating cache */ +Converter.prototype.setValues = function(space, values) { + this.space = space; + this.convs = {}; + this.convs[space] = values; + return this; +}; + +/* Get the values for a space. If there's already + a conversion for the space, fetch it, otherwise + compute it */ +Converter.prototype.getValues = function(space) { + var vals = this.convs[space]; + if (!vals) { + var fspace = this.space, + from = this.convs[fspace]; + vals = convert[fspace][space](from); + + this.convs[space] = vals; + } + return vals; +}; + +["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { + Converter.prototype[space] = function(vals) { + return this.routeSpace(space, arguments); + }; +}); + +var colorConvert = convert; + +var colorName = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; + +/* MIT license */ + + +var colorString = { + getRgba: getRgba, + getHsla: getHsla, + getRgb: getRgb, + getHsl: getHsl, + getHwb: getHwb, + getAlpha: getAlpha, + + hexString: hexString, + rgbString: rgbString, + rgbaString: rgbaString, + percentString: percentString, + percentaString: percentaString, + hslString: hslString, + hslaString: hslaString, + hwbString: hwbString, + keyword: keyword +}; + +function getRgba(string) { + if (!string) { + return; + } + var abbr = /^#([a-fA-F0-9]{3,4})$/i, + hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i, + rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + keyword = /(\w+)/; + + var rgb = [0, 0, 0], + a = 1, + match = string.match(abbr), + hexAlpha = ""; + if (match) { + match = match[1]; + hexAlpha = match[3]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i] + match[i], 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(hex)) { + hexAlpha = match[2]; + match = match[1]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(rgba)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i + 1]); + } + a = parseFloat(match[4]); + } + else if (match = string.match(per)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); + } + a = parseFloat(match[4]); + } + else if (match = string.match(keyword)) { + if (match[1] == "transparent") { + return [0, 0, 0, 0]; + } + rgb = colorName[match[1]]; + if (!rgb) { + return; + } + } + + for (var i = 0; i < rgb.length; i++) { + rgb[i] = scale(rgb[i], 0, 255); + } + if (!a && a != 0) { + a = 1; + } + else { + a = scale(a, 0, 1); + } + rgb[3] = a; + return rgb; +} + +function getHsla(string) { + if (!string) { + return; + } + var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hsl); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + s = scale(parseFloat(match[2]), 0, 100), + l = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, s, l, a]; + } +} + +function getHwb(string) { + if (!string) { + return; + } + var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hwb); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + w = scale(parseFloat(match[2]), 0, 100), + b = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, w, b, a]; + } +} + +function getRgb(string) { + var rgba = getRgba(string); + return rgba && rgba.slice(0, 3); +} + +function getHsl(string) { + var hsla = getHsla(string); + return hsla && hsla.slice(0, 3); +} + +function getAlpha(string) { + var vals = getRgba(string); + if (vals) { + return vals[3]; + } + else if (vals = getHsla(string)) { + return vals[3]; + } + else if (vals = getHwb(string)) { + return vals[3]; + } +} + +// generators +function hexString(rgba, a) { + var a = (a !== undefined && rgba.length === 3) ? a : rgba[3]; + return "#" + hexDouble(rgba[0]) + + hexDouble(rgba[1]) + + hexDouble(rgba[2]) + + ( + (a >= 0 && a < 1) + ? hexDouble(Math.round(a * 255)) + : "" + ); +} + +function rgbString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return rgbaString(rgba, alpha); + } + return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; +} + +function rgbaString(rgba, alpha) { + if (alpha === undefined) { + alpha = (rgba[3] !== undefined ? rgba[3] : 1); + } + return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + + ", " + alpha + ")"; +} + +function percentString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return percentaString(rgba, alpha); + } + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + + return "rgb(" + r + "%, " + g + "%, " + b + "%)"; +} + +function percentaString(rgba, alpha) { + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; +} + +function hslString(hsla, alpha) { + if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { + return hslaString(hsla, alpha); + } + return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; +} + +function hslaString(hsla, alpha) { + if (alpha === undefined) { + alpha = (hsla[3] !== undefined ? hsla[3] : 1); + } + return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + + alpha + ")"; +} + +// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax +// (hwb have alpha optional & 1 is default value) +function hwbString(hwb, alpha) { + if (alpha === undefined) { + alpha = (hwb[3] !== undefined ? hwb[3] : 1); + } + return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" + + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; +} + +function keyword(rgb) { + return reverseNames[rgb.slice(0, 3)]; +} + +// helpers +function scale(num, min, max) { + return Math.min(Math.max(min, num), max); +} + +function hexDouble(num) { + var str = num.toString(16).toUpperCase(); + return (str.length < 2) ? "0" + str : str; +} + + +//create a list of reverse color names +var reverseNames = {}; +for (var name in colorName) { + reverseNames[colorName[name]] = name; +} + +/* MIT license */ + + + +var Color = function (obj) { + if (obj instanceof Color) { + return obj; + } + if (!(this instanceof Color)) { + return new Color(obj); + } + + this.valid = false; + this.values = { + rgb: [0, 0, 0], + hsl: [0, 0, 0], + hsv: [0, 0, 0], + hwb: [0, 0, 0], + cmyk: [0, 0, 0, 0], + alpha: 1 + }; + + // parse Color() argument + var vals; + if (typeof obj === 'string') { + vals = colorString.getRgba(obj); + if (vals) { + this.setValues('rgb', vals); + } else if (vals = colorString.getHsla(obj)) { + this.setValues('hsl', vals); + } else if (vals = colorString.getHwb(obj)) { + this.setValues('hwb', vals); + } + } else if (typeof obj === 'object') { + vals = obj; + if (vals.r !== undefined || vals.red !== undefined) { + this.setValues('rgb', vals); + } else if (vals.l !== undefined || vals.lightness !== undefined) { + this.setValues('hsl', vals); + } else if (vals.v !== undefined || vals.value !== undefined) { + this.setValues('hsv', vals); + } else if (vals.w !== undefined || vals.whiteness !== undefined) { + this.setValues('hwb', vals); + } else if (vals.c !== undefined || vals.cyan !== undefined) { + this.setValues('cmyk', vals); + } + } +}; + +Color.prototype = { + isValid: function () { + return this.valid; + }, + rgb: function () { + return this.setSpace('rgb', arguments); + }, + hsl: function () { + return this.setSpace('hsl', arguments); + }, + hsv: function () { + return this.setSpace('hsv', arguments); + }, + hwb: function () { + return this.setSpace('hwb', arguments); + }, + cmyk: function () { + return this.setSpace('cmyk', arguments); + }, + + rgbArray: function () { + return this.values.rgb; + }, + hslArray: function () { + return this.values.hsl; + }, + hsvArray: function () { + return this.values.hsv; + }, + hwbArray: function () { + var values = this.values; + if (values.alpha !== 1) { + return values.hwb.concat([values.alpha]); + } + return values.hwb; + }, + cmykArray: function () { + return this.values.cmyk; + }, + rgbaArray: function () { + var values = this.values; + return values.rgb.concat([values.alpha]); + }, + hslaArray: function () { + var values = this.values; + return values.hsl.concat([values.alpha]); + }, + alpha: function (val) { + if (val === undefined) { + return this.values.alpha; + } + this.setValues('alpha', val); + return this; + }, + + red: function (val) { + return this.setChannel('rgb', 0, val); + }, + green: function (val) { + return this.setChannel('rgb', 1, val); + }, + blue: function (val) { + return this.setChannel('rgb', 2, val); + }, + hue: function (val) { + if (val) { + val %= 360; + val = val < 0 ? 360 + val : val; + } + return this.setChannel('hsl', 0, val); + }, + saturation: function (val) { + return this.setChannel('hsl', 1, val); + }, + lightness: function (val) { + return this.setChannel('hsl', 2, val); + }, + saturationv: function (val) { + return this.setChannel('hsv', 1, val); + }, + whiteness: function (val) { + return this.setChannel('hwb', 1, val); + }, + blackness: function (val) { + return this.setChannel('hwb', 2, val); + }, + value: function (val) { + return this.setChannel('hsv', 2, val); + }, + cyan: function (val) { + return this.setChannel('cmyk', 0, val); + }, + magenta: function (val) { + return this.setChannel('cmyk', 1, val); + }, + yellow: function (val) { + return this.setChannel('cmyk', 2, val); + }, + black: function (val) { + return this.setChannel('cmyk', 3, val); + }, + + hexString: function () { + return colorString.hexString(this.values.rgb); + }, + rgbString: function () { + return colorString.rgbString(this.values.rgb, this.values.alpha); + }, + rgbaString: function () { + return colorString.rgbaString(this.values.rgb, this.values.alpha); + }, + percentString: function () { + return colorString.percentString(this.values.rgb, this.values.alpha); + }, + hslString: function () { + return colorString.hslString(this.values.hsl, this.values.alpha); + }, + hslaString: function () { + return colorString.hslaString(this.values.hsl, this.values.alpha); + }, + hwbString: function () { + return colorString.hwbString(this.values.hwb, this.values.alpha); + }, + keyword: function () { + return colorString.keyword(this.values.rgb, this.values.alpha); + }, + + rgbNumber: function () { + var rgb = this.values.rgb; + return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + }, + + luminosity: function () { + // http://www.w3.org/TR/WCAG20/#relativeluminancedef + var rgb = this.values.rgb; + var lum = []; + for (var i = 0; i < rgb.length; i++) { + var chan = rgb[i] / 255; + lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); + } + return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; + }, + + contrast: function (color2) { + // http://www.w3.org/TR/WCAG20/#contrast-ratiodef + var lum1 = this.luminosity(); + var lum2 = color2.luminosity(); + if (lum1 > lum2) { + return (lum1 + 0.05) / (lum2 + 0.05); + } + return (lum2 + 0.05) / (lum1 + 0.05); + }, + + level: function (color2) { + var contrastRatio = this.contrast(color2); + if (contrastRatio >= 7.1) { + return 'AAA'; + } + + return (contrastRatio >= 4.5) ? 'AA' : ''; + }, + + dark: function () { + // YIQ equation from http://24ways.org/2010/calculating-color-contrast + var rgb = this.values.rgb; + var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; + return yiq < 128; + }, + + light: function () { + return !this.dark(); + }, + + negate: function () { + var rgb = []; + for (var i = 0; i < 3; i++) { + rgb[i] = 255 - this.values.rgb[i]; + } + this.setValues('rgb', rgb); + return this; + }, + + lighten: function (ratio) { + var hsl = this.values.hsl; + hsl[2] += hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + darken: function (ratio) { + var hsl = this.values.hsl; + hsl[2] -= hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + saturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] += hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + desaturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] -= hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + whiten: function (ratio) { + var hwb = this.values.hwb; + hwb[1] += hwb[1] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + blacken: function (ratio) { + var hwb = this.values.hwb; + hwb[2] += hwb[2] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + greyscale: function () { + var rgb = this.values.rgb; + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; + this.setValues('rgb', [val, val, val]); + return this; + }, + + clearer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha - (alpha * ratio)); + return this; + }, + + opaquer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha + (alpha * ratio)); + return this; + }, + + rotate: function (degrees) { + var hsl = this.values.hsl; + var hue = (hsl[0] + degrees) % 360; + hsl[0] = hue < 0 ? 360 + hue : hue; + this.setValues('hsl', hsl); + return this; + }, + + /** + * Ported from sass implementation in C + * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 + */ + mix: function (mixinColor, weight) { + var color1 = this; + var color2 = mixinColor; + var p = weight === undefined ? 0.5 : weight; + + var w = 2 * p - 1; + var a = color1.alpha() - color2.alpha(); + + var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + return this + .rgb( + w1 * color1.red() + w2 * color2.red(), + w1 * color1.green() + w2 * color2.green(), + w1 * color1.blue() + w2 * color2.blue() + ) + .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); + }, + + toJSON: function () { + return this.rgb(); + }, + + clone: function () { + // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, + // making the final build way to big to embed in Chart.js. So let's do it manually, + // assuming that values to clone are 1 dimension arrays containing only numbers, + // except 'alpha' which is a number. + var result = new Color(); + var source = this.values; + var target = result.values; + var value, type; + + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + value = source[prop]; + type = ({}).toString.call(value); + if (type === '[object Array]') { + target[prop] = value.slice(0); + } else if (type === '[object Number]') { + target[prop] = value; + } else { + console.error('unexpected color value:', value); + } + } + } + + return result; + } +}; + +Color.prototype.spaces = { + rgb: ['red', 'green', 'blue'], + hsl: ['hue', 'saturation', 'lightness'], + hsv: ['hue', 'saturation', 'value'], + hwb: ['hue', 'whiteness', 'blackness'], + cmyk: ['cyan', 'magenta', 'yellow', 'black'] +}; + +Color.prototype.maxes = { + rgb: [255, 255, 255], + hsl: [360, 100, 100], + hsv: [360, 100, 100], + hwb: [360, 100, 100], + cmyk: [100, 100, 100, 100] +}; + +Color.prototype.getValues = function (space) { + var values = this.values; + var vals = {}; + + for (var i = 0; i < space.length; i++) { + vals[space.charAt(i)] = values[space][i]; + } + + if (values.alpha !== 1) { + vals.a = values.alpha; + } + + // {r: 255, g: 255, b: 255, a: 0.4} + return vals; +}; + +Color.prototype.setValues = function (space, vals) { + var values = this.values; + var spaces = this.spaces; + var maxes = this.maxes; + var alpha = 1; + var i; + + this.valid = true; + + if (space === 'alpha') { + alpha = vals; + } else if (vals.length) { + // [10, 10, 10] + values[space] = vals.slice(0, space.length); + alpha = vals[space.length]; + } else if (vals[space.charAt(0)] !== undefined) { + // {r: 10, g: 10, b: 10} + for (i = 0; i < space.length; i++) { + values[space][i] = vals[space.charAt(i)]; + } + + alpha = vals.a; + } else if (vals[spaces[space][0]] !== undefined) { + // {red: 10, green: 10, blue: 10} + var chans = spaces[space]; + + for (i = 0; i < space.length; i++) { + values[space][i] = vals[chans[i]]; + } + + alpha = vals.alpha; + } + + values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); + + if (space === 'alpha') { + return false; + } + + var capped; + + // cap values of the space prior converting all values + for (i = 0; i < space.length; i++) { + capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); + values[space][i] = Math.round(capped); + } + + // convert to all the other color spaces + for (var sname in spaces) { + if (sname !== space) { + values[sname] = colorConvert[space][sname](values[space]); + } + } + + return true; +}; + +Color.prototype.setSpace = function (space, args) { + var vals = args[0]; + + if (vals === undefined) { + // color.rgb() + return this.getValues(space); + } + + // color.rgb(10, 10, 10) + if (typeof vals === 'number') { + vals = Array.prototype.slice.call(args); + } + + this.setValues(space, vals); + return this; +}; + +Color.prototype.setChannel = function (space, index, val) { + var svalues = this.values[space]; + if (val === undefined) { + // color.red() + return svalues[index]; + } else if (val === svalues[index]) { + // color.red(color.red()) + return this; + } + + // color.red(100) + svalues[index] = val; + this.setValues(space, svalues); + + return this; +}; + +if (typeof window !== 'undefined') { + window.Color = Color; +} + +var chartjsColor = Color; + +/** + * @namespace Chart.helpers + */ +var helpers = { + /** + * An empty function that can be used, for example, for optional callback. + */ + noop: function() {}, + + /** + * Returns a unique id, sequentially generated from a global variable. + * @returns {number} + * @function + */ + uid: (function() { + var id = 0; + return function() { + return id++; + }; + }()), + + /** + * Returns true if `value` is neither null nor undefined, else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isNullOrUndef: function(value) { + return value === null || typeof value === 'undefined'; + }, + + /** + * Returns true if `value` is an array (including typed arrays), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @function + */ + isArray: function(value) { + if (Array.isArray && Array.isArray(value)) { + return true; + } + var type = Object.prototype.toString.call(value); + if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { + return true; + } + return false; + }, + + /** + * Returns true if `value` is an object (excluding null), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isObject: function(value) { + return value !== null && Object.prototype.toString.call(value) === '[object Object]'; + }, + + /** + * Returns true if `value` is a finite number, else returns false + * @param {*} value - The value to test. + * @returns {boolean} + */ + isFinite: function(value) { + return (typeof value === 'number' || value instanceof Number) && isFinite(value); + }, + + /** + * Returns `value` if defined, else returns `defaultValue`. + * @param {*} value - The value to return if defined. + * @param {*} defaultValue - The value to return if `value` is undefined. + * @returns {*} + */ + valueOrDefault: function(value, defaultValue) { + return typeof value === 'undefined' ? defaultValue : value; + }, + + /** + * Returns value at the given `index` in array if defined, else returns `defaultValue`. + * @param {Array} value - The array to lookup for value at `index`. + * @param {number} index - The index in `value` to lookup for value. + * @param {*} defaultValue - The value to return if `value[index]` is undefined. + * @returns {*} + */ + valueAtIndexOrDefault: function(value, index, defaultValue) { + return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); + }, + + /** + * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the + * value returned by `fn`. If `fn` is not a function, this method returns undefined. + * @param {function} fn - The function to call. + * @param {Array|undefined|null} args - The arguments with which `fn` should be called. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @returns {*} + */ + callback: function(fn, args, thisArg) { + if (fn && typeof fn.call === 'function') { + return fn.apply(thisArg, args); + } + }, + + /** + * Note(SB) for performance sake, this method should only be used when loopable type + * is unknown or in none intensive code (not called often and small loopable). Else + * it's preferable to use a regular for() loop and save extra function calls. + * @param {object|Array} loopable - The object or array to be iterated. + * @param {function} fn - The function to call for each item. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @param {boolean} [reverse] - If true, iterates backward on the loopable. + */ + each: function(loopable, fn, thisArg, reverse) { + var i, len, keys; + if (helpers.isArray(loopable)) { + len = loopable.length; + if (reverse) { + for (i = len - 1; i >= 0; i--) { + fn.call(thisArg, loopable[i], i); + } + } else { + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[i], i); + } + } + } else if (helpers.isObject(loopable)) { + keys = Object.keys(loopable); + len = keys.length; + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[keys[i]], keys[i]); + } + } + }, + + /** + * Returns true if the `a0` and `a1` arrays have the same content, else returns false. + * @see https://stackoverflow.com/a/14853974 + * @param {Array} a0 - The array to compare + * @param {Array} a1 - The array to compare + * @returns {boolean} + */ + arrayEquals: function(a0, a1) { + var i, ilen, v0, v1; + + if (!a0 || !a1 || a0.length !== a1.length) { + return false; + } + + for (i = 0, ilen = a0.length; i < ilen; ++i) { + v0 = a0[i]; + v1 = a1[i]; + + if (v0 instanceof Array && v1 instanceof Array) { + if (!helpers.arrayEquals(v0, v1)) { + return false; + } + } else if (v0 !== v1) { + // NOTE: two different object instances will never be equal: {x:20} != {x:20} + return false; + } + } + + return true; + }, + + /** + * Returns a deep copy of `source` without keeping references on objects and arrays. + * @param {*} source - The value to clone. + * @returns {*} + */ + clone: function(source) { + if (helpers.isArray(source)) { + return source.map(helpers.clone); + } + + if (helpers.isObject(source)) { + var target = {}; + var keys = Object.keys(source); + var klen = keys.length; + var k = 0; + + for (; k < klen; ++k) { + target[keys[k]] = helpers.clone(source[keys[k]]); + } + + return target; + } + + return source; + }, + + /** + * The default merger when Chart.helpers.merge is called without merger option. + * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. + * @private + */ + _merger: function(key, target, source, options) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.merge(tval, sval, options); + } else { + target[key] = helpers.clone(sval); + } + }, + + /** + * Merges source[key] in target[key] only if target[key] is undefined. + * @private + */ + _mergerIf: function(key, target, source) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.mergeIf(tval, sval); + } else if (!target.hasOwnProperty(key)) { + target[key] = helpers.clone(sval); + } + }, + + /** + * Recursively deep copies `source` properties into `target` with the given `options`. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @param {object} [options] - Merging options: + * @param {function} [options.merger] - The merge method (key, target, source, options) + * @returns {object} The `target` object. + */ + merge: function(target, source, options) { + var sources = helpers.isArray(source) ? source : [source]; + var ilen = sources.length; + var merge, i, keys, klen, k; + + if (!helpers.isObject(target)) { + return target; + } + + options = options || {}; + merge = options.merger || helpers._merger; + + for (i = 0; i < ilen; ++i) { + source = sources[i]; + if (!helpers.isObject(source)) { + continue; + } + + keys = Object.keys(source); + for (k = 0, klen = keys.length; k < klen; ++k) { + merge(keys[k], target, source, options); + } + } + + return target; + }, + + /** + * Recursively deep copies `source` properties into `target` *only* if not defined in target. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @returns {object} The `target` object. + */ + mergeIf: function(target, source) { + return helpers.merge(target, source, {merger: helpers._mergerIf}); + }, + + /** + * Applies the contents of two or more objects together into the first object. + * @param {object} target - The target object in which all objects are merged into. + * @param {object} arg1 - Object containing additional properties to merge in target. + * @param {object} argN - Additional objects containing properties to merge in target. + * @returns {object} The `target` object. + */ + extend: function(target) { + var setFn = function(value, key) { + target[key] = value; + }; + for (var i = 1, ilen = arguments.length; i < ilen; ++i) { + helpers.each(arguments[i], setFn); + } + return target; + }, + + /** + * Basic javascript inheritance based on the model created in Backbone.js + */ + inherits: function(extensions) { + var me = this; + var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { + return me.apply(this, arguments); + }; + + var Surrogate = function() { + this.constructor = ChartElement; + }; + + Surrogate.prototype = me.prototype; + ChartElement.prototype = new Surrogate(); + ChartElement.extend = helpers.inherits; + + if (extensions) { + helpers.extend(ChartElement.prototype, extensions); + } + + ChartElement.__super__ = me.prototype; + return ChartElement; + } +}; + +var helpers_core = helpers; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.callback instead. + * @function Chart.helpers.callCallback + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +helpers.callCallback = helpers.callback; + +/** + * Provided for backward compatibility, use Array.prototype.indexOf instead. + * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ + * @function Chart.helpers.indexOf + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.indexOf = function(array, item, fromIndex) { + return Array.prototype.indexOf.call(array, item, fromIndex); +}; + +/** + * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. + * @function Chart.helpers.getValueOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueOrDefault = helpers.valueOrDefault; + +/** + * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. + * @function Chart.helpers.getValueAtIndexOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + +/** + * Easing functions adapted from Robert Penner's easing equations. + * @namespace Chart.helpers.easingEffects + * @see http://www.robertpenner.com/easing/ + */ +var effects = { + linear: function(t) { + return t; + }, + + easeInQuad: function(t) { + return t * t; + }, + + easeOutQuad: function(t) { + return -t * (t - 2); + }, + + easeInOutQuad: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t; + } + return -0.5 * ((--t) * (t - 2) - 1); + }, + + easeInCubic: function(t) { + return t * t * t; + }, + + easeOutCubic: function(t) { + return (t = t - 1) * t * t + 1; + }, + + easeInOutCubic: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t; + } + return 0.5 * ((t -= 2) * t * t + 2); + }, + + easeInQuart: function(t) { + return t * t * t * t; + }, + + easeOutQuart: function(t) { + return -((t = t - 1) * t * t * t - 1); + }, + + easeInOutQuart: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t; + } + return -0.5 * ((t -= 2) * t * t * t - 2); + }, + + easeInQuint: function(t) { + return t * t * t * t * t; + }, + + easeOutQuint: function(t) { + return (t = t - 1) * t * t * t * t + 1; + }, + + easeInOutQuint: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t * t; + } + return 0.5 * ((t -= 2) * t * t * t * t + 2); + }, + + easeInSine: function(t) { + return -Math.cos(t * (Math.PI / 2)) + 1; + }, + + easeOutSine: function(t) { + return Math.sin(t * (Math.PI / 2)); + }, + + easeInOutSine: function(t) { + return -0.5 * (Math.cos(Math.PI * t) - 1); + }, + + easeInExpo: function(t) { + return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); + }, + + easeOutExpo: function(t) { + return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; + }, + + easeInOutExpo: function(t) { + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if ((t /= 0.5) < 1) { + return 0.5 * Math.pow(2, 10 * (t - 1)); + } + return 0.5 * (-Math.pow(2, -10 * --t) + 2); + }, + + easeInCirc: function(t) { + if (t >= 1) { + return t; + } + return -(Math.sqrt(1 - t * t) - 1); + }, + + easeOutCirc: function(t) { + return Math.sqrt(1 - (t = t - 1) * t); + }, + + easeInOutCirc: function(t) { + if ((t /= 0.5) < 1) { + return -0.5 * (Math.sqrt(1 - t * t) - 1); + } + return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + + easeInElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + }, + + easeOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; + }, + + easeInOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if ((t /= 0.5) === 2) { + return 1; + } + if (!p) { + p = 0.45; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + if (t < 1) { + return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function(t) { + var s = 1.70158; + return t * t * ((s + 1) * t - s); + }, + + easeOutBack: function(t) { + var s = 1.70158; + return (t = t - 1) * t * ((s + 1) * t + s) + 1; + }, + + easeInOutBack: function(t) { + var s = 1.70158; + if ((t /= 0.5) < 1) { + return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); + } + return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + + easeInBounce: function(t) { + return 1 - effects.easeOutBounce(1 - t); + }, + + easeOutBounce: function(t) { + if (t < (1 / 2.75)) { + return 7.5625 * t * t; + } + if (t < (2 / 2.75)) { + return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; + } + if (t < (2.5 / 2.75)) { + return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; + } + return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; + }, + + easeInOutBounce: function(t) { + if (t < 0.5) { + return effects.easeInBounce(t * 2) * 0.5; + } + return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; + } +}; + +var helpers_easing = { + effects: effects +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.easing.effects instead. + * @function Chart.helpers.easingEffects + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.easingEffects = effects; + +var PI = Math.PI; +var RAD_PER_DEG = PI / 180; +var DOUBLE_PI = PI * 2; +var HALF_PI = PI / 2; +var QUARTER_PI = PI / 4; +var TWO_THIRDS_PI = PI * 2 / 3; + +/** + * @namespace Chart.helpers.canvas + */ +var exports$1 = { + /** + * Clears the entire canvas associated to the given `chart`. + * @param {Chart} chart - The chart for which to clear the canvas. + */ + clear: function(chart) { + chart.ctx.clearRect(0, 0, chart.width, chart.height); + }, + + /** + * Creates a "path" for a rectangle with rounded corners at position (x, y) with a + * given size (width, height) and the same `radius` for all corners. + * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. + * @param {number} x - The x axis of the coordinate for the rectangle starting point. + * @param {number} y - The y axis of the coordinate for the rectangle starting point. + * @param {number} width - The rectangle's width. + * @param {number} height - The rectangle's height. + * @param {number} radius - The rounded amount (in pixels) for the four corners. + * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? + */ + roundedRect: function(ctx, x, y, width, height, radius) { + if (radius) { + var r = Math.min(radius, height / 2, width / 2); + var left = x + r; + var top = y + r; + var right = x + width - r; + var bottom = y + height - r; + + ctx.moveTo(x, top); + if (left < right && top < bottom) { + ctx.arc(left, top, r, -PI, -HALF_PI); + ctx.arc(right, top, r, -HALF_PI, 0); + ctx.arc(right, bottom, r, 0, HALF_PI); + ctx.arc(left, bottom, r, HALF_PI, PI); + } else if (left < right) { + ctx.moveTo(left, y); + ctx.arc(right, top, r, -HALF_PI, HALF_PI); + ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); + } else if (top < bottom) { + ctx.arc(left, top, r, -PI, 0); + ctx.arc(left, bottom, r, 0, PI); + } else { + ctx.arc(left, top, r, -PI, PI); + } + ctx.closePath(); + ctx.moveTo(x, y); + } else { + ctx.rect(x, y, width, height); + } + }, + + drawPoint: function(ctx, style, radius, x, y, rotation) { + var type, xOffset, yOffset, size, cornerRadius; + var rad = (rotation || 0) * RAD_PER_DEG; + + if (style && typeof style === 'object') { + type = style.toString(); + if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { + ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); + return; + } + } + + if (isNaN(radius) || radius <= 0) { + return; + } + + ctx.beginPath(); + + switch (style) { + // Default includes circle + default: + ctx.arc(x, y, radius, 0, DOUBLE_PI); + ctx.closePath(); + break; + case 'triangle': + ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + ctx.closePath(); + break; + case 'rectRounded': + // NOTE: the rounded rect implementation changed to use `arc` instead of + // `quadraticCurveTo` since it generates better results when rect is + // almost a circle. 0.516 (instead of 0.5) produces results with visually + // closer proportion to the previous impl and it is inscribed in the + // circle with `radius`. For more details, see the following PRs: + // https://github.com/chartjs/Chart.js/issues/5597 + // https://github.com/chartjs/Chart.js/issues/5858 + cornerRadius = radius * 0.516; + size = radius - cornerRadius; + xOffset = Math.cos(rad + QUARTER_PI) * size; + yOffset = Math.sin(rad + QUARTER_PI) * size; + ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); + ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); + ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); + ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); + ctx.closePath(); + break; + case 'rect': + if (!rotation) { + size = Math.SQRT1_2 * radius; + ctx.rect(x - size, y - size, 2 * size, 2 * size); + break; + } + rad += QUARTER_PI; + /* falls through */ + case 'rectRot': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + yOffset, y - xOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.lineTo(x - yOffset, y + xOffset); + ctx.closePath(); + break; + case 'crossRot': + rad += QUARTER_PI; + /* falls through */ + case 'cross': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'star': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + rad += QUARTER_PI; + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'line': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + break; + case 'dash': + ctx.moveTo(x, y); + ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); + break; + } + + ctx.fill(); + ctx.stroke(); + }, + + /** + * Returns true if the point is inside the rectangle + * @param {object} point - The point to test + * @param {object} area - The rectangle + * @returns {boolean} + * @private + */ + _isPointInArea: function(point, area) { + var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error. + + return point.x > area.left - epsilon && point.x < area.right + epsilon && + point.y > area.top - epsilon && point.y < area.bottom + epsilon; + }, + + clipArea: function(ctx, area) { + ctx.save(); + ctx.beginPath(); + ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); + ctx.clip(); + }, + + unclipArea: function(ctx) { + ctx.restore(); + }, + + lineTo: function(ctx, previous, target, flip) { + var stepped = target.steppedLine; + if (stepped) { + if (stepped === 'middle') { + var midpoint = (previous.x + target.x) / 2.0; + ctx.lineTo(midpoint, flip ? target.y : previous.y); + ctx.lineTo(midpoint, flip ? previous.y : target.y); + } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) { + ctx.lineTo(previous.x, target.y); + } else { + ctx.lineTo(target.x, previous.y); + } + ctx.lineTo(target.x, target.y); + return; + } + + if (!target.tension) { + ctx.lineTo(target.x, target.y); + return; + } + + ctx.bezierCurveTo( + flip ? previous.controlPointPreviousX : previous.controlPointNextX, + flip ? previous.controlPointPreviousY : previous.controlPointNextY, + flip ? target.controlPointNextX : target.controlPointPreviousX, + flip ? target.controlPointNextY : target.controlPointPreviousY, + target.x, + target.y); + } +}; + +var helpers_canvas = exports$1; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. + * @namespace Chart.helpers.clear + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.clear = exports$1.clear; + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. + * @namespace Chart.helpers.drawRoundedRectangle + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.drawRoundedRectangle = function(ctx) { + ctx.beginPath(); + exports$1.roundedRect.apply(exports$1, arguments); +}; + +var defaults = { + /** + * @private + */ + _set: function(scope, values) { + return helpers_core.merge(this[scope] || (this[scope] = {}), values); + } +}; + +defaults._set('global', { + defaultColor: 'rgba(0,0,0,0.1)', + defaultFontColor: '#666', + defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + defaultFontSize: 12, + defaultFontStyle: 'normal', + defaultLineHeight: 1.2, + showLines: true +}); + +var core_defaults = defaults; + +var valueOrDefault = helpers_core.valueOrDefault; + +/** + * Converts the given font object into a CSS font string. + * @param {object} font - A font object. + * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font + * @private + */ +function toFontString(font) { + if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) { + return null; + } + + return (font.style ? font.style + ' ' : '') + + (font.weight ? font.weight + ' ' : '') + + font.size + 'px ' + + font.family; +} + +/** + * @alias Chart.helpers.options + * @namespace + */ +var helpers_options = { + /** + * Converts the given line height `value` in pixels for a specific font `size`. + * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). + * @param {number} size - The font size (in pixels) used to resolve relative `value`. + * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid). + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height + * @since 2.7.0 + */ + toLineHeight: function(value, size) { + var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); + if (!matches || matches[1] === 'normal') { + return size * 1.2; + } + + value = +matches[2]; + + switch (matches[3]) { + case 'px': + return value; + case '%': + value /= 100; + break; + default: + break; + } + + return size * value; + }, + + /** + * Converts the given value into a padding object with pre-computed width/height. + * @param {number|object} value - If a number, set the value to all TRBL component, + * else, if and object, use defined properties and sets undefined ones to 0. + * @returns {object} The padding values (top, right, bottom, left, width, height) + * @since 2.7.0 + */ + toPadding: function(value) { + var t, r, b, l; + + if (helpers_core.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + top: t, + right: r, + bottom: b, + left: l, + height: t + b, + width: l + r + }; + }, + + /** + * Parses font options and returns the font object. + * @param {object} options - A object that contains font options to be parsed. + * @return {object} The font object. + * @todo Support font.* options and renamed to toFont(). + * @private + */ + _parseFont: function(options) { + var globalDefaults = core_defaults.global; + var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); + var font = { + family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily), + lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size), + size: size, + style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle), + weight: null, + string: '' + }; + + font.string = toFontString(font); + return font; + }, + + /** + * Evaluates the given `inputs` sequentially and returns the first defined value. + * @param {Array} inputs - An array of values, falling back to the last value. + * @param {object} [context] - If defined and the current value is a function, the value + * is called with `context` as first argument and the result becomes the new input. + * @param {number} [index] - If defined and the current value is an array, the value + * at `index` become the new input. + * @since 2.7.0 + */ + resolve: function(inputs, context, index) { + var i, ilen, value; + + for (i = 0, ilen = inputs.length; i < ilen; ++i) { + value = inputs[i]; + if (value === undefined) { + continue; + } + if (context !== undefined && typeof value === 'function') { + value = value(context); + } + if (index !== undefined && helpers_core.isArray(value)) { + value = value[index]; + } + if (value !== undefined) { + return value; + } + } + } +}; + +var helpers$1 = helpers_core; +var easing = helpers_easing; +var canvas = helpers_canvas; +var options = helpers_options; +helpers$1.easing = easing; +helpers$1.canvas = canvas; +helpers$1.options = options; + +function interpolate(start, view, model, ease) { + var keys = Object.keys(model); + var i, ilen, key, actual, origin, target, type, c0, c1; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + + target = model[key]; + + // if a value is added to the model after pivot() has been called, the view + // doesn't contain it, so let's initialize the view to the target value. + if (!view.hasOwnProperty(key)) { + view[key] = target; + } + + actual = view[key]; + + if (actual === target || key[0] === '_') { + continue; + } + + if (!start.hasOwnProperty(key)) { + start[key] = actual; + } + + origin = start[key]; + + type = typeof target; + + if (type === typeof origin) { + if (type === 'string') { + c0 = chartjsColor(origin); + if (c0.valid) { + c1 = chartjsColor(target); + if (c1.valid) { + view[key] = c1.mix(c0, ease).rgbString(); + continue; + } + } + } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) { + view[key] = origin + (target - origin) * ease; + continue; + } + } + + view[key] = target; + } +} + +var Element = function(configuration) { + helpers$1.extend(this, configuration); + this.initialize.apply(this, arguments); +}; + +helpers$1.extend(Element.prototype, { + + initialize: function() { + this.hidden = false; + }, + + pivot: function() { + var me = this; + if (!me._view) { + me._view = helpers$1.clone(me._model); + } + me._start = {}; + return me; + }, + + transition: function(ease) { + var me = this; + var model = me._model; + var start = me._start; + var view = me._view; + + // No animation -> No Transition + if (!model || ease === 1) { + me._view = model; + me._start = null; + return me; + } + + if (!view) { + view = me._view = {}; + } + + if (!start) { + start = me._start = {}; + } + + interpolate(start, view, model, ease); + + return me; + }, + + tooltipPosition: function() { + return { + x: this._model.x, + y: this._model.y + }; + }, + + hasValue: function() { + return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y); + } +}); + +Element.extend = helpers$1.inherits; + +var core_element = Element; + +var exports$2 = core_element.extend({ + chart: null, // the animation associated chart instance + currentStep: 0, // the current animation step + numSteps: 60, // default number of steps + easing: '', // the easing to use for this animation + render: null, // render function used by the animation service + + onAnimationProgress: null, // user specified callback to fire on each step of the animation + onAnimationComplete: null, // user specified callback to fire when the animation finishes +}); + +var core_animation = exports$2; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.Animation instead + * @prop Chart.Animation#animationObject + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$2.prototype, 'animationObject', { + get: function() { + return this; + } +}); + +/** + * Provided for backward compatibility, use Chart.Animation#chart instead + * @prop Chart.Animation#chartInstance + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$2.prototype, 'chartInstance', { + get: function() { + return this.chart; + }, + set: function(value) { + this.chart = value; + } +}); + +core_defaults._set('global', { + animation: { + duration: 1000, + easing: 'easeOutQuart', + onProgress: helpers$1.noop, + onComplete: helpers$1.noop + } +}); + +var core_animations = { + animations: [], + request: null, + + /** + * @param {Chart} chart - The chart to animate. + * @param {Chart.Animation} animation - The animation that we will animate. + * @param {number} duration - The animation duration in ms. + * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions + */ + addAnimation: function(chart, animation, duration, lazy) { + var animations = this.animations; + var i, ilen; + + animation.chart = chart; + animation.startTime = Date.now(); + animation.duration = duration; + + if (!lazy) { + chart.animating = true; + } + + for (i = 0, ilen = animations.length; i < ilen; ++i) { + if (animations[i].chart === chart) { + animations[i] = animation; + return; + } + } + + animations.push(animation); + + // If there are no animations queued, manually kickstart a digest, for lack of a better word + if (animations.length === 1) { + this.requestAnimationFrame(); + } + }, + + cancelAnimation: function(chart) { + var index = helpers$1.findIndex(this.animations, function(animation) { + return animation.chart === chart; + }); + + if (index !== -1) { + this.animations.splice(index, 1); + chart.animating = false; + } + }, + + requestAnimationFrame: function() { + var me = this; + if (me.request === null) { + // Skip animation frame requests until the active one is executed. + // This can happen when processing mouse events, e.g. 'mousemove' + // and 'mouseout' events will trigger multiple renders. + me.request = helpers$1.requestAnimFrame.call(window, function() { + me.request = null; + me.startDigest(); + }); + } + }, + + /** + * @private + */ + startDigest: function() { + var me = this; + + me.advance(); + + // Do we have more stuff to animate? + if (me.animations.length > 0) { + me.requestAnimationFrame(); + } + }, + + /** + * @private + */ + advance: function() { + var animations = this.animations; + var animation, chart, numSteps, nextStep; + var i = 0; + + // 1 animation per chart, so we are looping charts here + while (i < animations.length) { + animation = animations[i]; + chart = animation.chart; + numSteps = animation.numSteps; + + // Make sure that currentStep starts at 1 + // https://github.com/chartjs/Chart.js/issues/6104 + nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1; + animation.currentStep = Math.min(nextStep, numSteps); + + helpers$1.callback(animation.render, [chart, animation], chart); + helpers$1.callback(animation.onAnimationProgress, [animation], chart); + + if (animation.currentStep >= numSteps) { + helpers$1.callback(animation.onAnimationComplete, [animation], chart); + chart.animating = false; + animations.splice(i, 1); + } else { + ++i; + } + } + } +}; + +var resolve = helpers$1.options.resolve; + +var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; + +/** + * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', + * 'unshift') and notify the listener AFTER the array has been altered. Listeners are + * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. + */ +function listenArrayEvents(array, listener) { + if (array._chartjs) { + array._chartjs.listeners.push(listener); + return; + } + + Object.defineProperty(array, '_chartjs', { + configurable: true, + enumerable: false, + value: { + listeners: [listener] + } + }); + + arrayEvents.forEach(function(key) { + var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); + var base = array[key]; + + Object.defineProperty(array, key, { + configurable: true, + enumerable: false, + value: function() { + var args = Array.prototype.slice.call(arguments); + var res = base.apply(this, args); + + helpers$1.each(array._chartjs.listeners, function(object) { + if (typeof object[method] === 'function') { + object[method].apply(object, args); + } + }); + + return res; + } + }); + }); +} + +/** + * Removes the given array event listener and cleanup extra attached properties (such as + * the _chartjs stub and overridden methods) if array doesn't have any more listeners. + */ +function unlistenArrayEvents(array, listener) { + var stub = array._chartjs; + if (!stub) { + return; + } + + var listeners = stub.listeners; + var index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + + if (listeners.length > 0) { + return; + } + + arrayEvents.forEach(function(key) { + delete array[key]; + }); + + delete array._chartjs; +} + +// Base class for all dataset controllers (line, bar, etc) +var DatasetController = function(chart, datasetIndex) { + this.initialize(chart, datasetIndex); +}; + +helpers$1.extend(DatasetController.prototype, { + + /** + * Element type used to generate a meta dataset (e.g. Chart.element.Line). + * @type {Chart.core.element} + */ + datasetElementType: null, + + /** + * Element type used to generate a meta data (e.g. Chart.element.Point). + * @type {Chart.core.element} + */ + dataElementType: null, + + initialize: function(chart, datasetIndex) { + var me = this; + me.chart = chart; + me.index = datasetIndex; + me.linkScales(); + me.addElements(); + }, + + updateIndex: function(datasetIndex) { + this.index = datasetIndex; + }, + + linkScales: function() { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + + if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) { + meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; + } + if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) { + meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; + } + }, + + getDataset: function() { + return this.chart.data.datasets[this.index]; + }, + + getMeta: function() { + return this.chart.getDatasetMeta(this.index); + }, + + getScaleForId: function(scaleID) { + return this.chart.scales[scaleID]; + }, + + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().yAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getValueScale: function() { + return this.getScaleForId(this._getValueScaleId()); + }, + + /** + * @private + */ + _getIndexScale: function() { + return this.getScaleForId(this._getIndexScaleId()); + }, + + reset: function() { + this.update(true); + }, + + /** + * @private + */ + destroy: function() { + if (this._data) { + unlistenArrayEvents(this._data, this); + } + }, + + createMetaDataset: function() { + var me = this; + var type = me.datasetElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index + }); + }, + + createMetaData: function(index) { + var me = this; + var type = me.dataElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index, + _index: index + }); + }, + + addElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data || []; + var metaData = meta.data; + var i, ilen; + + for (i = 0, ilen = data.length; i < ilen; ++i) { + metaData[i] = metaData[i] || me.createMetaData(i); + } + + meta.dataset = meta.dataset || me.createMetaDataset(); + }, + + addElementAndReset: function(index) { + var element = this.createMetaData(index); + this.getMeta().data.splice(index, 0, element); + this.updateElement(element, index, true); + }, + + buildOrUpdateElements: function() { + var me = this; + var dataset = me.getDataset(); + var data = dataset.data || (dataset.data = []); + + // In order to correctly handle data addition/deletion animation (an thus simulate + // real-time charts), we need to monitor these data modifications and synchronize + // the internal meta data accordingly. + if (me._data !== data) { + if (me._data) { + // This case happens when the user replaced the data array instance. + unlistenArrayEvents(me._data, me); + } + + if (data && Object.isExtensible(data)) { + listenArrayEvents(data, me); + } + me._data = data; + } + + // Re-sync meta data in case the user replaced the data array or if we missed + // any updates and so make sure that we handle number of datapoints changing. + me.resyncElements(); + }, + + update: helpers$1.noop, + + transition: function(easingValue) { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + for (; i < ilen; ++i) { + elements[i].transition(easingValue); + } + + if (meta.dataset) { + meta.dataset.transition(easingValue); + } + }, + + draw: function() { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + if (meta.dataset) { + meta.dataset.draw(); + } + + for (; i < ilen; ++i) { + elements[i].draw(); + } + }, + + removeHoverStyle: function(element) { + helpers$1.merge(element._model, element.$previousStyle || {}); + delete element.$previousStyle; + }, + + setHoverStyle: function(element) { + var dataset = this.chart.data.datasets[element._datasetIndex]; + var index = element._index; + var custom = element.custom || {}; + var model = element._model; + var getHoverColor = helpers$1.getHoverColor; + + element.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth + }; + + model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index); + model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index); + model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index); + }, + + /** + * @private + */ + resyncElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data; + var numMeta = meta.data.length; + var numData = data.length; + + if (numData < numMeta) { + meta.data.splice(numData, numMeta - numData); + } else if (numData > numMeta) { + me.insertElements(numMeta, numData - numMeta); + } + }, + + /** + * @private + */ + insertElements: function(start, count) { + for (var i = 0; i < count; ++i) { + this.addElementAndReset(start + i); + } + }, + + /** + * @private + */ + onDataPush: function() { + var count = arguments.length; + this.insertElements(this.getDataset().data.length - count, count); + }, + + /** + * @private + */ + onDataPop: function() { + this.getMeta().data.pop(); + }, + + /** + * @private + */ + onDataShift: function() { + this.getMeta().data.shift(); + }, + + /** + * @private + */ + onDataSplice: function(start, count) { + this.getMeta().data.splice(start, count); + this.insertElements(start, arguments.length - 2); + }, + + /** + * @private + */ + onDataUnshift: function() { + this.insertElements(0, arguments.length); + } +}); + +DatasetController.extend = helpers$1.inherits; + +var core_datasetController = DatasetController; + +core_defaults._set('global', { + elements: { + arc: { + backgroundColor: core_defaults.global.defaultColor, + borderColor: '#fff', + borderWidth: 2, + borderAlign: 'center' + } + } +}); + +var element_arc = core_element.extend({ + inLabelRange: function(mouseX) { + var vm = this._view; + + if (vm) { + return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); + } + return false; + }, + + inRange: function(chartX, chartY) { + var vm = this._view; + + if (vm) { + var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY}); + var angle = pointRelativePosition.angle; + var distance = pointRelativePosition.distance; + + // Sanitise angle range + var startAngle = vm.startAngle; + var endAngle = vm.endAngle; + while (endAngle < startAngle) { + endAngle += 2.0 * Math.PI; + } + while (angle > endAngle) { + angle -= 2.0 * Math.PI; + } + while (angle < startAngle) { + angle += 2.0 * Math.PI; + } + + // Check if within the range of the open/close angle + var betweenAngles = (angle >= startAngle && angle <= endAngle); + var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); + + return (betweenAngles && withinRadius); + } + return false; + }, + + getCenterPoint: function() { + var vm = this._view; + var halfAngle = (vm.startAngle + vm.endAngle) / 2; + var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; + return { + x: vm.x + Math.cos(halfAngle) * halfRadius, + y: vm.y + Math.sin(halfAngle) * halfRadius + }; + }, + + getArea: function() { + var vm = this._view; + return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); + }, + + tooltipPosition: function() { + var vm = this._view; + var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); + var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; + + return { + x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), + y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var sA = vm.startAngle; + var eA = vm.endAngle; + var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0; + var angleMargin; + + ctx.save(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.fillStyle = vm.backgroundColor; + ctx.fill(); + + if (vm.borderWidth) { + if (vm.borderAlign === 'inner') { + // Draw an inner border by cliping the arc and drawing a double-width border + // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders + ctx.beginPath(); + angleMargin = pixelMargin / vm.outerRadius; + ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin); + if (vm.innerRadius > pixelMargin) { + angleMargin = pixelMargin / vm.innerRadius; + ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true); + } else { + ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2); + } + ctx.closePath(); + ctx.clip(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.lineWidth = vm.borderWidth * 2; + ctx.lineJoin = 'round'; + } else { + ctx.lineWidth = vm.borderWidth; + ctx.lineJoin = 'bevel'; + } + + ctx.strokeStyle = vm.borderColor; + ctx.stroke(); + } + + ctx.restore(); + } +}); + +var valueOrDefault$1 = helpers$1.valueOrDefault; + +var defaultColor = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + line: { + tension: 0.4, + backgroundColor: defaultColor, + borderWidth: 3, + borderColor: defaultColor, + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + capBezierPoints: true, + fill: true, // do we fill in the area between the line and its base axis + } + } +}); + +var element_line = core_element.extend({ + draw: function() { + var me = this; + var vm = me._view; + var ctx = me._chart.ctx; + var spanGaps = vm.spanGaps; + var points = me._children.slice(); // clone array + var globalDefaults = core_defaults.global; + var globalOptionLineElements = globalDefaults.elements.line; + var lastDrawnIndex = -1; + var index, current, previous, currentVM; + + // If we are looping, adding the first point again + if (me._loop && points.length) { + points.push(points[0]); + } + + ctx.save(); + + // Stroke Line Options + ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; + + // IE 9 and 10 do not support line dash + if (ctx.setLineDash) { + ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); + } + + ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset); + ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; + ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth); + ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; + + // Stroke Line + ctx.beginPath(); + lastDrawnIndex = -1; + + for (index = 0; index < points.length; ++index) { + current = points[index]; + previous = helpers$1.previousItem(points, index); + currentVM = current._view; + + // First point moves to it's starting position no matter what + if (index === 0) { + if (!currentVM.skip) { + ctx.moveTo(currentVM.x, currentVM.y); + lastDrawnIndex = index; + } + } else { + previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; + + if (!currentVM.skip) { + if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { + // There was a gap and this is the first point after the gap + ctx.moveTo(currentVM.x, currentVM.y); + } else { + // Line to next point + helpers$1.canvas.lineTo(ctx, previous._view, current._view); + } + lastDrawnIndex = index; + } + } + } + + ctx.stroke(); + ctx.restore(); + } +}); + +var valueOrDefault$2 = helpers$1.valueOrDefault; + +var defaultColor$1 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + point: { + radius: 3, + pointStyle: 'circle', + backgroundColor: defaultColor$1, + borderColor: defaultColor$1, + borderWidth: 1, + // Hover + hitRadius: 1, + hoverRadius: 4, + hoverBorderWidth: 1 + } + } +}); + +function xRange(mouseX) { + var vm = this._view; + return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false; +} + +function yRange(mouseY) { + var vm = this._view; + return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false; +} + +var element_point = core_element.extend({ + inRange: function(mouseX, mouseY) { + var vm = this._view; + return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; + }, + + inLabelRange: xRange, + inXRange: xRange, + inYRange: yRange, + + getCenterPoint: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + }, + + getArea: function() { + return Math.PI * Math.pow(this._view.radius, 2); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y, + padding: vm.radius + vm.borderWidth + }; + }, + + draw: function(chartArea) { + var vm = this._view; + var ctx = this._chart.ctx; + var pointStyle = vm.pointStyle; + var rotation = vm.rotation; + var radius = vm.radius; + var x = vm.x; + var y = vm.y; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow + + if (vm.skip) { + return; + } + + // Clipping for Points. + if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) { + ctx.strokeStyle = vm.borderColor || defaultColor; + ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth); + ctx.fillStyle = vm.backgroundColor || defaultColor; + helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation); + } + } +}); + +var defaultColor$2 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + rectangle: { + backgroundColor: defaultColor$2, + borderColor: defaultColor$2, + borderSkipped: 'bottom', + borderWidth: 0 + } + } +}); + +function isVertical(vm) { + return vm && vm.width !== undefined; +} + +/** + * Helper function to get the bounds of the bar regardless of the orientation + * @param bar {Chart.Element.Rectangle} the bar + * @return {Bounds} bounds of the bar + * @private + */ +function getBarBounds(vm) { + var x1, x2, y1, y2, half; + + if (isVertical(vm)) { + half = vm.width / 2; + x1 = vm.x - half; + x2 = vm.x + half; + y1 = Math.min(vm.y, vm.base); + y2 = Math.max(vm.y, vm.base); + } else { + half = vm.height / 2; + x1 = Math.min(vm.x, vm.base); + x2 = Math.max(vm.x, vm.base); + y1 = vm.y - half; + y2 = vm.y + half; + } + + return { + left: x1, + top: y1, + right: x2, + bottom: y2 + }; +} + +function swap(orig, v1, v2) { + return orig === v1 ? v2 : orig === v2 ? v1 : orig; +} + +function parseBorderSkipped(vm) { + var edge = vm.borderSkipped; + var res = {}; + + if (!edge) { + return res; + } + + if (vm.horizontal) { + if (vm.base > vm.x) { + edge = swap(edge, 'left', 'right'); + } + } else if (vm.base < vm.y) { + edge = swap(edge, 'bottom', 'top'); + } + + res[edge] = true; + return res; +} + +function parseBorderWidth(vm, maxW, maxH) { + var value = vm.borderWidth; + var skip = parseBorderSkipped(vm); + var t, r, b, l; + + if (helpers$1.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t, + r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r, + b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b, + l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l + }; +} + +function boundingRects(vm) { + var bounds = getBarBounds(vm); + var width = bounds.right - bounds.left; + var height = bounds.bottom - bounds.top; + var border = parseBorderWidth(vm, width / 2, height / 2); + + return { + outer: { + x: bounds.left, + y: bounds.top, + w: width, + h: height + }, + inner: { + x: bounds.left + border.l, + y: bounds.top + border.t, + w: width - border.l - border.r, + h: height - border.t - border.b + } + }; +} + +function inRange(vm, x, y) { + var skipX = x === null; + var skipY = y === null; + var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm); + + return bounds + && (skipX || x >= bounds.left && x <= bounds.right) + && (skipY || y >= bounds.top && y <= bounds.bottom); +} + +var element_rectangle = core_element.extend({ + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var rects = boundingRects(vm); + var outer = rects.outer; + var inner = rects.inner; + + ctx.fillStyle = vm.backgroundColor; + ctx.fillRect(outer.x, outer.y, outer.w, outer.h); + + if (outer.w === inner.w && outer.h === inner.h) { + return; + } + + ctx.save(); + ctx.beginPath(); + ctx.rect(outer.x, outer.y, outer.w, outer.h); + ctx.clip(); + ctx.fillStyle = vm.borderColor; + ctx.rect(inner.x, inner.y, inner.w, inner.h); + ctx.fill('evenodd'); + ctx.restore(); + }, + + height: function() { + var vm = this._view; + return vm.base - vm.y; + }, + + inRange: function(mouseX, mouseY) { + return inRange(this._view, mouseX, mouseY); + }, + + inLabelRange: function(mouseX, mouseY) { + var vm = this._view; + return isVertical(vm) + ? inRange(vm, mouseX, null) + : inRange(vm, null, mouseY); + }, + + inXRange: function(mouseX) { + return inRange(this._view, mouseX, null); + }, + + inYRange: function(mouseY) { + return inRange(this._view, null, mouseY); + }, + + getCenterPoint: function() { + var vm = this._view; + var x, y; + if (isVertical(vm)) { + x = vm.x; + y = (vm.y + vm.base) / 2; + } else { + x = (vm.x + vm.base) / 2; + y = vm.y; + } + + return {x: x, y: y}; + }, + + getArea: function() { + var vm = this._view; + + return isVertical(vm) + ? vm.width * Math.abs(vm.y - vm.base) + : vm.height * Math.abs(vm.x - vm.base); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + } +}); + +var elements = {}; +var Arc = element_arc; +var Line = element_line; +var Point = element_point; +var Rectangle = element_rectangle; +elements.Arc = Arc; +elements.Line = Line; +elements.Point = Point; +elements.Rectangle = Rectangle; + +var resolve$1 = helpers$1.options.resolve; + +core_defaults._set('bar', { + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }], + + yAxes: [{ + type: 'linear' + }] + } +}); + +/** + * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. + * @private + */ +function computeMinSampleSize(scale, pixels) { + var min = scale.isHorizontal() ? scale.width : scale.height; + var ticks = scale.getTicks(); + var prev, curr, i, ilen; + + for (i = 1, ilen = pixels.length; i < ilen; ++i) { + min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1])); + } + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + curr = scale.getPixelForTick(i); + min = i > 0 ? Math.min(min, curr - prev) : min; + prev = curr; + } + + return min; +} + +/** + * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, + * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This + * mode currently always generates bars equally sized (until we introduce scriptable options?). + * @private + */ +function computeFitCategoryTraits(index, ruler, options) { + var thickness = options.barThickness; + var count = ruler.stackCount; + var curr = ruler.pixels[index]; + var size, ratio; + + if (helpers$1.isNullOrUndef(thickness)) { + size = ruler.min * options.categoryPercentage; + ratio = options.barPercentage; + } else { + // When bar thickness is enforced, category and bar percentages are ignored. + // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') + // and deprecate barPercentage since this value is ignored when thickness is absolute. + size = thickness * count; + ratio = 1; + } + + return { + chunk: size / count, + ratio: ratio, + start: curr - (size / 2) + }; +} + +/** + * Computes an "optimal" category that globally arranges bars side by side (no gap when + * percentage options are 1), based on the previous and following categories. This mode + * generates bars with different widths when data are not evenly spaced. + * @private + */ +function computeFlexCategoryTraits(index, ruler, options) { + var pixels = ruler.pixels; + var curr = pixels[index]; + var prev = index > 0 ? pixels[index - 1] : null; + var next = index < pixels.length - 1 ? pixels[index + 1] : null; + var percent = options.categoryPercentage; + var start, size; + + if (prev === null) { + // first data: its size is double based on the next point or, + // if it's also the last data, we use the scale size. + prev = curr - (next === null ? ruler.end - ruler.start : next - curr); + } + + if (next === null) { + // last data: its size is also double based on the previous point. + next = curr + curr - prev; + } + + start = curr - (curr - Math.min(prev, next)) / 2 * percent; + size = Math.abs(next - prev) / 2 * percent; + + return { + chunk: size / ruler.stackCount, + ratio: options.barPercentage, + start: start + }; +} + +var controller_bar = core_datasetController.extend({ + + dataElementType: elements.Rectangle, + + initialize: function() { + var me = this; + var meta; + + core_datasetController.prototype.initialize.apply(me, arguments); + + meta = me.getMeta(); + meta.stack = me.getDataset().stack; + meta.bar = true; + }, + + update: function(reset) { + var me = this; + var rects = me.getMeta().data; + var i, ilen; + + me._ruler = me.getRuler(); + + for (i = 0, ilen = rects.length; i < ilen; ++i) { + me.updateElement(rects[i], i, reset); + } + }, + + updateElement: function(rectangle, index, reset) { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + var options = me._resolveElementOptions(rectangle, index); + + rectangle._xScale = me.getScaleForId(meta.xAxisID); + rectangle._yScale = me.getScaleForId(meta.yAxisID); + rectangle._datasetIndex = me.index; + rectangle._index = index; + rectangle._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderSkipped: options.borderSkipped, + borderWidth: options.borderWidth, + datasetLabel: dataset.label, + label: me.chart.data.labels[index] + }; + + me._updateElementGeometry(rectangle, index, reset); + + rectangle.pivot(); + }, + + /** + * @private + */ + _updateElementGeometry: function(rectangle, index, reset) { + var me = this; + var model = rectangle._model; + var vscale = me._getValueScale(); + var base = vscale.getBasePixel(); + var horizontal = vscale.isHorizontal(); + var ruler = me._ruler || me.getRuler(); + var vpixels = me.calculateBarValuePixels(me.index, index); + var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); + + model.horizontal = horizontal; + model.base = reset ? base : vpixels.base; + model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; + model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; + model.height = horizontal ? ipixels.size : undefined; + model.width = horizontal ? undefined : ipixels.size; + }, + + /** + * Returns the stacks based on groups and bar visibility. + * @param {number} [last] - The dataset index + * @returns {string[]} The list of stack IDs + * @private + */ + _getStacks: function(last) { + var me = this; + var chart = me.chart; + var scale = me._getIndexScale(); + var stacked = scale.options.stacked; + var ilen = last === undefined ? chart.data.datasets.length : last + 1; + var stacks = []; + var i, meta; + + for (i = 0; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + if (meta.bar && chart.isDatasetVisible(i) && + (stacked === false || + (stacked === true && stacks.indexOf(meta.stack) === -1) || + (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { + stacks.push(meta.stack); + } + } + + return stacks; + }, + + /** + * Returns the effective number of stacks based on groups and bar visibility. + * @private + */ + getStackCount: function() { + return this._getStacks().length; + }, + + /** + * Returns the stack index for the given dataset based on groups and bar visibility. + * @param {number} [datasetIndex] - The dataset index + * @param {string} [name] - The stack name to find + * @returns {number} The stack index + * @private + */ + getStackIndex: function(datasetIndex, name) { + var stacks = this._getStacks(datasetIndex); + var index = (name !== undefined) + ? stacks.indexOf(name) + : -1; // indexOf returns -1 if element is not present + + return (index === -1) + ? stacks.length - 1 + : index; + }, + + /** + * @private + */ + getRuler: function() { + var me = this; + var scale = me._getIndexScale(); + var stackCount = me.getStackCount(); + var datasetIndex = me.index; + var isHorizontal = scale.isHorizontal(); + var start = isHorizontal ? scale.left : scale.top; + var end = start + (isHorizontal ? scale.width : scale.height); + var pixels = []; + var i, ilen, min; + + for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { + pixels.push(scale.getPixelForValue(null, i, datasetIndex)); + } + + min = helpers$1.isNullOrUndef(scale.options.barThickness) + ? computeMinSampleSize(scale, pixels) + : -1; + + return { + min: min, + pixels: pixels, + start: start, + end: end, + stackCount: stackCount, + scale: scale + }; + }, + + /** + * Note: pixel values are not clamped to the scale area. + * @private + */ + calculateBarValuePixels: function(datasetIndex, index) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var scale = me._getValueScale(); + var isHorizontal = scale.isHorizontal(); + var datasets = chart.data.datasets; + var value = +scale.getRightValue(datasets[datasetIndex].data[index]); + var minBarLength = scale.options.minBarLength; + var stacked = scale.options.stacked; + var stack = meta.stack; + var start = 0; + var i, imeta, ivalue, base, head, size; + + if (stacked || (stacked === undefined && stack !== undefined)) { + for (i = 0; i < datasetIndex; ++i) { + imeta = chart.getDatasetMeta(i); + + if (imeta.bar && + imeta.stack === stack && + imeta.controller._getValueScaleId() === scale.id && + chart.isDatasetVisible(i)) { + + ivalue = +scale.getRightValue(datasets[i].data[index]); + if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { + start += ivalue; + } + } + } + } + + base = scale.getPixelForValue(start); + head = scale.getPixelForValue(start + value); + size = head - base; + + if (minBarLength !== undefined && Math.abs(size) < minBarLength) { + size = minBarLength; + if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) { + head = base - minBarLength; + } else { + head = base + minBarLength; + } + } + + return { + size: size, + base: base, + head: head, + center: head + size / 2 + }; + }, + + /** + * @private + */ + calculateBarIndexPixels: function(datasetIndex, index, ruler) { + var me = this; + var options = ruler.scale.options; + var range = options.barThickness === 'flex' + ? computeFlexCategoryTraits(index, ruler, options) + : computeFitCategoryTraits(index, ruler, options); + + var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); + var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); + var size = Math.min( + helpers$1.valueOrDefault(options.maxBarThickness, Infinity), + range.chunk * range.ratio); + + return { + base: center - size / 2, + head: center + size / 2, + center: center, + size: size + }; + }, + + draw: function() { + var me = this; + var chart = me.chart; + var scale = me._getValueScale(); + var rects = me.getMeta().data; + var dataset = me.getDataset(); + var ilen = rects.length; + var i = 0; + + helpers$1.canvas.clipArea(chart.ctx, chart.chartArea); + + for (; i < ilen; ++i) { + if (!isNaN(scale.getRightValue(dataset.data[i]))) { + rects[i].draw(); + } + } + + helpers$1.canvas.unclipArea(chart.ctx); + }, + + /** + * @private + */ + _resolveElementOptions: function(rectangle, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = rectangle.custom || {}; + var options = chart.options.elements.rectangle; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderSkipped', + 'borderWidth' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$1([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + } +}); + +var valueOrDefault$3 = helpers$1.valueOrDefault; +var resolve$2 = helpers$1.options.resolve; + +core_defaults._set('bubble', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + type: 'linear', // bubble should probably use a linear scale by default + position: 'bottom', + id: 'x-axis-0' // need an ID so datasets can reference the scale + }], + yAxes: [{ + type: 'linear', + position: 'left', + id: 'y-axis-0' + }] + }, + + tooltips: { + callbacks: { + title: function() { + // Title doesn't make sense for scatter since we format the data as a point + return ''; + }, + label: function(item, data) { + var datasetLabel = data.datasets[item.datasetIndex].label || ''; + var dataPoint = data.datasets[item.datasetIndex].data[item.index]; + return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; + } + } + } +}); + +var controller_bubble = core_datasetController.extend({ + /** + * @protected + */ + dataElementType: elements.Point, + + /** + * @protected + */ + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var points = meta.data; + + // Update Points + helpers$1.each(points, function(point, index) { + me.updateElement(point, index, reset); + }); + }, + + /** + * @protected + */ + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var xScale = me.getScaleForId(meta.xAxisID); + var yScale = me.getScaleForId(meta.yAxisID); + var options = me._resolveElementOptions(point, index); + var data = me.getDataset().data[index]; + var dsIndex = me.index; + + var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); + var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); + + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = dsIndex; + point._index = index; + point._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + hitRadius: options.hitRadius, + pointStyle: options.pointStyle, + rotation: options.rotation, + radius: reset ? 0 : options.radius, + skip: custom.skip || isNaN(x) || isNaN(y), + x: x, + y: y, + }; + + point.pivot(); + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth); + model.radius = options.radius + options.hoverRadius; + }, + + /** + * @private + */ + _resolveElementOptions: function(point, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = point.custom || {}; + var options = chart.options.elements.point; + var data = dataset.data[index]; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + 'hoverRadius', + 'hitRadius', + 'pointStyle', + 'rotation' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$2([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + // Custom radius resolution + values.radius = resolve$2([ + custom.radius, + data ? data.r : undefined, + dataset.radius, + options.radius + ], context, index); + + return values; + } +}); + +var resolve$3 = helpers$1.options.resolve; +var valueOrDefault$4 = helpers$1.valueOrDefault; + +core_defaults._set('doughnut', { + animation: { + // Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + // Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false + }, + hover: { + mode: 'single' + }, + legendCallback: function(chart) { + var text = []; + text.push('
    '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
  • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
  • '); + } + } + + text.push('
'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc && arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + // toggle visibility of index if exists + if (meta.data[index]) { + meta.data[index].hidden = !meta.data[index].hidden; + } + } + + chart.update(); + } + }, + + // The percentage of the chart that we cut out of the middle. + cutoutPercentage: 50, + + // The rotation of the chart, where the first data arc begins. + rotation: Math.PI * -0.5, + + // The total circumference of the chart. + circumference: Math.PI * 2.0, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(tooltipItem, data) { + var dataLabel = data.labels[tooltipItem.index]; + var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; + + if (helpers$1.isArray(dataLabel)) { + // show value on first line of multiline label + // need to clone because we are changing the value + dataLabel = dataLabel.slice(); + dataLabel[0] += value; + } else { + dataLabel += value; + } + + return dataLabel; + } + } + } +}); + +var controller_doughnut = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly + getRingIndex: function(datasetIndex) { + var ringIndex = 0; + + for (var j = 0; j < datasetIndex; ++j) { + if (this.chart.isDatasetVisible(j)) { + ++ringIndex; + } + } + + return ringIndex; + }, + + update: function(reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var availableWidth = chartArea.right - chartArea.left; + var availableHeight = chartArea.bottom - chartArea.top; + var minSize = Math.min(availableWidth, availableHeight); + var offset = {x: 0, y: 0}; + var meta = me.getMeta(); + var arcs = meta.data; + var cutoutPercentage = opts.cutoutPercentage; + var circumference = opts.circumference; + var chartWeight = me._getRingWeight(me.index); + var i, ilen; + + // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc + if (circumference < Math.PI * 2.0) { + var startAngle = opts.rotation % (Math.PI * 2.0); + startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); + var endAngle = startAngle + circumference; + var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; + var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; + var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); + var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); + var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); + var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); + var cutout = cutoutPercentage / 100.0; + var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; + var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; + var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; + minSize = Math.min(availableWidth / size.width, availableHeight / size.height); + offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + } + + chart.borderWidth = me.getMaxBorderWidth(); + chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); + chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1); + chart.offsetX = offset.x * chart.outerRadius; + chart.offsetY = offset.y * chart.outerRadius; + + meta.total = me.calculateTotal(); + + me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index); + me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0); + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + me.updateElement(arcs[i], i, reset); + } + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var animationOpts = opts.animation; + var centerX = (chartArea.left + chartArea.right) / 2; + var centerY = (chartArea.top + chartArea.bottom) / 2; + var startAngle = opts.rotation; // non reset case handled later + var endAngle = opts.rotation; // non reset case handled later + var dataset = me.getDataset(); + var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); + var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; + var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX + chart.offsetX, + y: centerY + chart.offsetY, + startAngle: startAngle, + endAngle: endAngle, + circumference: circumference, + outerRadius: outerRadius, + innerRadius: innerRadius, + label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) + } + }); + + var model = arc._model; + + // Set correct angles if not resetting + if (!reset || !animationOpts.animateRotate) { + if (index === 0) { + model.startAngle = opts.rotation; + } else { + model.startAngle = me.getMeta().data[index - 1]._model.endAngle; + } + + model.endAngle = model.startAngle + model.circumference; + } + + arc.pivot(); + }, + + calculateTotal: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var total = 0; + var value; + + helpers$1.each(meta.data, function(element, index) { + value = dataset.data[index]; + if (!isNaN(value) && !element.hidden) { + total += Math.abs(value); + } + }); + + /* if (total === 0) { + total = NaN; + }*/ + + return total; + }, + + calculateCircumference: function(value) { + var total = this.getMeta().total; + if (total > 0 && !isNaN(value)) { + return (Math.PI * 2.0) * (Math.abs(value) / total); + } + return 0; + }, + + // gets the max border or hover width to properly scale pie charts + getMaxBorderWidth: function(arcs) { + var me = this; + var max = 0; + var chart = me.chart; + var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth; + + if (!arcs) { + // Find the outmost visible dataset + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + arcs = meta.data; + if (i !== me.index) { + controller = meta.controller; + } + break; + } + } + } + + if (!arcs) { + return 0; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arc = arcs[i]; + options = controller ? controller._resolveElementOptions(arc, i) : arc._options; + if (options.borderAlign !== 'inner') { + borderWidth = options.borderWidth; + hoverWidth = options.hoverBorderWidth; + + max = borderWidth > max ? borderWidth : max; + max = hoverWidth > max ? hoverWidth : max; + } + } + return max; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function(arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$3([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly + * @private + */ + _getRingWeightOffset: function(datasetIndex) { + var ringWeightOffset = 0; + + for (var i = 0; i < datasetIndex; ++i) { + if (this.chart.isDatasetVisible(i)) { + ringWeightOffset += this._getRingWeight(i); + } + } + + return ringWeightOffset; + }, + + /** + * @private + */ + _getRingWeight: function(dataSetIndex) { + return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0); + }, + + /** + * Returns the sum of all visibile data set weights. This value can be 0. + * @private + */ + _getVisibleDatasetWeightTotal: function() { + return this._getRingWeightOffset(this.chart.data.datasets.length); + } +}); + +core_defaults._set('horizontalBar', { + hover: { + mode: 'index', + axis: 'y' + }, + + scales: { + xAxes: [{ + type: 'linear', + position: 'bottom' + }], + + yAxes: [{ + type: 'category', + position: 'left', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }] + }, + + elements: { + rectangle: { + borderSkipped: 'left' + } + }, + + tooltips: { + mode: 'index', + axis: 'y' + } +}); + +var controller_horizontalBar = controller_bar.extend({ + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().yAxisID; + } +}); + +var valueOrDefault$5 = helpers$1.valueOrDefault; +var resolve$4 = helpers$1.options.resolve; +var isPointInArea = helpers$1.canvas._isPointInArea; + +core_defaults._set('line', { + showLines: true, + spanGaps: false, + + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + id: 'x-axis-0' + }], + yAxes: [{ + type: 'linear', + id: 'y-axis-0' + }] + } +}); + +function lineEnabled(dataset, options) { + return valueOrDefault$5(dataset.showLine, options.showLines); +} + +var controller_line = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.getScaleForId(meta.yAxisID); + var dataset = me.getDataset(); + var showLine = lineEnabled(dataset, me.chart.options); + var i, ilen; + + // Update Line + if (showLine) { + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + } + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + if (showLine && line._model.tension !== 0) { + me.updateBezierControlPoints(); + } + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var dataset = me.getDataset(); + var datasetIndex = me.index; + var value = dataset.data[index]; + var yScale = me.getScaleForId(meta.yAxisID); + var xScale = me.getScaleForId(meta.xAxisID); + var lineModel = meta.dataset._model; + var x, y; + + var options = me._resolvePointOptions(point, index); + + x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); + y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); + + // Utility + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = datasetIndex; + point._index = index; + + // Desired view properties + point._model = { + x: x, + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0), + steppedLine: lineModel ? lineModel.steppedLine : false, + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function(element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function(element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options; + var elementOptions = options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill', + 'cubicInterpolationMode' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[key], + elementOptions[key] + ]); + } + + // The default behavior of lines is to break at null values, according + // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 + // This option gives lines the ability to span gaps + values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps); + values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension); + values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]); + + return values; + }, + + calculatePointY: function(value, index, datasetIndex) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var yScale = me.getScaleForId(meta.yAxisID); + var sumPos = 0; + var sumNeg = 0; + var i, ds, dsMeta; + + if (yScale.options.stacked) { + for (i = 0; i < datasetIndex; i++) { + ds = chart.data.datasets[i]; + dsMeta = chart.getDatasetMeta(i); + if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { + var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); + if (stackedRightValue < 0) { + sumNeg += stackedRightValue || 0; + } else { + sumPos += stackedRightValue || 0; + } + } + } + + var rightValue = Number(yScale.getRightValue(value)); + if (rightValue < 0) { + return yScale.getPixelForValue(sumNeg + rightValue); + } + return yScale.getPixelForValue(sumPos + rightValue); + } + + return yScale.getPixelForValue(value); + }, + + updateBezierControlPoints: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var lineModel = meta.dataset._model; + var area = chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + // Only consider points that are drawn in case the spanGaps option is used + if (lineModel.spanGaps) { + points = points.filter(function(pt) { + return !pt._model.skip; + }); + } + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + if (lineModel.cubicInterpolationMode === 'monotone') { + helpers$1.splineCurveMonotone(points); + } else { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i)._model, + model, + helpers$1.nextItem(points, i)._model, + lineModel.tension + ); + model.controlPointPreviousX = controlPoints.previous.x; + model.controlPointPreviousY = controlPoints.previous.y; + model.controlPointNextX = controlPoints.next.x; + model.controlPointNextY = controlPoints.next.y; + } + } + + if (chart.options.elements.line.capBezierPoints) { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + if (isPointInArea(model, area)) { + if (i > 0 && isPointInArea(points[i - 1]._model, area)) { + model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); + model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); + } + if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) { + model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); + model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); + } + } + } + } + }, + + draw: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var points = meta.data || []; + var area = chart.chartArea; + var ilen = points.length; + var halfBorderWidth; + var i = 0; + + if (lineEnabled(me.getDataset(), chart.options)) { + halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2; + + helpers$1.canvas.clipArea(chart.ctx, { + left: area.left, + right: area.right, + top: area.top - halfBorderWidth, + bottom: area.bottom + halfBorderWidth + }); + + meta.dataset.draw(); + + helpers$1.canvas.unclipArea(chart.ctx); + } + + // Draw the points + for (; i < ilen; ++i) { + points[i].draw(area); + } + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$5(options.hoverRadius, options.radius); + }, +}); + +var resolve$5 = helpers$1.options.resolve; + +core_defaults._set('polarArea', { + scale: { + type: 'radialLinear', + angleLines: { + display: false + }, + gridLines: { + circular: true + }, + pointLabels: { + display: false + }, + ticks: { + beginAtZero: true + } + }, + + // Boolean - Whether to animate the rotation of the chart + animation: { + animateRotate: true, + animateScale: true + }, + + startAngle: -0.5 * Math.PI, + legendCallback: function(chart) { + var text = []; + text.push('
    '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
  • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
  • '); + } + } + + text.push('
'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + meta.data[index].hidden = !meta.data[index].hidden; + } + + chart.update(); + } + }, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(item, data) { + return data.labels[item.index] + ': ' + item.yLabel; + } + } + } +}); + +var controller_polarArea = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + update: function(reset) { + var me = this; + var dataset = me.getDataset(); + var meta = me.getMeta(); + var start = me.chart.options.startAngle || 0; + var starts = me._starts = []; + var angles = me._angles = []; + var arcs = meta.data; + var i, ilen, angle; + + me._updateRadius(); + + meta.count = me.countVisibleElements(); + + for (i = 0, ilen = dataset.data.length; i < ilen; i++) { + starts[i] = start; + angle = me._computeAngle(i); + angles[i] = angle; + start += angle; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + me.updateElement(arcs[i], i, reset); + } + }, + + /** + * @private + */ + _updateRadius: function() { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); + + chart.outerRadius = Math.max(minSize / 2, 0); + chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + + me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); + me.innerRadius = me.outerRadius - chart.radiusLength; + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var opts = chart.options; + var animationOpts = opts.animation; + var scale = chart.scale; + var labels = chart.data.labels; + + var centerX = scale.xCenter; + var centerY = scale.yCenter; + + // var negHalfPI = -0.5 * Math.PI; + var datasetStartAngle = opts.startAngle; + var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var startAngle = me._starts[index]; + var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]); + + var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX, + y: centerY, + innerRadius: 0, + outerRadius: reset ? resetRadius : distance, + startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, + endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, + label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index]) + } + }); + + arc.pivot(); + }, + + countVisibleElements: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var count = 0; + + helpers$1.each(meta.data, function(element, index) { + if (!isNaN(dataset.data[index]) && !element.hidden) { + count++; + } + }); + + return count; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + var valueOrDefault = helpers$1.valueOrDefault; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function(arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$5([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _computeAngle: function(index) { + var me = this; + var count = this.getMeta().count; + var dataset = me.getDataset(); + var meta = me.getMeta(); + + if (isNaN(dataset.data[index]) || meta.data[index].hidden) { + return 0; + } + + // Scriptable options + var context = { + chart: me.chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + return resolve$5([ + me.chart.options.elements.arc.angle, + (2 * Math.PI) / count + ], context, index); + } +}); + +core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut)); +core_defaults._set('pie', { + cutoutPercentage: 0 +}); + +// Pie charts are Doughnut chart with different defaults +var controller_pie = controller_doughnut; + +var valueOrDefault$6 = helpers$1.valueOrDefault; +var resolve$6 = helpers$1.options.resolve; + +core_defaults._set('radar', { + scale: { + type: 'radialLinear' + }, + elements: { + line: { + tension: 0 // no bezier in radar + } + } +}); + +var controller_radar = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + linkScales: helpers$1.noop, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.chart.scale; + var dataset = me.getDataset(); + var i, ilen; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + line._loop = true; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + // Update bezier control points + me.updateBezierControlPoints(); + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var custom = point.custom || {}; + var dataset = me.getDataset(); + var scale = me.chart.scale; + var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); + var options = me._resolvePointOptions(point, index); + var lineModel = me.getMeta().dataset._model; + var x = reset ? scale.xCenter : pointPosition.x; + var y = reset ? scale.yCenter : pointPosition.y; + + // Utility + point._scale = scale; + point._options = options; + point._datasetIndex = me.index; + point._index = index; + + // Desired view properties + point._model = { + x: x, // value not used in dataset scale, but we want a consistent API between scales + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0), + + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function(element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function(element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[key], + options[key] + ]); + } + + values.tension = valueOrDefault$6(dataset.lineTension, options.tension); + + return values; + }, + + updateBezierControlPoints: function() { + var me = this; + var meta = me.getMeta(); + var area = me.chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i, true)._model, + model, + helpers$1.nextItem(points, i, true)._model, + model.tension + ); + + // Prevent the bezier going outside of the bounds of the graph + model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right); + model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom); + model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right); + model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom); + } + }, + + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$6(options.hoverRadius, options.radius); + } +}); + +core_defaults._set('scatter', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + id: 'x-axis-1', // need an ID so datasets can reference the scale + type: 'linear', // scatter should not use a category axis + position: 'bottom' + }], + yAxes: [{ + id: 'y-axis-1', + type: 'linear', + position: 'left' + }] + }, + + showLines: false, + + tooltips: { + callbacks: { + title: function() { + return ''; // doesn't make sense for scatter since data are formatted as a point + }, + label: function(item) { + return '(' + item.xLabel + ', ' + item.yLabel + ')'; + } + } + } +}); + +// Scatter charts use line controllers +var controller_scatter = controller_line; + +// NOTE export a map in which the key represents the controller type, not +// the class, and so must be CamelCase in order to be correctly retrieved +// by the controller in core.controller.js (`controllers[meta.type]`). + +var controllers = { + bar: controller_bar, + bubble: controller_bubble, + doughnut: controller_doughnut, + horizontalBar: controller_horizontalBar, + line: controller_line, + polarArea: controller_polarArea, + pie: controller_pie, + radar: controller_radar, + scatter: controller_scatter +}; + +/** + * Helper function to get relative position for an event + * @param {Event|IEvent} event - The event to get the position for + * @param {Chart} chart - The chart + * @returns {object} the event position + */ +function getRelativePosition(e, chart) { + if (e.native) { + return { + x: e.x, + y: e.y + }; + } + + return helpers$1.getRelativePosition(e, chart); +} + +/** + * Helper function to traverse all of the visible elements in the chart + * @param {Chart} chart - the chart + * @param {function} handler - the callback to execute for each visible item + */ +function parseVisibleItems(chart, handler) { + var datasets = chart.data.datasets; + var meta, i, j, ilen, jlen; + + for (i = 0, ilen = datasets.length; i < ilen; ++i) { + if (!chart.isDatasetVisible(i)) { + continue; + } + + meta = chart.getDatasetMeta(i); + for (j = 0, jlen = meta.data.length; j < jlen; ++j) { + var element = meta.data[j]; + if (!element._view.skip) { + handler(element); + } + } + } +} + +/** + * Helper function to get the items that intersect the event position + * @param {ChartElement[]} items - elements to filter + * @param {object} position - the point to be nearest to + * @return {ChartElement[]} the nearest items + */ +function getIntersectItems(chart, position) { + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + } + }); + + return elements; +} + +/** + * Helper function to get the items nearest to the event position considering all visible items in teh chart + * @param {Chart} chart - the chart to look at elements from + * @param {object} position - the point to be nearest to + * @param {boolean} intersect - if true, only consider items that intersect the position + * @param {function} distanceMetric - function to provide the distance between points + * @return {ChartElement[]} the nearest items + */ +function getNearestItems(chart, position, intersect, distanceMetric) { + var minDistance = Number.POSITIVE_INFINITY; + var nearestItems = []; + + parseVisibleItems(chart, function(element) { + if (intersect && !element.inRange(position.x, position.y)) { + return; + } + + var center = element.getCenterPoint(); + var distance = distanceMetric(position, center); + if (distance < minDistance) { + nearestItems = [element]; + minDistance = distance; + } else if (distance === minDistance) { + // Can have multiple items at the same distance in which case we sort by size + nearestItems.push(element); + } + }); + + return nearestItems; +} + +/** + * Get a distance metric function for two points based on the + * axis mode setting + * @param {string} axis - the axis mode. x|y|xy + */ +function getDistanceMetricForAxis(axis) { + var useX = axis.indexOf('x') !== -1; + var useY = axis.indexOf('y') !== -1; + + return function(pt1, pt2) { + var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; + var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; + return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); + }; +} + +function indexMode(chart, e, options) { + var position = getRelativePosition(e, chart); + // Default axis for index mode is 'x' to match old behaviour + options.axis = options.axis || 'x'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + var elements = []; + + if (!items.length) { + return []; + } + + chart.data.datasets.forEach(function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + var element = meta.data[items[0]._index]; + + // don't count items that are skipped (null data) + if (element && !element._view.skip) { + elements.push(element); + } + } + }); + + return elements; +} + +/** + * @interface IInteractionOptions + */ +/** + * If true, only consider items that intersect the point + * @name IInterfaceOptions#boolean + * @type Boolean + */ + +/** + * Contains interaction related functions + * @namespace Chart.Interaction + */ +var core_interaction = { + // Helper function for different modes + modes: { + single: function(chart, e) { + var position = getRelativePosition(e, chart); + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + return elements; + } + }); + + return elements.slice(0, 1); + }, + + /** + * @function Chart.Interaction.modes.label + * @deprecated since version 2.4.0 + * @todo remove at version 3 + * @private + */ + label: indexMode, + + /** + * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item + * @function Chart.Interaction.modes.index + * @since v2.4.0 + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + index: indexMode, + + /** + * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect is false, we find the nearest item and return the items in that dataset + * @function Chart.Interaction.modes.dataset + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + dataset: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + + if (items.length > 0) { + items = chart.getDatasetMeta(items[0]._datasetIndex).data; + } + + return items; + }, + + /** + * @function Chart.Interaction.modes.x-axis + * @deprecated since version 2.4.0. Use index mode and intersect == true + * @todo remove at version 3 + * @private + */ + 'x-axis': function(chart, e) { + return indexMode(chart, e, {intersect: false}); + }, + + /** + * Point mode returns all elements that hit test based on the event position + * of the event + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + point: function(chart, e) { + var position = getRelativePosition(e, chart); + return getIntersectItems(chart, position); + }, + + /** + * nearest mode returns the element closest to the point + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + nearest: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + return getNearestItems(chart, position, options.intersect, distanceMetric); + }, + + /** + * x mode returns the elements that hit-test at the current x coordinate + * @function Chart.Interaction.modes.x + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + x: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inXRange(position.x)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + }, + + /** + * y mode returns the elements that hit-test at the current y coordinate + * @function Chart.Interaction.modes.y + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + y: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inYRange(position.y)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + } + } +}; + +function filterByPosition(array, position) { + return helpers$1.where(array, function(v) { + return v.position === position; + }); +} + +function sortByWeight(array, reverse) { + array.forEach(function(v, i) { + v._tmpIndex_ = i; + return v; + }); + array.sort(function(a, b) { + var v0 = reverse ? b : a; + var v1 = reverse ? a : b; + return v0.weight === v1.weight ? + v0._tmpIndex_ - v1._tmpIndex_ : + v0.weight - v1.weight; + }); + array.forEach(function(v) { + delete v._tmpIndex_; + }); +} + +function findMaxPadding(boxes) { + var top = 0; + var left = 0; + var bottom = 0; + var right = 0; + helpers$1.each(boxes, function(box) { + if (box.getPadding) { + var boxPadding = box.getPadding(); + top = Math.max(top, boxPadding.top); + left = Math.max(left, boxPadding.left); + bottom = Math.max(bottom, boxPadding.bottom); + right = Math.max(right, boxPadding.right); + } + }); + return { + top: top, + left: left, + bottom: bottom, + right: right + }; +} + +function addSizeByPosition(boxes, size) { + helpers$1.each(boxes, function(box) { + size[box.position] += box.isHorizontal() ? box.height : box.width; + }); +} + +core_defaults._set('global', { + layout: { + padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + } +}); + +/** + * @interface ILayoutItem + * @prop {string} position - The position of the item in the chart layout. Possible values are + * 'left', 'top', 'right', 'bottom', and 'chartArea' + * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area + * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down + * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) + * @prop {function} update - Takes two parameters: width and height. Returns size of item + * @prop {function} getPadding - Returns an object with padding on the edges + * @prop {number} width - Width of item. Must be valid after update() + * @prop {number} height - Height of item. Must be valid after update() + * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update + * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update + * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update + * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update + */ + +// The layout service is very self explanatory. It's responsible for the layout within a chart. +// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need +// It is this service's responsibility of carrying out that layout. +var core_layouts = { + defaults: {}, + + /** + * Register a box to a chart. + * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. + * @param {Chart} chart - the chart to use + * @param {ILayoutItem} item - the item to add to be layed out + */ + addBox: function(chart, item) { + if (!chart.boxes) { + chart.boxes = []; + } + + // initialize item with default values + item.fullWidth = item.fullWidth || false; + item.position = item.position || 'top'; + item.weight = item.weight || 0; + + chart.boxes.push(item); + }, + + /** + * Remove a layoutItem from a chart + * @param {Chart} chart - the chart to remove the box from + * @param {ILayoutItem} layoutItem - the item to remove from the layout + */ + removeBox: function(chart, layoutItem) { + var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; + if (index !== -1) { + chart.boxes.splice(index, 1); + } + }, + + /** + * Sets (or updates) options on the given `item`. + * @param {Chart} chart - the chart in which the item lives (or will be added to) + * @param {ILayoutItem} item - the item to configure with the given options + * @param {object} options - the new item options. + */ + configure: function(chart, item, options) { + var props = ['fullWidth', 'position', 'weight']; + var ilen = props.length; + var i = 0; + var prop; + + for (; i < ilen; ++i) { + prop = props[i]; + if (options.hasOwnProperty(prop)) { + item[prop] = options[prop]; + } + } + }, + + /** + * Fits boxes of the given chart into the given size by having each box measure itself + * then running a fitting algorithm + * @param {Chart} chart - the chart + * @param {number} width - the width to fit into + * @param {number} height - the height to fit into + */ + update: function(chart, width, height) { + if (!chart) { + return; + } + + var layoutOptions = chart.options.layout || {}; + var padding = helpers$1.options.toPadding(layoutOptions.padding); + var leftPadding = padding.left; + var rightPadding = padding.right; + var topPadding = padding.top; + var bottomPadding = padding.bottom; + + var leftBoxes = filterByPosition(chart.boxes, 'left'); + var rightBoxes = filterByPosition(chart.boxes, 'right'); + var topBoxes = filterByPosition(chart.boxes, 'top'); + var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); + var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); + + // Sort boxes by weight. A higher weight is further away from the chart area + sortByWeight(leftBoxes, true); + sortByWeight(rightBoxes, false); + sortByWeight(topBoxes, true); + sortByWeight(bottomBoxes, false); + + var verticalBoxes = leftBoxes.concat(rightBoxes); + var horizontalBoxes = topBoxes.concat(bottomBoxes); + var outerBoxes = verticalBoxes.concat(horizontalBoxes); + + // Essentially we now have any number of boxes on each of the 4 sides. + // Our canvas looks like the following. + // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and + // B1 is the bottom axis + // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays + // These locations are single-box locations only, when trying to register a chartArea location that is already taken, + // an error will be thrown. + // + // |----------------------------------------------------| + // | T1 (Full Width) | + // |----------------------------------------------------| + // | | | T2 | | + // | |----|-------------------------------------|----| + // | | | C1 | | C2 | | + // | | |----| |----| | + // | | | | | + // | L1 | L2 | ChartArea (C0) | R1 | + // | | | | | + // | | |----| |----| | + // | | | C3 | | C4 | | + // | |----|-------------------------------------|----| + // | | | B1 | | + // |----------------------------------------------------| + // | B2 (Full Width) | + // |----------------------------------------------------| + // + // What we do to find the best sizing, we do the following + // 1. Determine the minimum size of the chart area. + // 2. Split the remaining width equally between each vertical axis + // 3. Split the remaining height equally between each horizontal axis + // 4. Give each layout the maximum size it can be. The layout will return it's minimum size + // 5. Adjust the sizes of each axis based on it's minimum reported size. + // 6. Refit each axis + // 7. Position each axis in the final location + // 8. Tell the chart the final location of the chart area + // 9. Tell any axes that overlay the chart area the positions of the chart area + + // Step 1 + var chartWidth = width - leftPadding - rightPadding; + var chartHeight = height - topPadding - bottomPadding; + var chartAreaWidth = chartWidth / 2; // min 50% + + // Step 2 + var verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length; + + // Step 3 + // TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837) + // var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length; + + // Step 4 + var maxChartAreaWidth = chartWidth; + var maxChartAreaHeight = chartHeight; + var outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; + var minBoxSizes = []; + var maxPadding; + + function getMinimumBoxSize(box) { + var minSize; + var isHorizontal = box.isHorizontal(); + + if (isHorizontal) { + minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2); + maxChartAreaHeight -= minSize.height; + } else { + minSize = box.update(verticalBoxWidth, maxChartAreaHeight); + maxChartAreaWidth -= minSize.width; + } + + minBoxSizes.push({ + horizontal: isHorizontal, + width: minSize.width, + box: box, + }); + } + + helpers$1.each(outerBoxes, getMinimumBoxSize); + + // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) + maxPadding = findMaxPadding(outerBoxes); + + // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could + // be if the axes are drawn at their minimum sizes. + // Steps 5 & 6 + + // Function to fit a box + function fitBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minBox) { + return minBox.box === box; + }); + + if (minBoxSize) { + if (minBoxSize.horizontal) { + var scaleMargin = { + left: Math.max(outerBoxSizes.left, maxPadding.left), + right: Math.max(outerBoxSizes.right, maxPadding.right), + top: 0, + bottom: 0 + }; + + // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends + // on the margin. Sometimes they need to increase in size slightly + box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); + } else { + box.update(minBoxSize.width, maxChartAreaHeight); + } + } + } + + // Update, and calculate the left and right margins for the horizontal boxes + helpers$1.each(verticalBoxes, fitBox); + addSizeByPosition(verticalBoxes, outerBoxSizes); + + // Set the Left and Right margins for the horizontal boxes + helpers$1.each(horizontalBoxes, fitBox); + addSizeByPosition(horizontalBoxes, outerBoxSizes); + + function finalFitVerticalBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minSize) { + return minSize.box === box; + }); + + var scaleMargin = { + left: 0, + right: 0, + top: outerBoxSizes.top, + bottom: outerBoxSizes.bottom + }; + + if (minBoxSize) { + box.update(minBoxSize.width, maxChartAreaHeight, scaleMargin); + } + } + + // Let the left layout know the final margin + helpers$1.each(verticalBoxes, finalFitVerticalBox); + + // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) + outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; + addSizeByPosition(outerBoxes, outerBoxSizes); + + // We may be adding some padding to account for rotated x axis labels + var leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0); + outerBoxSizes.left += leftPaddingAddition; + outerBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0); + + var topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0); + outerBoxSizes.top += topPaddingAddition; + outerBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 0); + + // Figure out if our chart area changed. This would occur if the dataset layout label rotation + // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do + // without calling `fit` again + var newMaxChartAreaHeight = height - outerBoxSizes.top - outerBoxSizes.bottom; + var newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right; + + if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { + helpers$1.each(verticalBoxes, function(box) { + box.height = newMaxChartAreaHeight; + }); + + helpers$1.each(horizontalBoxes, function(box) { + if (!box.fullWidth) { + box.width = newMaxChartAreaWidth; + } + }); + + maxChartAreaHeight = newMaxChartAreaHeight; + maxChartAreaWidth = newMaxChartAreaWidth; + } + + // Step 7 - Position the boxes + var left = leftPadding + leftPaddingAddition; + var top = topPadding + topPaddingAddition; + + function placeBox(box) { + if (box.isHorizontal()) { + box.left = box.fullWidth ? leftPadding : outerBoxSizes.left; + box.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + maxChartAreaWidth; + box.top = top; + box.bottom = top + box.height; + + // Move to next point + top = box.bottom; + + } else { + + box.left = left; + box.right = left + box.width; + box.top = outerBoxSizes.top; + box.bottom = outerBoxSizes.top + maxChartAreaHeight; + + // Move to next point + left = box.right; + } + } + + helpers$1.each(leftBoxes.concat(topBoxes), placeBox); + + // Account for chart width and height + left += maxChartAreaWidth; + top += maxChartAreaHeight; + + helpers$1.each(rightBoxes, placeBox); + helpers$1.each(bottomBoxes, placeBox); + + // Step 8 + chart.chartArea = { + left: outerBoxSizes.left, + top: outerBoxSizes.top, + right: outerBoxSizes.left + maxChartAreaWidth, + bottom: outerBoxSizes.top + maxChartAreaHeight + }; + + // Step 9 + helpers$1.each(chartAreaBoxes, function(box) { + box.left = chart.chartArea.left; + box.top = chart.chartArea.top; + box.right = chart.chartArea.right; + box.bottom = chart.chartArea.bottom; + + box.update(maxChartAreaWidth, maxChartAreaHeight); + }); + } +}; + +/** + * Platform fallback implementation (minimal). + * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 + */ + +var platform_basic = { + acquireContext: function(item) { + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + return item && item.getContext('2d') || null; + } +}; + +var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n"; + +var platform_dom$1 = /*#__PURE__*/Object.freeze({ +default: platform_dom +}); + +function getCjsExportFromNamespace (n) { + return n && n.default || n; +} + +var stylesheet = getCjsExportFromNamespace(platform_dom$1); + +var EXPANDO_KEY = '$chartjs'; +var CSS_PREFIX = 'chartjs-'; +var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor'; +var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; +var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; +var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; + +/** + * DOM event types -> Chart.js event types. + * Note: only events with different types are mapped. + * @see https://developer.mozilla.org/en-US/docs/Web/Events + */ +var EVENT_TYPES = { + touchstart: 'mousedown', + touchmove: 'mousemove', + touchend: 'mouseup', + pointerenter: 'mouseenter', + pointerdown: 'mousedown', + pointermove: 'mousemove', + pointerup: 'mouseup', + pointerleave: 'mouseout', + pointerout: 'mouseout' +}; + +/** + * The "used" size is the final value of a dimension property after all calculations have + * been performed. This method uses the computed style of `element` but returns undefined + * if the computed style is not expressed in pixels. That can happen in some cases where + * `element` has a size relative to its parent and this last one is not yet displayed, + * for example because of `display: none` on a parent node. + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value + * @returns {number} Size in pixels or undefined if unknown. + */ +function readUsedSize(element, property) { + var value = helpers$1.getStyle(element, property); + var matches = value && value.match(/^(\d+)(\.\d+)?px$/); + return matches ? Number(matches[1]) : undefined; +} + +/** + * Initializes the canvas style and render size without modifying the canvas display size, + * since responsiveness is handled by the controller.resize() method. The config is used + * to determine the aspect ratio to apply in case no explicit height has been specified. + */ +function initCanvas(canvas, config) { + var style = canvas.style; + + // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it + // returns null or '' if no explicit value has been set to the canvas attribute. + var renderHeight = canvas.getAttribute('height'); + var renderWidth = canvas.getAttribute('width'); + + // Chart.js modifies some canvas values that we want to restore on destroy + canvas[EXPANDO_KEY] = { + initial: { + height: renderHeight, + width: renderWidth, + style: { + display: style.display, + height: style.height, + width: style.width + } + } + }; + + // Force canvas to display as block to avoid extra space caused by inline + // elements, which would interfere with the responsive resize process. + // https://github.com/chartjs/Chart.js/issues/2538 + style.display = style.display || 'block'; + + if (renderWidth === null || renderWidth === '') { + var displayWidth = readUsedSize(canvas, 'width'); + if (displayWidth !== undefined) { + canvas.width = displayWidth; + } + } + + if (renderHeight === null || renderHeight === '') { + if (canvas.style.height === '') { + // If no explicit render height and style height, let's apply the aspect ratio, + // which one can be specified by the user but also by charts as default option + // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. + canvas.height = canvas.width / (config.options.aspectRatio || 2); + } else { + var displayHeight = readUsedSize(canvas, 'height'); + if (displayWidth !== undefined) { + canvas.height = displayHeight; + } + } + } + + return canvas; +} + +/** + * Detects support for options object argument in addEventListener. + * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + * @private + */ +var supportsEventListenerOptions = (function() { + var supports = false; + try { + var options = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line getter-return + get: function() { + supports = true; + } + }); + window.addEventListener('e', null, options); + } catch (e) { + // continue regardless of error + } + return supports; +}()); + +// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. +// https://github.com/chartjs/Chart.js/issues/4287 +var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; + +function addListener(node, type, listener) { + node.addEventListener(type, listener, eventListenerOptions); +} + +function removeListener(node, type, listener) { + node.removeEventListener(type, listener, eventListenerOptions); +} + +function createEvent(type, chart, x, y, nativeEvent) { + return { + type: type, + chart: chart, + native: nativeEvent || null, + x: x !== undefined ? x : null, + y: y !== undefined ? y : null, + }; +} + +function fromNativeEvent(event, chart) { + var type = EVENT_TYPES[event.type] || event.type; + var pos = helpers$1.getRelativePosition(event, chart); + return createEvent(type, chart, pos.x, pos.y, event); +} + +function throttled(fn, thisArg) { + var ticking = false; + var args = []; + + return function() { + args = Array.prototype.slice.call(arguments); + thisArg = thisArg || this; + + if (!ticking) { + ticking = true; + helpers$1.requestAnimFrame.call(window, function() { + ticking = false; + fn.apply(thisArg, args); + }); + } + }; +} + +function createDiv(cls) { + var el = document.createElement('div'); + el.className = cls || ''; + return el; +} + +// Implementation based on https://github.com/marcj/css-element-queries +function createResizer(handler) { + var maxSize = 1000000; + + // NOTE(SB) Don't use innerHTML because it could be considered unsafe. + // https://github.com/chartjs/Chart.js/issues/5902 + var resizer = createDiv(CSS_SIZE_MONITOR); + var expand = createDiv(CSS_SIZE_MONITOR + '-expand'); + var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink'); + + expand.appendChild(createDiv()); + shrink.appendChild(createDiv()); + + resizer.appendChild(expand); + resizer.appendChild(shrink); + resizer._reset = function() { + expand.scrollLeft = maxSize; + expand.scrollTop = maxSize; + shrink.scrollLeft = maxSize; + shrink.scrollTop = maxSize; + }; + + var onScroll = function() { + resizer._reset(); + handler(); + }; + + addListener(expand, 'scroll', onScroll.bind(expand, 'expand')); + addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); + + return resizer; +} + +// https://davidwalsh.name/detect-node-insertion +function watchForRender(node, handler) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + var proxy = expando.renderProxy = function(e) { + if (e.animationName === CSS_RENDER_ANIMATION) { + handler(); + } + }; + + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + addListener(node, type, proxy); + }); + + // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class + // is removed then added back immediately (same animation frame?). Accessing the + // `offsetParent` property will force a reflow and re-evaluate the CSS animation. + // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics + // https://github.com/chartjs/Chart.js/issues/4737 + expando.reflow = !!node.offsetParent; + + node.classList.add(CSS_RENDER_MONITOR); +} + +function unwatchForRender(node) { + var expando = node[EXPANDO_KEY] || {}; + var proxy = expando.renderProxy; + + if (proxy) { + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + removeListener(node, type, proxy); + }); + + delete expando.renderProxy; + } + + node.classList.remove(CSS_RENDER_MONITOR); +} + +function addResizeListener(node, listener, chart) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + + // Let's keep track of this added resizer and thus avoid DOM query when removing it. + var resizer = expando.resizer = createResizer(throttled(function() { + if (expando.resizer) { + var container = chart.options.maintainAspectRatio && node.parentNode; + var w = container ? container.clientWidth : 0; + listener(createEvent('resize', chart)); + if (container && container.clientWidth < w && chart.canvas) { + // If the container size shrank during chart resize, let's assume + // scrollbar appeared. So we resize again with the scrollbar visible - + // effectively making chart smaller and the scrollbar hidden again. + // Because we are inside `throttled`, and currently `ticking`, scroll + // events are ignored during this whole 2 resize process. + // If we assumed wrong and something else happened, we are resizing + // twice in a frame (potential performance issue) + listener(createEvent('resize', chart)); + } + } + })); + + // The resizer needs to be attached to the node parent, so we first need to be + // sure that `node` is attached to the DOM before injecting the resizer element. + watchForRender(node, function() { + if (expando.resizer) { + var container = node.parentNode; + if (container && container !== resizer.parentNode) { + container.insertBefore(resizer, container.firstChild); + } + + // The container size might have changed, let's reset the resizer state. + resizer._reset(); + } + }); +} + +function removeResizeListener(node) { + var expando = node[EXPANDO_KEY] || {}; + var resizer = expando.resizer; + + delete expando.resizer; + unwatchForRender(node); + + if (resizer && resizer.parentNode) { + resizer.parentNode.removeChild(resizer); + } +} + +function injectCSS(platform, css) { + // https://stackoverflow.com/q/3922139 + var style = platform._style || document.createElement('style'); + if (!platform._style) { + platform._style = style; + css = '/* Chart.js */\n' + css; + style.setAttribute('type', 'text/css'); + document.getElementsByTagName('head')[0].appendChild(style); + } + + style.appendChild(document.createTextNode(css)); +} + +var platform_dom$2 = { + /** + * When `true`, prevents the automatic injection of the stylesheet required to + * correctly detect when the chart is added to the DOM and then resized. This + * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`) + * to be manually imported to make this library compatible with any CSP. + * See https://github.com/chartjs/Chart.js/issues/5208 + */ + disableCSSInjection: false, + + /** + * This property holds whether this platform is enabled for the current environment. + * Currently used by platform.js to select the proper implementation. + * @private + */ + _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', + + /** + * @private + */ + _ensureLoaded: function() { + if (this._loaded) { + return; + } + + this._loaded = true; + + // https://github.com/chartjs/Chart.js/issues/5208 + if (!this.disableCSSInjection) { + injectCSS(this, stylesheet); + } + }, + + acquireContext: function(item, config) { + if (typeof item === 'string') { + item = document.getElementById(item); + } else if (item.length) { + // Support for array based queries (such as jQuery) + item = item[0]; + } + + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + // To prevent canvas fingerprinting, some add-ons undefine the getContext + // method, for example: https://github.com/kkapsner/CanvasBlocker + // https://github.com/chartjs/Chart.js/issues/2807 + var context = item && item.getContext && item.getContext('2d'); + + // Load platform resources on first chart creation, to make possible to change + // platform options after importing the library (e.g. `disableCSSInjection`). + this._ensureLoaded(); + + // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is + // inside an iframe or when running in a protected environment. We could guess the + // types from their toString() value but let's keep things flexible and assume it's + // a sufficient condition if the item has a context2D which has item as `canvas`. + // https://github.com/chartjs/Chart.js/issues/3887 + // https://github.com/chartjs/Chart.js/issues/4102 + // https://github.com/chartjs/Chart.js/issues/4152 + if (context && context.canvas === item) { + initCanvas(item, config); + return context; + } + + return null; + }, + + releaseContext: function(context) { + var canvas = context.canvas; + if (!canvas[EXPANDO_KEY]) { + return; + } + + var initial = canvas[EXPANDO_KEY].initial; + ['height', 'width'].forEach(function(prop) { + var value = initial[prop]; + if (helpers$1.isNullOrUndef(value)) { + canvas.removeAttribute(prop); + } else { + canvas.setAttribute(prop, value); + } + }); + + helpers$1.each(initial.style || {}, function(value, key) { + canvas.style[key] = value; + }); + + // The canvas render size might have been changed (and thus the state stack discarded), + // we can't use save() and restore() to restore the initial state. So make sure that at + // least the canvas context is reset to the default state by setting the canvas width. + // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html + // eslint-disable-next-line no-self-assign + canvas.width = canvas.width; + + delete canvas[EXPANDO_KEY]; + }, + + addEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + addResizeListener(canvas, listener, chart); + return; + } + + var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); + var proxies = expando.proxies || (expando.proxies = {}); + var proxy = proxies[chart.id + '_' + type] = function(event) { + listener(fromNativeEvent(event, chart)); + }; + + addListener(canvas, type, proxy); + }, + + removeEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + removeResizeListener(canvas); + return; + } + + var expando = listener[EXPANDO_KEY] || {}; + var proxies = expando.proxies || {}; + var proxy = proxies[chart.id + '_' + type]; + if (!proxy) { + return; + } + + removeListener(canvas, type, proxy); + } +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use EventTarget.addEventListener instead. + * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener + * @function Chart.helpers.addEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers$1.addEvent = addListener; + +/** + * Provided for backward compatibility, use EventTarget.removeEventListener instead. + * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener + * @function Chart.helpers.removeEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers$1.removeEvent = removeListener; + +// @TODO Make possible to select another platform at build time. +var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic; + +/** + * @namespace Chart.platform + * @see https://chartjs.gitbooks.io/proposals/content/Platform.html + * @since 2.4.0 + */ +var platform = helpers$1.extend({ + /** + * @since 2.7.0 + */ + initialize: function() {}, + + /** + * Called at chart construction time, returns a context2d instance implementing + * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. + * @param {*} item - The native item from which to acquire context (platform specific) + * @param {object} options - The chart options + * @returns {CanvasRenderingContext2D} context2d instance + */ + acquireContext: function() {}, + + /** + * Called at chart destruction time, releases any resources associated to the context + * previously returned by the acquireContext() method. + * @param {CanvasRenderingContext2D} context - The context2d instance + * @returns {boolean} true if the method succeeded, else false + */ + releaseContext: function() {}, + + /** + * Registers the specified listener on the given chart. + * @param {Chart} chart - Chart from which to listen for event + * @param {string} type - The ({@link IEvent}) type to listen for + * @param {function} listener - Receives a notification (an object that implements + * the {@link IEvent} interface) when an event of the specified type occurs. + */ + addEventListener: function() {}, + + /** + * Removes the specified listener previously registered with addEventListener. + * @param {Chart} chart - Chart from which to remove the listener + * @param {string} type - The ({@link IEvent}) type to remove + * @param {function} listener - The listener function to remove from the event target. + */ + removeEventListener: function() {} + +}, implementation); + +core_defaults._set('global', { + plugins: {} +}); + +/** + * The plugin service singleton + * @namespace Chart.plugins + * @since 2.1.0 + */ +var core_plugins = { + /** + * Globally registered plugins. + * @private + */ + _plugins: [], + + /** + * This identifier is used to invalidate the descriptors cache attached to each chart + * when a global plugin is registered or unregistered. In this case, the cache ID is + * incremented and descriptors are regenerated during following API calls. + * @private + */ + _cacheId: 0, + + /** + * Registers the given plugin(s) if not already registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + register: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + if (p.indexOf(plugin) === -1) { + p.push(plugin); + } + }); + + this._cacheId++; + }, + + /** + * Unregisters the given plugin(s) only if registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + unregister: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + var idx = p.indexOf(plugin); + if (idx !== -1) { + p.splice(idx, 1); + } + }); + + this._cacheId++; + }, + + /** + * Remove all registered plugins. + * @since 2.1.5 + */ + clear: function() { + this._plugins = []; + this._cacheId++; + }, + + /** + * Returns the number of registered plugins? + * @returns {number} + * @since 2.1.5 + */ + count: function() { + return this._plugins.length; + }, + + /** + * Returns all registered plugin instances. + * @returns {IPlugin[]} array of plugin objects. + * @since 2.1.5 + */ + getAll: function() { + return this._plugins; + }, + + /** + * Calls enabled plugins for `chart` on the specified hook and with the given args. + * This method immediately returns as soon as a plugin explicitly returns false. The + * returned value can be used, for instance, to interrupt the current action. + * @param {Chart} chart - The chart instance for which plugins should be called. + * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). + * @param {Array} [args] - Extra arguments to apply to the hook call. + * @returns {boolean} false if any of the plugins return false, else returns true. + */ + notify: function(chart, hook, args) { + var descriptors = this.descriptors(chart); + var ilen = descriptors.length; + var i, descriptor, plugin, params, method; + + for (i = 0; i < ilen; ++i) { + descriptor = descriptors[i]; + plugin = descriptor.plugin; + method = plugin[hook]; + if (typeof method === 'function') { + params = [chart].concat(args || []); + params.push(descriptor.options); + if (method.apply(plugin, params) === false) { + return false; + } + } + } + + return true; + }, + + /** + * Returns descriptors of enabled plugins for the given chart. + * @returns {object[]} [{ plugin, options }] + * @private + */ + descriptors: function(chart) { + var cache = chart.$plugins || (chart.$plugins = {}); + if (cache.id === this._cacheId) { + return cache.descriptors; + } + + var plugins = []; + var descriptors = []; + var config = (chart && chart.config) || {}; + var options = (config.options && config.options.plugins) || {}; + + this._plugins.concat(config.plugins || []).forEach(function(plugin) { + var idx = plugins.indexOf(plugin); + if (idx !== -1) { + return; + } + + var id = plugin.id; + var opts = options[id]; + if (opts === false) { + return; + } + + if (opts === true) { + opts = helpers$1.clone(core_defaults.global.plugins[id]); + } + + plugins.push(plugin); + descriptors.push({ + plugin: plugin, + options: opts || {} + }); + }); + + cache.descriptors = descriptors; + cache.id = this._cacheId; + return descriptors; + }, + + /** + * Invalidates cache for the given chart: descriptors hold a reference on plugin option, + * but in some cases, this reference can be changed by the user when updating options. + * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + * @private + */ + _invalidate: function(chart) { + delete chart.$plugins; + } +}; + +var core_scaleService = { + // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then + // use the new chart options to grab the correct scale + constructors: {}, + // Use a registration function so that we can move to an ES6 map when we no longer need to support + // old browsers + + // Scale config defaults + defaults: {}, + registerScaleType: function(type, scaleConstructor, scaleDefaults) { + this.constructors[type] = scaleConstructor; + this.defaults[type] = helpers$1.clone(scaleDefaults); + }, + getScaleConstructor: function(type) { + return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; + }, + getScaleDefaults: function(type) { + // Return the scale defaults merged with the global settings so that we always use the latest ones + return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {}; + }, + updateScaleDefaults: function(type, additions) { + var me = this; + if (me.defaults.hasOwnProperty(type)) { + me.defaults[type] = helpers$1.extend(me.defaults[type], additions); + } + }, + addScalesToLayout: function(chart) { + // Adds each scale to the chart.boxes array to be sized accordingly + helpers$1.each(chart.scales, function(scale) { + // Set ILayoutItem parameters for backwards compatibility + scale.fullWidth = scale.options.fullWidth; + scale.position = scale.options.position; + scale.weight = scale.options.weight; + core_layouts.addBox(chart, scale); + }); + } +}; + +var valueOrDefault$7 = helpers$1.valueOrDefault; + +core_defaults._set('global', { + tooltips: { + enabled: true, + custom: null, + mode: 'nearest', + position: 'average', + intersect: true, + backgroundColor: 'rgba(0,0,0,0.8)', + titleFontStyle: 'bold', + titleSpacing: 2, + titleMarginBottom: 6, + titleFontColor: '#fff', + titleAlign: 'left', + bodySpacing: 2, + bodyFontColor: '#fff', + bodyAlign: 'left', + footerFontStyle: 'bold', + footerSpacing: 2, + footerMarginTop: 6, + footerFontColor: '#fff', + footerAlign: 'left', + yPadding: 6, + xPadding: 6, + caretPadding: 2, + caretSize: 5, + cornerRadius: 6, + multiKeyBackground: '#fff', + displayColors: true, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 0, + callbacks: { + // Args are: (tooltipItems, data) + beforeTitle: helpers$1.noop, + title: function(tooltipItems, data) { + var title = ''; + var labels = data.labels; + var labelCount = labels ? labels.length : 0; + + if (tooltipItems.length > 0) { + var item = tooltipItems[0]; + if (item.label) { + title = item.label; + } else if (item.xLabel) { + title = item.xLabel; + } else if (labelCount > 0 && item.index < labelCount) { + title = labels[item.index]; + } + } + + return title; + }, + afterTitle: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeBody: helpers$1.noop, + + // Args are: (tooltipItem, data) + beforeLabel: helpers$1.noop, + label: function(tooltipItem, data) { + var label = data.datasets[tooltipItem.datasetIndex].label || ''; + + if (label) { + label += ': '; + } + if (!helpers$1.isNullOrUndef(tooltipItem.value)) { + label += tooltipItem.value; + } else { + label += tooltipItem.yLabel; + } + return label; + }, + labelColor: function(tooltipItem, chart) { + var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); + var activeElement = meta.data[tooltipItem.index]; + var view = activeElement._view; + return { + borderColor: view.borderColor, + backgroundColor: view.backgroundColor + }; + }, + labelTextColor: function() { + return this._options.bodyFontColor; + }, + afterLabel: helpers$1.noop, + + // Args are: (tooltipItems, data) + afterBody: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeFooter: helpers$1.noop, + footer: helpers$1.noop, + afterFooter: helpers$1.noop + } + } +}); + +var positioners = { + /** + * Average mode places the tooltip at the average position of the elements shown + * @function Chart.Tooltip.positioners.average + * @param elements {ChartElement[]} the elements being displayed in the tooltip + * @returns {object} tooltip position + */ + average: function(elements) { + if (!elements.length) { + return false; + } + + var i, len; + var x = 0; + var y = 0; + var count = 0; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var pos = el.tooltipPosition(); + x += pos.x; + y += pos.y; + ++count; + } + } + + return { + x: x / count, + y: y / count + }; + }, + + /** + * Gets the tooltip position nearest of the item nearest to the event position + * @function Chart.Tooltip.positioners.nearest + * @param elements {Chart.Element[]} the tooltip elements + * @param eventPosition {object} the position of the event in canvas coordinates + * @returns {object} the tooltip position + */ + nearest: function(elements, eventPosition) { + var x = eventPosition.x; + var y = eventPosition.y; + var minDistance = Number.POSITIVE_INFINITY; + var i, len, nearestElement; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var center = el.getCenterPoint(); + var d = helpers$1.distanceBetweenPoints(eventPosition, center); + + if (d < minDistance) { + minDistance = d; + nearestElement = el; + } + } + } + + if (nearestElement) { + var tp = nearestElement.tooltipPosition(); + x = tp.x; + y = tp.y; + } + + return { + x: x, + y: y + }; + } +}; + +// Helper to push or concat based on if the 2nd parameter is an array or not +function pushOrConcat(base, toPush) { + if (toPush) { + if (helpers$1.isArray(toPush)) { + // base = base.concat(toPush); + Array.prototype.push.apply(base, toPush); + } else { + base.push(toPush); + } + } + + return base; +} + +/** + * Returns array of strings split by newline + * @param {string} value - The value to split by newline. + * @returns {string[]} value if newline present - Returned from String split() method + * @function + */ +function splitNewlines(str) { + if ((typeof str === 'string' || str instanceof String) && str.indexOf('\n') > -1) { + return str.split('\n'); + } + return str; +} + + +/** + * Private helper to create a tooltip item model + * @param element - the chart element (point, arc, bar) to create the tooltip item for + * @return new tooltip item + */ +function createTooltipItem(element) { + var xScale = element._xScale; + var yScale = element._yScale || element._scale; // handle radar || polarArea charts + var index = element._index; + var datasetIndex = element._datasetIndex; + var controller = element._chart.getDatasetMeta(datasetIndex).controller; + var indexScale = controller._getIndexScale(); + var valueScale = controller._getValueScale(); + + return { + xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', + yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', + label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '', + value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '', + index: index, + datasetIndex: datasetIndex, + x: element._model.x, + y: element._model.y + }; +} + +/** + * Helper to get the reset model for the tooltip + * @param tooltipOpts {object} the tooltip options + */ +function getBaseModel(tooltipOpts) { + var globalDefaults = core_defaults.global; + + return { + // Positioning + xPadding: tooltipOpts.xPadding, + yPadding: tooltipOpts.yPadding, + xAlign: tooltipOpts.xAlign, + yAlign: tooltipOpts.yAlign, + + // Body + bodyFontColor: tooltipOpts.bodyFontColor, + _bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), + _bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), + _bodyAlign: tooltipOpts.bodyAlign, + bodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), + bodySpacing: tooltipOpts.bodySpacing, + + // Title + titleFontColor: tooltipOpts.titleFontColor, + _titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), + _titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), + titleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), + _titleAlign: tooltipOpts.titleAlign, + titleSpacing: tooltipOpts.titleSpacing, + titleMarginBottom: tooltipOpts.titleMarginBottom, + + // Footer + footerFontColor: tooltipOpts.footerFontColor, + _footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), + _footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), + footerFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), + _footerAlign: tooltipOpts.footerAlign, + footerSpacing: tooltipOpts.footerSpacing, + footerMarginTop: tooltipOpts.footerMarginTop, + + // Appearance + caretSize: tooltipOpts.caretSize, + cornerRadius: tooltipOpts.cornerRadius, + backgroundColor: tooltipOpts.backgroundColor, + opacity: 0, + legendColorBackground: tooltipOpts.multiKeyBackground, + displayColors: tooltipOpts.displayColors, + borderColor: tooltipOpts.borderColor, + borderWidth: tooltipOpts.borderWidth + }; +} + +/** + * Get the size of the tooltip + */ +function getTooltipSize(tooltip, model) { + var ctx = tooltip._chart.ctx; + + var height = model.yPadding * 2; // Tooltip Padding + var width = 0; + + // Count of all lines in the body + var body = model.body; + var combinedBodyLength = body.reduce(function(count, bodyItem) { + return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; + }, 0); + combinedBodyLength += model.beforeBody.length + model.afterBody.length; + + var titleLineCount = model.title.length; + var footerLineCount = model.footer.length; + var titleFontSize = model.titleFontSize; + var bodyFontSize = model.bodyFontSize; + var footerFontSize = model.footerFontSize; + + height += titleLineCount * titleFontSize; // Title Lines + height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing + height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin + height += combinedBodyLength * bodyFontSize; // Body Lines + height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing + height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin + height += footerLineCount * (footerFontSize); // Footer Lines + height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing + + // Title width + var widthPadding = 0; + var maxLineWidth = function(line) { + width = Math.max(width, ctx.measureText(line).width + widthPadding); + }; + + ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); + helpers$1.each(model.title, maxLineWidth); + + // Body width + ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); + helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth); + + // Body lines may include some extra width due to the color box + widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; + helpers$1.each(body, function(bodyItem) { + helpers$1.each(bodyItem.before, maxLineWidth); + helpers$1.each(bodyItem.lines, maxLineWidth); + helpers$1.each(bodyItem.after, maxLineWidth); + }); + + // Reset back to 0 + widthPadding = 0; + + // Footer width + ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); + helpers$1.each(model.footer, maxLineWidth); + + // Add padding + width += 2 * model.xPadding; + + return { + width: width, + height: height + }; +} + +/** + * Helper to get the alignment of a tooltip given the size + */ +function determineAlignment(tooltip, size) { + var model = tooltip._model; + var chart = tooltip._chart; + var chartArea = tooltip._chart.chartArea; + var xAlign = 'center'; + var yAlign = 'center'; + + if (model.y < size.height) { + yAlign = 'top'; + } else if (model.y > (chart.height - size.height)) { + yAlign = 'bottom'; + } + + var lf, rf; // functions to determine left, right alignment + var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart + var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges + var midX = (chartArea.left + chartArea.right) / 2; + var midY = (chartArea.top + chartArea.bottom) / 2; + + if (yAlign === 'center') { + lf = function(x) { + return x <= midX; + }; + rf = function(x) { + return x > midX; + }; + } else { + lf = function(x) { + return x <= (size.width / 2); + }; + rf = function(x) { + return x >= (chart.width - (size.width / 2)); + }; + } + + olf = function(x) { + return x + size.width + model.caretSize + model.caretPadding > chart.width; + }; + orf = function(x) { + return x - size.width - model.caretSize - model.caretPadding < 0; + }; + yf = function(y) { + return y <= midY ? 'top' : 'bottom'; + }; + + if (lf(model.x)) { + xAlign = 'left'; + + // Is tooltip too wide and goes over the right side of the chart.? + if (olf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } else if (rf(model.x)) { + xAlign = 'right'; + + // Is tooltip too wide and goes outside left edge of canvas? + if (orf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } + + var opts = tooltip._options; + return { + xAlign: opts.xAlign ? opts.xAlign : xAlign, + yAlign: opts.yAlign ? opts.yAlign : yAlign + }; +} + +/** + * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment + */ +function getBackgroundPoint(vm, size, alignment, chart) { + // Background Position + var x = vm.x; + var y = vm.y; + + var caretSize = vm.caretSize; + var caretPadding = vm.caretPadding; + var cornerRadius = vm.cornerRadius; + var xAlign = alignment.xAlign; + var yAlign = alignment.yAlign; + var paddingAndSize = caretSize + caretPadding; + var radiusAndPadding = cornerRadius + caretPadding; + + if (xAlign === 'right') { + x -= size.width; + } else if (xAlign === 'center') { + x -= (size.width / 2); + if (x + size.width > chart.width) { + x = chart.width - size.width; + } + if (x < 0) { + x = 0; + } + } + + if (yAlign === 'top') { + y += paddingAndSize; + } else if (yAlign === 'bottom') { + y -= size.height + paddingAndSize; + } else { + y -= (size.height / 2); + } + + if (yAlign === 'center') { + if (xAlign === 'left') { + x += paddingAndSize; + } else if (xAlign === 'right') { + x -= paddingAndSize; + } + } else if (xAlign === 'left') { + x -= radiusAndPadding; + } else if (xAlign === 'right') { + x += radiusAndPadding; + } + + return { + x: x, + y: y + }; +} + +function getAlignedX(vm, align) { + return align === 'center' + ? vm.x + vm.width / 2 + : align === 'right' + ? vm.x + vm.width - vm.xPadding + : vm.x + vm.xPadding; +} + +/** + * Helper to build before and after body lines + */ +function getBeforeAfterBodyLines(callback) { + return pushOrConcat([], splitNewlines(callback)); +} + +var exports$3 = core_element.extend({ + initialize: function() { + this._model = getBaseModel(this._options); + this._lastActive = []; + }, + + // Get the title + // Args are: (tooltipItem, data) + getTitle: function() { + var me = this; + var opts = me._options; + var callbacks = opts.callbacks; + + var beforeTitle = callbacks.beforeTitle.apply(me, arguments); + var title = callbacks.title.apply(me, arguments); + var afterTitle = callbacks.afterTitle.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeTitle)); + lines = pushOrConcat(lines, splitNewlines(title)); + lines = pushOrConcat(lines, splitNewlines(afterTitle)); + + return lines; + }, + + // Args are: (tooltipItem, data) + getBeforeBody: function() { + return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments)); + }, + + // Args are: (tooltipItem, data) + getBody: function(tooltipItems, data) { + var me = this; + var callbacks = me._options.callbacks; + var bodyItems = []; + + helpers$1.each(tooltipItems, function(tooltipItem) { + var bodyItem = { + before: [], + lines: [], + after: [] + }; + pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data))); + pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); + pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data))); + + bodyItems.push(bodyItem); + }); + + return bodyItems; + }, + + // Args are: (tooltipItem, data) + getAfterBody: function() { + return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments)); + }, + + // Get the footer and beforeFooter and afterFooter lines + // Args are: (tooltipItem, data) + getFooter: function() { + var me = this; + var callbacks = me._options.callbacks; + + var beforeFooter = callbacks.beforeFooter.apply(me, arguments); + var footer = callbacks.footer.apply(me, arguments); + var afterFooter = callbacks.afterFooter.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeFooter)); + lines = pushOrConcat(lines, splitNewlines(footer)); + lines = pushOrConcat(lines, splitNewlines(afterFooter)); + + return lines; + }, + + update: function(changed) { + var me = this; + var opts = me._options; + + // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition + // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time + // which breaks any animations. + var existingModel = me._model; + var model = me._model = getBaseModel(opts); + var active = me._active; + + var data = me._data; + + // In the case where active.length === 0 we need to keep these at existing values for good animations + var alignment = { + xAlign: existingModel.xAlign, + yAlign: existingModel.yAlign + }; + var backgroundPoint = { + x: existingModel.x, + y: existingModel.y + }; + var tooltipSize = { + width: existingModel.width, + height: existingModel.height + }; + var tooltipPosition = { + x: existingModel.caretX, + y: existingModel.caretY + }; + + var i, len; + + if (active.length) { + model.opacity = 1; + + var labelColors = []; + var labelTextColors = []; + tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition); + + var tooltipItems = []; + for (i = 0, len = active.length; i < len; ++i) { + tooltipItems.push(createTooltipItem(active[i])); + } + + // If the user provided a filter function, use it to modify the tooltip items + if (opts.filter) { + tooltipItems = tooltipItems.filter(function(a) { + return opts.filter(a, data); + }); + } + + // If the user provided a sorting function, use it to modify the tooltip items + if (opts.itemSort) { + tooltipItems = tooltipItems.sort(function(a, b) { + return opts.itemSort(a, b, data); + }); + } + + // Determine colors for boxes + helpers$1.each(tooltipItems, function(tooltipItem) { + labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); + labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); + }); + + + // Build the Text Lines + model.title = me.getTitle(tooltipItems, data); + model.beforeBody = me.getBeforeBody(tooltipItems, data); + model.body = me.getBody(tooltipItems, data); + model.afterBody = me.getAfterBody(tooltipItems, data); + model.footer = me.getFooter(tooltipItems, data); + + // Initial positioning and colors + model.x = tooltipPosition.x; + model.y = tooltipPosition.y; + model.caretPadding = opts.caretPadding; + model.labelColors = labelColors; + model.labelTextColors = labelTextColors; + + // data points + model.dataPoints = tooltipItems; + + // We need to determine alignment of the tooltip + tooltipSize = getTooltipSize(this, model); + alignment = determineAlignment(this, tooltipSize); + // Final Size and Position + backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart); + } else { + model.opacity = 0; + } + + model.xAlign = alignment.xAlign; + model.yAlign = alignment.yAlign; + model.x = backgroundPoint.x; + model.y = backgroundPoint.y; + model.width = tooltipSize.width; + model.height = tooltipSize.height; + + // Point where the caret on the tooltip points to + model.caretX = tooltipPosition.x; + model.caretY = tooltipPosition.y; + + me._model = model; + + if (changed && opts.custom) { + opts.custom.call(me, model); + } + + return me; + }, + + drawCaret: function(tooltipPoint, size) { + var ctx = this._chart.ctx; + var vm = this._view; + var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); + + ctx.lineTo(caretPosition.x1, caretPosition.y1); + ctx.lineTo(caretPosition.x2, caretPosition.y2); + ctx.lineTo(caretPosition.x3, caretPosition.y3); + }, + getCaretPosition: function(tooltipPoint, size, vm) { + var x1, x2, x3, y1, y2, y3; + var caretSize = vm.caretSize; + var cornerRadius = vm.cornerRadius; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var ptX = tooltipPoint.x; + var ptY = tooltipPoint.y; + var width = size.width; + var height = size.height; + + if (yAlign === 'center') { + y2 = ptY + (height / 2); + + if (xAlign === 'left') { + x1 = ptX; + x2 = x1 - caretSize; + x3 = x1; + + y1 = y2 + caretSize; + y3 = y2 - caretSize; + } else { + x1 = ptX + width; + x2 = x1 + caretSize; + x3 = x1; + + y1 = y2 - caretSize; + y3 = y2 + caretSize; + } + } else { + if (xAlign === 'left') { + x2 = ptX + cornerRadius + (caretSize); + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else if (xAlign === 'right') { + x2 = ptX + width - cornerRadius - caretSize; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else { + x2 = vm.caretX; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } + if (yAlign === 'top') { + y1 = ptY; + y2 = y1 - caretSize; + y3 = y1; + } else { + y1 = ptY + height; + y2 = y1 + caretSize; + y3 = y1; + // invert drawing order + var tmp = x3; + x3 = x1; + x1 = tmp; + } + } + return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; + }, + + drawTitle: function(pt, vm, ctx) { + var title = vm.title; + + if (title.length) { + pt.x = getAlignedX(vm, vm._titleAlign); + + ctx.textAlign = vm._titleAlign; + ctx.textBaseline = 'top'; + + var titleFontSize = vm.titleFontSize; + var titleSpacing = vm.titleSpacing; + + ctx.fillStyle = vm.titleFontColor; + ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); + + var i, len; + for (i = 0, len = title.length; i < len; ++i) { + ctx.fillText(title[i], pt.x, pt.y); + pt.y += titleFontSize + titleSpacing; // Line Height and spacing + + if (i + 1 === title.length) { + pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing + } + } + } + }, + + drawBody: function(pt, vm, ctx) { + var bodyFontSize = vm.bodyFontSize; + var bodySpacing = vm.bodySpacing; + var bodyAlign = vm._bodyAlign; + var body = vm.body; + var drawColorBoxes = vm.displayColors; + var labelColors = vm.labelColors; + var xLinePadding = 0; + var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0; + var textColor; + + ctx.textAlign = bodyAlign; + ctx.textBaseline = 'top'; + ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); + + pt.x = getAlignedX(vm, bodyAlign); + + // Before Body + var fillLineOfText = function(line) { + ctx.fillText(line, pt.x + xLinePadding, pt.y); + pt.y += bodyFontSize + bodySpacing; + }; + + // Before body lines + ctx.fillStyle = vm.bodyFontColor; + helpers$1.each(vm.beforeBody, fillLineOfText); + + xLinePadding = drawColorBoxes && bodyAlign !== 'right' + ? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2) + : 0; + + // Draw body lines now + helpers$1.each(body, function(bodyItem, i) { + textColor = vm.labelTextColors[i]; + ctx.fillStyle = textColor; + helpers$1.each(bodyItem.before, fillLineOfText); + + helpers$1.each(bodyItem.lines, function(line) { + // Draw Legend-like boxes if needed + if (drawColorBoxes) { + // Fill a white rect so that colours merge nicely if the opacity is < 1 + ctx.fillStyle = vm.legendColorBackground; + ctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Border + ctx.lineWidth = 1; + ctx.strokeStyle = labelColors[i].borderColor; + ctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Inner square + ctx.fillStyle = labelColors[i].backgroundColor; + ctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); + ctx.fillStyle = textColor; + } + + fillLineOfText(line); + }); + + helpers$1.each(bodyItem.after, fillLineOfText); + }); + + // Reset back to 0 for after body + xLinePadding = 0; + + // After body lines + helpers$1.each(vm.afterBody, fillLineOfText); + pt.y -= bodySpacing; // Remove last body spacing + }, + + drawFooter: function(pt, vm, ctx) { + var footer = vm.footer; + + if (footer.length) { + pt.x = getAlignedX(vm, vm._footerAlign); + pt.y += vm.footerMarginTop; + + ctx.textAlign = vm._footerAlign; + ctx.textBaseline = 'top'; + + ctx.fillStyle = vm.footerFontColor; + ctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); + + helpers$1.each(footer, function(line) { + ctx.fillText(line, pt.x, pt.y); + pt.y += vm.footerFontSize + vm.footerSpacing; + }); + } + }, + + drawBackground: function(pt, vm, ctx, tooltipSize) { + ctx.fillStyle = vm.backgroundColor; + ctx.strokeStyle = vm.borderColor; + ctx.lineWidth = vm.borderWidth; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var x = pt.x; + var y = pt.y; + var width = tooltipSize.width; + var height = tooltipSize.height; + var radius = vm.cornerRadius; + + ctx.beginPath(); + ctx.moveTo(x + radius, y); + if (yAlign === 'top') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + if (yAlign === 'center' && xAlign === 'right') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + if (yAlign === 'bottom') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + if (yAlign === 'center' && xAlign === 'left') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + + ctx.fill(); + + if (vm.borderWidth > 0) { + ctx.stroke(); + } + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + + if (vm.opacity === 0) { + return; + } + + var tooltipSize = { + width: vm.width, + height: vm.height + }; + var pt = { + x: vm.x, + y: vm.y + }; + + // IE11/Edge does not like very small opacities, so snap to 0 + var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; + + // Truthy/falsey value for empty tooltip + var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; + + if (this._options.enabled && hasTooltipContent) { + ctx.save(); + ctx.globalAlpha = opacity; + + // Draw Background + this.drawBackground(pt, vm, ctx, tooltipSize); + + // Draw Title, Body, and Footer + pt.y += vm.yPadding; + + // Titles + this.drawTitle(pt, vm, ctx); + + // Body + this.drawBody(pt, vm, ctx); + + // Footer + this.drawFooter(pt, vm, ctx); + + ctx.restore(); + } + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + * @returns {boolean} true if the tooltip changed + */ + handleEvent: function(e) { + var me = this; + var options = me._options; + var changed = false; + + me._lastActive = me._lastActive || []; + + // Find Active Elements for tooltips + if (e.type === 'mouseout') { + me._active = []; + } else { + me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); + } + + // Remember Last Actives + changed = !helpers$1.arrayEquals(me._active, me._lastActive); + + // Only handle target event on tooltip change + if (changed) { + me._lastActive = me._active; + + if (options.enabled || options.custom) { + me._eventPosition = { + x: e.x, + y: e.y + }; + + me.update(true); + me.pivot(); + } + } + + return changed; + } +}); + +/** + * @namespace Chart.Tooltip.positioners + */ +var positioners_1 = positioners; + +var core_tooltip = exports$3; +core_tooltip.positioners = positioners_1; + +var valueOrDefault$8 = helpers$1.valueOrDefault; + +core_defaults._set('global', { + elements: {}, + events: [ + 'mousemove', + 'mouseout', + 'click', + 'touchstart', + 'touchmove' + ], + hover: { + onHover: null, + mode: 'nearest', + intersect: true, + animationDuration: 400 + }, + onClick: null, + maintainAspectRatio: true, + responsive: true, + responsiveAnimationDuration: 0 +}); + +/** + * Recursively merge the given config objects representing the `scales` option + * by incorporating scale defaults in `xAxes` and `yAxes` array items, then + * returns a deep copy of the result, thus doesn't alter inputs. + */ +function mergeScaleConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function(key, target, source, options) { + if (key === 'xAxes' || key === 'yAxes') { + var slen = source[key].length; + var i, type, scale; + + if (!target[key]) { + target[key] = []; + } + + for (i = 0; i < slen; ++i) { + scale = source[key][i]; + type = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear'); + + if (i >= target[key].length) { + target[key].push({}); + } + + if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { + // new/untyped scale or type changed: let's apply the new defaults + // then merge source scale to correctly overwrite the defaults. + helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]); + } else { + // scales type are the same + helpers$1.merge(target[key][i], scale); + } + } + } else { + helpers$1._merger(key, target, source, options); + } + } + }); +} + +/** + * Recursively merge the given config objects as the root options by handling + * default scale options for the `scales` and `scale` properties, then returns + * a deep copy of the result, thus doesn't alter inputs. + */ +function mergeConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function(key, target, source, options) { + var tval = target[key] || {}; + var sval = source[key]; + + if (key === 'scales') { + // scale config merging is complex. Add our own function here for that + target[key] = mergeScaleConfig(tval, sval); + } else if (key === 'scale') { + // used in polar area & radar charts since there is only one scale + target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]); + } else { + helpers$1._merger(key, target, source, options); + } + } + }); +} + +function initConfig(config) { + config = config || {}; + + // Do NOT use mergeConfig for the data object because this method merges arrays + // and so would change references to labels and datasets, preventing data updates. + var data = config.data = config.data || {}; + data.datasets = data.datasets || []; + data.labels = data.labels || []; + + config.options = mergeConfig( + core_defaults.global, + core_defaults[config.type], + config.options || {}); + + return config; +} + +function updateConfig(chart) { + var newOptions = chart.options; + + helpers$1.each(chart.scales, function(scale) { + core_layouts.removeBox(chart, scale); + }); + + newOptions = mergeConfig( + core_defaults.global, + core_defaults[chart.config.type], + newOptions); + + chart.options = chart.config.options = newOptions; + chart.ensureScalesHaveIDs(); + chart.buildOrUpdateScales(); + + // Tooltip + chart.tooltip._options = newOptions.tooltips; + chart.tooltip.initialize(); +} + +function positionIsHorizontal(position) { + return position === 'top' || position === 'bottom'; +} + +var Chart = function(item, config) { + this.construct(item, config); + return this; +}; + +helpers$1.extend(Chart.prototype, /** @lends Chart */ { + /** + * @private + */ + construct: function(item, config) { + var me = this; + + config = initConfig(config); + + var context = platform.acquireContext(item, config); + var canvas = context && context.canvas; + var height = canvas && canvas.height; + var width = canvas && canvas.width; + + me.id = helpers$1.uid(); + me.ctx = context; + me.canvas = canvas; + me.config = config; + me.width = width; + me.height = height; + me.aspectRatio = height ? width / height : null; + me.options = config.options; + me._bufferedRender = false; + + /** + * Provided for backward compatibility, Chart and Chart.Controller have been merged, + * the "instance" still need to be defined since it might be called from plugins. + * @prop Chart#chart + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ + me.chart = me; + me.controller = me; // chart.chart.controller #inception + + // Add the chart instance to the global namespace + Chart.instances[me.id] = me; + + // Define alias to the config data: `chart.data === chart.config.data` + Object.defineProperty(me, 'data', { + get: function() { + return me.config.data; + }, + set: function(value) { + me.config.data = value; + } + }); + + if (!context || !canvas) { + // The given item is not a compatible context2d element, let's return before finalizing + // the chart initialization but after setting basic chart / controller properties that + // can help to figure out that the chart is not valid (e.g chart.canvas !== null); + // https://github.com/chartjs/Chart.js/issues/2807 + console.error("Failed to create chart: can't acquire context from the given item"); + return; + } + + me.initialize(); + me.update(); + }, + + /** + * @private + */ + initialize: function() { + var me = this; + + // Before init plugin notification + core_plugins.notify(me, 'beforeInit'); + + helpers$1.retinaScale(me, me.options.devicePixelRatio); + + me.bindEvents(); + + if (me.options.responsive) { + // Initial resize before chart draws (must be silent to preserve initial animations). + me.resize(true); + } + + // Make sure scales have IDs and are built before we build any controllers. + me.ensureScalesHaveIDs(); + me.buildOrUpdateScales(); + me.initToolTip(); + + // After init plugin notification + core_plugins.notify(me, 'afterInit'); + + return me; + }, + + clear: function() { + helpers$1.canvas.clear(this); + return this; + }, + + stop: function() { + // Stops any current animation loop occurring + core_animations.cancelAnimation(this); + return this; + }, + + resize: function(silent) { + var me = this; + var options = me.options; + var canvas = me.canvas; + var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; + + // the canvas render width and height will be casted to integers so make sure that + // the canvas display style uses the same integer values to avoid blurring effect. + + // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed + var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas))); + var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas))); + + if (me.width === newWidth && me.height === newHeight) { + return; + } + + canvas.width = me.width = newWidth; + canvas.height = me.height = newHeight; + canvas.style.width = newWidth + 'px'; + canvas.style.height = newHeight + 'px'; + + helpers$1.retinaScale(me, options.devicePixelRatio); + + if (!silent) { + // Notify any plugins about the resize + var newSize = {width: newWidth, height: newHeight}; + core_plugins.notify(me, 'resize', [newSize]); + + // Notify of resize + if (options.onResize) { + options.onResize(me, newSize); + } + + me.stop(); + me.update({ + duration: options.responsiveAnimationDuration + }); + } + }, + + ensureScalesHaveIDs: function() { + var options = this.options; + var scalesOptions = options.scales || {}; + var scaleOptions = options.scale; + + helpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) { + xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); + }); + + helpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) { + yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); + }); + + if (scaleOptions) { + scaleOptions.id = scaleOptions.id || 'scale'; + } + }, + + /** + * Builds a map of scale ID to scale object for future lookup. + */ + buildOrUpdateScales: function() { + var me = this; + var options = me.options; + var scales = me.scales || {}; + var items = []; + var updated = Object.keys(scales).reduce(function(obj, id) { + obj[id] = false; + return obj; + }, {}); + + if (options.scales) { + items = items.concat( + (options.scales.xAxes || []).map(function(xAxisOptions) { + return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; + }), + (options.scales.yAxes || []).map(function(yAxisOptions) { + return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; + }) + ); + } + + if (options.scale) { + items.push({ + options: options.scale, + dtype: 'radialLinear', + isDefault: true, + dposition: 'chartArea' + }); + } + + helpers$1.each(items, function(item) { + var scaleOptions = item.options; + var id = scaleOptions.id; + var scaleType = valueOrDefault$8(scaleOptions.type, item.dtype); + + if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { + scaleOptions.position = item.dposition; + } + + updated[id] = true; + var scale = null; + if (id in scales && scales[id].type === scaleType) { + scale = scales[id]; + scale.options = scaleOptions; + scale.ctx = me.ctx; + scale.chart = me; + } else { + var scaleClass = core_scaleService.getScaleConstructor(scaleType); + if (!scaleClass) { + return; + } + scale = new scaleClass({ + id: id, + type: scaleType, + options: scaleOptions, + ctx: me.ctx, + chart: me + }); + scales[scale.id] = scale; + } + + scale.mergeTicksOptions(); + + // TODO(SB): I think we should be able to remove this custom case (options.scale) + // and consider it as a regular scale part of the "scales"" map only! This would + // make the logic easier and remove some useless? custom code. + if (item.isDefault) { + me.scale = scale; + } + }); + // clear up discarded scales + helpers$1.each(updated, function(hasUpdated, id) { + if (!hasUpdated) { + delete scales[id]; + } + }); + + me.scales = scales; + + core_scaleService.addScalesToLayout(this); + }, + + buildOrUpdateControllers: function() { + var me = this; + var newControllers = []; + + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + var meta = me.getDatasetMeta(datasetIndex); + var type = dataset.type || me.config.type; + + if (meta.type && meta.type !== type) { + me.destroyDatasetMeta(datasetIndex); + meta = me.getDatasetMeta(datasetIndex); + } + meta.type = type; + + if (meta.controller) { + meta.controller.updateIndex(datasetIndex); + meta.controller.linkScales(); + } else { + var ControllerClass = controllers[meta.type]; + if (ControllerClass === undefined) { + throw new Error('"' + meta.type + '" is not a chart type.'); + } + + meta.controller = new ControllerClass(me, datasetIndex); + newControllers.push(meta.controller); + } + }, me); + + return newControllers; + }, + + /** + * Reset the elements of all datasets + * @private + */ + resetElements: function() { + var me = this; + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.reset(); + }, me); + }, + + /** + * Resets the chart back to it's state before the initial animation + */ + reset: function() { + this.resetElements(); + this.tooltip.initialize(); + }, + + update: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + updateConfig(me); + + // plugins options references might have change, let's invalidate the cache + // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + core_plugins._invalidate(me); + + if (core_plugins.notify(me, 'beforeUpdate') === false) { + return; + } + + // In case the entire data object changed + me.tooltip._data = me.data; + + // Make sure dataset controllers are updated and new controllers are reset + var newControllers = me.buildOrUpdateControllers(); + + // Make sure all dataset controllers have correct meta data counts + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); + }, me); + + me.updateLayout(); + + // Can only reset the new controllers after the scales have been updated + if (me.options.animation && me.options.animation.duration) { + helpers$1.each(newControllers, function(controller) { + controller.reset(); + }); + } + + me.updateDatasets(); + + // Need to reset tooltip in case it is displayed with elements that are removed + // after update. + me.tooltip.initialize(); + + // Last active contains items that were previously in the tooltip. + // When we reset the tooltip, we need to clear it + me.lastActive = []; + + // Do this before render so that any plugins that need final scale updates can use it + core_plugins.notify(me, 'afterUpdate'); + + if (me._bufferedRender) { + me._bufferedRequest = { + duration: config.duration, + easing: config.easing, + lazy: config.lazy + }; + } else { + me.render(config); + } + }, + + /** + * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` + * hook, in which case, plugins will not be called on `afterLayout`. + * @private + */ + updateLayout: function() { + var me = this; + + if (core_plugins.notify(me, 'beforeLayout') === false) { + return; + } + + core_layouts.update(this, this.width, this.height); + + /** + * Provided for backward compatibility, use `afterLayout` instead. + * @method IPlugin#afterScaleUpdate + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ + core_plugins.notify(me, 'afterScaleUpdate'); + core_plugins.notify(me, 'afterLayout'); + }, + + /** + * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` + * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. + * @private + */ + updateDatasets: function() { + var me = this; + + if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) { + return; + } + + for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.updateDataset(i); + } + + core_plugins.notify(me, 'afterDatasetsUpdate'); + }, + + /** + * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` + * hook, in which case, plugins will not be called on `afterDatasetUpdate`. + * @private + */ + updateDataset: function(index) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index + }; + + if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { + return; + } + + meta.controller.update(); + + core_plugins.notify(me, 'afterDatasetUpdate', [args]); + }, + + render: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + var animationOptions = me.options.animation; + var duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration); + var lazy = config.lazy; + + if (core_plugins.notify(me, 'beforeRender') === false) { + return; + } + + var onComplete = function(animation) { + core_plugins.notify(me, 'afterRender'); + helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me); + }; + + if (animationOptions && duration) { + var animation = new core_animation({ + numSteps: duration / 16.66, // 60 fps + easing: config.easing || animationOptions.easing, + + render: function(chart, animationObject) { + var easingFunction = helpers$1.easing.effects[animationObject.easing]; + var currentStep = animationObject.currentStep; + var stepDecimal = currentStep / animationObject.numSteps; + + chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); + }, + + onAnimationProgress: animationOptions.onProgress, + onAnimationComplete: onComplete + }); + + core_animations.addAnimation(me, animation, duration, lazy); + } else { + me.draw(); + + // See https://github.com/chartjs/Chart.js/issues/3781 + onComplete(new core_animation({numSteps: 0, chart: me})); + } + + return me; + }, + + draw: function(easingValue) { + var me = this; + + me.clear(); + + if (helpers$1.isNullOrUndef(easingValue)) { + easingValue = 1; + } + + me.transition(easingValue); + + if (me.width <= 0 || me.height <= 0) { + return; + } + + if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) { + return; + } + + // Draw all the scales + helpers$1.each(me.boxes, function(box) { + box.draw(me.chartArea); + }, me); + + me.drawDatasets(easingValue); + me._drawTooltip(easingValue); + + core_plugins.notify(me, 'afterDraw', [easingValue]); + }, + + /** + * @private + */ + transition: function(easingValue) { + var me = this; + + for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { + if (me.isDatasetVisible(i)) { + me.getDatasetMeta(i).controller.transition(easingValue); + } + } + + me.tooltip.transition(easingValue); + }, + + /** + * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` + * hook, in which case, plugins will not be called on `afterDatasetsDraw`. + * @private + */ + drawDatasets: function(easingValue) { + var me = this; + + if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { + return; + } + + // Draw datasets reversed to support proper line stacking + for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { + if (me.isDatasetVisible(i)) { + me.drawDataset(i, easingValue); + } + } + + core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]); + }, + + /** + * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` + * hook, in which case, plugins will not be called on `afterDatasetDraw`. + * @private + */ + drawDataset: function(index, easingValue) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index, + easingValue: easingValue + }; + + if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { + return; + } + + meta.controller.draw(easingValue); + + core_plugins.notify(me, 'afterDatasetDraw', [args]); + }, + + /** + * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` + * hook, in which case, plugins will not be called on `afterTooltipDraw`. + * @private + */ + _drawTooltip: function(easingValue) { + var me = this; + var tooltip = me.tooltip; + var args = { + tooltip: tooltip, + easingValue: easingValue + }; + + if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { + return; + } + + tooltip.draw(); + + core_plugins.notify(me, 'afterTooltipDraw', [args]); + }, + + /** + * Get the single element that was clicked on + * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw + */ + getElementAtEvent: function(e) { + return core_interaction.modes.single(this, e); + }, + + getElementsAtEvent: function(e) { + return core_interaction.modes.label(this, e, {intersect: true}); + }, + + getElementsAtXAxis: function(e) { + return core_interaction.modes['x-axis'](this, e, {intersect: true}); + }, + + getElementsAtEventForMode: function(e, mode, options) { + var method = core_interaction.modes[mode]; + if (typeof method === 'function') { + return method(this, e, options); + } + + return []; + }, + + getDatasetAtEvent: function(e) { + return core_interaction.modes.dataset(this, e, {intersect: true}); + }, + + getDatasetMeta: function(datasetIndex) { + var me = this; + var dataset = me.data.datasets[datasetIndex]; + if (!dataset._meta) { + dataset._meta = {}; + } + + var meta = dataset._meta[me.id]; + if (!meta) { + meta = dataset._meta[me.id] = { + type: null, + data: [], + dataset: null, + controller: null, + hidden: null, // See isDatasetVisible() comment + xAxisID: null, + yAxisID: null + }; + } + + return meta; + }, + + getVisibleDatasetCount: function() { + var count = 0; + for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + if (this.isDatasetVisible(i)) { + count++; + } + } + return count; + }, + + isDatasetVisible: function(datasetIndex) { + var meta = this.getDatasetMeta(datasetIndex); + + // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, + // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. + return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; + }, + + generateLegend: function() { + return this.options.legendCallback(this); + }, + + /** + * @private + */ + destroyDatasetMeta: function(datasetIndex) { + var id = this.id; + var dataset = this.data.datasets[datasetIndex]; + var meta = dataset._meta && dataset._meta[id]; + + if (meta) { + meta.controller.destroy(); + delete dataset._meta[id]; + } + }, + + destroy: function() { + var me = this; + var canvas = me.canvas; + var i, ilen; + + me.stop(); + + // dataset controllers need to cleanup associated data + for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.destroyDatasetMeta(i); + } + + if (canvas) { + me.unbindEvents(); + helpers$1.canvas.clear(me); + platform.releaseContext(me.ctx); + me.canvas = null; + me.ctx = null; + } + + core_plugins.notify(me, 'destroy'); + + delete Chart.instances[me.id]; + }, + + toBase64Image: function() { + return this.canvas.toDataURL.apply(this.canvas, arguments); + }, + + initToolTip: function() { + var me = this; + me.tooltip = new core_tooltip({ + _chart: me, + _chartInstance: me, // deprecated, backward compatibility + _data: me.data, + _options: me.options.tooltips + }, me); + }, + + /** + * @private + */ + bindEvents: function() { + var me = this; + var listeners = me._listeners = {}; + var listener = function() { + me.eventHandler.apply(me, arguments); + }; + + helpers$1.each(me.options.events, function(type) { + platform.addEventListener(me, type, listener); + listeners[type] = listener; + }); + + // Elements used to detect size change should not be injected for non responsive charts. + // See https://github.com/chartjs/Chart.js/issues/2210 + if (me.options.responsive) { + listener = function() { + me.resize(); + }; + + platform.addEventListener(me, 'resize', listener); + listeners.resize = listener; + } + }, + + /** + * @private + */ + unbindEvents: function() { + var me = this; + var listeners = me._listeners; + if (!listeners) { + return; + } + + delete me._listeners; + helpers$1.each(listeners, function(listener, type) { + platform.removeEventListener(me, type, listener); + }); + }, + + updateHoverStyle: function(elements, mode, enabled) { + var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; + var element, i, ilen; + + for (i = 0, ilen = elements.length; i < ilen; ++i) { + element = elements[i]; + if (element) { + this.getDatasetMeta(element._datasetIndex).controller[method](element); + } + } + }, + + /** + * @private + */ + eventHandler: function(e) { + var me = this; + var tooltip = me.tooltip; + + if (core_plugins.notify(me, 'beforeEvent', [e]) === false) { + return; + } + + // Buffer any update calls so that renders do not occur + me._bufferedRender = true; + me._bufferedRequest = null; + + var changed = me.handleEvent(e); + // for smooth tooltip animations issue #4989 + // the tooltip should be the source of change + // Animation check workaround: + // tooltip._start will be null when tooltip isn't animating + if (tooltip) { + changed = tooltip._start + ? tooltip.handleEvent(e) + : changed | tooltip.handleEvent(e); + } + + core_plugins.notify(me, 'afterEvent', [e]); + + var bufferedRequest = me._bufferedRequest; + if (bufferedRequest) { + // If we have an update that was triggered, we need to do a normal render + me.render(bufferedRequest); + } else if (changed && !me.animating) { + // If entering, leaving, or changing elements, animate the change via pivot + me.stop(); + + // We only need to render at this point. Updating will cause scales to be + // recomputed generating flicker & using more memory than necessary. + me.render({ + duration: me.options.hover.animationDuration, + lazy: true + }); + } + + me._bufferedRender = false; + me._bufferedRequest = null; + + return me; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event the event to handle + * @return {boolean} true if the chart needs to re-render + */ + handleEvent: function(e) { + var me = this; + var options = me.options || {}; + var hoverOptions = options.hover; + var changed = false; + + me.lastActive = me.lastActive || []; + + // Find Active Elements for hover and tooltips + if (e.type === 'mouseout') { + me.active = []; + } else { + me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); + } + + // Invoke onHover hook + // Need to call with native event here to not break backwards compatibility + helpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); + + if (e.type === 'mouseup' || e.type === 'click') { + if (options.onClick) { + // Use e.native here for backwards compatibility + options.onClick.call(me, e.native, me.active); + } + } + + // Remove styling for last active (even if it may still be active) + if (me.lastActive.length) { + me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); + } + + // Built in hover styling + if (me.active.length && hoverOptions.mode) { + me.updateHoverStyle(me.active, hoverOptions.mode, true); + } + + changed = !helpers$1.arrayEquals(me.active, me.lastActive); + + // Remember Last Actives + me.lastActive = me.active; + + return changed; + } +}); + +/** + * NOTE(SB) We actually don't use this container anymore but we need to keep it + * for backward compatibility. Though, it can still be useful for plugins that + * would need to work on multiple charts?! + */ +Chart.instances = {}; + +var core_controller = Chart; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart instead. + * @class Chart.Controller + * @deprecated since version 2.6 + * @todo remove at version 3 + * @private + */ +Chart.Controller = Chart; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ +Chart.types = {}; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.configMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +helpers$1.configMerge = mergeConfig; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.scaleMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +helpers$1.scaleMerge = mergeScaleConfig; + +var core_helpers = function() { + + // -- Basic js utility methods + + helpers$1.where = function(collection, filterCallback) { + if (helpers$1.isArray(collection) && Array.prototype.filter) { + return collection.filter(filterCallback); + } + var filtered = []; + + helpers$1.each(collection, function(item) { + if (filterCallback(item)) { + filtered.push(item); + } + }); + + return filtered; + }; + helpers$1.findIndex = Array.prototype.findIndex ? + function(array, callback, scope) { + return array.findIndex(callback, scope); + } : + function(array, callback, scope) { + scope = scope === undefined ? array : scope; + for (var i = 0, ilen = array.length; i < ilen; ++i) { + if (callback.call(scope, array[i], i, array)) { + return i; + } + } + return -1; + }; + helpers$1.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to start of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = -1; + } + for (var i = startIndex + 1; i < arrayToSearch.length; i++) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + helpers$1.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to end of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = arrayToSearch.length; + } + for (var i = startIndex - 1; i >= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + + // -- Math methods + helpers$1.isNumber = function(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }; + helpers$1.almostEquals = function(x, y, epsilon) { + return Math.abs(x - y) < epsilon; + }; + helpers$1.almostWhole = function(x, epsilon) { + var rounded = Math.round(x); + return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); + }; + helpers$1.max = function(array) { + return array.reduce(function(max, value) { + if (!isNaN(value)) { + return Math.max(max, value); + } + return max; + }, Number.NEGATIVE_INFINITY); + }; + helpers$1.min = function(array) { + return array.reduce(function(min, value) { + if (!isNaN(value)) { + return Math.min(min, value); + } + return min; + }, Number.POSITIVE_INFINITY); + }; + helpers$1.sign = Math.sign ? + function(x) { + return Math.sign(x); + } : + function(x) { + x = +x; // convert to a number + if (x === 0 || isNaN(x)) { + return x; + } + return x > 0 ? 1 : -1; + }; + helpers$1.log10 = Math.log10 ? + function(x) { + return Math.log10(x); + } : + function(x) { + var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. + // Check for whole powers of 10, + // which due to floating point rounding error should be corrected. + var powerOf10 = Math.round(exponent); + var isPowerOf10 = x === Math.pow(10, powerOf10); + + return isPowerOf10 ? powerOf10 : exponent; + }; + helpers$1.toRadians = function(degrees) { + return degrees * (Math.PI / 180); + }; + helpers$1.toDegrees = function(radians) { + return radians * (180 / Math.PI); + }; + + /** + * Returns the number of decimal places + * i.e. the number of digits after the decimal point, of the value of this Number. + * @param {number} x - A number. + * @returns {number} The number of decimal places. + * @private + */ + helpers$1._decimalPlaces = function(x) { + if (!helpers$1.isFinite(x)) { + return; + } + var e = 1; + var p = 0; + while (Math.round(x * e) / e !== x) { + e *= 10; + p++; + } + return p; + }; + + // Gets the angle from vertical upright to the point about a centre. + helpers$1.getAngleFromPoint = function(centrePoint, anglePoint) { + var distanceFromXCenter = anglePoint.x - centrePoint.x; + var distanceFromYCenter = anglePoint.y - centrePoint.y; + var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + + var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); + + if (angle < (-0.5 * Math.PI)) { + angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }; + helpers$1.distanceBetweenPoints = function(pt1, pt2) { + return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); + }; + + /** + * Provided for backward compatibility, not available anymore + * @function Chart.helpers.aliasPixel + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ + helpers$1.aliasPixel = function(pixelWidth) { + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }; + + /** + * Returns the aligned pixel value to avoid anti-aliasing blur + * @param {Chart} chart - The chart instance. + * @param {number} pixel - A pixel value. + * @param {number} width - The width of the element. + * @returns {number} The aligned pixel value. + * @private + */ + helpers$1._alignPixel = function(chart, pixel, width) { + var devicePixelRatio = chart.currentDevicePixelRatio; + var halfWidth = width / 2; + return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; + }; + + helpers$1.splineCurve = function(firstPoint, middlePoint, afterPoint, t) { + // Props to Rob Spencer at scaled innovation for his post on splining between points + // http://scaledinnovation.com/analytics/splines/aboutSplines.html + + // This function must also respect "skipped" points + + var previous = firstPoint.skip ? middlePoint : firstPoint; + var current = middlePoint; + var next = afterPoint.skip ? middlePoint : afterPoint; + + var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); + var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); + + var s01 = d01 / (d01 + d12); + var s12 = d12 / (d01 + d12); + + // If all points are the same, s01 & s02 will be inf + s01 = isNaN(s01) ? 0 : s01; + s12 = isNaN(s12) ? 0 : s12; + + var fa = t * s01; // scaling factor for triangle Ta + var fb = t * s12; + + return { + previous: { + x: current.x - fa * (next.x - previous.x), + y: current.y - fa * (next.y - previous.y) + }, + next: { + x: current.x + fb * (next.x - previous.x), + y: current.y + fb * (next.y - previous.y) + } + }; + }; + helpers$1.EPSILON = Number.EPSILON || 1e-14; + helpers$1.splineCurveMonotone = function(points) { + // This function calculates Bézier control points in a similar way than |splineCurve|, + // but preserves monotonicity of the provided data and ensures no local extremums are added + // between the dataset discrete points due to the interpolation. + // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation + + var pointsWithTangents = (points || []).map(function(point) { + return { + model: point._model, + deltaK: 0, + mK: 0 + }; + }); + + // Calculate slopes (deltaK) and initialize tangents (mK) + var pointsLen = pointsWithTangents.length; + var i, pointBefore, pointCurrent, pointAfter; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointAfter && !pointAfter.model.skip) { + var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); + + // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 + pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; + } + + if (!pointBefore || pointBefore.model.skip) { + pointCurrent.mK = pointCurrent.deltaK; + } else if (!pointAfter || pointAfter.model.skip) { + pointCurrent.mK = pointBefore.deltaK; + } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { + pointCurrent.mK = 0; + } else { + pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; + } + } + + // Adjust tangents to ensure monotonic properties + var alphaK, betaK, tauK, squaredMagnitude; + for (i = 0; i < pointsLen - 1; ++i) { + pointCurrent = pointsWithTangents[i]; + pointAfter = pointsWithTangents[i + 1]; + if (pointCurrent.model.skip || pointAfter.model.skip) { + continue; + } + + if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { + pointCurrent.mK = pointAfter.mK = 0; + continue; + } + + alphaK = pointCurrent.mK / pointCurrent.deltaK; + betaK = pointAfter.mK / pointCurrent.deltaK; + squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); + if (squaredMagnitude <= 9) { + continue; + } + + tauK = 3 / Math.sqrt(squaredMagnitude); + pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; + pointAfter.mK = betaK * tauK * pointCurrent.deltaK; + } + + // Compute control points + var deltaX; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointBefore && !pointBefore.model.skip) { + deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; + pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; + pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; + } + if (pointAfter && !pointAfter.model.skip) { + deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; + pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; + pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; + } + } + }; + helpers$1.nextItem = function(collection, index, loop) { + if (loop) { + return index >= collection.length - 1 ? collection[0] : collection[index + 1]; + } + return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; + }; + helpers$1.previousItem = function(collection, index, loop) { + if (loop) { + return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; + } + return index <= 0 ? collection[0] : collection[index - 1]; + }; + // Implementation of the nice number algorithm used in determining where axis labels will go + helpers$1.niceNum = function(range, round) { + var exponent = Math.floor(helpers$1.log10(range)); + var fraction = range / Math.pow(10, exponent); + var niceFraction; + + if (round) { + if (fraction < 1.5) { + niceFraction = 1; + } else if (fraction < 3) { + niceFraction = 2; + } else if (fraction < 7) { + niceFraction = 5; + } else { + niceFraction = 10; + } + } else if (fraction <= 1.0) { + niceFraction = 1; + } else if (fraction <= 2) { + niceFraction = 2; + } else if (fraction <= 5) { + niceFraction = 5; + } else { + niceFraction = 10; + } + + return niceFraction * Math.pow(10, exponent); + }; + // Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + helpers$1.requestAnimFrame = (function() { + if (typeof window === 'undefined') { + return function(callback) { + callback(); + }; + } + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + }()); + // -- DOM methods + helpers$1.getRelativePosition = function(evt, chart) { + var mouseX, mouseY; + var e = evt.originalEvent || evt; + var canvas = evt.target || evt.srcElement; + var boundingRect = canvas.getBoundingClientRect(); + + var touches = e.touches; + if (touches && touches.length > 0) { + mouseX = touches[0].clientX; + mouseY = touches[0].clientY; + + } else { + mouseX = e.clientX; + mouseY = e.clientY; + } + + // Scale mouse coordinates into canvas coordinates + // by following the pattern laid out by 'jerryj' in the comments of + // https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ + var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left')); + var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top')); + var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right')); + var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom')); + var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; + var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; + + // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However + // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here + mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); + mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); + + return { + x: mouseX, + y: mouseY + }; + + }; + + // Private helper function to convert max-width/max-height values that may be percentages into a number + function parseMaxStyle(styleValue, node, parentProperty) { + var valueInPixels; + if (typeof styleValue === 'string') { + valueInPixels = parseInt(styleValue, 10); + + if (styleValue.indexOf('%') !== -1) { + // percentage * size in dimension + valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; + } + } else { + valueInPixels = styleValue; + } + + return valueInPixels; + } + + /** + * Returns if the given value contains an effective constraint. + * @private + */ + function isConstrainedValue(value) { + return value !== undefined && value !== null && value !== 'none'; + } + + /** + * Returns the max width or height of the given DOM node in a cross-browser compatible fashion + * @param {HTMLElement} domNode - the node to check the constraint on + * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height') + * @param {string} percentageProperty - property of parent to use when calculating width as a percentage + * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser} + */ + function getConstraintDimension(domNode, maxStyle, percentageProperty) { + var view = document.defaultView; + var parentNode = helpers$1._getParentNode(domNode); + var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; + var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; + var hasCNode = isConstrainedValue(constrainedNode); + var hasCContainer = isConstrainedValue(constrainedContainer); + var infinity = Number.POSITIVE_INFINITY; + + if (hasCNode || hasCContainer) { + return Math.min( + hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, + hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); + } + + return 'none'; + } + // returns Number or undefined if no constraint + helpers$1.getConstraintWidth = function(domNode) { + return getConstraintDimension(domNode, 'max-width', 'clientWidth'); + }; + // returns Number or undefined if no constraint + helpers$1.getConstraintHeight = function(domNode) { + return getConstraintDimension(domNode, 'max-height', 'clientHeight'); + }; + /** + * @private + */ + helpers$1._calculatePadding = function(container, padding, parentDimension) { + padding = helpers$1.getStyle(container, padding); + + return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10); + }; + /** + * @private + */ + helpers$1._getParentNode = function(domNode) { + var parent = domNode.parentNode; + if (parent && parent.toString() === '[object ShadowRoot]') { + parent = parent.host; + } + return parent; + }; + helpers$1.getMaximumWidth = function(domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientWidth; + } + + var clientWidth = container.clientWidth; + var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth); + var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth); + + var w = clientWidth - paddingLeft - paddingRight; + var cw = helpers$1.getConstraintWidth(domNode); + return isNaN(cw) ? w : Math.min(w, cw); + }; + helpers$1.getMaximumHeight = function(domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientHeight; + } + + var clientHeight = container.clientHeight; + var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight); + var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight); + + var h = clientHeight - paddingTop - paddingBottom; + var ch = helpers$1.getConstraintHeight(domNode); + return isNaN(ch) ? h : Math.min(h, ch); + }; + helpers$1.getStyle = function(el, property) { + return el.currentStyle ? + el.currentStyle[property] : + document.defaultView.getComputedStyle(el, null).getPropertyValue(property); + }; + helpers$1.retinaScale = function(chart, forceRatio) { + var pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && window.devicePixelRatio) || 1; + if (pixelRatio === 1) { + return; + } + + var canvas = chart.canvas; + var height = chart.height; + var width = chart.width; + + canvas.height = height * pixelRatio; + canvas.width = width * pixelRatio; + chart.ctx.scale(pixelRatio, pixelRatio); + + // If no style has been set on the canvas, the render size is used as display size, + // making the chart visually bigger, so let's enforce it to the "correct" values. + // See https://github.com/chartjs/Chart.js/issues/3575 + if (!canvas.style.height && !canvas.style.width) { + canvas.style.height = height + 'px'; + canvas.style.width = width + 'px'; + } + }; + // -- Canvas methods + helpers$1.fontString = function(pixelSize, fontStyle, fontFamily) { + return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; + }; + helpers$1.longestText = function(ctx, font, arrayOfThings, cache) { + cache = cache || {}; + var data = cache.data = cache.data || {}; + var gc = cache.garbageCollect = cache.garbageCollect || []; + + if (cache.font !== font) { + data = cache.data = {}; + gc = cache.garbageCollect = []; + cache.font = font; + } + + ctx.font = font; + var longest = 0; + helpers$1.each(arrayOfThings, function(thing) { + // Undefined strings and arrays should not be measured + if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) { + longest = helpers$1.measureText(ctx, data, gc, longest, thing); + } else if (helpers$1.isArray(thing)) { + // if it is an array lets measure each element + // to do maybe simplify this function a bit so we can do this more recursively? + helpers$1.each(thing, function(nestedThing) { + // Undefined strings and arrays should not be measured + if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) { + longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing); + } + }); + } + }); + + var gcLen = gc.length / 2; + if (gcLen > arrayOfThings.length) { + for (var i = 0; i < gcLen; i++) { + delete data[gc[i]]; + } + gc.splice(0, gcLen); + } + return longest; + }; + helpers$1.measureText = function(ctx, data, gc, longest, string) { + var textWidth = data[string]; + if (!textWidth) { + textWidth = data[string] = ctx.measureText(string).width; + gc.push(string); + } + if (textWidth > longest) { + longest = textWidth; + } + return longest; + }; + helpers$1.numberOfLabelLines = function(arrayOfThings) { + var numberOfLines = 1; + helpers$1.each(arrayOfThings, function(thing) { + if (helpers$1.isArray(thing)) { + if (thing.length > numberOfLines) { + numberOfLines = thing.length; + } + } + }); + return numberOfLines; + }; + + helpers$1.color = !chartjsColor ? + function(value) { + console.error('Color.js not found!'); + return value; + } : + function(value) { + /* global CanvasGradient */ + if (value instanceof CanvasGradient) { + value = core_defaults.global.defaultColor; + } + + return chartjsColor(value); + }; + + helpers$1.getHoverColor = function(colorValue) { + /* global CanvasPattern */ + return (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ? + colorValue : + helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString(); + }; +}; + +function abstract() { + throw new Error( + 'This method is not implemented: either no adapter can ' + + 'be found or an incomplete integration was provided.' + ); +} + +/** + * Date adapter (current used by the time scale) + * @namespace Chart._adapters._date + * @memberof Chart._adapters + * @private + */ + +/** + * Currently supported unit string values. + * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')} + * @memberof Chart._adapters._date + * @name Unit + */ + +/** + * @class + */ +function DateAdapter(options) { + this.options = options || {}; +} + +helpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */ { + /** + * Returns a map of time formats for the supported formatting units defined + * in Unit as well as 'datetime' representing a detailed date/time string. + * @returns {{string: string}} + */ + formats: abstract, + + /** + * Parses the given `value` and return the associated timestamp. + * @param {any} value - the value to parse (usually comes from the data) + * @param {string} [format] - the expected data format + * @returns {(number|null)} + * @function + */ + parse: abstract, + + /** + * Returns the formatted date in the specified `format` for a given `timestamp`. + * @param {number} timestamp - the timestamp to format + * @param {string} format - the date/time token + * @return {string} + * @function + */ + format: abstract, + + /** + * Adds the specified `amount` of `unit` to the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {number} amount - the amount to add + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + add: abstract, + + /** + * Returns the number of `unit` between the given timestamps. + * @param {number} max - the input timestamp (reference) + * @param {number} min - the timestamp to substract + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + diff: abstract, + + /** + * Returns start of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @param {number} [weekday] - the ISO day of the week with 1 being Monday + * and 7 being Sunday (only needed if param *unit* is `isoWeek`). + * @function + */ + startOf: abstract, + + /** + * Returns end of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @function + */ + endOf: abstract, + + // DEPRECATIONS + + /** + * Provided for backward compatibility for scale.getValueForPixel(), + * this method should be overridden only by the moment adapter. + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function(value) { + return value; + } +}); + +DateAdapter.override = function(members) { + helpers$1.extend(DateAdapter.prototype, members); +}; + +var _date = DateAdapter; + +var core_adapters = { + _date: _date +}; + +/** + * Namespace to hold static tick generation functions + * @namespace Chart.Ticks + */ +var core_ticks = { + /** + * Namespace to hold formatters for different types of ticks + * @namespace Chart.Ticks.formatters + */ + formatters: { + /** + * Formatter for value labels + * @method Chart.Ticks.formatters.values + * @param value the value to display + * @return {string|string[]} the label to display + */ + values: function(value) { + return helpers$1.isArray(value) ? value : '' + value; + }, + + /** + * Formatter for linear numeric ticks + * @method Chart.Ticks.formatters.linear + * @param tickValue {number} the value to be formatted + * @param index {number} the position of the tickValue parameter in the ticks array + * @param ticks {number[]} the list of ticks being converted + * @return {string} string representation of the tickValue parameter + */ + linear: function(tickValue, index, ticks) { + // If we have lots of ticks, don't use the ones + var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; + + // If we have a number like 2.5 as the delta, figure out how many decimal places we need + if (Math.abs(delta) > 1) { + if (tickValue !== Math.floor(tickValue)) { + // not an integer + delta = tickValue - Math.floor(tickValue); + } + } + + var logDelta = helpers$1.log10(Math.abs(delta)); + var tickString = ''; + + if (tickValue !== 0) { + var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1])); + if (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation + var logTick = helpers$1.log10(Math.abs(tickValue)); + tickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta)); + } else { + var numDecimal = -1 * Math.floor(logDelta); + numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places + tickString = tickValue.toFixed(numDecimal); + } + } else { + tickString = '0'; // never show decimal places for 0 + } + + return tickString; + }, + + logarithmic: function(tickValue, index, ticks) { + var remain = tickValue / (Math.pow(10, Math.floor(helpers$1.log10(tickValue)))); + + if (tickValue === 0) { + return '0'; + } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { + return tickValue.toExponential(); + } + return ''; + } + } +}; + +var valueOrDefault$9 = helpers$1.valueOrDefault; +var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault; + +core_defaults._set('scale', { + display: true, + position: 'left', + offset: false, + + // grid line settings + gridLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + drawBorder: true, + drawOnChartArea: true, + drawTicks: true, + tickMarkLength: 10, + zeroLineWidth: 1, + zeroLineColor: 'rgba(0,0,0,0.25)', + zeroLineBorderDash: [], + zeroLineBorderDashOffset: 0.0, + offsetGridLines: false, + borderDash: [], + borderDashOffset: 0.0 + }, + + // scale label + scaleLabel: { + // display property + display: false, + + // actual label + labelString: '', + + // top/bottom padding + padding: { + top: 4, + bottom: 4 + } + }, + + // label settings + ticks: { + beginAtZero: false, + minRotation: 0, + maxRotation: 50, + mirror: false, + padding: 0, + reverse: false, + display: true, + autoSkip: true, + autoSkipPadding: 0, + labelOffset: 0, + // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. + callback: core_ticks.formatters.values, + minor: {}, + major: {} + } +}); + +function labelsFromTicks(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(ticks[i].label); + } + + return labels; +} + +function getPixelForGridLine(scale, index, offsetGridLines) { + var lineValue = scale.getPixelForTick(index); + + if (offsetGridLines) { + if (scale.getTicks().length === 1) { + lineValue -= scale.isHorizontal() ? + Math.max(lineValue - scale.left, scale.right - lineValue) : + Math.max(lineValue - scale.top, scale.bottom - lineValue); + } else if (index === 0) { + lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; + } else { + lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; + } + } + return lineValue; +} + +function computeTextSize(context, tick, font) { + return helpers$1.isArray(tick) ? + helpers$1.longestText(context, font, tick) : + context.measureText(tick).width; +} + +var core_scale = core_element.extend({ + /** + * Get the padding needed for the scale + * @method getPadding + * @private + * @returns {Padding} the necessary padding + */ + getPadding: function() { + var me = this; + return { + left: me.paddingLeft || 0, + top: me.paddingTop || 0, + right: me.paddingRight || 0, + bottom: me.paddingBottom || 0 + }; + }, + + /** + * Returns the scale tick objects ({label, major}) + * @since 2.7 + */ + getTicks: function() { + return this._ticks; + }, + + // These methods are ordered by lifecyle. Utilities then follow. + // Any function defined here is inherited by all scale types. + // Any function can be extended by the scale type + + mergeTicksOptions: function() { + var ticks = this.options.ticks; + if (ticks.minor === false) { + ticks.minor = { + display: false + }; + } + if (ticks.major === false) { + ticks.major = { + display: false + }; + } + for (var key in ticks) { + if (key !== 'major' && key !== 'minor') { + if (typeof ticks.minor[key] === 'undefined') { + ticks.minor[key] = ticks[key]; + } + if (typeof ticks.major[key] === 'undefined') { + ticks.major[key] = ticks[key]; + } + } + } + }, + beforeUpdate: function() { + helpers$1.callback(this.options.beforeUpdate, [this]); + }, + + update: function(maxWidth, maxHeight, margins) { + var me = this; + var i, ilen, labels, label, ticks, tick; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = helpers$1.extend({ + left: 0, + right: 0, + top: 0, + bottom: 0 + }, margins); + + me._maxLabelLines = 0; + me.longestLabelWidth = 0; + me.longestTextCache = me.longestTextCache || {}; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + + // Data min/max + me.beforeDataLimits(); + me.determineDataLimits(); + me.afterDataLimits(); + + // Ticks - `this.ticks` is now DEPRECATED! + // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member + // and must not be accessed directly from outside this class. `this.ticks` being + // around for long time and not marked as private, we can't change its structure + // without unexpected breaking changes. If you need to access the scale ticks, + // use scale.getTicks() instead. + + me.beforeBuildTicks(); + + // New implementations should return an array of objects but for BACKWARD COMPAT, + // we still support no return (`this.ticks` internally set by calling this method). + ticks = me.buildTicks() || []; + + // Allow modification of ticks in callback. + ticks = me.afterBuildTicks(ticks) || ticks; + + me.beforeTickToLabelConversion(); + + // New implementations should return the formatted tick labels but for BACKWARD + // COMPAT, we still support no return (`this.ticks` internally changed by calling + // this method and supposed to contain only string values). + labels = me.convertTicksToLabels(ticks) || me.ticks; + + me.afterTickToLabelConversion(); + + me.ticks = labels; // BACKWARD COMPATIBILITY + + // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! + + // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) + for (i = 0, ilen = labels.length; i < ilen; ++i) { + label = labels[i]; + tick = ticks[i]; + if (!tick) { + ticks.push(tick = { + label: label, + major: false + }); + } else { + tick.label = label; + } + } + + me._ticks = ticks; + + // Tick Rotation + me.beforeCalculateTickRotation(); + me.calculateTickRotation(); + me.afterCalculateTickRotation(); + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: function() { + helpers$1.callback(this.options.afterUpdate, [this]); + }, + + // + + beforeSetDimensions: function() { + helpers$1.callback(this.options.beforeSetDimensions, [this]); + }, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + }, + afterSetDimensions: function() { + helpers$1.callback(this.options.afterSetDimensions, [this]); + }, + + // Data limits + beforeDataLimits: function() { + helpers$1.callback(this.options.beforeDataLimits, [this]); + }, + determineDataLimits: helpers$1.noop, + afterDataLimits: function() { + helpers$1.callback(this.options.afterDataLimits, [this]); + }, + + // + beforeBuildTicks: function() { + helpers$1.callback(this.options.beforeBuildTicks, [this]); + }, + buildTicks: helpers$1.noop, + afterBuildTicks: function(ticks) { + var me = this; + // ticks is empty for old axis implementations here + if (helpers$1.isArray(ticks) && ticks.length) { + return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]); + } + // Support old implementations (that modified `this.ticks` directly in buildTicks) + me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks; + return ticks; + }, + + beforeTickToLabelConversion: function() { + helpers$1.callback(this.options.beforeTickToLabelConversion, [this]); + }, + convertTicksToLabels: function() { + var me = this; + // Convert ticks to strings + var tickOpts = me.options.ticks; + me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); + }, + afterTickToLabelConversion: function() { + helpers$1.callback(this.options.afterTickToLabelConversion, [this]); + }, + + // + + beforeCalculateTickRotation: function() { + helpers$1.callback(this.options.beforeCalculateTickRotation, [this]); + }, + calculateTickRotation: function() { + var me = this; + var context = me.ctx; + var tickOpts = me.options.ticks; + var labels = labelsFromTicks(me._ticks); + + // Get the width of each grid by calculating the difference + // between x offsets between 0 and 1. + var tickFont = helpers$1.options._parseFont(tickOpts); + context.font = tickFont.string; + + var labelRotation = tickOpts.minRotation || 0; + + if (labels.length && me.options.display && me.isHorizontal()) { + var originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache); + var labelWidth = originalLabelWidth; + var cosRotation, sinRotation; + + // Allow 3 pixels x2 padding either side for label readability + var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; + + // Max label rotation can be set or default to 90 - also act as a loop counter + while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { + var angleRadians = helpers$1.toRadians(labelRotation); + cosRotation = Math.cos(angleRadians); + sinRotation = Math.sin(angleRadians); + + if (sinRotation * originalLabelWidth > me.maxHeight) { + // go back one step + labelRotation--; + break; + } + + labelRotation++; + labelWidth = cosRotation * originalLabelWidth; + } + } + + me.labelRotation = labelRotation; + }, + afterCalculateTickRotation: function() { + helpers$1.callback(this.options.afterCalculateTickRotation, [this]); + }, + + // + + beforeFit: function() { + helpers$1.callback(this.options.beforeFit, [this]); + }, + fit: function() { + var me = this; + // Reset + var minSize = me.minSize = { + width: 0, + height: 0 + }; + + var labels = labelsFromTicks(me._ticks); + + var opts = me.options; + var tickOpts = opts.ticks; + var scaleLabelOpts = opts.scaleLabel; + var gridLineOpts = opts.gridLines; + var display = me._isVisible(); + var position = opts.position; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var tickFont = parseFont(tickOpts); + var tickMarkLength = opts.gridLines.tickMarkLength; + + // Width + if (isHorizontal) { + // subtract the margins to line up with the chartArea if we are a full width scale + minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; + } else { + minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } + + // height + if (isHorizontal) { + minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } else { + minSize.height = me.maxHeight; // fill all the height + } + + // Are we showing a title for the scale? + if (scaleLabelOpts.display && display) { + var scaleLabelFont = parseFont(scaleLabelOpts); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding); + var deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height; + + if (isHorizontal) { + minSize.height += deltaHeight; + } else { + minSize.width += deltaHeight; + } + } + + // Don't bother fitting the ticks if we are not showing the labels + if (tickOpts.display && display) { + var largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache); + var tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels); + var lineSpace = tickFont.size * 0.5; + var tickPadding = me.options.ticks.padding; + + // Store max number of lines and widest label for _autoSkip + me._maxLabelLines = tallestLabelHeightInLines; + me.longestLabelWidth = largestTextWidth; + + if (isHorizontal) { + var angleRadians = helpers$1.toRadians(me.labelRotation); + var cosRotation = Math.cos(angleRadians); + var sinRotation = Math.sin(angleRadians); + + // TODO - improve this calculation + var labelHeight = (sinRotation * largestTextWidth) + + (tickFont.lineHeight * tallestLabelHeightInLines) + + lineSpace; // padding + + minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); + + me.ctx.font = tickFont.string; + var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string); + var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string); + var offsetLeft = me.getPixelForTick(0) - me.left; + var offsetRight = me.right - me.getPixelForTick(labels.length - 1); + var paddingLeft, paddingRight; + + // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned + // which means that the right padding is dominated by the font height + if (me.labelRotation !== 0) { + paddingLeft = position === 'bottom' ? (cosRotation * firstLabelWidth) : (cosRotation * lineSpace); + paddingRight = position === 'bottom' ? (cosRotation * lineSpace) : (cosRotation * lastLabelWidth); + } else { + paddingLeft = firstLabelWidth / 2; + paddingRight = lastLabelWidth / 2; + } + me.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges + me.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3; + } else { + // A vertical axis is more constrained by the width. Labels are the + // dominant factor here, so get that length first and account for padding + if (tickOpts.mirror) { + largestTextWidth = 0; + } else { + // use lineSpace for consistency with horizontal axis + // tickPadding is not implemented for horizontal + largestTextWidth += tickPadding + lineSpace; + } + + minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); + + me.paddingTop = tickFont.size / 2; + me.paddingBottom = tickFont.size / 2; + } + } + + me.handleMargins(); + + me.width = minSize.width; + me.height = minSize.height; + }, + + /** + * Handle margins and padding interactions + * @private + */ + handleMargins: function() { + var me = this; + if (me.margins) { + me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); + me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); + me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); + me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); + } + }, + + afterFit: function() { + helpers$1.callback(this.options.afterFit, [this]); + }, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + isFullWidth: function() { + return (this.options.fullWidth); + }, + + // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not + getRightValue: function(rawValue) { + // Null and undefined values first + if (helpers$1.isNullOrUndef(rawValue)) { + return NaN; + } + // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values + if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) { + return NaN; + } + // If it is in fact an object, dive in one more level + if (rawValue) { + if (this.isHorizontal()) { + if (rawValue.x !== undefined) { + return this.getRightValue(rawValue.x); + } + } else if (rawValue.y !== undefined) { + return this.getRightValue(rawValue.y); + } + } + + // Value is good, return it + return rawValue; + }, + + /** + * Used to get the value to display in the tooltip for the data at the given index + * @param index + * @param datasetIndex + */ + getLabelForIndex: helpers$1.noop, + + /** + * Returns the location of the given data point. Value can either be an index or a numerical value + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param value + * @param index + * @param datasetIndex + */ + getPixelForValue: helpers$1.noop, + + /** + * Used to get the data value from a given pixel. This is the inverse of getPixelForValue + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param pixel + */ + getValueForPixel: helpers$1.noop, + + /** + * Returns the location of the tick at the given index + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForTick: function(index) { + var me = this; + var offset = me.options.offset; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var pixel = (tickWidth * index) + me.paddingLeft; + + if (offset) { + pixel += tickWidth / 2; + } + + var finalVal = me.left + pixel; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + var innerHeight = me.height - (me.paddingTop + me.paddingBottom); + return me.top + (index * (innerHeight / (me._ticks.length - 1))); + }, + + /** + * Utility for getting the pixel location of a percentage of scale + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForDecimal: function(decimal) { + var me = this; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var valueOffset = (innerWidth * decimal) + me.paddingLeft; + + var finalVal = me.left + valueOffset; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + return me.top + (decimal * me.height); + }, + + /** + * Returns the pixel for the minimum chart value + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getBasePixel: function() { + return this.getPixelForValue(this.getBaseValue()); + }, + + getBaseValue: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0; + }, + + /** + * Returns a subset of ticks to be plotted to avoid overlapping labels. + * @private + */ + _autoSkip: function(ticks) { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + var tickCount = ticks.length; + var skipRatio = false; + var maxTicks = optionTicks.maxTicksLimit; + + // Total space needed to display all ticks. First and last ticks are + // drawn as their center at end of axis, so tickCount-1 + var ticksLength = me._tickSize() * (tickCount - 1); + + // Axis length + var axisLength = isHorizontal + ? me.width - (me.paddingLeft + me.paddingRight) + : me.height - (me.paddingTop + me.PaddingBottom); + + var result = []; + var i, tick; + + if (ticksLength > axisLength) { + skipRatio = 1 + Math.floor(ticksLength / axisLength); + } + + // if they defined a max number of optionTicks, + // increase skipRatio until that number is met + if (tickCount > maxTicks) { + skipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks)); + } + + for (i = 0; i < tickCount; i++) { + tick = ticks[i]; + + if (skipRatio > 1 && i % skipRatio > 0) { + // leave tick in place but make sure it's not displayed (#4635) + delete tick.label; + } + result.push(tick); + } + return result; + }, + + /** + * @private + */ + _tickSize: function() { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + + // Calculate space needed by label in axis direction. + var rot = helpers$1.toRadians(me.labelRotation); + var cos = Math.abs(Math.cos(rot)); + var sin = Math.abs(Math.sin(rot)); + + var padding = optionTicks.autoSkipPadding || 0; + var w = (me.longestLabelWidth + padding) || 0; + + var tickFont = helpers$1.options._parseFont(optionTicks); + var h = (me._maxLabelLines * tickFont.lineHeight + padding) || 0; + + // Calculate space needed for 1 tick in axis direction. + return isHorizontal + ? h * cos > w * sin ? w / cos : h / sin + : h * sin < w * cos ? h / cos : w / sin; + }, + + /** + * @private + */ + _isVisible: function() { + var me = this; + var chart = me.chart; + var display = me.options.display; + var i, ilen, meta; + + if (display !== 'auto') { + return !!display; + } + + // When 'auto', the scale is visible if at least one associated dataset is visible. + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + if (meta.xAxisID === me.id || meta.yAxisID === me.id) { + return true; + } + } + } + + return false; + }, + + /** + * Actually draw the scale on the canvas + * @param {object} chartArea - the area of the chart to draw full grid lines on + */ + draw: function(chartArea) { + var me = this; + var options = me.options; + + if (!me._isVisible()) { + return; + } + + var chart = me.chart; + var context = me.ctx; + var globalDefaults = core_defaults.global; + var defaultFontColor = globalDefaults.defaultFontColor; + var optionTicks = options.ticks.minor; + var optionMajorTicks = options.ticks.major || optionTicks; + var gridLines = options.gridLines; + var scaleLabel = options.scaleLabel; + var position = options.position; + + var isRotated = me.labelRotation !== 0; + var isMirrored = optionTicks.mirror; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); + var tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor); + var tickFont = parseFont(optionTicks); + var lineHeight = tickFont.lineHeight; + var majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor); + var majorTickFont = parseFont(optionMajorTicks); + var tickPadding = optionTicks.padding; + var labelOffset = optionTicks.labelOffset; + + var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; + + var scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor); + var scaleLabelFont = parseFont(scaleLabel); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding); + var labelRotationRadians = helpers$1.toRadians(me.labelRotation); + + var itemsToDraw = []; + + var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0; + var alignPixel = helpers$1._alignPixel; + var borderValue, tickStart, tickEnd; + + if (position === 'top') { + borderValue = alignPixel(chart, me.bottom, axisWidth); + tickStart = me.bottom - tl; + tickEnd = borderValue - axisWidth / 2; + } else if (position === 'bottom') { + borderValue = alignPixel(chart, me.top, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.top + tl; + } else if (position === 'left') { + borderValue = alignPixel(chart, me.right, axisWidth); + tickStart = me.right - tl; + tickEnd = borderValue - axisWidth / 2; + } else { + borderValue = alignPixel(chart, me.left, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.left + tl; + } + + var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error. + + helpers$1.each(ticks, function(tick, index) { + // autoskipper skipped this tick (#4635) + if (helpers$1.isNullOrUndef(tick.label)) { + return; + } + + var label = tick.label; + var lineWidth, lineColor, borderDash, borderDashOffset; + if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { + // Draw the first index specially + lineWidth = gridLines.zeroLineWidth; + lineColor = gridLines.zeroLineColor; + borderDash = gridLines.zeroLineBorderDash || []; + borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0; + } else { + lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index); + lineColor = valueAtIndexOrDefault(gridLines.color, index); + borderDash = gridLines.borderDash || []; + borderDashOffset = gridLines.borderDashOffset || 0.0; + } + + // Common properties + var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign; + var labelCount = helpers$1.isArray(label) ? label.length : 1; + var lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines); + + if (isHorizontal) { + var labelYOffset = tl + tickPadding; + + if (lineValue < me.left - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth); + ty1 = tickStart; + ty2 = tickEnd; + labelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option) + + if (position === 'top') { + y1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2; + y2 = chartArea.bottom; + textOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight; + textAlign = !isRotated ? 'center' : 'left'; + labelY = me.bottom - labelYOffset; + } else { + y1 = chartArea.top; + y2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2; + textOffset = (!isRotated ? 0.5 : 0) * lineHeight; + textAlign = !isRotated ? 'center' : 'right'; + labelY = me.top + labelYOffset; + } + } else { + var labelXOffset = (isMirrored ? 0 : tl) + tickPadding; + + if (lineValue < me.top - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tickStart; + tx2 = tickEnd; + ty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth); + labelY = me.getPixelForTick(index) + labelOffset; + textOffset = (1 - labelCount) * lineHeight / 2; + + if (position === 'left') { + x1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2; + x2 = chartArea.right; + textAlign = isMirrored ? 'left' : 'right'; + labelX = me.right - labelXOffset; + } else { + x1 = chartArea.left; + x2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2; + textAlign = isMirrored ? 'right' : 'left'; + labelX = me.left + labelXOffset; + } + } + + itemsToDraw.push({ + tx1: tx1, + ty1: ty1, + tx2: tx2, + ty2: ty2, + x1: x1, + y1: y1, + x2: x2, + y2: y2, + labelX: labelX, + labelY: labelY, + glWidth: lineWidth, + glColor: lineColor, + glBorderDash: borderDash, + glBorderDashOffset: borderDashOffset, + rotation: -1 * labelRotationRadians, + label: label, + major: tick.major, + textOffset: textOffset, + textAlign: textAlign + }); + }); + + // Draw all of the tick labels, tick marks, and grid lines at the correct places + helpers$1.each(itemsToDraw, function(itemToDraw) { + var glWidth = itemToDraw.glWidth; + var glColor = itemToDraw.glColor; + + if (gridLines.display && glWidth && glColor) { + context.save(); + context.lineWidth = glWidth; + context.strokeStyle = glColor; + if (context.setLineDash) { + context.setLineDash(itemToDraw.glBorderDash); + context.lineDashOffset = itemToDraw.glBorderDashOffset; + } + + context.beginPath(); + + if (gridLines.drawTicks) { + context.moveTo(itemToDraw.tx1, itemToDraw.ty1); + context.lineTo(itemToDraw.tx2, itemToDraw.ty2); + } + + if (gridLines.drawOnChartArea) { + context.moveTo(itemToDraw.x1, itemToDraw.y1); + context.lineTo(itemToDraw.x2, itemToDraw.y2); + } + + context.stroke(); + context.restore(); + } + + if (optionTicks.display) { + // Make sure we draw text in the correct color and font + context.save(); + context.translate(itemToDraw.labelX, itemToDraw.labelY); + context.rotate(itemToDraw.rotation); + context.font = itemToDraw.major ? majorTickFont.string : tickFont.string; + context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; + context.textBaseline = 'middle'; + context.textAlign = itemToDraw.textAlign; + + var label = itemToDraw.label; + var y = itemToDraw.textOffset; + if (helpers$1.isArray(label)) { + for (var i = 0; i < label.length; ++i) { + // We just make sure the multiline element is a string here.. + context.fillText('' + label[i], 0, y); + y += lineHeight; + } + } else { + context.fillText(label, 0, y); + } + context.restore(); + } + }); + + if (scaleLabel.display) { + // Draw the scale label + var scaleLabelX; + var scaleLabelY; + var rotation = 0; + var halfLineHeight = scaleLabelFont.lineHeight / 2; + + if (isHorizontal) { + scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width + scaleLabelY = position === 'bottom' + ? me.bottom - halfLineHeight - scaleLabelPadding.bottom + : me.top + halfLineHeight + scaleLabelPadding.top; + } else { + var isLeft = position === 'left'; + scaleLabelX = isLeft + ? me.left + halfLineHeight + scaleLabelPadding.top + : me.right - halfLineHeight - scaleLabelPadding.top; + scaleLabelY = me.top + ((me.bottom - me.top) / 2); + rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; + } + + context.save(); + context.translate(scaleLabelX, scaleLabelY); + context.rotate(rotation); + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.fillStyle = scaleLabelFontColor; // render in correct colour + context.font = scaleLabelFont.string; + context.fillText(scaleLabel.labelString, 0, 0); + context.restore(); + } + + if (axisWidth) { + // Draw the line at the edge of the axis + var firstLineWidth = axisWidth; + var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0); + var x1, x2, y1, y2; + + if (isHorizontal) { + x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2; + x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2; + y1 = y2 = borderValue; + } else { + y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2; + y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2; + x1 = x2 = borderValue; + } + + context.lineWidth = axisWidth; + context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0); + context.beginPath(); + context.moveTo(x1, y1); + context.lineTo(x2, y2); + context.stroke(); + } + } +}); + +var defaultConfig = { + position: 'bottom' +}; + +var scale_category = core_scale.extend({ + /** + * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those + * else fall back to data.labels + * @private + */ + getLabels: function() { + var data = this.chart.data; + return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; + }, + + determineDataLimits: function() { + var me = this; + var labels = me.getLabels(); + me.minIndex = 0; + me.maxIndex = labels.length - 1; + var findIndex; + + if (me.options.ticks.min !== undefined) { + // user specified min value + findIndex = labels.indexOf(me.options.ticks.min); + me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; + } + + if (me.options.ticks.max !== undefined) { + // user specified max value + findIndex = labels.indexOf(me.options.ticks.max); + me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; + } + + me.min = labels[me.minIndex]; + me.max = labels[me.maxIndex]; + }, + + buildTicks: function() { + var me = this; + var labels = me.getLabels(); + // If we are viewing some subset of labels, slice the original array + me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var chart = me.chart; + + if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) { + return me.getRightValue(chart.data.datasets[datasetIndex].data[index]); + } + + return me.ticks[index - me.minIndex]; + }, + + // Used to get data value locations. Value can either be an index or a numerical value + getPixelForValue: function(value, index) { + var me = this; + var offset = me.options.offset; + // 1 is added because we need the length but we have the indexes + var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); + + // If value is a data object, then index is the index in the data array, + // not the index of the scale. We need to change that. + var valueCategory; + if (value !== undefined && value !== null) { + valueCategory = me.isHorizontal() ? value.x : value.y; + } + if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { + var labels = me.getLabels(); + value = valueCategory || value; + var idx = labels.indexOf(value); + index = idx !== -1 ? idx : index; + } + + if (me.isHorizontal()) { + var valueWidth = me.width / offsetAmt; + var widthOffset = (valueWidth * (index - me.minIndex)); + + if (offset) { + widthOffset += (valueWidth / 2); + } + + return me.left + widthOffset; + } + var valueHeight = me.height / offsetAmt; + var heightOffset = (valueHeight * (index - me.minIndex)); + + if (offset) { + heightOffset += (valueHeight / 2); + } + + return me.top + heightOffset; + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); + }, + + getValueForPixel: function(pixel) { + var me = this; + var offset = me.options.offset; + var value; + var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var horz = me.isHorizontal(); + var valueDimension = (horz ? me.width : me.height) / offsetAmt; + + pixel -= horz ? me.left : me.top; + + if (offset) { + pixel -= (valueDimension / 2); + } + + if (pixel <= 0) { + value = 0; + } else { + value = Math.round(pixel / valueDimension); + } + + return value + me.minIndex; + }, + + getBasePixel: function() { + return this.bottom; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults = defaultConfig; +scale_category._defaults = _defaults; + +var noop = helpers$1.noop; +var isNullOrUndef = helpers$1.isNullOrUndef; + +/** + * Generate a set of linear ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ +function generateTicks(generationOptions, dataRange) { + var ticks = []; + // To get a "nice" value for the tick spacing, we will use the appropriately named + // "nice number" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks + // for details. + + var MIN_SPACING = 1e-14; + var stepSize = generationOptions.stepSize; + var unit = stepSize || 1; + var maxNumSpaces = generationOptions.maxTicks - 1; + var min = generationOptions.min; + var max = generationOptions.max; + var precision = generationOptions.precision; + var rmin = dataRange.min; + var rmax = dataRange.max; + var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit; + var factor, niceMin, niceMax, numSpaces; + + // Beyond MIN_SPACING floating point numbers being to lose precision + // such that we can't do the math necessary to generate ticks + if (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) { + return [rmin, rmax]; + } + + numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); + if (numSpaces > maxNumSpaces) { + // If the calculated num of spaces exceeds maxNumSpaces, recalculate it + spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit; + } + + if (stepSize || isNullOrUndef(precision)) { + // If a precision is not specified, calculate factor based on spacing + factor = Math.pow(10, helpers$1._decimalPlaces(spacing)); + } else { + // If the user specified a precision, round to that number of decimal places + factor = Math.pow(10, precision); + spacing = Math.ceil(spacing * factor) / factor; + } + + niceMin = Math.floor(rmin / spacing) * spacing; + niceMax = Math.ceil(rmax / spacing) * spacing; + + // If min, max and stepSize is set and they make an evenly spaced scale use it. + if (stepSize) { + // If very close to our whole number, use it. + if (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) { + niceMin = min; + } + if (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) { + niceMax = max; + } + } + + numSpaces = (niceMax - niceMin) / spacing; + // If very close to our rounded value, use it. + if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { + numSpaces = Math.round(numSpaces); + } else { + numSpaces = Math.ceil(numSpaces); + } + + niceMin = Math.round(niceMin * factor) / factor; + niceMax = Math.round(niceMax * factor) / factor; + ticks.push(isNullOrUndef(min) ? niceMin : min); + for (var j = 1; j < numSpaces; ++j) { + ticks.push(Math.round((niceMin + j * spacing) * factor) / factor); + } + ticks.push(isNullOrUndef(max) ? niceMax : max); + + return ticks; +} + +var scale_linearbase = core_scale.extend({ + getRightValue: function(value) { + if (typeof value === 'string') { + return +value; + } + return core_scale.prototype.getRightValue.call(this, value); + }, + + handleTickRangeOptions: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, + // do nothing since that would make the chart weird. If the user really wants a weird chart + // axis, they can manually override it + if (tickOpts.beginAtZero) { + var minSign = helpers$1.sign(me.min); + var maxSign = helpers$1.sign(me.max); + + if (minSign < 0 && maxSign < 0) { + // move the top up to 0 + me.max = 0; + } else if (minSign > 0 && maxSign > 0) { + // move the bottom down to 0 + me.min = 0; + } + } + + var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; + var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; + + if (tickOpts.min !== undefined) { + me.min = tickOpts.min; + } else if (tickOpts.suggestedMin !== undefined) { + if (me.min === null) { + me.min = tickOpts.suggestedMin; + } else { + me.min = Math.min(me.min, tickOpts.suggestedMin); + } + } + + if (tickOpts.max !== undefined) { + me.max = tickOpts.max; + } else if (tickOpts.suggestedMax !== undefined) { + if (me.max === null) { + me.max = tickOpts.suggestedMax; + } else { + me.max = Math.max(me.max, tickOpts.suggestedMax); + } + } + + if (setMin !== setMax) { + // We set the min or the max but not both. + // So ensure that our range is good + // Inverted or 0 length range can happen when + // ticks.min is set, and no datasets are visible + if (me.min >= me.max) { + if (setMin) { + me.max = me.min + 1; + } else { + me.min = me.max - 1; + } + } + } + + if (me.min === me.max) { + me.max++; + + if (!tickOpts.beginAtZero) { + me.min--; + } + } + }, + + getTickLimit: function() { + var me = this; + var tickOpts = me.options.ticks; + var stepSize = tickOpts.stepSize; + var maxTicksLimit = tickOpts.maxTicksLimit; + var maxTicks; + + if (stepSize) { + maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1; + } else { + maxTicks = me._computeTickLimit(); + maxTicksLimit = maxTicksLimit || 11; + } + + if (maxTicksLimit) { + maxTicks = Math.min(maxTicksLimit, maxTicks); + } + + return maxTicks; + }, + + _computeTickLimit: function() { + return Number.POSITIVE_INFINITY; + }, + + handleDirectionalChanges: noop, + + buildTicks: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // Figure out what the max number of ticks we can support it is based on the size of + // the axis area. For now, we say that the minimum tick spacing in pixels must be 40 + // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on + // the graph. Make sure we always have at least 2 ticks + var maxTicks = me.getTickLimit(); + maxTicks = Math.max(2, maxTicks); + + var numericGeneratorOptions = { + maxTicks: maxTicks, + min: tickOpts.min, + max: tickOpts.max, + precision: tickOpts.precision, + stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) + }; + var ticks = me.ticks = generateTicks(numericGeneratorOptions, me); + + me.handleDirectionalChanges(); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + ticks.reverse(); + + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + }, + + convertTicksToLabels: function() { + var me = this; + me.ticksAsNumbers = me.ticks.slice(); + me.zeroLineIndex = me.ticks.indexOf(0); + + core_scale.prototype.convertTicksToLabels.call(me); + } +}); + +var defaultConfig$1 = { + position: 'left', + ticks: { + callback: core_ticks.formatters.linear + } +}; + +var scale_linear = scale_linearbase.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + var DEFAULT_MIN = 0; + var DEFAULT_MAX = 1; + + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // First Calculate the range + me.min = null; + me.max = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = { + positiveValues: [], + negativeValues: [] + }; + } + + // Store these per type + var positiveValues = valuesPerStack[key].positiveValues; + var negativeValues = valuesPerStack[key].negativeValues; + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + positiveValues[index] = positiveValues[index] || 0; + negativeValues[index] = negativeValues[index] || 0; + + if (opts.relativePoints) { + positiveValues[index] = 100; + } else if (value < 0) { + negativeValues[index] += value; + } else { + positiveValues[index] += value; + } + }); + } + }); + + helpers$1.each(valuesPerStack, function(valuesForType) { + var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); + var minVal = helpers$1.min(values); + var maxVal = helpers$1.max(values); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + }); + + } else { + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + }); + } + }); + } + + me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; + me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + this.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function() { + var me = this; + var tickFont; + + if (me.isHorizontal()) { + return Math.ceil(me.width / 40); + } + tickFont = helpers$1.options._parseFont(me.options.ticks); + return Math.ceil(me.height / tickFont.lineHeight); + }, + + // Called after the ticks are built. We need + handleDirectionalChanges: function() { + if (!this.isHorizontal()) { + // We are in a vertical orientation. The top value is the highest. So reverse the array + this.ticks.reverse(); + } + }, + + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + // Utils + getPixelForValue: function(value) { + // This must be called after fit has been run so that + // this.left, this.top, this.right, and this.bottom have been defined + var me = this; + var start = me.start; + + var rightValue = +me.getRightValue(value); + var pixel; + var range = me.end - start; + + if (me.isHorizontal()) { + pixel = me.left + (me.width / range * (rightValue - start)); + } else { + pixel = me.bottom - (me.height / range * (rightValue - start)); + } + return pixel; + }, + + getValueForPixel: function(pixel) { + var me = this; + var isHorizontal = me.isHorizontal(); + var innerDimension = isHorizontal ? me.width : me.height; + var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; + return me.start + ((me.end - me.start) * offset); + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticksAsNumbers[index]); + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$1 = defaultConfig$1; +scale_linear._defaults = _defaults$1; + +var valueOrDefault$a = helpers$1.valueOrDefault; + +/** + * Generate a set of logarithmic ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ +function generateTicks$1(generationOptions, dataRange) { + var ticks = []; + + var tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min)))); + + var endExp = Math.floor(helpers$1.log10(dataRange.max)); + var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); + var exp, significand; + + if (tickVal === 0) { + exp = Math.floor(helpers$1.log10(dataRange.minNotZero)); + significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); + + ticks.push(tickVal); + tickVal = significand * Math.pow(10, exp); + } else { + exp = Math.floor(helpers$1.log10(tickVal)); + significand = Math.floor(tickVal / Math.pow(10, exp)); + } + var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; + + do { + ticks.push(tickVal); + + ++significand; + if (significand === 10) { + significand = 1; + ++exp; + precision = exp >= 0 ? 1 : precision; + } + + tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision; + } while (exp < endExp || (exp === endExp && significand < endSignificand)); + + var lastTick = valueOrDefault$a(generationOptions.max, tickVal); + ticks.push(lastTick); + + return ticks; +} + +var defaultConfig$2 = { + position: 'left', + + // label settings + ticks: { + callback: core_ticks.formatters.logarithmic + } +}; + +// TODO(v3): change this to positiveOrDefault +function nonNegativeOrDefault(value, defaultValue) { + return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue; +} + +var scale_logarithmic = core_scale.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // Calculate Range + me.min = null; + me.max = null; + me.minNotZero = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = []; + } + + helpers$1.each(dataset.data, function(rawValue, index) { + var values = valuesPerStack[key]; + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + values[index] = values[index] || 0; + values[index] += value; + }); + } + }); + + helpers$1.each(valuesPerStack, function(valuesForType) { + if (valuesForType.length > 0) { + var minVal = helpers$1.min(valuesForType); + var maxVal = helpers$1.max(valuesForType); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + } + }); + + } else { + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + + if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { + me.minNotZero = value; + } + }); + } + }); + } + + // Common base implementation to handle ticks.min, ticks.max + this.handleTickRangeOptions(); + }, + + handleTickRangeOptions: function() { + var me = this; + var tickOpts = me.options.ticks; + var DEFAULT_MIN = 1; + var DEFAULT_MAX = 10; + + me.min = nonNegativeOrDefault(tickOpts.min, me.min); + me.max = nonNegativeOrDefault(tickOpts.max, me.max); + + if (me.min === me.max) { + if (me.min !== 0 && me.min !== null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1); + me.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1); + } else { + me.min = DEFAULT_MIN; + me.max = DEFAULT_MAX; + } + } + if (me.min === null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1); + } + if (me.max === null) { + me.max = me.min !== 0 + ? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1) + : DEFAULT_MAX; + } + if (me.minNotZero === null) { + if (me.min > 0) { + me.minNotZero = me.min; + } else if (me.max < 1) { + me.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max))); + } else { + me.minNotZero = DEFAULT_MIN; + } + } + }, + + buildTicks: function() { + var me = this; + var tickOpts = me.options.ticks; + var reverse = !me.isHorizontal(); + + var generationOptions = { + min: nonNegativeOrDefault(tickOpts.min), + max: nonNegativeOrDefault(tickOpts.max) + }; + var ticks = me.ticks = generateTicks$1(generationOptions, me); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + reverse = !reverse; + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + if (reverse) { + ticks.reverse(); + } + }, + + convertTicksToLabels: function() { + this.tickValues = this.ticks.slice(); + + core_scale.prototype.convertTicksToLabels.call(this); + }, + + // Get the correct tooltip label + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.tickValues[index]); + }, + + /** + * Returns the value of the first tick. + * @param {number} value - The minimum not zero value. + * @return {number} The first tick value. + * @private + */ + _getFirstTickValue: function(value) { + var exp = Math.floor(helpers$1.log10(value)); + var significand = Math.floor(value / Math.pow(10, exp)); + + return significand * Math.pow(10, exp); + }, + + getPixelForValue: function(value) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var offset = 0; + var innerDimension, pixel, start, end, sign; + + value = +me.getRightValue(value); + if (reverse) { + start = me.end; + end = me.start; + sign = -1; + } else { + start = me.start; + end = me.end; + sign = 1; + } + if (me.isHorizontal()) { + innerDimension = me.width; + pixel = reverse ? me.right : me.left; + } else { + innerDimension = me.height; + sign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0) + pixel = reverse ? me.top : me.bottom; + } + if (value !== start) { + if (start === 0) { // include zero tick + offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + innerDimension -= offset; + start = firstTickValue; + } + if (value !== 0) { + offset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start)); + } + pixel += sign * offset; + } + return pixel; + }, + + getValueForPixel: function(pixel) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var innerDimension, start, end, value; + + if (reverse) { + start = me.end; + end = me.start; + } else { + start = me.start; + end = me.end; + } + if (me.isHorizontal()) { + innerDimension = me.width; + value = reverse ? me.right - pixel : pixel - me.left; + } else { + innerDimension = me.height; + value = reverse ? pixel - me.top : me.bottom - pixel; + } + if (value !== start) { + if (start === 0) { // include zero tick + var offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + value -= offset; + innerDimension -= offset; + start = firstTickValue; + } + value *= log10(end) - log10(start); + value /= innerDimension; + value = Math.pow(10, log10(start) + value); + } + return value; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$2 = defaultConfig$2; +scale_logarithmic._defaults = _defaults$2; + +var valueOrDefault$b = helpers$1.valueOrDefault; +var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault; +var resolve$7 = helpers$1.options.resolve; + +var defaultConfig$3 = { + display: true, + + // Boolean - Whether to animate scaling the chart from the centre + animate: true, + position: 'chartArea', + + angleLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + borderDash: [], + borderDashOffset: 0.0 + }, + + gridLines: { + circular: false + }, + + // label settings + ticks: { + // Boolean - Show a backdrop to the scale label + showLabelBackdrop: true, + + // String - The colour of the label backdrop + backdropColor: 'rgba(255,255,255,0.75)', + + // Number - The backdrop padding above & below the label in pixels + backdropPaddingY: 2, + + // Number - The backdrop padding to the side of the label in pixels + backdropPaddingX: 2, + + callback: core_ticks.formatters.linear + }, + + pointLabels: { + // Boolean - if true, show point labels + display: true, + + // Number - Point label font size in pixels + fontSize: 10, + + // Function - Used to convert point labels + callback: function(label) { + return label; + } + } +}; + +function getValueCount(scale) { + var opts = scale.options; + return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; +} + +function getTickBackdropHeight(opts) { + var tickOpts = opts.ticks; + + if (tickOpts.display && opts.display) { + return valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2; + } + return 0; +} + +function measureLabelSize(ctx, lineHeight, label) { + if (helpers$1.isArray(label)) { + return { + w: helpers$1.longestText(ctx, ctx.font, label), + h: label.length * lineHeight + }; + } + + return { + w: ctx.measureText(label).width, + h: lineHeight + }; +} + +function determineLimits(angle, pos, size, min, max) { + if (angle === min || angle === max) { + return { + start: pos - (size / 2), + end: pos + (size / 2) + }; + } else if (angle < min || angle > max) { + return { + start: pos - size, + end: pos + }; + } + + return { + start: pos, + end: pos + size + }; +} + +/** + * Helper function to fit a radial linear scale with point labels + */ +function fitWithPointLabels(scale) { + + // Right, this is really confusing and there is a lot of maths going on here + // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + // + // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + // + // Solution: + // + // We assume the radius of the polygon is half the size of the canvas at first + // at each index we check if the text overlaps. + // + // Where it does, we store that angle and that index. + // + // After finding the largest index and angle we calculate how much we need to remove + // from the shape radius to move the point inwards by that x. + // + // We average the left and right distances to get the maximum shape radius that can fit in the box + // along with labels. + // + // Once we have that, we can find the centre point for the chart, by taking the x text protrusion + // on each side, removing that from the size, halving it and adding the left x protrusion width. + // + // This will mean we have a shape fitted to the canvas, as large as it can be with the labels + // and position it in the most space efficient manner + // + // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + + var plFont = helpers$1.options._parseFont(scale.options.pointLabels); + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var furthestLimits = { + l: 0, + r: scale.width, + t: 0, + b: scale.height - scale.paddingTop + }; + var furthestAngles = {}; + var i, textSize, pointPosition; + + scale.ctx.font = plFont.string; + scale._pointLabelSizes = []; + + var valueCount = getValueCount(scale); + for (i = 0; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, scale.drawingArea + 5); + textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || ''); + scale._pointLabelSizes[i] = textSize; + + // Add quarter circle to make degree 0 mean top of circle + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians) % 360; + var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); + var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); + + if (hLimits.start < furthestLimits.l) { + furthestLimits.l = hLimits.start; + furthestAngles.l = angleRadians; + } + + if (hLimits.end > furthestLimits.r) { + furthestLimits.r = hLimits.end; + furthestAngles.r = angleRadians; + } + + if (vLimits.start < furthestLimits.t) { + furthestLimits.t = vLimits.start; + furthestAngles.t = angleRadians; + } + + if (vLimits.end > furthestLimits.b) { + furthestLimits.b = vLimits.end; + furthestAngles.b = angleRadians; + } + } + + scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles); +} + +function getTextAlignForAngle(angle) { + if (angle === 0 || angle === 180) { + return 'center'; + } else if (angle < 180) { + return 'left'; + } + + return 'right'; +} + +function fillText(ctx, text, position, lineHeight) { + var y = position.y + lineHeight / 2; + var i, ilen; + + if (helpers$1.isArray(text)) { + for (i = 0, ilen = text.length; i < ilen; ++i) { + ctx.fillText(text[i], position.x, y); + y += lineHeight; + } + } else { + ctx.fillText(text, position.x, y); + } +} + +function adjustPointPositionForLabelHeight(angle, textSize, position) { + if (angle === 90 || angle === 270) { + position.y -= (textSize.h / 2); + } else if (angle > 270 || angle < 90) { + position.y -= textSize.h; + } +} + +function drawPointLabels(scale) { + var ctx = scale.ctx; + var opts = scale.options; + var angleLineOpts = opts.angleLines; + var gridLineOpts = opts.gridLines; + var pointLabelOpts = opts.pointLabels; + var lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth); + var lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color); + var tickBackdropHeight = getTickBackdropHeight(opts); + + ctx.save(); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = lineColor; + if (ctx.setLineDash) { + ctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []])); + ctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]); + } + + var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); + + // Point Label Font + var plFont = helpers$1.options._parseFont(pointLabelOpts); + + ctx.font = plFont.string; + ctx.textBaseline = 'middle'; + + for (var i = getValueCount(scale) - 1; i >= 0; i--) { + if (angleLineOpts.display && lineWidth && lineColor) { + var outerPosition = scale.getPointPosition(i, outerDistance); + ctx.beginPath(); + ctx.moveTo(scale.xCenter, scale.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + } + + if (pointLabelOpts.display) { + // Extra pixels out for some label spacing + var extra = (i === 0 ? tickBackdropHeight / 2 : 0); + var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5); + + // Keep this in loop since we may support array properties here + var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor); + ctx.fillStyle = pointLabelFontColor; + + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians); + ctx.textAlign = getTextAlignForAngle(angle); + adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); + fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight); + } + } + ctx.restore(); +} + +function drawRadiusLine(scale, gridLineOpts, radius, index) { + var ctx = scale.ctx; + var circular = gridLineOpts.circular; + var valueCount = getValueCount(scale); + var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1); + var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1); + var pointPosition; + + if ((!circular && !valueCount) || !lineColor || !lineWidth) { + return; + } + + ctx.save(); + ctx.strokeStyle = lineColor; + ctx.lineWidth = lineWidth; + if (ctx.setLineDash) { + ctx.setLineDash(gridLineOpts.borderDash || []); + ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0; + } + + ctx.beginPath(); + if (circular) { + // Draw circular arcs between the points + ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); + } else { + // Draw straight lines connecting each index + pointPosition = scale.getPointPosition(0, radius); + ctx.moveTo(pointPosition.x, pointPosition.y); + + for (var i = 1; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, radius); + ctx.lineTo(pointPosition.x, pointPosition.y); + } + } + ctx.closePath(); + ctx.stroke(); + ctx.restore(); +} + +function numberOrZero(param) { + return helpers$1.isNumber(param) ? param : 0; +} + +var scale_radialLinear = scale_linearbase.extend({ + setDimensions: function() { + var me = this; + + // Set the unconstrained dimension before label rotation + me.width = me.maxWidth; + me.height = me.maxHeight; + me.paddingTop = getTickBackdropHeight(me.options) / 2; + me.xCenter = Math.floor(me.width / 2); + me.yCenter = Math.floor((me.height - me.paddingTop) / 2); + me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2; + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var min = Number.POSITIVE_INFINITY; + var max = Number.NEGATIVE_INFINITY; + + helpers$1.each(chart.data.datasets, function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + min = Math.min(value, min); + max = Math.max(value, max); + }); + } + }); + + me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); + me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + me.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function() { + return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); + }, + + convertTicksToLabels: function() { + var me = this; + + scale_linearbase.prototype.convertTicksToLabels.call(me); + + // Point labels + me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); + }, + + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + fit: function() { + var me = this; + var opts = me.options; + + if (opts.display && opts.pointLabels.display) { + fitWithPointLabels(me); + } else { + me.setCenterPoint(0, 0, 0, 0); + } + }, + + /** + * Set radius reductions and determine new radius and center point + * @private + */ + setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) { + var me = this; + var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); + var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); + var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); + var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b); + + radiusReductionLeft = numberOrZero(radiusReductionLeft); + radiusReductionRight = numberOrZero(radiusReductionRight); + radiusReductionTop = numberOrZero(radiusReductionTop); + radiusReductionBottom = numberOrZero(radiusReductionBottom); + + me.drawingArea = Math.min( + Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), + Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); + me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); + }, + + setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) { + var me = this; + var maxRight = me.width - rightMovement - me.drawingArea; + var maxLeft = leftMovement + me.drawingArea; + var maxTop = topMovement + me.drawingArea; + var maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea; + + me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left); + me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop); + }, + + getIndexAngle: function(index) { + var angleMultiplier = (Math.PI * 2) / getValueCount(this); + var startAngle = this.chart.options && this.chart.options.startAngle ? + this.chart.options.startAngle : + 0; + + var startAngleRadians = startAngle * Math.PI * 2 / 360; + + // Start from the top instead of right, so remove a quarter of the circle + return index * angleMultiplier + startAngleRadians; + }, + + getDistanceFromCenterForValue: function(value) { + var me = this; + + if (value === null) { + return 0; // null always in center + } + + // Take into account half font size + the yPadding of the top value + var scalingFactor = me.drawingArea / (me.max - me.min); + if (me.options.ticks.reverse) { + return (me.max - value) * scalingFactor; + } + return (value - me.min) * scalingFactor; + }, + + getPointPosition: function(index, distanceFromCenter) { + var me = this; + var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); + return { + x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter, + y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter + }; + }, + + getPointPositionForValue: function(index, value) { + return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); + }, + + getBasePosition: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.getPointPositionForValue(0, + me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0); + }, + + draw: function() { + var me = this; + var opts = me.options; + var gridLineOpts = opts.gridLines; + var tickOpts = opts.ticks; + + if (opts.display) { + var ctx = me.ctx; + var startAngle = this.getIndexAngle(0); + var tickFont = helpers$1.options._parseFont(tickOpts); + + if (opts.angleLines.display || opts.pointLabels.display) { + drawPointLabels(me); + } + + helpers$1.each(me.ticks, function(label, index) { + // Don't draw a centre value (if it is minimum) + if (index > 0 || tickOpts.reverse) { + var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); + + // Draw circular lines around the scale + if (gridLineOpts.display && index !== 0) { + drawRadiusLine(me, gridLineOpts, yCenterOffset, index); + } + + if (tickOpts.display) { + var tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor); + ctx.font = tickFont.string; + + ctx.save(); + ctx.translate(me.xCenter, me.yCenter); + ctx.rotate(startAngle); + + if (tickOpts.showLabelBackdrop) { + var labelWidth = ctx.measureText(label).width; + ctx.fillStyle = tickOpts.backdropColor; + ctx.fillRect( + -labelWidth / 2 - tickOpts.backdropPaddingX, + -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY, + labelWidth + tickOpts.backdropPaddingX * 2, + tickFont.size + tickOpts.backdropPaddingY * 2 + ); + } + + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = tickFontColor; + ctx.fillText(label, 0, -yCenterOffset); + ctx.restore(); + } + } + }); + } + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$3 = defaultConfig$3; +scale_radialLinear._defaults = _defaults$3; + +var valueOrDefault$c = helpers$1.valueOrDefault; + +// Integer constants are from the ES6 spec. +var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; +var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +var INTERVALS = { + millisecond: { + common: true, + size: 1, + steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] + }, + second: { + common: true, + size: 1000, + steps: [1, 2, 5, 10, 15, 30] + }, + minute: { + common: true, + size: 60000, + steps: [1, 2, 5, 10, 15, 30] + }, + hour: { + common: true, + size: 3600000, + steps: [1, 2, 3, 6, 12] + }, + day: { + common: true, + size: 86400000, + steps: [1, 2, 5] + }, + week: { + common: false, + size: 604800000, + steps: [1, 2, 3, 4] + }, + month: { + common: true, + size: 2.628e9, + steps: [1, 2, 3] + }, + quarter: { + common: false, + size: 7.884e9, + steps: [1, 2, 3, 4] + }, + year: { + common: true, + size: 3.154e10 + } +}; + +var UNITS = Object.keys(INTERVALS); + +function sorter(a, b) { + return a - b; +} + +function arrayUnique(items) { + var hash = {}; + var out = []; + var i, ilen, item; + + for (i = 0, ilen = items.length; i < ilen; ++i) { + item = items[i]; + if (!hash[item]) { + hash[item] = true; + out.push(item); + } + } + + return out; +} + +/** + * Returns an array of {time, pos} objects used to interpolate a specific `time` or position + * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is + * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other + * extremity (left + width or top + height). Note that it would be more optimized to directly + * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need + * to create the lookup table. The table ALWAYS contains at least two items: min and max. + * + * @param {number[]} timestamps - timestamps sorted from lowest to highest. + * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min + * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. + * If 'series', timestamps will be positioned at the same distance from each other. In this + * case, only timestamps that break the time linearity are registered, meaning that in the + * best case, all timestamps are linear, the table contains only min and max. + */ +function buildLookupTable(timestamps, min, max, distribution) { + if (distribution === 'linear' || !timestamps.length) { + return [ + {time: min, pos: 0}, + {time: max, pos: 1} + ]; + } + + var table = []; + var items = [min]; + var i, ilen, prev, curr, next; + + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + curr = timestamps[i]; + if (curr > min && curr < max) { + items.push(curr); + } + } + + items.push(max); + + for (i = 0, ilen = items.length; i < ilen; ++i) { + next = items[i + 1]; + prev = items[i - 1]; + curr = items[i]; + + // only add points that breaks the scale linearity + if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { + table.push({time: curr, pos: i / (ilen - 1)}); + } + } + + return table; +} + +// @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ +function lookup(table, key, value) { + var lo = 0; + var hi = table.length - 1; + var mid, i0, i1; + + while (lo >= 0 && lo <= hi) { + mid = (lo + hi) >> 1; + i0 = table[mid - 1] || null; + i1 = table[mid]; + + if (!i0) { + // given value is outside table (before first item) + return {lo: null, hi: i1}; + } else if (i1[key] < value) { + lo = mid + 1; + } else if (i0[key] > value) { + hi = mid - 1; + } else { + return {lo: i0, hi: i1}; + } + } + + // given value is outside table (after last item) + return {lo: i1, hi: null}; +} + +/** + * Linearly interpolates the given source `value` using the table items `skey` values and + * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') + * returns the position for a timestamp equal to 42. If value is out of bounds, values at + * index [0, 1] or [n - 1, n] are used for the interpolation. + */ +function interpolate$1(table, skey, sval, tkey) { + var range = lookup(table, skey, sval); + + // Note: the lookup table ALWAYS contains at least 2 items (min and max) + var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; + var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; + + var span = next[skey] - prev[skey]; + var ratio = span ? (sval - prev[skey]) / span : 0; + var offset = (next[tkey] - prev[tkey]) * ratio; + + return prev[tkey] + offset; +} + +function toTimestamp(scale, input) { + var adapter = scale._adapter; + var options = scale.options.time; + var parser = options.parser; + var format = parser || options.format; + var value = input; + + if (typeof parser === 'function') { + value = parser(value); + } + + // Only parse if its not a timestamp already + if (!helpers$1.isFinite(value)) { + value = typeof format === 'string' + ? adapter.parse(value, format) + : adapter.parse(value); + } + + if (value !== null) { + return +value; + } + + // Labels are in an incompatible format and no `parser` has been provided. + // The user might still use the deprecated `format` option for parsing. + if (!parser && typeof format === 'function') { + value = format(input); + + // `format` could return something else than a timestamp, if so, parse it + if (!helpers$1.isFinite(value)) { + value = adapter.parse(value); + } + } + + return value; +} + +function parse(scale, input) { + if (helpers$1.isNullOrUndef(input)) { + return null; + } + + var options = scale.options.time; + var value = toTimestamp(scale, scale.getRightValue(input)); + if (value === null) { + return value; + } + + if (options.round) { + value = +scale._adapter.startOf(value, options.round); + } + + return value; +} + +/** + * Returns the number of unit to skip to be able to display up to `capacity` number of ticks + * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. + */ +function determineStepSize(min, max, unit, capacity) { + var range = max - min; + var interval = INTERVALS[unit]; + var milliseconds = interval.size; + var steps = interval.steps; + var i, ilen, factor; + + if (!steps) { + return Math.ceil(range / (capacity * milliseconds)); + } + + for (i = 0, ilen = steps.length; i < ilen; ++i) { + factor = steps[i]; + if (Math.ceil(range / (milliseconds * factor)) <= capacity) { + break; + } + } + + return factor; +} + +/** + * Figures out what unit results in an appropriate number of auto-generated ticks + */ +function determineUnitForAutoTicks(minUnit, min, max, capacity) { + var ilen = UNITS.length; + var i, interval, factor; + + for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { + interval = INTERVALS[UNITS[i]]; + factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; + + if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { + return UNITS[i]; + } + } + + return UNITS[ilen - 1]; +} + +/** + * Figures out what unit to format a set of ticks with + */ +function determineUnitForFormatting(scale, ticks, minUnit, min, max) { + var ilen = UNITS.length; + var i, unit; + + for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { + unit = UNITS[i]; + if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) { + return unit; + } + } + + return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; +} + +function determineMajorUnit(unit) { + for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { + if (INTERVALS[UNITS[i]].common) { + return UNITS[i]; + } + } +} + +/** + * Generates a maximum of `capacity` timestamps between min and max, rounded to the + * `minor` unit, aligned on the `major` unit and using the given scale time `options`. + * Important: this method can return ticks outside the min and max range, it's the + * responsibility of the calling code to clamp values if needed. + */ +function generate(scale, min, max, capacity) { + var adapter = scale._adapter; + var options = scale.options; + var timeOpts = options.time; + var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); + var major = determineMajorUnit(minor); + var stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize); + var weekday = minor === 'week' ? timeOpts.isoWeekday : false; + var majorTicksEnabled = options.ticks.major.enabled; + var interval = INTERVALS[minor]; + var first = min; + var last = max; + var ticks = []; + var time; + + if (!stepSize) { + stepSize = determineStepSize(min, max, minor, capacity); + } + + // For 'week' unit, handle the first day of week option + if (weekday) { + first = +adapter.startOf(first, 'isoWeek', weekday); + last = +adapter.startOf(last, 'isoWeek', weekday); + } + + // Align first/last ticks on unit + first = +adapter.startOf(first, weekday ? 'day' : minor); + last = +adapter.startOf(last, weekday ? 'day' : minor); + + // Make sure that the last tick include max + if (last < max) { + last = +adapter.add(last, 1, minor); + } + + time = first; + + if (majorTicksEnabled && major && !weekday && !timeOpts.round) { + // Align the first tick on the previous `minor` unit aligned on the `major` unit: + // we first aligned time on the previous `major` unit then add the number of full + // stepSize there is between first and the previous major time. + time = +adapter.startOf(time, major); + time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor); + } + + for (; time < last; time = +adapter.add(time, stepSize, minor)) { + ticks.push(+time); + } + + ticks.push(+time); + + return ticks; +} + +/** + * Returns the start and end offsets from edges in the form of {start, end} + * where each value is a relative width to the scale and ranges between 0 and 1. + * They add extra margins on the both sides by scaling down the original scale. + * Offsets are added when the `offset` option is true. + */ +function computeOffsets(table, ticks, min, max, options) { + var start = 0; + var end = 0; + var first, last; + + if (options.offset && ticks.length) { + if (!options.time.min) { + first = interpolate$1(table, 'time', ticks[0], 'pos'); + if (ticks.length === 1) { + start = 1 - first; + } else { + start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2; + } + } + if (!options.time.max) { + last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos'); + if (ticks.length === 1) { + end = last; + } else { + end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2; + } + } + } + + return {start: start, end: end}; +} + +function ticksFromTimestamps(scale, values, majorUnit) { + var ticks = []; + var i, ilen, value, major; + + for (i = 0, ilen = values.length; i < ilen; ++i) { + value = values[i]; + major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false; + + ticks.push({ + value: value, + major: major + }); + } + + return ticks; +} + +var defaultConfig$4 = { + position: 'bottom', + + /** + * Data distribution along the scale: + * - 'linear': data are spread according to their time (distances can vary), + * - 'series': data are spread at the same distance from each other. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + distribution: 'linear', + + /** + * Scale boundary strategy (bypassed by min/max time options) + * - `data`: make sure data are fully visible, ticks outside are removed + * - `ticks`: make sure ticks are fully visible, data outside are truncated + * @see https://github.com/chartjs/Chart.js/pull/4556 + * @since 2.7.0 + */ + bounds: 'data', + + adapters: {}, + time: { + parser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment + format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/ + unit: false, // false == automatic or override with week, month, year, etc. + round: false, // none, or override with week, month, year, etc. + displayFormat: false, // DEPRECATED + isoWeekday: false, // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/ + minUnit: 'millisecond', + displayFormats: {} + }, + ticks: { + autoSkip: false, + + /** + * Ticks generation input values: + * - 'auto': generates "optimal" ticks based on scale size and time options. + * - 'data': generates ticks from data (including labels from data {t|x|y} objects). + * - 'labels': generates ticks from user given `data.labels` values ONLY. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + source: 'auto', + + major: { + enabled: false + } + } +}; + +var scale_time = core_scale.extend({ + initialize: function() { + this.mergeTicksOptions(); + core_scale.prototype.initialize.call(this); + }, + + update: function() { + var me = this; + var options = me.options; + var time = options.time || (options.time = {}); + var adapter = me._adapter = new core_adapters._date(options.adapters.date); + + // DEPRECATIONS: output a message only one time per update + if (time.format) { + console.warn('options.time.format is deprecated and replaced by options.time.parser.'); + } + + // Backward compatibility: before introducing adapter, `displayFormats` was + // supposed to contain *all* unit/string pairs but this can't be resolved + // when loading the scale (adapters are loaded afterward), so let's populate + // missing formats on update + helpers$1.mergeIf(time.displayFormats, adapter.formats()); + + return core_scale.prototype.update.apply(me, arguments); + }, + + /** + * Allows data to be referenced via 't' attribute + */ + getRightValue: function(rawValue) { + if (rawValue && rawValue.t !== undefined) { + rawValue = rawValue.t; + } + return core_scale.prototype.getRightValue.call(this, rawValue); + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var adapter = me._adapter; + var timeOpts = me.options.time; + var unit = timeOpts.unit || 'day'; + var min = MAX_INTEGER; + var max = MIN_INTEGER; + var timestamps = []; + var datasets = []; + var labels = []; + var i, j, ilen, jlen, data, timestamp; + var dataLabels = chart.data.labels || []; + + // Convert labels to timestamps + for (i = 0, ilen = dataLabels.length; i < ilen; ++i) { + labels.push(parse(me, dataLabels[i])); + } + + // Convert data to timestamps + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + data = chart.data.datasets[i].data; + + // Let's consider that all data have the same format. + if (helpers$1.isObject(data[0])) { + datasets[i] = []; + + for (j = 0, jlen = data.length; j < jlen; ++j) { + timestamp = parse(me, data[j]); + timestamps.push(timestamp); + datasets[i][j] = timestamp; + } + } else { + for (j = 0, jlen = labels.length; j < jlen; ++j) { + timestamps.push(labels[j]); + } + datasets[i] = labels.slice(0); + } + } else { + datasets[i] = []; + } + } + + if (labels.length) { + // Sort labels **after** data have been converted + labels = arrayUnique(labels).sort(sorter); + min = Math.min(min, labels[0]); + max = Math.max(max, labels[labels.length - 1]); + } + + if (timestamps.length) { + timestamps = arrayUnique(timestamps).sort(sorter); + min = Math.min(min, timestamps[0]); + max = Math.max(max, timestamps[timestamps.length - 1]); + } + + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // In case there is no valid min/max, set limits based on unit time option + min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min; + max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max; + + // Make sure that max is strictly higher than min (required by the lookup table) + me.min = Math.min(min, max); + me.max = Math.max(min + 1, max); + + // PRIVATE + me._horizontal = me.isHorizontal(); + me._table = []; + me._timestamps = { + data: timestamps, + datasets: datasets, + labels: labels + }; + }, + + buildTicks: function() { + var me = this; + var min = me.min; + var max = me.max; + var options = me.options; + var timeOpts = options.time; + var timestamps = []; + var ticks = []; + var i, ilen, timestamp; + + switch (options.ticks.source) { + case 'data': + timestamps = me._timestamps.data; + break; + case 'labels': + timestamps = me._timestamps.labels; + break; + case 'auto': + default: + timestamps = generate(me, min, max, me.getLabelCapacity(min), options); + } + + if (options.bounds === 'ticks' && timestamps.length) { + min = timestamps[0]; + max = timestamps[timestamps.length - 1]; + } + + // Enforce limits with user min/max options + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // Remove ticks outside the min/max range + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + timestamp = timestamps[i]; + if (timestamp >= min && timestamp <= max) { + ticks.push(timestamp); + } + } + + me.min = min; + me.max = max; + + // PRIVATE + me._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max); + me._majorUnit = determineMajorUnit(me._unit); + me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); + me._offsets = computeOffsets(me._table, ticks, min, max, options); + + if (options.ticks.reverse) { + ticks.reverse(); + } + + return ticksFromTimestamps(me, ticks, me._majorUnit); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var adapter = me._adapter; + var data = me.chart.data; + var timeOpts = me.options.time; + var label = data.labels && index < data.labels.length ? data.labels[index] : ''; + var value = data.datasets[datasetIndex].data[index]; + + if (helpers$1.isObject(value)) { + label = me.getRightValue(value); + } + if (timeOpts.tooltipFormat) { + return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat); + } + if (typeof label === 'string') { + return label; + } + return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime); + }, + + /** + * Function to format an individual tick mark + * @private + */ + tickFormatFunction: function(time, index, ticks, format) { + var me = this; + var adapter = me._adapter; + var options = me.options; + var formats = options.time.displayFormats; + var minorFormat = formats[me._unit]; + var majorUnit = me._majorUnit; + var majorFormat = formats[majorUnit]; + var majorTime = +adapter.startOf(time, majorUnit); + var majorTickOpts = options.ticks.major; + var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; + var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat); + var tickOpts = major ? majorTickOpts : options.ticks.minor; + var formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback); + + return formatter ? formatter(label, index, ticks) : label; + }, + + convertTicksToLabels: function(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(this.tickFormatFunction(ticks[i].value, i, ticks)); + } + + return labels; + }, + + /** + * @private + */ + getPixelForOffset: function(time) { + var me = this; + var isReverse = me.options.ticks.reverse; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top; + var pos = interpolate$1(me._table, 'time', time, 'pos'); + var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end); + + return isReverse ? start - offset : start + offset; + }, + + getPixelForValue: function(value, index, datasetIndex) { + var me = this; + var time = null; + + if (index !== undefined && datasetIndex !== undefined) { + time = me._timestamps.datasets[datasetIndex][index]; + } + + if (time === null) { + time = parse(me, value); + } + + if (time !== null) { + return me.getPixelForOffset(time); + } + }, + + getPixelForTick: function(index) { + var ticks = this.getTicks(); + return index >= 0 && index < ticks.length ? + this.getPixelForOffset(ticks[index].value) : + null; + }, + + getValueForPixel: function(pixel) { + var me = this; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? me.left : me.top; + var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end; + var time = interpolate$1(me._table, 'pos', pos, 'time'); + + // DEPRECATION, we should return time directly + return me._adapter._create(time); + }, + + /** + * Crude approximation of what the label width might be + * @private + */ + getLabelWidth: function(label) { + var me = this; + var ticksOpts = me.options.ticks; + var tickLabelWidth = me.ctx.measureText(label).width; + var angle = helpers$1.toRadians(ticksOpts.maxRotation); + var cosRotation = Math.cos(angle); + var sinRotation = Math.sin(angle); + var tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize); + + return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); + }, + + /** + * @private + */ + getLabelCapacity: function(exampleTime) { + var me = this; + + // pick the longest format (milliseconds) for guestimation + var format = me.options.time.displayFormats.millisecond; + var exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format); + var tickLabelWidth = me.getLabelWidth(exampleLabel); + var innerWidth = me.isHorizontal() ? me.width : me.height; + var capacity = Math.floor(innerWidth / tickLabelWidth); + + return capacity > 0 ? capacity : 1; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$4 = defaultConfig$4; +scale_time._defaults = _defaults$4; + +var scales = { + category: scale_category, + linear: scale_linear, + logarithmic: scale_logarithmic, + radialLinear: scale_radialLinear, + time: scale_time +}; + +var FORMATS = { + datetime: 'MMM D, YYYY, h:mm:ss a', + millisecond: 'h:mm:ss.SSS a', + second: 'h:mm:ss a', + minute: 'h:mm a', + hour: 'hA', + day: 'MMM D', + week: 'll', + month: 'MMM YYYY', + quarter: '[Q]Q - YYYY', + year: 'YYYY' +}; + +core_adapters._date.override(typeof moment === 'function' ? { + _id: 'moment', // DEBUG ONLY + + formats: function() { + return FORMATS; + }, + + parse: function(value, format) { + if (typeof value === 'string' && typeof format === 'string') { + value = moment(value, format); + } else if (!(value instanceof moment)) { + value = moment(value); + } + return value.isValid() ? value.valueOf() : null; + }, + + format: function(time, format) { + return moment(time).format(format); + }, + + add: function(time, amount, unit) { + return moment(time).add(amount, unit).valueOf(); + }, + + diff: function(max, min, unit) { + return moment.duration(moment(max).diff(moment(min))).as(unit); + }, + + startOf: function(time, unit, weekday) { + time = moment(time); + if (unit === 'isoWeek') { + return time.isoWeekday(weekday).valueOf(); + } + return time.startOf(unit).valueOf(); + }, + + endOf: function(time, unit) { + return moment(time).endOf(unit).valueOf(); + }, + + // DEPRECATIONS + + /** + * Provided for backward compatibility with scale.getValueForPixel(). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function(time) { + return moment(time); + }, +} : {}); + +core_defaults._set('global', { + plugins: { + filler: { + propagate: true + } + } +}); + +var mappers = { + dataset: function(source) { + var index = source.fill; + var chart = source.chart; + var meta = chart.getDatasetMeta(index); + var visible = meta && chart.isDatasetVisible(index); + var points = (visible && meta.dataset._children) || []; + var length = points.length || 0; + + return !length ? null : function(point, i) { + return (i < length && points[i]._view) || null; + }; + }, + + boundary: function(source) { + var boundary = source.boundary; + var x = boundary ? boundary.x : null; + var y = boundary ? boundary.y : null; + + return function(point) { + return { + x: x === null ? point.x : x, + y: y === null ? point.y : y, + }; + }; + } +}; + +// @todo if (fill[0] === '#') +function decodeFill(el, index, count) { + var model = el._model || {}; + var fill = model.fill; + var target; + + if (fill === undefined) { + fill = !!model.backgroundColor; + } + + if (fill === false || fill === null) { + return false; + } + + if (fill === true) { + return 'origin'; + } + + target = parseFloat(fill, 10); + if (isFinite(target) && Math.floor(target) === target) { + if (fill[0] === '-' || fill[0] === '+') { + target = index + target; + } + + if (target === index || target < 0 || target >= count) { + return false; + } + + return target; + } + + switch (fill) { + // compatibility + case 'bottom': + return 'start'; + case 'top': + return 'end'; + case 'zero': + return 'origin'; + // supported boundaries + case 'origin': + case 'start': + case 'end': + return fill; + // invalid fill values + default: + return false; + } +} + +function computeBoundary(source) { + var model = source.el._model || {}; + var scale = source.el._scale || {}; + var fill = source.fill; + var target = null; + var horizontal; + + if (isFinite(fill)) { + return null; + } + + // Backward compatibility: until v3, we still need to support boundary values set on + // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and + // controllers might still use it (e.g. the Smith chart). + + if (fill === 'start') { + target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; + } else if (fill === 'end') { + target = model.scaleTop === undefined ? scale.top : model.scaleTop; + } else if (model.scaleZero !== undefined) { + target = model.scaleZero; + } else if (scale.getBasePosition) { + target = scale.getBasePosition(); + } else if (scale.getBasePixel) { + target = scale.getBasePixel(); + } + + if (target !== undefined && target !== null) { + if (target.x !== undefined && target.y !== undefined) { + return target; + } + + if (helpers$1.isFinite(target)) { + horizontal = scale.isHorizontal(); + return { + x: horizontal ? target : null, + y: horizontal ? null : target + }; + } + } + + return null; +} + +function resolveTarget(sources, index, propagate) { + var source = sources[index]; + var fill = source.fill; + var visited = [index]; + var target; + + if (!propagate) { + return fill; + } + + while (fill !== false && visited.indexOf(fill) === -1) { + if (!isFinite(fill)) { + return fill; + } + + target = sources[fill]; + if (!target) { + return false; + } + + if (target.visible) { + return fill; + } + + visited.push(fill); + fill = target.fill; + } + + return false; +} + +function createMapper(source) { + var fill = source.fill; + var type = 'dataset'; + + if (fill === false) { + return null; + } + + if (!isFinite(fill)) { + type = 'boundary'; + } + + return mappers[type](source); +} + +function isDrawable(point) { + return point && !point.skip; +} + +function drawArea(ctx, curve0, curve1, len0, len1) { + var i; + + if (!len0 || !len1) { + return; + } + + // building first area curve (normal) + ctx.moveTo(curve0[0].x, curve0[0].y); + for (i = 1; i < len0; ++i) { + helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); + } + + // joining the two area curves + ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); + + // building opposite area curve (reverse) + for (i = len1 - 1; i > 0; --i) { + helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); + } +} + +function doFill(ctx, points, mapper, view, color, loop) { + var count = points.length; + var span = view.spanGaps; + var curve0 = []; + var curve1 = []; + var len0 = 0; + var len1 = 0; + var i, ilen, index, p0, p1, d0, d1; + + ctx.beginPath(); + + for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { + index = i % count; + p0 = points[index]._view; + p1 = mapper(p0, index, view); + d0 = isDrawable(p0); + d1 = isDrawable(p1); + + if (d0 && d1) { + len0 = curve0.push(p0); + len1 = curve1.push(p1); + } else if (len0 && len1) { + if (!span) { + drawArea(ctx, curve0, curve1, len0, len1); + len0 = len1 = 0; + curve0 = []; + curve1 = []; + } else { + if (d0) { + curve0.push(p0); + } + if (d1) { + curve1.push(p1); + } + } + } + } + + drawArea(ctx, curve0, curve1, len0, len1); + + ctx.closePath(); + ctx.fillStyle = color; + ctx.fill(); +} + +var plugin_filler = { + id: 'filler', + + afterDatasetsUpdate: function(chart, options) { + var count = (chart.data.datasets || []).length; + var propagate = options.propagate; + var sources = []; + var meta, i, el, source; + + for (i = 0; i < count; ++i) { + meta = chart.getDatasetMeta(i); + el = meta.dataset; + source = null; + + if (el && el._model && el instanceof elements.Line) { + source = { + visible: chart.isDatasetVisible(i), + fill: decodeFill(el, i, count), + chart: chart, + el: el + }; + } + + meta.$filler = source; + sources.push(source); + } + + for (i = 0; i < count; ++i) { + source = sources[i]; + if (!source) { + continue; + } + + source.fill = resolveTarget(sources, i, propagate); + source.boundary = computeBoundary(source); + source.mapper = createMapper(source); + } + }, + + beforeDatasetDraw: function(chart, args) { + var meta = args.meta.$filler; + if (!meta) { + return; + } + + var ctx = chart.ctx; + var el = meta.el; + var view = el._view; + var points = el._children || []; + var mapper = meta.mapper; + var color = view.backgroundColor || core_defaults.global.defaultColor; + + if (mapper && color && points.length) { + helpers$1.canvas.clipArea(ctx, chart.chartArea); + doFill(ctx, points, mapper, view, color, el._loop); + helpers$1.canvas.unclipArea(ctx); + } + } +}; + +var noop$1 = helpers$1.noop; +var valueOrDefault$d = helpers$1.valueOrDefault; + +core_defaults._set('global', { + legend: { + display: true, + position: 'top', + fullWidth: true, + reverse: false, + weight: 1000, + + // a callback that will handle + onClick: function(e, legendItem) { + var index = legendItem.datasetIndex; + var ci = this.chart; + var meta = ci.getDatasetMeta(index); + + // See controller.isDatasetVisible comment + meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; + + // We hid a dataset ... rerender the chart + ci.update(); + }, + + onHover: null, + onLeave: null, + + labels: { + boxWidth: 40, + padding: 10, + // Generates labels shown in the legend + // Valid properties to return: + // text : text to display + // fillStyle : fill of coloured box + // strokeStyle: stroke of coloured box + // hidden : if this legend item refers to a hidden item + // lineCap : cap style for line + // lineDash + // lineDashOffset : + // lineJoin : + // lineWidth : + generateLabels: function(chart) { + var data = chart.data; + return helpers$1.isArray(data.datasets) ? data.datasets.map(function(dataset, i) { + return { + text: dataset.label, + fillStyle: (!helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), + hidden: !chart.isDatasetVisible(i), + lineCap: dataset.borderCapStyle, + lineDash: dataset.borderDash, + lineDashOffset: dataset.borderDashOffset, + lineJoin: dataset.borderJoinStyle, + lineWidth: dataset.borderWidth, + strokeStyle: dataset.borderColor, + pointStyle: dataset.pointStyle, + + // Below is extra data used for toggling the datasets + datasetIndex: i + }; + }, this) : []; + } + } + }, + + legendCallback: function(chart) { + var text = []; + text.push('
    '); + for (var i = 0; i < chart.data.datasets.length; i++) { + text.push('
  • '); + if (chart.data.datasets[i].label) { + text.push(chart.data.datasets[i].label); + } + text.push('
  • '); + } + text.push('
'); + return text.join(''); + } +}); + +/** + * Helper function to get the box width based on the usePointStyle option + * @param {object} labelopts - the label options on the legend + * @param {number} fontSize - the label font size + * @return {number} width of the color box area + */ +function getBoxWidth(labelOpts, fontSize) { + return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ? + fontSize : + labelOpts.boxWidth; +} + +/** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ +var Legend = core_element.extend({ + + initialize: function(config) { + helpers$1.extend(this, config); + + // Contains hit boxes for each dataset (in dataset order) + this.legendHitBoxes = []; + + /** + * @private + */ + this._hoveredItem = null; + + // Are we in doughnut mode which has a different data type + this.doughnutMode = false; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + // Any function defined here is inherited by all legend types. + // Any function can be extended by the legend type + + beforeUpdate: noop$1, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + }, + afterUpdate: noop$1, + + // + + beforeSetDimensions: noop$1, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$1, + + // + + beforeBuildLabels: noop$1, + buildLabels: function() { + var me = this; + var labelOpts = me.options.labels || {}; + var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || []; + + if (labelOpts.filter) { + legendItems = legendItems.filter(function(item) { + return labelOpts.filter(item, me.chart.data); + }); + } + + if (me.options.reverse) { + legendItems.reverse(); + } + + me.legendItems = legendItems; + }, + afterBuildLabels: noop$1, + + // + + beforeFit: noop$1, + fit: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var display = opts.display; + + var ctx = me.ctx; + + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + + // Reset hit boxes + var hitboxes = me.legendHitBoxes = []; + + var minSize = me.minSize; + var isHorizontal = me.isHorizontal(); + + if (isHorizontal) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = display ? 10 : 0; + } else { + minSize.width = display ? 10 : 0; + minSize.height = me.maxHeight; // fill all the height + } + + // Increase sizes here + if (display) { + ctx.font = labelFont.string; + + if (isHorizontal) { + // Labels + + // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one + var lineWidths = me.lineWidths = [0]; + var totalHeight = 0; + + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + + helpers$1.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + if (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) { + totalHeight += fontSize + labelOpts.padding; + lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding; + } + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: width, + height: fontSize + }; + + lineWidths[lineWidths.length - 1] += width + labelOpts.padding; + }); + + minSize.height += totalHeight; + + } else { + var vPadding = labelOpts.padding; + var columnWidths = me.columnWidths = []; + var totalWidth = labelOpts.padding; + var currentColWidth = 0; + var currentColHeight = 0; + var itemHeight = fontSize + vPadding; + + helpers$1.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + // If too tall, go to new column + if (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) { + totalWidth += currentColWidth + labelOpts.padding; + columnWidths.push(currentColWidth); // previous column width + + currentColWidth = 0; + currentColHeight = 0; + } + + // Get max width + currentColWidth = Math.max(currentColWidth, itemWidth); + currentColHeight += itemHeight; + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: itemWidth, + height: fontSize + }; + }); + + totalWidth += currentColWidth; + columnWidths.push(currentColWidth); + minSize.width += totalWidth; + } + } + + me.width = minSize.width; + me.height = minSize.height; + }, + afterFit: noop$1, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + + // Actually draw the legend on the canvas + draw: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; + var lineDefault = globalDefaults.elements.line; + var legendWidth = me.width; + var lineWidths = me.lineWidths; + + if (opts.display) { + var ctx = me.ctx; + var fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor); + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + var cursor; + + // Canvas setup + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + ctx.lineWidth = 0.5; + ctx.strokeStyle = fontColor; // for strikethrough effect + ctx.fillStyle = fontColor; // render in correct colour + ctx.font = labelFont.string; + + var boxWidth = getBoxWidth(labelOpts, fontSize); + var hitboxes = me.legendHitBoxes; + + // current position + var drawLegendBox = function(x, y, legendItem) { + if (isNaN(boxWidth) || boxWidth <= 0) { + return; + } + + // Set the ctx for the box + ctx.save(); + + var lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth); + ctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor); + ctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle); + ctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset); + ctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor); + + if (ctx.setLineDash) { + // IE 9 and 10 do not support line dash + ctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash)); + } + + if (opts.labels && opts.labels.usePointStyle) { + // Recalculate x and y for drawPoint() because its expecting + // x and y to be center of figure (instead of top left) + var radius = boxWidth * Math.SQRT2 / 2; + var centerX = x + boxWidth / 2; + var centerY = y + fontSize / 2; + + // Draw pointStyle as legend symbol + helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); + } else { + // Draw box as legend symbol + if (lineWidth !== 0) { + ctx.strokeRect(x, y, boxWidth, fontSize); + } + ctx.fillRect(x, y, boxWidth, fontSize); + } + + ctx.restore(); + }; + var fillText = function(x, y, legendItem, textWidth) { + var halfFontSize = fontSize / 2; + var xLeft = boxWidth + halfFontSize + x; + var yMiddle = y + halfFontSize; + + ctx.fillText(legendItem.text, xLeft, yMiddle); + + if (legendItem.hidden) { + // Strikethrough the text if hidden + ctx.beginPath(); + ctx.lineWidth = 2; + ctx.moveTo(xLeft, yMiddle); + ctx.lineTo(xLeft + textWidth, yMiddle); + ctx.stroke(); + } + }; + + // Horizontal + var isHorizontal = me.isHorizontal(); + if (isHorizontal) { + cursor = { + x: me.left + ((legendWidth - lineWidths[0]) / 2) + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } else { + cursor = { + x: me.left + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } + + var itemHeight = fontSize + labelOpts.padding; + helpers$1.each(me.legendItems, function(legendItem, i) { + var textWidth = ctx.measureText(legendItem.text).width; + var width = boxWidth + (fontSize / 2) + textWidth; + var x = cursor.x; + var y = cursor.y; + + // Use (me.left + me.minSize.width) and (me.top + me.minSize.height) + // instead of me.right and me.bottom because me.width and me.height + // may have been changed since me.minSize was calculated + if (isHorizontal) { + if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) { + y = cursor.y += itemHeight; + cursor.line++; + x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2) + labelOpts.padding; + } + } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) { + x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; + y = cursor.y = me.top + labelOpts.padding; + cursor.line++; + } + + drawLegendBox(x, y, legendItem); + + hitboxes[i].left = x; + hitboxes[i].top = y; + + // Fill the actual label + fillText(x, y, legendItem, textWidth); + + if (isHorizontal) { + cursor.x += width + labelOpts.padding; + } else { + cursor.y += itemHeight; + } + + }); + } + }, + + /** + * @private + */ + _getLegendItemAt: function(x, y) { + var me = this; + var i, hitBox, lh; + + if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { + // See if we are touching one of the dataset boxes + lh = me.legendHitBoxes; + for (i = 0; i < lh.length; ++i) { + hitBox = lh[i]; + + if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { + // Touching an element + return me.legendItems[i]; + } + } + } + + return null; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + */ + handleEvent: function(e) { + var me = this; + var opts = me.options; + var type = e.type === 'mouseup' ? 'click' : e.type; + var hoveredItem; + + if (type === 'mousemove') { + if (!opts.onHover && !opts.onLeave) { + return; + } + } else if (type === 'click') { + if (!opts.onClick) { + return; + } + } else { + return; + } + + // Chart event already has relative position in it + hoveredItem = me._getLegendItemAt(e.x, e.y); + + if (type === 'click') { + if (hoveredItem && opts.onClick) { + // use e.native for backwards compatibility + opts.onClick.call(me, e.native, hoveredItem); + } + } else { + if (opts.onLeave && hoveredItem !== me._hoveredItem) { + if (me._hoveredItem) { + opts.onLeave.call(me, e.native, me._hoveredItem); + } + me._hoveredItem = hoveredItem; + } + + if (opts.onHover && hoveredItem) { + // use e.native for backwards compatibility + opts.onHover.call(me, e.native, hoveredItem); + } + } + } +}); + +function createNewLegendAndAttach(chart, legendOpts) { + var legend = new Legend({ + ctx: chart.ctx, + options: legendOpts, + chart: chart + }); + + core_layouts.configure(chart, legend, legendOpts); + core_layouts.addBox(chart, legend); + chart.legend = legend; +} + +var plugin_legend = { + id: 'legend', + + /** + * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making + * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Legend, + + beforeInit: function(chart) { + var legendOpts = chart.options.legend; + + if (legendOpts) { + createNewLegendAndAttach(chart, legendOpts); + } + }, + + beforeUpdate: function(chart) { + var legendOpts = chart.options.legend; + var legend = chart.legend; + + if (legendOpts) { + helpers$1.mergeIf(legendOpts, core_defaults.global.legend); + + if (legend) { + core_layouts.configure(chart, legend, legendOpts); + legend.options = legendOpts; + } else { + createNewLegendAndAttach(chart, legendOpts); + } + } else if (legend) { + core_layouts.removeBox(chart, legend); + delete chart.legend; + } + }, + + afterEvent: function(chart, e) { + var legend = chart.legend; + if (legend) { + legend.handleEvent(e); + } + } +}; + +var noop$2 = helpers$1.noop; + +core_defaults._set('global', { + title: { + display: false, + fontStyle: 'bold', + fullWidth: true, + padding: 10, + position: 'top', + text: '', + weight: 2000 // by default greater than legend (1000) to be above + } +}); + +/** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ +var Title = core_element.extend({ + initialize: function(config) { + var me = this; + helpers$1.extend(me, config); + + // Contains hit boxes for each dataset (in dataset order) + me.legendHitBoxes = []; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + + beforeUpdate: noop$2, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: noop$2, + + // + + beforeSetDimensions: noop$2, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$2, + + // + + beforeBuildLabels: noop$2, + buildLabels: noop$2, + afterBuildLabels: noop$2, + + // + + beforeFit: noop$2, + fit: function() { + var me = this; + var opts = me.options; + var display = opts.display; + var minSize = me.minSize; + var lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1; + var fontOpts = helpers$1.options._parseFont(opts); + var textSize = display ? (lineCount * fontOpts.lineHeight) + (opts.padding * 2) : 0; + + if (me.isHorizontal()) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = textSize; + } else { + minSize.width = textSize; + minSize.height = me.maxHeight; // fill all the height + } + + me.width = minSize.width; + me.height = minSize.height; + + }, + afterFit: noop$2, + + // Shared Methods + isHorizontal: function() { + var pos = this.options.position; + return pos === 'top' || pos === 'bottom'; + }, + + // Actually draw the title block on the canvas + draw: function() { + var me = this; + var ctx = me.ctx; + var opts = me.options; + + if (opts.display) { + var fontOpts = helpers$1.options._parseFont(opts); + var lineHeight = fontOpts.lineHeight; + var offset = lineHeight / 2 + opts.padding; + var rotation = 0; + var top = me.top; + var left = me.left; + var bottom = me.bottom; + var right = me.right; + var maxWidth, titleX, titleY; + + ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour + ctx.font = fontOpts.string; + + // Horizontal + if (me.isHorizontal()) { + titleX = left + ((right - left) / 2); // midpoint of the width + titleY = top + offset; + maxWidth = right - left; + } else { + titleX = opts.position === 'left' ? left + offset : right - offset; + titleY = top + ((bottom - top) / 2); + maxWidth = bottom - top; + rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); + } + + ctx.save(); + ctx.translate(titleX, titleY); + ctx.rotate(rotation); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + var text = opts.text; + if (helpers$1.isArray(text)) { + var y = 0; + for (var i = 0; i < text.length; ++i) { + ctx.fillText(text[i], 0, y, maxWidth); + y += lineHeight; + } + } else { + ctx.fillText(text, 0, 0, maxWidth); + } + + ctx.restore(); + } + } +}); + +function createNewTitleBlockAndAttach(chart, titleOpts) { + var title = new Title({ + ctx: chart.ctx, + options: titleOpts, + chart: chart + }); + + core_layouts.configure(chart, title, titleOpts); + core_layouts.addBox(chart, title); + chart.titleBlock = title; +} + +var plugin_title = { + id: 'title', + + /** + * Backward compatibility: since 2.1.5, the title is registered as a plugin, making + * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Title, + + beforeInit: function(chart) { + var titleOpts = chart.options.title; + + if (titleOpts) { + createNewTitleBlockAndAttach(chart, titleOpts); + } + }, + + beforeUpdate: function(chart) { + var titleOpts = chart.options.title; + var titleBlock = chart.titleBlock; + + if (titleOpts) { + helpers$1.mergeIf(titleOpts, core_defaults.global.title); + + if (titleBlock) { + core_layouts.configure(chart, titleBlock, titleOpts); + titleBlock.options = titleOpts; + } else { + createNewTitleBlockAndAttach(chart, titleOpts); + } + } else if (titleBlock) { + core_layouts.removeBox(chart, titleBlock); + delete chart.titleBlock; + } + } +}; + +var plugins = {}; +var filler = plugin_filler; +var legend = plugin_legend; +var title = plugin_title; +plugins.filler = filler; +plugins.legend = legend; +plugins.title = title; + +/** + * @namespace Chart + */ + + +core_controller.helpers = helpers$1; + +// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! +core_helpers(core_controller); + +core_controller._adapters = core_adapters; +core_controller.Animation = core_animation; +core_controller.animationService = core_animations; +core_controller.controllers = controllers; +core_controller.DatasetController = core_datasetController; +core_controller.defaults = core_defaults; +core_controller.Element = core_element; +core_controller.elements = elements; +core_controller.Interaction = core_interaction; +core_controller.layouts = core_layouts; +core_controller.platform = platform; +core_controller.plugins = core_plugins; +core_controller.Scale = core_scale; +core_controller.scaleService = core_scaleService; +core_controller.Ticks = core_ticks; +core_controller.Tooltip = core_tooltip; + +// Register built-in scales + +core_controller.helpers.each(scales, function(scale, type) { + core_controller.scaleService.registerScaleType(type, scale, scale._defaults); +}); + +// Load to register built-in adapters (as side effects) + + +// Loading built-in plugins + +for (var k in plugins) { + if (plugins.hasOwnProperty(k)) { + core_controller.plugins.register(plugins[k]); + } +} + +core_controller.platform.initialize(); + +var src = core_controller; +if (typeof window !== 'undefined') { + window.Chart = core_controller; +} + +// DEPRECATIONS + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Chart + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +core_controller.Chart = core_controller; + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Legend + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.Legend = plugins.legend._element; + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Title + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.Title = plugins.title._element; + +/** + * Provided for backward compatibility, use Chart.plugins instead + * @namespace Chart.pluginService + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.pluginService = core_controller.plugins; + +/** + * Provided for backward compatibility, inheriting from Chart.PlugingBase has no + * effect, instead simply create/register plugins via plain JavaScript objects. + * @interface Chart.PluginBase + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ +core_controller.PluginBase = core_controller.Element.extend({}); + +/** + * Provided for backward compatibility, use Chart.helpers.canvas instead. + * @namespace Chart.canvasHelpers + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +core_controller.canvasHelpers = core_controller.helpers.canvas; + +/** + * Provided for backward compatibility, use Chart.layouts instead. + * @namespace Chart.layoutService + * @deprecated since version 2.7.3 + * @todo remove at version 3 + * @private + */ +core_controller.layoutService = core_controller.layouts; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.LinearScaleBase + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ +core_controller.LinearScaleBase = scale_linearbase; + +/** + * Provided for backward compatibility, instead we should create a new Chart + * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ +core_controller.helpers.each( + [ + 'Bar', + 'Bubble', + 'Doughnut', + 'Line', + 'PolarArea', + 'Radar', + 'Scatter' + ], + function(klass) { + core_controller[klass] = function(ctx, cfg) { + return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, { + type: klass.charAt(0).toLowerCase() + klass.slice(1) + })); + }; + } +); + +return src; + +}))); From 6b316c678d31b09390fe67ed691999793cc5c260 Mon Sep 17 00:00:00 2001 From: Preksha Pandey Date: Sun, 19 May 2019 14:48:03 +0530 Subject: [PATCH 018/166] Delete javascript.js --- SRIP/Libraries/javascript.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 SRIP/Libraries/javascript.js diff --git a/SRIP/Libraries/javascript.js b/SRIP/Libraries/javascript.js deleted file mode 100644 index f504a95f..00000000 --- a/SRIP/Libraries/javascript.js +++ /dev/null @@ -1 +0,0 @@ -javascript \ No newline at end of file From 97ddb0c6abef10b5c9d0e10a852170368012fb77 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sun, 19 May 2019 14:48:42 +0530 Subject: [PATCH 019/166] Initial display of the experiment when it opened for the first time --- SRIP/Libraries/javascript.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 SRIP/Libraries/javascript.js diff --git a/SRIP/Libraries/javascript.js b/SRIP/Libraries/javascript.js deleted file mode 100644 index f504a95f..00000000 --- a/SRIP/Libraries/javascript.js +++ /dev/null @@ -1 +0,0 @@ -javascript \ No newline at end of file From 95e1bb1060cc4b25bb65fcd1c2f688a8584c26b7 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 20 May 2019 11:53:32 +0530 Subject: [PATCH 020/166] Adding the code files with some modification from the previous result --- SRIP/Codes/exp3.css | 2 +- SRIP/Codes/exp3.html | 16 ++++++++----- SRIP/Codes/exp3.js | 53 +++++++++++++++++++++++++++++++++++++++----- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/SRIP/Codes/exp3.css b/SRIP/Codes/exp3.css index 1065fa18..39380894 100644 --- a/SRIP/Codes/exp3.css +++ b/SRIP/Codes/exp3.css @@ -69,4 +69,4 @@ body { .column1 { width: 100%; } -} \ No newline at end of file +} diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html index 3496b05d..d743d3a8 100644 --- a/SRIP/Codes/exp3.html +++ b/SRIP/Codes/exp3.html @@ -1,6 +1,7 @@ + Pattern Recognition: Experiment 3- Perceptron @@ -16,6 +17,7 @@

+
@@ -25,18 +27,19 @@

Add Data

- - + +

Steps

- - - + + + +
@@ -57,7 +60,8 @@

Learning Parameter

Status

-

Status

+
+
diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 5d7c2eb1..cee72007 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -2,9 +2,52 @@ var xaxis = [-1.00, -0.75, -0.50, -0.25, 0.00, 0.25, 0.50, 0.75, 1.00]; var ctx = document.getElementById("graph1"); var myChart = new Chart(ctx, { - type: 'line', - data: { - labels: xaxis - } + type: 'line', + data: { + labels: xaxis + } -}); \ No newline at end of file +}); + +var xaxis = [-1.00, -0.75, -0.50, -0.25, 0.00, 0.25, 0.50, 0.75, 1.00]; +var ctx = document.getElementById("graph2"); +var myChart = new Chart(ctx, { + type: 'line', + data: { + labels: xaxis, + dataset: [] + } + +}); + + +/*Generating a Random number*/ +var randomNumberBetween0and19 = Math.floor(Math.random() * 20); + +function randomWholeNum() { + return Math.random(); +} + + + +function changeStatusStep(){ + document.getElementById("column1").innerHTML = "iterations:2"; + document.getElementById('Step').style.visibility="hidden"; + document.getElementById('Step100').style.visibility="hidden"; +} + +function changeStatusStep100(){ + document.getElementById("column2").innerHTML = "Classes Separated, iterations:2"; + document.getElementById('Step').style.visibility="hidden"; + document.getElementById('Step100').style.visibility="hidden"; +} + +function changeStatusClear(){ + document.getElementById("column1").innerHTML = ""; + document.getElementById("column2").innerHTML = ""; +} + +function start(){ + document.getElementById('Step').style.visibility="visible"; + document.getElementById('Step100').style.visibility="visible"; +} \ No newline at end of file From 49a5a8959d3d9597c35931101966dd679305e53e Mon Sep 17 00:00:00 2001 From: Preksha Pandey Date: Mon, 20 May 2019 11:57:16 +0530 Subject: [PATCH 021/166] Readme File --- SRIP/README.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 SRIP/README.txt diff --git a/SRIP/README.txt b/SRIP/README.txt new file mode 100644 index 00000000..9ed4034f --- /dev/null +++ b/SRIP/README.txt @@ -0,0 +1 @@ +This is Readme file containing instruction for running the experiment: Perceptron From d45fa49f9335abc7941a742407e323d015190dd9 Mon Sep 17 00:00:00 2001 From: Preksha Pandey Date: Mon, 20 May 2019 12:00:23 +0530 Subject: [PATCH 022/166] README File --- SRIP/README.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/SRIP/README.txt b/SRIP/README.txt index 9ed4034f..7a87c55f 100644 --- a/SRIP/README.txt +++ b/SRIP/README.txt @@ -1 +1,8 @@ This is Readme file containing instruction for running the experiment: Perceptron + +To run the experiment of perceptron: +1. Download the SRIP folder +2. Go to Codes folder +3. Run the .html file + +HTML file will open in the browser and all functionalities will run from the HTML file From 0fb79a82a8d12ebe7a84f8d9c6a2ad438d39fe41 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Tue, 21 May 2019 10:46:34 +0530 Subject: [PATCH 023/166] User input buttons added --- SRIP/Codes/exp3.css | 43 +++++++++++++++--------- SRIP/Codes/exp3.html | 44 +++++++++++++++++-------- SRIP/Codes/exp3.js | 78 +++++++++++++++++++++++++++++--------------- 3 files changed, 109 insertions(+), 56 deletions(-) diff --git a/SRIP/Codes/exp3.css b/SRIP/Codes/exp3.css index 39380894..e75988c8 100644 --- a/SRIP/Codes/exp3.css +++ b/SRIP/Codes/exp3.css @@ -15,35 +15,37 @@ body { margin: 50px auto; } + + .row:after { - content: ""; - display: table; - clear: both; + content: ""; + display: table; + clear: both; } @media screen and (max-width:600px) { - .graph { - width: 100%; + .graph { + width: 100%; } } /* 1st row Input Output Layout */ -.column0 { - float: left; - padding: 10px; +.column-0 { + float: left; + padding: 10px; } -.column0.side { - width: 37.5%; +.column-0.side { + width: 37.5%; } -.column0.right { - width: 25%; +.column-0.right { + width: 25%; } @media screen and (max-width: 600px) { - .column0.side, .column0.right { - width: 100%; + .column-0.side, .column-0.right { + width: 100%; } } @@ -53,7 +55,7 @@ body { /* 2nd row Input Output Layout */ -.column1 { +.column-1 { float: left; width: 37.5%; padding: 15px; @@ -66,7 +68,16 @@ body { } @media screen and (max-width:600px) { - .column1 { + .column-1 { width: 100%; } } + + +#input-data-from-user-class1{ + visibility: hidden; +} + +#input-data-from-user-class2{ + visibility: hidden; +} \ No newline at end of file diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html index d743d3a8..a611b5ff 100644 --- a/SRIP/Codes/exp3.html +++ b/SRIP/Codes/exp3.html @@ -1,6 +1,7 @@ + Pattern Recognition: Experiment 3- Perceptron @@ -13,37 +14,37 @@
- +
- +
-
+

Add Data

- - + +
-
+

Steps

- + - - + +
-
+

Learning Parameter

+ +
+
+ X Value: + + +
+
+ + diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index cee72007..f47f2ce9 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -1,18 +1,43 @@ -/*Creating Graph1*/ +/*Creating Graph 1*/ +var dps = []; var xaxis = [-1.00, -0.75, -0.50, -0.25, 0.00, 0.25, 0.50, 0.75, 1.00]; -var ctx = document.getElementById("graph1"); -var myChart = new Chart(ctx, { - type: 'line', +var ctx = document.getElementById("graph-1"); +var myChart1 = new Chart(ctx, { + type: 'scatter', data: { labels: xaxis } }); -var xaxis = [-1.00, -0.75, -0.50, -0.25, 0.00, 0.25, 0.50, 0.75, 1.00]; -var ctx = document.getElementById("graph2"); -var myChart = new Chart(ctx, { - type: 'line', +function addClass1(){ + document.getElementById("input-data-from-user-class1").style.visibility="visible"; +} + +function addClass2(){ + document.getElementById("input-data-from-user-class2").style.visibility="visible"; +} + + +function addDataPoints() { + xValue = Number(document.getElementById("xValue").value); + dps.push({ + x: xValue, + }); + myChart1.render(); +} + +function renderButton(){ + var renderButton = document.getElementById("renderButton"); +renderButton.addEventListener("click", addDataPoints); +myChart1.update(); +} + + +/*Creating Graph 2 */ +var ctx = document.getElementById("graph-2"); +var myChart2 = new Chart(ctx, { + type: 'scatter', data: { labels: xaxis, dataset: [] @@ -21,33 +46,34 @@ var myChart = new Chart(ctx, { }); -/*Generating a Random number*/ -var randomNumberBetween0and19 = Math.floor(Math.random() * 20); +/* On clicking the Start button*/ +function start(){ + document.getElementById('step').style.visibility="visible"; + document.getElementById('step-100').style.visibility="visible"; -function randomWholeNum() { - return Math.random(); + } - - +/* On clicking the Step button*/ function changeStatusStep(){ - document.getElementById("column1").innerHTML = "iterations:2"; - document.getElementById('Step').style.visibility="hidden"; - document.getElementById('Step100').style.visibility="hidden"; + document.getElementById("column-1").innerHTML = "iterations:2"; + document.getElementById('step').style.visibility="hidden"; + document.getElementById('step-100').style.visibility="hidden"; } +/* On clicking the Step100 button*/ function changeStatusStep100(){ - document.getElementById("column2").innerHTML = "Classes Separated, iterations:2"; - document.getElementById('Step').style.visibility="hidden"; - document.getElementById('Step100').style.visibility="hidden"; + document.getElementById("column-2").innerHTML = "Classes Separated, iterations:2"; + document.getElementById('step').style.visibility="hidden"; + document.getElementById('step-100').style.visibility="hidden"; } +/* On clicking the Clear button*/ function changeStatusClear(){ - document.getElementById("column1").innerHTML = ""; - document.getElementById("column2").innerHTML = ""; + document.getElementById("column-1").innerHTML = ""; + document.getElementById("column-2").innerHTML = ""; + document.getElementById("input-data-from-user-class1").style.visibility="hidden"; + document.getElementById("input-data-from-user-class2").style.visibility="hidden"; + myLineChart1.reset(); } -function start(){ - document.getElementById('Step').style.visibility="visible"; - document.getElementById('Step100').style.visibility="visible"; -} \ No newline at end of file From 90b7d746d2d52898bac66ee8022c52fecb866be5 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Tue, 21 May 2019 10:47:47 +0530 Subject: [PATCH 024/166] User input buttons added --- SRIP/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRIP/README.txt b/SRIP/README.txt index 7a87c55f..0246f7ac 100644 --- a/SRIP/README.txt +++ b/SRIP/README.txt @@ -1,4 +1,4 @@ -This is Readme file containing instruction for running the experiment: Perceptron +This is Readme file containing instruction for running the experiment: Perceptron To run the experiment of perceptron: 1. Download the SRIP folder From c4bba32c693337982ad2180b43eacf959cd276f4 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Tue, 21 May 2019 21:56:42 +0530 Subject: [PATCH 025/166] Functional Graphs added --- SRIP/Codes/exp3.html | 19 ++++++----- SRIP/Codes/exp3.js | 79 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 74 insertions(+), 24 deletions(-) diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html index a611b5ff..3a448ccf 100644 --- a/SRIP/Codes/exp3.html +++ b/SRIP/Codes/exp3.html @@ -5,10 +5,11 @@ Pattern Recognition: Experiment 3- Perceptron - + + - + @@ -74,20 +75,20 @@

Value of a

- X Value: + X Value- Class 1: - +
-
- X Value: +
- + \ No newline at end of file diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index f47f2ce9..645fadf1 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -1,15 +1,68 @@ /*Creating Graph 1*/ -var dps = []; +var color = Chart.helpers.color; var xaxis = [-1.00, -0.75, -0.50, -0.25, 0.00, 0.25, 0.50, 0.75, 1.00]; -var ctx = document.getElementById("graph-1"); -var myChart1 = new Chart(ctx, { - type: 'scatter', - data: { - labels: xaxis - } - + +function generateData() { + var data = []; + data.push({ + x: '0', + y: '0' + }); + return data; +} + + +function addDataPoints() { + var data=[]; + xValue = Number(document.getElementById("xValue").value); + data.push({ + x: xValue, + }); + return data; + +} + +var myChart1 = { + datasets: [{ + label: 'Class 1', + borderColor: window.chartColors.red, + backgroundColor: color(window.chartColors.red).alpha(0.2).rgbString(), + data: generateData() + }, { + label: 'Class 2', + borderColor: window.chartColors.blue, + backgroundColor: color(window.chartColors.blue).alpha(0.2).rgbString(), + data: generateData() + }] +}; + + +window.onload = function(){ + var ctx = document.getElementById("graph-1"); + window.myScatter = Chart.Scatter(ctx, { + label: xaxis, + data: myChart1 + }) +} + +document.getElementById('addButton').addEventListener('click', function() { + myChart1.datasets.forEach(function(dataset) { + dataset.data = dataset.data.map(function() { + return { + x: randomScalingFactor(), + y: '0' + }; + }); + }); + window.myScatter.update(); }); + + + + + + function addClass1(){ document.getElementById("input-data-from-user-class1").style.visibility="visible"; } @@ -24,13 +77,9 @@ function addDataPoints() { dps.push({ x: xValue, }); - myChart1.render(); -} + myChart1.destroy(); + myChart1 = new Chart(ctx, { type: 'scatter', dataset: dps}); -function renderButton(){ - var renderButton = document.getElementById("renderButton"); -renderButton.addEventListener("click", addDataPoints); -myChart1.update(); } @@ -74,6 +123,6 @@ function changeStatusClear(){ document.getElementById("column-2").innerHTML = ""; document.getElementById("input-data-from-user-class1").style.visibility="hidden"; document.getElementById("input-data-from-user-class2").style.visibility="hidden"; - myLineChart1.reset(); + myChart1.reset(); } From 4d6e076d3bc1bc5e944ed7c8f8bae12d7b667646 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 22 May 2019 14:43:32 +0530 Subject: [PATCH 026/166] User Input taken for both the classes --- SRIP/Codes/exp3.html | 11 ++++---- SRIP/Codes/exp3.js | 62 +++++++++++++++++++++++--------------------- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html index 3a448ccf..0de1a959 100644 --- a/SRIP/Codes/exp3.html +++ b/SRIP/Codes/exp3.html @@ -31,7 +31,7 @@

Add Data

- +
@@ -77,13 +77,14 @@

Value of a

X Value- Class 1: - + +
- + +
diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 645fadf1..f94f9a31 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -1,7 +1,11 @@ /*Creating Graph 1*/ var color = Chart.helpers.color; var xaxis = [-1.00, -0.75, -0.50, -0.25, 0.00, 0.25, 0.50, 0.75, 1.00]; +var data1=[]; //for class 1 +var data2=[]; //for class 2 + +//Initializing the graph function generateData() { var data = []; data.push({ @@ -11,17 +15,27 @@ function generateData() { return data; } - -function addDataPoints() { - var data=[]; +//Manually adding data points for class 1 +function addDataPoints1() { xValue = Number(document.getElementById("xValue").value); - data.push({ + data1.push({ x: xValue, }); - return data; + console.log(data1); //Ctrl+Shift+J + return data1; //seeing the output in console window +} +//Manually adding data points for class 2 +function addDataPoints2() { + xValue = Number(document.getElementById("xValue").value); + data2.push({ + x: xValue, + }); + console.log(data2); //Ctrl+Shift+J + return data2; //seeing the output in console window } + var myChart1 = { datasets: [{ label: 'Class 1', @@ -45,43 +59,28 @@ window.onload = function(){ }) } -document.getElementById('addButton').addEventListener('click', function() { +document.getElementById('add-Data-Point').addEventListener('click', function() { myChart1.datasets.forEach(function(dataset) { - dataset.data = dataset.data.map(function() { - return { - x: randomScalingFactor(), - y: '0' - }; - }); + dataset.data.push(data1); }); - window.myScatter.update(); + window.myScatter.update() }); - - +//after clicking Add Class 1 button, Add Data Point button is made visible function addClass1(){ document.getElementById("input-data-from-user-class1").style.visibility="visible"; } +//after clicking Add Class 2 button, Add Data Point button is made visible function addClass2(){ document.getElementById("input-data-from-user-class2").style.visibility="visible"; } -function addDataPoints() { - xValue = Number(document.getElementById("xValue").value); - dps.push({ - x: xValue, - }); - myChart1.destroy(); - myChart1 = new Chart(ctx, { type: 'scatter', dataset: dps}); - -} - /*Creating Graph 2 */ var ctx = document.getElementById("graph-2"); @@ -95,14 +94,14 @@ var myChart2 = new Chart(ctx, { }); + /* On clicking the Start button*/ function start(){ document.getElementById('step').style.visibility="visible"; document.getElementById('step-100').style.visibility="visible"; - - } + /* On clicking the Step button*/ function changeStatusStep(){ document.getElementById("column-1").innerHTML = "iterations:2"; @@ -110,6 +109,7 @@ function changeStatusStep(){ document.getElementById('step-100').style.visibility="hidden"; } + /* On clicking the Step100 button*/ function changeStatusStep100(){ document.getElementById("column-2").innerHTML = "Classes Separated, iterations:2"; @@ -117,12 +117,16 @@ function changeStatusStep100(){ document.getElementById('step-100').style.visibility="hidden"; } + /* On clicking the Clear button*/ -function changeStatusClear(){ +function Clear(){ document.getElementById("column-1").innerHTML = ""; document.getElementById("column-2").innerHTML = ""; document.getElementById("input-data-from-user-class1").style.visibility="hidden"; document.getElementById("input-data-from-user-class2").style.visibility="hidden"; - myChart1.reset(); + data1 = []; + data2 = []; + console.log(data1); + console.log(data2); } From d031cbab1f9da4681f17cd67c4eb520964a26cab Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 22 May 2019 18:23:25 +0530 Subject: [PATCH 027/166] User Input taken for both the classes --- SRIP/Codes/exp3.html | 8 ++--- SRIP/Codes/exp3.js | 80 +++++++++++++++++++++++++++----------------- 2 files changed, 54 insertions(+), 34 deletions(-) diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html index 0de1a959..feae1208 100644 --- a/SRIP/Codes/exp3.html +++ b/SRIP/Codes/exp3.html @@ -31,7 +31,7 @@

Add Data

- +
@@ -76,13 +76,13 @@

Value of a

X Value- Class 1: - + - +
X Value- Class 2: - +
diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index f94f9a31..00a83b89 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -1,6 +1,7 @@ /*Creating Graph 1*/ var color = Chart.helpers.color; var xaxis = [-1.00, -0.75, -0.50, -0.25, 0.00, 0.25, 0.50, 0.75, 1.00]; +var finaldata = []; //dataset for Perceptron var data1=[]; //for class 1 var data2=[]; //for class 2 @@ -17,9 +18,13 @@ function generateData() { //Manually adding data points for class 1 function addDataPoints1() { - xValue = Number(document.getElementById("xValue").value); + xValue1 = Number(document.getElementById("xValue1").value); + finaldata.push({ + x: xValue1, + }); + console.log(finaldata); data1.push({ - x: xValue, + x: xValue1, }); console.log(data1); //Ctrl+Shift+J return data1; //seeing the output in console window @@ -27,9 +32,13 @@ function addDataPoints1() { //Manually adding data points for class 2 function addDataPoints2() { - xValue = Number(document.getElementById("xValue").value); + xValue2 = Number(document.getElementById("xValue2").value); + finaldata.push({ + x: xValue2, + }); + console.log(finaldata); data2.push({ - x: xValue, + x: xValue2, }); console.log(data2); //Ctrl+Shift+J return data2; //seeing the output in console window @@ -37,37 +46,35 @@ function addDataPoints2() { var myChart1 = { - datasets: [{ - label: 'Class 1', - borderColor: window.chartColors.red, - backgroundColor: color(window.chartColors.red).alpha(0.2).rgbString(), - data: generateData() - }, { - label: 'Class 2', - borderColor: window.chartColors.blue, - backgroundColor: color(window.chartColors.blue).alpha(0.2).rgbString(), - data: generateData() - }] + type: 'scatter', + data:{ + datasets: [{ + label: 'Class 1', + backgroundColor: window.chartColors.red, + borderColor: window.chartColors.red, + data: generateData() + }, { + label: 'Class 2', + backgroundColor: window.chartColors.blue, + borderColor: window.chartColors.blue, + data: generateData() + }] + } }; window.onload = function(){ - var ctx = document.getElementById("graph-1"); - window.myScatter = Chart.Scatter(ctx, { - label: xaxis, - data: myChart1 - }) + var ctx = document.getElementById("graph-1").getContext('2d'); + window.myScatter = new Chart(ctx, myChart1); } -document.getElementById('add-Data-Point').addEventListener('click', function() { - myChart1.datasets.forEach(function(dataset) { +/*document.getElementById('add-Data-Point').addEventListener('click', function() { + myChart1.data.datasets.forEach(function(dataset) { dataset.data.push(data1); }); - window.myScatter.update() -}); - - - + window.myScatter.update(); + +});*/ //after clicking Add Class 1 button, Add Data Point button is made visible @@ -82,7 +89,7 @@ function addClass2(){ -/*Creating Graph 2 */ +/*Creating Graph 2*/ var ctx = document.getElementById("graph-2"); var myChart2 = new Chart(ctx, { type: 'scatter', @@ -95,6 +102,16 @@ var myChart2 = new Chart(ctx, { + + + + + + + + + + /* On clicking the Start button*/ function start(){ document.getElementById('step').style.visibility="visible"; @@ -119,14 +136,17 @@ function changeStatusStep100(){ /* On clicking the Clear button*/ -function Clear(){ +document.getElementById('clear').addEventListener('click', function() { document.getElementById("column-1").innerHTML = ""; document.getElementById("column-2").innerHTML = ""; document.getElementById("input-data-from-user-class1").style.visibility="hidden"; document.getElementById("input-data-from-user-class2").style.visibility="hidden"; data1 = []; data2 = []; + finaldata = []; console.log(data1); console.log(data2); -} + console.log(finaldata); + window.myScatter.reset(); +}) From dbe49ef36aa234b580c556a706c634003f021b08 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Fri, 24 May 2019 18:14:42 +0530 Subject: [PATCH 028/166] Perceptron algorithm with one iteration --- SRIP/Codes/exp3.html | 24 ++++++----- SRIP/Codes/exp3.js | 100 ++++++++++++++++++++++++++++++------------- 2 files changed, 85 insertions(+), 39 deletions(-) diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html index feae1208..b51e442b 100644 --- a/SRIP/Codes/exp3.html +++ b/SRIP/Codes/exp3.html @@ -8,6 +8,7 @@ + @@ -26,6 +27,19 @@
+ +
+

Learning Parameter

+ +
+ +

Add Data

@@ -45,16 +59,6 @@

Steps

-
-

Learning Parameter

- -
diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 00a83b89..02c6785c 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -1,9 +1,14 @@ -/*Creating Graph 1*/ var color = Chart.helpers.color; var xaxis = [-1.00, -0.75, -0.50, -0.25, 0.00, 0.25, 0.50, 0.75, 1.00]; -var finaldata = []; //dataset for Perceptron +var finaldata = {}; //dataset for Perceptron var data1=[]; //for class 1 +var count1=0; //count of all points of class 1 var data2=[]; //for class 2 +var count2=0; //count of all points of class 2 +var learningParameter; +var dataArray = []; +var q1=0; +var q2=0; //Initializing the graph @@ -19,13 +24,9 @@ function generateData() { //Manually adding data points for class 1 function addDataPoints1() { xValue1 = Number(document.getElementById("xValue1").value); - finaldata.push({ - x: xValue1, - }); - console.log(finaldata); - data1.push({ - x: xValue1, - }); + data1[q1] = xValue1; + q1++; + count1++; console.log(data1); //Ctrl+Shift+J return data1; //seeing the output in console window } @@ -33,18 +34,17 @@ function addDataPoints1() { //Manually adding data points for class 2 function addDataPoints2() { xValue2 = Number(document.getElementById("xValue2").value); - finaldata.push({ - x: xValue2, - }); - console.log(finaldata); - data2.push({ - x: xValue2, - }); + data2[q2] = xValue2; + q2++; + count2++; console.log(data2); //Ctrl+Shift+J return data2; //seeing the output in console window } + +//Graph 1 creation + var myChart1 = { type: 'scatter', data:{ @@ -100,24 +100,62 @@ var myChart2 = new Chart(ctx, { }); - - - - - - - - - - - - -/* On clicking the Start button*/ +/*to run the Perceptron Algorithm + On clicking the Start button*/ function start(){ document.getElementById('step').style.visibility="visible"; document.getElementById('step-100').style.visibility="visible"; + learningParameter = document.getElementById("learning-parameter").value; + for(var j=0;j0)||(activation>0 && dataArray[i][2]<0)){ + weights[0] = weights[0] + learningParameter*dataArray[i][2]*dataArray[i][0]; + weights[1] = weights[1] + learningParameter*dataArray[i][2]*dataArray[i][1]; + } + + } + } + console.log(weights); + + console.log(dataArray); + console.log(activation); +} + + /* On clicking the Step button*/ function changeStatusStep(){ @@ -144,6 +182,10 @@ document.getElementById('clear').addEventListener('click', function() { data1 = []; data2 = []; finaldata = []; + dataArray = []; + q1=0; + q2=0; + finaldata = []; console.log(data1); console.log(data2); console.log(finaldata); From d157a8a17d01d09a7809966835ca00ced7c8b238 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Fri, 24 May 2019 21:27:57 +0530 Subject: [PATCH 029/166] Perceptron algorithm with one iteration --- SRIP/Codes/exp3.js | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 02c6785c..850f6185 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -127,21 +127,37 @@ function start(){ } else{ dataArray[i][1] = -1.00; - dataArray[i][2] = 2; + dataArray[i][2] = -1; } } - - perceptronFunc(finaldata); } + + + +/*document.getElementById('start').addEventListener('click', function() { + for(var g=0; g<(count1); g++){ + myChart1.data.datasets.forEach(function(label) { + label.data.push(data1[g]); + }); + window.myScatter.update(); + +}); +*/ + + + + + + function perceptronFunc(finaldata){ var weights=[0, 0]; var bias=1; for(var i=0; i<(count1+count2); i++) { var activation = 0; for(var j=0; j<2; j++){ - activation = activation + (weights[j] * dataArray[i][j]); + activation = activation + (weights[j] * dataArray[i][j]) + bias; if((activation<=0 && dataArray[i][2]>0)||(activation>0 && dataArray[i][2]<0)){ weights[0] = weights[0] + learningParameter*dataArray[i][2]*dataArray[i][0]; weights[1] = weights[1] + learningParameter*dataArray[i][2]*dataArray[i][1]; From 7ca04e00d53819fb39ead74086942e6f8ae21f93 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 25 May 2019 14:52:34 +0530 Subject: [PATCH 030/166] Some code corrections made --- SRIP/Codes/exp3.js | 66 ++++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 850f6185..9d9babf8 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -1,5 +1,3 @@ -var color = Chart.helpers.color; -var xaxis = [-1.00, -0.75, -0.50, -0.25, 0.00, 0.25, 0.50, 0.75, 1.00]; var finaldata = {}; //dataset for Perceptron var data1=[]; //for class 1 var count1=0; //count of all points of class 1 @@ -15,14 +13,15 @@ var q2=0; function generateData() { var data = []; data.push({ - x: '0', - y: '0' + x: "0", + y: "0" }); return data; } //Manually adding data points for class 1 function addDataPoints1() { + var xValue1; xValue1 = Number(document.getElementById("xValue1").value); data1[q1] = xValue1; q1++; @@ -33,6 +32,7 @@ function addDataPoints1() { //Manually adding data points for class 2 function addDataPoints2() { + var xValue2; xValue2 = Number(document.getElementById("xValue2").value); data2[q2] = xValue2; q2++; @@ -49,12 +49,12 @@ var myChart1 = { type: 'scatter', data:{ datasets: [{ - label: 'Class 1', + label: "Class 1", backgroundColor: window.chartColors.red, borderColor: window.chartColors.red, data: generateData() }, { - label: 'Class 2', + label: "Class 2", backgroundColor: window.chartColors.blue, borderColor: window.chartColors.blue, data: generateData() @@ -64,7 +64,7 @@ var myChart1 = { window.onload = function(){ - var ctx = document.getElementById("graph-1").getContext('2d'); + var ctx = document.getElementById("graph-1"); window.myScatter = new Chart(ctx, myChart1); } @@ -100,11 +100,40 @@ var myChart2 = new Chart(ctx, { }); + + + +function perceptronFunc(finaldata){ + var weights=[0, 0]; + var bias=1; + for(var c=0; c<(count1+count2); c++) { + var activation = 0; + for(var d=0; d<2; d++){ + activation = activation + (weights[d] * dataArray[c][d]) + bias; + if((activation<=0 && dataArray[c][2]>0)||(activation>0 && dataArray[c][2]<0)){ + weights[0] = weights[0] + learningParameter*dataArray[c][2]*dataArray[c][0]; + weights[1] = weights[1] + learningParameter*dataArray[c][2]*dataArray[c][1]; + } + + } + } + console.log(weights); + + console.log(dataArray); + console.log(activation); +} + + + + + + + /*to run the Perceptron Algorithm On clicking the Start button*/ function start(){ - document.getElementById('step').style.visibility="visible"; - document.getElementById('step-100').style.visibility="visible"; + document.getElementById("step").style.visibility="visible"; + document.getElementById("step-100").style.visibility="visible"; learningParameter = document.getElementById("learning-parameter").value; for(var j=0;j0)||(activation>0 && dataArray[i][2]<0)){ - weights[0] = weights[0] + learningParameter*dataArray[i][2]*dataArray[i][0]; - weights[1] = weights[1] + learningParameter*dataArray[i][2]*dataArray[i][1]; - } - - } - } - console.log(weights); - - console.log(dataArray); - console.log(activation); -} From 85971210e44a0988481a0581a69b954426344d59 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 25 May 2019 15:10:37 +0530 Subject: [PATCH 031/166] Some code corrections made --- SRIP/Codes/exp3.js | 1 + 1 file changed, 1 insertion(+) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 9d9babf8..ebb09d0c 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -1,3 +1,4 @@ +var xaxis = [-1.0 ,-0.75, -0.50, -0.25, 0.0, 0.25, 0.50, 0.75, 1.0]; var finaldata = {}; //dataset for Perceptron var data1=[]; //for class 1 var count1=0; //count of all points of class 1 From 3015c2a151bcf6bca3afb3de4701aad17bbb84d1 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 25 May 2019 15:16:43 +0530 Subject: [PATCH 032/166] Some code corrections made --- SRIP/Codes/exp3.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index ebb09d0c..567c89db 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -47,7 +47,7 @@ function addDataPoints2() { //Graph 1 creation var myChart1 = { - type: 'scatter', + type: "scatter", data:{ datasets: [{ label: "Class 1", @@ -187,21 +187,21 @@ function start(){ /* On clicking the Step button*/ function changeStatusStep(){ document.getElementById("column-1").innerHTML = "iterations:2"; - document.getElementById('step').style.visibility="hidden"; - document.getElementById('step-100').style.visibility="hidden"; + document.getElementById("step").style.visibility="hidden"; + document.getElementById("step-100").style.visibility="hidden"; } /* On clicking the Step100 button*/ function changeStatusStep100(){ document.getElementById("column-2").innerHTML = "Classes Separated, iterations:2"; - document.getElementById('step').style.visibility="hidden"; - document.getElementById('step-100').style.visibility="hidden"; + document.getElementById("step").style.visibility="hidden"; + document.getElementById("step-100").style.visibility="hidden"; } /* On clicking the Clear button*/ -document.getElementById('clear').addEventListener('click', function() { +document.getElementById("clear").addEventListener("click", function() { document.getElementById("column-1").innerHTML = ""; document.getElementById("column-2").innerHTML = ""; document.getElementById("input-data-from-user-class1").style.visibility="hidden"; From e4560baa73b7082129069d246f082a24a23d0ff7 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 25 May 2019 15:21:05 +0530 Subject: [PATCH 033/166] Some code corrections made --- SRIP/Codes/exp3.js | 42 +++++++----------------------------------- 1 file changed, 7 insertions(+), 35 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 567c89db..23ac7ccd 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -20,6 +20,7 @@ function generateData() { return data; } + //Manually adding data points for class 1 function addDataPoints1() { var xValue1; @@ -27,10 +28,11 @@ function addDataPoints1() { data1[q1] = xValue1; q1++; count1++; - console.log(data1); //Ctrl+Shift+J + //console.log(data1); //Ctrl+Shift+J return data1; //seeing the output in console window } + //Manually adding data points for class 2 function addDataPoints2() { var xValue2; @@ -38,14 +40,13 @@ function addDataPoints2() { data2[q2] = xValue2; q2++; count2++; - console.log(data2); //Ctrl+Shift+J + //console.log(data2); //Ctrl+Shift+J return data2; //seeing the output in console window } //Graph 1 creation - var myChart1 = { type: "scatter", data:{ @@ -83,6 +84,7 @@ function addClass1(){ document.getElementById("input-data-from-user-class1").style.visibility="visible"; } + //after clicking Add Class 2 button, Add Data Point button is made visible function addClass2(){ document.getElementById("input-data-from-user-class2").style.visibility="visible"; @@ -103,7 +105,7 @@ var myChart2 = new Chart(ctx, { - +//Perceptron function function perceptronFunc(finaldata){ var weights=[0, 0]; var bias=1; @@ -118,18 +120,10 @@ function perceptronFunc(finaldata){ } } - console.log(weights); - - console.log(dataArray); console.log(activation); } - - - - - /*to run the Perceptron Algorithm On clicking the Start button*/ function start(){ @@ -165,25 +159,6 @@ function start(){ - -/*document.getElementById('start').addEventListener('click', function() { - for(var g=0; g<(count1); g++){ - myChart1.data.datasets.forEach(function(label) { - label.data.push(data1[g]); - }); - window.myScatter.update(); - -}); -*/ - - - - - - - - - /* On clicking the Step button*/ function changeStatusStep(){ document.getElementById("column-1").innerHTML = "iterations:2"; @@ -213,9 +188,6 @@ document.getElementById("clear").addEventListener("click", function() { q1=0; q2=0; finaldata = []; - console.log(data1); - console.log(data2); - console.log(finaldata); - window.myScatter.reset(); + //window.myScatter.reset(); }) From 1ac8a7013cee7a7ab0607c742a82e3df433c52c7 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 25 May 2019 15:25:12 +0530 Subject: [PATCH 034/166] Some code corrections made --- SRIP/Codes/exp3.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 23ac7ccd..30e4eb8c 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -75,7 +75,6 @@ window.onload = function(){ dataset.data.push(data1); }); window.myScatter.update(); - });*/ @@ -95,13 +94,9 @@ function addClass2(){ /*Creating Graph 2*/ var ctx = document.getElementById("graph-2"); var myChart2 = new Chart(ctx, { - type: 'scatter', - data: { - labels: xaxis, - dataset: [] - } - -}); + type: "scatter", + data: {labels: xaxis, dataset: []} + }); From 17d949991f747caf90bfadda1523e19dad8338c7 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 25 May 2019 15:27:20 +0530 Subject: [PATCH 035/166] Some code corrections made --- SRIP/Codes/exp3.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 30e4eb8c..0ea66404 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -95,7 +95,10 @@ function addClass2(){ var ctx = document.getElementById("graph-2"); var myChart2 = new Chart(ctx, { type: "scatter", - data: {labels: xaxis, dataset: []} + data: { + labels: xaxis, + dataset: [] + } }); From 876dffc8d95f04050bdbac9f52011069886622dc Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 25 May 2019 15:30:02 +0530 Subject: [PATCH 036/166] Some code corrections made --- SRIP/Codes/exp3.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 0ea66404..64a3f4b6 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -96,8 +96,8 @@ var ctx = document.getElementById("graph-2"); var myChart2 = new Chart(ctx, { type: "scatter", data: { - labels: xaxis, - dataset: [] + labels: xaxis, + dataset: [] } }); From 9e82024544d8446b606b7021feaab537781c6056 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 27 May 2019 14:51:54 +0530 Subject: [PATCH 037/166] New input type --- SRIP/Codes/exp3.html | 28 ++++++++--- SRIP/Codes/exp3.js | 115 +++++++++++++++++++++++++++++-------------- 2 files changed, 98 insertions(+), 45 deletions(-) diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html index b51e442b..cbacbb1c 100644 --- a/SRIP/Codes/exp3.html +++ b/SRIP/Codes/exp3.html @@ -79,15 +79,29 @@

Value of a

- X Value- Class 1: - - - +

+ X Value- Class 1: + + +

+

+ Y Value- Class 1: + + + +

- X Value- Class 2: - - +

+ X Value- Class 2: + + +

+

+ Y Value- Class 2: + + +

diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 64a3f4b6..4dbfb8fd 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -1,8 +1,10 @@ var xaxis = [-1.0 ,-0.75, -0.50, -0.25, 0.0, 0.25, 0.50, 0.75, 1.0]; -var finaldata = {}; //dataset for Perceptron +var finaldata = []; //dataset for Perceptron var data1=[]; //for class 1 + var count1=0; //count of all points of class 1 var data2=[]; //for class 2 + var count2=0; //count of all points of class 2 var learningParameter; var dataArray = []; @@ -22,28 +24,49 @@ function generateData() { //Manually adding data points for class 1 -function addDataPoints1() { +function addDataPoints1x() { var xValue1; xValue1 = Number(document.getElementById("xValue1").value); data1[q1] = xValue1; q1++; count1++; - //console.log(data1); //Ctrl+Shift+J + console.log(data1); //Ctrl+Shift+J return data1; //seeing the output in console window } +function addDataPoints1y() { + var yValue1; + yValue1 = Number(document.getElementById("yValue1").value); + data1[q1] = yValue1; + q1++; + count1++; + console.log(data1); + return data1; +} + //Manually adding data points for class 2 -function addDataPoints2() { +function addDataPoints2x() { var xValue2; xValue2 = Number(document.getElementById("xValue2").value); data2[q2] = xValue2; q2++; count2++; - //console.log(data2); //Ctrl+Shift+J + console.log(data2); //Ctrl+Shift+J return data2; //seeing the output in console window } +function addDataPoints2y() { + var yValue2; + yValue2 = Number(document.getElementById("yValue2").value); + data2[q2] = yValue2; + q2++; + count2++; + console.log(data2); + return data2; +} + + //Graph 1 creation @@ -104,21 +127,26 @@ var myChart2 = new Chart(ctx, { //Perceptron function -function perceptronFunc(finaldata){ +function perceptronFunc(dataArray){ var weights=[0, 0]; var bias=1; - for(var c=0; c<(count1+count2); c++) { - var activation = 0; - for(var d=0; d<2; d++){ - activation = activation + (weights[d] * dataArray[c][d]) + bias; - if((activation<=0 && dataArray[c][2]>0)||(activation>0 && dataArray[c][2]<0)){ - weights[0] = weights[0] + learningParameter*dataArray[c][2]*dataArray[c][0]; - weights[1] = weights[1] + learningParameter*dataArray[c][2]*dataArray[c][1]; - } + //var n_epoch=20; + //for(var epoch=0; epoch0 && dataArray[c][2]==0)){ + weights[0] = weights[0] + learningParameter*dataArray[c][2]*dataArray[c][0]; + weights[1] = weights[1] + learningParameter*dataArray[c][2]*dataArray[c][1]; + } + } } - } - console.log(activation); + //} + + console.log(dataArray); + console.log(weights); } @@ -128,31 +156,43 @@ function start(){ document.getElementById("step").style.visibility="visible"; document.getElementById("step-100").style.visibility="visible"; learningParameter = document.getElementById("learning-parameter").value; - for(var j=0;j Date: Mon, 27 May 2019 14:57:18 +0530 Subject: [PATCH 038/166] New input type --- SRIP/Codes/exp3.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 4dbfb8fd..41b20d88 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -130,11 +130,12 @@ var myChart2 = new Chart(ctx, { function perceptronFunc(dataArray){ var weights=[0, 0]; var bias=1; + var c=0, d=0; //var n_epoch=20; //for(var epoch=0; epoch0 && dataArray[c][2]==0)){ weights[0] = weights[0] + learningParameter*dataArray[c][2]*dataArray[c][0]; @@ -157,8 +158,9 @@ function start(){ document.getElementById("step-100").style.visibility="visible"; learningParameter = document.getElementById("learning-parameter").value; + var i=0; - for(var i=0; i<(count1+count2); i++){ + for(i=0; i<(count1+count2); i++){ if(i Date: Mon, 27 May 2019 15:01:42 +0530 Subject: [PATCH 039/166] New input type --- SRIP/Codes/exp3.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 41b20d88..ab2aea95 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -1,10 +1,8 @@ var xaxis = [-1.0 ,-0.75, -0.50, -0.25, 0.0, 0.25, 0.50, 0.75, 1.0]; var finaldata = []; //dataset for Perceptron var data1=[]; //for class 1 - var count1=0; //count of all points of class 1 var data2=[]; //for class 2 - var count2=0; //count of all points of class 2 var learningParameter; var dataArray = []; @@ -67,8 +65,6 @@ function addDataPoints2y() { } - - //Graph 1 creation var myChart1 = { type: "scatter", @@ -113,7 +109,6 @@ function addClass2(){ } - /*Creating Graph 2*/ var ctx = document.getElementById("graph-2"); var myChart2 = new Chart(ctx, { @@ -125,16 +120,15 @@ var myChart2 = new Chart(ctx, { }); - //Perceptron function function perceptronFunc(dataArray){ var weights=[0, 0]; var bias=1; var c=0, d=0; + var activation = 0; //var n_epoch=20; //for(var epoch=0; epoch0 && dataArray[c][2]==0)){ @@ -228,5 +222,5 @@ document.getElementById("clear").addEventListener("click", function() { q2=0; finaldata = []; //window.myScatter.reset(); -}) +}); From 323e87f8837126b382009070f3363a01e308b0cd Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 27 May 2019 16:21:41 +0530 Subject: [PATCH 040/166] Perceptron algorithm completed --- SRIP/Codes/exp3.js | 59 ++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index ab2aea95..552de161 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -8,7 +8,10 @@ var learningParameter; var dataArray = []; var q1=0; var q2=0; - +var weights=[0, 0]; +var bias=1; +var c=0, d=0; +var activation = 0; //Initializing the graph function generateData() { @@ -121,27 +124,31 @@ var myChart2 = new Chart(ctx, { //Perceptron function -function perceptronFunc(dataArray){ - var weights=[0, 0]; - var bias=1; - var c=0, d=0; - var activation = 0; - //var n_epoch=20; - //for(var epoch=0; epoch0 && dataArray[c][2]==0)){ - weights[0] = weights[0] + learningParameter*dataArray[c][2]*dataArray[c][0]; - weights[1] = weights[1] + learningParameter*dataArray[c][2]*dataArray[c][1]; - } - - } - } - //} - - console.log(dataArray); - console.log(weights); +function predict(c, weights){ + for(d=0; d<2; d++) + activation = activation + (weights[d] * dataArray[c][d]) + bias; + if(activation>=0.0) + return 1.0; + else + return 0.0; + +} +function perceptronTrainWeights(dataArray, learningParameter){ + var j=0; + var sum_error=0.0; + var error=0.0; + var n_epoch=5; + for(var epoch=0; epoch Date: Mon, 27 May 2019 16:26:12 +0530 Subject: [PATCH 041/166] Perceptron algorithm completed --- SRIP/Codes/exp3.js | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 552de161..e0c2aefc 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -125,27 +125,32 @@ var myChart2 = new Chart(ctx, { //Perceptron function function predict(c, weights){ - for(d=0; d<2; d++) + for(d=0; d<2; d++){ activation = activation + (weights[d] * dataArray[c][d]) + bias; - if(activation>=0.0) + } + if(activation>=0.0){ return 1.0; - else + } + else{ return 0.0; + } } function perceptronTrainWeights(dataArray, learningParameter){ var j=0; - var sum_error=0.0; - var error=0.0; - var n_epoch=5; + var sumError = 0; + var error = 0; + var n_epoch = 5; + var prediction = 0; for(var epoch=0; epoch Date: Mon, 27 May 2019 16:28:24 +0530 Subject: [PATCH 042/166] Perceptron algorithm completed --- SRIP/Codes/exp3.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index e0c2aefc..2a83fcfd 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -143,7 +143,7 @@ function perceptronTrainWeights(dataArray, learningParameter){ var n_epoch = 5; var prediction = 0; for(var epoch=0; epoch Date: Mon, 27 May 2019 20:05:25 +0530 Subject: [PATCH 043/166] Perceptron algorithm completed --- SRIP/Codes/exp3.html | 8 ++++---- SRIP/Codes/exp3.js | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html index cbacbb1c..8831fce6 100644 --- a/SRIP/Codes/exp3.html +++ b/SRIP/Codes/exp3.html @@ -32,10 +32,10 @@

Learning Parameter

diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 2a83fcfd..7602ff53 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -12,6 +12,8 @@ var weights=[0, 0]; var bias=1; var c=0, d=0; var activation = 0; +var k = 0.05; + //Initializing the graph function generateData() { From 996eb4961a3fa62aa8594f86ae0cebcfba2a4b90 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 27 May 2019 20:11:32 +0530 Subject: [PATCH 044/166] Perceptron algorithm completed --- SRIP/Codes/exp3.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 7602ff53..aaa6a76b 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -237,6 +237,11 @@ document.getElementById("clear").addEventListener("click", function() { count1=0; count2=0; finaldata = []; + weights = [0, 0]; + bias=1; + c=0; + d=0; + activation = 0; + k = 0.05; //window.myScatter.reset(); }); - From 5196a090166742578498199dcb78e58e0251c02e Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 27 May 2019 20:45:16 +0530 Subject: [PATCH 045/166] Perceptron algorithm completed --- SRIP/Codes/exp3.html | 4 ++-- SRIP/Codes/exp3.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html index 8831fce6..3243b974 100644 --- a/SRIP/Codes/exp3.html +++ b/SRIP/Codes/exp3.html @@ -71,8 +71,8 @@

Status

-

Value of a

-

[]

+

Value of Weights

+

[]

diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index aaa6a76b..3854e257 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -202,6 +202,7 @@ function start(){ } perceptronTrainWeights(dataArray, learningParameter); + document.getElementById("weights-return").innerHTML=weights; console.log(weights); } From 203ac53fd890abdef4cf92b7f8720127bc13238b Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 27 May 2019 20:50:01 +0530 Subject: [PATCH 046/166] Perceptron algorithm completed --- SRIP/Codes/exp3.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 3854e257..a0ead282 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -202,7 +202,7 @@ function start(){ } perceptronTrainWeights(dataArray, learningParameter); - document.getElementById("weights-return").innerHTML=weights; + document.getElementById("weights-return").textContent=weights; console.log(weights); } From 90462b39d71b30d9ae38fb5ba836921611f74657 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 29 May 2019 13:09:19 +0530 Subject: [PATCH 047/166] Perceptron algorithm completed --- SRIP/Codes/exp3.css | 118 ++++++++++++++++++++++++++++---------- SRIP/Codes/exp3.js | 134 +++++++++++++++++++++++++++----------------- 2 files changed, 169 insertions(+), 83 deletions(-) diff --git a/SRIP/Codes/exp3.css b/SRIP/Codes/exp3.css index e75988c8..81828b8e 100644 --- a/SRIP/Codes/exp3.css +++ b/SRIP/Codes/exp3.css @@ -1,54 +1,91 @@ * { - box-sizing: border-box; + +box-sizing: border-box; + } + body { - margin: 0; + +margin: 0; + } + /*Graphs Layout */ .graph { - float: left; - width: 50%; - padding: 15px; - max-width: 800px; - margin: 50px auto; + +float: left; + +width: 50%; + +padding: 15px; + +max-width: 800px; + +margin: 50px auto; + } .row:after { - content: ""; - display: table; - clear: both; + +content: ""; + +display: table; + +clear: both; + } + @media screen and (max-width:600px) { - .graph { - width: 100%; - } + +.graph { + +width: 100%; + +} + } + /* 1st row Input Output Layout */ .column-0 { - float: left; - padding: 10px; + +float: left; + +padding: 10px; + } + .column-0.side { - width: 37.5%; + +width: 37.5%; + } + .column-0.right { - width: 25%; + +width: 25%; + } + @media screen and (max-width: 600px) { - .column-0.side, .column-0.right { - width: 100%; - } + +.column-0.side, .column-0.right { + +width: 100%; + +} + } + .button{ margin:5px; } @@ -56,28 +93,47 @@ body { /* 2nd row Input Output Layout */ .column-1 { - float: left; - width: 37.5%; - padding: 15px; + +float: left; + +width: 37.5%; + +padding: 15px; + } + .row:after { - content: ""; - display: table; - clear: both; + +content: ""; + +display: table; + +clear: both; + } + @media screen and (max-width:600px) { - .column-1 { - width: 100%; - } + +.column-1 { + +width: 100%; + +} + } #input-data-from-user-class1{ - visibility: hidden; + +visibility: hidden; + } + #input-data-from-user-class2{ - visibility: hidden; + +visibility: hidden; + } \ No newline at end of file diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index a0ead282..71b62dfd 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -1,16 +1,18 @@ var xaxis = [-1.0 ,-0.75, -0.50, -0.25, 0.0, 0.25, 0.50, 0.75, 1.0]; var finaldata = []; //dataset for Perceptron -var data1=[]; //for class 1 -var count1=0; //count of all points of class 1 -var data2=[]; //for class 2 -var count2=0; //count of all points of class 2 +var chart1data = []; +var chart2data = []; +var data1 = []; //for class 1 +var count1 = 0; //count of all points of class 1 +var data2 = []; //for class 2 +var count2 = 0; //count of all points of class 2 var learningParameter; var dataArray = []; -var q1=0; -var q2=0; -var weights=[0, 0]; -var bias=1; -var c=0, d=0; +var q1 = 0; +var q2 = 0; +var weights = [0, 0]; +var bias = 1; +var c = 0, d = 0; var activation = 0; var k = 0.05; @@ -31,16 +33,23 @@ function addDataPoints1x() { var xValue1; xValue1 = Number(document.getElementById("xValue1").value); data1[q1] = xValue1; + chart1data.push({ + x: xValue1 + }); q1++; count1++; console.log(data1); //Ctrl+Shift+J return data1; //seeing the output in console window } + function addDataPoints1y() { var yValue1; yValue1 = Number(document.getElementById("yValue1").value); data1[q1] = yValue1; + chart1data.push({ + y: yValue1 + }); q1++; count1++; console.log(data1); @@ -53,16 +62,23 @@ function addDataPoints2x() { var xValue2; xValue2 = Number(document.getElementById("xValue2").value); data2[q2] = xValue2; + chart2data.push({ + x: xValue2 + }); q2++; count2++; console.log(data2); //Ctrl+Shift+J return data2; //seeing the output in console window } + function addDataPoints2y() { var yValue2; yValue2 = Number(document.getElementById("yValue2").value); data2[q2] = yValue2; + chart2data.push({ + y: yValue2 + }); q2++; count2++; console.log(data2); @@ -117,20 +133,15 @@ function addClass2(){ /*Creating Graph 2*/ var ctx = document.getElementById("graph-2"); var myChart2 = new Chart(ctx, { - type: "scatter", - data: { - labels: xaxis, - dataset: [] - } }); //Perceptron function function predict(c, weights){ - for(d=0; d<2; d++){ + for(d = 0; d < 2; d++){ activation = activation + (weights[d] * dataArray[c][d]) + bias; } - if(activation>=0.0){ + if(activation >= 0.0){ return 1.0; } else{ @@ -138,19 +149,21 @@ function predict(c, weights){ } } + + function perceptronTrainWeights(dataArray, learningParameter){ - var j=0; + var j = 0; var sumError = 0; - var error = 0; + var error = 1; var n_epoch = 5; var prediction = 0; - for(var epoch=0; epoch0){ sumError = 0; - for(c=0; c Date: Wed, 29 May 2019 13:14:57 +0530 Subject: [PATCH 048/166] Perceptron algorithm completed --- SRIP/Codes/exp3.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 71b62dfd..b2eb17d5 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -34,7 +34,7 @@ function addDataPoints1x() { xValue1 = Number(document.getElementById("xValue1").value); data1[q1] = xValue1; chart1data.push({ - x: xValue1 + x: xValue1 }); q1++; count1++; @@ -48,7 +48,7 @@ function addDataPoints1y() { yValue1 = Number(document.getElementById("yValue1").value); data1[q1] = yValue1; chart1data.push({ - y: yValue1 + y: yValue1 }); q1++; count1++; @@ -63,11 +63,11 @@ function addDataPoints2x() { xValue2 = Number(document.getElementById("xValue2").value); data2[q2] = xValue2; chart2data.push({ - x: xValue2 + x: xValue2 }); q2++; count2++; - console.log(data2); //Ctrl+Shift+J + //console.log(data2); //Ctrl+Shift+J return data2; //seeing the output in console window } @@ -77,11 +77,11 @@ function addDataPoints2y() { yValue2 = Number(document.getElementById("yValue2").value); data2[q2] = yValue2; chart2data.push({ - y: yValue2 + y: yValue2 }); q2++; count2++; - console.log(data2); + //console.log(data2); return data2; } @@ -218,17 +218,17 @@ function start(){ document.getElementById("weights-return").textContent = weights; var ctx = document.getElementById("graph-2"); var myChart2 = new Chart(ctx, { - type: 'line', + type: "line", data: { datasets: [{ - label: "Perceptron Line", - data: [{ - x: 0, - y: (-bias/weights[1]) - },{ - x: (-bias/weights[0]), - y: 0 - }], + label: "Perceptron Line", + data: [{ + x: 0, + y: (-bias/weights[1]) + },{ + x: (-bias/weights[0]), + y: 0 + }], }] } }); From fb3a760853b36fa2344683b725a3489ddb0a49df Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 29 May 2019 14:08:14 +0530 Subject: [PATCH 049/166] Perceptron algorithm completed --- SRIP/Codes/exp3.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index b2eb17d5..8d7f0233 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -1,4 +1,4 @@ -var xaxis = [-1.0 ,-0.75, -0.50, -0.25, 0.0, 0.25, 0.50, 0.75, 1.0]; +//var xaxis = [-1.0 ,-0.75, -0.50, -0.25, 0.0, 0.25, 0.50, 0.75, 1.0]; var finaldata = []; //dataset for Perceptron var chart1data = []; var chart2data = []; @@ -108,7 +108,7 @@ var myChart1 = { window.onload = function(){ var ctx = document.getElementById("graph-1"); window.myScatter = new Chart(ctx, myChart1); -} +}; /*document.getElementById('add-Data-Point').addEventListener('click', function() { myChart1.data.datasets.forEach(function(dataset) { @@ -157,7 +157,7 @@ function perceptronTrainWeights(dataArray, learningParameter){ var error = 1; var n_epoch = 5; var prediction = 0; - while(error>0){ + for(var epoch=0; epoch Date: Wed, 29 May 2019 17:08:33 +0530 Subject: [PATCH 050/166] Perceptron algorithm completed with graph --- SRIP/Codes/exp3.html | 1 + SRIP/Codes/exp3.js | 64 +++++++++++++++++++++++++++++--------------- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html index 3243b974..c67828e2 100644 --- a/SRIP/Codes/exp3.html +++ b/SRIP/Codes/exp3.html @@ -7,6 +7,7 @@ + diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 8d7f0233..dac35d71 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -136,6 +136,47 @@ var myChart2 = new Chart(ctx, { }); + + +function plotGraph(){ + console.log(-bias/weights[0]); + console.log(-bias/weights[1]); + console.log(chart1data); + console.log(chart2data); + var ptx = document.getElementById("graph-2"); + window.myLine = new Chart(ptx, { + type: "scatter", + data: { + //labels: [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + datasets: [{ + label: "Perceptron Line", + borderColor: window.chartColors.green, + data: [{ + x: (-bias/weights[0]), + y: 0 + },{ + x: 0, + y: (-bias/weights[1]) + }]/*}, { + label: "Class 1", + backgroundColor: window.chartColors.red, + borderColor: window.chartColors.red, + data: chart1data + },{ + label: "Class 2", + backgroundColor: window.chartColors.blue, + borderColor: window.chartColors.blue, + data: chart2data*/ + }] + }, + options: { + responsive: true + } + }); +} + + + //Perceptron function function predict(c, weights){ for(d = 0; d < 2; d++){ @@ -213,27 +254,8 @@ function start(){ } perceptronTrainWeights(dataArray, learningParameter); - console.log(chart1data); - console.log(chart2data); document.getElementById("weights-return").textContent = weights; - var ctx = document.getElementById("graph-2"); - var myChart2 = new Chart(ctx, { - type: "line", - data: { - datasets: [{ - label: "Perceptron Line", - data: [{ - x: 0, - y: (-bias/weights[1]) - },{ - x: (-bias/weights[0]), - y: 0 - }], - }] - } - }); - - console.log(weights); + plotGraph(); } @@ -275,4 +297,4 @@ document.getElementById("clear").addEventListener("click", function() { activation = 0; k = 0.05; //window.myScatter.reset(); -}); +}); \ No newline at end of file From b4a466f7d38ccdf4258135c703c76b0cf0a82d8a Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 29 May 2019 17:13:28 +0530 Subject: [PATCH 051/166] Perceptron algorithm completed with graph --- SRIP/Codes/exp3.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index dac35d71..c567bb51 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -147,7 +147,6 @@ function plotGraph(){ window.myLine = new Chart(ptx, { type: "scatter", data: { - //labels: [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], datasets: [{ label: "Perceptron Line", borderColor: window.chartColors.green, @@ -157,7 +156,7 @@ function plotGraph(){ },{ x: 0, y: (-bias/weights[1]) - }]/*}, { + }]}, { label: "Class 1", backgroundColor: window.chartColors.red, borderColor: window.chartColors.red, @@ -166,7 +165,7 @@ function plotGraph(){ label: "Class 2", backgroundColor: window.chartColors.blue, borderColor: window.chartColors.blue, - data: chart2data*/ + data: chart2data }] }, options: { From 5178df84f52be6e3da2aa22c9d5b156f40bb71c1 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 29 May 2019 17:20:24 +0530 Subject: [PATCH 052/166] Perceptron algorithm completed with graph --- SRIP/Codes/exp3.js | 1 + 1 file changed, 1 insertion(+) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index c567bb51..0f67f6b9 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -279,6 +279,7 @@ function changeStatusStep100(){ document.getElementById("clear").addEventListener("click", function() { document.getElementById("column-1").innerHTML = ""; document.getElementById("column-2").innerHTML = ""; + document.getElementById("weights-return").textContent = ""; document.getElementById("input-data-from-user-class1").style.visibility = "hidden"; document.getElementById("input-data-from-user-class2").style.visibility = "hidden"; data1 = []; From 7595df2ab8a02ee5d14e86b47a5f2b2fe34a4f5e Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 29 May 2019 17:21:57 +0530 Subject: [PATCH 053/166] Perceptron algorithm completed with graph --- SRIP/Codes/exp3.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 0f67f6b9..8b91bb3e 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -156,7 +156,7 @@ function plotGraph(){ },{ x: 0, y: (-bias/weights[1]) - }]}, { + }]},{ label: "Class 1", backgroundColor: window.chartColors.red, borderColor: window.chartColors.red, From 4191f0ca6d91a9cf8c04d2aba6d3ccd4e5573d7b Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 29 May 2019 19:56:29 +0530 Subject: [PATCH 054/166] Perceptron algorithm completed with graph --- SRIP/Codes/exp3.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 8b91bb3e..d3fa07f7 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -15,7 +15,7 @@ var bias = 1; var c = 0, d = 0; var activation = 0; var k = 0.05; - +var n_epoch = 5; //Initializing the graph function generateData() { @@ -195,7 +195,6 @@ function perceptronTrainWeights(dataArray, learningParameter){ var j = 0; var sumError = 0; var error = 1; - var n_epoch = 5; var prediction = 0; for(var epoch=0; epoch Date: Wed, 29 May 2019 20:00:41 +0530 Subject: [PATCH 055/166] Perceptron algorithm completed with graph --- SRIP/Codes/exp3.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index d3fa07f7..85c3181e 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -15,7 +15,7 @@ var bias = 1; var c = 0, d = 0; var activation = 0; var k = 0.05; -var n_epoch = 5; +var nEpoch = 5; //Initializing the graph function generateData() { @@ -196,7 +196,7 @@ function perceptronTrainWeights(dataArray, learningParameter){ var sumError = 0; var error = 1; var prediction = 0; - for(var epoch=0; epoch Date: Thu, 30 May 2019 16:18:02 +0530 Subject: [PATCH 056/166] Documentation added --- SRIP/SRIP Project 1 Documentation.pdf | Bin 0 -> 235622 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 SRIP/SRIP Project 1 Documentation.pdf diff --git a/SRIP/SRIP Project 1 Documentation.pdf b/SRIP/SRIP Project 1 Documentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a3fde9f332c318eb9fa1ac7b4da5be2397bcb44d GIT binary patch literal 235622 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 literal 0 HcmV?d00001 From 77439937ed64897ca904d24dca997eb538d4c5b5 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 18:38:19 +0530 Subject: [PATCH 057/166] Some improvements --- SRIP/Codes/exp3.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 85c3181e..6e1cc6cb 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -38,7 +38,7 @@ function addDataPoints1x() { }); q1++; count1++; - console.log(data1); //Ctrl+Shift+J + Console.log(data1); //Ctrl+Shift+J return data1; //seeing the output in console window } @@ -52,7 +52,7 @@ function addDataPoints1y() { }); q1++; count1++; - console.log(data1); + Console.log(data1); return data1; } @@ -67,7 +67,7 @@ function addDataPoints2x() { }); q2++; count2++; - //console.log(data2); //Ctrl+Shift+J + //Console.log(data2); //Ctrl+Shift+J return data2; //seeing the output in console window } @@ -81,7 +81,7 @@ function addDataPoints2y() { }); q2++; count2++; - //console.log(data2); + //Console.log(data2); return data2; } @@ -139,10 +139,10 @@ var myChart2 = new Chart(ctx, { function plotGraph(){ - console.log(-bias/weights[0]); - console.log(-bias/weights[1]); - console.log(chart1data); - console.log(chart2data); + Console.log(-bias/weights[0]); + Console.log(-bias/weights[1]); + Console.log(chart1data); + Console.log(chart2data); var ptx = document.getElementById("graph-2"); window.myLine = new Chart(ptx, { type: "scatter", From b00eaeb15990576d4475396a45e9334ed6eecec5 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 18:41:34 +0530 Subject: [PATCH 058/166] Some improvements --- SRIP/Codes/exp3.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 6e1cc6cb..6369a29a 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -38,7 +38,7 @@ function addDataPoints1x() { }); q1++; count1++; - Console.log(data1); //Ctrl+Shift+J + //console.log(data1); //Ctrl+Shift+J return data1; //seeing the output in console window } @@ -52,7 +52,7 @@ function addDataPoints1y() { }); q1++; count1++; - Console.log(data1); + //console.log(data1); return data1; } @@ -67,7 +67,7 @@ function addDataPoints2x() { }); q2++; count2++; - //Console.log(data2); //Ctrl+Shift+J + //console.log(data2); //Ctrl+Shift+J return data2; //seeing the output in console window } @@ -81,7 +81,7 @@ function addDataPoints2y() { }); q2++; count2++; - //Console.log(data2); + //console.log(data2); return data2; } @@ -139,10 +139,10 @@ var myChart2 = new Chart(ctx, { function plotGraph(){ - Console.log(-bias/weights[0]); - Console.log(-bias/weights[1]); - Console.log(chart1data); - Console.log(chart2data); + //console.log(-bias/weights[0]); + //console.log(-bias/weights[1]); + //console.log(chart1data); + //console.log(chart2data); var ptx = document.getElementById("graph-2"); window.myLine = new Chart(ptx, { type: "scatter", From 922c110d4e3c5cd24253b66d97b1e5339146fbc7 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 18:43:41 +0530 Subject: [PATCH 059/166] Some improvements --- SRIP/Codes/exp3.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 6369a29a..4a11f507 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -221,10 +221,12 @@ function start(){ var i = 0; for(i = 0; i < (count1 + count2); i++){ - if(i < count1) + if(i < count1){ finaldata[i] = data1[i]; - else + } + else{ finaldata[i] = data2[i - count1]; + } } var conut = 0; @@ -240,7 +242,7 @@ function start(){ i = count1 / 2; var a = 0; - while(a != count2 / 2){ + while(a != (count2 / 2)){ dataArray[i] = []; dataArray[i][0] = finaldata[conut]; conut++; From 7ab33e9fda2a656ee31baf717fc4a642d3aedf5f Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 18:47:10 +0530 Subject: [PATCH 060/166] Some improvements --- SRIP/Codes/exp3.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 4a11f507..3dd437e9 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -242,7 +242,7 @@ function start(){ i = count1 / 2; var a = 0; - while(a != (count2 / 2)){ + while(a !== (count2 / 2)){ dataArray[i] = []; dataArray[i][0] = finaldata[conut]; conut++; From c0886c111bfe4d0336dbfb07ab072d4ec93ced4b Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 18:53:12 +0530 Subject: [PATCH 061/166] Some improvements --- SRIP/Codes/exp3.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 3dd437e9..46979e04 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -37,8 +37,7 @@ function addDataPoints1x() { x: xValue1 }); q1++; - count1++; - //console.log(data1); //Ctrl+Shift+J + count1++; //Ctrl+Shift+J return data1; //seeing the output in console window } @@ -52,7 +51,6 @@ function addDataPoints1y() { }); q1++; count1++; - //console.log(data1); return data1; } @@ -67,7 +65,6 @@ function addDataPoints2x() { }); q2++; count2++; - //console.log(data2); //Ctrl+Shift+J return data2; //seeing the output in console window } @@ -81,11 +78,9 @@ function addDataPoints2y() { }); q2++; count2++; - //console.log(data2); return data2; } - //Graph 1 creation var myChart1 = { type: "scatter", @@ -139,10 +134,6 @@ var myChart2 = new Chart(ctx, { function plotGraph(){ - //console.log(-bias/weights[0]); - //console.log(-bias/weights[1]); - //console.log(chart1data); - //console.log(chart2data); var ptx = document.getElementById("graph-2"); window.myLine = new Chart(ptx, { type: "scatter", From af55e86d53bf14841072011fe8a8b955d6019b05 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 18:59:49 +0530 Subject: [PATCH 062/166] Some improvements --- SRIP/Codes/exp3.js | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 46979e04..16660100 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -51,14 +51,14 @@ function addDataPoints1y() { }); q1++; count1++; - return data1; + return data1; } //Manually adding data points for class 2 function addDataPoints2x() { var xValue2; - xValue2 = Number(document.getElementById("xValue2").value); + xValue2 = Number(document.getElementById("xValue2").value); data2[q2] = xValue2; chart2data.push({ x: xValue2 @@ -78,7 +78,7 @@ function addDataPoints2y() { }); q2++; count2++; - return data2; + return data2; } //Graph 1 creation @@ -139,24 +139,24 @@ function plotGraph(){ type: "scatter", data: { datasets: [{ - label: "Perceptron Line", - borderColor: window.chartColors.green, - data: [{ - x: (-bias/weights[0]), - y: 0 - },{ - x: 0, - y: (-bias/weights[1]) - }]},{ - label: "Class 1", - backgroundColor: window.chartColors.red, - borderColor: window.chartColors.red, - data: chart1data - },{ - label: "Class 2", - backgroundColor: window.chartColors.blue, - borderColor: window.chartColors.blue, - data: chart2data + label: "Perceptron Line", + borderColor: window.chartColors.green, + data: [{ + x: (-bias/weights[0]), + y: 0 + },{ + x: 0, + y: (-bias/weights[1]) + }]},{ + label: "Class 1", + backgroundColor: window.chartColors.red, + borderColor: window.chartColors.red, + data: chart1data + },{ + label: "Class 2", + backgroundColor: window.chartColors.blue, + borderColor: window.chartColors.blue, + data: chart2data }] }, options: { From 060620880e07812b85a1b96396d98c7344f9a366 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 19:02:57 +0530 Subject: [PATCH 063/166] Some improvements --- SRIP/Codes/exp3.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 16660100..0be77938 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -32,7 +32,7 @@ function generateData() { function addDataPoints1x() { var xValue1; xValue1 = Number(document.getElementById("xValue1").value); - data1[q1] = xValue1; + data1[parseInt(q1)] = xValue1; chart1data.push({ x: xValue1 }); From acad5181d85ef08da2d5e04f9d7efc5b7bd3ff0b Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 19:07:39 +0530 Subject: [PATCH 064/166] Some improvements --- SRIP/Codes/exp3.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 0be77938..5da2eba3 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -3,13 +3,13 @@ var finaldata = []; //dataset for Perceptron var chart1data = []; var chart2data = []; var data1 = []; //for class 1 -var count1 = 0; //count of all points of class 1 +var count1 = parseInt("0"); //count of all points of class 1 var data2 = []; //for class 2 var count2 = 0; //count of all points of class 2 var learningParameter; var dataArray = []; -var q1 = 0; -var q2 = 0; +var q1 = parseInt("0"); +var q2 = parseInt("0"); var weights = [0, 0]; var bias = 1; var c = 0, d = 0; @@ -32,7 +32,7 @@ function generateData() { function addDataPoints1x() { var xValue1; xValue1 = Number(document.getElementById("xValue1").value); - data1[parseInt(q1)] = xValue1; + data1[q1] = xValue1; chart1data.push({ x: xValue1 }); From 54c5c54b9335e74aa52a378a5b35e5264fece14d Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 19:15:25 +0530 Subject: [PATCH 065/166] Some improvements --- SRIP/Codes/exp3.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 5da2eba3..20fe9f0d 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -3,19 +3,20 @@ var finaldata = []; //dataset for Perceptron var chart1data = []; var chart2data = []; var data1 = []; //for class 1 -var count1 = parseInt("0"); //count of all points of class 1 +var count1 = parseInt("0", 10); //count of all points of class 1 var data2 = []; //for class 2 -var count2 = 0; //count of all points of class 2 +var count2 = pareseInt("0", 10); //count of all points of class 2 var learningParameter; var dataArray = []; -var q1 = parseInt("0"); -var q2 = parseInt("0"); +var q1 = parseInt("0", 10); +var q2 = parseInt("0", 10); var weights = [0, 0]; -var bias = 1; -var c = 0, d = 0; -var activation = 0; +var bias = parseInt("1", 10); +var c = parseInt("0", 10); +var d = parseInt("0", 10); +var activation = parseInt("0", 10); var k = 0.05; -var nEpoch = 5; +var nEpoch = parseInt("5", 10);; //Initializing the graph function generateData() { From b2e6ce1f8b25ce277035fd32549f1b0deb441274 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 19:17:49 +0530 Subject: [PATCH 066/166] Some improvements --- SRIP/Codes/exp3.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 20fe9f0d..3a78f2b7 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -5,7 +5,7 @@ var chart2data = []; var data1 = []; //for class 1 var count1 = parseInt("0", 10); //count of all points of class 1 var data2 = []; //for class 2 -var count2 = pareseInt("0", 10); //count of all points of class 2 +var count2 = parseInt("0", 10); //count of all points of class 2 var learningParameter; var dataArray = []; var q1 = parseInt("0", 10); @@ -16,7 +16,7 @@ var c = parseInt("0", 10); var d = parseInt("0", 10); var activation = parseInt("0", 10); var k = 0.05; -var nEpoch = parseInt("5", 10);; +var nEpoch = parseInt("5", 10); //Initializing the graph function generateData() { From b07a141f5dc2def41229d1550e2a99d2475a5e1f Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 19:20:17 +0530 Subject: [PATCH 067/166] Some improvements --- SRIP/Codes/exp3.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 3a78f2b7..7fd1f656 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -11,11 +11,11 @@ var dataArray = []; var q1 = parseInt("0", 10); var q2 = parseInt("0", 10); var weights = [0, 0]; -var bias = parseInt("1", 10); +var bias = parseFloat("1"); var c = parseInt("0", 10); var d = parseInt("0", 10); -var activation = parseInt("0", 10); -var k = 0.05; +var activation = parseFloat("0"); +var k = parseFloat("0.05"); var nEpoch = parseInt("5", 10); //Initializing the graph From b05114380ff5d74ea7ee3f871a404b6fb09ce434 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 19:21:56 +0530 Subject: [PATCH 068/166] Some improvements --- SRIP/Codes/exp3.js | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 7fd1f656..fcfc3698 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -139,26 +139,26 @@ function plotGraph(){ window.myLine = new Chart(ptx, { type: "scatter", data: { - datasets: [{ - label: "Perceptron Line", - borderColor: window.chartColors.green, - data: [{ - x: (-bias/weights[0]), - y: 0 - },{ - x: 0, - y: (-bias/weights[1]) - }]},{ - label: "Class 1", - backgroundColor: window.chartColors.red, - borderColor: window.chartColors.red, - data: chart1data - },{ - label: "Class 2", - backgroundColor: window.chartColors.blue, - borderColor: window.chartColors.blue, - data: chart2data - }] + datasets: [{ + label: "Perceptron Line", + borderColor: window.chartColors.green, + data: [{ + x: (-bias/weights[0]), + y: 0 + },{ + x: 0, + y: (-bias/weights[1]) + }]},{ + label: "Class 1", + backgroundColor: window.chartColors.red, + borderColor: window.chartColors.red, + data: chart1data + },{ + label: "Class 2", + backgroundColor: window.chartColors.blue, + borderColor: window.chartColors.blue, + data: chart2data + }] }, options: { responsive: true From 3f8d37e806a516bec34bc5a6d8dcaf4ba6452b49 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 19:24:25 +0530 Subject: [PATCH 069/166] Some improvements --- SRIP/Codes/exp3.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html index c67828e2..9a6878aa 100644 --- a/SRIP/Codes/exp3.html +++ b/SRIP/Codes/exp3.html @@ -5,9 +5,9 @@ Pattern Recognition: Experiment 3- Perceptron - + - + From 2ecce280e7bf137e1f89ed1407ca8cad0cbc32d5 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 19:39:56 +0530 Subject: [PATCH 070/166] Some improvements --- SRIP/Codes/exp3.js | 53 +++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index fcfc3698..ab9484fa 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -139,36 +139,35 @@ function plotGraph(){ window.myLine = new Chart(ptx, { type: "scatter", data: { - datasets: [{ - label: "Perceptron Line", - borderColor: window.chartColors.green, - data: [{ - x: (-bias/weights[0]), - y: 0 - },{ - x: 0, - y: (-bias/weights[1]) - }]},{ - label: "Class 1", - backgroundColor: window.chartColors.red, - borderColor: window.chartColors.red, - data: chart1data - },{ - label: "Class 2", - backgroundColor: window.chartColors.blue, - borderColor: window.chartColors.blue, - data: chart2data - }] - }, - options: { - responsive: true - } - }); + datasets: [{ + label: "Perceptron Line", + borderColor: window.chartColors.green, + data: [{ + x: (-bias/weights[0]), + y: 0 + },{ + x: 0, + y: (-bias/weights[1]) + }] + },{ + label: "Class 1", + backgroundColor: window.chartColors.red, + borderColor: window.chartColors.red, + data: chart1data + },{ + label: "Class 2", + backgroundColor: window.chartColors.blue, + borderColor: window.chartColors.blue, + data: chart2data + }]}, + options: { + responsive: true + } + }); } - -//Perceptron function + //Perceptron function function predict(c, weights){ for(d = 0; d < 2; d++){ activation = activation + (weights[d] * dataArray[c][d]) + bias; From a27c69f9c44c6cbb7b4cd4c76b496917e4378a57 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 19:45:43 +0530 Subject: [PATCH 071/166] Some improvements --- SRIP/Codes/exp3.html | 1 + 1 file changed, 1 insertion(+) diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html index 9a6878aa..b1169172 100644 --- a/SRIP/Codes/exp3.html +++ b/SRIP/Codes/exp3.html @@ -5,6 +5,7 @@ Pattern Recognition: Experiment 3- Perceptron + From 7b9ee7e0edf6ba06c82fd14ba9a5f6c44c098a08 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 19:55:03 +0530 Subject: [PATCH 072/166] Some improvements --- SRIP/Codes/exp3.js | 75 +++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index ab9484fa..82634b22 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -167,6 +167,46 @@ function plotGraph(){ } +function create2Darray(){ + var i = 0; + for(i = 0; i < (count1 + count2); i++){ + if(i < count1){ + finaldata[i] = data1[i]; + } + else{ + finaldata[i] = data2[i - count1]; + } + } + + var conut = 0; + //2D final array + for(i = 0; i < count1 / 2; i++){ + dataArray[i] = []; + dataArray[i][0] = finaldata[conut]; + conut++; + dataArray[i][1] = finaldata[conut]; + conut++; + dataArray[i][2] = 1; + } + + i = count1 / 2; + var a = 0; + while(a !== (count2 / 2)){ + dataArray[i] = []; + dataArray[i][0] = finaldata[conut]; + conut++; + dataArray[i][1] = finaldata[conut]; + conut++; + dataArray[i][2] = 0; + a++; + i++; + } +} + + + + + //Perceptron function function predict(c, weights){ for(d = 0; d < 2; d++){ @@ -209,40 +249,7 @@ function start(){ document.getElementById("step-100").style.visibility = "visible"; learningParameter = document.getElementById("learning-parameter").value; - var i = 0; - - for(i = 0; i < (count1 + count2); i++){ - if(i < count1){ - finaldata[i] = data1[i]; - } - else{ - finaldata[i] = data2[i - count1]; - } - } - - var conut = 0; - //2D final array - for(i = 0; i < count1 / 2; i++){ - dataArray[i] = []; - dataArray[i][0] = finaldata[conut]; - conut++; - dataArray[i][1] = finaldata[conut]; - conut++; - dataArray[i][2] = 1; - } - - i = count1 / 2; - var a = 0; - while(a !== (count2 / 2)){ - dataArray[i] = []; - dataArray[i][0] = finaldata[conut]; - conut++; - dataArray[i][1] = finaldata[conut]; - conut++; - dataArray[i][2] = 0; - a++; - i++; - } + create2Darray(); perceptronTrainWeights(dataArray, learningParameter); document.getElementById("weights-return").textContent = weights; From 31ef909afb4bf03e0fa09c67e9f9517285119532 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 19:58:59 +0530 Subject: [PATCH 073/166] Some improvements --- SRIP/Codes/exp3.js | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index 82634b22..dd043547 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -167,17 +167,8 @@ function plotGraph(){ } +//Function to create 2D array of the points function create2Darray(){ - var i = 0; - for(i = 0; i < (count1 + count2); i++){ - if(i < count1){ - finaldata[i] = data1[i]; - } - else{ - finaldata[i] = data2[i - count1]; - } - } - var conut = 0; //2D final array for(i = 0; i < count1 / 2; i++){ @@ -204,10 +195,7 @@ function create2Darray(){ } - - - - //Perceptron function +//Perceptron function function predict(c, weights){ for(d = 0; d < 2; d++){ activation = activation + (weights[d] * dataArray[c][d]) + bias; @@ -249,6 +237,16 @@ function start(){ document.getElementById("step-100").style.visibility = "visible"; learningParameter = document.getElementById("learning-parameter").value; + var i = 0; + for(i = 0; i < (count1 + count2); i++){ + if(i < count1){ + finaldata[i] = data1[i]; + } + else{ + finaldata[i] = data2[i - count1]; + } + } + create2Darray(); perceptronTrainWeights(dataArray, learningParameter); From 23840ba19242cd4900302789449393da42ed0a36 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 30 May 2019 20:00:50 +0530 Subject: [PATCH 074/166] Some improvements --- SRIP/Codes/exp3.js | 57 +++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js index dd043547..ab9484fa 100644 --- a/SRIP/Codes/exp3.js +++ b/SRIP/Codes/exp3.js @@ -167,35 +167,7 @@ function plotGraph(){ } -//Function to create 2D array of the points -function create2Darray(){ - var conut = 0; - //2D final array - for(i = 0; i < count1 / 2; i++){ - dataArray[i] = []; - dataArray[i][0] = finaldata[conut]; - conut++; - dataArray[i][1] = finaldata[conut]; - conut++; - dataArray[i][2] = 1; - } - - i = count1 / 2; - var a = 0; - while(a !== (count2 / 2)){ - dataArray[i] = []; - dataArray[i][0] = finaldata[conut]; - conut++; - dataArray[i][1] = finaldata[conut]; - conut++; - dataArray[i][2] = 0; - a++; - i++; - } -} - - -//Perceptron function + //Perceptron function function predict(c, weights){ for(d = 0; d < 2; d++){ activation = activation + (weights[d] * dataArray[c][d]) + bias; @@ -238,6 +210,7 @@ function start(){ learningParameter = document.getElementById("learning-parameter").value; var i = 0; + for(i = 0; i < (count1 + count2); i++){ if(i < count1){ finaldata[i] = data1[i]; @@ -246,8 +219,30 @@ function start(){ finaldata[i] = data2[i - count1]; } } - - create2Darray(); + + var conut = 0; + //2D final array + for(i = 0; i < count1 / 2; i++){ + dataArray[i] = []; + dataArray[i][0] = finaldata[conut]; + conut++; + dataArray[i][1] = finaldata[conut]; + conut++; + dataArray[i][2] = 1; + } + + i = count1 / 2; + var a = 0; + while(a !== (count2 / 2)){ + dataArray[i] = []; + dataArray[i][0] = finaldata[conut]; + conut++; + dataArray[i][1] = finaldata[conut]; + conut++; + dataArray[i][2] = 0; + a++; + i++; + } perceptronTrainWeights(dataArray, learningParameter); document.getElementById("weights-return").textContent = weights; From 120efe9bc163a4d69be1f37e87c0b2085cae4c4a Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Fri, 31 May 2019 13:08:54 +0530 Subject: [PATCH 075/166] Test Cases added --- SRIP/Test Cases for Project 1.pdf | Bin 0 -> 53126 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 SRIP/Test Cases for Project 1.pdf diff --git a/SRIP/Test Cases for Project 1.pdf b/SRIP/Test Cases for Project 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2960b63fbdbf7765e49c7e9dffb9f80ec3009023 GIT binary patch literal 53126 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 Date: Sat, 1 Jun 2019 09:42:08 +0530 Subject: [PATCH 076/166] Quiz added --- SRIP/Codes/exp3.html | 4 +- SRIP/Quiz/quiz.css | 174 +++++++++++++++++++++++++++++++++++++++++++ SRIP/Quiz/quiz.html | 116 +++++++++++++++++++++++++++++ SRIP/Quiz/quiz.js | 66 ++++++++++++++++ SRIP/README.txt | 11 ++- 5 files changed, 367 insertions(+), 4 deletions(-) create mode 100644 SRIP/Quiz/quiz.css create mode 100644 SRIP/Quiz/quiz.html create mode 100644 SRIP/Quiz/quiz.js diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html index b1169172..bc64ddf8 100644 --- a/SRIP/Codes/exp3.html +++ b/SRIP/Codes/exp3.html @@ -34,9 +34,9 @@

Learning Parameter

diff --git a/SRIP/Quiz/quiz.css b/SRIP/Quiz/quiz.css new file mode 100644 index 00000000..33d3c6a0 --- /dev/null +++ b/SRIP/Quiz/quiz.css @@ -0,0 +1,174 @@ +{ + +border: 1px dotted black; + +} + +p.question { + +font-family: Arial, sans-serif; + +font-size:20px; + +color: #2E2E2E; + +margin-bottom:0px; + +} + + +h2.quizHeader { + +font-family: Arial, sans-serif; + +font-weight:normal; + +font-size:25px; + +line-height: 27px; + +margin: 24px 0 12px 0; + +padding: 0 0 4px 0; + +border-bottom: 1px solid #a2a2a2; + +} + + +h2.quizScore{ + +font-family: Arial, sans-serif; + +font-size:25px; + +} + + +div.quizAnswers{ + +font-family: Arial, sans-serif; + +font-size:16px; + +color: #424242; + +padding: 4px 0 4px 0; + +} + + +label { + +font-family: Arial, sans-serif; + +font-size:14px; + +color: #424242; + +vertical-align:top; + +} + + +input.answer[type="radio"] { + +margin-bottom: 10px; + +} + +input.quizSubmit[type="submit"] { + +-webkit-background-clip: border-box; + +-webkit-background-origin: padding-box; + +-webkit-background-size: auto; + +-webkit-transition-delay: 0s, 0s; + +-webkit-transition-duration: 0.2s, 0.2s; + +-webkit-transition-property: color, background-color; + +-webkit-transition-timing-function: ease, ease; + +box-shadow: rgba(0, 0, 0, 0.498039) 0px 0px 5px 0px; + +color: #ffffff; + +background-color: #c30b0a; + +margin: 0; + +border: 0; + +outline: 0; + +text-transform:uppercase; + +height:35px; + +width:85px; + +border: 1px solid #5E5E5E; + +border-radius:5px; + +} + + +input.quizSubmit[type="submit"]:hover { + +color: #ffffff; + +background: #680f11; + +text-decoration: none; + +} + + +table { + +background-color: #F2F2F2; + +border:1px solid #BDBDBD; + +border-radius:5px; + +padding:10px; + +padding-left:25px; + +box-shadow: rgba(0, 0, 0, 0.498039) 0px 0px 1px 0px; + +} + + +th { + +} + + +tr { + +} + + +td { + +} + +.submitter { + +width:85px; + +} + + +.hide { + +display:none; + +} \ No newline at end of file diff --git a/SRIP/Quiz/quiz.html b/SRIP/Quiz/quiz.html new file mode 100644 index 00000000..1eafa41c --- /dev/null +++ b/SRIP/Quiz/quiz.html @@ -0,0 +1,116 @@ + + + + + Quiz on Experiment- Perceptron + + + + + + + +

Take a Quiz!

+ + + + + + + + + + + + + +
+
+

1. A perceptron adds up all the weighted inputs it receives, and if it exceeds a certain value, it outputs a 1, otherwise outputs a 0.

+ +
    + + +
    + + +
    + + +
    + + +
+
+
+
+

2. Which of the following points will not form any perceptron line?

+ +
    + + +
    + + +
    + + +
+
+
+
+

3. Which of these points represent the perceptron line?

+ +
    + + +
    + + +
    + + +
    + + +
+
+
+
+

4. A perceptron classifier works,

+ +
    + + +
    + + +
    + + +
    + + +
+
+
+
+
+ +
+ + +
+
+
+
+ + +
+

+
+ + + + \ No newline at end of file diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js new file mode 100644 index 00000000..f5b4d9ac --- /dev/null +++ b/SRIP/Quiz/quiz.js @@ -0,0 +1,66 @@ +function submitQuiz() { + console.log('submitted'); + + // get each answer score + function answerScore (qName) { + var radiosNo = document.getElementsByName(qName); + for (var i = 0, length = radiosNo.length; i < length; i++) { + if (radiosNo[i].checked) { + var answerValue = Number(radiosNo[i].value); + } + } + if (isNaN(answerValue)) { + answerValue = 0; + } + return answerValue; + } + + // calc score with answerScore function + var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); + console.log("CalcScore: " + calcScore); // it works! + + // function to return correct answer string + function correctAnswer (correctStringNo, qNumber) { + console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below + return ("The correct answer for question #" + qNumber + ":  " + + (document.getElementById(correctStringNo).innerHTML) + ""); + } + + // print correct answers only if wrong (calls correctAnswer function) + if (answerScore('q1') === 0) { + document.getElementById('correctAnswer1').innerHTML = correctAnswer('correctString1', 1); + } + if (answerScore('q2') === 0) { + document.getElementById('correctAnswer2').innerHTML = correctAnswer('correctString2', 2); + } + if (answerScore('q3') === 0) { + document.getElementById('correctAnswer3').innerHTML = correctAnswer('correctString3', 3); + } + if (answerScore('q4') === 0) { + document.getElementById('correctAnswer4').innerHTML = correctAnswer('correctString4', 4); + } + + // calculate "possible score" integer + var questionCountArray = document.getElementsByClassName('question'); + + var questionCounter = 0; + for (var i = 0, length = questionCountArray.length; i < length; i++) { + questionCounter++; + } + + // show score as "score/possible score" + var showScore = "Your Score: " + calcScore +"/" + questionCounter; + // if 4/4, "perfect score!" + if (calcScore === questionCounter) { + showScore = showScore + "  Perfect Score!" + }; + document.getElementById('userScore').innerHTML = showScore; + } + +$(document).ready(function() { + + $('#submitButton').click(function() { + $(this).addClass('hide'); + }); + +}); \ No newline at end of file diff --git a/SRIP/README.txt b/SRIP/README.txt index 0246f7ac..561a02e8 100644 --- a/SRIP/README.txt +++ b/SRIP/README.txt @@ -1,8 +1,15 @@ This is Readme file containing instruction for running the experiment: Perceptron -To run the experiment of perceptron: +TO RUN THE EXPERIMENT OF PERCEPTRON: 1. Download the SRIP folder 2. Go to Codes folder 3. Run the .html file -HTML file will open in the browser and all functionalities will run from the HTML file +HTML file will open in the browser and all functionalities will run from the HTML file. + + +TAKE A QUIZ OF THE EXPERIMENT: +1. Go to Quiz folder +2. Run quiz.html +3. Quiz will open in the browser +4. Give the quiz From 92b3ea91eb21a6e8a09f208d1be109c45ccf12c6 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 1 Jun 2019 09:45:58 +0530 Subject: [PATCH 077/166] Quiz added --- SRIP/Quiz/quiz.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js index f5b4d9ac..704b95e3 100644 --- a/SRIP/Quiz/quiz.js +++ b/SRIP/Quiz/quiz.js @@ -1,5 +1,5 @@ function submitQuiz() { - console.log('submitted'); + //console.log('submitted'); // get each answer score function answerScore (qName) { @@ -17,11 +17,8 @@ function submitQuiz() { // calc score with answerScore function var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); - console.log("CalcScore: " + calcScore); // it works! - // function to return correct answer string function correctAnswer (correctStringNo, qNumber) { - console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below return ("The correct answer for question #" + qNumber + ":  " + (document.getElementById(correctStringNo).innerHTML) + ""); } From 32686ef1a64cc6636a0ea2b9218a7a24611d6ccb Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 1 Jun 2019 09:46:34 +0530 Subject: [PATCH 078/166] Quiz added --- SRIP/Quiz/quiz.js | 1 - 1 file changed, 1 deletion(-) diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js index 704b95e3..cb24be08 100644 --- a/SRIP/Quiz/quiz.js +++ b/SRIP/Quiz/quiz.js @@ -1,5 +1,4 @@ function submitQuiz() { - //console.log('submitted'); // get each answer score function answerScore (qName) { From 3cce902402345d29c06be27ecd21e043d7420365 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 1 Jun 2019 09:51:21 +0530 Subject: [PATCH 079/166] Quiz added --- SRIP/Quiz/quiz.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js index cb24be08..000bdf6f 100644 --- a/SRIP/Quiz/quiz.js +++ b/SRIP/Quiz/quiz.js @@ -15,7 +15,7 @@ function submitQuiz() { } // calc score with answerScore function - var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); + var calcScore = (answerScore("q1") + answerScore("q2") + answerScore("q3") + answerScore("q4")); // function to return correct answer string function correctAnswer (correctStringNo, qNumber) { return ("The correct answer for question #" + qNumber + ":  " + @@ -23,21 +23,21 @@ function submitQuiz() { } // print correct answers only if wrong (calls correctAnswer function) - if (answerScore('q1') === 0) { - document.getElementById('correctAnswer1').innerHTML = correctAnswer('correctString1', 1); + if (answerScore("q1") === 0) { + document.getElementById("correctAnswer1").innerHTML = correctAnswer("correctString1", 1); } - if (answerScore('q2') === 0) { - document.getElementById('correctAnswer2').innerHTML = correctAnswer('correctString2', 2); + if (answerScore("q2") === 0) { + document.getElementById("correctAnswer2").innerHTML = correctAnswer("correctString2", 2); } - if (answerScore('q3') === 0) { - document.getElementById('correctAnswer3').innerHTML = correctAnswer('correctString3', 3); + if (answerScore("q3") === 0) { + document.getElementById("correctAnswer3").innerHTML = correctAnswer("correctString3", 3); } - if (answerScore('q4') === 0) { - document.getElementById('correctAnswer4').innerHTML = correctAnswer('correctString4', 4); + if (answerScore("q4") === 0) { + document.getElementById("correctAnswer4").innerHTML = correctAnswer("correctString4", 4); } // calculate "possible score" integer - var questionCountArray = document.getElementsByClassName('question'); + var questionCountArray = document.getElementsByClassName("question"); var questionCounter = 0; for (var i = 0, length = questionCountArray.length; i < length; i++) { @@ -50,13 +50,13 @@ function submitQuiz() { if (calcScore === questionCounter) { showScore = showScore + "  Perfect Score!" }; - document.getElementById('userScore').innerHTML = showScore; + document.getElementById("userScore").innerHTML = showScore; } $(document).ready(function() { - $('#submitButton').click(function() { - $(this).addClass('hide'); + $("#submitButton").click(function() { + $(this).addClass("hide"); }); }); \ No newline at end of file From 1ad74e8449d65eb80b3b761d1d6e43b5f20f4e54 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 1 Jun 2019 09:53:46 +0530 Subject: [PATCH 080/166] Quiz added --- SRIP/Quiz/quiz.html | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/SRIP/Quiz/quiz.html b/SRIP/Quiz/quiz.html index 1eafa41c..79c198fc 100644 --- a/SRIP/Quiz/quiz.html +++ b/SRIP/Quiz/quiz.html @@ -9,6 +9,7 @@ +

Take a Quiz!

@@ -72,7 +73,8 @@

Take a Quiz!

- + +

4. A perceptron classifier works,

@@ -94,10 +96,9 @@

Take a Quiz!

-
-
- + +
+
From 697975c7957dfa78240b546db187dd590e40eccf Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 1 Jun 2019 09:58:03 +0530 Subject: [PATCH 081/166] Quiz added --- SRIP/Quiz/quiz.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js index 000bdf6f..bd74de9c 100644 --- a/SRIP/Quiz/quiz.js +++ b/SRIP/Quiz/quiz.js @@ -19,21 +19,21 @@ function submitQuiz() { // function to return correct answer string function correctAnswer (correctStringNo, qNumber) { return ("The correct answer for question #" + qNumber + ":  " + - (document.getElementById(correctStringNo).innerHTML) + ""); + (document.getElementById(correctStringNo).textContent) + "
"); } // print correct answers only if wrong (calls correctAnswer function) if (answerScore("q1") === 0) { - document.getElementById("correctAnswer1").innerHTML = correctAnswer("correctString1", 1); + document.getElementById("correctAnswer1").textContent = correctAnswer("correctString1", 1); } if (answerScore("q2") === 0) { - document.getElementById("correctAnswer2").innerHTML = correctAnswer("correctString2", 2); + document.getElementById("correctAnswer2").textContent = correctAnswer("correctString2", 2); } if (answerScore("q3") === 0) { - document.getElementById("correctAnswer3").innerHTML = correctAnswer("correctString3", 3); + document.getElementById("correctAnswer3").textContent = correctAnswer("correctString3", 3); } if (answerScore("q4") === 0) { - document.getElementById("correctAnswer4").innerHTML = correctAnswer("correctString4", 4); + document.getElementById("correctAnswer4").textContent = correctAnswer("correctString4", 4); } // calculate "possible score" integer @@ -48,9 +48,9 @@ function submitQuiz() { var showScore = "Your Score: " + calcScore +"/" + questionCounter; // if 4/4, "perfect score!" if (calcScore === questionCounter) { - showScore = showScore + "  Perfect Score!" - }; - document.getElementById("userScore").innerHTML = showScore; + showScore = showScore + "  Perfect Score!"; + } + document.getElementById("userScore").textContent = showScore; } $(document).ready(function() { From 6ddf2fa446cf0a2101962180cebb530c1a778dd2 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 3 Jun 2019 11:24:59 +0530 Subject: [PATCH 082/166] Quiz added --- SRIP/Quiz/quiz.js | 129 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 104 insertions(+), 25 deletions(-) diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js index bd74de9c..f64276f7 100644 --- a/SRIP/Quiz/quiz.js +++ b/SRIP/Quiz/quiz.js @@ -1,43 +1,122 @@ -function submitQuiz() { +// scripts here: + + function submitQuiz() { + console.log('submitted'); // get each answer score - function answerScore (qName) { - var radiosNo = document.getElementsByName(qName); - for (var i = 0, length = radiosNo.length; i < length; i++) { - if (radiosNo[i].checked) { - var answerValue = Number(radiosNo[i].value); + function answerScore (qName) { + var radiosNo = document.getElementsByName(qName); + + for (var i = 0, length = radiosNo.length; i < length; i++) { + if (radiosNo[i].checked) { + // do something with radiosNo + var answerValue = Number(radiosNo[i].value); + } + } + // change NaNs to zero + if (isNaN(answerValue)) { + answerValue = 0; } + return answerValue; } - if (isNaN(answerValue)) { - answerValue = 0; + + // calc score with answerScore function + var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); + console.log("CalcScore: " + calcScore); // it works! + + // function to return correct answer string + function correctAnswer (correctStringNo, qNumber) { + console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below + return ("The correct answer for question #" + qNumber + ":  " + + (document.getElementById(correctStringNo).innerHTML) + ""); + } + + // print correct answers only if wrong (calls correctAnswer function) + if (answerScore('q1') === 0) { + document.getElementById('correctAnswer1').innerHTML = correctAnswer('correctString1', 1); + } + if (answerScore('q2') === 0) { + document.getElementById('correctAnswer2').innerHTML = correctAnswer('correctString2', 2); + } + if (answerScore('q3') === 0) { + document.getElementById('correctAnswer3').innerHTML = correctAnswer('correctString3', 3); } - return answerValue; + if (answerScore('q4') === 0) { + document.getElementById('correctAnswer4').innerHTML = correctAnswer('correctString4', 4); + } + + // calculate "possible score" integer + var questionCountArray = document.getElementsByClassName('question'); + + var questionCounter = 0; + for (var i = 0, length = questionCountArray.length; i < length; i++) { + questionCounter++; + } + + // show score as "score/possible score" + var showScore = "Your Score: " + calcScore +"/" + questionCounter; + // if 4/4, "perfect score!" + if (calcScore === questionCounter) { + showScore = showScore + "  Perfect Score!" + }; + document.getElementById('userScore').innerHTML = showScore; } +$(document).ready(function() { + + $('#submitButton').click(function() { + $(this).addClass('hide'); + }); + +});// scripts here: + + function submitQuiz() { + console.log('submitted'); + + // get each answer score + function answerScore (qName) { + var radiosNo = document.getElementsByName(qName); + + for (var i = 0, length = radiosNo.length; i < length; i++) { + if (radiosNo[i].checked) { + // do something with radiosNo + var answerValue = Number(radiosNo[i].value); + } + } + // change NaNs to zero + if (isNaN(answerValue)) { + answerValue = 0; + } + return answerValue; + } + // calc score with answerScore function - var calcScore = (answerScore("q1") + answerScore("q2") + answerScore("q3") + answerScore("q4")); + var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); + console.log("CalcScore: " + calcScore); // it works! + // function to return correct answer string function correctAnswer (correctStringNo, qNumber) { + console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below return ("The correct answer for question #" + qNumber + ":  " + - (document.getElementById(correctStringNo).textContent) + ""); + (document.getElementById(correctStringNo).innerHTML) + ""); } // print correct answers only if wrong (calls correctAnswer function) - if (answerScore("q1") === 0) { - document.getElementById("correctAnswer1").textContent = correctAnswer("correctString1", 1); + if (answerScore('q1') === 0) { + document.getElementById('correctAnswer1').innerHTML = correctAnswer('correctString1', 1); } - if (answerScore("q2") === 0) { - document.getElementById("correctAnswer2").textContent = correctAnswer("correctString2", 2); + if (answerScore('q2') === 0) { + document.getElementById('correctAnswer2').innerHTML = correctAnswer('correctString2', 2); } - if (answerScore("q3") === 0) { - document.getElementById("correctAnswer3").textContent = correctAnswer("correctString3", 3); + if (answerScore('q3') === 0) { + document.getElementById('correctAnswer3').innerHTML = correctAnswer('correctString3', 3); } - if (answerScore("q4") === 0) { - document.getElementById("correctAnswer4").textContent = correctAnswer("correctString4", 4); + if (answerScore('q4') === 0) { + document.getElementById('correctAnswer4').innerHTML = correctAnswer('correctString4', 4); } // calculate "possible score" integer - var questionCountArray = document.getElementsByClassName("question"); + var questionCountArray = document.getElementsByClassName('question'); var questionCounter = 0; for (var i = 0, length = questionCountArray.length; i < length; i++) { @@ -48,15 +127,15 @@ function submitQuiz() { var showScore = "Your Score: " + calcScore +"/" + questionCounter; // if 4/4, "perfect score!" if (calcScore === questionCounter) { - showScore = showScore + "  Perfect Score!"; - } - document.getElementById("userScore").textContent = showScore; + showScore = showScore + "  Perfect Score!" + }; + document.getElementById('userScore').innerHTML = showScore; } $(document).ready(function() { - $("#submitButton").click(function() { - $(this).addClass("hide"); + $('#submitButton').click(function() { + $(this).addClass('hide'); }); }); \ No newline at end of file From 9456c7023c8449e73466cf2bc4210f1d67f7efd4 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 3 Jun 2019 11:37:39 +0530 Subject: [PATCH 083/166] Quiz corrections made --- SRIP/Quiz/quiz.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js index f64276f7..d193bc4f 100644 --- a/SRIP/Quiz/quiz.js +++ b/SRIP/Quiz/quiz.js @@ -1,9 +1,6 @@ -// scripts here: +function submitQuiz() { - function submitQuiz() { - console.log('submitted'); - - // get each answer score + // get each answer function answerScore (qName) { var radiosNo = document.getElementsByName(qName); @@ -97,7 +94,7 @@ $(document).ready(function() { // function to return correct answer string function correctAnswer (correctStringNo, qNumber) { console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below - return ("The correct answer for question #" + qNumber + ":  " + + return ("The correct answer for question " + qNumber + ":  " + (document.getElementById(correctStringNo).innerHTML) + ""); } @@ -127,7 +124,8 @@ $(document).ready(function() { var showScore = "Your Score: " + calcScore +"/" + questionCounter; // if 4/4, "perfect score!" if (calcScore === questionCounter) { - showScore = showScore + "  Perfect Score!" + showScore = showScore + "  Perfect Score!" + String.fromCodePoint(0x1F600) + }; document.getElementById('userScore').innerHTML = showScore; } From ad0b0dba96bfa2965b9f69e2ecc9410fa99d2a35 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 3 Jun 2019 11:46:43 +0530 Subject: [PATCH 084/166] Quiz corrections made --- SRIP/Quiz/quiz.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js index d193bc4f..38c6f711 100644 --- a/SRIP/Quiz/quiz.js +++ b/SRIP/Quiz/quiz.js @@ -124,7 +124,7 @@ $(document).ready(function() { var showScore = "Your Score: " + calcScore +"/" + questionCounter; // if 4/4, "perfect score!" if (calcScore === questionCounter) { - showScore = showScore + "  Perfect Score!" + String.fromCodePoint(0x1F600) + showScore = showScore + "  Perfect Score!" + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973) }; document.getElementById('userScore').innerHTML = showScore; From 39914d167f3e5a9b9a86178079b72d4ce3a6bec4 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 3 Jun 2019 11:49:33 +0530 Subject: [PATCH 085/166] Quiz corrections made --- SRIP/Quiz/quiz.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js index 38c6f711..e9f92780 100644 --- a/SRIP/Quiz/quiz.js +++ b/SRIP/Quiz/quiz.js @@ -19,11 +19,11 @@ function submitQuiz() { // calc score with answerScore function var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); - console.log("CalcScore: " + calcScore); // it works! + //console.log("CalcScore: " + calcScore); // it works! // function to return correct answer string function correctAnswer (correctStringNo, qNumber) { - console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below + //console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below return ("The correct answer for question #" + qNumber + ":  " + (document.getElementById(correctStringNo).innerHTML) + ""); } @@ -65,10 +65,10 @@ $(document).ready(function() { $(this).addClass('hide'); }); -});// scripts here: +}); function submitQuiz() { - console.log('submitted'); + //console.log('submitted'); // get each answer score function answerScore (qName) { @@ -89,11 +89,11 @@ $(document).ready(function() { // calc score with answerScore function var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); - console.log("CalcScore: " + calcScore); // it works! + //console.log("CalcScore: " + calcScore); // it works! // function to return correct answer string function correctAnswer (correctStringNo, qNumber) { - console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below + //console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below return ("The correct answer for question " + qNumber + ":  " + (document.getElementById(correctStringNo).innerHTML) + ""); } @@ -122,7 +122,6 @@ $(document).ready(function() { // show score as "score/possible score" var showScore = "Your Score: " + calcScore +"/" + questionCounter; - // if 4/4, "perfect score!" if (calcScore === questionCounter) { showScore = showScore + "  Perfect Score!" + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973) From 61a0dc90b039f0b330a06a35f1f68bb8413821c4 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 3 Jun 2019 12:24:48 +0530 Subject: [PATCH 086/166] Quiz corrections made --- SRIP/Quiz/quiz.js | 1 - 1 file changed, 1 deletion(-) diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js index e9f92780..0d4fd43f 100644 --- a/SRIP/Quiz/quiz.js +++ b/SRIP/Quiz/quiz.js @@ -124,7 +124,6 @@ $(document).ready(function() { var showScore = "Your Score: " + calcScore +"/" + questionCounter; if (calcScore === questionCounter) { showScore = showScore + "  Perfect Score!" + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973) - }; document.getElementById('userScore').innerHTML = showScore; } From 585946d5ac7925eaab882c9edeb74bf9767090c9 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 12 Jun 2019 15:39:22 +0530 Subject: [PATCH 087/166] project 2 added --- .../Project-1 Issue Number 240/Codes/exp3.css | 139 + .../Codes/exp3.html | 115 + SRIP/Project-1 Issue Number 240/Codes/exp3.js | 292 + .../Libraries/Chart.js | 14680 ++++++++++++++++ SRIP/Project-1 Issue Number 240/Quiz/quiz.css | 174 + .../Project-1 Issue Number 240/Quiz/quiz.html | 117 + SRIP/Project-1 Issue Number 240/Quiz/quiz.js | 137 + SRIP/Project-1 Issue Number 240/README.txt | 15 + .../SRIP Project 1 Documentation.pdf | Bin 0 -> 235622 bytes .../Test Cases for Project 1.pdf | Bin 0 -> 53126 bytes .../Libraries/Chart.js | 14680 ++++++++++++++++ SRIP/Project-2 Issue Number 243/README.txt | 15 + 12 files changed, 30364 insertions(+) create mode 100644 SRIP/Project-1 Issue Number 240/Codes/exp3.css create mode 100644 SRIP/Project-1 Issue Number 240/Codes/exp3.html create mode 100644 SRIP/Project-1 Issue Number 240/Codes/exp3.js create mode 100644 SRIP/Project-1 Issue Number 240/Libraries/Chart.js create mode 100644 SRIP/Project-1 Issue Number 240/Quiz/quiz.css create mode 100644 SRIP/Project-1 Issue Number 240/Quiz/quiz.html create mode 100644 SRIP/Project-1 Issue Number 240/Quiz/quiz.js create mode 100644 SRIP/Project-1 Issue Number 240/README.txt create mode 100644 SRIP/Project-1 Issue Number 240/SRIP Project 1 Documentation.pdf create mode 100644 SRIP/Project-1 Issue Number 240/Test Cases for Project 1.pdf create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/Chart.js create mode 100644 SRIP/Project-2 Issue Number 243/README.txt diff --git a/SRIP/Project-1 Issue Number 240/Codes/exp3.css b/SRIP/Project-1 Issue Number 240/Codes/exp3.css new file mode 100644 index 00000000..81828b8e --- /dev/null +++ b/SRIP/Project-1 Issue Number 240/Codes/exp3.css @@ -0,0 +1,139 @@ +* { + +box-sizing: border-box; + +} + + +body { + +margin: 0; + +} + + +/*Graphs Layout */ +.graph { + +float: left; + +width: 50%; + +padding: 15px; + +max-width: 800px; + +margin: 50px auto; + +} + + + +.row:after { + +content: ""; + +display: table; + +clear: both; + +} + + +@media screen and (max-width:600px) { + +.graph { + +width: 100%; + +} + +} + + +/* 1st row Input Output Layout */ +.column-0 { + +float: left; + +padding: 10px; + +} + + +.column-0.side { + +width: 37.5%; + +} + + +.column-0.right { + +width: 25%; + +} + + +@media screen and (max-width: 600px) { + +.column-0.side, .column-0.right { + +width: 100%; + +} + +} + + +.button{ + margin:5px; +} + + +/* 2nd row Input Output Layout */ +.column-1 { + +float: left; + +width: 37.5%; + +padding: 15px; + +} + + +.row:after { + +content: ""; + +display: table; + +clear: both; + +} + + +@media screen and (max-width:600px) { + +.column-1 { + +width: 100%; + +} + +} + + +#input-data-from-user-class1{ + +visibility: hidden; + +} + + +#input-data-from-user-class2{ + +visibility: hidden; + +} \ No newline at end of file diff --git a/SRIP/Project-1 Issue Number 240/Codes/exp3.html b/SRIP/Project-1 Issue Number 240/Codes/exp3.html new file mode 100644 index 00000000..bc64ddf8 --- /dev/null +++ b/SRIP/Project-1 Issue Number 240/Codes/exp3.html @@ -0,0 +1,115 @@ + + + + + Pattern Recognition: Experiment 3- Perceptron + + + + + + + + + + + + + +
+
+ +
+ +
+ +
+
+ + + +
+ +
+

Learning Parameter

+ +
+ + +
+

Add Data

+
+ + + +
+
+ +
+

Steps

+
+ + + + +
+
+ +
+ + + +
+
+

Status

+
+
+
+ +
+

Value of Weights

+

[]

+
+
+ + +
+
+

+ X Value- Class 1: + + +

+

+ Y Value- Class 1: + + + +

+
+
+

+ X Value- Class 2: + + +

+

+ Y Value- Class 2: + + +

+
+
+ + + + + + + \ No newline at end of file diff --git a/SRIP/Project-1 Issue Number 240/Codes/exp3.js b/SRIP/Project-1 Issue Number 240/Codes/exp3.js new file mode 100644 index 00000000..ab9484fa --- /dev/null +++ b/SRIP/Project-1 Issue Number 240/Codes/exp3.js @@ -0,0 +1,292 @@ +//var xaxis = [-1.0 ,-0.75, -0.50, -0.25, 0.0, 0.25, 0.50, 0.75, 1.0]; +var finaldata = []; //dataset for Perceptron +var chart1data = []; +var chart2data = []; +var data1 = []; //for class 1 +var count1 = parseInt("0", 10); //count of all points of class 1 +var data2 = []; //for class 2 +var count2 = parseInt("0", 10); //count of all points of class 2 +var learningParameter; +var dataArray = []; +var q1 = parseInt("0", 10); +var q2 = parseInt("0", 10); +var weights = [0, 0]; +var bias = parseFloat("1"); +var c = parseInt("0", 10); +var d = parseInt("0", 10); +var activation = parseFloat("0"); +var k = parseFloat("0.05"); +var nEpoch = parseInt("5", 10); + +//Initializing the graph +function generateData() { + var data = []; + data.push({ + x: "0", + y: "0" + }); + return data; +} + + +//Manually adding data points for class 1 +function addDataPoints1x() { + var xValue1; + xValue1 = Number(document.getElementById("xValue1").value); + data1[q1] = xValue1; + chart1data.push({ + x: xValue1 + }); + q1++; + count1++; //Ctrl+Shift+J + return data1; //seeing the output in console window +} + + +function addDataPoints1y() { + var yValue1; + yValue1 = Number(document.getElementById("yValue1").value); + data1[q1] = yValue1; + chart1data.push({ + y: yValue1 + }); + q1++; + count1++; + return data1; +} + + +//Manually adding data points for class 2 +function addDataPoints2x() { + var xValue2; + xValue2 = Number(document.getElementById("xValue2").value); + data2[q2] = xValue2; + chart2data.push({ + x: xValue2 + }); + q2++; + count2++; + return data2; //seeing the output in console window +} + + +function addDataPoints2y() { + var yValue2; + yValue2 = Number(document.getElementById("yValue2").value); + data2[q2] = yValue2; + chart2data.push({ + y: yValue2 + }); + q2++; + count2++; + return data2; +} + +//Graph 1 creation +var myChart1 = { + type: "scatter", + data:{ + datasets: [{ + label: "Class 1", + backgroundColor: window.chartColors.red, + borderColor: window.chartColors.red, + data: generateData() + }, { + label: "Class 2", + backgroundColor: window.chartColors.blue, + borderColor: window.chartColors.blue, + data: generateData() + }] + } +}; + + +window.onload = function(){ + var ctx = document.getElementById("graph-1"); + window.myScatter = new Chart(ctx, myChart1); +}; + +/*document.getElementById('add-Data-Point').addEventListener('click', function() { + myChart1.data.datasets.forEach(function(dataset) { + dataset.data.push(data1); + }); + window.myScatter.update(); +});*/ + + +//after clicking Add Class 1 button, Add Data Point button is made visible +function addClass1(){ + document.getElementById("input-data-from-user-class1").style.visibility="visible"; +} + + +//after clicking Add Class 2 button, Add Data Point button is made visible +function addClass2(){ + document.getElementById("input-data-from-user-class2").style.visibility="visible"; +} + + +/*Creating Graph 2*/ +var ctx = document.getElementById("graph-2"); +var myChart2 = new Chart(ctx, { + }); + + + + +function plotGraph(){ + var ptx = document.getElementById("graph-2"); + window.myLine = new Chart(ptx, { + type: "scatter", + data: { + datasets: [{ + label: "Perceptron Line", + borderColor: window.chartColors.green, + data: [{ + x: (-bias/weights[0]), + y: 0 + },{ + x: 0, + y: (-bias/weights[1]) + }] + },{ + label: "Class 1", + backgroundColor: window.chartColors.red, + borderColor: window.chartColors.red, + data: chart1data + },{ + label: "Class 2", + backgroundColor: window.chartColors.blue, + borderColor: window.chartColors.blue, + data: chart2data + }]}, + options: { + responsive: true + } + }); +} + + + //Perceptron function +function predict(c, weights){ + for(d = 0; d < 2; d++){ + activation = activation + (weights[d] * dataArray[c][d]) + bias; + } + if(activation >= 0.0){ + return 1.0; + } + else{ + return 0.0; + } + +} + + +function perceptronTrainWeights(dataArray, learningParameter){ + var j = 0; + var sumError = 0; + var error = 1; + var prediction = 0; + for(var epoch=0; epoch 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y *100, z * 100]; +} + +function rgb2lab(rgb) { + var xyz = rgb2xyz(rgb), + x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function rgb2lch(args) { + return lab2lch(rgb2lab(args)); +} + +function hsl2rgb(hsl) { + var h = hsl[0] / 360, + s = hsl[1] / 100, + l = hsl[2] / 100, + t1, t2, t3, rgb, val; + + if (s == 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) + t2 = l * (1 + s); + else + t2 = l + s - l * s; + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * - (i - 1); + t3 < 0 && t3++; + t3 > 1 && t3--; + + if (6 * t3 < 1) + val = t1 + (t2 - t1) * 6 * t3; + else if (2 * t3 < 1) + val = t2; + else if (3 * t3 < 2) + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + else + val = t1; + + rgb[i] = val * 255; + } + + return rgb; +} + +function hsl2hsv(hsl) { + var h = hsl[0], + s = hsl[1] / 100, + l = hsl[2] / 100, + sv, v; + + if(l === 0) { + // no need to do calc on black + // also avoids divide by 0 error + return [0, 0, 0]; + } + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + v = (l + s) / 2; + sv = (2 * s) / (l + s); + return [h, sv * 100, v * 100]; +} + +function hsl2hwb(args) { + return rgb2hwb(hsl2rgb(args)); +} + +function hsl2cmyk(args) { + return rgb2cmyk(hsl2rgb(args)); +} + +function hsl2keyword(args) { + return rgb2keyword(hsl2rgb(args)); +} + + +function hsv2rgb(hsv) { + var h = hsv[0] / 60, + s = hsv[1] / 100, + v = hsv[2] / 100, + hi = Math.floor(h) % 6; + + var f = h - Math.floor(h), + p = 255 * v * (1 - s), + q = 255 * v * (1 - (s * f)), + t = 255 * v * (1 - (s * (1 - f))), + v = 255 * v; + + switch(hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +} + +function hsv2hsl(hsv) { + var h = hsv[0], + s = hsv[1] / 100, + v = hsv[2] / 100, + sl, l; + + l = (2 - s) * v; + sl = s * v; + sl /= (l <= 1) ? l : 2 - l; + sl = sl || 0; + l /= 2; + return [h, sl * 100, l * 100]; +} + +function hsv2hwb(args) { + return rgb2hwb(hsv2rgb(args)) +} + +function hsv2cmyk(args) { + return rgb2cmyk(hsv2rgb(args)); +} + +function hsv2keyword(args) { + return rgb2keyword(hsv2rgb(args)); +} + +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +function hwb2rgb(hwb) { + var h = hwb[0] / 360, + wh = hwb[1] / 100, + bl = hwb[2] / 100, + ratio = wh + bl, + i, v, f, n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + if ((i & 0x01) != 0) { + f = 1 - f; + } + n = wh + f * (v - wh); // linear interpolation + + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + + return [r * 255, g * 255, b * 255]; +} + +function hwb2hsl(args) { + return rgb2hsl(hwb2rgb(args)); +} + +function hwb2hsv(args) { + return rgb2hsv(hwb2rgb(args)); +} + +function hwb2cmyk(args) { + return rgb2cmyk(hwb2rgb(args)); +} + +function hwb2keyword(args) { + return rgb2keyword(hwb2rgb(args)); +} + +function cmyk2rgb(cmyk) { + var c = cmyk[0] / 100, + m = cmyk[1] / 100, + y = cmyk[2] / 100, + k = cmyk[3] / 100, + r, g, b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + return [r * 255, g * 255, b * 255]; +} + +function cmyk2hsl(args) { + return rgb2hsl(cmyk2rgb(args)); +} + +function cmyk2hsv(args) { + return rgb2hsv(cmyk2rgb(args)); +} + +function cmyk2hwb(args) { + return rgb2hwb(cmyk2rgb(args)); +} + +function cmyk2keyword(args) { + return rgb2keyword(cmyk2rgb(args)); +} + + +function xyz2rgb(xyz) { + var x = xyz[0] / 100, + y = xyz[1] / 100, + z = xyz[2] / 100, + r, g, b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r = (r * 12.92); + + g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g = (g * 12.92); + + b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b = (b * 12.92); + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; +} + +function xyz2lab(xyz) { + var x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function xyz2lch(args) { + return lab2lch(xyz2lab(args)); +} + +function lab2xyz(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + x, y, z, y2; + + if (l <= 8) { + y = (l * 100) / 903.3; + y2 = (7.787 * (y / 100)) + (16 / 116); + } else { + y = 100 * Math.pow((l + 16) / 116, 3); + y2 = Math.pow(y / 100, 1/3); + } + + x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); + + z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); + + return [x, y, z]; +} + +function lab2lch(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + hr, h, c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + if (h < 0) { + h += 360; + } + c = Math.sqrt(a * a + b * b); + return [l, c, h]; +} + +function lab2rgb(args) { + return xyz2rgb(lab2xyz(args)); +} + +function lch2lab(lch) { + var l = lch[0], + c = lch[1], + h = lch[2], + a, b, hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + return [l, a, b]; +} + +function lch2xyz(args) { + return lab2xyz(lch2lab(args)); +} + +function lch2rgb(args) { + return lab2rgb(lch2lab(args)); +} + +function keyword2rgb(keyword) { + return cssKeywords[keyword]; +} + +function keyword2hsl(args) { + return rgb2hsl(keyword2rgb(args)); +} + +function keyword2hsv(args) { + return rgb2hsv(keyword2rgb(args)); +} + +function keyword2hwb(args) { + return rgb2hwb(keyword2rgb(args)); +} + +function keyword2cmyk(args) { + return rgb2cmyk(keyword2rgb(args)); +} + +function keyword2lab(args) { + return rgb2lab(keyword2rgb(args)); +} + +function keyword2xyz(args) { + return rgb2xyz(keyword2rgb(args)); +} + +var cssKeywords = { + aliceblue: [240,248,255], + antiquewhite: [250,235,215], + aqua: [0,255,255], + aquamarine: [127,255,212], + azure: [240,255,255], + beige: [245,245,220], + bisque: [255,228,196], + black: [0,0,0], + blanchedalmond: [255,235,205], + blue: [0,0,255], + blueviolet: [138,43,226], + brown: [165,42,42], + burlywood: [222,184,135], + cadetblue: [95,158,160], + chartreuse: [127,255,0], + chocolate: [210,105,30], + coral: [255,127,80], + cornflowerblue: [100,149,237], + cornsilk: [255,248,220], + crimson: [220,20,60], + cyan: [0,255,255], + darkblue: [0,0,139], + darkcyan: [0,139,139], + darkgoldenrod: [184,134,11], + darkgray: [169,169,169], + darkgreen: [0,100,0], + darkgrey: [169,169,169], + darkkhaki: [189,183,107], + darkmagenta: [139,0,139], + darkolivegreen: [85,107,47], + darkorange: [255,140,0], + darkorchid: [153,50,204], + darkred: [139,0,0], + darksalmon: [233,150,122], + darkseagreen: [143,188,143], + darkslateblue: [72,61,139], + darkslategray: [47,79,79], + darkslategrey: [47,79,79], + darkturquoise: [0,206,209], + darkviolet: [148,0,211], + deeppink: [255,20,147], + deepskyblue: [0,191,255], + dimgray: [105,105,105], + dimgrey: [105,105,105], + dodgerblue: [30,144,255], + firebrick: [178,34,34], + floralwhite: [255,250,240], + forestgreen: [34,139,34], + fuchsia: [255,0,255], + gainsboro: [220,220,220], + ghostwhite: [248,248,255], + gold: [255,215,0], + goldenrod: [218,165,32], + gray: [128,128,128], + green: [0,128,0], + greenyellow: [173,255,47], + grey: [128,128,128], + honeydew: [240,255,240], + hotpink: [255,105,180], + indianred: [205,92,92], + indigo: [75,0,130], + ivory: [255,255,240], + khaki: [240,230,140], + lavender: [230,230,250], + lavenderblush: [255,240,245], + lawngreen: [124,252,0], + lemonchiffon: [255,250,205], + lightblue: [173,216,230], + lightcoral: [240,128,128], + lightcyan: [224,255,255], + lightgoldenrodyellow: [250,250,210], + lightgray: [211,211,211], + lightgreen: [144,238,144], + lightgrey: [211,211,211], + lightpink: [255,182,193], + lightsalmon: [255,160,122], + lightseagreen: [32,178,170], + lightskyblue: [135,206,250], + lightslategray: [119,136,153], + lightslategrey: [119,136,153], + lightsteelblue: [176,196,222], + lightyellow: [255,255,224], + lime: [0,255,0], + limegreen: [50,205,50], + linen: [250,240,230], + magenta: [255,0,255], + maroon: [128,0,0], + mediumaquamarine: [102,205,170], + mediumblue: [0,0,205], + mediumorchid: [186,85,211], + mediumpurple: [147,112,219], + mediumseagreen: [60,179,113], + mediumslateblue: [123,104,238], + mediumspringgreen: [0,250,154], + mediumturquoise: [72,209,204], + mediumvioletred: [199,21,133], + midnightblue: [25,25,112], + mintcream: [245,255,250], + mistyrose: [255,228,225], + moccasin: [255,228,181], + navajowhite: [255,222,173], + navy: [0,0,128], + oldlace: [253,245,230], + olive: [128,128,0], + olivedrab: [107,142,35], + orange: [255,165,0], + orangered: [255,69,0], + orchid: [218,112,214], + palegoldenrod: [238,232,170], + palegreen: [152,251,152], + paleturquoise: [175,238,238], + palevioletred: [219,112,147], + papayawhip: [255,239,213], + peachpuff: [255,218,185], + peru: [205,133,63], + pink: [255,192,203], + plum: [221,160,221], + powderblue: [176,224,230], + purple: [128,0,128], + rebeccapurple: [102, 51, 153], + red: [255,0,0], + rosybrown: [188,143,143], + royalblue: [65,105,225], + saddlebrown: [139,69,19], + salmon: [250,128,114], + sandybrown: [244,164,96], + seagreen: [46,139,87], + seashell: [255,245,238], + sienna: [160,82,45], + silver: [192,192,192], + skyblue: [135,206,235], + slateblue: [106,90,205], + slategray: [112,128,144], + slategrey: [112,128,144], + snow: [255,250,250], + springgreen: [0,255,127], + steelblue: [70,130,180], + tan: [210,180,140], + teal: [0,128,128], + thistle: [216,191,216], + tomato: [255,99,71], + turquoise: [64,224,208], + violet: [238,130,238], + wheat: [245,222,179], + white: [255,255,255], + whitesmoke: [245,245,245], + yellow: [255,255,0], + yellowgreen: [154,205,50] +}; + +var reverseKeywords = {}; +for (var key in cssKeywords) { + reverseKeywords[JSON.stringify(cssKeywords[key])] = key; +} + +var convert = function() { + return new Converter(); +}; + +for (var func in conversions) { + // export Raw versions + convert[func + "Raw"] = (function(func) { + // accept array or plain args + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + return conversions[func](arg); + } + })(func); + + var pair = /(\w+)2(\w+)/.exec(func), + from = pair[1], + to = pair[2]; + + // export rgb2hsl and ["rgb"]["hsl"] + convert[from] = convert[from] || {}; + + convert[from][to] = convert[func] = (function(func) { + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + + var val = conversions[func](arg); + if (typeof val == "string" || val === undefined) + return val; // keyword + + for (var i = 0; i < val.length; i++) + val[i] = Math.round(val[i]); + return val; + } + })(func); +} + + +/* Converter does lazy conversion and caching */ +var Converter = function() { + this.convs = {}; +}; + +/* Either get the values for a space or + set the values for a space, depending on args */ +Converter.prototype.routeSpace = function(space, args) { + var values = args[0]; + if (values === undefined) { + // color.rgb() + return this.getValues(space); + } + // color.rgb(10, 10, 10) + if (typeof values == "number") { + values = Array.prototype.slice.call(args); + } + + return this.setValues(space, values); +}; + +/* Set the values for a space, invalidating cache */ +Converter.prototype.setValues = function(space, values) { + this.space = space; + this.convs = {}; + this.convs[space] = values; + return this; +}; + +/* Get the values for a space. If there's already + a conversion for the space, fetch it, otherwise + compute it */ +Converter.prototype.getValues = function(space) { + var vals = this.convs[space]; + if (!vals) { + var fspace = this.space, + from = this.convs[fspace]; + vals = convert[fspace][space](from); + + this.convs[space] = vals; + } + return vals; +}; + +["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { + Converter.prototype[space] = function(vals) { + return this.routeSpace(space, arguments); + }; +}); + +var colorConvert = convert; + +var colorName = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; + +/* MIT license */ + + +var colorString = { + getRgba: getRgba, + getHsla: getHsla, + getRgb: getRgb, + getHsl: getHsl, + getHwb: getHwb, + getAlpha: getAlpha, + + hexString: hexString, + rgbString: rgbString, + rgbaString: rgbaString, + percentString: percentString, + percentaString: percentaString, + hslString: hslString, + hslaString: hslaString, + hwbString: hwbString, + keyword: keyword +}; + +function getRgba(string) { + if (!string) { + return; + } + var abbr = /^#([a-fA-F0-9]{3,4})$/i, + hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i, + rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + keyword = /(\w+)/; + + var rgb = [0, 0, 0], + a = 1, + match = string.match(abbr), + hexAlpha = ""; + if (match) { + match = match[1]; + hexAlpha = match[3]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i] + match[i], 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(hex)) { + hexAlpha = match[2]; + match = match[1]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(rgba)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i + 1]); + } + a = parseFloat(match[4]); + } + else if (match = string.match(per)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); + } + a = parseFloat(match[4]); + } + else if (match = string.match(keyword)) { + if (match[1] == "transparent") { + return [0, 0, 0, 0]; + } + rgb = colorName[match[1]]; + if (!rgb) { + return; + } + } + + for (var i = 0; i < rgb.length; i++) { + rgb[i] = scale(rgb[i], 0, 255); + } + if (!a && a != 0) { + a = 1; + } + else { + a = scale(a, 0, 1); + } + rgb[3] = a; + return rgb; +} + +function getHsla(string) { + if (!string) { + return; + } + var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hsl); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + s = scale(parseFloat(match[2]), 0, 100), + l = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, s, l, a]; + } +} + +function getHwb(string) { + if (!string) { + return; + } + var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hwb); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + w = scale(parseFloat(match[2]), 0, 100), + b = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, w, b, a]; + } +} + +function getRgb(string) { + var rgba = getRgba(string); + return rgba && rgba.slice(0, 3); +} + +function getHsl(string) { + var hsla = getHsla(string); + return hsla && hsla.slice(0, 3); +} + +function getAlpha(string) { + var vals = getRgba(string); + if (vals) { + return vals[3]; + } + else if (vals = getHsla(string)) { + return vals[3]; + } + else if (vals = getHwb(string)) { + return vals[3]; + } +} + +// generators +function hexString(rgba, a) { + var a = (a !== undefined && rgba.length === 3) ? a : rgba[3]; + return "#" + hexDouble(rgba[0]) + + hexDouble(rgba[1]) + + hexDouble(rgba[2]) + + ( + (a >= 0 && a < 1) + ? hexDouble(Math.round(a * 255)) + : "" + ); +} + +function rgbString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return rgbaString(rgba, alpha); + } + return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; +} + +function rgbaString(rgba, alpha) { + if (alpha === undefined) { + alpha = (rgba[3] !== undefined ? rgba[3] : 1); + } + return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + + ", " + alpha + ")"; +} + +function percentString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return percentaString(rgba, alpha); + } + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + + return "rgb(" + r + "%, " + g + "%, " + b + "%)"; +} + +function percentaString(rgba, alpha) { + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; +} + +function hslString(hsla, alpha) { + if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { + return hslaString(hsla, alpha); + } + return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; +} + +function hslaString(hsla, alpha) { + if (alpha === undefined) { + alpha = (hsla[3] !== undefined ? hsla[3] : 1); + } + return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + + alpha + ")"; +} + +// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax +// (hwb have alpha optional & 1 is default value) +function hwbString(hwb, alpha) { + if (alpha === undefined) { + alpha = (hwb[3] !== undefined ? hwb[3] : 1); + } + return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" + + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; +} + +function keyword(rgb) { + return reverseNames[rgb.slice(0, 3)]; +} + +// helpers +function scale(num, min, max) { + return Math.min(Math.max(min, num), max); +} + +function hexDouble(num) { + var str = num.toString(16).toUpperCase(); + return (str.length < 2) ? "0" + str : str; +} + + +//create a list of reverse color names +var reverseNames = {}; +for (var name in colorName) { + reverseNames[colorName[name]] = name; +} + +/* MIT license */ + + + +var Color = function (obj) { + if (obj instanceof Color) { + return obj; + } + if (!(this instanceof Color)) { + return new Color(obj); + } + + this.valid = false; + this.values = { + rgb: [0, 0, 0], + hsl: [0, 0, 0], + hsv: [0, 0, 0], + hwb: [0, 0, 0], + cmyk: [0, 0, 0, 0], + alpha: 1 + }; + + // parse Color() argument + var vals; + if (typeof obj === 'string') { + vals = colorString.getRgba(obj); + if (vals) { + this.setValues('rgb', vals); + } else if (vals = colorString.getHsla(obj)) { + this.setValues('hsl', vals); + } else if (vals = colorString.getHwb(obj)) { + this.setValues('hwb', vals); + } + } else if (typeof obj === 'object') { + vals = obj; + if (vals.r !== undefined || vals.red !== undefined) { + this.setValues('rgb', vals); + } else if (vals.l !== undefined || vals.lightness !== undefined) { + this.setValues('hsl', vals); + } else if (vals.v !== undefined || vals.value !== undefined) { + this.setValues('hsv', vals); + } else if (vals.w !== undefined || vals.whiteness !== undefined) { + this.setValues('hwb', vals); + } else if (vals.c !== undefined || vals.cyan !== undefined) { + this.setValues('cmyk', vals); + } + } +}; + +Color.prototype = { + isValid: function () { + return this.valid; + }, + rgb: function () { + return this.setSpace('rgb', arguments); + }, + hsl: function () { + return this.setSpace('hsl', arguments); + }, + hsv: function () { + return this.setSpace('hsv', arguments); + }, + hwb: function () { + return this.setSpace('hwb', arguments); + }, + cmyk: function () { + return this.setSpace('cmyk', arguments); + }, + + rgbArray: function () { + return this.values.rgb; + }, + hslArray: function () { + return this.values.hsl; + }, + hsvArray: function () { + return this.values.hsv; + }, + hwbArray: function () { + var values = this.values; + if (values.alpha !== 1) { + return values.hwb.concat([values.alpha]); + } + return values.hwb; + }, + cmykArray: function () { + return this.values.cmyk; + }, + rgbaArray: function () { + var values = this.values; + return values.rgb.concat([values.alpha]); + }, + hslaArray: function () { + var values = this.values; + return values.hsl.concat([values.alpha]); + }, + alpha: function (val) { + if (val === undefined) { + return this.values.alpha; + } + this.setValues('alpha', val); + return this; + }, + + red: function (val) { + return this.setChannel('rgb', 0, val); + }, + green: function (val) { + return this.setChannel('rgb', 1, val); + }, + blue: function (val) { + return this.setChannel('rgb', 2, val); + }, + hue: function (val) { + if (val) { + val %= 360; + val = val < 0 ? 360 + val : val; + } + return this.setChannel('hsl', 0, val); + }, + saturation: function (val) { + return this.setChannel('hsl', 1, val); + }, + lightness: function (val) { + return this.setChannel('hsl', 2, val); + }, + saturationv: function (val) { + return this.setChannel('hsv', 1, val); + }, + whiteness: function (val) { + return this.setChannel('hwb', 1, val); + }, + blackness: function (val) { + return this.setChannel('hwb', 2, val); + }, + value: function (val) { + return this.setChannel('hsv', 2, val); + }, + cyan: function (val) { + return this.setChannel('cmyk', 0, val); + }, + magenta: function (val) { + return this.setChannel('cmyk', 1, val); + }, + yellow: function (val) { + return this.setChannel('cmyk', 2, val); + }, + black: function (val) { + return this.setChannel('cmyk', 3, val); + }, + + hexString: function () { + return colorString.hexString(this.values.rgb); + }, + rgbString: function () { + return colorString.rgbString(this.values.rgb, this.values.alpha); + }, + rgbaString: function () { + return colorString.rgbaString(this.values.rgb, this.values.alpha); + }, + percentString: function () { + return colorString.percentString(this.values.rgb, this.values.alpha); + }, + hslString: function () { + return colorString.hslString(this.values.hsl, this.values.alpha); + }, + hslaString: function () { + return colorString.hslaString(this.values.hsl, this.values.alpha); + }, + hwbString: function () { + return colorString.hwbString(this.values.hwb, this.values.alpha); + }, + keyword: function () { + return colorString.keyword(this.values.rgb, this.values.alpha); + }, + + rgbNumber: function () { + var rgb = this.values.rgb; + return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + }, + + luminosity: function () { + // http://www.w3.org/TR/WCAG20/#relativeluminancedef + var rgb = this.values.rgb; + var lum = []; + for (var i = 0; i < rgb.length; i++) { + var chan = rgb[i] / 255; + lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); + } + return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; + }, + + contrast: function (color2) { + // http://www.w3.org/TR/WCAG20/#contrast-ratiodef + var lum1 = this.luminosity(); + var lum2 = color2.luminosity(); + if (lum1 > lum2) { + return (lum1 + 0.05) / (lum2 + 0.05); + } + return (lum2 + 0.05) / (lum1 + 0.05); + }, + + level: function (color2) { + var contrastRatio = this.contrast(color2); + if (contrastRatio >= 7.1) { + return 'AAA'; + } + + return (contrastRatio >= 4.5) ? 'AA' : ''; + }, + + dark: function () { + // YIQ equation from http://24ways.org/2010/calculating-color-contrast + var rgb = this.values.rgb; + var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; + return yiq < 128; + }, + + light: function () { + return !this.dark(); + }, + + negate: function () { + var rgb = []; + for (var i = 0; i < 3; i++) { + rgb[i] = 255 - this.values.rgb[i]; + } + this.setValues('rgb', rgb); + return this; + }, + + lighten: function (ratio) { + var hsl = this.values.hsl; + hsl[2] += hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + darken: function (ratio) { + var hsl = this.values.hsl; + hsl[2] -= hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + saturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] += hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + desaturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] -= hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + whiten: function (ratio) { + var hwb = this.values.hwb; + hwb[1] += hwb[1] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + blacken: function (ratio) { + var hwb = this.values.hwb; + hwb[2] += hwb[2] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + greyscale: function () { + var rgb = this.values.rgb; + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; + this.setValues('rgb', [val, val, val]); + return this; + }, + + clearer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha - (alpha * ratio)); + return this; + }, + + opaquer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha + (alpha * ratio)); + return this; + }, + + rotate: function (degrees) { + var hsl = this.values.hsl; + var hue = (hsl[0] + degrees) % 360; + hsl[0] = hue < 0 ? 360 + hue : hue; + this.setValues('hsl', hsl); + return this; + }, + + /** + * Ported from sass implementation in C + * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 + */ + mix: function (mixinColor, weight) { + var color1 = this; + var color2 = mixinColor; + var p = weight === undefined ? 0.5 : weight; + + var w = 2 * p - 1; + var a = color1.alpha() - color2.alpha(); + + var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + return this + .rgb( + w1 * color1.red() + w2 * color2.red(), + w1 * color1.green() + w2 * color2.green(), + w1 * color1.blue() + w2 * color2.blue() + ) + .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); + }, + + toJSON: function () { + return this.rgb(); + }, + + clone: function () { + // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, + // making the final build way to big to embed in Chart.js. So let's do it manually, + // assuming that values to clone are 1 dimension arrays containing only numbers, + // except 'alpha' which is a number. + var result = new Color(); + var source = this.values; + var target = result.values; + var value, type; + + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + value = source[prop]; + type = ({}).toString.call(value); + if (type === '[object Array]') { + target[prop] = value.slice(0); + } else if (type === '[object Number]') { + target[prop] = value; + } else { + console.error('unexpected color value:', value); + } + } + } + + return result; + } +}; + +Color.prototype.spaces = { + rgb: ['red', 'green', 'blue'], + hsl: ['hue', 'saturation', 'lightness'], + hsv: ['hue', 'saturation', 'value'], + hwb: ['hue', 'whiteness', 'blackness'], + cmyk: ['cyan', 'magenta', 'yellow', 'black'] +}; + +Color.prototype.maxes = { + rgb: [255, 255, 255], + hsl: [360, 100, 100], + hsv: [360, 100, 100], + hwb: [360, 100, 100], + cmyk: [100, 100, 100, 100] +}; + +Color.prototype.getValues = function (space) { + var values = this.values; + var vals = {}; + + for (var i = 0; i < space.length; i++) { + vals[space.charAt(i)] = values[space][i]; + } + + if (values.alpha !== 1) { + vals.a = values.alpha; + } + + // {r: 255, g: 255, b: 255, a: 0.4} + return vals; +}; + +Color.prototype.setValues = function (space, vals) { + var values = this.values; + var spaces = this.spaces; + var maxes = this.maxes; + var alpha = 1; + var i; + + this.valid = true; + + if (space === 'alpha') { + alpha = vals; + } else if (vals.length) { + // [10, 10, 10] + values[space] = vals.slice(0, space.length); + alpha = vals[space.length]; + } else if (vals[space.charAt(0)] !== undefined) { + // {r: 10, g: 10, b: 10} + for (i = 0; i < space.length; i++) { + values[space][i] = vals[space.charAt(i)]; + } + + alpha = vals.a; + } else if (vals[spaces[space][0]] !== undefined) { + // {red: 10, green: 10, blue: 10} + var chans = spaces[space]; + + for (i = 0; i < space.length; i++) { + values[space][i] = vals[chans[i]]; + } + + alpha = vals.alpha; + } + + values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); + + if (space === 'alpha') { + return false; + } + + var capped; + + // cap values of the space prior converting all values + for (i = 0; i < space.length; i++) { + capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); + values[space][i] = Math.round(capped); + } + + // convert to all the other color spaces + for (var sname in spaces) { + if (sname !== space) { + values[sname] = colorConvert[space][sname](values[space]); + } + } + + return true; +}; + +Color.prototype.setSpace = function (space, args) { + var vals = args[0]; + + if (vals === undefined) { + // color.rgb() + return this.getValues(space); + } + + // color.rgb(10, 10, 10) + if (typeof vals === 'number') { + vals = Array.prototype.slice.call(args); + } + + this.setValues(space, vals); + return this; +}; + +Color.prototype.setChannel = function (space, index, val) { + var svalues = this.values[space]; + if (val === undefined) { + // color.red() + return svalues[index]; + } else if (val === svalues[index]) { + // color.red(color.red()) + return this; + } + + // color.red(100) + svalues[index] = val; + this.setValues(space, svalues); + + return this; +}; + +if (typeof window !== 'undefined') { + window.Color = Color; +} + +var chartjsColor = Color; + +/** + * @namespace Chart.helpers + */ +var helpers = { + /** + * An empty function that can be used, for example, for optional callback. + */ + noop: function() {}, + + /** + * Returns a unique id, sequentially generated from a global variable. + * @returns {number} + * @function + */ + uid: (function() { + var id = 0; + return function() { + return id++; + }; + }()), + + /** + * Returns true if `value` is neither null nor undefined, else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isNullOrUndef: function(value) { + return value === null || typeof value === 'undefined'; + }, + + /** + * Returns true if `value` is an array (including typed arrays), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @function + */ + isArray: function(value) { + if (Array.isArray && Array.isArray(value)) { + return true; + } + var type = Object.prototype.toString.call(value); + if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { + return true; + } + return false; + }, + + /** + * Returns true if `value` is an object (excluding null), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isObject: function(value) { + return value !== null && Object.prototype.toString.call(value) === '[object Object]'; + }, + + /** + * Returns true if `value` is a finite number, else returns false + * @param {*} value - The value to test. + * @returns {boolean} + */ + isFinite: function(value) { + return (typeof value === 'number' || value instanceof Number) && isFinite(value); + }, + + /** + * Returns `value` if defined, else returns `defaultValue`. + * @param {*} value - The value to return if defined. + * @param {*} defaultValue - The value to return if `value` is undefined. + * @returns {*} + */ + valueOrDefault: function(value, defaultValue) { + return typeof value === 'undefined' ? defaultValue : value; + }, + + /** + * Returns value at the given `index` in array if defined, else returns `defaultValue`. + * @param {Array} value - The array to lookup for value at `index`. + * @param {number} index - The index in `value` to lookup for value. + * @param {*} defaultValue - The value to return if `value[index]` is undefined. + * @returns {*} + */ + valueAtIndexOrDefault: function(value, index, defaultValue) { + return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); + }, + + /** + * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the + * value returned by `fn`. If `fn` is not a function, this method returns undefined. + * @param {function} fn - The function to call. + * @param {Array|undefined|null} args - The arguments with which `fn` should be called. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @returns {*} + */ + callback: function(fn, args, thisArg) { + if (fn && typeof fn.call === 'function') { + return fn.apply(thisArg, args); + } + }, + + /** + * Note(SB) for performance sake, this method should only be used when loopable type + * is unknown or in none intensive code (not called often and small loopable). Else + * it's preferable to use a regular for() loop and save extra function calls. + * @param {object|Array} loopable - The object or array to be iterated. + * @param {function} fn - The function to call for each item. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @param {boolean} [reverse] - If true, iterates backward on the loopable. + */ + each: function(loopable, fn, thisArg, reverse) { + var i, len, keys; + if (helpers.isArray(loopable)) { + len = loopable.length; + if (reverse) { + for (i = len - 1; i >= 0; i--) { + fn.call(thisArg, loopable[i], i); + } + } else { + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[i], i); + } + } + } else if (helpers.isObject(loopable)) { + keys = Object.keys(loopable); + len = keys.length; + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[keys[i]], keys[i]); + } + } + }, + + /** + * Returns true if the `a0` and `a1` arrays have the same content, else returns false. + * @see https://stackoverflow.com/a/14853974 + * @param {Array} a0 - The array to compare + * @param {Array} a1 - The array to compare + * @returns {boolean} + */ + arrayEquals: function(a0, a1) { + var i, ilen, v0, v1; + + if (!a0 || !a1 || a0.length !== a1.length) { + return false; + } + + for (i = 0, ilen = a0.length; i < ilen; ++i) { + v0 = a0[i]; + v1 = a1[i]; + + if (v0 instanceof Array && v1 instanceof Array) { + if (!helpers.arrayEquals(v0, v1)) { + return false; + } + } else if (v0 !== v1) { + // NOTE: two different object instances will never be equal: {x:20} != {x:20} + return false; + } + } + + return true; + }, + + /** + * Returns a deep copy of `source` without keeping references on objects and arrays. + * @param {*} source - The value to clone. + * @returns {*} + */ + clone: function(source) { + if (helpers.isArray(source)) { + return source.map(helpers.clone); + } + + if (helpers.isObject(source)) { + var target = {}; + var keys = Object.keys(source); + var klen = keys.length; + var k = 0; + + for (; k < klen; ++k) { + target[keys[k]] = helpers.clone(source[keys[k]]); + } + + return target; + } + + return source; + }, + + /** + * The default merger when Chart.helpers.merge is called without merger option. + * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. + * @private + */ + _merger: function(key, target, source, options) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.merge(tval, sval, options); + } else { + target[key] = helpers.clone(sval); + } + }, + + /** + * Merges source[key] in target[key] only if target[key] is undefined. + * @private + */ + _mergerIf: function(key, target, source) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.mergeIf(tval, sval); + } else if (!target.hasOwnProperty(key)) { + target[key] = helpers.clone(sval); + } + }, + + /** + * Recursively deep copies `source` properties into `target` with the given `options`. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @param {object} [options] - Merging options: + * @param {function} [options.merger] - The merge method (key, target, source, options) + * @returns {object} The `target` object. + */ + merge: function(target, source, options) { + var sources = helpers.isArray(source) ? source : [source]; + var ilen = sources.length; + var merge, i, keys, klen, k; + + if (!helpers.isObject(target)) { + return target; + } + + options = options || {}; + merge = options.merger || helpers._merger; + + for (i = 0; i < ilen; ++i) { + source = sources[i]; + if (!helpers.isObject(source)) { + continue; + } + + keys = Object.keys(source); + for (k = 0, klen = keys.length; k < klen; ++k) { + merge(keys[k], target, source, options); + } + } + + return target; + }, + + /** + * Recursively deep copies `source` properties into `target` *only* if not defined in target. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @returns {object} The `target` object. + */ + mergeIf: function(target, source) { + return helpers.merge(target, source, {merger: helpers._mergerIf}); + }, + + /** + * Applies the contents of two or more objects together into the first object. + * @param {object} target - The target object in which all objects are merged into. + * @param {object} arg1 - Object containing additional properties to merge in target. + * @param {object} argN - Additional objects containing properties to merge in target. + * @returns {object} The `target` object. + */ + extend: function(target) { + var setFn = function(value, key) { + target[key] = value; + }; + for (var i = 1, ilen = arguments.length; i < ilen; ++i) { + helpers.each(arguments[i], setFn); + } + return target; + }, + + /** + * Basic javascript inheritance based on the model created in Backbone.js + */ + inherits: function(extensions) { + var me = this; + var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { + return me.apply(this, arguments); + }; + + var Surrogate = function() { + this.constructor = ChartElement; + }; + + Surrogate.prototype = me.prototype; + ChartElement.prototype = new Surrogate(); + ChartElement.extend = helpers.inherits; + + if (extensions) { + helpers.extend(ChartElement.prototype, extensions); + } + + ChartElement.__super__ = me.prototype; + return ChartElement; + } +}; + +var helpers_core = helpers; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.callback instead. + * @function Chart.helpers.callCallback + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +helpers.callCallback = helpers.callback; + +/** + * Provided for backward compatibility, use Array.prototype.indexOf instead. + * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ + * @function Chart.helpers.indexOf + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.indexOf = function(array, item, fromIndex) { + return Array.prototype.indexOf.call(array, item, fromIndex); +}; + +/** + * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. + * @function Chart.helpers.getValueOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueOrDefault = helpers.valueOrDefault; + +/** + * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. + * @function Chart.helpers.getValueAtIndexOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + +/** + * Easing functions adapted from Robert Penner's easing equations. + * @namespace Chart.helpers.easingEffects + * @see http://www.robertpenner.com/easing/ + */ +var effects = { + linear: function(t) { + return t; + }, + + easeInQuad: function(t) { + return t * t; + }, + + easeOutQuad: function(t) { + return -t * (t - 2); + }, + + easeInOutQuad: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t; + } + return -0.5 * ((--t) * (t - 2) - 1); + }, + + easeInCubic: function(t) { + return t * t * t; + }, + + easeOutCubic: function(t) { + return (t = t - 1) * t * t + 1; + }, + + easeInOutCubic: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t; + } + return 0.5 * ((t -= 2) * t * t + 2); + }, + + easeInQuart: function(t) { + return t * t * t * t; + }, + + easeOutQuart: function(t) { + return -((t = t - 1) * t * t * t - 1); + }, + + easeInOutQuart: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t; + } + return -0.5 * ((t -= 2) * t * t * t - 2); + }, + + easeInQuint: function(t) { + return t * t * t * t * t; + }, + + easeOutQuint: function(t) { + return (t = t - 1) * t * t * t * t + 1; + }, + + easeInOutQuint: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t * t; + } + return 0.5 * ((t -= 2) * t * t * t * t + 2); + }, + + easeInSine: function(t) { + return -Math.cos(t * (Math.PI / 2)) + 1; + }, + + easeOutSine: function(t) { + return Math.sin(t * (Math.PI / 2)); + }, + + easeInOutSine: function(t) { + return -0.5 * (Math.cos(Math.PI * t) - 1); + }, + + easeInExpo: function(t) { + return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); + }, + + easeOutExpo: function(t) { + return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; + }, + + easeInOutExpo: function(t) { + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if ((t /= 0.5) < 1) { + return 0.5 * Math.pow(2, 10 * (t - 1)); + } + return 0.5 * (-Math.pow(2, -10 * --t) + 2); + }, + + easeInCirc: function(t) { + if (t >= 1) { + return t; + } + return -(Math.sqrt(1 - t * t) - 1); + }, + + easeOutCirc: function(t) { + return Math.sqrt(1 - (t = t - 1) * t); + }, + + easeInOutCirc: function(t) { + if ((t /= 0.5) < 1) { + return -0.5 * (Math.sqrt(1 - t * t) - 1); + } + return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + + easeInElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + }, + + easeOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; + }, + + easeInOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if ((t /= 0.5) === 2) { + return 1; + } + if (!p) { + p = 0.45; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + if (t < 1) { + return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function(t) { + var s = 1.70158; + return t * t * ((s + 1) * t - s); + }, + + easeOutBack: function(t) { + var s = 1.70158; + return (t = t - 1) * t * ((s + 1) * t + s) + 1; + }, + + easeInOutBack: function(t) { + var s = 1.70158; + if ((t /= 0.5) < 1) { + return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); + } + return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + + easeInBounce: function(t) { + return 1 - effects.easeOutBounce(1 - t); + }, + + easeOutBounce: function(t) { + if (t < (1 / 2.75)) { + return 7.5625 * t * t; + } + if (t < (2 / 2.75)) { + return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; + } + if (t < (2.5 / 2.75)) { + return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; + } + return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; + }, + + easeInOutBounce: function(t) { + if (t < 0.5) { + return effects.easeInBounce(t * 2) * 0.5; + } + return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; + } +}; + +var helpers_easing = { + effects: effects +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.easing.effects instead. + * @function Chart.helpers.easingEffects + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.easingEffects = effects; + +var PI = Math.PI; +var RAD_PER_DEG = PI / 180; +var DOUBLE_PI = PI * 2; +var HALF_PI = PI / 2; +var QUARTER_PI = PI / 4; +var TWO_THIRDS_PI = PI * 2 / 3; + +/** + * @namespace Chart.helpers.canvas + */ +var exports$1 = { + /** + * Clears the entire canvas associated to the given `chart`. + * @param {Chart} chart - The chart for which to clear the canvas. + */ + clear: function(chart) { + chart.ctx.clearRect(0, 0, chart.width, chart.height); + }, + + /** + * Creates a "path" for a rectangle with rounded corners at position (x, y) with a + * given size (width, height) and the same `radius` for all corners. + * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. + * @param {number} x - The x axis of the coordinate for the rectangle starting point. + * @param {number} y - The y axis of the coordinate for the rectangle starting point. + * @param {number} width - The rectangle's width. + * @param {number} height - The rectangle's height. + * @param {number} radius - The rounded amount (in pixels) for the four corners. + * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? + */ + roundedRect: function(ctx, x, y, width, height, radius) { + if (radius) { + var r = Math.min(radius, height / 2, width / 2); + var left = x + r; + var top = y + r; + var right = x + width - r; + var bottom = y + height - r; + + ctx.moveTo(x, top); + if (left < right && top < bottom) { + ctx.arc(left, top, r, -PI, -HALF_PI); + ctx.arc(right, top, r, -HALF_PI, 0); + ctx.arc(right, bottom, r, 0, HALF_PI); + ctx.arc(left, bottom, r, HALF_PI, PI); + } else if (left < right) { + ctx.moveTo(left, y); + ctx.arc(right, top, r, -HALF_PI, HALF_PI); + ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); + } else if (top < bottom) { + ctx.arc(left, top, r, -PI, 0); + ctx.arc(left, bottom, r, 0, PI); + } else { + ctx.arc(left, top, r, -PI, PI); + } + ctx.closePath(); + ctx.moveTo(x, y); + } else { + ctx.rect(x, y, width, height); + } + }, + + drawPoint: function(ctx, style, radius, x, y, rotation) { + var type, xOffset, yOffset, size, cornerRadius; + var rad = (rotation || 0) * RAD_PER_DEG; + + if (style && typeof style === 'object') { + type = style.toString(); + if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { + ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); + return; + } + } + + if (isNaN(radius) || radius <= 0) { + return; + } + + ctx.beginPath(); + + switch (style) { + // Default includes circle + default: + ctx.arc(x, y, radius, 0, DOUBLE_PI); + ctx.closePath(); + break; + case 'triangle': + ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + ctx.closePath(); + break; + case 'rectRounded': + // NOTE: the rounded rect implementation changed to use `arc` instead of + // `quadraticCurveTo` since it generates better results when rect is + // almost a circle. 0.516 (instead of 0.5) produces results with visually + // closer proportion to the previous impl and it is inscribed in the + // circle with `radius`. For more details, see the following PRs: + // https://github.com/chartjs/Chart.js/issues/5597 + // https://github.com/chartjs/Chart.js/issues/5858 + cornerRadius = radius * 0.516; + size = radius - cornerRadius; + xOffset = Math.cos(rad + QUARTER_PI) * size; + yOffset = Math.sin(rad + QUARTER_PI) * size; + ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); + ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); + ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); + ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); + ctx.closePath(); + break; + case 'rect': + if (!rotation) { + size = Math.SQRT1_2 * radius; + ctx.rect(x - size, y - size, 2 * size, 2 * size); + break; + } + rad += QUARTER_PI; + /* falls through */ + case 'rectRot': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + yOffset, y - xOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.lineTo(x - yOffset, y + xOffset); + ctx.closePath(); + break; + case 'crossRot': + rad += QUARTER_PI; + /* falls through */ + case 'cross': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'star': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + rad += QUARTER_PI; + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'line': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + break; + case 'dash': + ctx.moveTo(x, y); + ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); + break; + } + + ctx.fill(); + ctx.stroke(); + }, + + /** + * Returns true if the point is inside the rectangle + * @param {object} point - The point to test + * @param {object} area - The rectangle + * @returns {boolean} + * @private + */ + _isPointInArea: function(point, area) { + var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error. + + return point.x > area.left - epsilon && point.x < area.right + epsilon && + point.y > area.top - epsilon && point.y < area.bottom + epsilon; + }, + + clipArea: function(ctx, area) { + ctx.save(); + ctx.beginPath(); + ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); + ctx.clip(); + }, + + unclipArea: function(ctx) { + ctx.restore(); + }, + + lineTo: function(ctx, previous, target, flip) { + var stepped = target.steppedLine; + if (stepped) { + if (stepped === 'middle') { + var midpoint = (previous.x + target.x) / 2.0; + ctx.lineTo(midpoint, flip ? target.y : previous.y); + ctx.lineTo(midpoint, flip ? previous.y : target.y); + } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) { + ctx.lineTo(previous.x, target.y); + } else { + ctx.lineTo(target.x, previous.y); + } + ctx.lineTo(target.x, target.y); + return; + } + + if (!target.tension) { + ctx.lineTo(target.x, target.y); + return; + } + + ctx.bezierCurveTo( + flip ? previous.controlPointPreviousX : previous.controlPointNextX, + flip ? previous.controlPointPreviousY : previous.controlPointNextY, + flip ? target.controlPointNextX : target.controlPointPreviousX, + flip ? target.controlPointNextY : target.controlPointPreviousY, + target.x, + target.y); + } +}; + +var helpers_canvas = exports$1; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. + * @namespace Chart.helpers.clear + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.clear = exports$1.clear; + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. + * @namespace Chart.helpers.drawRoundedRectangle + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.drawRoundedRectangle = function(ctx) { + ctx.beginPath(); + exports$1.roundedRect.apply(exports$1, arguments); +}; + +var defaults = { + /** + * @private + */ + _set: function(scope, values) { + return helpers_core.merge(this[scope] || (this[scope] = {}), values); + } +}; + +defaults._set('global', { + defaultColor: 'rgba(0,0,0,0.1)', + defaultFontColor: '#666', + defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + defaultFontSize: 12, + defaultFontStyle: 'normal', + defaultLineHeight: 1.2, + showLines: true +}); + +var core_defaults = defaults; + +var valueOrDefault = helpers_core.valueOrDefault; + +/** + * Converts the given font object into a CSS font string. + * @param {object} font - A font object. + * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font + * @private + */ +function toFontString(font) { + if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) { + return null; + } + + return (font.style ? font.style + ' ' : '') + + (font.weight ? font.weight + ' ' : '') + + font.size + 'px ' + + font.family; +} + +/** + * @alias Chart.helpers.options + * @namespace + */ +var helpers_options = { + /** + * Converts the given line height `value` in pixels for a specific font `size`. + * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). + * @param {number} size - The font size (in pixels) used to resolve relative `value`. + * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid). + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height + * @since 2.7.0 + */ + toLineHeight: function(value, size) { + var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); + if (!matches || matches[1] === 'normal') { + return size * 1.2; + } + + value = +matches[2]; + + switch (matches[3]) { + case 'px': + return value; + case '%': + value /= 100; + break; + default: + break; + } + + return size * value; + }, + + /** + * Converts the given value into a padding object with pre-computed width/height. + * @param {number|object} value - If a number, set the value to all TRBL component, + * else, if and object, use defined properties and sets undefined ones to 0. + * @returns {object} The padding values (top, right, bottom, left, width, height) + * @since 2.7.0 + */ + toPadding: function(value) { + var t, r, b, l; + + if (helpers_core.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + top: t, + right: r, + bottom: b, + left: l, + height: t + b, + width: l + r + }; + }, + + /** + * Parses font options and returns the font object. + * @param {object} options - A object that contains font options to be parsed. + * @return {object} The font object. + * @todo Support font.* options and renamed to toFont(). + * @private + */ + _parseFont: function(options) { + var globalDefaults = core_defaults.global; + var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); + var font = { + family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily), + lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size), + size: size, + style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle), + weight: null, + string: '' + }; + + font.string = toFontString(font); + return font; + }, + + /** + * Evaluates the given `inputs` sequentially and returns the first defined value. + * @param {Array} inputs - An array of values, falling back to the last value. + * @param {object} [context] - If defined and the current value is a function, the value + * is called with `context` as first argument and the result becomes the new input. + * @param {number} [index] - If defined and the current value is an array, the value + * at `index` become the new input. + * @since 2.7.0 + */ + resolve: function(inputs, context, index) { + var i, ilen, value; + + for (i = 0, ilen = inputs.length; i < ilen; ++i) { + value = inputs[i]; + if (value === undefined) { + continue; + } + if (context !== undefined && typeof value === 'function') { + value = value(context); + } + if (index !== undefined && helpers_core.isArray(value)) { + value = value[index]; + } + if (value !== undefined) { + return value; + } + } + } +}; + +var helpers$1 = helpers_core; +var easing = helpers_easing; +var canvas = helpers_canvas; +var options = helpers_options; +helpers$1.easing = easing; +helpers$1.canvas = canvas; +helpers$1.options = options; + +function interpolate(start, view, model, ease) { + var keys = Object.keys(model); + var i, ilen, key, actual, origin, target, type, c0, c1; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + + target = model[key]; + + // if a value is added to the model after pivot() has been called, the view + // doesn't contain it, so let's initialize the view to the target value. + if (!view.hasOwnProperty(key)) { + view[key] = target; + } + + actual = view[key]; + + if (actual === target || key[0] === '_') { + continue; + } + + if (!start.hasOwnProperty(key)) { + start[key] = actual; + } + + origin = start[key]; + + type = typeof target; + + if (type === typeof origin) { + if (type === 'string') { + c0 = chartjsColor(origin); + if (c0.valid) { + c1 = chartjsColor(target); + if (c1.valid) { + view[key] = c1.mix(c0, ease).rgbString(); + continue; + } + } + } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) { + view[key] = origin + (target - origin) * ease; + continue; + } + } + + view[key] = target; + } +} + +var Element = function(configuration) { + helpers$1.extend(this, configuration); + this.initialize.apply(this, arguments); +}; + +helpers$1.extend(Element.prototype, { + + initialize: function() { + this.hidden = false; + }, + + pivot: function() { + var me = this; + if (!me._view) { + me._view = helpers$1.clone(me._model); + } + me._start = {}; + return me; + }, + + transition: function(ease) { + var me = this; + var model = me._model; + var start = me._start; + var view = me._view; + + // No animation -> No Transition + if (!model || ease === 1) { + me._view = model; + me._start = null; + return me; + } + + if (!view) { + view = me._view = {}; + } + + if (!start) { + start = me._start = {}; + } + + interpolate(start, view, model, ease); + + return me; + }, + + tooltipPosition: function() { + return { + x: this._model.x, + y: this._model.y + }; + }, + + hasValue: function() { + return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y); + } +}); + +Element.extend = helpers$1.inherits; + +var core_element = Element; + +var exports$2 = core_element.extend({ + chart: null, // the animation associated chart instance + currentStep: 0, // the current animation step + numSteps: 60, // default number of steps + easing: '', // the easing to use for this animation + render: null, // render function used by the animation service + + onAnimationProgress: null, // user specified callback to fire on each step of the animation + onAnimationComplete: null, // user specified callback to fire when the animation finishes +}); + +var core_animation = exports$2; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.Animation instead + * @prop Chart.Animation#animationObject + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$2.prototype, 'animationObject', { + get: function() { + return this; + } +}); + +/** + * Provided for backward compatibility, use Chart.Animation#chart instead + * @prop Chart.Animation#chartInstance + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$2.prototype, 'chartInstance', { + get: function() { + return this.chart; + }, + set: function(value) { + this.chart = value; + } +}); + +core_defaults._set('global', { + animation: { + duration: 1000, + easing: 'easeOutQuart', + onProgress: helpers$1.noop, + onComplete: helpers$1.noop + } +}); + +var core_animations = { + animations: [], + request: null, + + /** + * @param {Chart} chart - The chart to animate. + * @param {Chart.Animation} animation - The animation that we will animate. + * @param {number} duration - The animation duration in ms. + * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions + */ + addAnimation: function(chart, animation, duration, lazy) { + var animations = this.animations; + var i, ilen; + + animation.chart = chart; + animation.startTime = Date.now(); + animation.duration = duration; + + if (!lazy) { + chart.animating = true; + } + + for (i = 0, ilen = animations.length; i < ilen; ++i) { + if (animations[i].chart === chart) { + animations[i] = animation; + return; + } + } + + animations.push(animation); + + // If there are no animations queued, manually kickstart a digest, for lack of a better word + if (animations.length === 1) { + this.requestAnimationFrame(); + } + }, + + cancelAnimation: function(chart) { + var index = helpers$1.findIndex(this.animations, function(animation) { + return animation.chart === chart; + }); + + if (index !== -1) { + this.animations.splice(index, 1); + chart.animating = false; + } + }, + + requestAnimationFrame: function() { + var me = this; + if (me.request === null) { + // Skip animation frame requests until the active one is executed. + // This can happen when processing mouse events, e.g. 'mousemove' + // and 'mouseout' events will trigger multiple renders. + me.request = helpers$1.requestAnimFrame.call(window, function() { + me.request = null; + me.startDigest(); + }); + } + }, + + /** + * @private + */ + startDigest: function() { + var me = this; + + me.advance(); + + // Do we have more stuff to animate? + if (me.animations.length > 0) { + me.requestAnimationFrame(); + } + }, + + /** + * @private + */ + advance: function() { + var animations = this.animations; + var animation, chart, numSteps, nextStep; + var i = 0; + + // 1 animation per chart, so we are looping charts here + while (i < animations.length) { + animation = animations[i]; + chart = animation.chart; + numSteps = animation.numSteps; + + // Make sure that currentStep starts at 1 + // https://github.com/chartjs/Chart.js/issues/6104 + nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1; + animation.currentStep = Math.min(nextStep, numSteps); + + helpers$1.callback(animation.render, [chart, animation], chart); + helpers$1.callback(animation.onAnimationProgress, [animation], chart); + + if (animation.currentStep >= numSteps) { + helpers$1.callback(animation.onAnimationComplete, [animation], chart); + chart.animating = false; + animations.splice(i, 1); + } else { + ++i; + } + } + } +}; + +var resolve = helpers$1.options.resolve; + +var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; + +/** + * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', + * 'unshift') and notify the listener AFTER the array has been altered. Listeners are + * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. + */ +function listenArrayEvents(array, listener) { + if (array._chartjs) { + array._chartjs.listeners.push(listener); + return; + } + + Object.defineProperty(array, '_chartjs', { + configurable: true, + enumerable: false, + value: { + listeners: [listener] + } + }); + + arrayEvents.forEach(function(key) { + var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); + var base = array[key]; + + Object.defineProperty(array, key, { + configurable: true, + enumerable: false, + value: function() { + var args = Array.prototype.slice.call(arguments); + var res = base.apply(this, args); + + helpers$1.each(array._chartjs.listeners, function(object) { + if (typeof object[method] === 'function') { + object[method].apply(object, args); + } + }); + + return res; + } + }); + }); +} + +/** + * Removes the given array event listener and cleanup extra attached properties (such as + * the _chartjs stub and overridden methods) if array doesn't have any more listeners. + */ +function unlistenArrayEvents(array, listener) { + var stub = array._chartjs; + if (!stub) { + return; + } + + var listeners = stub.listeners; + var index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + + if (listeners.length > 0) { + return; + } + + arrayEvents.forEach(function(key) { + delete array[key]; + }); + + delete array._chartjs; +} + +// Base class for all dataset controllers (line, bar, etc) +var DatasetController = function(chart, datasetIndex) { + this.initialize(chart, datasetIndex); +}; + +helpers$1.extend(DatasetController.prototype, { + + /** + * Element type used to generate a meta dataset (e.g. Chart.element.Line). + * @type {Chart.core.element} + */ + datasetElementType: null, + + /** + * Element type used to generate a meta data (e.g. Chart.element.Point). + * @type {Chart.core.element} + */ + dataElementType: null, + + initialize: function(chart, datasetIndex) { + var me = this; + me.chart = chart; + me.index = datasetIndex; + me.linkScales(); + me.addElements(); + }, + + updateIndex: function(datasetIndex) { + this.index = datasetIndex; + }, + + linkScales: function() { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + + if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) { + meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; + } + if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) { + meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; + } + }, + + getDataset: function() { + return this.chart.data.datasets[this.index]; + }, + + getMeta: function() { + return this.chart.getDatasetMeta(this.index); + }, + + getScaleForId: function(scaleID) { + return this.chart.scales[scaleID]; + }, + + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().yAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getValueScale: function() { + return this.getScaleForId(this._getValueScaleId()); + }, + + /** + * @private + */ + _getIndexScale: function() { + return this.getScaleForId(this._getIndexScaleId()); + }, + + reset: function() { + this.update(true); + }, + + /** + * @private + */ + destroy: function() { + if (this._data) { + unlistenArrayEvents(this._data, this); + } + }, + + createMetaDataset: function() { + var me = this; + var type = me.datasetElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index + }); + }, + + createMetaData: function(index) { + var me = this; + var type = me.dataElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index, + _index: index + }); + }, + + addElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data || []; + var metaData = meta.data; + var i, ilen; + + for (i = 0, ilen = data.length; i < ilen; ++i) { + metaData[i] = metaData[i] || me.createMetaData(i); + } + + meta.dataset = meta.dataset || me.createMetaDataset(); + }, + + addElementAndReset: function(index) { + var element = this.createMetaData(index); + this.getMeta().data.splice(index, 0, element); + this.updateElement(element, index, true); + }, + + buildOrUpdateElements: function() { + var me = this; + var dataset = me.getDataset(); + var data = dataset.data || (dataset.data = []); + + // In order to correctly handle data addition/deletion animation (an thus simulate + // real-time charts), we need to monitor these data modifications and synchronize + // the internal meta data accordingly. + if (me._data !== data) { + if (me._data) { + // This case happens when the user replaced the data array instance. + unlistenArrayEvents(me._data, me); + } + + if (data && Object.isExtensible(data)) { + listenArrayEvents(data, me); + } + me._data = data; + } + + // Re-sync meta data in case the user replaced the data array or if we missed + // any updates and so make sure that we handle number of datapoints changing. + me.resyncElements(); + }, + + update: helpers$1.noop, + + transition: function(easingValue) { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + for (; i < ilen; ++i) { + elements[i].transition(easingValue); + } + + if (meta.dataset) { + meta.dataset.transition(easingValue); + } + }, + + draw: function() { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + if (meta.dataset) { + meta.dataset.draw(); + } + + for (; i < ilen; ++i) { + elements[i].draw(); + } + }, + + removeHoverStyle: function(element) { + helpers$1.merge(element._model, element.$previousStyle || {}); + delete element.$previousStyle; + }, + + setHoverStyle: function(element) { + var dataset = this.chart.data.datasets[element._datasetIndex]; + var index = element._index; + var custom = element.custom || {}; + var model = element._model; + var getHoverColor = helpers$1.getHoverColor; + + element.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth + }; + + model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index); + model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index); + model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index); + }, + + /** + * @private + */ + resyncElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data; + var numMeta = meta.data.length; + var numData = data.length; + + if (numData < numMeta) { + meta.data.splice(numData, numMeta - numData); + } else if (numData > numMeta) { + me.insertElements(numMeta, numData - numMeta); + } + }, + + /** + * @private + */ + insertElements: function(start, count) { + for (var i = 0; i < count; ++i) { + this.addElementAndReset(start + i); + } + }, + + /** + * @private + */ + onDataPush: function() { + var count = arguments.length; + this.insertElements(this.getDataset().data.length - count, count); + }, + + /** + * @private + */ + onDataPop: function() { + this.getMeta().data.pop(); + }, + + /** + * @private + */ + onDataShift: function() { + this.getMeta().data.shift(); + }, + + /** + * @private + */ + onDataSplice: function(start, count) { + this.getMeta().data.splice(start, count); + this.insertElements(start, arguments.length - 2); + }, + + /** + * @private + */ + onDataUnshift: function() { + this.insertElements(0, arguments.length); + } +}); + +DatasetController.extend = helpers$1.inherits; + +var core_datasetController = DatasetController; + +core_defaults._set('global', { + elements: { + arc: { + backgroundColor: core_defaults.global.defaultColor, + borderColor: '#fff', + borderWidth: 2, + borderAlign: 'center' + } + } +}); + +var element_arc = core_element.extend({ + inLabelRange: function(mouseX) { + var vm = this._view; + + if (vm) { + return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); + } + return false; + }, + + inRange: function(chartX, chartY) { + var vm = this._view; + + if (vm) { + var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY}); + var angle = pointRelativePosition.angle; + var distance = pointRelativePosition.distance; + + // Sanitise angle range + var startAngle = vm.startAngle; + var endAngle = vm.endAngle; + while (endAngle < startAngle) { + endAngle += 2.0 * Math.PI; + } + while (angle > endAngle) { + angle -= 2.0 * Math.PI; + } + while (angle < startAngle) { + angle += 2.0 * Math.PI; + } + + // Check if within the range of the open/close angle + var betweenAngles = (angle >= startAngle && angle <= endAngle); + var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); + + return (betweenAngles && withinRadius); + } + return false; + }, + + getCenterPoint: function() { + var vm = this._view; + var halfAngle = (vm.startAngle + vm.endAngle) / 2; + var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; + return { + x: vm.x + Math.cos(halfAngle) * halfRadius, + y: vm.y + Math.sin(halfAngle) * halfRadius + }; + }, + + getArea: function() { + var vm = this._view; + return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); + }, + + tooltipPosition: function() { + var vm = this._view; + var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); + var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; + + return { + x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), + y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var sA = vm.startAngle; + var eA = vm.endAngle; + var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0; + var angleMargin; + + ctx.save(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.fillStyle = vm.backgroundColor; + ctx.fill(); + + if (vm.borderWidth) { + if (vm.borderAlign === 'inner') { + // Draw an inner border by cliping the arc and drawing a double-width border + // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders + ctx.beginPath(); + angleMargin = pixelMargin / vm.outerRadius; + ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin); + if (vm.innerRadius > pixelMargin) { + angleMargin = pixelMargin / vm.innerRadius; + ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true); + } else { + ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2); + } + ctx.closePath(); + ctx.clip(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.lineWidth = vm.borderWidth * 2; + ctx.lineJoin = 'round'; + } else { + ctx.lineWidth = vm.borderWidth; + ctx.lineJoin = 'bevel'; + } + + ctx.strokeStyle = vm.borderColor; + ctx.stroke(); + } + + ctx.restore(); + } +}); + +var valueOrDefault$1 = helpers$1.valueOrDefault; + +var defaultColor = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + line: { + tension: 0.4, + backgroundColor: defaultColor, + borderWidth: 3, + borderColor: defaultColor, + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + capBezierPoints: true, + fill: true, // do we fill in the area between the line and its base axis + } + } +}); + +var element_line = core_element.extend({ + draw: function() { + var me = this; + var vm = me._view; + var ctx = me._chart.ctx; + var spanGaps = vm.spanGaps; + var points = me._children.slice(); // clone array + var globalDefaults = core_defaults.global; + var globalOptionLineElements = globalDefaults.elements.line; + var lastDrawnIndex = -1; + var index, current, previous, currentVM; + + // If we are looping, adding the first point again + if (me._loop && points.length) { + points.push(points[0]); + } + + ctx.save(); + + // Stroke Line Options + ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; + + // IE 9 and 10 do not support line dash + if (ctx.setLineDash) { + ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); + } + + ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset); + ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; + ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth); + ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; + + // Stroke Line + ctx.beginPath(); + lastDrawnIndex = -1; + + for (index = 0; index < points.length; ++index) { + current = points[index]; + previous = helpers$1.previousItem(points, index); + currentVM = current._view; + + // First point moves to it's starting position no matter what + if (index === 0) { + if (!currentVM.skip) { + ctx.moveTo(currentVM.x, currentVM.y); + lastDrawnIndex = index; + } + } else { + previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; + + if (!currentVM.skip) { + if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { + // There was a gap and this is the first point after the gap + ctx.moveTo(currentVM.x, currentVM.y); + } else { + // Line to next point + helpers$1.canvas.lineTo(ctx, previous._view, current._view); + } + lastDrawnIndex = index; + } + } + } + + ctx.stroke(); + ctx.restore(); + } +}); + +var valueOrDefault$2 = helpers$1.valueOrDefault; + +var defaultColor$1 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + point: { + radius: 3, + pointStyle: 'circle', + backgroundColor: defaultColor$1, + borderColor: defaultColor$1, + borderWidth: 1, + // Hover + hitRadius: 1, + hoverRadius: 4, + hoverBorderWidth: 1 + } + } +}); + +function xRange(mouseX) { + var vm = this._view; + return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false; +} + +function yRange(mouseY) { + var vm = this._view; + return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false; +} + +var element_point = core_element.extend({ + inRange: function(mouseX, mouseY) { + var vm = this._view; + return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; + }, + + inLabelRange: xRange, + inXRange: xRange, + inYRange: yRange, + + getCenterPoint: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + }, + + getArea: function() { + return Math.PI * Math.pow(this._view.radius, 2); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y, + padding: vm.radius + vm.borderWidth + }; + }, + + draw: function(chartArea) { + var vm = this._view; + var ctx = this._chart.ctx; + var pointStyle = vm.pointStyle; + var rotation = vm.rotation; + var radius = vm.radius; + var x = vm.x; + var y = vm.y; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow + + if (vm.skip) { + return; + } + + // Clipping for Points. + if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) { + ctx.strokeStyle = vm.borderColor || defaultColor; + ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth); + ctx.fillStyle = vm.backgroundColor || defaultColor; + helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation); + } + } +}); + +var defaultColor$2 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + rectangle: { + backgroundColor: defaultColor$2, + borderColor: defaultColor$2, + borderSkipped: 'bottom', + borderWidth: 0 + } + } +}); + +function isVertical(vm) { + return vm && vm.width !== undefined; +} + +/** + * Helper function to get the bounds of the bar regardless of the orientation + * @param bar {Chart.Element.Rectangle} the bar + * @return {Bounds} bounds of the bar + * @private + */ +function getBarBounds(vm) { + var x1, x2, y1, y2, half; + + if (isVertical(vm)) { + half = vm.width / 2; + x1 = vm.x - half; + x2 = vm.x + half; + y1 = Math.min(vm.y, vm.base); + y2 = Math.max(vm.y, vm.base); + } else { + half = vm.height / 2; + x1 = Math.min(vm.x, vm.base); + x2 = Math.max(vm.x, vm.base); + y1 = vm.y - half; + y2 = vm.y + half; + } + + return { + left: x1, + top: y1, + right: x2, + bottom: y2 + }; +} + +function swap(orig, v1, v2) { + return orig === v1 ? v2 : orig === v2 ? v1 : orig; +} + +function parseBorderSkipped(vm) { + var edge = vm.borderSkipped; + var res = {}; + + if (!edge) { + return res; + } + + if (vm.horizontal) { + if (vm.base > vm.x) { + edge = swap(edge, 'left', 'right'); + } + } else if (vm.base < vm.y) { + edge = swap(edge, 'bottom', 'top'); + } + + res[edge] = true; + return res; +} + +function parseBorderWidth(vm, maxW, maxH) { + var value = vm.borderWidth; + var skip = parseBorderSkipped(vm); + var t, r, b, l; + + if (helpers$1.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t, + r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r, + b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b, + l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l + }; +} + +function boundingRects(vm) { + var bounds = getBarBounds(vm); + var width = bounds.right - bounds.left; + var height = bounds.bottom - bounds.top; + var border = parseBorderWidth(vm, width / 2, height / 2); + + return { + outer: { + x: bounds.left, + y: bounds.top, + w: width, + h: height + }, + inner: { + x: bounds.left + border.l, + y: bounds.top + border.t, + w: width - border.l - border.r, + h: height - border.t - border.b + } + }; +} + +function inRange(vm, x, y) { + var skipX = x === null; + var skipY = y === null; + var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm); + + return bounds + && (skipX || x >= bounds.left && x <= bounds.right) + && (skipY || y >= bounds.top && y <= bounds.bottom); +} + +var element_rectangle = core_element.extend({ + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var rects = boundingRects(vm); + var outer = rects.outer; + var inner = rects.inner; + + ctx.fillStyle = vm.backgroundColor; + ctx.fillRect(outer.x, outer.y, outer.w, outer.h); + + if (outer.w === inner.w && outer.h === inner.h) { + return; + } + + ctx.save(); + ctx.beginPath(); + ctx.rect(outer.x, outer.y, outer.w, outer.h); + ctx.clip(); + ctx.fillStyle = vm.borderColor; + ctx.rect(inner.x, inner.y, inner.w, inner.h); + ctx.fill('evenodd'); + ctx.restore(); + }, + + height: function() { + var vm = this._view; + return vm.base - vm.y; + }, + + inRange: function(mouseX, mouseY) { + return inRange(this._view, mouseX, mouseY); + }, + + inLabelRange: function(mouseX, mouseY) { + var vm = this._view; + return isVertical(vm) + ? inRange(vm, mouseX, null) + : inRange(vm, null, mouseY); + }, + + inXRange: function(mouseX) { + return inRange(this._view, mouseX, null); + }, + + inYRange: function(mouseY) { + return inRange(this._view, null, mouseY); + }, + + getCenterPoint: function() { + var vm = this._view; + var x, y; + if (isVertical(vm)) { + x = vm.x; + y = (vm.y + vm.base) / 2; + } else { + x = (vm.x + vm.base) / 2; + y = vm.y; + } + + return {x: x, y: y}; + }, + + getArea: function() { + var vm = this._view; + + return isVertical(vm) + ? vm.width * Math.abs(vm.y - vm.base) + : vm.height * Math.abs(vm.x - vm.base); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + } +}); + +var elements = {}; +var Arc = element_arc; +var Line = element_line; +var Point = element_point; +var Rectangle = element_rectangle; +elements.Arc = Arc; +elements.Line = Line; +elements.Point = Point; +elements.Rectangle = Rectangle; + +var resolve$1 = helpers$1.options.resolve; + +core_defaults._set('bar', { + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }], + + yAxes: [{ + type: 'linear' + }] + } +}); + +/** + * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. + * @private + */ +function computeMinSampleSize(scale, pixels) { + var min = scale.isHorizontal() ? scale.width : scale.height; + var ticks = scale.getTicks(); + var prev, curr, i, ilen; + + for (i = 1, ilen = pixels.length; i < ilen; ++i) { + min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1])); + } + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + curr = scale.getPixelForTick(i); + min = i > 0 ? Math.min(min, curr - prev) : min; + prev = curr; + } + + return min; +} + +/** + * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, + * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This + * mode currently always generates bars equally sized (until we introduce scriptable options?). + * @private + */ +function computeFitCategoryTraits(index, ruler, options) { + var thickness = options.barThickness; + var count = ruler.stackCount; + var curr = ruler.pixels[index]; + var size, ratio; + + if (helpers$1.isNullOrUndef(thickness)) { + size = ruler.min * options.categoryPercentage; + ratio = options.barPercentage; + } else { + // When bar thickness is enforced, category and bar percentages are ignored. + // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') + // and deprecate barPercentage since this value is ignored when thickness is absolute. + size = thickness * count; + ratio = 1; + } + + return { + chunk: size / count, + ratio: ratio, + start: curr - (size / 2) + }; +} + +/** + * Computes an "optimal" category that globally arranges bars side by side (no gap when + * percentage options are 1), based on the previous and following categories. This mode + * generates bars with different widths when data are not evenly spaced. + * @private + */ +function computeFlexCategoryTraits(index, ruler, options) { + var pixels = ruler.pixels; + var curr = pixels[index]; + var prev = index > 0 ? pixels[index - 1] : null; + var next = index < pixels.length - 1 ? pixels[index + 1] : null; + var percent = options.categoryPercentage; + var start, size; + + if (prev === null) { + // first data: its size is double based on the next point or, + // if it's also the last data, we use the scale size. + prev = curr - (next === null ? ruler.end - ruler.start : next - curr); + } + + if (next === null) { + // last data: its size is also double based on the previous point. + next = curr + curr - prev; + } + + start = curr - (curr - Math.min(prev, next)) / 2 * percent; + size = Math.abs(next - prev) / 2 * percent; + + return { + chunk: size / ruler.stackCount, + ratio: options.barPercentage, + start: start + }; +} + +var controller_bar = core_datasetController.extend({ + + dataElementType: elements.Rectangle, + + initialize: function() { + var me = this; + var meta; + + core_datasetController.prototype.initialize.apply(me, arguments); + + meta = me.getMeta(); + meta.stack = me.getDataset().stack; + meta.bar = true; + }, + + update: function(reset) { + var me = this; + var rects = me.getMeta().data; + var i, ilen; + + me._ruler = me.getRuler(); + + for (i = 0, ilen = rects.length; i < ilen; ++i) { + me.updateElement(rects[i], i, reset); + } + }, + + updateElement: function(rectangle, index, reset) { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + var options = me._resolveElementOptions(rectangle, index); + + rectangle._xScale = me.getScaleForId(meta.xAxisID); + rectangle._yScale = me.getScaleForId(meta.yAxisID); + rectangle._datasetIndex = me.index; + rectangle._index = index; + rectangle._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderSkipped: options.borderSkipped, + borderWidth: options.borderWidth, + datasetLabel: dataset.label, + label: me.chart.data.labels[index] + }; + + me._updateElementGeometry(rectangle, index, reset); + + rectangle.pivot(); + }, + + /** + * @private + */ + _updateElementGeometry: function(rectangle, index, reset) { + var me = this; + var model = rectangle._model; + var vscale = me._getValueScale(); + var base = vscale.getBasePixel(); + var horizontal = vscale.isHorizontal(); + var ruler = me._ruler || me.getRuler(); + var vpixels = me.calculateBarValuePixels(me.index, index); + var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); + + model.horizontal = horizontal; + model.base = reset ? base : vpixels.base; + model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; + model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; + model.height = horizontal ? ipixels.size : undefined; + model.width = horizontal ? undefined : ipixels.size; + }, + + /** + * Returns the stacks based on groups and bar visibility. + * @param {number} [last] - The dataset index + * @returns {string[]} The list of stack IDs + * @private + */ + _getStacks: function(last) { + var me = this; + var chart = me.chart; + var scale = me._getIndexScale(); + var stacked = scale.options.stacked; + var ilen = last === undefined ? chart.data.datasets.length : last + 1; + var stacks = []; + var i, meta; + + for (i = 0; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + if (meta.bar && chart.isDatasetVisible(i) && + (stacked === false || + (stacked === true && stacks.indexOf(meta.stack) === -1) || + (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { + stacks.push(meta.stack); + } + } + + return stacks; + }, + + /** + * Returns the effective number of stacks based on groups and bar visibility. + * @private + */ + getStackCount: function() { + return this._getStacks().length; + }, + + /** + * Returns the stack index for the given dataset based on groups and bar visibility. + * @param {number} [datasetIndex] - The dataset index + * @param {string} [name] - The stack name to find + * @returns {number} The stack index + * @private + */ + getStackIndex: function(datasetIndex, name) { + var stacks = this._getStacks(datasetIndex); + var index = (name !== undefined) + ? stacks.indexOf(name) + : -1; // indexOf returns -1 if element is not present + + return (index === -1) + ? stacks.length - 1 + : index; + }, + + /** + * @private + */ + getRuler: function() { + var me = this; + var scale = me._getIndexScale(); + var stackCount = me.getStackCount(); + var datasetIndex = me.index; + var isHorizontal = scale.isHorizontal(); + var start = isHorizontal ? scale.left : scale.top; + var end = start + (isHorizontal ? scale.width : scale.height); + var pixels = []; + var i, ilen, min; + + for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { + pixels.push(scale.getPixelForValue(null, i, datasetIndex)); + } + + min = helpers$1.isNullOrUndef(scale.options.barThickness) + ? computeMinSampleSize(scale, pixels) + : -1; + + return { + min: min, + pixels: pixels, + start: start, + end: end, + stackCount: stackCount, + scale: scale + }; + }, + + /** + * Note: pixel values are not clamped to the scale area. + * @private + */ + calculateBarValuePixels: function(datasetIndex, index) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var scale = me._getValueScale(); + var isHorizontal = scale.isHorizontal(); + var datasets = chart.data.datasets; + var value = +scale.getRightValue(datasets[datasetIndex].data[index]); + var minBarLength = scale.options.minBarLength; + var stacked = scale.options.stacked; + var stack = meta.stack; + var start = 0; + var i, imeta, ivalue, base, head, size; + + if (stacked || (stacked === undefined && stack !== undefined)) { + for (i = 0; i < datasetIndex; ++i) { + imeta = chart.getDatasetMeta(i); + + if (imeta.bar && + imeta.stack === stack && + imeta.controller._getValueScaleId() === scale.id && + chart.isDatasetVisible(i)) { + + ivalue = +scale.getRightValue(datasets[i].data[index]); + if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { + start += ivalue; + } + } + } + } + + base = scale.getPixelForValue(start); + head = scale.getPixelForValue(start + value); + size = head - base; + + if (minBarLength !== undefined && Math.abs(size) < minBarLength) { + size = minBarLength; + if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) { + head = base - minBarLength; + } else { + head = base + minBarLength; + } + } + + return { + size: size, + base: base, + head: head, + center: head + size / 2 + }; + }, + + /** + * @private + */ + calculateBarIndexPixels: function(datasetIndex, index, ruler) { + var me = this; + var options = ruler.scale.options; + var range = options.barThickness === 'flex' + ? computeFlexCategoryTraits(index, ruler, options) + : computeFitCategoryTraits(index, ruler, options); + + var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); + var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); + var size = Math.min( + helpers$1.valueOrDefault(options.maxBarThickness, Infinity), + range.chunk * range.ratio); + + return { + base: center - size / 2, + head: center + size / 2, + center: center, + size: size + }; + }, + + draw: function() { + var me = this; + var chart = me.chart; + var scale = me._getValueScale(); + var rects = me.getMeta().data; + var dataset = me.getDataset(); + var ilen = rects.length; + var i = 0; + + helpers$1.canvas.clipArea(chart.ctx, chart.chartArea); + + for (; i < ilen; ++i) { + if (!isNaN(scale.getRightValue(dataset.data[i]))) { + rects[i].draw(); + } + } + + helpers$1.canvas.unclipArea(chart.ctx); + }, + + /** + * @private + */ + _resolveElementOptions: function(rectangle, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = rectangle.custom || {}; + var options = chart.options.elements.rectangle; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderSkipped', + 'borderWidth' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$1([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + } +}); + +var valueOrDefault$3 = helpers$1.valueOrDefault; +var resolve$2 = helpers$1.options.resolve; + +core_defaults._set('bubble', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + type: 'linear', // bubble should probably use a linear scale by default + position: 'bottom', + id: 'x-axis-0' // need an ID so datasets can reference the scale + }], + yAxes: [{ + type: 'linear', + position: 'left', + id: 'y-axis-0' + }] + }, + + tooltips: { + callbacks: { + title: function() { + // Title doesn't make sense for scatter since we format the data as a point + return ''; + }, + label: function(item, data) { + var datasetLabel = data.datasets[item.datasetIndex].label || ''; + var dataPoint = data.datasets[item.datasetIndex].data[item.index]; + return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; + } + } + } +}); + +var controller_bubble = core_datasetController.extend({ + /** + * @protected + */ + dataElementType: elements.Point, + + /** + * @protected + */ + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var points = meta.data; + + // Update Points + helpers$1.each(points, function(point, index) { + me.updateElement(point, index, reset); + }); + }, + + /** + * @protected + */ + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var xScale = me.getScaleForId(meta.xAxisID); + var yScale = me.getScaleForId(meta.yAxisID); + var options = me._resolveElementOptions(point, index); + var data = me.getDataset().data[index]; + var dsIndex = me.index; + + var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); + var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); + + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = dsIndex; + point._index = index; + point._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + hitRadius: options.hitRadius, + pointStyle: options.pointStyle, + rotation: options.rotation, + radius: reset ? 0 : options.radius, + skip: custom.skip || isNaN(x) || isNaN(y), + x: x, + y: y, + }; + + point.pivot(); + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth); + model.radius = options.radius + options.hoverRadius; + }, + + /** + * @private + */ + _resolveElementOptions: function(point, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = point.custom || {}; + var options = chart.options.elements.point; + var data = dataset.data[index]; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + 'hoverRadius', + 'hitRadius', + 'pointStyle', + 'rotation' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$2([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + // Custom radius resolution + values.radius = resolve$2([ + custom.radius, + data ? data.r : undefined, + dataset.radius, + options.radius + ], context, index); + + return values; + } +}); + +var resolve$3 = helpers$1.options.resolve; +var valueOrDefault$4 = helpers$1.valueOrDefault; + +core_defaults._set('doughnut', { + animation: { + // Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + // Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false + }, + hover: { + mode: 'single' + }, + legendCallback: function(chart) { + var text = []; + text.push('
    '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
  • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
  • '); + } + } + + text.push('
'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc && arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + // toggle visibility of index if exists + if (meta.data[index]) { + meta.data[index].hidden = !meta.data[index].hidden; + } + } + + chart.update(); + } + }, + + // The percentage of the chart that we cut out of the middle. + cutoutPercentage: 50, + + // The rotation of the chart, where the first data arc begins. + rotation: Math.PI * -0.5, + + // The total circumference of the chart. + circumference: Math.PI * 2.0, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(tooltipItem, data) { + var dataLabel = data.labels[tooltipItem.index]; + var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; + + if (helpers$1.isArray(dataLabel)) { + // show value on first line of multiline label + // need to clone because we are changing the value + dataLabel = dataLabel.slice(); + dataLabel[0] += value; + } else { + dataLabel += value; + } + + return dataLabel; + } + } + } +}); + +var controller_doughnut = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly + getRingIndex: function(datasetIndex) { + var ringIndex = 0; + + for (var j = 0; j < datasetIndex; ++j) { + if (this.chart.isDatasetVisible(j)) { + ++ringIndex; + } + } + + return ringIndex; + }, + + update: function(reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var availableWidth = chartArea.right - chartArea.left; + var availableHeight = chartArea.bottom - chartArea.top; + var minSize = Math.min(availableWidth, availableHeight); + var offset = {x: 0, y: 0}; + var meta = me.getMeta(); + var arcs = meta.data; + var cutoutPercentage = opts.cutoutPercentage; + var circumference = opts.circumference; + var chartWeight = me._getRingWeight(me.index); + var i, ilen; + + // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc + if (circumference < Math.PI * 2.0) { + var startAngle = opts.rotation % (Math.PI * 2.0); + startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); + var endAngle = startAngle + circumference; + var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; + var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; + var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); + var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); + var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); + var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); + var cutout = cutoutPercentage / 100.0; + var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; + var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; + var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; + minSize = Math.min(availableWidth / size.width, availableHeight / size.height); + offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + } + + chart.borderWidth = me.getMaxBorderWidth(); + chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); + chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1); + chart.offsetX = offset.x * chart.outerRadius; + chart.offsetY = offset.y * chart.outerRadius; + + meta.total = me.calculateTotal(); + + me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index); + me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0); + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + me.updateElement(arcs[i], i, reset); + } + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var animationOpts = opts.animation; + var centerX = (chartArea.left + chartArea.right) / 2; + var centerY = (chartArea.top + chartArea.bottom) / 2; + var startAngle = opts.rotation; // non reset case handled later + var endAngle = opts.rotation; // non reset case handled later + var dataset = me.getDataset(); + var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); + var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; + var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX + chart.offsetX, + y: centerY + chart.offsetY, + startAngle: startAngle, + endAngle: endAngle, + circumference: circumference, + outerRadius: outerRadius, + innerRadius: innerRadius, + label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) + } + }); + + var model = arc._model; + + // Set correct angles if not resetting + if (!reset || !animationOpts.animateRotate) { + if (index === 0) { + model.startAngle = opts.rotation; + } else { + model.startAngle = me.getMeta().data[index - 1]._model.endAngle; + } + + model.endAngle = model.startAngle + model.circumference; + } + + arc.pivot(); + }, + + calculateTotal: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var total = 0; + var value; + + helpers$1.each(meta.data, function(element, index) { + value = dataset.data[index]; + if (!isNaN(value) && !element.hidden) { + total += Math.abs(value); + } + }); + + /* if (total === 0) { + total = NaN; + }*/ + + return total; + }, + + calculateCircumference: function(value) { + var total = this.getMeta().total; + if (total > 0 && !isNaN(value)) { + return (Math.PI * 2.0) * (Math.abs(value) / total); + } + return 0; + }, + + // gets the max border or hover width to properly scale pie charts + getMaxBorderWidth: function(arcs) { + var me = this; + var max = 0; + var chart = me.chart; + var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth; + + if (!arcs) { + // Find the outmost visible dataset + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + arcs = meta.data; + if (i !== me.index) { + controller = meta.controller; + } + break; + } + } + } + + if (!arcs) { + return 0; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arc = arcs[i]; + options = controller ? controller._resolveElementOptions(arc, i) : arc._options; + if (options.borderAlign !== 'inner') { + borderWidth = options.borderWidth; + hoverWidth = options.hoverBorderWidth; + + max = borderWidth > max ? borderWidth : max; + max = hoverWidth > max ? hoverWidth : max; + } + } + return max; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function(arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$3([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly + * @private + */ + _getRingWeightOffset: function(datasetIndex) { + var ringWeightOffset = 0; + + for (var i = 0; i < datasetIndex; ++i) { + if (this.chart.isDatasetVisible(i)) { + ringWeightOffset += this._getRingWeight(i); + } + } + + return ringWeightOffset; + }, + + /** + * @private + */ + _getRingWeight: function(dataSetIndex) { + return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0); + }, + + /** + * Returns the sum of all visibile data set weights. This value can be 0. + * @private + */ + _getVisibleDatasetWeightTotal: function() { + return this._getRingWeightOffset(this.chart.data.datasets.length); + } +}); + +core_defaults._set('horizontalBar', { + hover: { + mode: 'index', + axis: 'y' + }, + + scales: { + xAxes: [{ + type: 'linear', + position: 'bottom' + }], + + yAxes: [{ + type: 'category', + position: 'left', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }] + }, + + elements: { + rectangle: { + borderSkipped: 'left' + } + }, + + tooltips: { + mode: 'index', + axis: 'y' + } +}); + +var controller_horizontalBar = controller_bar.extend({ + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().yAxisID; + } +}); + +var valueOrDefault$5 = helpers$1.valueOrDefault; +var resolve$4 = helpers$1.options.resolve; +var isPointInArea = helpers$1.canvas._isPointInArea; + +core_defaults._set('line', { + showLines: true, + spanGaps: false, + + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + id: 'x-axis-0' + }], + yAxes: [{ + type: 'linear', + id: 'y-axis-0' + }] + } +}); + +function lineEnabled(dataset, options) { + return valueOrDefault$5(dataset.showLine, options.showLines); +} + +var controller_line = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.getScaleForId(meta.yAxisID); + var dataset = me.getDataset(); + var showLine = lineEnabled(dataset, me.chart.options); + var i, ilen; + + // Update Line + if (showLine) { + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + } + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + if (showLine && line._model.tension !== 0) { + me.updateBezierControlPoints(); + } + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var dataset = me.getDataset(); + var datasetIndex = me.index; + var value = dataset.data[index]; + var yScale = me.getScaleForId(meta.yAxisID); + var xScale = me.getScaleForId(meta.xAxisID); + var lineModel = meta.dataset._model; + var x, y; + + var options = me._resolvePointOptions(point, index); + + x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); + y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); + + // Utility + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = datasetIndex; + point._index = index; + + // Desired view properties + point._model = { + x: x, + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0), + steppedLine: lineModel ? lineModel.steppedLine : false, + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function(element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function(element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options; + var elementOptions = options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill', + 'cubicInterpolationMode' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[key], + elementOptions[key] + ]); + } + + // The default behavior of lines is to break at null values, according + // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 + // This option gives lines the ability to span gaps + values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps); + values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension); + values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]); + + return values; + }, + + calculatePointY: function(value, index, datasetIndex) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var yScale = me.getScaleForId(meta.yAxisID); + var sumPos = 0; + var sumNeg = 0; + var i, ds, dsMeta; + + if (yScale.options.stacked) { + for (i = 0; i < datasetIndex; i++) { + ds = chart.data.datasets[i]; + dsMeta = chart.getDatasetMeta(i); + if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { + var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); + if (stackedRightValue < 0) { + sumNeg += stackedRightValue || 0; + } else { + sumPos += stackedRightValue || 0; + } + } + } + + var rightValue = Number(yScale.getRightValue(value)); + if (rightValue < 0) { + return yScale.getPixelForValue(sumNeg + rightValue); + } + return yScale.getPixelForValue(sumPos + rightValue); + } + + return yScale.getPixelForValue(value); + }, + + updateBezierControlPoints: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var lineModel = meta.dataset._model; + var area = chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + // Only consider points that are drawn in case the spanGaps option is used + if (lineModel.spanGaps) { + points = points.filter(function(pt) { + return !pt._model.skip; + }); + } + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + if (lineModel.cubicInterpolationMode === 'monotone') { + helpers$1.splineCurveMonotone(points); + } else { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i)._model, + model, + helpers$1.nextItem(points, i)._model, + lineModel.tension + ); + model.controlPointPreviousX = controlPoints.previous.x; + model.controlPointPreviousY = controlPoints.previous.y; + model.controlPointNextX = controlPoints.next.x; + model.controlPointNextY = controlPoints.next.y; + } + } + + if (chart.options.elements.line.capBezierPoints) { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + if (isPointInArea(model, area)) { + if (i > 0 && isPointInArea(points[i - 1]._model, area)) { + model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); + model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); + } + if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) { + model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); + model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); + } + } + } + } + }, + + draw: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var points = meta.data || []; + var area = chart.chartArea; + var ilen = points.length; + var halfBorderWidth; + var i = 0; + + if (lineEnabled(me.getDataset(), chart.options)) { + halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2; + + helpers$1.canvas.clipArea(chart.ctx, { + left: area.left, + right: area.right, + top: area.top - halfBorderWidth, + bottom: area.bottom + halfBorderWidth + }); + + meta.dataset.draw(); + + helpers$1.canvas.unclipArea(chart.ctx); + } + + // Draw the points + for (; i < ilen; ++i) { + points[i].draw(area); + } + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$5(options.hoverRadius, options.radius); + }, +}); + +var resolve$5 = helpers$1.options.resolve; + +core_defaults._set('polarArea', { + scale: { + type: 'radialLinear', + angleLines: { + display: false + }, + gridLines: { + circular: true + }, + pointLabels: { + display: false + }, + ticks: { + beginAtZero: true + } + }, + + // Boolean - Whether to animate the rotation of the chart + animation: { + animateRotate: true, + animateScale: true + }, + + startAngle: -0.5 * Math.PI, + legendCallback: function(chart) { + var text = []; + text.push('
    '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
  • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
  • '); + } + } + + text.push('
'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + meta.data[index].hidden = !meta.data[index].hidden; + } + + chart.update(); + } + }, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(item, data) { + return data.labels[item.index] + ': ' + item.yLabel; + } + } + } +}); + +var controller_polarArea = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + update: function(reset) { + var me = this; + var dataset = me.getDataset(); + var meta = me.getMeta(); + var start = me.chart.options.startAngle || 0; + var starts = me._starts = []; + var angles = me._angles = []; + var arcs = meta.data; + var i, ilen, angle; + + me._updateRadius(); + + meta.count = me.countVisibleElements(); + + for (i = 0, ilen = dataset.data.length; i < ilen; i++) { + starts[i] = start; + angle = me._computeAngle(i); + angles[i] = angle; + start += angle; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + me.updateElement(arcs[i], i, reset); + } + }, + + /** + * @private + */ + _updateRadius: function() { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); + + chart.outerRadius = Math.max(minSize / 2, 0); + chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + + me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); + me.innerRadius = me.outerRadius - chart.radiusLength; + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var opts = chart.options; + var animationOpts = opts.animation; + var scale = chart.scale; + var labels = chart.data.labels; + + var centerX = scale.xCenter; + var centerY = scale.yCenter; + + // var negHalfPI = -0.5 * Math.PI; + var datasetStartAngle = opts.startAngle; + var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var startAngle = me._starts[index]; + var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]); + + var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX, + y: centerY, + innerRadius: 0, + outerRadius: reset ? resetRadius : distance, + startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, + endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, + label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index]) + } + }); + + arc.pivot(); + }, + + countVisibleElements: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var count = 0; + + helpers$1.each(meta.data, function(element, index) { + if (!isNaN(dataset.data[index]) && !element.hidden) { + count++; + } + }); + + return count; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + var valueOrDefault = helpers$1.valueOrDefault; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function(arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$5([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _computeAngle: function(index) { + var me = this; + var count = this.getMeta().count; + var dataset = me.getDataset(); + var meta = me.getMeta(); + + if (isNaN(dataset.data[index]) || meta.data[index].hidden) { + return 0; + } + + // Scriptable options + var context = { + chart: me.chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + return resolve$5([ + me.chart.options.elements.arc.angle, + (2 * Math.PI) / count + ], context, index); + } +}); + +core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut)); +core_defaults._set('pie', { + cutoutPercentage: 0 +}); + +// Pie charts are Doughnut chart with different defaults +var controller_pie = controller_doughnut; + +var valueOrDefault$6 = helpers$1.valueOrDefault; +var resolve$6 = helpers$1.options.resolve; + +core_defaults._set('radar', { + scale: { + type: 'radialLinear' + }, + elements: { + line: { + tension: 0 // no bezier in radar + } + } +}); + +var controller_radar = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + linkScales: helpers$1.noop, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.chart.scale; + var dataset = me.getDataset(); + var i, ilen; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + line._loop = true; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + // Update bezier control points + me.updateBezierControlPoints(); + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var custom = point.custom || {}; + var dataset = me.getDataset(); + var scale = me.chart.scale; + var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); + var options = me._resolvePointOptions(point, index); + var lineModel = me.getMeta().dataset._model; + var x = reset ? scale.xCenter : pointPosition.x; + var y = reset ? scale.yCenter : pointPosition.y; + + // Utility + point._scale = scale; + point._options = options; + point._datasetIndex = me.index; + point._index = index; + + // Desired view properties + point._model = { + x: x, // value not used in dataset scale, but we want a consistent API between scales + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0), + + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function(element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function(element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[key], + options[key] + ]); + } + + values.tension = valueOrDefault$6(dataset.lineTension, options.tension); + + return values; + }, + + updateBezierControlPoints: function() { + var me = this; + var meta = me.getMeta(); + var area = me.chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i, true)._model, + model, + helpers$1.nextItem(points, i, true)._model, + model.tension + ); + + // Prevent the bezier going outside of the bounds of the graph + model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right); + model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom); + model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right); + model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom); + } + }, + + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$6(options.hoverRadius, options.radius); + } +}); + +core_defaults._set('scatter', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + id: 'x-axis-1', // need an ID so datasets can reference the scale + type: 'linear', // scatter should not use a category axis + position: 'bottom' + }], + yAxes: [{ + id: 'y-axis-1', + type: 'linear', + position: 'left' + }] + }, + + showLines: false, + + tooltips: { + callbacks: { + title: function() { + return ''; // doesn't make sense for scatter since data are formatted as a point + }, + label: function(item) { + return '(' + item.xLabel + ', ' + item.yLabel + ')'; + } + } + } +}); + +// Scatter charts use line controllers +var controller_scatter = controller_line; + +// NOTE export a map in which the key represents the controller type, not +// the class, and so must be CamelCase in order to be correctly retrieved +// by the controller in core.controller.js (`controllers[meta.type]`). + +var controllers = { + bar: controller_bar, + bubble: controller_bubble, + doughnut: controller_doughnut, + horizontalBar: controller_horizontalBar, + line: controller_line, + polarArea: controller_polarArea, + pie: controller_pie, + radar: controller_radar, + scatter: controller_scatter +}; + +/** + * Helper function to get relative position for an event + * @param {Event|IEvent} event - The event to get the position for + * @param {Chart} chart - The chart + * @returns {object} the event position + */ +function getRelativePosition(e, chart) { + if (e.native) { + return { + x: e.x, + y: e.y + }; + } + + return helpers$1.getRelativePosition(e, chart); +} + +/** + * Helper function to traverse all of the visible elements in the chart + * @param {Chart} chart - the chart + * @param {function} handler - the callback to execute for each visible item + */ +function parseVisibleItems(chart, handler) { + var datasets = chart.data.datasets; + var meta, i, j, ilen, jlen; + + for (i = 0, ilen = datasets.length; i < ilen; ++i) { + if (!chart.isDatasetVisible(i)) { + continue; + } + + meta = chart.getDatasetMeta(i); + for (j = 0, jlen = meta.data.length; j < jlen; ++j) { + var element = meta.data[j]; + if (!element._view.skip) { + handler(element); + } + } + } +} + +/** + * Helper function to get the items that intersect the event position + * @param {ChartElement[]} items - elements to filter + * @param {object} position - the point to be nearest to + * @return {ChartElement[]} the nearest items + */ +function getIntersectItems(chart, position) { + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + } + }); + + return elements; +} + +/** + * Helper function to get the items nearest to the event position considering all visible items in teh chart + * @param {Chart} chart - the chart to look at elements from + * @param {object} position - the point to be nearest to + * @param {boolean} intersect - if true, only consider items that intersect the position + * @param {function} distanceMetric - function to provide the distance between points + * @return {ChartElement[]} the nearest items + */ +function getNearestItems(chart, position, intersect, distanceMetric) { + var minDistance = Number.POSITIVE_INFINITY; + var nearestItems = []; + + parseVisibleItems(chart, function(element) { + if (intersect && !element.inRange(position.x, position.y)) { + return; + } + + var center = element.getCenterPoint(); + var distance = distanceMetric(position, center); + if (distance < minDistance) { + nearestItems = [element]; + minDistance = distance; + } else if (distance === minDistance) { + // Can have multiple items at the same distance in which case we sort by size + nearestItems.push(element); + } + }); + + return nearestItems; +} + +/** + * Get a distance metric function for two points based on the + * axis mode setting + * @param {string} axis - the axis mode. x|y|xy + */ +function getDistanceMetricForAxis(axis) { + var useX = axis.indexOf('x') !== -1; + var useY = axis.indexOf('y') !== -1; + + return function(pt1, pt2) { + var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; + var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; + return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); + }; +} + +function indexMode(chart, e, options) { + var position = getRelativePosition(e, chart); + // Default axis for index mode is 'x' to match old behaviour + options.axis = options.axis || 'x'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + var elements = []; + + if (!items.length) { + return []; + } + + chart.data.datasets.forEach(function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + var element = meta.data[items[0]._index]; + + // don't count items that are skipped (null data) + if (element && !element._view.skip) { + elements.push(element); + } + } + }); + + return elements; +} + +/** + * @interface IInteractionOptions + */ +/** + * If true, only consider items that intersect the point + * @name IInterfaceOptions#boolean + * @type Boolean + */ + +/** + * Contains interaction related functions + * @namespace Chart.Interaction + */ +var core_interaction = { + // Helper function for different modes + modes: { + single: function(chart, e) { + var position = getRelativePosition(e, chart); + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + return elements; + } + }); + + return elements.slice(0, 1); + }, + + /** + * @function Chart.Interaction.modes.label + * @deprecated since version 2.4.0 + * @todo remove at version 3 + * @private + */ + label: indexMode, + + /** + * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item + * @function Chart.Interaction.modes.index + * @since v2.4.0 + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + index: indexMode, + + /** + * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect is false, we find the nearest item and return the items in that dataset + * @function Chart.Interaction.modes.dataset + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + dataset: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + + if (items.length > 0) { + items = chart.getDatasetMeta(items[0]._datasetIndex).data; + } + + return items; + }, + + /** + * @function Chart.Interaction.modes.x-axis + * @deprecated since version 2.4.0. Use index mode and intersect == true + * @todo remove at version 3 + * @private + */ + 'x-axis': function(chart, e) { + return indexMode(chart, e, {intersect: false}); + }, + + /** + * Point mode returns all elements that hit test based on the event position + * of the event + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + point: function(chart, e) { + var position = getRelativePosition(e, chart); + return getIntersectItems(chart, position); + }, + + /** + * nearest mode returns the element closest to the point + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + nearest: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + return getNearestItems(chart, position, options.intersect, distanceMetric); + }, + + /** + * x mode returns the elements that hit-test at the current x coordinate + * @function Chart.Interaction.modes.x + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + x: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inXRange(position.x)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + }, + + /** + * y mode returns the elements that hit-test at the current y coordinate + * @function Chart.Interaction.modes.y + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + y: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inYRange(position.y)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + } + } +}; + +function filterByPosition(array, position) { + return helpers$1.where(array, function(v) { + return v.position === position; + }); +} + +function sortByWeight(array, reverse) { + array.forEach(function(v, i) { + v._tmpIndex_ = i; + return v; + }); + array.sort(function(a, b) { + var v0 = reverse ? b : a; + var v1 = reverse ? a : b; + return v0.weight === v1.weight ? + v0._tmpIndex_ - v1._tmpIndex_ : + v0.weight - v1.weight; + }); + array.forEach(function(v) { + delete v._tmpIndex_; + }); +} + +function findMaxPadding(boxes) { + var top = 0; + var left = 0; + var bottom = 0; + var right = 0; + helpers$1.each(boxes, function(box) { + if (box.getPadding) { + var boxPadding = box.getPadding(); + top = Math.max(top, boxPadding.top); + left = Math.max(left, boxPadding.left); + bottom = Math.max(bottom, boxPadding.bottom); + right = Math.max(right, boxPadding.right); + } + }); + return { + top: top, + left: left, + bottom: bottom, + right: right + }; +} + +function addSizeByPosition(boxes, size) { + helpers$1.each(boxes, function(box) { + size[box.position] += box.isHorizontal() ? box.height : box.width; + }); +} + +core_defaults._set('global', { + layout: { + padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + } +}); + +/** + * @interface ILayoutItem + * @prop {string} position - The position of the item in the chart layout. Possible values are + * 'left', 'top', 'right', 'bottom', and 'chartArea' + * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area + * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down + * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) + * @prop {function} update - Takes two parameters: width and height. Returns size of item + * @prop {function} getPadding - Returns an object with padding on the edges + * @prop {number} width - Width of item. Must be valid after update() + * @prop {number} height - Height of item. Must be valid after update() + * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update + * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update + * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update + * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update + */ + +// The layout service is very self explanatory. It's responsible for the layout within a chart. +// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need +// It is this service's responsibility of carrying out that layout. +var core_layouts = { + defaults: {}, + + /** + * Register a box to a chart. + * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. + * @param {Chart} chart - the chart to use + * @param {ILayoutItem} item - the item to add to be layed out + */ + addBox: function(chart, item) { + if (!chart.boxes) { + chart.boxes = []; + } + + // initialize item with default values + item.fullWidth = item.fullWidth || false; + item.position = item.position || 'top'; + item.weight = item.weight || 0; + + chart.boxes.push(item); + }, + + /** + * Remove a layoutItem from a chart + * @param {Chart} chart - the chart to remove the box from + * @param {ILayoutItem} layoutItem - the item to remove from the layout + */ + removeBox: function(chart, layoutItem) { + var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; + if (index !== -1) { + chart.boxes.splice(index, 1); + } + }, + + /** + * Sets (or updates) options on the given `item`. + * @param {Chart} chart - the chart in which the item lives (or will be added to) + * @param {ILayoutItem} item - the item to configure with the given options + * @param {object} options - the new item options. + */ + configure: function(chart, item, options) { + var props = ['fullWidth', 'position', 'weight']; + var ilen = props.length; + var i = 0; + var prop; + + for (; i < ilen; ++i) { + prop = props[i]; + if (options.hasOwnProperty(prop)) { + item[prop] = options[prop]; + } + } + }, + + /** + * Fits boxes of the given chart into the given size by having each box measure itself + * then running a fitting algorithm + * @param {Chart} chart - the chart + * @param {number} width - the width to fit into + * @param {number} height - the height to fit into + */ + update: function(chart, width, height) { + if (!chart) { + return; + } + + var layoutOptions = chart.options.layout || {}; + var padding = helpers$1.options.toPadding(layoutOptions.padding); + var leftPadding = padding.left; + var rightPadding = padding.right; + var topPadding = padding.top; + var bottomPadding = padding.bottom; + + var leftBoxes = filterByPosition(chart.boxes, 'left'); + var rightBoxes = filterByPosition(chart.boxes, 'right'); + var topBoxes = filterByPosition(chart.boxes, 'top'); + var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); + var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); + + // Sort boxes by weight. A higher weight is further away from the chart area + sortByWeight(leftBoxes, true); + sortByWeight(rightBoxes, false); + sortByWeight(topBoxes, true); + sortByWeight(bottomBoxes, false); + + var verticalBoxes = leftBoxes.concat(rightBoxes); + var horizontalBoxes = topBoxes.concat(bottomBoxes); + var outerBoxes = verticalBoxes.concat(horizontalBoxes); + + // Essentially we now have any number of boxes on each of the 4 sides. + // Our canvas looks like the following. + // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and + // B1 is the bottom axis + // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays + // These locations are single-box locations only, when trying to register a chartArea location that is already taken, + // an error will be thrown. + // + // |----------------------------------------------------| + // | T1 (Full Width) | + // |----------------------------------------------------| + // | | | T2 | | + // | |----|-------------------------------------|----| + // | | | C1 | | C2 | | + // | | |----| |----| | + // | | | | | + // | L1 | L2 | ChartArea (C0) | R1 | + // | | | | | + // | | |----| |----| | + // | | | C3 | | C4 | | + // | |----|-------------------------------------|----| + // | | | B1 | | + // |----------------------------------------------------| + // | B2 (Full Width) | + // |----------------------------------------------------| + // + // What we do to find the best sizing, we do the following + // 1. Determine the minimum size of the chart area. + // 2. Split the remaining width equally between each vertical axis + // 3. Split the remaining height equally between each horizontal axis + // 4. Give each layout the maximum size it can be. The layout will return it's minimum size + // 5. Adjust the sizes of each axis based on it's minimum reported size. + // 6. Refit each axis + // 7. Position each axis in the final location + // 8. Tell the chart the final location of the chart area + // 9. Tell any axes that overlay the chart area the positions of the chart area + + // Step 1 + var chartWidth = width - leftPadding - rightPadding; + var chartHeight = height - topPadding - bottomPadding; + var chartAreaWidth = chartWidth / 2; // min 50% + + // Step 2 + var verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length; + + // Step 3 + // TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837) + // var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length; + + // Step 4 + var maxChartAreaWidth = chartWidth; + var maxChartAreaHeight = chartHeight; + var outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; + var minBoxSizes = []; + var maxPadding; + + function getMinimumBoxSize(box) { + var minSize; + var isHorizontal = box.isHorizontal(); + + if (isHorizontal) { + minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2); + maxChartAreaHeight -= minSize.height; + } else { + minSize = box.update(verticalBoxWidth, maxChartAreaHeight); + maxChartAreaWidth -= minSize.width; + } + + minBoxSizes.push({ + horizontal: isHorizontal, + width: minSize.width, + box: box, + }); + } + + helpers$1.each(outerBoxes, getMinimumBoxSize); + + // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) + maxPadding = findMaxPadding(outerBoxes); + + // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could + // be if the axes are drawn at their minimum sizes. + // Steps 5 & 6 + + // Function to fit a box + function fitBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minBox) { + return minBox.box === box; + }); + + if (minBoxSize) { + if (minBoxSize.horizontal) { + var scaleMargin = { + left: Math.max(outerBoxSizes.left, maxPadding.left), + right: Math.max(outerBoxSizes.right, maxPadding.right), + top: 0, + bottom: 0 + }; + + // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends + // on the margin. Sometimes they need to increase in size slightly + box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); + } else { + box.update(minBoxSize.width, maxChartAreaHeight); + } + } + } + + // Update, and calculate the left and right margins for the horizontal boxes + helpers$1.each(verticalBoxes, fitBox); + addSizeByPosition(verticalBoxes, outerBoxSizes); + + // Set the Left and Right margins for the horizontal boxes + helpers$1.each(horizontalBoxes, fitBox); + addSizeByPosition(horizontalBoxes, outerBoxSizes); + + function finalFitVerticalBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minSize) { + return minSize.box === box; + }); + + var scaleMargin = { + left: 0, + right: 0, + top: outerBoxSizes.top, + bottom: outerBoxSizes.bottom + }; + + if (minBoxSize) { + box.update(minBoxSize.width, maxChartAreaHeight, scaleMargin); + } + } + + // Let the left layout know the final margin + helpers$1.each(verticalBoxes, finalFitVerticalBox); + + // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) + outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; + addSizeByPosition(outerBoxes, outerBoxSizes); + + // We may be adding some padding to account for rotated x axis labels + var leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0); + outerBoxSizes.left += leftPaddingAddition; + outerBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0); + + var topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0); + outerBoxSizes.top += topPaddingAddition; + outerBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 0); + + // Figure out if our chart area changed. This would occur if the dataset layout label rotation + // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do + // without calling `fit` again + var newMaxChartAreaHeight = height - outerBoxSizes.top - outerBoxSizes.bottom; + var newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right; + + if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { + helpers$1.each(verticalBoxes, function(box) { + box.height = newMaxChartAreaHeight; + }); + + helpers$1.each(horizontalBoxes, function(box) { + if (!box.fullWidth) { + box.width = newMaxChartAreaWidth; + } + }); + + maxChartAreaHeight = newMaxChartAreaHeight; + maxChartAreaWidth = newMaxChartAreaWidth; + } + + // Step 7 - Position the boxes + var left = leftPadding + leftPaddingAddition; + var top = topPadding + topPaddingAddition; + + function placeBox(box) { + if (box.isHorizontal()) { + box.left = box.fullWidth ? leftPadding : outerBoxSizes.left; + box.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + maxChartAreaWidth; + box.top = top; + box.bottom = top + box.height; + + // Move to next point + top = box.bottom; + + } else { + + box.left = left; + box.right = left + box.width; + box.top = outerBoxSizes.top; + box.bottom = outerBoxSizes.top + maxChartAreaHeight; + + // Move to next point + left = box.right; + } + } + + helpers$1.each(leftBoxes.concat(topBoxes), placeBox); + + // Account for chart width and height + left += maxChartAreaWidth; + top += maxChartAreaHeight; + + helpers$1.each(rightBoxes, placeBox); + helpers$1.each(bottomBoxes, placeBox); + + // Step 8 + chart.chartArea = { + left: outerBoxSizes.left, + top: outerBoxSizes.top, + right: outerBoxSizes.left + maxChartAreaWidth, + bottom: outerBoxSizes.top + maxChartAreaHeight + }; + + // Step 9 + helpers$1.each(chartAreaBoxes, function(box) { + box.left = chart.chartArea.left; + box.top = chart.chartArea.top; + box.right = chart.chartArea.right; + box.bottom = chart.chartArea.bottom; + + box.update(maxChartAreaWidth, maxChartAreaHeight); + }); + } +}; + +/** + * Platform fallback implementation (minimal). + * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 + */ + +var platform_basic = { + acquireContext: function(item) { + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + return item && item.getContext('2d') || null; + } +}; + +var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n"; + +var platform_dom$1 = /*#__PURE__*/Object.freeze({ +default: platform_dom +}); + +function getCjsExportFromNamespace (n) { + return n && n.default || n; +} + +var stylesheet = getCjsExportFromNamespace(platform_dom$1); + +var EXPANDO_KEY = '$chartjs'; +var CSS_PREFIX = 'chartjs-'; +var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor'; +var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; +var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; +var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; + +/** + * DOM event types -> Chart.js event types. + * Note: only events with different types are mapped. + * @see https://developer.mozilla.org/en-US/docs/Web/Events + */ +var EVENT_TYPES = { + touchstart: 'mousedown', + touchmove: 'mousemove', + touchend: 'mouseup', + pointerenter: 'mouseenter', + pointerdown: 'mousedown', + pointermove: 'mousemove', + pointerup: 'mouseup', + pointerleave: 'mouseout', + pointerout: 'mouseout' +}; + +/** + * The "used" size is the final value of a dimension property after all calculations have + * been performed. This method uses the computed style of `element` but returns undefined + * if the computed style is not expressed in pixels. That can happen in some cases where + * `element` has a size relative to its parent and this last one is not yet displayed, + * for example because of `display: none` on a parent node. + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value + * @returns {number} Size in pixels or undefined if unknown. + */ +function readUsedSize(element, property) { + var value = helpers$1.getStyle(element, property); + var matches = value && value.match(/^(\d+)(\.\d+)?px$/); + return matches ? Number(matches[1]) : undefined; +} + +/** + * Initializes the canvas style and render size without modifying the canvas display size, + * since responsiveness is handled by the controller.resize() method. The config is used + * to determine the aspect ratio to apply in case no explicit height has been specified. + */ +function initCanvas(canvas, config) { + var style = canvas.style; + + // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it + // returns null or '' if no explicit value has been set to the canvas attribute. + var renderHeight = canvas.getAttribute('height'); + var renderWidth = canvas.getAttribute('width'); + + // Chart.js modifies some canvas values that we want to restore on destroy + canvas[EXPANDO_KEY] = { + initial: { + height: renderHeight, + width: renderWidth, + style: { + display: style.display, + height: style.height, + width: style.width + } + } + }; + + // Force canvas to display as block to avoid extra space caused by inline + // elements, which would interfere with the responsive resize process. + // https://github.com/chartjs/Chart.js/issues/2538 + style.display = style.display || 'block'; + + if (renderWidth === null || renderWidth === '') { + var displayWidth = readUsedSize(canvas, 'width'); + if (displayWidth !== undefined) { + canvas.width = displayWidth; + } + } + + if (renderHeight === null || renderHeight === '') { + if (canvas.style.height === '') { + // If no explicit render height and style height, let's apply the aspect ratio, + // which one can be specified by the user but also by charts as default option + // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. + canvas.height = canvas.width / (config.options.aspectRatio || 2); + } else { + var displayHeight = readUsedSize(canvas, 'height'); + if (displayWidth !== undefined) { + canvas.height = displayHeight; + } + } + } + + return canvas; +} + +/** + * Detects support for options object argument in addEventListener. + * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + * @private + */ +var supportsEventListenerOptions = (function() { + var supports = false; + try { + var options = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line getter-return + get: function() { + supports = true; + } + }); + window.addEventListener('e', null, options); + } catch (e) { + // continue regardless of error + } + return supports; +}()); + +// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. +// https://github.com/chartjs/Chart.js/issues/4287 +var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; + +function addListener(node, type, listener) { + node.addEventListener(type, listener, eventListenerOptions); +} + +function removeListener(node, type, listener) { + node.removeEventListener(type, listener, eventListenerOptions); +} + +function createEvent(type, chart, x, y, nativeEvent) { + return { + type: type, + chart: chart, + native: nativeEvent || null, + x: x !== undefined ? x : null, + y: y !== undefined ? y : null, + }; +} + +function fromNativeEvent(event, chart) { + var type = EVENT_TYPES[event.type] || event.type; + var pos = helpers$1.getRelativePosition(event, chart); + return createEvent(type, chart, pos.x, pos.y, event); +} + +function throttled(fn, thisArg) { + var ticking = false; + var args = []; + + return function() { + args = Array.prototype.slice.call(arguments); + thisArg = thisArg || this; + + if (!ticking) { + ticking = true; + helpers$1.requestAnimFrame.call(window, function() { + ticking = false; + fn.apply(thisArg, args); + }); + } + }; +} + +function createDiv(cls) { + var el = document.createElement('div'); + el.className = cls || ''; + return el; +} + +// Implementation based on https://github.com/marcj/css-element-queries +function createResizer(handler) { + var maxSize = 1000000; + + // NOTE(SB) Don't use innerHTML because it could be considered unsafe. + // https://github.com/chartjs/Chart.js/issues/5902 + var resizer = createDiv(CSS_SIZE_MONITOR); + var expand = createDiv(CSS_SIZE_MONITOR + '-expand'); + var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink'); + + expand.appendChild(createDiv()); + shrink.appendChild(createDiv()); + + resizer.appendChild(expand); + resizer.appendChild(shrink); + resizer._reset = function() { + expand.scrollLeft = maxSize; + expand.scrollTop = maxSize; + shrink.scrollLeft = maxSize; + shrink.scrollTop = maxSize; + }; + + var onScroll = function() { + resizer._reset(); + handler(); + }; + + addListener(expand, 'scroll', onScroll.bind(expand, 'expand')); + addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); + + return resizer; +} + +// https://davidwalsh.name/detect-node-insertion +function watchForRender(node, handler) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + var proxy = expando.renderProxy = function(e) { + if (e.animationName === CSS_RENDER_ANIMATION) { + handler(); + } + }; + + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + addListener(node, type, proxy); + }); + + // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class + // is removed then added back immediately (same animation frame?). Accessing the + // `offsetParent` property will force a reflow and re-evaluate the CSS animation. + // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics + // https://github.com/chartjs/Chart.js/issues/4737 + expando.reflow = !!node.offsetParent; + + node.classList.add(CSS_RENDER_MONITOR); +} + +function unwatchForRender(node) { + var expando = node[EXPANDO_KEY] || {}; + var proxy = expando.renderProxy; + + if (proxy) { + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + removeListener(node, type, proxy); + }); + + delete expando.renderProxy; + } + + node.classList.remove(CSS_RENDER_MONITOR); +} + +function addResizeListener(node, listener, chart) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + + // Let's keep track of this added resizer and thus avoid DOM query when removing it. + var resizer = expando.resizer = createResizer(throttled(function() { + if (expando.resizer) { + var container = chart.options.maintainAspectRatio && node.parentNode; + var w = container ? container.clientWidth : 0; + listener(createEvent('resize', chart)); + if (container && container.clientWidth < w && chart.canvas) { + // If the container size shrank during chart resize, let's assume + // scrollbar appeared. So we resize again with the scrollbar visible - + // effectively making chart smaller and the scrollbar hidden again. + // Because we are inside `throttled`, and currently `ticking`, scroll + // events are ignored during this whole 2 resize process. + // If we assumed wrong and something else happened, we are resizing + // twice in a frame (potential performance issue) + listener(createEvent('resize', chart)); + } + } + })); + + // The resizer needs to be attached to the node parent, so we first need to be + // sure that `node` is attached to the DOM before injecting the resizer element. + watchForRender(node, function() { + if (expando.resizer) { + var container = node.parentNode; + if (container && container !== resizer.parentNode) { + container.insertBefore(resizer, container.firstChild); + } + + // The container size might have changed, let's reset the resizer state. + resizer._reset(); + } + }); +} + +function removeResizeListener(node) { + var expando = node[EXPANDO_KEY] || {}; + var resizer = expando.resizer; + + delete expando.resizer; + unwatchForRender(node); + + if (resizer && resizer.parentNode) { + resizer.parentNode.removeChild(resizer); + } +} + +function injectCSS(platform, css) { + // https://stackoverflow.com/q/3922139 + var style = platform._style || document.createElement('style'); + if (!platform._style) { + platform._style = style; + css = '/* Chart.js */\n' + css; + style.setAttribute('type', 'text/css'); + document.getElementsByTagName('head')[0].appendChild(style); + } + + style.appendChild(document.createTextNode(css)); +} + +var platform_dom$2 = { + /** + * When `true`, prevents the automatic injection of the stylesheet required to + * correctly detect when the chart is added to the DOM and then resized. This + * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`) + * to be manually imported to make this library compatible with any CSP. + * See https://github.com/chartjs/Chart.js/issues/5208 + */ + disableCSSInjection: false, + + /** + * This property holds whether this platform is enabled for the current environment. + * Currently used by platform.js to select the proper implementation. + * @private + */ + _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', + + /** + * @private + */ + _ensureLoaded: function() { + if (this._loaded) { + return; + } + + this._loaded = true; + + // https://github.com/chartjs/Chart.js/issues/5208 + if (!this.disableCSSInjection) { + injectCSS(this, stylesheet); + } + }, + + acquireContext: function(item, config) { + if (typeof item === 'string') { + item = document.getElementById(item); + } else if (item.length) { + // Support for array based queries (such as jQuery) + item = item[0]; + } + + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + // To prevent canvas fingerprinting, some add-ons undefine the getContext + // method, for example: https://github.com/kkapsner/CanvasBlocker + // https://github.com/chartjs/Chart.js/issues/2807 + var context = item && item.getContext && item.getContext('2d'); + + // Load platform resources on first chart creation, to make possible to change + // platform options after importing the library (e.g. `disableCSSInjection`). + this._ensureLoaded(); + + // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is + // inside an iframe or when running in a protected environment. We could guess the + // types from their toString() value but let's keep things flexible and assume it's + // a sufficient condition if the item has a context2D which has item as `canvas`. + // https://github.com/chartjs/Chart.js/issues/3887 + // https://github.com/chartjs/Chart.js/issues/4102 + // https://github.com/chartjs/Chart.js/issues/4152 + if (context && context.canvas === item) { + initCanvas(item, config); + return context; + } + + return null; + }, + + releaseContext: function(context) { + var canvas = context.canvas; + if (!canvas[EXPANDO_KEY]) { + return; + } + + var initial = canvas[EXPANDO_KEY].initial; + ['height', 'width'].forEach(function(prop) { + var value = initial[prop]; + if (helpers$1.isNullOrUndef(value)) { + canvas.removeAttribute(prop); + } else { + canvas.setAttribute(prop, value); + } + }); + + helpers$1.each(initial.style || {}, function(value, key) { + canvas.style[key] = value; + }); + + // The canvas render size might have been changed (and thus the state stack discarded), + // we can't use save() and restore() to restore the initial state. So make sure that at + // least the canvas context is reset to the default state by setting the canvas width. + // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html + // eslint-disable-next-line no-self-assign + canvas.width = canvas.width; + + delete canvas[EXPANDO_KEY]; + }, + + addEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + addResizeListener(canvas, listener, chart); + return; + } + + var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); + var proxies = expando.proxies || (expando.proxies = {}); + var proxy = proxies[chart.id + '_' + type] = function(event) { + listener(fromNativeEvent(event, chart)); + }; + + addListener(canvas, type, proxy); + }, + + removeEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + removeResizeListener(canvas); + return; + } + + var expando = listener[EXPANDO_KEY] || {}; + var proxies = expando.proxies || {}; + var proxy = proxies[chart.id + '_' + type]; + if (!proxy) { + return; + } + + removeListener(canvas, type, proxy); + } +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use EventTarget.addEventListener instead. + * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener + * @function Chart.helpers.addEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers$1.addEvent = addListener; + +/** + * Provided for backward compatibility, use EventTarget.removeEventListener instead. + * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener + * @function Chart.helpers.removeEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers$1.removeEvent = removeListener; + +// @TODO Make possible to select another platform at build time. +var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic; + +/** + * @namespace Chart.platform + * @see https://chartjs.gitbooks.io/proposals/content/Platform.html + * @since 2.4.0 + */ +var platform = helpers$1.extend({ + /** + * @since 2.7.0 + */ + initialize: function() {}, + + /** + * Called at chart construction time, returns a context2d instance implementing + * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. + * @param {*} item - The native item from which to acquire context (platform specific) + * @param {object} options - The chart options + * @returns {CanvasRenderingContext2D} context2d instance + */ + acquireContext: function() {}, + + /** + * Called at chart destruction time, releases any resources associated to the context + * previously returned by the acquireContext() method. + * @param {CanvasRenderingContext2D} context - The context2d instance + * @returns {boolean} true if the method succeeded, else false + */ + releaseContext: function() {}, + + /** + * Registers the specified listener on the given chart. + * @param {Chart} chart - Chart from which to listen for event + * @param {string} type - The ({@link IEvent}) type to listen for + * @param {function} listener - Receives a notification (an object that implements + * the {@link IEvent} interface) when an event of the specified type occurs. + */ + addEventListener: function() {}, + + /** + * Removes the specified listener previously registered with addEventListener. + * @param {Chart} chart - Chart from which to remove the listener + * @param {string} type - The ({@link IEvent}) type to remove + * @param {function} listener - The listener function to remove from the event target. + */ + removeEventListener: function() {} + +}, implementation); + +core_defaults._set('global', { + plugins: {} +}); + +/** + * The plugin service singleton + * @namespace Chart.plugins + * @since 2.1.0 + */ +var core_plugins = { + /** + * Globally registered plugins. + * @private + */ + _plugins: [], + + /** + * This identifier is used to invalidate the descriptors cache attached to each chart + * when a global plugin is registered or unregistered. In this case, the cache ID is + * incremented and descriptors are regenerated during following API calls. + * @private + */ + _cacheId: 0, + + /** + * Registers the given plugin(s) if not already registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + register: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + if (p.indexOf(plugin) === -1) { + p.push(plugin); + } + }); + + this._cacheId++; + }, + + /** + * Unregisters the given plugin(s) only if registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + unregister: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + var idx = p.indexOf(plugin); + if (idx !== -1) { + p.splice(idx, 1); + } + }); + + this._cacheId++; + }, + + /** + * Remove all registered plugins. + * @since 2.1.5 + */ + clear: function() { + this._plugins = []; + this._cacheId++; + }, + + /** + * Returns the number of registered plugins? + * @returns {number} + * @since 2.1.5 + */ + count: function() { + return this._plugins.length; + }, + + /** + * Returns all registered plugin instances. + * @returns {IPlugin[]} array of plugin objects. + * @since 2.1.5 + */ + getAll: function() { + return this._plugins; + }, + + /** + * Calls enabled plugins for `chart` on the specified hook and with the given args. + * This method immediately returns as soon as a plugin explicitly returns false. The + * returned value can be used, for instance, to interrupt the current action. + * @param {Chart} chart - The chart instance for which plugins should be called. + * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). + * @param {Array} [args] - Extra arguments to apply to the hook call. + * @returns {boolean} false if any of the plugins return false, else returns true. + */ + notify: function(chart, hook, args) { + var descriptors = this.descriptors(chart); + var ilen = descriptors.length; + var i, descriptor, plugin, params, method; + + for (i = 0; i < ilen; ++i) { + descriptor = descriptors[i]; + plugin = descriptor.plugin; + method = plugin[hook]; + if (typeof method === 'function') { + params = [chart].concat(args || []); + params.push(descriptor.options); + if (method.apply(plugin, params) === false) { + return false; + } + } + } + + return true; + }, + + /** + * Returns descriptors of enabled plugins for the given chart. + * @returns {object[]} [{ plugin, options }] + * @private + */ + descriptors: function(chart) { + var cache = chart.$plugins || (chart.$plugins = {}); + if (cache.id === this._cacheId) { + return cache.descriptors; + } + + var plugins = []; + var descriptors = []; + var config = (chart && chart.config) || {}; + var options = (config.options && config.options.plugins) || {}; + + this._plugins.concat(config.plugins || []).forEach(function(plugin) { + var idx = plugins.indexOf(plugin); + if (idx !== -1) { + return; + } + + var id = plugin.id; + var opts = options[id]; + if (opts === false) { + return; + } + + if (opts === true) { + opts = helpers$1.clone(core_defaults.global.plugins[id]); + } + + plugins.push(plugin); + descriptors.push({ + plugin: plugin, + options: opts || {} + }); + }); + + cache.descriptors = descriptors; + cache.id = this._cacheId; + return descriptors; + }, + + /** + * Invalidates cache for the given chart: descriptors hold a reference on plugin option, + * but in some cases, this reference can be changed by the user when updating options. + * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + * @private + */ + _invalidate: function(chart) { + delete chart.$plugins; + } +}; + +var core_scaleService = { + // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then + // use the new chart options to grab the correct scale + constructors: {}, + // Use a registration function so that we can move to an ES6 map when we no longer need to support + // old browsers + + // Scale config defaults + defaults: {}, + registerScaleType: function(type, scaleConstructor, scaleDefaults) { + this.constructors[type] = scaleConstructor; + this.defaults[type] = helpers$1.clone(scaleDefaults); + }, + getScaleConstructor: function(type) { + return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; + }, + getScaleDefaults: function(type) { + // Return the scale defaults merged with the global settings so that we always use the latest ones + return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {}; + }, + updateScaleDefaults: function(type, additions) { + var me = this; + if (me.defaults.hasOwnProperty(type)) { + me.defaults[type] = helpers$1.extend(me.defaults[type], additions); + } + }, + addScalesToLayout: function(chart) { + // Adds each scale to the chart.boxes array to be sized accordingly + helpers$1.each(chart.scales, function(scale) { + // Set ILayoutItem parameters for backwards compatibility + scale.fullWidth = scale.options.fullWidth; + scale.position = scale.options.position; + scale.weight = scale.options.weight; + core_layouts.addBox(chart, scale); + }); + } +}; + +var valueOrDefault$7 = helpers$1.valueOrDefault; + +core_defaults._set('global', { + tooltips: { + enabled: true, + custom: null, + mode: 'nearest', + position: 'average', + intersect: true, + backgroundColor: 'rgba(0,0,0,0.8)', + titleFontStyle: 'bold', + titleSpacing: 2, + titleMarginBottom: 6, + titleFontColor: '#fff', + titleAlign: 'left', + bodySpacing: 2, + bodyFontColor: '#fff', + bodyAlign: 'left', + footerFontStyle: 'bold', + footerSpacing: 2, + footerMarginTop: 6, + footerFontColor: '#fff', + footerAlign: 'left', + yPadding: 6, + xPadding: 6, + caretPadding: 2, + caretSize: 5, + cornerRadius: 6, + multiKeyBackground: '#fff', + displayColors: true, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 0, + callbacks: { + // Args are: (tooltipItems, data) + beforeTitle: helpers$1.noop, + title: function(tooltipItems, data) { + var title = ''; + var labels = data.labels; + var labelCount = labels ? labels.length : 0; + + if (tooltipItems.length > 0) { + var item = tooltipItems[0]; + if (item.label) { + title = item.label; + } else if (item.xLabel) { + title = item.xLabel; + } else if (labelCount > 0 && item.index < labelCount) { + title = labels[item.index]; + } + } + + return title; + }, + afterTitle: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeBody: helpers$1.noop, + + // Args are: (tooltipItem, data) + beforeLabel: helpers$1.noop, + label: function(tooltipItem, data) { + var label = data.datasets[tooltipItem.datasetIndex].label || ''; + + if (label) { + label += ': '; + } + if (!helpers$1.isNullOrUndef(tooltipItem.value)) { + label += tooltipItem.value; + } else { + label += tooltipItem.yLabel; + } + return label; + }, + labelColor: function(tooltipItem, chart) { + var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); + var activeElement = meta.data[tooltipItem.index]; + var view = activeElement._view; + return { + borderColor: view.borderColor, + backgroundColor: view.backgroundColor + }; + }, + labelTextColor: function() { + return this._options.bodyFontColor; + }, + afterLabel: helpers$1.noop, + + // Args are: (tooltipItems, data) + afterBody: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeFooter: helpers$1.noop, + footer: helpers$1.noop, + afterFooter: helpers$1.noop + } + } +}); + +var positioners = { + /** + * Average mode places the tooltip at the average position of the elements shown + * @function Chart.Tooltip.positioners.average + * @param elements {ChartElement[]} the elements being displayed in the tooltip + * @returns {object} tooltip position + */ + average: function(elements) { + if (!elements.length) { + return false; + } + + var i, len; + var x = 0; + var y = 0; + var count = 0; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var pos = el.tooltipPosition(); + x += pos.x; + y += pos.y; + ++count; + } + } + + return { + x: x / count, + y: y / count + }; + }, + + /** + * Gets the tooltip position nearest of the item nearest to the event position + * @function Chart.Tooltip.positioners.nearest + * @param elements {Chart.Element[]} the tooltip elements + * @param eventPosition {object} the position of the event in canvas coordinates + * @returns {object} the tooltip position + */ + nearest: function(elements, eventPosition) { + var x = eventPosition.x; + var y = eventPosition.y; + var minDistance = Number.POSITIVE_INFINITY; + var i, len, nearestElement; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var center = el.getCenterPoint(); + var d = helpers$1.distanceBetweenPoints(eventPosition, center); + + if (d < minDistance) { + minDistance = d; + nearestElement = el; + } + } + } + + if (nearestElement) { + var tp = nearestElement.tooltipPosition(); + x = tp.x; + y = tp.y; + } + + return { + x: x, + y: y + }; + } +}; + +// Helper to push or concat based on if the 2nd parameter is an array or not +function pushOrConcat(base, toPush) { + if (toPush) { + if (helpers$1.isArray(toPush)) { + // base = base.concat(toPush); + Array.prototype.push.apply(base, toPush); + } else { + base.push(toPush); + } + } + + return base; +} + +/** + * Returns array of strings split by newline + * @param {string} value - The value to split by newline. + * @returns {string[]} value if newline present - Returned from String split() method + * @function + */ +function splitNewlines(str) { + if ((typeof str === 'string' || str instanceof String) && str.indexOf('\n') > -1) { + return str.split('\n'); + } + return str; +} + + +/** + * Private helper to create a tooltip item model + * @param element - the chart element (point, arc, bar) to create the tooltip item for + * @return new tooltip item + */ +function createTooltipItem(element) { + var xScale = element._xScale; + var yScale = element._yScale || element._scale; // handle radar || polarArea charts + var index = element._index; + var datasetIndex = element._datasetIndex; + var controller = element._chart.getDatasetMeta(datasetIndex).controller; + var indexScale = controller._getIndexScale(); + var valueScale = controller._getValueScale(); + + return { + xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', + yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', + label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '', + value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '', + index: index, + datasetIndex: datasetIndex, + x: element._model.x, + y: element._model.y + }; +} + +/** + * Helper to get the reset model for the tooltip + * @param tooltipOpts {object} the tooltip options + */ +function getBaseModel(tooltipOpts) { + var globalDefaults = core_defaults.global; + + return { + // Positioning + xPadding: tooltipOpts.xPadding, + yPadding: tooltipOpts.yPadding, + xAlign: tooltipOpts.xAlign, + yAlign: tooltipOpts.yAlign, + + // Body + bodyFontColor: tooltipOpts.bodyFontColor, + _bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), + _bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), + _bodyAlign: tooltipOpts.bodyAlign, + bodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), + bodySpacing: tooltipOpts.bodySpacing, + + // Title + titleFontColor: tooltipOpts.titleFontColor, + _titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), + _titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), + titleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), + _titleAlign: tooltipOpts.titleAlign, + titleSpacing: tooltipOpts.titleSpacing, + titleMarginBottom: tooltipOpts.titleMarginBottom, + + // Footer + footerFontColor: tooltipOpts.footerFontColor, + _footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), + _footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), + footerFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), + _footerAlign: tooltipOpts.footerAlign, + footerSpacing: tooltipOpts.footerSpacing, + footerMarginTop: tooltipOpts.footerMarginTop, + + // Appearance + caretSize: tooltipOpts.caretSize, + cornerRadius: tooltipOpts.cornerRadius, + backgroundColor: tooltipOpts.backgroundColor, + opacity: 0, + legendColorBackground: tooltipOpts.multiKeyBackground, + displayColors: tooltipOpts.displayColors, + borderColor: tooltipOpts.borderColor, + borderWidth: tooltipOpts.borderWidth + }; +} + +/** + * Get the size of the tooltip + */ +function getTooltipSize(tooltip, model) { + var ctx = tooltip._chart.ctx; + + var height = model.yPadding * 2; // Tooltip Padding + var width = 0; + + // Count of all lines in the body + var body = model.body; + var combinedBodyLength = body.reduce(function(count, bodyItem) { + return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; + }, 0); + combinedBodyLength += model.beforeBody.length + model.afterBody.length; + + var titleLineCount = model.title.length; + var footerLineCount = model.footer.length; + var titleFontSize = model.titleFontSize; + var bodyFontSize = model.bodyFontSize; + var footerFontSize = model.footerFontSize; + + height += titleLineCount * titleFontSize; // Title Lines + height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing + height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin + height += combinedBodyLength * bodyFontSize; // Body Lines + height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing + height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin + height += footerLineCount * (footerFontSize); // Footer Lines + height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing + + // Title width + var widthPadding = 0; + var maxLineWidth = function(line) { + width = Math.max(width, ctx.measureText(line).width + widthPadding); + }; + + ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); + helpers$1.each(model.title, maxLineWidth); + + // Body width + ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); + helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth); + + // Body lines may include some extra width due to the color box + widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; + helpers$1.each(body, function(bodyItem) { + helpers$1.each(bodyItem.before, maxLineWidth); + helpers$1.each(bodyItem.lines, maxLineWidth); + helpers$1.each(bodyItem.after, maxLineWidth); + }); + + // Reset back to 0 + widthPadding = 0; + + // Footer width + ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); + helpers$1.each(model.footer, maxLineWidth); + + // Add padding + width += 2 * model.xPadding; + + return { + width: width, + height: height + }; +} + +/** + * Helper to get the alignment of a tooltip given the size + */ +function determineAlignment(tooltip, size) { + var model = tooltip._model; + var chart = tooltip._chart; + var chartArea = tooltip._chart.chartArea; + var xAlign = 'center'; + var yAlign = 'center'; + + if (model.y < size.height) { + yAlign = 'top'; + } else if (model.y > (chart.height - size.height)) { + yAlign = 'bottom'; + } + + var lf, rf; // functions to determine left, right alignment + var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart + var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges + var midX = (chartArea.left + chartArea.right) / 2; + var midY = (chartArea.top + chartArea.bottom) / 2; + + if (yAlign === 'center') { + lf = function(x) { + return x <= midX; + }; + rf = function(x) { + return x > midX; + }; + } else { + lf = function(x) { + return x <= (size.width / 2); + }; + rf = function(x) { + return x >= (chart.width - (size.width / 2)); + }; + } + + olf = function(x) { + return x + size.width + model.caretSize + model.caretPadding > chart.width; + }; + orf = function(x) { + return x - size.width - model.caretSize - model.caretPadding < 0; + }; + yf = function(y) { + return y <= midY ? 'top' : 'bottom'; + }; + + if (lf(model.x)) { + xAlign = 'left'; + + // Is tooltip too wide and goes over the right side of the chart.? + if (olf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } else if (rf(model.x)) { + xAlign = 'right'; + + // Is tooltip too wide and goes outside left edge of canvas? + if (orf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } + + var opts = tooltip._options; + return { + xAlign: opts.xAlign ? opts.xAlign : xAlign, + yAlign: opts.yAlign ? opts.yAlign : yAlign + }; +} + +/** + * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment + */ +function getBackgroundPoint(vm, size, alignment, chart) { + // Background Position + var x = vm.x; + var y = vm.y; + + var caretSize = vm.caretSize; + var caretPadding = vm.caretPadding; + var cornerRadius = vm.cornerRadius; + var xAlign = alignment.xAlign; + var yAlign = alignment.yAlign; + var paddingAndSize = caretSize + caretPadding; + var radiusAndPadding = cornerRadius + caretPadding; + + if (xAlign === 'right') { + x -= size.width; + } else if (xAlign === 'center') { + x -= (size.width / 2); + if (x + size.width > chart.width) { + x = chart.width - size.width; + } + if (x < 0) { + x = 0; + } + } + + if (yAlign === 'top') { + y += paddingAndSize; + } else if (yAlign === 'bottom') { + y -= size.height + paddingAndSize; + } else { + y -= (size.height / 2); + } + + if (yAlign === 'center') { + if (xAlign === 'left') { + x += paddingAndSize; + } else if (xAlign === 'right') { + x -= paddingAndSize; + } + } else if (xAlign === 'left') { + x -= radiusAndPadding; + } else if (xAlign === 'right') { + x += radiusAndPadding; + } + + return { + x: x, + y: y + }; +} + +function getAlignedX(vm, align) { + return align === 'center' + ? vm.x + vm.width / 2 + : align === 'right' + ? vm.x + vm.width - vm.xPadding + : vm.x + vm.xPadding; +} + +/** + * Helper to build before and after body lines + */ +function getBeforeAfterBodyLines(callback) { + return pushOrConcat([], splitNewlines(callback)); +} + +var exports$3 = core_element.extend({ + initialize: function() { + this._model = getBaseModel(this._options); + this._lastActive = []; + }, + + // Get the title + // Args are: (tooltipItem, data) + getTitle: function() { + var me = this; + var opts = me._options; + var callbacks = opts.callbacks; + + var beforeTitle = callbacks.beforeTitle.apply(me, arguments); + var title = callbacks.title.apply(me, arguments); + var afterTitle = callbacks.afterTitle.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeTitle)); + lines = pushOrConcat(lines, splitNewlines(title)); + lines = pushOrConcat(lines, splitNewlines(afterTitle)); + + return lines; + }, + + // Args are: (tooltipItem, data) + getBeforeBody: function() { + return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments)); + }, + + // Args are: (tooltipItem, data) + getBody: function(tooltipItems, data) { + var me = this; + var callbacks = me._options.callbacks; + var bodyItems = []; + + helpers$1.each(tooltipItems, function(tooltipItem) { + var bodyItem = { + before: [], + lines: [], + after: [] + }; + pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data))); + pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); + pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data))); + + bodyItems.push(bodyItem); + }); + + return bodyItems; + }, + + // Args are: (tooltipItem, data) + getAfterBody: function() { + return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments)); + }, + + // Get the footer and beforeFooter and afterFooter lines + // Args are: (tooltipItem, data) + getFooter: function() { + var me = this; + var callbacks = me._options.callbacks; + + var beforeFooter = callbacks.beforeFooter.apply(me, arguments); + var footer = callbacks.footer.apply(me, arguments); + var afterFooter = callbacks.afterFooter.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeFooter)); + lines = pushOrConcat(lines, splitNewlines(footer)); + lines = pushOrConcat(lines, splitNewlines(afterFooter)); + + return lines; + }, + + update: function(changed) { + var me = this; + var opts = me._options; + + // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition + // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time + // which breaks any animations. + var existingModel = me._model; + var model = me._model = getBaseModel(opts); + var active = me._active; + + var data = me._data; + + // In the case where active.length === 0 we need to keep these at existing values for good animations + var alignment = { + xAlign: existingModel.xAlign, + yAlign: existingModel.yAlign + }; + var backgroundPoint = { + x: existingModel.x, + y: existingModel.y + }; + var tooltipSize = { + width: existingModel.width, + height: existingModel.height + }; + var tooltipPosition = { + x: existingModel.caretX, + y: existingModel.caretY + }; + + var i, len; + + if (active.length) { + model.opacity = 1; + + var labelColors = []; + var labelTextColors = []; + tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition); + + var tooltipItems = []; + for (i = 0, len = active.length; i < len; ++i) { + tooltipItems.push(createTooltipItem(active[i])); + } + + // If the user provided a filter function, use it to modify the tooltip items + if (opts.filter) { + tooltipItems = tooltipItems.filter(function(a) { + return opts.filter(a, data); + }); + } + + // If the user provided a sorting function, use it to modify the tooltip items + if (opts.itemSort) { + tooltipItems = tooltipItems.sort(function(a, b) { + return opts.itemSort(a, b, data); + }); + } + + // Determine colors for boxes + helpers$1.each(tooltipItems, function(tooltipItem) { + labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); + labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); + }); + + + // Build the Text Lines + model.title = me.getTitle(tooltipItems, data); + model.beforeBody = me.getBeforeBody(tooltipItems, data); + model.body = me.getBody(tooltipItems, data); + model.afterBody = me.getAfterBody(tooltipItems, data); + model.footer = me.getFooter(tooltipItems, data); + + // Initial positioning and colors + model.x = tooltipPosition.x; + model.y = tooltipPosition.y; + model.caretPadding = opts.caretPadding; + model.labelColors = labelColors; + model.labelTextColors = labelTextColors; + + // data points + model.dataPoints = tooltipItems; + + // We need to determine alignment of the tooltip + tooltipSize = getTooltipSize(this, model); + alignment = determineAlignment(this, tooltipSize); + // Final Size and Position + backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart); + } else { + model.opacity = 0; + } + + model.xAlign = alignment.xAlign; + model.yAlign = alignment.yAlign; + model.x = backgroundPoint.x; + model.y = backgroundPoint.y; + model.width = tooltipSize.width; + model.height = tooltipSize.height; + + // Point where the caret on the tooltip points to + model.caretX = tooltipPosition.x; + model.caretY = tooltipPosition.y; + + me._model = model; + + if (changed && opts.custom) { + opts.custom.call(me, model); + } + + return me; + }, + + drawCaret: function(tooltipPoint, size) { + var ctx = this._chart.ctx; + var vm = this._view; + var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); + + ctx.lineTo(caretPosition.x1, caretPosition.y1); + ctx.lineTo(caretPosition.x2, caretPosition.y2); + ctx.lineTo(caretPosition.x3, caretPosition.y3); + }, + getCaretPosition: function(tooltipPoint, size, vm) { + var x1, x2, x3, y1, y2, y3; + var caretSize = vm.caretSize; + var cornerRadius = vm.cornerRadius; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var ptX = tooltipPoint.x; + var ptY = tooltipPoint.y; + var width = size.width; + var height = size.height; + + if (yAlign === 'center') { + y2 = ptY + (height / 2); + + if (xAlign === 'left') { + x1 = ptX; + x2 = x1 - caretSize; + x3 = x1; + + y1 = y2 + caretSize; + y3 = y2 - caretSize; + } else { + x1 = ptX + width; + x2 = x1 + caretSize; + x3 = x1; + + y1 = y2 - caretSize; + y3 = y2 + caretSize; + } + } else { + if (xAlign === 'left') { + x2 = ptX + cornerRadius + (caretSize); + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else if (xAlign === 'right') { + x2 = ptX + width - cornerRadius - caretSize; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else { + x2 = vm.caretX; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } + if (yAlign === 'top') { + y1 = ptY; + y2 = y1 - caretSize; + y3 = y1; + } else { + y1 = ptY + height; + y2 = y1 + caretSize; + y3 = y1; + // invert drawing order + var tmp = x3; + x3 = x1; + x1 = tmp; + } + } + return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; + }, + + drawTitle: function(pt, vm, ctx) { + var title = vm.title; + + if (title.length) { + pt.x = getAlignedX(vm, vm._titleAlign); + + ctx.textAlign = vm._titleAlign; + ctx.textBaseline = 'top'; + + var titleFontSize = vm.titleFontSize; + var titleSpacing = vm.titleSpacing; + + ctx.fillStyle = vm.titleFontColor; + ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); + + var i, len; + for (i = 0, len = title.length; i < len; ++i) { + ctx.fillText(title[i], pt.x, pt.y); + pt.y += titleFontSize + titleSpacing; // Line Height and spacing + + if (i + 1 === title.length) { + pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing + } + } + } + }, + + drawBody: function(pt, vm, ctx) { + var bodyFontSize = vm.bodyFontSize; + var bodySpacing = vm.bodySpacing; + var bodyAlign = vm._bodyAlign; + var body = vm.body; + var drawColorBoxes = vm.displayColors; + var labelColors = vm.labelColors; + var xLinePadding = 0; + var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0; + var textColor; + + ctx.textAlign = bodyAlign; + ctx.textBaseline = 'top'; + ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); + + pt.x = getAlignedX(vm, bodyAlign); + + // Before Body + var fillLineOfText = function(line) { + ctx.fillText(line, pt.x + xLinePadding, pt.y); + pt.y += bodyFontSize + bodySpacing; + }; + + // Before body lines + ctx.fillStyle = vm.bodyFontColor; + helpers$1.each(vm.beforeBody, fillLineOfText); + + xLinePadding = drawColorBoxes && bodyAlign !== 'right' + ? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2) + : 0; + + // Draw body lines now + helpers$1.each(body, function(bodyItem, i) { + textColor = vm.labelTextColors[i]; + ctx.fillStyle = textColor; + helpers$1.each(bodyItem.before, fillLineOfText); + + helpers$1.each(bodyItem.lines, function(line) { + // Draw Legend-like boxes if needed + if (drawColorBoxes) { + // Fill a white rect so that colours merge nicely if the opacity is < 1 + ctx.fillStyle = vm.legendColorBackground; + ctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Border + ctx.lineWidth = 1; + ctx.strokeStyle = labelColors[i].borderColor; + ctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Inner square + ctx.fillStyle = labelColors[i].backgroundColor; + ctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); + ctx.fillStyle = textColor; + } + + fillLineOfText(line); + }); + + helpers$1.each(bodyItem.after, fillLineOfText); + }); + + // Reset back to 0 for after body + xLinePadding = 0; + + // After body lines + helpers$1.each(vm.afterBody, fillLineOfText); + pt.y -= bodySpacing; // Remove last body spacing + }, + + drawFooter: function(pt, vm, ctx) { + var footer = vm.footer; + + if (footer.length) { + pt.x = getAlignedX(vm, vm._footerAlign); + pt.y += vm.footerMarginTop; + + ctx.textAlign = vm._footerAlign; + ctx.textBaseline = 'top'; + + ctx.fillStyle = vm.footerFontColor; + ctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); + + helpers$1.each(footer, function(line) { + ctx.fillText(line, pt.x, pt.y); + pt.y += vm.footerFontSize + vm.footerSpacing; + }); + } + }, + + drawBackground: function(pt, vm, ctx, tooltipSize) { + ctx.fillStyle = vm.backgroundColor; + ctx.strokeStyle = vm.borderColor; + ctx.lineWidth = vm.borderWidth; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var x = pt.x; + var y = pt.y; + var width = tooltipSize.width; + var height = tooltipSize.height; + var radius = vm.cornerRadius; + + ctx.beginPath(); + ctx.moveTo(x + radius, y); + if (yAlign === 'top') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + if (yAlign === 'center' && xAlign === 'right') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + if (yAlign === 'bottom') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + if (yAlign === 'center' && xAlign === 'left') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + + ctx.fill(); + + if (vm.borderWidth > 0) { + ctx.stroke(); + } + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + + if (vm.opacity === 0) { + return; + } + + var tooltipSize = { + width: vm.width, + height: vm.height + }; + var pt = { + x: vm.x, + y: vm.y + }; + + // IE11/Edge does not like very small opacities, so snap to 0 + var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; + + // Truthy/falsey value for empty tooltip + var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; + + if (this._options.enabled && hasTooltipContent) { + ctx.save(); + ctx.globalAlpha = opacity; + + // Draw Background + this.drawBackground(pt, vm, ctx, tooltipSize); + + // Draw Title, Body, and Footer + pt.y += vm.yPadding; + + // Titles + this.drawTitle(pt, vm, ctx); + + // Body + this.drawBody(pt, vm, ctx); + + // Footer + this.drawFooter(pt, vm, ctx); + + ctx.restore(); + } + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + * @returns {boolean} true if the tooltip changed + */ + handleEvent: function(e) { + var me = this; + var options = me._options; + var changed = false; + + me._lastActive = me._lastActive || []; + + // Find Active Elements for tooltips + if (e.type === 'mouseout') { + me._active = []; + } else { + me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); + } + + // Remember Last Actives + changed = !helpers$1.arrayEquals(me._active, me._lastActive); + + // Only handle target event on tooltip change + if (changed) { + me._lastActive = me._active; + + if (options.enabled || options.custom) { + me._eventPosition = { + x: e.x, + y: e.y + }; + + me.update(true); + me.pivot(); + } + } + + return changed; + } +}); + +/** + * @namespace Chart.Tooltip.positioners + */ +var positioners_1 = positioners; + +var core_tooltip = exports$3; +core_tooltip.positioners = positioners_1; + +var valueOrDefault$8 = helpers$1.valueOrDefault; + +core_defaults._set('global', { + elements: {}, + events: [ + 'mousemove', + 'mouseout', + 'click', + 'touchstart', + 'touchmove' + ], + hover: { + onHover: null, + mode: 'nearest', + intersect: true, + animationDuration: 400 + }, + onClick: null, + maintainAspectRatio: true, + responsive: true, + responsiveAnimationDuration: 0 +}); + +/** + * Recursively merge the given config objects representing the `scales` option + * by incorporating scale defaults in `xAxes` and `yAxes` array items, then + * returns a deep copy of the result, thus doesn't alter inputs. + */ +function mergeScaleConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function(key, target, source, options) { + if (key === 'xAxes' || key === 'yAxes') { + var slen = source[key].length; + var i, type, scale; + + if (!target[key]) { + target[key] = []; + } + + for (i = 0; i < slen; ++i) { + scale = source[key][i]; + type = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear'); + + if (i >= target[key].length) { + target[key].push({}); + } + + if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { + // new/untyped scale or type changed: let's apply the new defaults + // then merge source scale to correctly overwrite the defaults. + helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]); + } else { + // scales type are the same + helpers$1.merge(target[key][i], scale); + } + } + } else { + helpers$1._merger(key, target, source, options); + } + } + }); +} + +/** + * Recursively merge the given config objects as the root options by handling + * default scale options for the `scales` and `scale` properties, then returns + * a deep copy of the result, thus doesn't alter inputs. + */ +function mergeConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function(key, target, source, options) { + var tval = target[key] || {}; + var sval = source[key]; + + if (key === 'scales') { + // scale config merging is complex. Add our own function here for that + target[key] = mergeScaleConfig(tval, sval); + } else if (key === 'scale') { + // used in polar area & radar charts since there is only one scale + target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]); + } else { + helpers$1._merger(key, target, source, options); + } + } + }); +} + +function initConfig(config) { + config = config || {}; + + // Do NOT use mergeConfig for the data object because this method merges arrays + // and so would change references to labels and datasets, preventing data updates. + var data = config.data = config.data || {}; + data.datasets = data.datasets || []; + data.labels = data.labels || []; + + config.options = mergeConfig( + core_defaults.global, + core_defaults[config.type], + config.options || {}); + + return config; +} + +function updateConfig(chart) { + var newOptions = chart.options; + + helpers$1.each(chart.scales, function(scale) { + core_layouts.removeBox(chart, scale); + }); + + newOptions = mergeConfig( + core_defaults.global, + core_defaults[chart.config.type], + newOptions); + + chart.options = chart.config.options = newOptions; + chart.ensureScalesHaveIDs(); + chart.buildOrUpdateScales(); + + // Tooltip + chart.tooltip._options = newOptions.tooltips; + chart.tooltip.initialize(); +} + +function positionIsHorizontal(position) { + return position === 'top' || position === 'bottom'; +} + +var Chart = function(item, config) { + this.construct(item, config); + return this; +}; + +helpers$1.extend(Chart.prototype, /** @lends Chart */ { + /** + * @private + */ + construct: function(item, config) { + var me = this; + + config = initConfig(config); + + var context = platform.acquireContext(item, config); + var canvas = context && context.canvas; + var height = canvas && canvas.height; + var width = canvas && canvas.width; + + me.id = helpers$1.uid(); + me.ctx = context; + me.canvas = canvas; + me.config = config; + me.width = width; + me.height = height; + me.aspectRatio = height ? width / height : null; + me.options = config.options; + me._bufferedRender = false; + + /** + * Provided for backward compatibility, Chart and Chart.Controller have been merged, + * the "instance" still need to be defined since it might be called from plugins. + * @prop Chart#chart + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ + me.chart = me; + me.controller = me; // chart.chart.controller #inception + + // Add the chart instance to the global namespace + Chart.instances[me.id] = me; + + // Define alias to the config data: `chart.data === chart.config.data` + Object.defineProperty(me, 'data', { + get: function() { + return me.config.data; + }, + set: function(value) { + me.config.data = value; + } + }); + + if (!context || !canvas) { + // The given item is not a compatible context2d element, let's return before finalizing + // the chart initialization but after setting basic chart / controller properties that + // can help to figure out that the chart is not valid (e.g chart.canvas !== null); + // https://github.com/chartjs/Chart.js/issues/2807 + console.error("Failed to create chart: can't acquire context from the given item"); + return; + } + + me.initialize(); + me.update(); + }, + + /** + * @private + */ + initialize: function() { + var me = this; + + // Before init plugin notification + core_plugins.notify(me, 'beforeInit'); + + helpers$1.retinaScale(me, me.options.devicePixelRatio); + + me.bindEvents(); + + if (me.options.responsive) { + // Initial resize before chart draws (must be silent to preserve initial animations). + me.resize(true); + } + + // Make sure scales have IDs and are built before we build any controllers. + me.ensureScalesHaveIDs(); + me.buildOrUpdateScales(); + me.initToolTip(); + + // After init plugin notification + core_plugins.notify(me, 'afterInit'); + + return me; + }, + + clear: function() { + helpers$1.canvas.clear(this); + return this; + }, + + stop: function() { + // Stops any current animation loop occurring + core_animations.cancelAnimation(this); + return this; + }, + + resize: function(silent) { + var me = this; + var options = me.options; + var canvas = me.canvas; + var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; + + // the canvas render width and height will be casted to integers so make sure that + // the canvas display style uses the same integer values to avoid blurring effect. + + // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed + var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas))); + var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas))); + + if (me.width === newWidth && me.height === newHeight) { + return; + } + + canvas.width = me.width = newWidth; + canvas.height = me.height = newHeight; + canvas.style.width = newWidth + 'px'; + canvas.style.height = newHeight + 'px'; + + helpers$1.retinaScale(me, options.devicePixelRatio); + + if (!silent) { + // Notify any plugins about the resize + var newSize = {width: newWidth, height: newHeight}; + core_plugins.notify(me, 'resize', [newSize]); + + // Notify of resize + if (options.onResize) { + options.onResize(me, newSize); + } + + me.stop(); + me.update({ + duration: options.responsiveAnimationDuration + }); + } + }, + + ensureScalesHaveIDs: function() { + var options = this.options; + var scalesOptions = options.scales || {}; + var scaleOptions = options.scale; + + helpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) { + xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); + }); + + helpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) { + yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); + }); + + if (scaleOptions) { + scaleOptions.id = scaleOptions.id || 'scale'; + } + }, + + /** + * Builds a map of scale ID to scale object for future lookup. + */ + buildOrUpdateScales: function() { + var me = this; + var options = me.options; + var scales = me.scales || {}; + var items = []; + var updated = Object.keys(scales).reduce(function(obj, id) { + obj[id] = false; + return obj; + }, {}); + + if (options.scales) { + items = items.concat( + (options.scales.xAxes || []).map(function(xAxisOptions) { + return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; + }), + (options.scales.yAxes || []).map(function(yAxisOptions) { + return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; + }) + ); + } + + if (options.scale) { + items.push({ + options: options.scale, + dtype: 'radialLinear', + isDefault: true, + dposition: 'chartArea' + }); + } + + helpers$1.each(items, function(item) { + var scaleOptions = item.options; + var id = scaleOptions.id; + var scaleType = valueOrDefault$8(scaleOptions.type, item.dtype); + + if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { + scaleOptions.position = item.dposition; + } + + updated[id] = true; + var scale = null; + if (id in scales && scales[id].type === scaleType) { + scale = scales[id]; + scale.options = scaleOptions; + scale.ctx = me.ctx; + scale.chart = me; + } else { + var scaleClass = core_scaleService.getScaleConstructor(scaleType); + if (!scaleClass) { + return; + } + scale = new scaleClass({ + id: id, + type: scaleType, + options: scaleOptions, + ctx: me.ctx, + chart: me + }); + scales[scale.id] = scale; + } + + scale.mergeTicksOptions(); + + // TODO(SB): I think we should be able to remove this custom case (options.scale) + // and consider it as a regular scale part of the "scales"" map only! This would + // make the logic easier and remove some useless? custom code. + if (item.isDefault) { + me.scale = scale; + } + }); + // clear up discarded scales + helpers$1.each(updated, function(hasUpdated, id) { + if (!hasUpdated) { + delete scales[id]; + } + }); + + me.scales = scales; + + core_scaleService.addScalesToLayout(this); + }, + + buildOrUpdateControllers: function() { + var me = this; + var newControllers = []; + + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + var meta = me.getDatasetMeta(datasetIndex); + var type = dataset.type || me.config.type; + + if (meta.type && meta.type !== type) { + me.destroyDatasetMeta(datasetIndex); + meta = me.getDatasetMeta(datasetIndex); + } + meta.type = type; + + if (meta.controller) { + meta.controller.updateIndex(datasetIndex); + meta.controller.linkScales(); + } else { + var ControllerClass = controllers[meta.type]; + if (ControllerClass === undefined) { + throw new Error('"' + meta.type + '" is not a chart type.'); + } + + meta.controller = new ControllerClass(me, datasetIndex); + newControllers.push(meta.controller); + } + }, me); + + return newControllers; + }, + + /** + * Reset the elements of all datasets + * @private + */ + resetElements: function() { + var me = this; + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.reset(); + }, me); + }, + + /** + * Resets the chart back to it's state before the initial animation + */ + reset: function() { + this.resetElements(); + this.tooltip.initialize(); + }, + + update: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + updateConfig(me); + + // plugins options references might have change, let's invalidate the cache + // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + core_plugins._invalidate(me); + + if (core_plugins.notify(me, 'beforeUpdate') === false) { + return; + } + + // In case the entire data object changed + me.tooltip._data = me.data; + + // Make sure dataset controllers are updated and new controllers are reset + var newControllers = me.buildOrUpdateControllers(); + + // Make sure all dataset controllers have correct meta data counts + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); + }, me); + + me.updateLayout(); + + // Can only reset the new controllers after the scales have been updated + if (me.options.animation && me.options.animation.duration) { + helpers$1.each(newControllers, function(controller) { + controller.reset(); + }); + } + + me.updateDatasets(); + + // Need to reset tooltip in case it is displayed with elements that are removed + // after update. + me.tooltip.initialize(); + + // Last active contains items that were previously in the tooltip. + // When we reset the tooltip, we need to clear it + me.lastActive = []; + + // Do this before render so that any plugins that need final scale updates can use it + core_plugins.notify(me, 'afterUpdate'); + + if (me._bufferedRender) { + me._bufferedRequest = { + duration: config.duration, + easing: config.easing, + lazy: config.lazy + }; + } else { + me.render(config); + } + }, + + /** + * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` + * hook, in which case, plugins will not be called on `afterLayout`. + * @private + */ + updateLayout: function() { + var me = this; + + if (core_plugins.notify(me, 'beforeLayout') === false) { + return; + } + + core_layouts.update(this, this.width, this.height); + + /** + * Provided for backward compatibility, use `afterLayout` instead. + * @method IPlugin#afterScaleUpdate + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ + core_plugins.notify(me, 'afterScaleUpdate'); + core_plugins.notify(me, 'afterLayout'); + }, + + /** + * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` + * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. + * @private + */ + updateDatasets: function() { + var me = this; + + if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) { + return; + } + + for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.updateDataset(i); + } + + core_plugins.notify(me, 'afterDatasetsUpdate'); + }, + + /** + * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` + * hook, in which case, plugins will not be called on `afterDatasetUpdate`. + * @private + */ + updateDataset: function(index) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index + }; + + if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { + return; + } + + meta.controller.update(); + + core_plugins.notify(me, 'afterDatasetUpdate', [args]); + }, + + render: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + var animationOptions = me.options.animation; + var duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration); + var lazy = config.lazy; + + if (core_plugins.notify(me, 'beforeRender') === false) { + return; + } + + var onComplete = function(animation) { + core_plugins.notify(me, 'afterRender'); + helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me); + }; + + if (animationOptions && duration) { + var animation = new core_animation({ + numSteps: duration / 16.66, // 60 fps + easing: config.easing || animationOptions.easing, + + render: function(chart, animationObject) { + var easingFunction = helpers$1.easing.effects[animationObject.easing]; + var currentStep = animationObject.currentStep; + var stepDecimal = currentStep / animationObject.numSteps; + + chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); + }, + + onAnimationProgress: animationOptions.onProgress, + onAnimationComplete: onComplete + }); + + core_animations.addAnimation(me, animation, duration, lazy); + } else { + me.draw(); + + // See https://github.com/chartjs/Chart.js/issues/3781 + onComplete(new core_animation({numSteps: 0, chart: me})); + } + + return me; + }, + + draw: function(easingValue) { + var me = this; + + me.clear(); + + if (helpers$1.isNullOrUndef(easingValue)) { + easingValue = 1; + } + + me.transition(easingValue); + + if (me.width <= 0 || me.height <= 0) { + return; + } + + if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) { + return; + } + + // Draw all the scales + helpers$1.each(me.boxes, function(box) { + box.draw(me.chartArea); + }, me); + + me.drawDatasets(easingValue); + me._drawTooltip(easingValue); + + core_plugins.notify(me, 'afterDraw', [easingValue]); + }, + + /** + * @private + */ + transition: function(easingValue) { + var me = this; + + for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { + if (me.isDatasetVisible(i)) { + me.getDatasetMeta(i).controller.transition(easingValue); + } + } + + me.tooltip.transition(easingValue); + }, + + /** + * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` + * hook, in which case, plugins will not be called on `afterDatasetsDraw`. + * @private + */ + drawDatasets: function(easingValue) { + var me = this; + + if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { + return; + } + + // Draw datasets reversed to support proper line stacking + for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { + if (me.isDatasetVisible(i)) { + me.drawDataset(i, easingValue); + } + } + + core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]); + }, + + /** + * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` + * hook, in which case, plugins will not be called on `afterDatasetDraw`. + * @private + */ + drawDataset: function(index, easingValue) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index, + easingValue: easingValue + }; + + if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { + return; + } + + meta.controller.draw(easingValue); + + core_plugins.notify(me, 'afterDatasetDraw', [args]); + }, + + /** + * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` + * hook, in which case, plugins will not be called on `afterTooltipDraw`. + * @private + */ + _drawTooltip: function(easingValue) { + var me = this; + var tooltip = me.tooltip; + var args = { + tooltip: tooltip, + easingValue: easingValue + }; + + if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { + return; + } + + tooltip.draw(); + + core_plugins.notify(me, 'afterTooltipDraw', [args]); + }, + + /** + * Get the single element that was clicked on + * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw + */ + getElementAtEvent: function(e) { + return core_interaction.modes.single(this, e); + }, + + getElementsAtEvent: function(e) { + return core_interaction.modes.label(this, e, {intersect: true}); + }, + + getElementsAtXAxis: function(e) { + return core_interaction.modes['x-axis'](this, e, {intersect: true}); + }, + + getElementsAtEventForMode: function(e, mode, options) { + var method = core_interaction.modes[mode]; + if (typeof method === 'function') { + return method(this, e, options); + } + + return []; + }, + + getDatasetAtEvent: function(e) { + return core_interaction.modes.dataset(this, e, {intersect: true}); + }, + + getDatasetMeta: function(datasetIndex) { + var me = this; + var dataset = me.data.datasets[datasetIndex]; + if (!dataset._meta) { + dataset._meta = {}; + } + + var meta = dataset._meta[me.id]; + if (!meta) { + meta = dataset._meta[me.id] = { + type: null, + data: [], + dataset: null, + controller: null, + hidden: null, // See isDatasetVisible() comment + xAxisID: null, + yAxisID: null + }; + } + + return meta; + }, + + getVisibleDatasetCount: function() { + var count = 0; + for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + if (this.isDatasetVisible(i)) { + count++; + } + } + return count; + }, + + isDatasetVisible: function(datasetIndex) { + var meta = this.getDatasetMeta(datasetIndex); + + // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, + // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. + return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; + }, + + generateLegend: function() { + return this.options.legendCallback(this); + }, + + /** + * @private + */ + destroyDatasetMeta: function(datasetIndex) { + var id = this.id; + var dataset = this.data.datasets[datasetIndex]; + var meta = dataset._meta && dataset._meta[id]; + + if (meta) { + meta.controller.destroy(); + delete dataset._meta[id]; + } + }, + + destroy: function() { + var me = this; + var canvas = me.canvas; + var i, ilen; + + me.stop(); + + // dataset controllers need to cleanup associated data + for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.destroyDatasetMeta(i); + } + + if (canvas) { + me.unbindEvents(); + helpers$1.canvas.clear(me); + platform.releaseContext(me.ctx); + me.canvas = null; + me.ctx = null; + } + + core_plugins.notify(me, 'destroy'); + + delete Chart.instances[me.id]; + }, + + toBase64Image: function() { + return this.canvas.toDataURL.apply(this.canvas, arguments); + }, + + initToolTip: function() { + var me = this; + me.tooltip = new core_tooltip({ + _chart: me, + _chartInstance: me, // deprecated, backward compatibility + _data: me.data, + _options: me.options.tooltips + }, me); + }, + + /** + * @private + */ + bindEvents: function() { + var me = this; + var listeners = me._listeners = {}; + var listener = function() { + me.eventHandler.apply(me, arguments); + }; + + helpers$1.each(me.options.events, function(type) { + platform.addEventListener(me, type, listener); + listeners[type] = listener; + }); + + // Elements used to detect size change should not be injected for non responsive charts. + // See https://github.com/chartjs/Chart.js/issues/2210 + if (me.options.responsive) { + listener = function() { + me.resize(); + }; + + platform.addEventListener(me, 'resize', listener); + listeners.resize = listener; + } + }, + + /** + * @private + */ + unbindEvents: function() { + var me = this; + var listeners = me._listeners; + if (!listeners) { + return; + } + + delete me._listeners; + helpers$1.each(listeners, function(listener, type) { + platform.removeEventListener(me, type, listener); + }); + }, + + updateHoverStyle: function(elements, mode, enabled) { + var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; + var element, i, ilen; + + for (i = 0, ilen = elements.length; i < ilen; ++i) { + element = elements[i]; + if (element) { + this.getDatasetMeta(element._datasetIndex).controller[method](element); + } + } + }, + + /** + * @private + */ + eventHandler: function(e) { + var me = this; + var tooltip = me.tooltip; + + if (core_plugins.notify(me, 'beforeEvent', [e]) === false) { + return; + } + + // Buffer any update calls so that renders do not occur + me._bufferedRender = true; + me._bufferedRequest = null; + + var changed = me.handleEvent(e); + // for smooth tooltip animations issue #4989 + // the tooltip should be the source of change + // Animation check workaround: + // tooltip._start will be null when tooltip isn't animating + if (tooltip) { + changed = tooltip._start + ? tooltip.handleEvent(e) + : changed | tooltip.handleEvent(e); + } + + core_plugins.notify(me, 'afterEvent', [e]); + + var bufferedRequest = me._bufferedRequest; + if (bufferedRequest) { + // If we have an update that was triggered, we need to do a normal render + me.render(bufferedRequest); + } else if (changed && !me.animating) { + // If entering, leaving, or changing elements, animate the change via pivot + me.stop(); + + // We only need to render at this point. Updating will cause scales to be + // recomputed generating flicker & using more memory than necessary. + me.render({ + duration: me.options.hover.animationDuration, + lazy: true + }); + } + + me._bufferedRender = false; + me._bufferedRequest = null; + + return me; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event the event to handle + * @return {boolean} true if the chart needs to re-render + */ + handleEvent: function(e) { + var me = this; + var options = me.options || {}; + var hoverOptions = options.hover; + var changed = false; + + me.lastActive = me.lastActive || []; + + // Find Active Elements for hover and tooltips + if (e.type === 'mouseout') { + me.active = []; + } else { + me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); + } + + // Invoke onHover hook + // Need to call with native event here to not break backwards compatibility + helpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); + + if (e.type === 'mouseup' || e.type === 'click') { + if (options.onClick) { + // Use e.native here for backwards compatibility + options.onClick.call(me, e.native, me.active); + } + } + + // Remove styling for last active (even if it may still be active) + if (me.lastActive.length) { + me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); + } + + // Built in hover styling + if (me.active.length && hoverOptions.mode) { + me.updateHoverStyle(me.active, hoverOptions.mode, true); + } + + changed = !helpers$1.arrayEquals(me.active, me.lastActive); + + // Remember Last Actives + me.lastActive = me.active; + + return changed; + } +}); + +/** + * NOTE(SB) We actually don't use this container anymore but we need to keep it + * for backward compatibility. Though, it can still be useful for plugins that + * would need to work on multiple charts?! + */ +Chart.instances = {}; + +var core_controller = Chart; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart instead. + * @class Chart.Controller + * @deprecated since version 2.6 + * @todo remove at version 3 + * @private + */ +Chart.Controller = Chart; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ +Chart.types = {}; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.configMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +helpers$1.configMerge = mergeConfig; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.scaleMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +helpers$1.scaleMerge = mergeScaleConfig; + +var core_helpers = function() { + + // -- Basic js utility methods + + helpers$1.where = function(collection, filterCallback) { + if (helpers$1.isArray(collection) && Array.prototype.filter) { + return collection.filter(filterCallback); + } + var filtered = []; + + helpers$1.each(collection, function(item) { + if (filterCallback(item)) { + filtered.push(item); + } + }); + + return filtered; + }; + helpers$1.findIndex = Array.prototype.findIndex ? + function(array, callback, scope) { + return array.findIndex(callback, scope); + } : + function(array, callback, scope) { + scope = scope === undefined ? array : scope; + for (var i = 0, ilen = array.length; i < ilen; ++i) { + if (callback.call(scope, array[i], i, array)) { + return i; + } + } + return -1; + }; + helpers$1.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to start of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = -1; + } + for (var i = startIndex + 1; i < arrayToSearch.length; i++) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + helpers$1.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to end of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = arrayToSearch.length; + } + for (var i = startIndex - 1; i >= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + + // -- Math methods + helpers$1.isNumber = function(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }; + helpers$1.almostEquals = function(x, y, epsilon) { + return Math.abs(x - y) < epsilon; + }; + helpers$1.almostWhole = function(x, epsilon) { + var rounded = Math.round(x); + return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); + }; + helpers$1.max = function(array) { + return array.reduce(function(max, value) { + if (!isNaN(value)) { + return Math.max(max, value); + } + return max; + }, Number.NEGATIVE_INFINITY); + }; + helpers$1.min = function(array) { + return array.reduce(function(min, value) { + if (!isNaN(value)) { + return Math.min(min, value); + } + return min; + }, Number.POSITIVE_INFINITY); + }; + helpers$1.sign = Math.sign ? + function(x) { + return Math.sign(x); + } : + function(x) { + x = +x; // convert to a number + if (x === 0 || isNaN(x)) { + return x; + } + return x > 0 ? 1 : -1; + }; + helpers$1.log10 = Math.log10 ? + function(x) { + return Math.log10(x); + } : + function(x) { + var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. + // Check for whole powers of 10, + // which due to floating point rounding error should be corrected. + var powerOf10 = Math.round(exponent); + var isPowerOf10 = x === Math.pow(10, powerOf10); + + return isPowerOf10 ? powerOf10 : exponent; + }; + helpers$1.toRadians = function(degrees) { + return degrees * (Math.PI / 180); + }; + helpers$1.toDegrees = function(radians) { + return radians * (180 / Math.PI); + }; + + /** + * Returns the number of decimal places + * i.e. the number of digits after the decimal point, of the value of this Number. + * @param {number} x - A number. + * @returns {number} The number of decimal places. + * @private + */ + helpers$1._decimalPlaces = function(x) { + if (!helpers$1.isFinite(x)) { + return; + } + var e = 1; + var p = 0; + while (Math.round(x * e) / e !== x) { + e *= 10; + p++; + } + return p; + }; + + // Gets the angle from vertical upright to the point about a centre. + helpers$1.getAngleFromPoint = function(centrePoint, anglePoint) { + var distanceFromXCenter = anglePoint.x - centrePoint.x; + var distanceFromYCenter = anglePoint.y - centrePoint.y; + var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + + var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); + + if (angle < (-0.5 * Math.PI)) { + angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }; + helpers$1.distanceBetweenPoints = function(pt1, pt2) { + return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); + }; + + /** + * Provided for backward compatibility, not available anymore + * @function Chart.helpers.aliasPixel + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ + helpers$1.aliasPixel = function(pixelWidth) { + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }; + + /** + * Returns the aligned pixel value to avoid anti-aliasing blur + * @param {Chart} chart - The chart instance. + * @param {number} pixel - A pixel value. + * @param {number} width - The width of the element. + * @returns {number} The aligned pixel value. + * @private + */ + helpers$1._alignPixel = function(chart, pixel, width) { + var devicePixelRatio = chart.currentDevicePixelRatio; + var halfWidth = width / 2; + return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; + }; + + helpers$1.splineCurve = function(firstPoint, middlePoint, afterPoint, t) { + // Props to Rob Spencer at scaled innovation for his post on splining between points + // http://scaledinnovation.com/analytics/splines/aboutSplines.html + + // This function must also respect "skipped" points + + var previous = firstPoint.skip ? middlePoint : firstPoint; + var current = middlePoint; + var next = afterPoint.skip ? middlePoint : afterPoint; + + var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); + var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); + + var s01 = d01 / (d01 + d12); + var s12 = d12 / (d01 + d12); + + // If all points are the same, s01 & s02 will be inf + s01 = isNaN(s01) ? 0 : s01; + s12 = isNaN(s12) ? 0 : s12; + + var fa = t * s01; // scaling factor for triangle Ta + var fb = t * s12; + + return { + previous: { + x: current.x - fa * (next.x - previous.x), + y: current.y - fa * (next.y - previous.y) + }, + next: { + x: current.x + fb * (next.x - previous.x), + y: current.y + fb * (next.y - previous.y) + } + }; + }; + helpers$1.EPSILON = Number.EPSILON || 1e-14; + helpers$1.splineCurveMonotone = function(points) { + // This function calculates Bézier control points in a similar way than |splineCurve|, + // but preserves monotonicity of the provided data and ensures no local extremums are added + // between the dataset discrete points due to the interpolation. + // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation + + var pointsWithTangents = (points || []).map(function(point) { + return { + model: point._model, + deltaK: 0, + mK: 0 + }; + }); + + // Calculate slopes (deltaK) and initialize tangents (mK) + var pointsLen = pointsWithTangents.length; + var i, pointBefore, pointCurrent, pointAfter; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointAfter && !pointAfter.model.skip) { + var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); + + // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 + pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; + } + + if (!pointBefore || pointBefore.model.skip) { + pointCurrent.mK = pointCurrent.deltaK; + } else if (!pointAfter || pointAfter.model.skip) { + pointCurrent.mK = pointBefore.deltaK; + } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { + pointCurrent.mK = 0; + } else { + pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; + } + } + + // Adjust tangents to ensure monotonic properties + var alphaK, betaK, tauK, squaredMagnitude; + for (i = 0; i < pointsLen - 1; ++i) { + pointCurrent = pointsWithTangents[i]; + pointAfter = pointsWithTangents[i + 1]; + if (pointCurrent.model.skip || pointAfter.model.skip) { + continue; + } + + if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { + pointCurrent.mK = pointAfter.mK = 0; + continue; + } + + alphaK = pointCurrent.mK / pointCurrent.deltaK; + betaK = pointAfter.mK / pointCurrent.deltaK; + squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); + if (squaredMagnitude <= 9) { + continue; + } + + tauK = 3 / Math.sqrt(squaredMagnitude); + pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; + pointAfter.mK = betaK * tauK * pointCurrent.deltaK; + } + + // Compute control points + var deltaX; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointBefore && !pointBefore.model.skip) { + deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; + pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; + pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; + } + if (pointAfter && !pointAfter.model.skip) { + deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; + pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; + pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; + } + } + }; + helpers$1.nextItem = function(collection, index, loop) { + if (loop) { + return index >= collection.length - 1 ? collection[0] : collection[index + 1]; + } + return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; + }; + helpers$1.previousItem = function(collection, index, loop) { + if (loop) { + return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; + } + return index <= 0 ? collection[0] : collection[index - 1]; + }; + // Implementation of the nice number algorithm used in determining where axis labels will go + helpers$1.niceNum = function(range, round) { + var exponent = Math.floor(helpers$1.log10(range)); + var fraction = range / Math.pow(10, exponent); + var niceFraction; + + if (round) { + if (fraction < 1.5) { + niceFraction = 1; + } else if (fraction < 3) { + niceFraction = 2; + } else if (fraction < 7) { + niceFraction = 5; + } else { + niceFraction = 10; + } + } else if (fraction <= 1.0) { + niceFraction = 1; + } else if (fraction <= 2) { + niceFraction = 2; + } else if (fraction <= 5) { + niceFraction = 5; + } else { + niceFraction = 10; + } + + return niceFraction * Math.pow(10, exponent); + }; + // Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + helpers$1.requestAnimFrame = (function() { + if (typeof window === 'undefined') { + return function(callback) { + callback(); + }; + } + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + }()); + // -- DOM methods + helpers$1.getRelativePosition = function(evt, chart) { + var mouseX, mouseY; + var e = evt.originalEvent || evt; + var canvas = evt.target || evt.srcElement; + var boundingRect = canvas.getBoundingClientRect(); + + var touches = e.touches; + if (touches && touches.length > 0) { + mouseX = touches[0].clientX; + mouseY = touches[0].clientY; + + } else { + mouseX = e.clientX; + mouseY = e.clientY; + } + + // Scale mouse coordinates into canvas coordinates + // by following the pattern laid out by 'jerryj' in the comments of + // https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ + var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left')); + var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top')); + var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right')); + var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom')); + var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; + var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; + + // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However + // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here + mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); + mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); + + return { + x: mouseX, + y: mouseY + }; + + }; + + // Private helper function to convert max-width/max-height values that may be percentages into a number + function parseMaxStyle(styleValue, node, parentProperty) { + var valueInPixels; + if (typeof styleValue === 'string') { + valueInPixels = parseInt(styleValue, 10); + + if (styleValue.indexOf('%') !== -1) { + // percentage * size in dimension + valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; + } + } else { + valueInPixels = styleValue; + } + + return valueInPixels; + } + + /** + * Returns if the given value contains an effective constraint. + * @private + */ + function isConstrainedValue(value) { + return value !== undefined && value !== null && value !== 'none'; + } + + /** + * Returns the max width or height of the given DOM node in a cross-browser compatible fashion + * @param {HTMLElement} domNode - the node to check the constraint on + * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height') + * @param {string} percentageProperty - property of parent to use when calculating width as a percentage + * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser} + */ + function getConstraintDimension(domNode, maxStyle, percentageProperty) { + var view = document.defaultView; + var parentNode = helpers$1._getParentNode(domNode); + var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; + var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; + var hasCNode = isConstrainedValue(constrainedNode); + var hasCContainer = isConstrainedValue(constrainedContainer); + var infinity = Number.POSITIVE_INFINITY; + + if (hasCNode || hasCContainer) { + return Math.min( + hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, + hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); + } + + return 'none'; + } + // returns Number or undefined if no constraint + helpers$1.getConstraintWidth = function(domNode) { + return getConstraintDimension(domNode, 'max-width', 'clientWidth'); + }; + // returns Number or undefined if no constraint + helpers$1.getConstraintHeight = function(domNode) { + return getConstraintDimension(domNode, 'max-height', 'clientHeight'); + }; + /** + * @private + */ + helpers$1._calculatePadding = function(container, padding, parentDimension) { + padding = helpers$1.getStyle(container, padding); + + return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10); + }; + /** + * @private + */ + helpers$1._getParentNode = function(domNode) { + var parent = domNode.parentNode; + if (parent && parent.toString() === '[object ShadowRoot]') { + parent = parent.host; + } + return parent; + }; + helpers$1.getMaximumWidth = function(domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientWidth; + } + + var clientWidth = container.clientWidth; + var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth); + var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth); + + var w = clientWidth - paddingLeft - paddingRight; + var cw = helpers$1.getConstraintWidth(domNode); + return isNaN(cw) ? w : Math.min(w, cw); + }; + helpers$1.getMaximumHeight = function(domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientHeight; + } + + var clientHeight = container.clientHeight; + var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight); + var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight); + + var h = clientHeight - paddingTop - paddingBottom; + var ch = helpers$1.getConstraintHeight(domNode); + return isNaN(ch) ? h : Math.min(h, ch); + }; + helpers$1.getStyle = function(el, property) { + return el.currentStyle ? + el.currentStyle[property] : + document.defaultView.getComputedStyle(el, null).getPropertyValue(property); + }; + helpers$1.retinaScale = function(chart, forceRatio) { + var pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && window.devicePixelRatio) || 1; + if (pixelRatio === 1) { + return; + } + + var canvas = chart.canvas; + var height = chart.height; + var width = chart.width; + + canvas.height = height * pixelRatio; + canvas.width = width * pixelRatio; + chart.ctx.scale(pixelRatio, pixelRatio); + + // If no style has been set on the canvas, the render size is used as display size, + // making the chart visually bigger, so let's enforce it to the "correct" values. + // See https://github.com/chartjs/Chart.js/issues/3575 + if (!canvas.style.height && !canvas.style.width) { + canvas.style.height = height + 'px'; + canvas.style.width = width + 'px'; + } + }; + // -- Canvas methods + helpers$1.fontString = function(pixelSize, fontStyle, fontFamily) { + return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; + }; + helpers$1.longestText = function(ctx, font, arrayOfThings, cache) { + cache = cache || {}; + var data = cache.data = cache.data || {}; + var gc = cache.garbageCollect = cache.garbageCollect || []; + + if (cache.font !== font) { + data = cache.data = {}; + gc = cache.garbageCollect = []; + cache.font = font; + } + + ctx.font = font; + var longest = 0; + helpers$1.each(arrayOfThings, function(thing) { + // Undefined strings and arrays should not be measured + if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) { + longest = helpers$1.measureText(ctx, data, gc, longest, thing); + } else if (helpers$1.isArray(thing)) { + // if it is an array lets measure each element + // to do maybe simplify this function a bit so we can do this more recursively? + helpers$1.each(thing, function(nestedThing) { + // Undefined strings and arrays should not be measured + if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) { + longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing); + } + }); + } + }); + + var gcLen = gc.length / 2; + if (gcLen > arrayOfThings.length) { + for (var i = 0; i < gcLen; i++) { + delete data[gc[i]]; + } + gc.splice(0, gcLen); + } + return longest; + }; + helpers$1.measureText = function(ctx, data, gc, longest, string) { + var textWidth = data[string]; + if (!textWidth) { + textWidth = data[string] = ctx.measureText(string).width; + gc.push(string); + } + if (textWidth > longest) { + longest = textWidth; + } + return longest; + }; + helpers$1.numberOfLabelLines = function(arrayOfThings) { + var numberOfLines = 1; + helpers$1.each(arrayOfThings, function(thing) { + if (helpers$1.isArray(thing)) { + if (thing.length > numberOfLines) { + numberOfLines = thing.length; + } + } + }); + return numberOfLines; + }; + + helpers$1.color = !chartjsColor ? + function(value) { + console.error('Color.js not found!'); + return value; + } : + function(value) { + /* global CanvasGradient */ + if (value instanceof CanvasGradient) { + value = core_defaults.global.defaultColor; + } + + return chartjsColor(value); + }; + + helpers$1.getHoverColor = function(colorValue) { + /* global CanvasPattern */ + return (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ? + colorValue : + helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString(); + }; +}; + +function abstract() { + throw new Error( + 'This method is not implemented: either no adapter can ' + + 'be found or an incomplete integration was provided.' + ); +} + +/** + * Date adapter (current used by the time scale) + * @namespace Chart._adapters._date + * @memberof Chart._adapters + * @private + */ + +/** + * Currently supported unit string values. + * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')} + * @memberof Chart._adapters._date + * @name Unit + */ + +/** + * @class + */ +function DateAdapter(options) { + this.options = options || {}; +} + +helpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */ { + /** + * Returns a map of time formats for the supported formatting units defined + * in Unit as well as 'datetime' representing a detailed date/time string. + * @returns {{string: string}} + */ + formats: abstract, + + /** + * Parses the given `value` and return the associated timestamp. + * @param {any} value - the value to parse (usually comes from the data) + * @param {string} [format] - the expected data format + * @returns {(number|null)} + * @function + */ + parse: abstract, + + /** + * Returns the formatted date in the specified `format` for a given `timestamp`. + * @param {number} timestamp - the timestamp to format + * @param {string} format - the date/time token + * @return {string} + * @function + */ + format: abstract, + + /** + * Adds the specified `amount` of `unit` to the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {number} amount - the amount to add + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + add: abstract, + + /** + * Returns the number of `unit` between the given timestamps. + * @param {number} max - the input timestamp (reference) + * @param {number} min - the timestamp to substract + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + diff: abstract, + + /** + * Returns start of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @param {number} [weekday] - the ISO day of the week with 1 being Monday + * and 7 being Sunday (only needed if param *unit* is `isoWeek`). + * @function + */ + startOf: abstract, + + /** + * Returns end of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @function + */ + endOf: abstract, + + // DEPRECATIONS + + /** + * Provided for backward compatibility for scale.getValueForPixel(), + * this method should be overridden only by the moment adapter. + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function(value) { + return value; + } +}); + +DateAdapter.override = function(members) { + helpers$1.extend(DateAdapter.prototype, members); +}; + +var _date = DateAdapter; + +var core_adapters = { + _date: _date +}; + +/** + * Namespace to hold static tick generation functions + * @namespace Chart.Ticks + */ +var core_ticks = { + /** + * Namespace to hold formatters for different types of ticks + * @namespace Chart.Ticks.formatters + */ + formatters: { + /** + * Formatter for value labels + * @method Chart.Ticks.formatters.values + * @param value the value to display + * @return {string|string[]} the label to display + */ + values: function(value) { + return helpers$1.isArray(value) ? value : '' + value; + }, + + /** + * Formatter for linear numeric ticks + * @method Chart.Ticks.formatters.linear + * @param tickValue {number} the value to be formatted + * @param index {number} the position of the tickValue parameter in the ticks array + * @param ticks {number[]} the list of ticks being converted + * @return {string} string representation of the tickValue parameter + */ + linear: function(tickValue, index, ticks) { + // If we have lots of ticks, don't use the ones + var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; + + // If we have a number like 2.5 as the delta, figure out how many decimal places we need + if (Math.abs(delta) > 1) { + if (tickValue !== Math.floor(tickValue)) { + // not an integer + delta = tickValue - Math.floor(tickValue); + } + } + + var logDelta = helpers$1.log10(Math.abs(delta)); + var tickString = ''; + + if (tickValue !== 0) { + var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1])); + if (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation + var logTick = helpers$1.log10(Math.abs(tickValue)); + tickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta)); + } else { + var numDecimal = -1 * Math.floor(logDelta); + numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places + tickString = tickValue.toFixed(numDecimal); + } + } else { + tickString = '0'; // never show decimal places for 0 + } + + return tickString; + }, + + logarithmic: function(tickValue, index, ticks) { + var remain = tickValue / (Math.pow(10, Math.floor(helpers$1.log10(tickValue)))); + + if (tickValue === 0) { + return '0'; + } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { + return tickValue.toExponential(); + } + return ''; + } + } +}; + +var valueOrDefault$9 = helpers$1.valueOrDefault; +var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault; + +core_defaults._set('scale', { + display: true, + position: 'left', + offset: false, + + // grid line settings + gridLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + drawBorder: true, + drawOnChartArea: true, + drawTicks: true, + tickMarkLength: 10, + zeroLineWidth: 1, + zeroLineColor: 'rgba(0,0,0,0.25)', + zeroLineBorderDash: [], + zeroLineBorderDashOffset: 0.0, + offsetGridLines: false, + borderDash: [], + borderDashOffset: 0.0 + }, + + // scale label + scaleLabel: { + // display property + display: false, + + // actual label + labelString: '', + + // top/bottom padding + padding: { + top: 4, + bottom: 4 + } + }, + + // label settings + ticks: { + beginAtZero: false, + minRotation: 0, + maxRotation: 50, + mirror: false, + padding: 0, + reverse: false, + display: true, + autoSkip: true, + autoSkipPadding: 0, + labelOffset: 0, + // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. + callback: core_ticks.formatters.values, + minor: {}, + major: {} + } +}); + +function labelsFromTicks(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(ticks[i].label); + } + + return labels; +} + +function getPixelForGridLine(scale, index, offsetGridLines) { + var lineValue = scale.getPixelForTick(index); + + if (offsetGridLines) { + if (scale.getTicks().length === 1) { + lineValue -= scale.isHorizontal() ? + Math.max(lineValue - scale.left, scale.right - lineValue) : + Math.max(lineValue - scale.top, scale.bottom - lineValue); + } else if (index === 0) { + lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; + } else { + lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; + } + } + return lineValue; +} + +function computeTextSize(context, tick, font) { + return helpers$1.isArray(tick) ? + helpers$1.longestText(context, font, tick) : + context.measureText(tick).width; +} + +var core_scale = core_element.extend({ + /** + * Get the padding needed for the scale + * @method getPadding + * @private + * @returns {Padding} the necessary padding + */ + getPadding: function() { + var me = this; + return { + left: me.paddingLeft || 0, + top: me.paddingTop || 0, + right: me.paddingRight || 0, + bottom: me.paddingBottom || 0 + }; + }, + + /** + * Returns the scale tick objects ({label, major}) + * @since 2.7 + */ + getTicks: function() { + return this._ticks; + }, + + // These methods are ordered by lifecyle. Utilities then follow. + // Any function defined here is inherited by all scale types. + // Any function can be extended by the scale type + + mergeTicksOptions: function() { + var ticks = this.options.ticks; + if (ticks.minor === false) { + ticks.minor = { + display: false + }; + } + if (ticks.major === false) { + ticks.major = { + display: false + }; + } + for (var key in ticks) { + if (key !== 'major' && key !== 'minor') { + if (typeof ticks.minor[key] === 'undefined') { + ticks.minor[key] = ticks[key]; + } + if (typeof ticks.major[key] === 'undefined') { + ticks.major[key] = ticks[key]; + } + } + } + }, + beforeUpdate: function() { + helpers$1.callback(this.options.beforeUpdate, [this]); + }, + + update: function(maxWidth, maxHeight, margins) { + var me = this; + var i, ilen, labels, label, ticks, tick; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = helpers$1.extend({ + left: 0, + right: 0, + top: 0, + bottom: 0 + }, margins); + + me._maxLabelLines = 0; + me.longestLabelWidth = 0; + me.longestTextCache = me.longestTextCache || {}; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + + // Data min/max + me.beforeDataLimits(); + me.determineDataLimits(); + me.afterDataLimits(); + + // Ticks - `this.ticks` is now DEPRECATED! + // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member + // and must not be accessed directly from outside this class. `this.ticks` being + // around for long time and not marked as private, we can't change its structure + // without unexpected breaking changes. If you need to access the scale ticks, + // use scale.getTicks() instead. + + me.beforeBuildTicks(); + + // New implementations should return an array of objects but for BACKWARD COMPAT, + // we still support no return (`this.ticks` internally set by calling this method). + ticks = me.buildTicks() || []; + + // Allow modification of ticks in callback. + ticks = me.afterBuildTicks(ticks) || ticks; + + me.beforeTickToLabelConversion(); + + // New implementations should return the formatted tick labels but for BACKWARD + // COMPAT, we still support no return (`this.ticks` internally changed by calling + // this method and supposed to contain only string values). + labels = me.convertTicksToLabels(ticks) || me.ticks; + + me.afterTickToLabelConversion(); + + me.ticks = labels; // BACKWARD COMPATIBILITY + + // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! + + // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) + for (i = 0, ilen = labels.length; i < ilen; ++i) { + label = labels[i]; + tick = ticks[i]; + if (!tick) { + ticks.push(tick = { + label: label, + major: false + }); + } else { + tick.label = label; + } + } + + me._ticks = ticks; + + // Tick Rotation + me.beforeCalculateTickRotation(); + me.calculateTickRotation(); + me.afterCalculateTickRotation(); + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: function() { + helpers$1.callback(this.options.afterUpdate, [this]); + }, + + // + + beforeSetDimensions: function() { + helpers$1.callback(this.options.beforeSetDimensions, [this]); + }, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + }, + afterSetDimensions: function() { + helpers$1.callback(this.options.afterSetDimensions, [this]); + }, + + // Data limits + beforeDataLimits: function() { + helpers$1.callback(this.options.beforeDataLimits, [this]); + }, + determineDataLimits: helpers$1.noop, + afterDataLimits: function() { + helpers$1.callback(this.options.afterDataLimits, [this]); + }, + + // + beforeBuildTicks: function() { + helpers$1.callback(this.options.beforeBuildTicks, [this]); + }, + buildTicks: helpers$1.noop, + afterBuildTicks: function(ticks) { + var me = this; + // ticks is empty for old axis implementations here + if (helpers$1.isArray(ticks) && ticks.length) { + return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]); + } + // Support old implementations (that modified `this.ticks` directly in buildTicks) + me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks; + return ticks; + }, + + beforeTickToLabelConversion: function() { + helpers$1.callback(this.options.beforeTickToLabelConversion, [this]); + }, + convertTicksToLabels: function() { + var me = this; + // Convert ticks to strings + var tickOpts = me.options.ticks; + me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); + }, + afterTickToLabelConversion: function() { + helpers$1.callback(this.options.afterTickToLabelConversion, [this]); + }, + + // + + beforeCalculateTickRotation: function() { + helpers$1.callback(this.options.beforeCalculateTickRotation, [this]); + }, + calculateTickRotation: function() { + var me = this; + var context = me.ctx; + var tickOpts = me.options.ticks; + var labels = labelsFromTicks(me._ticks); + + // Get the width of each grid by calculating the difference + // between x offsets between 0 and 1. + var tickFont = helpers$1.options._parseFont(tickOpts); + context.font = tickFont.string; + + var labelRotation = tickOpts.minRotation || 0; + + if (labels.length && me.options.display && me.isHorizontal()) { + var originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache); + var labelWidth = originalLabelWidth; + var cosRotation, sinRotation; + + // Allow 3 pixels x2 padding either side for label readability + var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; + + // Max label rotation can be set or default to 90 - also act as a loop counter + while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { + var angleRadians = helpers$1.toRadians(labelRotation); + cosRotation = Math.cos(angleRadians); + sinRotation = Math.sin(angleRadians); + + if (sinRotation * originalLabelWidth > me.maxHeight) { + // go back one step + labelRotation--; + break; + } + + labelRotation++; + labelWidth = cosRotation * originalLabelWidth; + } + } + + me.labelRotation = labelRotation; + }, + afterCalculateTickRotation: function() { + helpers$1.callback(this.options.afterCalculateTickRotation, [this]); + }, + + // + + beforeFit: function() { + helpers$1.callback(this.options.beforeFit, [this]); + }, + fit: function() { + var me = this; + // Reset + var minSize = me.minSize = { + width: 0, + height: 0 + }; + + var labels = labelsFromTicks(me._ticks); + + var opts = me.options; + var tickOpts = opts.ticks; + var scaleLabelOpts = opts.scaleLabel; + var gridLineOpts = opts.gridLines; + var display = me._isVisible(); + var position = opts.position; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var tickFont = parseFont(tickOpts); + var tickMarkLength = opts.gridLines.tickMarkLength; + + // Width + if (isHorizontal) { + // subtract the margins to line up with the chartArea if we are a full width scale + minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; + } else { + minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } + + // height + if (isHorizontal) { + minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } else { + minSize.height = me.maxHeight; // fill all the height + } + + // Are we showing a title for the scale? + if (scaleLabelOpts.display && display) { + var scaleLabelFont = parseFont(scaleLabelOpts); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding); + var deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height; + + if (isHorizontal) { + minSize.height += deltaHeight; + } else { + minSize.width += deltaHeight; + } + } + + // Don't bother fitting the ticks if we are not showing the labels + if (tickOpts.display && display) { + var largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache); + var tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels); + var lineSpace = tickFont.size * 0.5; + var tickPadding = me.options.ticks.padding; + + // Store max number of lines and widest label for _autoSkip + me._maxLabelLines = tallestLabelHeightInLines; + me.longestLabelWidth = largestTextWidth; + + if (isHorizontal) { + var angleRadians = helpers$1.toRadians(me.labelRotation); + var cosRotation = Math.cos(angleRadians); + var sinRotation = Math.sin(angleRadians); + + // TODO - improve this calculation + var labelHeight = (sinRotation * largestTextWidth) + + (tickFont.lineHeight * tallestLabelHeightInLines) + + lineSpace; // padding + + minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); + + me.ctx.font = tickFont.string; + var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string); + var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string); + var offsetLeft = me.getPixelForTick(0) - me.left; + var offsetRight = me.right - me.getPixelForTick(labels.length - 1); + var paddingLeft, paddingRight; + + // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned + // which means that the right padding is dominated by the font height + if (me.labelRotation !== 0) { + paddingLeft = position === 'bottom' ? (cosRotation * firstLabelWidth) : (cosRotation * lineSpace); + paddingRight = position === 'bottom' ? (cosRotation * lineSpace) : (cosRotation * lastLabelWidth); + } else { + paddingLeft = firstLabelWidth / 2; + paddingRight = lastLabelWidth / 2; + } + me.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges + me.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3; + } else { + // A vertical axis is more constrained by the width. Labels are the + // dominant factor here, so get that length first and account for padding + if (tickOpts.mirror) { + largestTextWidth = 0; + } else { + // use lineSpace for consistency with horizontal axis + // tickPadding is not implemented for horizontal + largestTextWidth += tickPadding + lineSpace; + } + + minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); + + me.paddingTop = tickFont.size / 2; + me.paddingBottom = tickFont.size / 2; + } + } + + me.handleMargins(); + + me.width = minSize.width; + me.height = minSize.height; + }, + + /** + * Handle margins and padding interactions + * @private + */ + handleMargins: function() { + var me = this; + if (me.margins) { + me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); + me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); + me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); + me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); + } + }, + + afterFit: function() { + helpers$1.callback(this.options.afterFit, [this]); + }, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + isFullWidth: function() { + return (this.options.fullWidth); + }, + + // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not + getRightValue: function(rawValue) { + // Null and undefined values first + if (helpers$1.isNullOrUndef(rawValue)) { + return NaN; + } + // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values + if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) { + return NaN; + } + // If it is in fact an object, dive in one more level + if (rawValue) { + if (this.isHorizontal()) { + if (rawValue.x !== undefined) { + return this.getRightValue(rawValue.x); + } + } else if (rawValue.y !== undefined) { + return this.getRightValue(rawValue.y); + } + } + + // Value is good, return it + return rawValue; + }, + + /** + * Used to get the value to display in the tooltip for the data at the given index + * @param index + * @param datasetIndex + */ + getLabelForIndex: helpers$1.noop, + + /** + * Returns the location of the given data point. Value can either be an index or a numerical value + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param value + * @param index + * @param datasetIndex + */ + getPixelForValue: helpers$1.noop, + + /** + * Used to get the data value from a given pixel. This is the inverse of getPixelForValue + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param pixel + */ + getValueForPixel: helpers$1.noop, + + /** + * Returns the location of the tick at the given index + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForTick: function(index) { + var me = this; + var offset = me.options.offset; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var pixel = (tickWidth * index) + me.paddingLeft; + + if (offset) { + pixel += tickWidth / 2; + } + + var finalVal = me.left + pixel; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + var innerHeight = me.height - (me.paddingTop + me.paddingBottom); + return me.top + (index * (innerHeight / (me._ticks.length - 1))); + }, + + /** + * Utility for getting the pixel location of a percentage of scale + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForDecimal: function(decimal) { + var me = this; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var valueOffset = (innerWidth * decimal) + me.paddingLeft; + + var finalVal = me.left + valueOffset; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + return me.top + (decimal * me.height); + }, + + /** + * Returns the pixel for the minimum chart value + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getBasePixel: function() { + return this.getPixelForValue(this.getBaseValue()); + }, + + getBaseValue: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0; + }, + + /** + * Returns a subset of ticks to be plotted to avoid overlapping labels. + * @private + */ + _autoSkip: function(ticks) { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + var tickCount = ticks.length; + var skipRatio = false; + var maxTicks = optionTicks.maxTicksLimit; + + // Total space needed to display all ticks. First and last ticks are + // drawn as their center at end of axis, so tickCount-1 + var ticksLength = me._tickSize() * (tickCount - 1); + + // Axis length + var axisLength = isHorizontal + ? me.width - (me.paddingLeft + me.paddingRight) + : me.height - (me.paddingTop + me.PaddingBottom); + + var result = []; + var i, tick; + + if (ticksLength > axisLength) { + skipRatio = 1 + Math.floor(ticksLength / axisLength); + } + + // if they defined a max number of optionTicks, + // increase skipRatio until that number is met + if (tickCount > maxTicks) { + skipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks)); + } + + for (i = 0; i < tickCount; i++) { + tick = ticks[i]; + + if (skipRatio > 1 && i % skipRatio > 0) { + // leave tick in place but make sure it's not displayed (#4635) + delete tick.label; + } + result.push(tick); + } + return result; + }, + + /** + * @private + */ + _tickSize: function() { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + + // Calculate space needed by label in axis direction. + var rot = helpers$1.toRadians(me.labelRotation); + var cos = Math.abs(Math.cos(rot)); + var sin = Math.abs(Math.sin(rot)); + + var padding = optionTicks.autoSkipPadding || 0; + var w = (me.longestLabelWidth + padding) || 0; + + var tickFont = helpers$1.options._parseFont(optionTicks); + var h = (me._maxLabelLines * tickFont.lineHeight + padding) || 0; + + // Calculate space needed for 1 tick in axis direction. + return isHorizontal + ? h * cos > w * sin ? w / cos : h / sin + : h * sin < w * cos ? h / cos : w / sin; + }, + + /** + * @private + */ + _isVisible: function() { + var me = this; + var chart = me.chart; + var display = me.options.display; + var i, ilen, meta; + + if (display !== 'auto') { + return !!display; + } + + // When 'auto', the scale is visible if at least one associated dataset is visible. + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + if (meta.xAxisID === me.id || meta.yAxisID === me.id) { + return true; + } + } + } + + return false; + }, + + /** + * Actually draw the scale on the canvas + * @param {object} chartArea - the area of the chart to draw full grid lines on + */ + draw: function(chartArea) { + var me = this; + var options = me.options; + + if (!me._isVisible()) { + return; + } + + var chart = me.chart; + var context = me.ctx; + var globalDefaults = core_defaults.global; + var defaultFontColor = globalDefaults.defaultFontColor; + var optionTicks = options.ticks.minor; + var optionMajorTicks = options.ticks.major || optionTicks; + var gridLines = options.gridLines; + var scaleLabel = options.scaleLabel; + var position = options.position; + + var isRotated = me.labelRotation !== 0; + var isMirrored = optionTicks.mirror; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); + var tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor); + var tickFont = parseFont(optionTicks); + var lineHeight = tickFont.lineHeight; + var majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor); + var majorTickFont = parseFont(optionMajorTicks); + var tickPadding = optionTicks.padding; + var labelOffset = optionTicks.labelOffset; + + var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; + + var scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor); + var scaleLabelFont = parseFont(scaleLabel); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding); + var labelRotationRadians = helpers$1.toRadians(me.labelRotation); + + var itemsToDraw = []; + + var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0; + var alignPixel = helpers$1._alignPixel; + var borderValue, tickStart, tickEnd; + + if (position === 'top') { + borderValue = alignPixel(chart, me.bottom, axisWidth); + tickStart = me.bottom - tl; + tickEnd = borderValue - axisWidth / 2; + } else if (position === 'bottom') { + borderValue = alignPixel(chart, me.top, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.top + tl; + } else if (position === 'left') { + borderValue = alignPixel(chart, me.right, axisWidth); + tickStart = me.right - tl; + tickEnd = borderValue - axisWidth / 2; + } else { + borderValue = alignPixel(chart, me.left, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.left + tl; + } + + var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error. + + helpers$1.each(ticks, function(tick, index) { + // autoskipper skipped this tick (#4635) + if (helpers$1.isNullOrUndef(tick.label)) { + return; + } + + var label = tick.label; + var lineWidth, lineColor, borderDash, borderDashOffset; + if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { + // Draw the first index specially + lineWidth = gridLines.zeroLineWidth; + lineColor = gridLines.zeroLineColor; + borderDash = gridLines.zeroLineBorderDash || []; + borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0; + } else { + lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index); + lineColor = valueAtIndexOrDefault(gridLines.color, index); + borderDash = gridLines.borderDash || []; + borderDashOffset = gridLines.borderDashOffset || 0.0; + } + + // Common properties + var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign; + var labelCount = helpers$1.isArray(label) ? label.length : 1; + var lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines); + + if (isHorizontal) { + var labelYOffset = tl + tickPadding; + + if (lineValue < me.left - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth); + ty1 = tickStart; + ty2 = tickEnd; + labelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option) + + if (position === 'top') { + y1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2; + y2 = chartArea.bottom; + textOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight; + textAlign = !isRotated ? 'center' : 'left'; + labelY = me.bottom - labelYOffset; + } else { + y1 = chartArea.top; + y2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2; + textOffset = (!isRotated ? 0.5 : 0) * lineHeight; + textAlign = !isRotated ? 'center' : 'right'; + labelY = me.top + labelYOffset; + } + } else { + var labelXOffset = (isMirrored ? 0 : tl) + tickPadding; + + if (lineValue < me.top - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tickStart; + tx2 = tickEnd; + ty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth); + labelY = me.getPixelForTick(index) + labelOffset; + textOffset = (1 - labelCount) * lineHeight / 2; + + if (position === 'left') { + x1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2; + x2 = chartArea.right; + textAlign = isMirrored ? 'left' : 'right'; + labelX = me.right - labelXOffset; + } else { + x1 = chartArea.left; + x2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2; + textAlign = isMirrored ? 'right' : 'left'; + labelX = me.left + labelXOffset; + } + } + + itemsToDraw.push({ + tx1: tx1, + ty1: ty1, + tx2: tx2, + ty2: ty2, + x1: x1, + y1: y1, + x2: x2, + y2: y2, + labelX: labelX, + labelY: labelY, + glWidth: lineWidth, + glColor: lineColor, + glBorderDash: borderDash, + glBorderDashOffset: borderDashOffset, + rotation: -1 * labelRotationRadians, + label: label, + major: tick.major, + textOffset: textOffset, + textAlign: textAlign + }); + }); + + // Draw all of the tick labels, tick marks, and grid lines at the correct places + helpers$1.each(itemsToDraw, function(itemToDraw) { + var glWidth = itemToDraw.glWidth; + var glColor = itemToDraw.glColor; + + if (gridLines.display && glWidth && glColor) { + context.save(); + context.lineWidth = glWidth; + context.strokeStyle = glColor; + if (context.setLineDash) { + context.setLineDash(itemToDraw.glBorderDash); + context.lineDashOffset = itemToDraw.glBorderDashOffset; + } + + context.beginPath(); + + if (gridLines.drawTicks) { + context.moveTo(itemToDraw.tx1, itemToDraw.ty1); + context.lineTo(itemToDraw.tx2, itemToDraw.ty2); + } + + if (gridLines.drawOnChartArea) { + context.moveTo(itemToDraw.x1, itemToDraw.y1); + context.lineTo(itemToDraw.x2, itemToDraw.y2); + } + + context.stroke(); + context.restore(); + } + + if (optionTicks.display) { + // Make sure we draw text in the correct color and font + context.save(); + context.translate(itemToDraw.labelX, itemToDraw.labelY); + context.rotate(itemToDraw.rotation); + context.font = itemToDraw.major ? majorTickFont.string : tickFont.string; + context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; + context.textBaseline = 'middle'; + context.textAlign = itemToDraw.textAlign; + + var label = itemToDraw.label; + var y = itemToDraw.textOffset; + if (helpers$1.isArray(label)) { + for (var i = 0; i < label.length; ++i) { + // We just make sure the multiline element is a string here.. + context.fillText('' + label[i], 0, y); + y += lineHeight; + } + } else { + context.fillText(label, 0, y); + } + context.restore(); + } + }); + + if (scaleLabel.display) { + // Draw the scale label + var scaleLabelX; + var scaleLabelY; + var rotation = 0; + var halfLineHeight = scaleLabelFont.lineHeight / 2; + + if (isHorizontal) { + scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width + scaleLabelY = position === 'bottom' + ? me.bottom - halfLineHeight - scaleLabelPadding.bottom + : me.top + halfLineHeight + scaleLabelPadding.top; + } else { + var isLeft = position === 'left'; + scaleLabelX = isLeft + ? me.left + halfLineHeight + scaleLabelPadding.top + : me.right - halfLineHeight - scaleLabelPadding.top; + scaleLabelY = me.top + ((me.bottom - me.top) / 2); + rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; + } + + context.save(); + context.translate(scaleLabelX, scaleLabelY); + context.rotate(rotation); + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.fillStyle = scaleLabelFontColor; // render in correct colour + context.font = scaleLabelFont.string; + context.fillText(scaleLabel.labelString, 0, 0); + context.restore(); + } + + if (axisWidth) { + // Draw the line at the edge of the axis + var firstLineWidth = axisWidth; + var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0); + var x1, x2, y1, y2; + + if (isHorizontal) { + x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2; + x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2; + y1 = y2 = borderValue; + } else { + y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2; + y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2; + x1 = x2 = borderValue; + } + + context.lineWidth = axisWidth; + context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0); + context.beginPath(); + context.moveTo(x1, y1); + context.lineTo(x2, y2); + context.stroke(); + } + } +}); + +var defaultConfig = { + position: 'bottom' +}; + +var scale_category = core_scale.extend({ + /** + * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those + * else fall back to data.labels + * @private + */ + getLabels: function() { + var data = this.chart.data; + return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; + }, + + determineDataLimits: function() { + var me = this; + var labels = me.getLabels(); + me.minIndex = 0; + me.maxIndex = labels.length - 1; + var findIndex; + + if (me.options.ticks.min !== undefined) { + // user specified min value + findIndex = labels.indexOf(me.options.ticks.min); + me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; + } + + if (me.options.ticks.max !== undefined) { + // user specified max value + findIndex = labels.indexOf(me.options.ticks.max); + me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; + } + + me.min = labels[me.minIndex]; + me.max = labels[me.maxIndex]; + }, + + buildTicks: function() { + var me = this; + var labels = me.getLabels(); + // If we are viewing some subset of labels, slice the original array + me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var chart = me.chart; + + if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) { + return me.getRightValue(chart.data.datasets[datasetIndex].data[index]); + } + + return me.ticks[index - me.minIndex]; + }, + + // Used to get data value locations. Value can either be an index or a numerical value + getPixelForValue: function(value, index) { + var me = this; + var offset = me.options.offset; + // 1 is added because we need the length but we have the indexes + var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); + + // If value is a data object, then index is the index in the data array, + // not the index of the scale. We need to change that. + var valueCategory; + if (value !== undefined && value !== null) { + valueCategory = me.isHorizontal() ? value.x : value.y; + } + if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { + var labels = me.getLabels(); + value = valueCategory || value; + var idx = labels.indexOf(value); + index = idx !== -1 ? idx : index; + } + + if (me.isHorizontal()) { + var valueWidth = me.width / offsetAmt; + var widthOffset = (valueWidth * (index - me.minIndex)); + + if (offset) { + widthOffset += (valueWidth / 2); + } + + return me.left + widthOffset; + } + var valueHeight = me.height / offsetAmt; + var heightOffset = (valueHeight * (index - me.minIndex)); + + if (offset) { + heightOffset += (valueHeight / 2); + } + + return me.top + heightOffset; + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); + }, + + getValueForPixel: function(pixel) { + var me = this; + var offset = me.options.offset; + var value; + var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var horz = me.isHorizontal(); + var valueDimension = (horz ? me.width : me.height) / offsetAmt; + + pixel -= horz ? me.left : me.top; + + if (offset) { + pixel -= (valueDimension / 2); + } + + if (pixel <= 0) { + value = 0; + } else { + value = Math.round(pixel / valueDimension); + } + + return value + me.minIndex; + }, + + getBasePixel: function() { + return this.bottom; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults = defaultConfig; +scale_category._defaults = _defaults; + +var noop = helpers$1.noop; +var isNullOrUndef = helpers$1.isNullOrUndef; + +/** + * Generate a set of linear ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ +function generateTicks(generationOptions, dataRange) { + var ticks = []; + // To get a "nice" value for the tick spacing, we will use the appropriately named + // "nice number" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks + // for details. + + var MIN_SPACING = 1e-14; + var stepSize = generationOptions.stepSize; + var unit = stepSize || 1; + var maxNumSpaces = generationOptions.maxTicks - 1; + var min = generationOptions.min; + var max = generationOptions.max; + var precision = generationOptions.precision; + var rmin = dataRange.min; + var rmax = dataRange.max; + var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit; + var factor, niceMin, niceMax, numSpaces; + + // Beyond MIN_SPACING floating point numbers being to lose precision + // such that we can't do the math necessary to generate ticks + if (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) { + return [rmin, rmax]; + } + + numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); + if (numSpaces > maxNumSpaces) { + // If the calculated num of spaces exceeds maxNumSpaces, recalculate it + spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit; + } + + if (stepSize || isNullOrUndef(precision)) { + // If a precision is not specified, calculate factor based on spacing + factor = Math.pow(10, helpers$1._decimalPlaces(spacing)); + } else { + // If the user specified a precision, round to that number of decimal places + factor = Math.pow(10, precision); + spacing = Math.ceil(spacing * factor) / factor; + } + + niceMin = Math.floor(rmin / spacing) * spacing; + niceMax = Math.ceil(rmax / spacing) * spacing; + + // If min, max and stepSize is set and they make an evenly spaced scale use it. + if (stepSize) { + // If very close to our whole number, use it. + if (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) { + niceMin = min; + } + if (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) { + niceMax = max; + } + } + + numSpaces = (niceMax - niceMin) / spacing; + // If very close to our rounded value, use it. + if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { + numSpaces = Math.round(numSpaces); + } else { + numSpaces = Math.ceil(numSpaces); + } + + niceMin = Math.round(niceMin * factor) / factor; + niceMax = Math.round(niceMax * factor) / factor; + ticks.push(isNullOrUndef(min) ? niceMin : min); + for (var j = 1; j < numSpaces; ++j) { + ticks.push(Math.round((niceMin + j * spacing) * factor) / factor); + } + ticks.push(isNullOrUndef(max) ? niceMax : max); + + return ticks; +} + +var scale_linearbase = core_scale.extend({ + getRightValue: function(value) { + if (typeof value === 'string') { + return +value; + } + return core_scale.prototype.getRightValue.call(this, value); + }, + + handleTickRangeOptions: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, + // do nothing since that would make the chart weird. If the user really wants a weird chart + // axis, they can manually override it + if (tickOpts.beginAtZero) { + var minSign = helpers$1.sign(me.min); + var maxSign = helpers$1.sign(me.max); + + if (minSign < 0 && maxSign < 0) { + // move the top up to 0 + me.max = 0; + } else if (minSign > 0 && maxSign > 0) { + // move the bottom down to 0 + me.min = 0; + } + } + + var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; + var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; + + if (tickOpts.min !== undefined) { + me.min = tickOpts.min; + } else if (tickOpts.suggestedMin !== undefined) { + if (me.min === null) { + me.min = tickOpts.suggestedMin; + } else { + me.min = Math.min(me.min, tickOpts.suggestedMin); + } + } + + if (tickOpts.max !== undefined) { + me.max = tickOpts.max; + } else if (tickOpts.suggestedMax !== undefined) { + if (me.max === null) { + me.max = tickOpts.suggestedMax; + } else { + me.max = Math.max(me.max, tickOpts.suggestedMax); + } + } + + if (setMin !== setMax) { + // We set the min or the max but not both. + // So ensure that our range is good + // Inverted or 0 length range can happen when + // ticks.min is set, and no datasets are visible + if (me.min >= me.max) { + if (setMin) { + me.max = me.min + 1; + } else { + me.min = me.max - 1; + } + } + } + + if (me.min === me.max) { + me.max++; + + if (!tickOpts.beginAtZero) { + me.min--; + } + } + }, + + getTickLimit: function() { + var me = this; + var tickOpts = me.options.ticks; + var stepSize = tickOpts.stepSize; + var maxTicksLimit = tickOpts.maxTicksLimit; + var maxTicks; + + if (stepSize) { + maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1; + } else { + maxTicks = me._computeTickLimit(); + maxTicksLimit = maxTicksLimit || 11; + } + + if (maxTicksLimit) { + maxTicks = Math.min(maxTicksLimit, maxTicks); + } + + return maxTicks; + }, + + _computeTickLimit: function() { + return Number.POSITIVE_INFINITY; + }, + + handleDirectionalChanges: noop, + + buildTicks: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // Figure out what the max number of ticks we can support it is based on the size of + // the axis area. For now, we say that the minimum tick spacing in pixels must be 40 + // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on + // the graph. Make sure we always have at least 2 ticks + var maxTicks = me.getTickLimit(); + maxTicks = Math.max(2, maxTicks); + + var numericGeneratorOptions = { + maxTicks: maxTicks, + min: tickOpts.min, + max: tickOpts.max, + precision: tickOpts.precision, + stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) + }; + var ticks = me.ticks = generateTicks(numericGeneratorOptions, me); + + me.handleDirectionalChanges(); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + ticks.reverse(); + + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + }, + + convertTicksToLabels: function() { + var me = this; + me.ticksAsNumbers = me.ticks.slice(); + me.zeroLineIndex = me.ticks.indexOf(0); + + core_scale.prototype.convertTicksToLabels.call(me); + } +}); + +var defaultConfig$1 = { + position: 'left', + ticks: { + callback: core_ticks.formatters.linear + } +}; + +var scale_linear = scale_linearbase.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + var DEFAULT_MIN = 0; + var DEFAULT_MAX = 1; + + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // First Calculate the range + me.min = null; + me.max = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = { + positiveValues: [], + negativeValues: [] + }; + } + + // Store these per type + var positiveValues = valuesPerStack[key].positiveValues; + var negativeValues = valuesPerStack[key].negativeValues; + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + positiveValues[index] = positiveValues[index] || 0; + negativeValues[index] = negativeValues[index] || 0; + + if (opts.relativePoints) { + positiveValues[index] = 100; + } else if (value < 0) { + negativeValues[index] += value; + } else { + positiveValues[index] += value; + } + }); + } + }); + + helpers$1.each(valuesPerStack, function(valuesForType) { + var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); + var minVal = helpers$1.min(values); + var maxVal = helpers$1.max(values); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + }); + + } else { + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + }); + } + }); + } + + me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; + me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + this.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function() { + var me = this; + var tickFont; + + if (me.isHorizontal()) { + return Math.ceil(me.width / 40); + } + tickFont = helpers$1.options._parseFont(me.options.ticks); + return Math.ceil(me.height / tickFont.lineHeight); + }, + + // Called after the ticks are built. We need + handleDirectionalChanges: function() { + if (!this.isHorizontal()) { + // We are in a vertical orientation. The top value is the highest. So reverse the array + this.ticks.reverse(); + } + }, + + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + // Utils + getPixelForValue: function(value) { + // This must be called after fit has been run so that + // this.left, this.top, this.right, and this.bottom have been defined + var me = this; + var start = me.start; + + var rightValue = +me.getRightValue(value); + var pixel; + var range = me.end - start; + + if (me.isHorizontal()) { + pixel = me.left + (me.width / range * (rightValue - start)); + } else { + pixel = me.bottom - (me.height / range * (rightValue - start)); + } + return pixel; + }, + + getValueForPixel: function(pixel) { + var me = this; + var isHorizontal = me.isHorizontal(); + var innerDimension = isHorizontal ? me.width : me.height; + var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; + return me.start + ((me.end - me.start) * offset); + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticksAsNumbers[index]); + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$1 = defaultConfig$1; +scale_linear._defaults = _defaults$1; + +var valueOrDefault$a = helpers$1.valueOrDefault; + +/** + * Generate a set of logarithmic ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ +function generateTicks$1(generationOptions, dataRange) { + var ticks = []; + + var tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min)))); + + var endExp = Math.floor(helpers$1.log10(dataRange.max)); + var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); + var exp, significand; + + if (tickVal === 0) { + exp = Math.floor(helpers$1.log10(dataRange.minNotZero)); + significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); + + ticks.push(tickVal); + tickVal = significand * Math.pow(10, exp); + } else { + exp = Math.floor(helpers$1.log10(tickVal)); + significand = Math.floor(tickVal / Math.pow(10, exp)); + } + var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; + + do { + ticks.push(tickVal); + + ++significand; + if (significand === 10) { + significand = 1; + ++exp; + precision = exp >= 0 ? 1 : precision; + } + + tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision; + } while (exp < endExp || (exp === endExp && significand < endSignificand)); + + var lastTick = valueOrDefault$a(generationOptions.max, tickVal); + ticks.push(lastTick); + + return ticks; +} + +var defaultConfig$2 = { + position: 'left', + + // label settings + ticks: { + callback: core_ticks.formatters.logarithmic + } +}; + +// TODO(v3): change this to positiveOrDefault +function nonNegativeOrDefault(value, defaultValue) { + return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue; +} + +var scale_logarithmic = core_scale.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // Calculate Range + me.min = null; + me.max = null; + me.minNotZero = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = []; + } + + helpers$1.each(dataset.data, function(rawValue, index) { + var values = valuesPerStack[key]; + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + values[index] = values[index] || 0; + values[index] += value; + }); + } + }); + + helpers$1.each(valuesPerStack, function(valuesForType) { + if (valuesForType.length > 0) { + var minVal = helpers$1.min(valuesForType); + var maxVal = helpers$1.max(valuesForType); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + } + }); + + } else { + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + + if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { + me.minNotZero = value; + } + }); + } + }); + } + + // Common base implementation to handle ticks.min, ticks.max + this.handleTickRangeOptions(); + }, + + handleTickRangeOptions: function() { + var me = this; + var tickOpts = me.options.ticks; + var DEFAULT_MIN = 1; + var DEFAULT_MAX = 10; + + me.min = nonNegativeOrDefault(tickOpts.min, me.min); + me.max = nonNegativeOrDefault(tickOpts.max, me.max); + + if (me.min === me.max) { + if (me.min !== 0 && me.min !== null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1); + me.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1); + } else { + me.min = DEFAULT_MIN; + me.max = DEFAULT_MAX; + } + } + if (me.min === null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1); + } + if (me.max === null) { + me.max = me.min !== 0 + ? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1) + : DEFAULT_MAX; + } + if (me.minNotZero === null) { + if (me.min > 0) { + me.minNotZero = me.min; + } else if (me.max < 1) { + me.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max))); + } else { + me.minNotZero = DEFAULT_MIN; + } + } + }, + + buildTicks: function() { + var me = this; + var tickOpts = me.options.ticks; + var reverse = !me.isHorizontal(); + + var generationOptions = { + min: nonNegativeOrDefault(tickOpts.min), + max: nonNegativeOrDefault(tickOpts.max) + }; + var ticks = me.ticks = generateTicks$1(generationOptions, me); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + reverse = !reverse; + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + if (reverse) { + ticks.reverse(); + } + }, + + convertTicksToLabels: function() { + this.tickValues = this.ticks.slice(); + + core_scale.prototype.convertTicksToLabels.call(this); + }, + + // Get the correct tooltip label + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.tickValues[index]); + }, + + /** + * Returns the value of the first tick. + * @param {number} value - The minimum not zero value. + * @return {number} The first tick value. + * @private + */ + _getFirstTickValue: function(value) { + var exp = Math.floor(helpers$1.log10(value)); + var significand = Math.floor(value / Math.pow(10, exp)); + + return significand * Math.pow(10, exp); + }, + + getPixelForValue: function(value) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var offset = 0; + var innerDimension, pixel, start, end, sign; + + value = +me.getRightValue(value); + if (reverse) { + start = me.end; + end = me.start; + sign = -1; + } else { + start = me.start; + end = me.end; + sign = 1; + } + if (me.isHorizontal()) { + innerDimension = me.width; + pixel = reverse ? me.right : me.left; + } else { + innerDimension = me.height; + sign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0) + pixel = reverse ? me.top : me.bottom; + } + if (value !== start) { + if (start === 0) { // include zero tick + offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + innerDimension -= offset; + start = firstTickValue; + } + if (value !== 0) { + offset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start)); + } + pixel += sign * offset; + } + return pixel; + }, + + getValueForPixel: function(pixel) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var innerDimension, start, end, value; + + if (reverse) { + start = me.end; + end = me.start; + } else { + start = me.start; + end = me.end; + } + if (me.isHorizontal()) { + innerDimension = me.width; + value = reverse ? me.right - pixel : pixel - me.left; + } else { + innerDimension = me.height; + value = reverse ? pixel - me.top : me.bottom - pixel; + } + if (value !== start) { + if (start === 0) { // include zero tick + var offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + value -= offset; + innerDimension -= offset; + start = firstTickValue; + } + value *= log10(end) - log10(start); + value /= innerDimension; + value = Math.pow(10, log10(start) + value); + } + return value; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$2 = defaultConfig$2; +scale_logarithmic._defaults = _defaults$2; + +var valueOrDefault$b = helpers$1.valueOrDefault; +var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault; +var resolve$7 = helpers$1.options.resolve; + +var defaultConfig$3 = { + display: true, + + // Boolean - Whether to animate scaling the chart from the centre + animate: true, + position: 'chartArea', + + angleLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + borderDash: [], + borderDashOffset: 0.0 + }, + + gridLines: { + circular: false + }, + + // label settings + ticks: { + // Boolean - Show a backdrop to the scale label + showLabelBackdrop: true, + + // String - The colour of the label backdrop + backdropColor: 'rgba(255,255,255,0.75)', + + // Number - The backdrop padding above & below the label in pixels + backdropPaddingY: 2, + + // Number - The backdrop padding to the side of the label in pixels + backdropPaddingX: 2, + + callback: core_ticks.formatters.linear + }, + + pointLabels: { + // Boolean - if true, show point labels + display: true, + + // Number - Point label font size in pixels + fontSize: 10, + + // Function - Used to convert point labels + callback: function(label) { + return label; + } + } +}; + +function getValueCount(scale) { + var opts = scale.options; + return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; +} + +function getTickBackdropHeight(opts) { + var tickOpts = opts.ticks; + + if (tickOpts.display && opts.display) { + return valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2; + } + return 0; +} + +function measureLabelSize(ctx, lineHeight, label) { + if (helpers$1.isArray(label)) { + return { + w: helpers$1.longestText(ctx, ctx.font, label), + h: label.length * lineHeight + }; + } + + return { + w: ctx.measureText(label).width, + h: lineHeight + }; +} + +function determineLimits(angle, pos, size, min, max) { + if (angle === min || angle === max) { + return { + start: pos - (size / 2), + end: pos + (size / 2) + }; + } else if (angle < min || angle > max) { + return { + start: pos - size, + end: pos + }; + } + + return { + start: pos, + end: pos + size + }; +} + +/** + * Helper function to fit a radial linear scale with point labels + */ +function fitWithPointLabels(scale) { + + // Right, this is really confusing and there is a lot of maths going on here + // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + // + // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + // + // Solution: + // + // We assume the radius of the polygon is half the size of the canvas at first + // at each index we check if the text overlaps. + // + // Where it does, we store that angle and that index. + // + // After finding the largest index and angle we calculate how much we need to remove + // from the shape radius to move the point inwards by that x. + // + // We average the left and right distances to get the maximum shape radius that can fit in the box + // along with labels. + // + // Once we have that, we can find the centre point for the chart, by taking the x text protrusion + // on each side, removing that from the size, halving it and adding the left x protrusion width. + // + // This will mean we have a shape fitted to the canvas, as large as it can be with the labels + // and position it in the most space efficient manner + // + // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + + var plFont = helpers$1.options._parseFont(scale.options.pointLabels); + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var furthestLimits = { + l: 0, + r: scale.width, + t: 0, + b: scale.height - scale.paddingTop + }; + var furthestAngles = {}; + var i, textSize, pointPosition; + + scale.ctx.font = plFont.string; + scale._pointLabelSizes = []; + + var valueCount = getValueCount(scale); + for (i = 0; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, scale.drawingArea + 5); + textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || ''); + scale._pointLabelSizes[i] = textSize; + + // Add quarter circle to make degree 0 mean top of circle + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians) % 360; + var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); + var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); + + if (hLimits.start < furthestLimits.l) { + furthestLimits.l = hLimits.start; + furthestAngles.l = angleRadians; + } + + if (hLimits.end > furthestLimits.r) { + furthestLimits.r = hLimits.end; + furthestAngles.r = angleRadians; + } + + if (vLimits.start < furthestLimits.t) { + furthestLimits.t = vLimits.start; + furthestAngles.t = angleRadians; + } + + if (vLimits.end > furthestLimits.b) { + furthestLimits.b = vLimits.end; + furthestAngles.b = angleRadians; + } + } + + scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles); +} + +function getTextAlignForAngle(angle) { + if (angle === 0 || angle === 180) { + return 'center'; + } else if (angle < 180) { + return 'left'; + } + + return 'right'; +} + +function fillText(ctx, text, position, lineHeight) { + var y = position.y + lineHeight / 2; + var i, ilen; + + if (helpers$1.isArray(text)) { + for (i = 0, ilen = text.length; i < ilen; ++i) { + ctx.fillText(text[i], position.x, y); + y += lineHeight; + } + } else { + ctx.fillText(text, position.x, y); + } +} + +function adjustPointPositionForLabelHeight(angle, textSize, position) { + if (angle === 90 || angle === 270) { + position.y -= (textSize.h / 2); + } else if (angle > 270 || angle < 90) { + position.y -= textSize.h; + } +} + +function drawPointLabels(scale) { + var ctx = scale.ctx; + var opts = scale.options; + var angleLineOpts = opts.angleLines; + var gridLineOpts = opts.gridLines; + var pointLabelOpts = opts.pointLabels; + var lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth); + var lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color); + var tickBackdropHeight = getTickBackdropHeight(opts); + + ctx.save(); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = lineColor; + if (ctx.setLineDash) { + ctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []])); + ctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]); + } + + var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); + + // Point Label Font + var plFont = helpers$1.options._parseFont(pointLabelOpts); + + ctx.font = plFont.string; + ctx.textBaseline = 'middle'; + + for (var i = getValueCount(scale) - 1; i >= 0; i--) { + if (angleLineOpts.display && lineWidth && lineColor) { + var outerPosition = scale.getPointPosition(i, outerDistance); + ctx.beginPath(); + ctx.moveTo(scale.xCenter, scale.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + } + + if (pointLabelOpts.display) { + // Extra pixels out for some label spacing + var extra = (i === 0 ? tickBackdropHeight / 2 : 0); + var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5); + + // Keep this in loop since we may support array properties here + var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor); + ctx.fillStyle = pointLabelFontColor; + + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians); + ctx.textAlign = getTextAlignForAngle(angle); + adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); + fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight); + } + } + ctx.restore(); +} + +function drawRadiusLine(scale, gridLineOpts, radius, index) { + var ctx = scale.ctx; + var circular = gridLineOpts.circular; + var valueCount = getValueCount(scale); + var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1); + var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1); + var pointPosition; + + if ((!circular && !valueCount) || !lineColor || !lineWidth) { + return; + } + + ctx.save(); + ctx.strokeStyle = lineColor; + ctx.lineWidth = lineWidth; + if (ctx.setLineDash) { + ctx.setLineDash(gridLineOpts.borderDash || []); + ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0; + } + + ctx.beginPath(); + if (circular) { + // Draw circular arcs between the points + ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); + } else { + // Draw straight lines connecting each index + pointPosition = scale.getPointPosition(0, radius); + ctx.moveTo(pointPosition.x, pointPosition.y); + + for (var i = 1; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, radius); + ctx.lineTo(pointPosition.x, pointPosition.y); + } + } + ctx.closePath(); + ctx.stroke(); + ctx.restore(); +} + +function numberOrZero(param) { + return helpers$1.isNumber(param) ? param : 0; +} + +var scale_radialLinear = scale_linearbase.extend({ + setDimensions: function() { + var me = this; + + // Set the unconstrained dimension before label rotation + me.width = me.maxWidth; + me.height = me.maxHeight; + me.paddingTop = getTickBackdropHeight(me.options) / 2; + me.xCenter = Math.floor(me.width / 2); + me.yCenter = Math.floor((me.height - me.paddingTop) / 2); + me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2; + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var min = Number.POSITIVE_INFINITY; + var max = Number.NEGATIVE_INFINITY; + + helpers$1.each(chart.data.datasets, function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + min = Math.min(value, min); + max = Math.max(value, max); + }); + } + }); + + me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); + me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + me.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function() { + return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); + }, + + convertTicksToLabels: function() { + var me = this; + + scale_linearbase.prototype.convertTicksToLabels.call(me); + + // Point labels + me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); + }, + + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + fit: function() { + var me = this; + var opts = me.options; + + if (opts.display && opts.pointLabels.display) { + fitWithPointLabels(me); + } else { + me.setCenterPoint(0, 0, 0, 0); + } + }, + + /** + * Set radius reductions and determine new radius and center point + * @private + */ + setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) { + var me = this; + var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); + var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); + var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); + var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b); + + radiusReductionLeft = numberOrZero(radiusReductionLeft); + radiusReductionRight = numberOrZero(radiusReductionRight); + radiusReductionTop = numberOrZero(radiusReductionTop); + radiusReductionBottom = numberOrZero(radiusReductionBottom); + + me.drawingArea = Math.min( + Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), + Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); + me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); + }, + + setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) { + var me = this; + var maxRight = me.width - rightMovement - me.drawingArea; + var maxLeft = leftMovement + me.drawingArea; + var maxTop = topMovement + me.drawingArea; + var maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea; + + me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left); + me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop); + }, + + getIndexAngle: function(index) { + var angleMultiplier = (Math.PI * 2) / getValueCount(this); + var startAngle = this.chart.options && this.chart.options.startAngle ? + this.chart.options.startAngle : + 0; + + var startAngleRadians = startAngle * Math.PI * 2 / 360; + + // Start from the top instead of right, so remove a quarter of the circle + return index * angleMultiplier + startAngleRadians; + }, + + getDistanceFromCenterForValue: function(value) { + var me = this; + + if (value === null) { + return 0; // null always in center + } + + // Take into account half font size + the yPadding of the top value + var scalingFactor = me.drawingArea / (me.max - me.min); + if (me.options.ticks.reverse) { + return (me.max - value) * scalingFactor; + } + return (value - me.min) * scalingFactor; + }, + + getPointPosition: function(index, distanceFromCenter) { + var me = this; + var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); + return { + x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter, + y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter + }; + }, + + getPointPositionForValue: function(index, value) { + return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); + }, + + getBasePosition: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.getPointPositionForValue(0, + me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0); + }, + + draw: function() { + var me = this; + var opts = me.options; + var gridLineOpts = opts.gridLines; + var tickOpts = opts.ticks; + + if (opts.display) { + var ctx = me.ctx; + var startAngle = this.getIndexAngle(0); + var tickFont = helpers$1.options._parseFont(tickOpts); + + if (opts.angleLines.display || opts.pointLabels.display) { + drawPointLabels(me); + } + + helpers$1.each(me.ticks, function(label, index) { + // Don't draw a centre value (if it is minimum) + if (index > 0 || tickOpts.reverse) { + var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); + + // Draw circular lines around the scale + if (gridLineOpts.display && index !== 0) { + drawRadiusLine(me, gridLineOpts, yCenterOffset, index); + } + + if (tickOpts.display) { + var tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor); + ctx.font = tickFont.string; + + ctx.save(); + ctx.translate(me.xCenter, me.yCenter); + ctx.rotate(startAngle); + + if (tickOpts.showLabelBackdrop) { + var labelWidth = ctx.measureText(label).width; + ctx.fillStyle = tickOpts.backdropColor; + ctx.fillRect( + -labelWidth / 2 - tickOpts.backdropPaddingX, + -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY, + labelWidth + tickOpts.backdropPaddingX * 2, + tickFont.size + tickOpts.backdropPaddingY * 2 + ); + } + + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = tickFontColor; + ctx.fillText(label, 0, -yCenterOffset); + ctx.restore(); + } + } + }); + } + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$3 = defaultConfig$3; +scale_radialLinear._defaults = _defaults$3; + +var valueOrDefault$c = helpers$1.valueOrDefault; + +// Integer constants are from the ES6 spec. +var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; +var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +var INTERVALS = { + millisecond: { + common: true, + size: 1, + steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] + }, + second: { + common: true, + size: 1000, + steps: [1, 2, 5, 10, 15, 30] + }, + minute: { + common: true, + size: 60000, + steps: [1, 2, 5, 10, 15, 30] + }, + hour: { + common: true, + size: 3600000, + steps: [1, 2, 3, 6, 12] + }, + day: { + common: true, + size: 86400000, + steps: [1, 2, 5] + }, + week: { + common: false, + size: 604800000, + steps: [1, 2, 3, 4] + }, + month: { + common: true, + size: 2.628e9, + steps: [1, 2, 3] + }, + quarter: { + common: false, + size: 7.884e9, + steps: [1, 2, 3, 4] + }, + year: { + common: true, + size: 3.154e10 + } +}; + +var UNITS = Object.keys(INTERVALS); + +function sorter(a, b) { + return a - b; +} + +function arrayUnique(items) { + var hash = {}; + var out = []; + var i, ilen, item; + + for (i = 0, ilen = items.length; i < ilen; ++i) { + item = items[i]; + if (!hash[item]) { + hash[item] = true; + out.push(item); + } + } + + return out; +} + +/** + * Returns an array of {time, pos} objects used to interpolate a specific `time` or position + * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is + * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other + * extremity (left + width or top + height). Note that it would be more optimized to directly + * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need + * to create the lookup table. The table ALWAYS contains at least two items: min and max. + * + * @param {number[]} timestamps - timestamps sorted from lowest to highest. + * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min + * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. + * If 'series', timestamps will be positioned at the same distance from each other. In this + * case, only timestamps that break the time linearity are registered, meaning that in the + * best case, all timestamps are linear, the table contains only min and max. + */ +function buildLookupTable(timestamps, min, max, distribution) { + if (distribution === 'linear' || !timestamps.length) { + return [ + {time: min, pos: 0}, + {time: max, pos: 1} + ]; + } + + var table = []; + var items = [min]; + var i, ilen, prev, curr, next; + + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + curr = timestamps[i]; + if (curr > min && curr < max) { + items.push(curr); + } + } + + items.push(max); + + for (i = 0, ilen = items.length; i < ilen; ++i) { + next = items[i + 1]; + prev = items[i - 1]; + curr = items[i]; + + // only add points that breaks the scale linearity + if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { + table.push({time: curr, pos: i / (ilen - 1)}); + } + } + + return table; +} + +// @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ +function lookup(table, key, value) { + var lo = 0; + var hi = table.length - 1; + var mid, i0, i1; + + while (lo >= 0 && lo <= hi) { + mid = (lo + hi) >> 1; + i0 = table[mid - 1] || null; + i1 = table[mid]; + + if (!i0) { + // given value is outside table (before first item) + return {lo: null, hi: i1}; + } else if (i1[key] < value) { + lo = mid + 1; + } else if (i0[key] > value) { + hi = mid - 1; + } else { + return {lo: i0, hi: i1}; + } + } + + // given value is outside table (after last item) + return {lo: i1, hi: null}; +} + +/** + * Linearly interpolates the given source `value` using the table items `skey` values and + * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') + * returns the position for a timestamp equal to 42. If value is out of bounds, values at + * index [0, 1] or [n - 1, n] are used for the interpolation. + */ +function interpolate$1(table, skey, sval, tkey) { + var range = lookup(table, skey, sval); + + // Note: the lookup table ALWAYS contains at least 2 items (min and max) + var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; + var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; + + var span = next[skey] - prev[skey]; + var ratio = span ? (sval - prev[skey]) / span : 0; + var offset = (next[tkey] - prev[tkey]) * ratio; + + return prev[tkey] + offset; +} + +function toTimestamp(scale, input) { + var adapter = scale._adapter; + var options = scale.options.time; + var parser = options.parser; + var format = parser || options.format; + var value = input; + + if (typeof parser === 'function') { + value = parser(value); + } + + // Only parse if its not a timestamp already + if (!helpers$1.isFinite(value)) { + value = typeof format === 'string' + ? adapter.parse(value, format) + : adapter.parse(value); + } + + if (value !== null) { + return +value; + } + + // Labels are in an incompatible format and no `parser` has been provided. + // The user might still use the deprecated `format` option for parsing. + if (!parser && typeof format === 'function') { + value = format(input); + + // `format` could return something else than a timestamp, if so, parse it + if (!helpers$1.isFinite(value)) { + value = adapter.parse(value); + } + } + + return value; +} + +function parse(scale, input) { + if (helpers$1.isNullOrUndef(input)) { + return null; + } + + var options = scale.options.time; + var value = toTimestamp(scale, scale.getRightValue(input)); + if (value === null) { + return value; + } + + if (options.round) { + value = +scale._adapter.startOf(value, options.round); + } + + return value; +} + +/** + * Returns the number of unit to skip to be able to display up to `capacity` number of ticks + * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. + */ +function determineStepSize(min, max, unit, capacity) { + var range = max - min; + var interval = INTERVALS[unit]; + var milliseconds = interval.size; + var steps = interval.steps; + var i, ilen, factor; + + if (!steps) { + return Math.ceil(range / (capacity * milliseconds)); + } + + for (i = 0, ilen = steps.length; i < ilen; ++i) { + factor = steps[i]; + if (Math.ceil(range / (milliseconds * factor)) <= capacity) { + break; + } + } + + return factor; +} + +/** + * Figures out what unit results in an appropriate number of auto-generated ticks + */ +function determineUnitForAutoTicks(minUnit, min, max, capacity) { + var ilen = UNITS.length; + var i, interval, factor; + + for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { + interval = INTERVALS[UNITS[i]]; + factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; + + if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { + return UNITS[i]; + } + } + + return UNITS[ilen - 1]; +} + +/** + * Figures out what unit to format a set of ticks with + */ +function determineUnitForFormatting(scale, ticks, minUnit, min, max) { + var ilen = UNITS.length; + var i, unit; + + for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { + unit = UNITS[i]; + if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) { + return unit; + } + } + + return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; +} + +function determineMajorUnit(unit) { + for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { + if (INTERVALS[UNITS[i]].common) { + return UNITS[i]; + } + } +} + +/** + * Generates a maximum of `capacity` timestamps between min and max, rounded to the + * `minor` unit, aligned on the `major` unit and using the given scale time `options`. + * Important: this method can return ticks outside the min and max range, it's the + * responsibility of the calling code to clamp values if needed. + */ +function generate(scale, min, max, capacity) { + var adapter = scale._adapter; + var options = scale.options; + var timeOpts = options.time; + var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); + var major = determineMajorUnit(minor); + var stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize); + var weekday = minor === 'week' ? timeOpts.isoWeekday : false; + var majorTicksEnabled = options.ticks.major.enabled; + var interval = INTERVALS[minor]; + var first = min; + var last = max; + var ticks = []; + var time; + + if (!stepSize) { + stepSize = determineStepSize(min, max, minor, capacity); + } + + // For 'week' unit, handle the first day of week option + if (weekday) { + first = +adapter.startOf(first, 'isoWeek', weekday); + last = +adapter.startOf(last, 'isoWeek', weekday); + } + + // Align first/last ticks on unit + first = +adapter.startOf(first, weekday ? 'day' : minor); + last = +adapter.startOf(last, weekday ? 'day' : minor); + + // Make sure that the last tick include max + if (last < max) { + last = +adapter.add(last, 1, minor); + } + + time = first; + + if (majorTicksEnabled && major && !weekday && !timeOpts.round) { + // Align the first tick on the previous `minor` unit aligned on the `major` unit: + // we first aligned time on the previous `major` unit then add the number of full + // stepSize there is between first and the previous major time. + time = +adapter.startOf(time, major); + time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor); + } + + for (; time < last; time = +adapter.add(time, stepSize, minor)) { + ticks.push(+time); + } + + ticks.push(+time); + + return ticks; +} + +/** + * Returns the start and end offsets from edges in the form of {start, end} + * where each value is a relative width to the scale and ranges between 0 and 1. + * They add extra margins on the both sides by scaling down the original scale. + * Offsets are added when the `offset` option is true. + */ +function computeOffsets(table, ticks, min, max, options) { + var start = 0; + var end = 0; + var first, last; + + if (options.offset && ticks.length) { + if (!options.time.min) { + first = interpolate$1(table, 'time', ticks[0], 'pos'); + if (ticks.length === 1) { + start = 1 - first; + } else { + start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2; + } + } + if (!options.time.max) { + last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos'); + if (ticks.length === 1) { + end = last; + } else { + end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2; + } + } + } + + return {start: start, end: end}; +} + +function ticksFromTimestamps(scale, values, majorUnit) { + var ticks = []; + var i, ilen, value, major; + + for (i = 0, ilen = values.length; i < ilen; ++i) { + value = values[i]; + major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false; + + ticks.push({ + value: value, + major: major + }); + } + + return ticks; +} + +var defaultConfig$4 = { + position: 'bottom', + + /** + * Data distribution along the scale: + * - 'linear': data are spread according to their time (distances can vary), + * - 'series': data are spread at the same distance from each other. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + distribution: 'linear', + + /** + * Scale boundary strategy (bypassed by min/max time options) + * - `data`: make sure data are fully visible, ticks outside are removed + * - `ticks`: make sure ticks are fully visible, data outside are truncated + * @see https://github.com/chartjs/Chart.js/pull/4556 + * @since 2.7.0 + */ + bounds: 'data', + + adapters: {}, + time: { + parser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment + format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/ + unit: false, // false == automatic or override with week, month, year, etc. + round: false, // none, or override with week, month, year, etc. + displayFormat: false, // DEPRECATED + isoWeekday: false, // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/ + minUnit: 'millisecond', + displayFormats: {} + }, + ticks: { + autoSkip: false, + + /** + * Ticks generation input values: + * - 'auto': generates "optimal" ticks based on scale size and time options. + * - 'data': generates ticks from data (including labels from data {t|x|y} objects). + * - 'labels': generates ticks from user given `data.labels` values ONLY. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + source: 'auto', + + major: { + enabled: false + } + } +}; + +var scale_time = core_scale.extend({ + initialize: function() { + this.mergeTicksOptions(); + core_scale.prototype.initialize.call(this); + }, + + update: function() { + var me = this; + var options = me.options; + var time = options.time || (options.time = {}); + var adapter = me._adapter = new core_adapters._date(options.adapters.date); + + // DEPRECATIONS: output a message only one time per update + if (time.format) { + console.warn('options.time.format is deprecated and replaced by options.time.parser.'); + } + + // Backward compatibility: before introducing adapter, `displayFormats` was + // supposed to contain *all* unit/string pairs but this can't be resolved + // when loading the scale (adapters are loaded afterward), so let's populate + // missing formats on update + helpers$1.mergeIf(time.displayFormats, adapter.formats()); + + return core_scale.prototype.update.apply(me, arguments); + }, + + /** + * Allows data to be referenced via 't' attribute + */ + getRightValue: function(rawValue) { + if (rawValue && rawValue.t !== undefined) { + rawValue = rawValue.t; + } + return core_scale.prototype.getRightValue.call(this, rawValue); + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var adapter = me._adapter; + var timeOpts = me.options.time; + var unit = timeOpts.unit || 'day'; + var min = MAX_INTEGER; + var max = MIN_INTEGER; + var timestamps = []; + var datasets = []; + var labels = []; + var i, j, ilen, jlen, data, timestamp; + var dataLabels = chart.data.labels || []; + + // Convert labels to timestamps + for (i = 0, ilen = dataLabels.length; i < ilen; ++i) { + labels.push(parse(me, dataLabels[i])); + } + + // Convert data to timestamps + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + data = chart.data.datasets[i].data; + + // Let's consider that all data have the same format. + if (helpers$1.isObject(data[0])) { + datasets[i] = []; + + for (j = 0, jlen = data.length; j < jlen; ++j) { + timestamp = parse(me, data[j]); + timestamps.push(timestamp); + datasets[i][j] = timestamp; + } + } else { + for (j = 0, jlen = labels.length; j < jlen; ++j) { + timestamps.push(labels[j]); + } + datasets[i] = labels.slice(0); + } + } else { + datasets[i] = []; + } + } + + if (labels.length) { + // Sort labels **after** data have been converted + labels = arrayUnique(labels).sort(sorter); + min = Math.min(min, labels[0]); + max = Math.max(max, labels[labels.length - 1]); + } + + if (timestamps.length) { + timestamps = arrayUnique(timestamps).sort(sorter); + min = Math.min(min, timestamps[0]); + max = Math.max(max, timestamps[timestamps.length - 1]); + } + + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // In case there is no valid min/max, set limits based on unit time option + min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min; + max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max; + + // Make sure that max is strictly higher than min (required by the lookup table) + me.min = Math.min(min, max); + me.max = Math.max(min + 1, max); + + // PRIVATE + me._horizontal = me.isHorizontal(); + me._table = []; + me._timestamps = { + data: timestamps, + datasets: datasets, + labels: labels + }; + }, + + buildTicks: function() { + var me = this; + var min = me.min; + var max = me.max; + var options = me.options; + var timeOpts = options.time; + var timestamps = []; + var ticks = []; + var i, ilen, timestamp; + + switch (options.ticks.source) { + case 'data': + timestamps = me._timestamps.data; + break; + case 'labels': + timestamps = me._timestamps.labels; + break; + case 'auto': + default: + timestamps = generate(me, min, max, me.getLabelCapacity(min), options); + } + + if (options.bounds === 'ticks' && timestamps.length) { + min = timestamps[0]; + max = timestamps[timestamps.length - 1]; + } + + // Enforce limits with user min/max options + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // Remove ticks outside the min/max range + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + timestamp = timestamps[i]; + if (timestamp >= min && timestamp <= max) { + ticks.push(timestamp); + } + } + + me.min = min; + me.max = max; + + // PRIVATE + me._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max); + me._majorUnit = determineMajorUnit(me._unit); + me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); + me._offsets = computeOffsets(me._table, ticks, min, max, options); + + if (options.ticks.reverse) { + ticks.reverse(); + } + + return ticksFromTimestamps(me, ticks, me._majorUnit); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var adapter = me._adapter; + var data = me.chart.data; + var timeOpts = me.options.time; + var label = data.labels && index < data.labels.length ? data.labels[index] : ''; + var value = data.datasets[datasetIndex].data[index]; + + if (helpers$1.isObject(value)) { + label = me.getRightValue(value); + } + if (timeOpts.tooltipFormat) { + return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat); + } + if (typeof label === 'string') { + return label; + } + return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime); + }, + + /** + * Function to format an individual tick mark + * @private + */ + tickFormatFunction: function(time, index, ticks, format) { + var me = this; + var adapter = me._adapter; + var options = me.options; + var formats = options.time.displayFormats; + var minorFormat = formats[me._unit]; + var majorUnit = me._majorUnit; + var majorFormat = formats[majorUnit]; + var majorTime = +adapter.startOf(time, majorUnit); + var majorTickOpts = options.ticks.major; + var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; + var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat); + var tickOpts = major ? majorTickOpts : options.ticks.minor; + var formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback); + + return formatter ? formatter(label, index, ticks) : label; + }, + + convertTicksToLabels: function(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(this.tickFormatFunction(ticks[i].value, i, ticks)); + } + + return labels; + }, + + /** + * @private + */ + getPixelForOffset: function(time) { + var me = this; + var isReverse = me.options.ticks.reverse; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top; + var pos = interpolate$1(me._table, 'time', time, 'pos'); + var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end); + + return isReverse ? start - offset : start + offset; + }, + + getPixelForValue: function(value, index, datasetIndex) { + var me = this; + var time = null; + + if (index !== undefined && datasetIndex !== undefined) { + time = me._timestamps.datasets[datasetIndex][index]; + } + + if (time === null) { + time = parse(me, value); + } + + if (time !== null) { + return me.getPixelForOffset(time); + } + }, + + getPixelForTick: function(index) { + var ticks = this.getTicks(); + return index >= 0 && index < ticks.length ? + this.getPixelForOffset(ticks[index].value) : + null; + }, + + getValueForPixel: function(pixel) { + var me = this; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? me.left : me.top; + var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end; + var time = interpolate$1(me._table, 'pos', pos, 'time'); + + // DEPRECATION, we should return time directly + return me._adapter._create(time); + }, + + /** + * Crude approximation of what the label width might be + * @private + */ + getLabelWidth: function(label) { + var me = this; + var ticksOpts = me.options.ticks; + var tickLabelWidth = me.ctx.measureText(label).width; + var angle = helpers$1.toRadians(ticksOpts.maxRotation); + var cosRotation = Math.cos(angle); + var sinRotation = Math.sin(angle); + var tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize); + + return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); + }, + + /** + * @private + */ + getLabelCapacity: function(exampleTime) { + var me = this; + + // pick the longest format (milliseconds) for guestimation + var format = me.options.time.displayFormats.millisecond; + var exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format); + var tickLabelWidth = me.getLabelWidth(exampleLabel); + var innerWidth = me.isHorizontal() ? me.width : me.height; + var capacity = Math.floor(innerWidth / tickLabelWidth); + + return capacity > 0 ? capacity : 1; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$4 = defaultConfig$4; +scale_time._defaults = _defaults$4; + +var scales = { + category: scale_category, + linear: scale_linear, + logarithmic: scale_logarithmic, + radialLinear: scale_radialLinear, + time: scale_time +}; + +var FORMATS = { + datetime: 'MMM D, YYYY, h:mm:ss a', + millisecond: 'h:mm:ss.SSS a', + second: 'h:mm:ss a', + minute: 'h:mm a', + hour: 'hA', + day: 'MMM D', + week: 'll', + month: 'MMM YYYY', + quarter: '[Q]Q - YYYY', + year: 'YYYY' +}; + +core_adapters._date.override(typeof moment === 'function' ? { + _id: 'moment', // DEBUG ONLY + + formats: function() { + return FORMATS; + }, + + parse: function(value, format) { + if (typeof value === 'string' && typeof format === 'string') { + value = moment(value, format); + } else if (!(value instanceof moment)) { + value = moment(value); + } + return value.isValid() ? value.valueOf() : null; + }, + + format: function(time, format) { + return moment(time).format(format); + }, + + add: function(time, amount, unit) { + return moment(time).add(amount, unit).valueOf(); + }, + + diff: function(max, min, unit) { + return moment.duration(moment(max).diff(moment(min))).as(unit); + }, + + startOf: function(time, unit, weekday) { + time = moment(time); + if (unit === 'isoWeek') { + return time.isoWeekday(weekday).valueOf(); + } + return time.startOf(unit).valueOf(); + }, + + endOf: function(time, unit) { + return moment(time).endOf(unit).valueOf(); + }, + + // DEPRECATIONS + + /** + * Provided for backward compatibility with scale.getValueForPixel(). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function(time) { + return moment(time); + }, +} : {}); + +core_defaults._set('global', { + plugins: { + filler: { + propagate: true + } + } +}); + +var mappers = { + dataset: function(source) { + var index = source.fill; + var chart = source.chart; + var meta = chart.getDatasetMeta(index); + var visible = meta && chart.isDatasetVisible(index); + var points = (visible && meta.dataset._children) || []; + var length = points.length || 0; + + return !length ? null : function(point, i) { + return (i < length && points[i]._view) || null; + }; + }, + + boundary: function(source) { + var boundary = source.boundary; + var x = boundary ? boundary.x : null; + var y = boundary ? boundary.y : null; + + return function(point) { + return { + x: x === null ? point.x : x, + y: y === null ? point.y : y, + }; + }; + } +}; + +// @todo if (fill[0] === '#') +function decodeFill(el, index, count) { + var model = el._model || {}; + var fill = model.fill; + var target; + + if (fill === undefined) { + fill = !!model.backgroundColor; + } + + if (fill === false || fill === null) { + return false; + } + + if (fill === true) { + return 'origin'; + } + + target = parseFloat(fill, 10); + if (isFinite(target) && Math.floor(target) === target) { + if (fill[0] === '-' || fill[0] === '+') { + target = index + target; + } + + if (target === index || target < 0 || target >= count) { + return false; + } + + return target; + } + + switch (fill) { + // compatibility + case 'bottom': + return 'start'; + case 'top': + return 'end'; + case 'zero': + return 'origin'; + // supported boundaries + case 'origin': + case 'start': + case 'end': + return fill; + // invalid fill values + default: + return false; + } +} + +function computeBoundary(source) { + var model = source.el._model || {}; + var scale = source.el._scale || {}; + var fill = source.fill; + var target = null; + var horizontal; + + if (isFinite(fill)) { + return null; + } + + // Backward compatibility: until v3, we still need to support boundary values set on + // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and + // controllers might still use it (e.g. the Smith chart). + + if (fill === 'start') { + target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; + } else if (fill === 'end') { + target = model.scaleTop === undefined ? scale.top : model.scaleTop; + } else if (model.scaleZero !== undefined) { + target = model.scaleZero; + } else if (scale.getBasePosition) { + target = scale.getBasePosition(); + } else if (scale.getBasePixel) { + target = scale.getBasePixel(); + } + + if (target !== undefined && target !== null) { + if (target.x !== undefined && target.y !== undefined) { + return target; + } + + if (helpers$1.isFinite(target)) { + horizontal = scale.isHorizontal(); + return { + x: horizontal ? target : null, + y: horizontal ? null : target + }; + } + } + + return null; +} + +function resolveTarget(sources, index, propagate) { + var source = sources[index]; + var fill = source.fill; + var visited = [index]; + var target; + + if (!propagate) { + return fill; + } + + while (fill !== false && visited.indexOf(fill) === -1) { + if (!isFinite(fill)) { + return fill; + } + + target = sources[fill]; + if (!target) { + return false; + } + + if (target.visible) { + return fill; + } + + visited.push(fill); + fill = target.fill; + } + + return false; +} + +function createMapper(source) { + var fill = source.fill; + var type = 'dataset'; + + if (fill === false) { + return null; + } + + if (!isFinite(fill)) { + type = 'boundary'; + } + + return mappers[type](source); +} + +function isDrawable(point) { + return point && !point.skip; +} + +function drawArea(ctx, curve0, curve1, len0, len1) { + var i; + + if (!len0 || !len1) { + return; + } + + // building first area curve (normal) + ctx.moveTo(curve0[0].x, curve0[0].y); + for (i = 1; i < len0; ++i) { + helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); + } + + // joining the two area curves + ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); + + // building opposite area curve (reverse) + for (i = len1 - 1; i > 0; --i) { + helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); + } +} + +function doFill(ctx, points, mapper, view, color, loop) { + var count = points.length; + var span = view.spanGaps; + var curve0 = []; + var curve1 = []; + var len0 = 0; + var len1 = 0; + var i, ilen, index, p0, p1, d0, d1; + + ctx.beginPath(); + + for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { + index = i % count; + p0 = points[index]._view; + p1 = mapper(p0, index, view); + d0 = isDrawable(p0); + d1 = isDrawable(p1); + + if (d0 && d1) { + len0 = curve0.push(p0); + len1 = curve1.push(p1); + } else if (len0 && len1) { + if (!span) { + drawArea(ctx, curve0, curve1, len0, len1); + len0 = len1 = 0; + curve0 = []; + curve1 = []; + } else { + if (d0) { + curve0.push(p0); + } + if (d1) { + curve1.push(p1); + } + } + } + } + + drawArea(ctx, curve0, curve1, len0, len1); + + ctx.closePath(); + ctx.fillStyle = color; + ctx.fill(); +} + +var plugin_filler = { + id: 'filler', + + afterDatasetsUpdate: function(chart, options) { + var count = (chart.data.datasets || []).length; + var propagate = options.propagate; + var sources = []; + var meta, i, el, source; + + for (i = 0; i < count; ++i) { + meta = chart.getDatasetMeta(i); + el = meta.dataset; + source = null; + + if (el && el._model && el instanceof elements.Line) { + source = { + visible: chart.isDatasetVisible(i), + fill: decodeFill(el, i, count), + chart: chart, + el: el + }; + } + + meta.$filler = source; + sources.push(source); + } + + for (i = 0; i < count; ++i) { + source = sources[i]; + if (!source) { + continue; + } + + source.fill = resolveTarget(sources, i, propagate); + source.boundary = computeBoundary(source); + source.mapper = createMapper(source); + } + }, + + beforeDatasetDraw: function(chart, args) { + var meta = args.meta.$filler; + if (!meta) { + return; + } + + var ctx = chart.ctx; + var el = meta.el; + var view = el._view; + var points = el._children || []; + var mapper = meta.mapper; + var color = view.backgroundColor || core_defaults.global.defaultColor; + + if (mapper && color && points.length) { + helpers$1.canvas.clipArea(ctx, chart.chartArea); + doFill(ctx, points, mapper, view, color, el._loop); + helpers$1.canvas.unclipArea(ctx); + } + } +}; + +var noop$1 = helpers$1.noop; +var valueOrDefault$d = helpers$1.valueOrDefault; + +core_defaults._set('global', { + legend: { + display: true, + position: 'top', + fullWidth: true, + reverse: false, + weight: 1000, + + // a callback that will handle + onClick: function(e, legendItem) { + var index = legendItem.datasetIndex; + var ci = this.chart; + var meta = ci.getDatasetMeta(index); + + // See controller.isDatasetVisible comment + meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; + + // We hid a dataset ... rerender the chart + ci.update(); + }, + + onHover: null, + onLeave: null, + + labels: { + boxWidth: 40, + padding: 10, + // Generates labels shown in the legend + // Valid properties to return: + // text : text to display + // fillStyle : fill of coloured box + // strokeStyle: stroke of coloured box + // hidden : if this legend item refers to a hidden item + // lineCap : cap style for line + // lineDash + // lineDashOffset : + // lineJoin : + // lineWidth : + generateLabels: function(chart) { + var data = chart.data; + return helpers$1.isArray(data.datasets) ? data.datasets.map(function(dataset, i) { + return { + text: dataset.label, + fillStyle: (!helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), + hidden: !chart.isDatasetVisible(i), + lineCap: dataset.borderCapStyle, + lineDash: dataset.borderDash, + lineDashOffset: dataset.borderDashOffset, + lineJoin: dataset.borderJoinStyle, + lineWidth: dataset.borderWidth, + strokeStyle: dataset.borderColor, + pointStyle: dataset.pointStyle, + + // Below is extra data used for toggling the datasets + datasetIndex: i + }; + }, this) : []; + } + } + }, + + legendCallback: function(chart) { + var text = []; + text.push('
    '); + for (var i = 0; i < chart.data.datasets.length; i++) { + text.push('
  • '); + if (chart.data.datasets[i].label) { + text.push(chart.data.datasets[i].label); + } + text.push('
  • '); + } + text.push('
'); + return text.join(''); + } +}); + +/** + * Helper function to get the box width based on the usePointStyle option + * @param {object} labelopts - the label options on the legend + * @param {number} fontSize - the label font size + * @return {number} width of the color box area + */ +function getBoxWidth(labelOpts, fontSize) { + return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ? + fontSize : + labelOpts.boxWidth; +} + +/** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ +var Legend = core_element.extend({ + + initialize: function(config) { + helpers$1.extend(this, config); + + // Contains hit boxes for each dataset (in dataset order) + this.legendHitBoxes = []; + + /** + * @private + */ + this._hoveredItem = null; + + // Are we in doughnut mode which has a different data type + this.doughnutMode = false; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + // Any function defined here is inherited by all legend types. + // Any function can be extended by the legend type + + beforeUpdate: noop$1, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + }, + afterUpdate: noop$1, + + // + + beforeSetDimensions: noop$1, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$1, + + // + + beforeBuildLabels: noop$1, + buildLabels: function() { + var me = this; + var labelOpts = me.options.labels || {}; + var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || []; + + if (labelOpts.filter) { + legendItems = legendItems.filter(function(item) { + return labelOpts.filter(item, me.chart.data); + }); + } + + if (me.options.reverse) { + legendItems.reverse(); + } + + me.legendItems = legendItems; + }, + afterBuildLabels: noop$1, + + // + + beforeFit: noop$1, + fit: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var display = opts.display; + + var ctx = me.ctx; + + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + + // Reset hit boxes + var hitboxes = me.legendHitBoxes = []; + + var minSize = me.minSize; + var isHorizontal = me.isHorizontal(); + + if (isHorizontal) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = display ? 10 : 0; + } else { + minSize.width = display ? 10 : 0; + minSize.height = me.maxHeight; // fill all the height + } + + // Increase sizes here + if (display) { + ctx.font = labelFont.string; + + if (isHorizontal) { + // Labels + + // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one + var lineWidths = me.lineWidths = [0]; + var totalHeight = 0; + + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + + helpers$1.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + if (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) { + totalHeight += fontSize + labelOpts.padding; + lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding; + } + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: width, + height: fontSize + }; + + lineWidths[lineWidths.length - 1] += width + labelOpts.padding; + }); + + minSize.height += totalHeight; + + } else { + var vPadding = labelOpts.padding; + var columnWidths = me.columnWidths = []; + var totalWidth = labelOpts.padding; + var currentColWidth = 0; + var currentColHeight = 0; + var itemHeight = fontSize + vPadding; + + helpers$1.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + // If too tall, go to new column + if (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) { + totalWidth += currentColWidth + labelOpts.padding; + columnWidths.push(currentColWidth); // previous column width + + currentColWidth = 0; + currentColHeight = 0; + } + + // Get max width + currentColWidth = Math.max(currentColWidth, itemWidth); + currentColHeight += itemHeight; + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: itemWidth, + height: fontSize + }; + }); + + totalWidth += currentColWidth; + columnWidths.push(currentColWidth); + minSize.width += totalWidth; + } + } + + me.width = minSize.width; + me.height = minSize.height; + }, + afterFit: noop$1, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + + // Actually draw the legend on the canvas + draw: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; + var lineDefault = globalDefaults.elements.line; + var legendWidth = me.width; + var lineWidths = me.lineWidths; + + if (opts.display) { + var ctx = me.ctx; + var fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor); + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + var cursor; + + // Canvas setup + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + ctx.lineWidth = 0.5; + ctx.strokeStyle = fontColor; // for strikethrough effect + ctx.fillStyle = fontColor; // render in correct colour + ctx.font = labelFont.string; + + var boxWidth = getBoxWidth(labelOpts, fontSize); + var hitboxes = me.legendHitBoxes; + + // current position + var drawLegendBox = function(x, y, legendItem) { + if (isNaN(boxWidth) || boxWidth <= 0) { + return; + } + + // Set the ctx for the box + ctx.save(); + + var lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth); + ctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor); + ctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle); + ctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset); + ctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor); + + if (ctx.setLineDash) { + // IE 9 and 10 do not support line dash + ctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash)); + } + + if (opts.labels && opts.labels.usePointStyle) { + // Recalculate x and y for drawPoint() because its expecting + // x and y to be center of figure (instead of top left) + var radius = boxWidth * Math.SQRT2 / 2; + var centerX = x + boxWidth / 2; + var centerY = y + fontSize / 2; + + // Draw pointStyle as legend symbol + helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); + } else { + // Draw box as legend symbol + if (lineWidth !== 0) { + ctx.strokeRect(x, y, boxWidth, fontSize); + } + ctx.fillRect(x, y, boxWidth, fontSize); + } + + ctx.restore(); + }; + var fillText = function(x, y, legendItem, textWidth) { + var halfFontSize = fontSize / 2; + var xLeft = boxWidth + halfFontSize + x; + var yMiddle = y + halfFontSize; + + ctx.fillText(legendItem.text, xLeft, yMiddle); + + if (legendItem.hidden) { + // Strikethrough the text if hidden + ctx.beginPath(); + ctx.lineWidth = 2; + ctx.moveTo(xLeft, yMiddle); + ctx.lineTo(xLeft + textWidth, yMiddle); + ctx.stroke(); + } + }; + + // Horizontal + var isHorizontal = me.isHorizontal(); + if (isHorizontal) { + cursor = { + x: me.left + ((legendWidth - lineWidths[0]) / 2) + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } else { + cursor = { + x: me.left + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } + + var itemHeight = fontSize + labelOpts.padding; + helpers$1.each(me.legendItems, function(legendItem, i) { + var textWidth = ctx.measureText(legendItem.text).width; + var width = boxWidth + (fontSize / 2) + textWidth; + var x = cursor.x; + var y = cursor.y; + + // Use (me.left + me.minSize.width) and (me.top + me.minSize.height) + // instead of me.right and me.bottom because me.width and me.height + // may have been changed since me.minSize was calculated + if (isHorizontal) { + if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) { + y = cursor.y += itemHeight; + cursor.line++; + x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2) + labelOpts.padding; + } + } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) { + x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; + y = cursor.y = me.top + labelOpts.padding; + cursor.line++; + } + + drawLegendBox(x, y, legendItem); + + hitboxes[i].left = x; + hitboxes[i].top = y; + + // Fill the actual label + fillText(x, y, legendItem, textWidth); + + if (isHorizontal) { + cursor.x += width + labelOpts.padding; + } else { + cursor.y += itemHeight; + } + + }); + } + }, + + /** + * @private + */ + _getLegendItemAt: function(x, y) { + var me = this; + var i, hitBox, lh; + + if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { + // See if we are touching one of the dataset boxes + lh = me.legendHitBoxes; + for (i = 0; i < lh.length; ++i) { + hitBox = lh[i]; + + if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { + // Touching an element + return me.legendItems[i]; + } + } + } + + return null; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + */ + handleEvent: function(e) { + var me = this; + var opts = me.options; + var type = e.type === 'mouseup' ? 'click' : e.type; + var hoveredItem; + + if (type === 'mousemove') { + if (!opts.onHover && !opts.onLeave) { + return; + } + } else if (type === 'click') { + if (!opts.onClick) { + return; + } + } else { + return; + } + + // Chart event already has relative position in it + hoveredItem = me._getLegendItemAt(e.x, e.y); + + if (type === 'click') { + if (hoveredItem && opts.onClick) { + // use e.native for backwards compatibility + opts.onClick.call(me, e.native, hoveredItem); + } + } else { + if (opts.onLeave && hoveredItem !== me._hoveredItem) { + if (me._hoveredItem) { + opts.onLeave.call(me, e.native, me._hoveredItem); + } + me._hoveredItem = hoveredItem; + } + + if (opts.onHover && hoveredItem) { + // use e.native for backwards compatibility + opts.onHover.call(me, e.native, hoveredItem); + } + } + } +}); + +function createNewLegendAndAttach(chart, legendOpts) { + var legend = new Legend({ + ctx: chart.ctx, + options: legendOpts, + chart: chart + }); + + core_layouts.configure(chart, legend, legendOpts); + core_layouts.addBox(chart, legend); + chart.legend = legend; +} + +var plugin_legend = { + id: 'legend', + + /** + * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making + * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Legend, + + beforeInit: function(chart) { + var legendOpts = chart.options.legend; + + if (legendOpts) { + createNewLegendAndAttach(chart, legendOpts); + } + }, + + beforeUpdate: function(chart) { + var legendOpts = chart.options.legend; + var legend = chart.legend; + + if (legendOpts) { + helpers$1.mergeIf(legendOpts, core_defaults.global.legend); + + if (legend) { + core_layouts.configure(chart, legend, legendOpts); + legend.options = legendOpts; + } else { + createNewLegendAndAttach(chart, legendOpts); + } + } else if (legend) { + core_layouts.removeBox(chart, legend); + delete chart.legend; + } + }, + + afterEvent: function(chart, e) { + var legend = chart.legend; + if (legend) { + legend.handleEvent(e); + } + } +}; + +var noop$2 = helpers$1.noop; + +core_defaults._set('global', { + title: { + display: false, + fontStyle: 'bold', + fullWidth: true, + padding: 10, + position: 'top', + text: '', + weight: 2000 // by default greater than legend (1000) to be above + } +}); + +/** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ +var Title = core_element.extend({ + initialize: function(config) { + var me = this; + helpers$1.extend(me, config); + + // Contains hit boxes for each dataset (in dataset order) + me.legendHitBoxes = []; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + + beforeUpdate: noop$2, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: noop$2, + + // + + beforeSetDimensions: noop$2, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$2, + + // + + beforeBuildLabels: noop$2, + buildLabels: noop$2, + afterBuildLabels: noop$2, + + // + + beforeFit: noop$2, + fit: function() { + var me = this; + var opts = me.options; + var display = opts.display; + var minSize = me.minSize; + var lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1; + var fontOpts = helpers$1.options._parseFont(opts); + var textSize = display ? (lineCount * fontOpts.lineHeight) + (opts.padding * 2) : 0; + + if (me.isHorizontal()) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = textSize; + } else { + minSize.width = textSize; + minSize.height = me.maxHeight; // fill all the height + } + + me.width = minSize.width; + me.height = minSize.height; + + }, + afterFit: noop$2, + + // Shared Methods + isHorizontal: function() { + var pos = this.options.position; + return pos === 'top' || pos === 'bottom'; + }, + + // Actually draw the title block on the canvas + draw: function() { + var me = this; + var ctx = me.ctx; + var opts = me.options; + + if (opts.display) { + var fontOpts = helpers$1.options._parseFont(opts); + var lineHeight = fontOpts.lineHeight; + var offset = lineHeight / 2 + opts.padding; + var rotation = 0; + var top = me.top; + var left = me.left; + var bottom = me.bottom; + var right = me.right; + var maxWidth, titleX, titleY; + + ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour + ctx.font = fontOpts.string; + + // Horizontal + if (me.isHorizontal()) { + titleX = left + ((right - left) / 2); // midpoint of the width + titleY = top + offset; + maxWidth = right - left; + } else { + titleX = opts.position === 'left' ? left + offset : right - offset; + titleY = top + ((bottom - top) / 2); + maxWidth = bottom - top; + rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); + } + + ctx.save(); + ctx.translate(titleX, titleY); + ctx.rotate(rotation); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + var text = opts.text; + if (helpers$1.isArray(text)) { + var y = 0; + for (var i = 0; i < text.length; ++i) { + ctx.fillText(text[i], 0, y, maxWidth); + y += lineHeight; + } + } else { + ctx.fillText(text, 0, 0, maxWidth); + } + + ctx.restore(); + } + } +}); + +function createNewTitleBlockAndAttach(chart, titleOpts) { + var title = new Title({ + ctx: chart.ctx, + options: titleOpts, + chart: chart + }); + + core_layouts.configure(chart, title, titleOpts); + core_layouts.addBox(chart, title); + chart.titleBlock = title; +} + +var plugin_title = { + id: 'title', + + /** + * Backward compatibility: since 2.1.5, the title is registered as a plugin, making + * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Title, + + beforeInit: function(chart) { + var titleOpts = chart.options.title; + + if (titleOpts) { + createNewTitleBlockAndAttach(chart, titleOpts); + } + }, + + beforeUpdate: function(chart) { + var titleOpts = chart.options.title; + var titleBlock = chart.titleBlock; + + if (titleOpts) { + helpers$1.mergeIf(titleOpts, core_defaults.global.title); + + if (titleBlock) { + core_layouts.configure(chart, titleBlock, titleOpts); + titleBlock.options = titleOpts; + } else { + createNewTitleBlockAndAttach(chart, titleOpts); + } + } else if (titleBlock) { + core_layouts.removeBox(chart, titleBlock); + delete chart.titleBlock; + } + } +}; + +var plugins = {}; +var filler = plugin_filler; +var legend = plugin_legend; +var title = plugin_title; +plugins.filler = filler; +plugins.legend = legend; +plugins.title = title; + +/** + * @namespace Chart + */ + + +core_controller.helpers = helpers$1; + +// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! +core_helpers(core_controller); + +core_controller._adapters = core_adapters; +core_controller.Animation = core_animation; +core_controller.animationService = core_animations; +core_controller.controllers = controllers; +core_controller.DatasetController = core_datasetController; +core_controller.defaults = core_defaults; +core_controller.Element = core_element; +core_controller.elements = elements; +core_controller.Interaction = core_interaction; +core_controller.layouts = core_layouts; +core_controller.platform = platform; +core_controller.plugins = core_plugins; +core_controller.Scale = core_scale; +core_controller.scaleService = core_scaleService; +core_controller.Ticks = core_ticks; +core_controller.Tooltip = core_tooltip; + +// Register built-in scales + +core_controller.helpers.each(scales, function(scale, type) { + core_controller.scaleService.registerScaleType(type, scale, scale._defaults); +}); + +// Load to register built-in adapters (as side effects) + + +// Loading built-in plugins + +for (var k in plugins) { + if (plugins.hasOwnProperty(k)) { + core_controller.plugins.register(plugins[k]); + } +} + +core_controller.platform.initialize(); + +var src = core_controller; +if (typeof window !== 'undefined') { + window.Chart = core_controller; +} + +// DEPRECATIONS + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Chart + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +core_controller.Chart = core_controller; + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Legend + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.Legend = plugins.legend._element; + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Title + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.Title = plugins.title._element; + +/** + * Provided for backward compatibility, use Chart.plugins instead + * @namespace Chart.pluginService + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.pluginService = core_controller.plugins; + +/** + * Provided for backward compatibility, inheriting from Chart.PlugingBase has no + * effect, instead simply create/register plugins via plain JavaScript objects. + * @interface Chart.PluginBase + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ +core_controller.PluginBase = core_controller.Element.extend({}); + +/** + * Provided for backward compatibility, use Chart.helpers.canvas instead. + * @namespace Chart.canvasHelpers + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +core_controller.canvasHelpers = core_controller.helpers.canvas; + +/** + * Provided for backward compatibility, use Chart.layouts instead. + * @namespace Chart.layoutService + * @deprecated since version 2.7.3 + * @todo remove at version 3 + * @private + */ +core_controller.layoutService = core_controller.layouts; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.LinearScaleBase + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ +core_controller.LinearScaleBase = scale_linearbase; + +/** + * Provided for backward compatibility, instead we should create a new Chart + * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ +core_controller.helpers.each( + [ + 'Bar', + 'Bubble', + 'Doughnut', + 'Line', + 'PolarArea', + 'Radar', + 'Scatter' + ], + function(klass) { + core_controller[klass] = function(ctx, cfg) { + return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, { + type: klass.charAt(0).toLowerCase() + klass.slice(1) + })); + }; + } +); + +return src; + +}))); diff --git a/SRIP/Project-1 Issue Number 240/Quiz/quiz.css b/SRIP/Project-1 Issue Number 240/Quiz/quiz.css new file mode 100644 index 00000000..33d3c6a0 --- /dev/null +++ b/SRIP/Project-1 Issue Number 240/Quiz/quiz.css @@ -0,0 +1,174 @@ +{ + +border: 1px dotted black; + +} + +p.question { + +font-family: Arial, sans-serif; + +font-size:20px; + +color: #2E2E2E; + +margin-bottom:0px; + +} + + +h2.quizHeader { + +font-family: Arial, sans-serif; + +font-weight:normal; + +font-size:25px; + +line-height: 27px; + +margin: 24px 0 12px 0; + +padding: 0 0 4px 0; + +border-bottom: 1px solid #a2a2a2; + +} + + +h2.quizScore{ + +font-family: Arial, sans-serif; + +font-size:25px; + +} + + +div.quizAnswers{ + +font-family: Arial, sans-serif; + +font-size:16px; + +color: #424242; + +padding: 4px 0 4px 0; + +} + + +label { + +font-family: Arial, sans-serif; + +font-size:14px; + +color: #424242; + +vertical-align:top; + +} + + +input.answer[type="radio"] { + +margin-bottom: 10px; + +} + +input.quizSubmit[type="submit"] { + +-webkit-background-clip: border-box; + +-webkit-background-origin: padding-box; + +-webkit-background-size: auto; + +-webkit-transition-delay: 0s, 0s; + +-webkit-transition-duration: 0.2s, 0.2s; + +-webkit-transition-property: color, background-color; + +-webkit-transition-timing-function: ease, ease; + +box-shadow: rgba(0, 0, 0, 0.498039) 0px 0px 5px 0px; + +color: #ffffff; + +background-color: #c30b0a; + +margin: 0; + +border: 0; + +outline: 0; + +text-transform:uppercase; + +height:35px; + +width:85px; + +border: 1px solid #5E5E5E; + +border-radius:5px; + +} + + +input.quizSubmit[type="submit"]:hover { + +color: #ffffff; + +background: #680f11; + +text-decoration: none; + +} + + +table { + +background-color: #F2F2F2; + +border:1px solid #BDBDBD; + +border-radius:5px; + +padding:10px; + +padding-left:25px; + +box-shadow: rgba(0, 0, 0, 0.498039) 0px 0px 1px 0px; + +} + + +th { + +} + + +tr { + +} + + +td { + +} + +.submitter { + +width:85px; + +} + + +.hide { + +display:none; + +} \ No newline at end of file diff --git a/SRIP/Project-1 Issue Number 240/Quiz/quiz.html b/SRIP/Project-1 Issue Number 240/Quiz/quiz.html new file mode 100644 index 00000000..79c198fc --- /dev/null +++ b/SRIP/Project-1 Issue Number 240/Quiz/quiz.html @@ -0,0 +1,117 @@ + + + + + Quiz on Experiment- Perceptron + + + + + + + + +

Take a Quiz!

+ + + + + + + + + + + + + + +
+
+

1. A perceptron adds up all the weighted inputs it receives, and if it exceeds a certain value, it outputs a 1, otherwise outputs a 0.

+ +
    + + +
    + + +
    + + +
    + + +
+
+
+
+

2. Which of the following points will not form any perceptron line?

+ +
    + + +
    + + +
    + + +
+
+
+
+

3. Which of these points represent the perceptron line?

+ +
    + + +
    + + +
    + + +
    + + +
+
+
+
+

4. A perceptron classifier works,

+ +
    + + +
    + + +
    + + +
    + + +
+
+
+ +
+ +
+ + +
+
+
+
+ + +
+

+
+
+ + + \ No newline at end of file diff --git a/SRIP/Project-1 Issue Number 240/Quiz/quiz.js b/SRIP/Project-1 Issue Number 240/Quiz/quiz.js new file mode 100644 index 00000000..0d4fd43f --- /dev/null +++ b/SRIP/Project-1 Issue Number 240/Quiz/quiz.js @@ -0,0 +1,137 @@ +function submitQuiz() { + + // get each answer + function answerScore (qName) { + var radiosNo = document.getElementsByName(qName); + + for (var i = 0, length = radiosNo.length; i < length; i++) { + if (radiosNo[i].checked) { + // do something with radiosNo + var answerValue = Number(radiosNo[i].value); + } + } + // change NaNs to zero + if (isNaN(answerValue)) { + answerValue = 0; + } + return answerValue; + } + + // calc score with answerScore function + var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); + //console.log("CalcScore: " + calcScore); // it works! + + // function to return correct answer string + function correctAnswer (correctStringNo, qNumber) { + //console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below + return ("The correct answer for question #" + qNumber + ":  " + + (document.getElementById(correctStringNo).innerHTML) + ""); + } + + // print correct answers only if wrong (calls correctAnswer function) + if (answerScore('q1') === 0) { + document.getElementById('correctAnswer1').innerHTML = correctAnswer('correctString1', 1); + } + if (answerScore('q2') === 0) { + document.getElementById('correctAnswer2').innerHTML = correctAnswer('correctString2', 2); + } + if (answerScore('q3') === 0) { + document.getElementById('correctAnswer3').innerHTML = correctAnswer('correctString3', 3); + } + if (answerScore('q4') === 0) { + document.getElementById('correctAnswer4').innerHTML = correctAnswer('correctString4', 4); + } + + // calculate "possible score" integer + var questionCountArray = document.getElementsByClassName('question'); + + var questionCounter = 0; + for (var i = 0, length = questionCountArray.length; i < length; i++) { + questionCounter++; + } + + // show score as "score/possible score" + var showScore = "Your Score: " + calcScore +"/" + questionCounter; + // if 4/4, "perfect score!" + if (calcScore === questionCounter) { + showScore = showScore + "  Perfect Score!" + }; + document.getElementById('userScore').innerHTML = showScore; + } + +$(document).ready(function() { + + $('#submitButton').click(function() { + $(this).addClass('hide'); + }); + +}); + + function submitQuiz() { + //console.log('submitted'); + + // get each answer score + function answerScore (qName) { + var radiosNo = document.getElementsByName(qName); + + for (var i = 0, length = radiosNo.length; i < length; i++) { + if (radiosNo[i].checked) { + // do something with radiosNo + var answerValue = Number(radiosNo[i].value); + } + } + // change NaNs to zero + if (isNaN(answerValue)) { + answerValue = 0; + } + return answerValue; + } + + // calc score with answerScore function + var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); + //console.log("CalcScore: " + calcScore); // it works! + + // function to return correct answer string + function correctAnswer (correctStringNo, qNumber) { + //console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below + return ("The correct answer for question " + qNumber + ":  " + + (document.getElementById(correctStringNo).innerHTML) + ""); + } + + // print correct answers only if wrong (calls correctAnswer function) + if (answerScore('q1') === 0) { + document.getElementById('correctAnswer1').innerHTML = correctAnswer('correctString1', 1); + } + if (answerScore('q2') === 0) { + document.getElementById('correctAnswer2').innerHTML = correctAnswer('correctString2', 2); + } + if (answerScore('q3') === 0) { + document.getElementById('correctAnswer3').innerHTML = correctAnswer('correctString3', 3); + } + if (answerScore('q4') === 0) { + document.getElementById('correctAnswer4').innerHTML = correctAnswer('correctString4', 4); + } + + // calculate "possible score" integer + var questionCountArray = document.getElementsByClassName('question'); + + var questionCounter = 0; + for (var i = 0, length = questionCountArray.length; i < length; i++) { + questionCounter++; + } + + // show score as "score/possible score" + var showScore = "Your Score: " + calcScore +"/" + questionCounter; + if (calcScore === questionCounter) { + showScore = showScore + "  Perfect Score!" + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973) + }; + document.getElementById('userScore').innerHTML = showScore; + } + +$(document).ready(function() { + + $('#submitButton').click(function() { + $(this).addClass('hide'); + }); + +}); \ No newline at end of file diff --git a/SRIP/Project-1 Issue Number 240/README.txt b/SRIP/Project-1 Issue Number 240/README.txt new file mode 100644 index 00000000..561a02e8 --- /dev/null +++ b/SRIP/Project-1 Issue Number 240/README.txt @@ -0,0 +1,15 @@ +This is Readme file containing instruction for running the experiment: Perceptron + +TO RUN THE EXPERIMENT OF PERCEPTRON: +1. Download the SRIP folder +2. Go to Codes folder +3. Run the .html file + +HTML file will open in the browser and all functionalities will run from the HTML file. + + +TAKE A QUIZ OF THE EXPERIMENT: +1. Go to Quiz folder +2. Run quiz.html +3. Quiz will open in the browser +4. Give the quiz diff --git a/SRIP/Project-1 Issue Number 240/SRIP Project 1 Documentation.pdf b/SRIP/Project-1 Issue Number 240/SRIP Project 1 Documentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a3fde9f332c318eb9fa1ac7b4da5be2397bcb44d GIT binary patch literal 235622 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 literal 0 HcmV?d00001 diff --git a/SRIP/Project-1 Issue Number 240/Test Cases for Project 1.pdf b/SRIP/Project-1 Issue Number 240/Test Cases for Project 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2960b63fbdbf7765e49c7e9dffb9f80ec3009023 GIT binary patch literal 53126 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 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y *100, z * 100]; +} + +function rgb2lab(rgb) { + var xyz = rgb2xyz(rgb), + x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function rgb2lch(args) { + return lab2lch(rgb2lab(args)); +} + +function hsl2rgb(hsl) { + var h = hsl[0] / 360, + s = hsl[1] / 100, + l = hsl[2] / 100, + t1, t2, t3, rgb, val; + + if (s == 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) + t2 = l * (1 + s); + else + t2 = l + s - l * s; + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * - (i - 1); + t3 < 0 && t3++; + t3 > 1 && t3--; + + if (6 * t3 < 1) + val = t1 + (t2 - t1) * 6 * t3; + else if (2 * t3 < 1) + val = t2; + else if (3 * t3 < 2) + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + else + val = t1; + + rgb[i] = val * 255; + } + + return rgb; +} + +function hsl2hsv(hsl) { + var h = hsl[0], + s = hsl[1] / 100, + l = hsl[2] / 100, + sv, v; + + if(l === 0) { + // no need to do calc on black + // also avoids divide by 0 error + return [0, 0, 0]; + } + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + v = (l + s) / 2; + sv = (2 * s) / (l + s); + return [h, sv * 100, v * 100]; +} + +function hsl2hwb(args) { + return rgb2hwb(hsl2rgb(args)); +} + +function hsl2cmyk(args) { + return rgb2cmyk(hsl2rgb(args)); +} + +function hsl2keyword(args) { + return rgb2keyword(hsl2rgb(args)); +} + + +function hsv2rgb(hsv) { + var h = hsv[0] / 60, + s = hsv[1] / 100, + v = hsv[2] / 100, + hi = Math.floor(h) % 6; + + var f = h - Math.floor(h), + p = 255 * v * (1 - s), + q = 255 * v * (1 - (s * f)), + t = 255 * v * (1 - (s * (1 - f))), + v = 255 * v; + + switch(hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +} + +function hsv2hsl(hsv) { + var h = hsv[0], + s = hsv[1] / 100, + v = hsv[2] / 100, + sl, l; + + l = (2 - s) * v; + sl = s * v; + sl /= (l <= 1) ? l : 2 - l; + sl = sl || 0; + l /= 2; + return [h, sl * 100, l * 100]; +} + +function hsv2hwb(args) { + return rgb2hwb(hsv2rgb(args)) +} + +function hsv2cmyk(args) { + return rgb2cmyk(hsv2rgb(args)); +} + +function hsv2keyword(args) { + return rgb2keyword(hsv2rgb(args)); +} + +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +function hwb2rgb(hwb) { + var h = hwb[0] / 360, + wh = hwb[1] / 100, + bl = hwb[2] / 100, + ratio = wh + bl, + i, v, f, n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + if ((i & 0x01) != 0) { + f = 1 - f; + } + n = wh + f * (v - wh); // linear interpolation + + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + + return [r * 255, g * 255, b * 255]; +} + +function hwb2hsl(args) { + return rgb2hsl(hwb2rgb(args)); +} + +function hwb2hsv(args) { + return rgb2hsv(hwb2rgb(args)); +} + +function hwb2cmyk(args) { + return rgb2cmyk(hwb2rgb(args)); +} + +function hwb2keyword(args) { + return rgb2keyword(hwb2rgb(args)); +} + +function cmyk2rgb(cmyk) { + var c = cmyk[0] / 100, + m = cmyk[1] / 100, + y = cmyk[2] / 100, + k = cmyk[3] / 100, + r, g, b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + return [r * 255, g * 255, b * 255]; +} + +function cmyk2hsl(args) { + return rgb2hsl(cmyk2rgb(args)); +} + +function cmyk2hsv(args) { + return rgb2hsv(cmyk2rgb(args)); +} + +function cmyk2hwb(args) { + return rgb2hwb(cmyk2rgb(args)); +} + +function cmyk2keyword(args) { + return rgb2keyword(cmyk2rgb(args)); +} + + +function xyz2rgb(xyz) { + var x = xyz[0] / 100, + y = xyz[1] / 100, + z = xyz[2] / 100, + r, g, b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r = (r * 12.92); + + g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g = (g * 12.92); + + b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b = (b * 12.92); + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; +} + +function xyz2lab(xyz) { + var x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function xyz2lch(args) { + return lab2lch(xyz2lab(args)); +} + +function lab2xyz(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + x, y, z, y2; + + if (l <= 8) { + y = (l * 100) / 903.3; + y2 = (7.787 * (y / 100)) + (16 / 116); + } else { + y = 100 * Math.pow((l + 16) / 116, 3); + y2 = Math.pow(y / 100, 1/3); + } + + x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); + + z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); + + return [x, y, z]; +} + +function lab2lch(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + hr, h, c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + if (h < 0) { + h += 360; + } + c = Math.sqrt(a * a + b * b); + return [l, c, h]; +} + +function lab2rgb(args) { + return xyz2rgb(lab2xyz(args)); +} + +function lch2lab(lch) { + var l = lch[0], + c = lch[1], + h = lch[2], + a, b, hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + return [l, a, b]; +} + +function lch2xyz(args) { + return lab2xyz(lch2lab(args)); +} + +function lch2rgb(args) { + return lab2rgb(lch2lab(args)); +} + +function keyword2rgb(keyword) { + return cssKeywords[keyword]; +} + +function keyword2hsl(args) { + return rgb2hsl(keyword2rgb(args)); +} + +function keyword2hsv(args) { + return rgb2hsv(keyword2rgb(args)); +} + +function keyword2hwb(args) { + return rgb2hwb(keyword2rgb(args)); +} + +function keyword2cmyk(args) { + return rgb2cmyk(keyword2rgb(args)); +} + +function keyword2lab(args) { + return rgb2lab(keyword2rgb(args)); +} + +function keyword2xyz(args) { + return rgb2xyz(keyword2rgb(args)); +} + +var cssKeywords = { + aliceblue: [240,248,255], + antiquewhite: [250,235,215], + aqua: [0,255,255], + aquamarine: [127,255,212], + azure: [240,255,255], + beige: [245,245,220], + bisque: [255,228,196], + black: [0,0,0], + blanchedalmond: [255,235,205], + blue: [0,0,255], + blueviolet: [138,43,226], + brown: [165,42,42], + burlywood: [222,184,135], + cadetblue: [95,158,160], + chartreuse: [127,255,0], + chocolate: [210,105,30], + coral: [255,127,80], + cornflowerblue: [100,149,237], + cornsilk: [255,248,220], + crimson: [220,20,60], + cyan: [0,255,255], + darkblue: [0,0,139], + darkcyan: [0,139,139], + darkgoldenrod: [184,134,11], + darkgray: [169,169,169], + darkgreen: [0,100,0], + darkgrey: [169,169,169], + darkkhaki: [189,183,107], + darkmagenta: [139,0,139], + darkolivegreen: [85,107,47], + darkorange: [255,140,0], + darkorchid: [153,50,204], + darkred: [139,0,0], + darksalmon: [233,150,122], + darkseagreen: [143,188,143], + darkslateblue: [72,61,139], + darkslategray: [47,79,79], + darkslategrey: [47,79,79], + darkturquoise: [0,206,209], + darkviolet: [148,0,211], + deeppink: [255,20,147], + deepskyblue: [0,191,255], + dimgray: [105,105,105], + dimgrey: [105,105,105], + dodgerblue: [30,144,255], + firebrick: [178,34,34], + floralwhite: [255,250,240], + forestgreen: [34,139,34], + fuchsia: [255,0,255], + gainsboro: [220,220,220], + ghostwhite: [248,248,255], + gold: [255,215,0], + goldenrod: [218,165,32], + gray: [128,128,128], + green: [0,128,0], + greenyellow: [173,255,47], + grey: [128,128,128], + honeydew: [240,255,240], + hotpink: [255,105,180], + indianred: [205,92,92], + indigo: [75,0,130], + ivory: [255,255,240], + khaki: [240,230,140], + lavender: [230,230,250], + lavenderblush: [255,240,245], + lawngreen: [124,252,0], + lemonchiffon: [255,250,205], + lightblue: [173,216,230], + lightcoral: [240,128,128], + lightcyan: [224,255,255], + lightgoldenrodyellow: [250,250,210], + lightgray: [211,211,211], + lightgreen: [144,238,144], + lightgrey: [211,211,211], + lightpink: [255,182,193], + lightsalmon: [255,160,122], + lightseagreen: [32,178,170], + lightskyblue: [135,206,250], + lightslategray: [119,136,153], + lightslategrey: [119,136,153], + lightsteelblue: [176,196,222], + lightyellow: [255,255,224], + lime: [0,255,0], + limegreen: [50,205,50], + linen: [250,240,230], + magenta: [255,0,255], + maroon: [128,0,0], + mediumaquamarine: [102,205,170], + mediumblue: [0,0,205], + mediumorchid: [186,85,211], + mediumpurple: [147,112,219], + mediumseagreen: [60,179,113], + mediumslateblue: [123,104,238], + mediumspringgreen: [0,250,154], + mediumturquoise: [72,209,204], + mediumvioletred: [199,21,133], + midnightblue: [25,25,112], + mintcream: [245,255,250], + mistyrose: [255,228,225], + moccasin: [255,228,181], + navajowhite: [255,222,173], + navy: [0,0,128], + oldlace: [253,245,230], + olive: [128,128,0], + olivedrab: [107,142,35], + orange: [255,165,0], + orangered: [255,69,0], + orchid: [218,112,214], + palegoldenrod: [238,232,170], + palegreen: [152,251,152], + paleturquoise: [175,238,238], + palevioletred: [219,112,147], + papayawhip: [255,239,213], + peachpuff: [255,218,185], + peru: [205,133,63], + pink: [255,192,203], + plum: [221,160,221], + powderblue: [176,224,230], + purple: [128,0,128], + rebeccapurple: [102, 51, 153], + red: [255,0,0], + rosybrown: [188,143,143], + royalblue: [65,105,225], + saddlebrown: [139,69,19], + salmon: [250,128,114], + sandybrown: [244,164,96], + seagreen: [46,139,87], + seashell: [255,245,238], + sienna: [160,82,45], + silver: [192,192,192], + skyblue: [135,206,235], + slateblue: [106,90,205], + slategray: [112,128,144], + slategrey: [112,128,144], + snow: [255,250,250], + springgreen: [0,255,127], + steelblue: [70,130,180], + tan: [210,180,140], + teal: [0,128,128], + thistle: [216,191,216], + tomato: [255,99,71], + turquoise: [64,224,208], + violet: [238,130,238], + wheat: [245,222,179], + white: [255,255,255], + whitesmoke: [245,245,245], + yellow: [255,255,0], + yellowgreen: [154,205,50] +}; + +var reverseKeywords = {}; +for (var key in cssKeywords) { + reverseKeywords[JSON.stringify(cssKeywords[key])] = key; +} + +var convert = function() { + return new Converter(); +}; + +for (var func in conversions) { + // export Raw versions + convert[func + "Raw"] = (function(func) { + // accept array or plain args + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + return conversions[func](arg); + } + })(func); + + var pair = /(\w+)2(\w+)/.exec(func), + from = pair[1], + to = pair[2]; + + // export rgb2hsl and ["rgb"]["hsl"] + convert[from] = convert[from] || {}; + + convert[from][to] = convert[func] = (function(func) { + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + + var val = conversions[func](arg); + if (typeof val == "string" || val === undefined) + return val; // keyword + + for (var i = 0; i < val.length; i++) + val[i] = Math.round(val[i]); + return val; + } + })(func); +} + + +/* Converter does lazy conversion and caching */ +var Converter = function() { + this.convs = {}; +}; + +/* Either get the values for a space or + set the values for a space, depending on args */ +Converter.prototype.routeSpace = function(space, args) { + var values = args[0]; + if (values === undefined) { + // color.rgb() + return this.getValues(space); + } + // color.rgb(10, 10, 10) + if (typeof values == "number") { + values = Array.prototype.slice.call(args); + } + + return this.setValues(space, values); +}; + +/* Set the values for a space, invalidating cache */ +Converter.prototype.setValues = function(space, values) { + this.space = space; + this.convs = {}; + this.convs[space] = values; + return this; +}; + +/* Get the values for a space. If there's already + a conversion for the space, fetch it, otherwise + compute it */ +Converter.prototype.getValues = function(space) { + var vals = this.convs[space]; + if (!vals) { + var fspace = this.space, + from = this.convs[fspace]; + vals = convert[fspace][space](from); + + this.convs[space] = vals; + } + return vals; +}; + +["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { + Converter.prototype[space] = function(vals) { + return this.routeSpace(space, arguments); + }; +}); + +var colorConvert = convert; + +var colorName = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; + +/* MIT license */ + + +var colorString = { + getRgba: getRgba, + getHsla: getHsla, + getRgb: getRgb, + getHsl: getHsl, + getHwb: getHwb, + getAlpha: getAlpha, + + hexString: hexString, + rgbString: rgbString, + rgbaString: rgbaString, + percentString: percentString, + percentaString: percentaString, + hslString: hslString, + hslaString: hslaString, + hwbString: hwbString, + keyword: keyword +}; + +function getRgba(string) { + if (!string) { + return; + } + var abbr = /^#([a-fA-F0-9]{3,4})$/i, + hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i, + rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + keyword = /(\w+)/; + + var rgb = [0, 0, 0], + a = 1, + match = string.match(abbr), + hexAlpha = ""; + if (match) { + match = match[1]; + hexAlpha = match[3]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i] + match[i], 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(hex)) { + hexAlpha = match[2]; + match = match[1]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(rgba)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i + 1]); + } + a = parseFloat(match[4]); + } + else if (match = string.match(per)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); + } + a = parseFloat(match[4]); + } + else if (match = string.match(keyword)) { + if (match[1] == "transparent") { + return [0, 0, 0, 0]; + } + rgb = colorName[match[1]]; + if (!rgb) { + return; + } + } + + for (var i = 0; i < rgb.length; i++) { + rgb[i] = scale(rgb[i], 0, 255); + } + if (!a && a != 0) { + a = 1; + } + else { + a = scale(a, 0, 1); + } + rgb[3] = a; + return rgb; +} + +function getHsla(string) { + if (!string) { + return; + } + var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hsl); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + s = scale(parseFloat(match[2]), 0, 100), + l = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, s, l, a]; + } +} + +function getHwb(string) { + if (!string) { + return; + } + var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hwb); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + w = scale(parseFloat(match[2]), 0, 100), + b = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, w, b, a]; + } +} + +function getRgb(string) { + var rgba = getRgba(string); + return rgba && rgba.slice(0, 3); +} + +function getHsl(string) { + var hsla = getHsla(string); + return hsla && hsla.slice(0, 3); +} + +function getAlpha(string) { + var vals = getRgba(string); + if (vals) { + return vals[3]; + } + else if (vals = getHsla(string)) { + return vals[3]; + } + else if (vals = getHwb(string)) { + return vals[3]; + } +} + +// generators +function hexString(rgba, a) { + var a = (a !== undefined && rgba.length === 3) ? a : rgba[3]; + return "#" + hexDouble(rgba[0]) + + hexDouble(rgba[1]) + + hexDouble(rgba[2]) + + ( + (a >= 0 && a < 1) + ? hexDouble(Math.round(a * 255)) + : "" + ); +} + +function rgbString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return rgbaString(rgba, alpha); + } + return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; +} + +function rgbaString(rgba, alpha) { + if (alpha === undefined) { + alpha = (rgba[3] !== undefined ? rgba[3] : 1); + } + return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + + ", " + alpha + ")"; +} + +function percentString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return percentaString(rgba, alpha); + } + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + + return "rgb(" + r + "%, " + g + "%, " + b + "%)"; +} + +function percentaString(rgba, alpha) { + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; +} + +function hslString(hsla, alpha) { + if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { + return hslaString(hsla, alpha); + } + return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; +} + +function hslaString(hsla, alpha) { + if (alpha === undefined) { + alpha = (hsla[3] !== undefined ? hsla[3] : 1); + } + return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + + alpha + ")"; +} + +// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax +// (hwb have alpha optional & 1 is default value) +function hwbString(hwb, alpha) { + if (alpha === undefined) { + alpha = (hwb[3] !== undefined ? hwb[3] : 1); + } + return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" + + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; +} + +function keyword(rgb) { + return reverseNames[rgb.slice(0, 3)]; +} + +// helpers +function scale(num, min, max) { + return Math.min(Math.max(min, num), max); +} + +function hexDouble(num) { + var str = num.toString(16).toUpperCase(); + return (str.length < 2) ? "0" + str : str; +} + + +//create a list of reverse color names +var reverseNames = {}; +for (var name in colorName) { + reverseNames[colorName[name]] = name; +} + +/* MIT license */ + + + +var Color = function (obj) { + if (obj instanceof Color) { + return obj; + } + if (!(this instanceof Color)) { + return new Color(obj); + } + + this.valid = false; + this.values = { + rgb: [0, 0, 0], + hsl: [0, 0, 0], + hsv: [0, 0, 0], + hwb: [0, 0, 0], + cmyk: [0, 0, 0, 0], + alpha: 1 + }; + + // parse Color() argument + var vals; + if (typeof obj === 'string') { + vals = colorString.getRgba(obj); + if (vals) { + this.setValues('rgb', vals); + } else if (vals = colorString.getHsla(obj)) { + this.setValues('hsl', vals); + } else if (vals = colorString.getHwb(obj)) { + this.setValues('hwb', vals); + } + } else if (typeof obj === 'object') { + vals = obj; + if (vals.r !== undefined || vals.red !== undefined) { + this.setValues('rgb', vals); + } else if (vals.l !== undefined || vals.lightness !== undefined) { + this.setValues('hsl', vals); + } else if (vals.v !== undefined || vals.value !== undefined) { + this.setValues('hsv', vals); + } else if (vals.w !== undefined || vals.whiteness !== undefined) { + this.setValues('hwb', vals); + } else if (vals.c !== undefined || vals.cyan !== undefined) { + this.setValues('cmyk', vals); + } + } +}; + +Color.prototype = { + isValid: function () { + return this.valid; + }, + rgb: function () { + return this.setSpace('rgb', arguments); + }, + hsl: function () { + return this.setSpace('hsl', arguments); + }, + hsv: function () { + return this.setSpace('hsv', arguments); + }, + hwb: function () { + return this.setSpace('hwb', arguments); + }, + cmyk: function () { + return this.setSpace('cmyk', arguments); + }, + + rgbArray: function () { + return this.values.rgb; + }, + hslArray: function () { + return this.values.hsl; + }, + hsvArray: function () { + return this.values.hsv; + }, + hwbArray: function () { + var values = this.values; + if (values.alpha !== 1) { + return values.hwb.concat([values.alpha]); + } + return values.hwb; + }, + cmykArray: function () { + return this.values.cmyk; + }, + rgbaArray: function () { + var values = this.values; + return values.rgb.concat([values.alpha]); + }, + hslaArray: function () { + var values = this.values; + return values.hsl.concat([values.alpha]); + }, + alpha: function (val) { + if (val === undefined) { + return this.values.alpha; + } + this.setValues('alpha', val); + return this; + }, + + red: function (val) { + return this.setChannel('rgb', 0, val); + }, + green: function (val) { + return this.setChannel('rgb', 1, val); + }, + blue: function (val) { + return this.setChannel('rgb', 2, val); + }, + hue: function (val) { + if (val) { + val %= 360; + val = val < 0 ? 360 + val : val; + } + return this.setChannel('hsl', 0, val); + }, + saturation: function (val) { + return this.setChannel('hsl', 1, val); + }, + lightness: function (val) { + return this.setChannel('hsl', 2, val); + }, + saturationv: function (val) { + return this.setChannel('hsv', 1, val); + }, + whiteness: function (val) { + return this.setChannel('hwb', 1, val); + }, + blackness: function (val) { + return this.setChannel('hwb', 2, val); + }, + value: function (val) { + return this.setChannel('hsv', 2, val); + }, + cyan: function (val) { + return this.setChannel('cmyk', 0, val); + }, + magenta: function (val) { + return this.setChannel('cmyk', 1, val); + }, + yellow: function (val) { + return this.setChannel('cmyk', 2, val); + }, + black: function (val) { + return this.setChannel('cmyk', 3, val); + }, + + hexString: function () { + return colorString.hexString(this.values.rgb); + }, + rgbString: function () { + return colorString.rgbString(this.values.rgb, this.values.alpha); + }, + rgbaString: function () { + return colorString.rgbaString(this.values.rgb, this.values.alpha); + }, + percentString: function () { + return colorString.percentString(this.values.rgb, this.values.alpha); + }, + hslString: function () { + return colorString.hslString(this.values.hsl, this.values.alpha); + }, + hslaString: function () { + return colorString.hslaString(this.values.hsl, this.values.alpha); + }, + hwbString: function () { + return colorString.hwbString(this.values.hwb, this.values.alpha); + }, + keyword: function () { + return colorString.keyword(this.values.rgb, this.values.alpha); + }, + + rgbNumber: function () { + var rgb = this.values.rgb; + return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + }, + + luminosity: function () { + // http://www.w3.org/TR/WCAG20/#relativeluminancedef + var rgb = this.values.rgb; + var lum = []; + for (var i = 0; i < rgb.length; i++) { + var chan = rgb[i] / 255; + lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); + } + return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; + }, + + contrast: function (color2) { + // http://www.w3.org/TR/WCAG20/#contrast-ratiodef + var lum1 = this.luminosity(); + var lum2 = color2.luminosity(); + if (lum1 > lum2) { + return (lum1 + 0.05) / (lum2 + 0.05); + } + return (lum2 + 0.05) / (lum1 + 0.05); + }, + + level: function (color2) { + var contrastRatio = this.contrast(color2); + if (contrastRatio >= 7.1) { + return 'AAA'; + } + + return (contrastRatio >= 4.5) ? 'AA' : ''; + }, + + dark: function () { + // YIQ equation from http://24ways.org/2010/calculating-color-contrast + var rgb = this.values.rgb; + var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; + return yiq < 128; + }, + + light: function () { + return !this.dark(); + }, + + negate: function () { + var rgb = []; + for (var i = 0; i < 3; i++) { + rgb[i] = 255 - this.values.rgb[i]; + } + this.setValues('rgb', rgb); + return this; + }, + + lighten: function (ratio) { + var hsl = this.values.hsl; + hsl[2] += hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + darken: function (ratio) { + var hsl = this.values.hsl; + hsl[2] -= hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + saturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] += hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + desaturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] -= hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + whiten: function (ratio) { + var hwb = this.values.hwb; + hwb[1] += hwb[1] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + blacken: function (ratio) { + var hwb = this.values.hwb; + hwb[2] += hwb[2] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + greyscale: function () { + var rgb = this.values.rgb; + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; + this.setValues('rgb', [val, val, val]); + return this; + }, + + clearer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha - (alpha * ratio)); + return this; + }, + + opaquer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha + (alpha * ratio)); + return this; + }, + + rotate: function (degrees) { + var hsl = this.values.hsl; + var hue = (hsl[0] + degrees) % 360; + hsl[0] = hue < 0 ? 360 + hue : hue; + this.setValues('hsl', hsl); + return this; + }, + + /** + * Ported from sass implementation in C + * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 + */ + mix: function (mixinColor, weight) { + var color1 = this; + var color2 = mixinColor; + var p = weight === undefined ? 0.5 : weight; + + var w = 2 * p - 1; + var a = color1.alpha() - color2.alpha(); + + var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + return this + .rgb( + w1 * color1.red() + w2 * color2.red(), + w1 * color1.green() + w2 * color2.green(), + w1 * color1.blue() + w2 * color2.blue() + ) + .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); + }, + + toJSON: function () { + return this.rgb(); + }, + + clone: function () { + // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, + // making the final build way to big to embed in Chart.js. So let's do it manually, + // assuming that values to clone are 1 dimension arrays containing only numbers, + // except 'alpha' which is a number. + var result = new Color(); + var source = this.values; + var target = result.values; + var value, type; + + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + value = source[prop]; + type = ({}).toString.call(value); + if (type === '[object Array]') { + target[prop] = value.slice(0); + } else if (type === '[object Number]') { + target[prop] = value; + } else { + console.error('unexpected color value:', value); + } + } + } + + return result; + } +}; + +Color.prototype.spaces = { + rgb: ['red', 'green', 'blue'], + hsl: ['hue', 'saturation', 'lightness'], + hsv: ['hue', 'saturation', 'value'], + hwb: ['hue', 'whiteness', 'blackness'], + cmyk: ['cyan', 'magenta', 'yellow', 'black'] +}; + +Color.prototype.maxes = { + rgb: [255, 255, 255], + hsl: [360, 100, 100], + hsv: [360, 100, 100], + hwb: [360, 100, 100], + cmyk: [100, 100, 100, 100] +}; + +Color.prototype.getValues = function (space) { + var values = this.values; + var vals = {}; + + for (var i = 0; i < space.length; i++) { + vals[space.charAt(i)] = values[space][i]; + } + + if (values.alpha !== 1) { + vals.a = values.alpha; + } + + // {r: 255, g: 255, b: 255, a: 0.4} + return vals; +}; + +Color.prototype.setValues = function (space, vals) { + var values = this.values; + var spaces = this.spaces; + var maxes = this.maxes; + var alpha = 1; + var i; + + this.valid = true; + + if (space === 'alpha') { + alpha = vals; + } else if (vals.length) { + // [10, 10, 10] + values[space] = vals.slice(0, space.length); + alpha = vals[space.length]; + } else if (vals[space.charAt(0)] !== undefined) { + // {r: 10, g: 10, b: 10} + for (i = 0; i < space.length; i++) { + values[space][i] = vals[space.charAt(i)]; + } + + alpha = vals.a; + } else if (vals[spaces[space][0]] !== undefined) { + // {red: 10, green: 10, blue: 10} + var chans = spaces[space]; + + for (i = 0; i < space.length; i++) { + values[space][i] = vals[chans[i]]; + } + + alpha = vals.alpha; + } + + values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); + + if (space === 'alpha') { + return false; + } + + var capped; + + // cap values of the space prior converting all values + for (i = 0; i < space.length; i++) { + capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); + values[space][i] = Math.round(capped); + } + + // convert to all the other color spaces + for (var sname in spaces) { + if (sname !== space) { + values[sname] = colorConvert[space][sname](values[space]); + } + } + + return true; +}; + +Color.prototype.setSpace = function (space, args) { + var vals = args[0]; + + if (vals === undefined) { + // color.rgb() + return this.getValues(space); + } + + // color.rgb(10, 10, 10) + if (typeof vals === 'number') { + vals = Array.prototype.slice.call(args); + } + + this.setValues(space, vals); + return this; +}; + +Color.prototype.setChannel = function (space, index, val) { + var svalues = this.values[space]; + if (val === undefined) { + // color.red() + return svalues[index]; + } else if (val === svalues[index]) { + // color.red(color.red()) + return this; + } + + // color.red(100) + svalues[index] = val; + this.setValues(space, svalues); + + return this; +}; + +if (typeof window !== 'undefined') { + window.Color = Color; +} + +var chartjsColor = Color; + +/** + * @namespace Chart.helpers + */ +var helpers = { + /** + * An empty function that can be used, for example, for optional callback. + */ + noop: function() {}, + + /** + * Returns a unique id, sequentially generated from a global variable. + * @returns {number} + * @function + */ + uid: (function() { + var id = 0; + return function() { + return id++; + }; + }()), + + /** + * Returns true if `value` is neither null nor undefined, else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isNullOrUndef: function(value) { + return value === null || typeof value === 'undefined'; + }, + + /** + * Returns true if `value` is an array (including typed arrays), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @function + */ + isArray: function(value) { + if (Array.isArray && Array.isArray(value)) { + return true; + } + var type = Object.prototype.toString.call(value); + if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { + return true; + } + return false; + }, + + /** + * Returns true if `value` is an object (excluding null), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isObject: function(value) { + return value !== null && Object.prototype.toString.call(value) === '[object Object]'; + }, + + /** + * Returns true if `value` is a finite number, else returns false + * @param {*} value - The value to test. + * @returns {boolean} + */ + isFinite: function(value) { + return (typeof value === 'number' || value instanceof Number) && isFinite(value); + }, + + /** + * Returns `value` if defined, else returns `defaultValue`. + * @param {*} value - The value to return if defined. + * @param {*} defaultValue - The value to return if `value` is undefined. + * @returns {*} + */ + valueOrDefault: function(value, defaultValue) { + return typeof value === 'undefined' ? defaultValue : value; + }, + + /** + * Returns value at the given `index` in array if defined, else returns `defaultValue`. + * @param {Array} value - The array to lookup for value at `index`. + * @param {number} index - The index in `value` to lookup for value. + * @param {*} defaultValue - The value to return if `value[index]` is undefined. + * @returns {*} + */ + valueAtIndexOrDefault: function(value, index, defaultValue) { + return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); + }, + + /** + * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the + * value returned by `fn`. If `fn` is not a function, this method returns undefined. + * @param {function} fn - The function to call. + * @param {Array|undefined|null} args - The arguments with which `fn` should be called. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @returns {*} + */ + callback: function(fn, args, thisArg) { + if (fn && typeof fn.call === 'function') { + return fn.apply(thisArg, args); + } + }, + + /** + * Note(SB) for performance sake, this method should only be used when loopable type + * is unknown or in none intensive code (not called often and small loopable). Else + * it's preferable to use a regular for() loop and save extra function calls. + * @param {object|Array} loopable - The object or array to be iterated. + * @param {function} fn - The function to call for each item. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @param {boolean} [reverse] - If true, iterates backward on the loopable. + */ + each: function(loopable, fn, thisArg, reverse) { + var i, len, keys; + if (helpers.isArray(loopable)) { + len = loopable.length; + if (reverse) { + for (i = len - 1; i >= 0; i--) { + fn.call(thisArg, loopable[i], i); + } + } else { + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[i], i); + } + } + } else if (helpers.isObject(loopable)) { + keys = Object.keys(loopable); + len = keys.length; + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[keys[i]], keys[i]); + } + } + }, + + /** + * Returns true if the `a0` and `a1` arrays have the same content, else returns false. + * @see https://stackoverflow.com/a/14853974 + * @param {Array} a0 - The array to compare + * @param {Array} a1 - The array to compare + * @returns {boolean} + */ + arrayEquals: function(a0, a1) { + var i, ilen, v0, v1; + + if (!a0 || !a1 || a0.length !== a1.length) { + return false; + } + + for (i = 0, ilen = a0.length; i < ilen; ++i) { + v0 = a0[i]; + v1 = a1[i]; + + if (v0 instanceof Array && v1 instanceof Array) { + if (!helpers.arrayEquals(v0, v1)) { + return false; + } + } else if (v0 !== v1) { + // NOTE: two different object instances will never be equal: {x:20} != {x:20} + return false; + } + } + + return true; + }, + + /** + * Returns a deep copy of `source` without keeping references on objects and arrays. + * @param {*} source - The value to clone. + * @returns {*} + */ + clone: function(source) { + if (helpers.isArray(source)) { + return source.map(helpers.clone); + } + + if (helpers.isObject(source)) { + var target = {}; + var keys = Object.keys(source); + var klen = keys.length; + var k = 0; + + for (; k < klen; ++k) { + target[keys[k]] = helpers.clone(source[keys[k]]); + } + + return target; + } + + return source; + }, + + /** + * The default merger when Chart.helpers.merge is called without merger option. + * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. + * @private + */ + _merger: function(key, target, source, options) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.merge(tval, sval, options); + } else { + target[key] = helpers.clone(sval); + } + }, + + /** + * Merges source[key] in target[key] only if target[key] is undefined. + * @private + */ + _mergerIf: function(key, target, source) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.mergeIf(tval, sval); + } else if (!target.hasOwnProperty(key)) { + target[key] = helpers.clone(sval); + } + }, + + /** + * Recursively deep copies `source` properties into `target` with the given `options`. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @param {object} [options] - Merging options: + * @param {function} [options.merger] - The merge method (key, target, source, options) + * @returns {object} The `target` object. + */ + merge: function(target, source, options) { + var sources = helpers.isArray(source) ? source : [source]; + var ilen = sources.length; + var merge, i, keys, klen, k; + + if (!helpers.isObject(target)) { + return target; + } + + options = options || {}; + merge = options.merger || helpers._merger; + + for (i = 0; i < ilen; ++i) { + source = sources[i]; + if (!helpers.isObject(source)) { + continue; + } + + keys = Object.keys(source); + for (k = 0, klen = keys.length; k < klen; ++k) { + merge(keys[k], target, source, options); + } + } + + return target; + }, + + /** + * Recursively deep copies `source` properties into `target` *only* if not defined in target. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @returns {object} The `target` object. + */ + mergeIf: function(target, source) { + return helpers.merge(target, source, {merger: helpers._mergerIf}); + }, + + /** + * Applies the contents of two or more objects together into the first object. + * @param {object} target - The target object in which all objects are merged into. + * @param {object} arg1 - Object containing additional properties to merge in target. + * @param {object} argN - Additional objects containing properties to merge in target. + * @returns {object} The `target` object. + */ + extend: function(target) { + var setFn = function(value, key) { + target[key] = value; + }; + for (var i = 1, ilen = arguments.length; i < ilen; ++i) { + helpers.each(arguments[i], setFn); + } + return target; + }, + + /** + * Basic javascript inheritance based on the model created in Backbone.js + */ + inherits: function(extensions) { + var me = this; + var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { + return me.apply(this, arguments); + }; + + var Surrogate = function() { + this.constructor = ChartElement; + }; + + Surrogate.prototype = me.prototype; + ChartElement.prototype = new Surrogate(); + ChartElement.extend = helpers.inherits; + + if (extensions) { + helpers.extend(ChartElement.prototype, extensions); + } + + ChartElement.__super__ = me.prototype; + return ChartElement; + } +}; + +var helpers_core = helpers; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.callback instead. + * @function Chart.helpers.callCallback + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +helpers.callCallback = helpers.callback; + +/** + * Provided for backward compatibility, use Array.prototype.indexOf instead. + * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ + * @function Chart.helpers.indexOf + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.indexOf = function(array, item, fromIndex) { + return Array.prototype.indexOf.call(array, item, fromIndex); +}; + +/** + * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. + * @function Chart.helpers.getValueOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueOrDefault = helpers.valueOrDefault; + +/** + * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. + * @function Chart.helpers.getValueAtIndexOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + +/** + * Easing functions adapted from Robert Penner's easing equations. + * @namespace Chart.helpers.easingEffects + * @see http://www.robertpenner.com/easing/ + */ +var effects = { + linear: function(t) { + return t; + }, + + easeInQuad: function(t) { + return t * t; + }, + + easeOutQuad: function(t) { + return -t * (t - 2); + }, + + easeInOutQuad: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t; + } + return -0.5 * ((--t) * (t - 2) - 1); + }, + + easeInCubic: function(t) { + return t * t * t; + }, + + easeOutCubic: function(t) { + return (t = t - 1) * t * t + 1; + }, + + easeInOutCubic: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t; + } + return 0.5 * ((t -= 2) * t * t + 2); + }, + + easeInQuart: function(t) { + return t * t * t * t; + }, + + easeOutQuart: function(t) { + return -((t = t - 1) * t * t * t - 1); + }, + + easeInOutQuart: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t; + } + return -0.5 * ((t -= 2) * t * t * t - 2); + }, + + easeInQuint: function(t) { + return t * t * t * t * t; + }, + + easeOutQuint: function(t) { + return (t = t - 1) * t * t * t * t + 1; + }, + + easeInOutQuint: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t * t; + } + return 0.5 * ((t -= 2) * t * t * t * t + 2); + }, + + easeInSine: function(t) { + return -Math.cos(t * (Math.PI / 2)) + 1; + }, + + easeOutSine: function(t) { + return Math.sin(t * (Math.PI / 2)); + }, + + easeInOutSine: function(t) { + return -0.5 * (Math.cos(Math.PI * t) - 1); + }, + + easeInExpo: function(t) { + return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); + }, + + easeOutExpo: function(t) { + return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; + }, + + easeInOutExpo: function(t) { + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if ((t /= 0.5) < 1) { + return 0.5 * Math.pow(2, 10 * (t - 1)); + } + return 0.5 * (-Math.pow(2, -10 * --t) + 2); + }, + + easeInCirc: function(t) { + if (t >= 1) { + return t; + } + return -(Math.sqrt(1 - t * t) - 1); + }, + + easeOutCirc: function(t) { + return Math.sqrt(1 - (t = t - 1) * t); + }, + + easeInOutCirc: function(t) { + if ((t /= 0.5) < 1) { + return -0.5 * (Math.sqrt(1 - t * t) - 1); + } + return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + + easeInElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + }, + + easeOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; + }, + + easeInOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if ((t /= 0.5) === 2) { + return 1; + } + if (!p) { + p = 0.45; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + if (t < 1) { + return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function(t) { + var s = 1.70158; + return t * t * ((s + 1) * t - s); + }, + + easeOutBack: function(t) { + var s = 1.70158; + return (t = t - 1) * t * ((s + 1) * t + s) + 1; + }, + + easeInOutBack: function(t) { + var s = 1.70158; + if ((t /= 0.5) < 1) { + return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); + } + return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + + easeInBounce: function(t) { + return 1 - effects.easeOutBounce(1 - t); + }, + + easeOutBounce: function(t) { + if (t < (1 / 2.75)) { + return 7.5625 * t * t; + } + if (t < (2 / 2.75)) { + return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; + } + if (t < (2.5 / 2.75)) { + return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; + } + return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; + }, + + easeInOutBounce: function(t) { + if (t < 0.5) { + return effects.easeInBounce(t * 2) * 0.5; + } + return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; + } +}; + +var helpers_easing = { + effects: effects +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.easing.effects instead. + * @function Chart.helpers.easingEffects + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.easingEffects = effects; + +var PI = Math.PI; +var RAD_PER_DEG = PI / 180; +var DOUBLE_PI = PI * 2; +var HALF_PI = PI / 2; +var QUARTER_PI = PI / 4; +var TWO_THIRDS_PI = PI * 2 / 3; + +/** + * @namespace Chart.helpers.canvas + */ +var exports$1 = { + /** + * Clears the entire canvas associated to the given `chart`. + * @param {Chart} chart - The chart for which to clear the canvas. + */ + clear: function(chart) { + chart.ctx.clearRect(0, 0, chart.width, chart.height); + }, + + /** + * Creates a "path" for a rectangle with rounded corners at position (x, y) with a + * given size (width, height) and the same `radius` for all corners. + * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. + * @param {number} x - The x axis of the coordinate for the rectangle starting point. + * @param {number} y - The y axis of the coordinate for the rectangle starting point. + * @param {number} width - The rectangle's width. + * @param {number} height - The rectangle's height. + * @param {number} radius - The rounded amount (in pixels) for the four corners. + * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? + */ + roundedRect: function(ctx, x, y, width, height, radius) { + if (radius) { + var r = Math.min(radius, height / 2, width / 2); + var left = x + r; + var top = y + r; + var right = x + width - r; + var bottom = y + height - r; + + ctx.moveTo(x, top); + if (left < right && top < bottom) { + ctx.arc(left, top, r, -PI, -HALF_PI); + ctx.arc(right, top, r, -HALF_PI, 0); + ctx.arc(right, bottom, r, 0, HALF_PI); + ctx.arc(left, bottom, r, HALF_PI, PI); + } else if (left < right) { + ctx.moveTo(left, y); + ctx.arc(right, top, r, -HALF_PI, HALF_PI); + ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); + } else if (top < bottom) { + ctx.arc(left, top, r, -PI, 0); + ctx.arc(left, bottom, r, 0, PI); + } else { + ctx.arc(left, top, r, -PI, PI); + } + ctx.closePath(); + ctx.moveTo(x, y); + } else { + ctx.rect(x, y, width, height); + } + }, + + drawPoint: function(ctx, style, radius, x, y, rotation) { + var type, xOffset, yOffset, size, cornerRadius; + var rad = (rotation || 0) * RAD_PER_DEG; + + if (style && typeof style === 'object') { + type = style.toString(); + if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { + ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); + return; + } + } + + if (isNaN(radius) || radius <= 0) { + return; + } + + ctx.beginPath(); + + switch (style) { + // Default includes circle + default: + ctx.arc(x, y, radius, 0, DOUBLE_PI); + ctx.closePath(); + break; + case 'triangle': + ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + ctx.closePath(); + break; + case 'rectRounded': + // NOTE: the rounded rect implementation changed to use `arc` instead of + // `quadraticCurveTo` since it generates better results when rect is + // almost a circle. 0.516 (instead of 0.5) produces results with visually + // closer proportion to the previous impl and it is inscribed in the + // circle with `radius`. For more details, see the following PRs: + // https://github.com/chartjs/Chart.js/issues/5597 + // https://github.com/chartjs/Chart.js/issues/5858 + cornerRadius = radius * 0.516; + size = radius - cornerRadius; + xOffset = Math.cos(rad + QUARTER_PI) * size; + yOffset = Math.sin(rad + QUARTER_PI) * size; + ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); + ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); + ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); + ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); + ctx.closePath(); + break; + case 'rect': + if (!rotation) { + size = Math.SQRT1_2 * radius; + ctx.rect(x - size, y - size, 2 * size, 2 * size); + break; + } + rad += QUARTER_PI; + /* falls through */ + case 'rectRot': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + yOffset, y - xOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.lineTo(x - yOffset, y + xOffset); + ctx.closePath(); + break; + case 'crossRot': + rad += QUARTER_PI; + /* falls through */ + case 'cross': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'star': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + rad += QUARTER_PI; + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'line': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + break; + case 'dash': + ctx.moveTo(x, y); + ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); + break; + } + + ctx.fill(); + ctx.stroke(); + }, + + /** + * Returns true if the point is inside the rectangle + * @param {object} point - The point to test + * @param {object} area - The rectangle + * @returns {boolean} + * @private + */ + _isPointInArea: function(point, area) { + var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error. + + return point.x > area.left - epsilon && point.x < area.right + epsilon && + point.y > area.top - epsilon && point.y < area.bottom + epsilon; + }, + + clipArea: function(ctx, area) { + ctx.save(); + ctx.beginPath(); + ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); + ctx.clip(); + }, + + unclipArea: function(ctx) { + ctx.restore(); + }, + + lineTo: function(ctx, previous, target, flip) { + var stepped = target.steppedLine; + if (stepped) { + if (stepped === 'middle') { + var midpoint = (previous.x + target.x) / 2.0; + ctx.lineTo(midpoint, flip ? target.y : previous.y); + ctx.lineTo(midpoint, flip ? previous.y : target.y); + } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) { + ctx.lineTo(previous.x, target.y); + } else { + ctx.lineTo(target.x, previous.y); + } + ctx.lineTo(target.x, target.y); + return; + } + + if (!target.tension) { + ctx.lineTo(target.x, target.y); + return; + } + + ctx.bezierCurveTo( + flip ? previous.controlPointPreviousX : previous.controlPointNextX, + flip ? previous.controlPointPreviousY : previous.controlPointNextY, + flip ? target.controlPointNextX : target.controlPointPreviousX, + flip ? target.controlPointNextY : target.controlPointPreviousY, + target.x, + target.y); + } +}; + +var helpers_canvas = exports$1; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. + * @namespace Chart.helpers.clear + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.clear = exports$1.clear; + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. + * @namespace Chart.helpers.drawRoundedRectangle + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.drawRoundedRectangle = function(ctx) { + ctx.beginPath(); + exports$1.roundedRect.apply(exports$1, arguments); +}; + +var defaults = { + /** + * @private + */ + _set: function(scope, values) { + return helpers_core.merge(this[scope] || (this[scope] = {}), values); + } +}; + +defaults._set('global', { + defaultColor: 'rgba(0,0,0,0.1)', + defaultFontColor: '#666', + defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + defaultFontSize: 12, + defaultFontStyle: 'normal', + defaultLineHeight: 1.2, + showLines: true +}); + +var core_defaults = defaults; + +var valueOrDefault = helpers_core.valueOrDefault; + +/** + * Converts the given font object into a CSS font string. + * @param {object} font - A font object. + * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font + * @private + */ +function toFontString(font) { + if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) { + return null; + } + + return (font.style ? font.style + ' ' : '') + + (font.weight ? font.weight + ' ' : '') + + font.size + 'px ' + + font.family; +} + +/** + * @alias Chart.helpers.options + * @namespace + */ +var helpers_options = { + /** + * Converts the given line height `value` in pixels for a specific font `size`. + * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). + * @param {number} size - The font size (in pixels) used to resolve relative `value`. + * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid). + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height + * @since 2.7.0 + */ + toLineHeight: function(value, size) { + var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); + if (!matches || matches[1] === 'normal') { + return size * 1.2; + } + + value = +matches[2]; + + switch (matches[3]) { + case 'px': + return value; + case '%': + value /= 100; + break; + default: + break; + } + + return size * value; + }, + + /** + * Converts the given value into a padding object with pre-computed width/height. + * @param {number|object} value - If a number, set the value to all TRBL component, + * else, if and object, use defined properties and sets undefined ones to 0. + * @returns {object} The padding values (top, right, bottom, left, width, height) + * @since 2.7.0 + */ + toPadding: function(value) { + var t, r, b, l; + + if (helpers_core.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + top: t, + right: r, + bottom: b, + left: l, + height: t + b, + width: l + r + }; + }, + + /** + * Parses font options and returns the font object. + * @param {object} options - A object that contains font options to be parsed. + * @return {object} The font object. + * @todo Support font.* options and renamed to toFont(). + * @private + */ + _parseFont: function(options) { + var globalDefaults = core_defaults.global; + var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); + var font = { + family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily), + lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size), + size: size, + style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle), + weight: null, + string: '' + }; + + font.string = toFontString(font); + return font; + }, + + /** + * Evaluates the given `inputs` sequentially and returns the first defined value. + * @param {Array} inputs - An array of values, falling back to the last value. + * @param {object} [context] - If defined and the current value is a function, the value + * is called with `context` as first argument and the result becomes the new input. + * @param {number} [index] - If defined and the current value is an array, the value + * at `index` become the new input. + * @since 2.7.0 + */ + resolve: function(inputs, context, index) { + var i, ilen, value; + + for (i = 0, ilen = inputs.length; i < ilen; ++i) { + value = inputs[i]; + if (value === undefined) { + continue; + } + if (context !== undefined && typeof value === 'function') { + value = value(context); + } + if (index !== undefined && helpers_core.isArray(value)) { + value = value[index]; + } + if (value !== undefined) { + return value; + } + } + } +}; + +var helpers$1 = helpers_core; +var easing = helpers_easing; +var canvas = helpers_canvas; +var options = helpers_options; +helpers$1.easing = easing; +helpers$1.canvas = canvas; +helpers$1.options = options; + +function interpolate(start, view, model, ease) { + var keys = Object.keys(model); + var i, ilen, key, actual, origin, target, type, c0, c1; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + + target = model[key]; + + // if a value is added to the model after pivot() has been called, the view + // doesn't contain it, so let's initialize the view to the target value. + if (!view.hasOwnProperty(key)) { + view[key] = target; + } + + actual = view[key]; + + if (actual === target || key[0] === '_') { + continue; + } + + if (!start.hasOwnProperty(key)) { + start[key] = actual; + } + + origin = start[key]; + + type = typeof target; + + if (type === typeof origin) { + if (type === 'string') { + c0 = chartjsColor(origin); + if (c0.valid) { + c1 = chartjsColor(target); + if (c1.valid) { + view[key] = c1.mix(c0, ease).rgbString(); + continue; + } + } + } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) { + view[key] = origin + (target - origin) * ease; + continue; + } + } + + view[key] = target; + } +} + +var Element = function(configuration) { + helpers$1.extend(this, configuration); + this.initialize.apply(this, arguments); +}; + +helpers$1.extend(Element.prototype, { + + initialize: function() { + this.hidden = false; + }, + + pivot: function() { + var me = this; + if (!me._view) { + me._view = helpers$1.clone(me._model); + } + me._start = {}; + return me; + }, + + transition: function(ease) { + var me = this; + var model = me._model; + var start = me._start; + var view = me._view; + + // No animation -> No Transition + if (!model || ease === 1) { + me._view = model; + me._start = null; + return me; + } + + if (!view) { + view = me._view = {}; + } + + if (!start) { + start = me._start = {}; + } + + interpolate(start, view, model, ease); + + return me; + }, + + tooltipPosition: function() { + return { + x: this._model.x, + y: this._model.y + }; + }, + + hasValue: function() { + return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y); + } +}); + +Element.extend = helpers$1.inherits; + +var core_element = Element; + +var exports$2 = core_element.extend({ + chart: null, // the animation associated chart instance + currentStep: 0, // the current animation step + numSteps: 60, // default number of steps + easing: '', // the easing to use for this animation + render: null, // render function used by the animation service + + onAnimationProgress: null, // user specified callback to fire on each step of the animation + onAnimationComplete: null, // user specified callback to fire when the animation finishes +}); + +var core_animation = exports$2; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.Animation instead + * @prop Chart.Animation#animationObject + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$2.prototype, 'animationObject', { + get: function() { + return this; + } +}); + +/** + * Provided for backward compatibility, use Chart.Animation#chart instead + * @prop Chart.Animation#chartInstance + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$2.prototype, 'chartInstance', { + get: function() { + return this.chart; + }, + set: function(value) { + this.chart = value; + } +}); + +core_defaults._set('global', { + animation: { + duration: 1000, + easing: 'easeOutQuart', + onProgress: helpers$1.noop, + onComplete: helpers$1.noop + } +}); + +var core_animations = { + animations: [], + request: null, + + /** + * @param {Chart} chart - The chart to animate. + * @param {Chart.Animation} animation - The animation that we will animate. + * @param {number} duration - The animation duration in ms. + * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions + */ + addAnimation: function(chart, animation, duration, lazy) { + var animations = this.animations; + var i, ilen; + + animation.chart = chart; + animation.startTime = Date.now(); + animation.duration = duration; + + if (!lazy) { + chart.animating = true; + } + + for (i = 0, ilen = animations.length; i < ilen; ++i) { + if (animations[i].chart === chart) { + animations[i] = animation; + return; + } + } + + animations.push(animation); + + // If there are no animations queued, manually kickstart a digest, for lack of a better word + if (animations.length === 1) { + this.requestAnimationFrame(); + } + }, + + cancelAnimation: function(chart) { + var index = helpers$1.findIndex(this.animations, function(animation) { + return animation.chart === chart; + }); + + if (index !== -1) { + this.animations.splice(index, 1); + chart.animating = false; + } + }, + + requestAnimationFrame: function() { + var me = this; + if (me.request === null) { + // Skip animation frame requests until the active one is executed. + // This can happen when processing mouse events, e.g. 'mousemove' + // and 'mouseout' events will trigger multiple renders. + me.request = helpers$1.requestAnimFrame.call(window, function() { + me.request = null; + me.startDigest(); + }); + } + }, + + /** + * @private + */ + startDigest: function() { + var me = this; + + me.advance(); + + // Do we have more stuff to animate? + if (me.animations.length > 0) { + me.requestAnimationFrame(); + } + }, + + /** + * @private + */ + advance: function() { + var animations = this.animations; + var animation, chart, numSteps, nextStep; + var i = 0; + + // 1 animation per chart, so we are looping charts here + while (i < animations.length) { + animation = animations[i]; + chart = animation.chart; + numSteps = animation.numSteps; + + // Make sure that currentStep starts at 1 + // https://github.com/chartjs/Chart.js/issues/6104 + nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1; + animation.currentStep = Math.min(nextStep, numSteps); + + helpers$1.callback(animation.render, [chart, animation], chart); + helpers$1.callback(animation.onAnimationProgress, [animation], chart); + + if (animation.currentStep >= numSteps) { + helpers$1.callback(animation.onAnimationComplete, [animation], chart); + chart.animating = false; + animations.splice(i, 1); + } else { + ++i; + } + } + } +}; + +var resolve = helpers$1.options.resolve; + +var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; + +/** + * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', + * 'unshift') and notify the listener AFTER the array has been altered. Listeners are + * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. + */ +function listenArrayEvents(array, listener) { + if (array._chartjs) { + array._chartjs.listeners.push(listener); + return; + } + + Object.defineProperty(array, '_chartjs', { + configurable: true, + enumerable: false, + value: { + listeners: [listener] + } + }); + + arrayEvents.forEach(function(key) { + var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); + var base = array[key]; + + Object.defineProperty(array, key, { + configurable: true, + enumerable: false, + value: function() { + var args = Array.prototype.slice.call(arguments); + var res = base.apply(this, args); + + helpers$1.each(array._chartjs.listeners, function(object) { + if (typeof object[method] === 'function') { + object[method].apply(object, args); + } + }); + + return res; + } + }); + }); +} + +/** + * Removes the given array event listener and cleanup extra attached properties (such as + * the _chartjs stub and overridden methods) if array doesn't have any more listeners. + */ +function unlistenArrayEvents(array, listener) { + var stub = array._chartjs; + if (!stub) { + return; + } + + var listeners = stub.listeners; + var index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + + if (listeners.length > 0) { + return; + } + + arrayEvents.forEach(function(key) { + delete array[key]; + }); + + delete array._chartjs; +} + +// Base class for all dataset controllers (line, bar, etc) +var DatasetController = function(chart, datasetIndex) { + this.initialize(chart, datasetIndex); +}; + +helpers$1.extend(DatasetController.prototype, { + + /** + * Element type used to generate a meta dataset (e.g. Chart.element.Line). + * @type {Chart.core.element} + */ + datasetElementType: null, + + /** + * Element type used to generate a meta data (e.g. Chart.element.Point). + * @type {Chart.core.element} + */ + dataElementType: null, + + initialize: function(chart, datasetIndex) { + var me = this; + me.chart = chart; + me.index = datasetIndex; + me.linkScales(); + me.addElements(); + }, + + updateIndex: function(datasetIndex) { + this.index = datasetIndex; + }, + + linkScales: function() { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + + if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) { + meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; + } + if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) { + meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; + } + }, + + getDataset: function() { + return this.chart.data.datasets[this.index]; + }, + + getMeta: function() { + return this.chart.getDatasetMeta(this.index); + }, + + getScaleForId: function(scaleID) { + return this.chart.scales[scaleID]; + }, + + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().yAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getValueScale: function() { + return this.getScaleForId(this._getValueScaleId()); + }, + + /** + * @private + */ + _getIndexScale: function() { + return this.getScaleForId(this._getIndexScaleId()); + }, + + reset: function() { + this.update(true); + }, + + /** + * @private + */ + destroy: function() { + if (this._data) { + unlistenArrayEvents(this._data, this); + } + }, + + createMetaDataset: function() { + var me = this; + var type = me.datasetElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index + }); + }, + + createMetaData: function(index) { + var me = this; + var type = me.dataElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index, + _index: index + }); + }, + + addElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data || []; + var metaData = meta.data; + var i, ilen; + + for (i = 0, ilen = data.length; i < ilen; ++i) { + metaData[i] = metaData[i] || me.createMetaData(i); + } + + meta.dataset = meta.dataset || me.createMetaDataset(); + }, + + addElementAndReset: function(index) { + var element = this.createMetaData(index); + this.getMeta().data.splice(index, 0, element); + this.updateElement(element, index, true); + }, + + buildOrUpdateElements: function() { + var me = this; + var dataset = me.getDataset(); + var data = dataset.data || (dataset.data = []); + + // In order to correctly handle data addition/deletion animation (an thus simulate + // real-time charts), we need to monitor these data modifications and synchronize + // the internal meta data accordingly. + if (me._data !== data) { + if (me._data) { + // This case happens when the user replaced the data array instance. + unlistenArrayEvents(me._data, me); + } + + if (data && Object.isExtensible(data)) { + listenArrayEvents(data, me); + } + me._data = data; + } + + // Re-sync meta data in case the user replaced the data array or if we missed + // any updates and so make sure that we handle number of datapoints changing. + me.resyncElements(); + }, + + update: helpers$1.noop, + + transition: function(easingValue) { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + for (; i < ilen; ++i) { + elements[i].transition(easingValue); + } + + if (meta.dataset) { + meta.dataset.transition(easingValue); + } + }, + + draw: function() { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + if (meta.dataset) { + meta.dataset.draw(); + } + + for (; i < ilen; ++i) { + elements[i].draw(); + } + }, + + removeHoverStyle: function(element) { + helpers$1.merge(element._model, element.$previousStyle || {}); + delete element.$previousStyle; + }, + + setHoverStyle: function(element) { + var dataset = this.chart.data.datasets[element._datasetIndex]; + var index = element._index; + var custom = element.custom || {}; + var model = element._model; + var getHoverColor = helpers$1.getHoverColor; + + element.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth + }; + + model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index); + model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index); + model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index); + }, + + /** + * @private + */ + resyncElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data; + var numMeta = meta.data.length; + var numData = data.length; + + if (numData < numMeta) { + meta.data.splice(numData, numMeta - numData); + } else if (numData > numMeta) { + me.insertElements(numMeta, numData - numMeta); + } + }, + + /** + * @private + */ + insertElements: function(start, count) { + for (var i = 0; i < count; ++i) { + this.addElementAndReset(start + i); + } + }, + + /** + * @private + */ + onDataPush: function() { + var count = arguments.length; + this.insertElements(this.getDataset().data.length - count, count); + }, + + /** + * @private + */ + onDataPop: function() { + this.getMeta().data.pop(); + }, + + /** + * @private + */ + onDataShift: function() { + this.getMeta().data.shift(); + }, + + /** + * @private + */ + onDataSplice: function(start, count) { + this.getMeta().data.splice(start, count); + this.insertElements(start, arguments.length - 2); + }, + + /** + * @private + */ + onDataUnshift: function() { + this.insertElements(0, arguments.length); + } +}); + +DatasetController.extend = helpers$1.inherits; + +var core_datasetController = DatasetController; + +core_defaults._set('global', { + elements: { + arc: { + backgroundColor: core_defaults.global.defaultColor, + borderColor: '#fff', + borderWidth: 2, + borderAlign: 'center' + } + } +}); + +var element_arc = core_element.extend({ + inLabelRange: function(mouseX) { + var vm = this._view; + + if (vm) { + return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); + } + return false; + }, + + inRange: function(chartX, chartY) { + var vm = this._view; + + if (vm) { + var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY}); + var angle = pointRelativePosition.angle; + var distance = pointRelativePosition.distance; + + // Sanitise angle range + var startAngle = vm.startAngle; + var endAngle = vm.endAngle; + while (endAngle < startAngle) { + endAngle += 2.0 * Math.PI; + } + while (angle > endAngle) { + angle -= 2.0 * Math.PI; + } + while (angle < startAngle) { + angle += 2.0 * Math.PI; + } + + // Check if within the range of the open/close angle + var betweenAngles = (angle >= startAngle && angle <= endAngle); + var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); + + return (betweenAngles && withinRadius); + } + return false; + }, + + getCenterPoint: function() { + var vm = this._view; + var halfAngle = (vm.startAngle + vm.endAngle) / 2; + var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; + return { + x: vm.x + Math.cos(halfAngle) * halfRadius, + y: vm.y + Math.sin(halfAngle) * halfRadius + }; + }, + + getArea: function() { + var vm = this._view; + return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); + }, + + tooltipPosition: function() { + var vm = this._view; + var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); + var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; + + return { + x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), + y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var sA = vm.startAngle; + var eA = vm.endAngle; + var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0; + var angleMargin; + + ctx.save(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.fillStyle = vm.backgroundColor; + ctx.fill(); + + if (vm.borderWidth) { + if (vm.borderAlign === 'inner') { + // Draw an inner border by cliping the arc and drawing a double-width border + // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders + ctx.beginPath(); + angleMargin = pixelMargin / vm.outerRadius; + ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin); + if (vm.innerRadius > pixelMargin) { + angleMargin = pixelMargin / vm.innerRadius; + ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true); + } else { + ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2); + } + ctx.closePath(); + ctx.clip(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.lineWidth = vm.borderWidth * 2; + ctx.lineJoin = 'round'; + } else { + ctx.lineWidth = vm.borderWidth; + ctx.lineJoin = 'bevel'; + } + + ctx.strokeStyle = vm.borderColor; + ctx.stroke(); + } + + ctx.restore(); + } +}); + +var valueOrDefault$1 = helpers$1.valueOrDefault; + +var defaultColor = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + line: { + tension: 0.4, + backgroundColor: defaultColor, + borderWidth: 3, + borderColor: defaultColor, + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + capBezierPoints: true, + fill: true, // do we fill in the area between the line and its base axis + } + } +}); + +var element_line = core_element.extend({ + draw: function() { + var me = this; + var vm = me._view; + var ctx = me._chart.ctx; + var spanGaps = vm.spanGaps; + var points = me._children.slice(); // clone array + var globalDefaults = core_defaults.global; + var globalOptionLineElements = globalDefaults.elements.line; + var lastDrawnIndex = -1; + var index, current, previous, currentVM; + + // If we are looping, adding the first point again + if (me._loop && points.length) { + points.push(points[0]); + } + + ctx.save(); + + // Stroke Line Options + ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; + + // IE 9 and 10 do not support line dash + if (ctx.setLineDash) { + ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); + } + + ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset); + ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; + ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth); + ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; + + // Stroke Line + ctx.beginPath(); + lastDrawnIndex = -1; + + for (index = 0; index < points.length; ++index) { + current = points[index]; + previous = helpers$1.previousItem(points, index); + currentVM = current._view; + + // First point moves to it's starting position no matter what + if (index === 0) { + if (!currentVM.skip) { + ctx.moveTo(currentVM.x, currentVM.y); + lastDrawnIndex = index; + } + } else { + previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; + + if (!currentVM.skip) { + if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { + // There was a gap and this is the first point after the gap + ctx.moveTo(currentVM.x, currentVM.y); + } else { + // Line to next point + helpers$1.canvas.lineTo(ctx, previous._view, current._view); + } + lastDrawnIndex = index; + } + } + } + + ctx.stroke(); + ctx.restore(); + } +}); + +var valueOrDefault$2 = helpers$1.valueOrDefault; + +var defaultColor$1 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + point: { + radius: 3, + pointStyle: 'circle', + backgroundColor: defaultColor$1, + borderColor: defaultColor$1, + borderWidth: 1, + // Hover + hitRadius: 1, + hoverRadius: 4, + hoverBorderWidth: 1 + } + } +}); + +function xRange(mouseX) { + var vm = this._view; + return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false; +} + +function yRange(mouseY) { + var vm = this._view; + return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false; +} + +var element_point = core_element.extend({ + inRange: function(mouseX, mouseY) { + var vm = this._view; + return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; + }, + + inLabelRange: xRange, + inXRange: xRange, + inYRange: yRange, + + getCenterPoint: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + }, + + getArea: function() { + return Math.PI * Math.pow(this._view.radius, 2); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y, + padding: vm.radius + vm.borderWidth + }; + }, + + draw: function(chartArea) { + var vm = this._view; + var ctx = this._chart.ctx; + var pointStyle = vm.pointStyle; + var rotation = vm.rotation; + var radius = vm.radius; + var x = vm.x; + var y = vm.y; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow + + if (vm.skip) { + return; + } + + // Clipping for Points. + if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) { + ctx.strokeStyle = vm.borderColor || defaultColor; + ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth); + ctx.fillStyle = vm.backgroundColor || defaultColor; + helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation); + } + } +}); + +var defaultColor$2 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + rectangle: { + backgroundColor: defaultColor$2, + borderColor: defaultColor$2, + borderSkipped: 'bottom', + borderWidth: 0 + } + } +}); + +function isVertical(vm) { + return vm && vm.width !== undefined; +} + +/** + * Helper function to get the bounds of the bar regardless of the orientation + * @param bar {Chart.Element.Rectangle} the bar + * @return {Bounds} bounds of the bar + * @private + */ +function getBarBounds(vm) { + var x1, x2, y1, y2, half; + + if (isVertical(vm)) { + half = vm.width / 2; + x1 = vm.x - half; + x2 = vm.x + half; + y1 = Math.min(vm.y, vm.base); + y2 = Math.max(vm.y, vm.base); + } else { + half = vm.height / 2; + x1 = Math.min(vm.x, vm.base); + x2 = Math.max(vm.x, vm.base); + y1 = vm.y - half; + y2 = vm.y + half; + } + + return { + left: x1, + top: y1, + right: x2, + bottom: y2 + }; +} + +function swap(orig, v1, v2) { + return orig === v1 ? v2 : orig === v2 ? v1 : orig; +} + +function parseBorderSkipped(vm) { + var edge = vm.borderSkipped; + var res = {}; + + if (!edge) { + return res; + } + + if (vm.horizontal) { + if (vm.base > vm.x) { + edge = swap(edge, 'left', 'right'); + } + } else if (vm.base < vm.y) { + edge = swap(edge, 'bottom', 'top'); + } + + res[edge] = true; + return res; +} + +function parseBorderWidth(vm, maxW, maxH) { + var value = vm.borderWidth; + var skip = parseBorderSkipped(vm); + var t, r, b, l; + + if (helpers$1.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t, + r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r, + b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b, + l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l + }; +} + +function boundingRects(vm) { + var bounds = getBarBounds(vm); + var width = bounds.right - bounds.left; + var height = bounds.bottom - bounds.top; + var border = parseBorderWidth(vm, width / 2, height / 2); + + return { + outer: { + x: bounds.left, + y: bounds.top, + w: width, + h: height + }, + inner: { + x: bounds.left + border.l, + y: bounds.top + border.t, + w: width - border.l - border.r, + h: height - border.t - border.b + } + }; +} + +function inRange(vm, x, y) { + var skipX = x === null; + var skipY = y === null; + var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm); + + return bounds + && (skipX || x >= bounds.left && x <= bounds.right) + && (skipY || y >= bounds.top && y <= bounds.bottom); +} + +var element_rectangle = core_element.extend({ + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var rects = boundingRects(vm); + var outer = rects.outer; + var inner = rects.inner; + + ctx.fillStyle = vm.backgroundColor; + ctx.fillRect(outer.x, outer.y, outer.w, outer.h); + + if (outer.w === inner.w && outer.h === inner.h) { + return; + } + + ctx.save(); + ctx.beginPath(); + ctx.rect(outer.x, outer.y, outer.w, outer.h); + ctx.clip(); + ctx.fillStyle = vm.borderColor; + ctx.rect(inner.x, inner.y, inner.w, inner.h); + ctx.fill('evenodd'); + ctx.restore(); + }, + + height: function() { + var vm = this._view; + return vm.base - vm.y; + }, + + inRange: function(mouseX, mouseY) { + return inRange(this._view, mouseX, mouseY); + }, + + inLabelRange: function(mouseX, mouseY) { + var vm = this._view; + return isVertical(vm) + ? inRange(vm, mouseX, null) + : inRange(vm, null, mouseY); + }, + + inXRange: function(mouseX) { + return inRange(this._view, mouseX, null); + }, + + inYRange: function(mouseY) { + return inRange(this._view, null, mouseY); + }, + + getCenterPoint: function() { + var vm = this._view; + var x, y; + if (isVertical(vm)) { + x = vm.x; + y = (vm.y + vm.base) / 2; + } else { + x = (vm.x + vm.base) / 2; + y = vm.y; + } + + return {x: x, y: y}; + }, + + getArea: function() { + var vm = this._view; + + return isVertical(vm) + ? vm.width * Math.abs(vm.y - vm.base) + : vm.height * Math.abs(vm.x - vm.base); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + } +}); + +var elements = {}; +var Arc = element_arc; +var Line = element_line; +var Point = element_point; +var Rectangle = element_rectangle; +elements.Arc = Arc; +elements.Line = Line; +elements.Point = Point; +elements.Rectangle = Rectangle; + +var resolve$1 = helpers$1.options.resolve; + +core_defaults._set('bar', { + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }], + + yAxes: [{ + type: 'linear' + }] + } +}); + +/** + * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. + * @private + */ +function computeMinSampleSize(scale, pixels) { + var min = scale.isHorizontal() ? scale.width : scale.height; + var ticks = scale.getTicks(); + var prev, curr, i, ilen; + + for (i = 1, ilen = pixels.length; i < ilen; ++i) { + min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1])); + } + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + curr = scale.getPixelForTick(i); + min = i > 0 ? Math.min(min, curr - prev) : min; + prev = curr; + } + + return min; +} + +/** + * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, + * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This + * mode currently always generates bars equally sized (until we introduce scriptable options?). + * @private + */ +function computeFitCategoryTraits(index, ruler, options) { + var thickness = options.barThickness; + var count = ruler.stackCount; + var curr = ruler.pixels[index]; + var size, ratio; + + if (helpers$1.isNullOrUndef(thickness)) { + size = ruler.min * options.categoryPercentage; + ratio = options.barPercentage; + } else { + // When bar thickness is enforced, category and bar percentages are ignored. + // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') + // and deprecate barPercentage since this value is ignored when thickness is absolute. + size = thickness * count; + ratio = 1; + } + + return { + chunk: size / count, + ratio: ratio, + start: curr - (size / 2) + }; +} + +/** + * Computes an "optimal" category that globally arranges bars side by side (no gap when + * percentage options are 1), based on the previous and following categories. This mode + * generates bars with different widths when data are not evenly spaced. + * @private + */ +function computeFlexCategoryTraits(index, ruler, options) { + var pixels = ruler.pixels; + var curr = pixels[index]; + var prev = index > 0 ? pixels[index - 1] : null; + var next = index < pixels.length - 1 ? pixels[index + 1] : null; + var percent = options.categoryPercentage; + var start, size; + + if (prev === null) { + // first data: its size is double based on the next point or, + // if it's also the last data, we use the scale size. + prev = curr - (next === null ? ruler.end - ruler.start : next - curr); + } + + if (next === null) { + // last data: its size is also double based on the previous point. + next = curr + curr - prev; + } + + start = curr - (curr - Math.min(prev, next)) / 2 * percent; + size = Math.abs(next - prev) / 2 * percent; + + return { + chunk: size / ruler.stackCount, + ratio: options.barPercentage, + start: start + }; +} + +var controller_bar = core_datasetController.extend({ + + dataElementType: elements.Rectangle, + + initialize: function() { + var me = this; + var meta; + + core_datasetController.prototype.initialize.apply(me, arguments); + + meta = me.getMeta(); + meta.stack = me.getDataset().stack; + meta.bar = true; + }, + + update: function(reset) { + var me = this; + var rects = me.getMeta().data; + var i, ilen; + + me._ruler = me.getRuler(); + + for (i = 0, ilen = rects.length; i < ilen; ++i) { + me.updateElement(rects[i], i, reset); + } + }, + + updateElement: function(rectangle, index, reset) { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + var options = me._resolveElementOptions(rectangle, index); + + rectangle._xScale = me.getScaleForId(meta.xAxisID); + rectangle._yScale = me.getScaleForId(meta.yAxisID); + rectangle._datasetIndex = me.index; + rectangle._index = index; + rectangle._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderSkipped: options.borderSkipped, + borderWidth: options.borderWidth, + datasetLabel: dataset.label, + label: me.chart.data.labels[index] + }; + + me._updateElementGeometry(rectangle, index, reset); + + rectangle.pivot(); + }, + + /** + * @private + */ + _updateElementGeometry: function(rectangle, index, reset) { + var me = this; + var model = rectangle._model; + var vscale = me._getValueScale(); + var base = vscale.getBasePixel(); + var horizontal = vscale.isHorizontal(); + var ruler = me._ruler || me.getRuler(); + var vpixels = me.calculateBarValuePixels(me.index, index); + var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); + + model.horizontal = horizontal; + model.base = reset ? base : vpixels.base; + model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; + model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; + model.height = horizontal ? ipixels.size : undefined; + model.width = horizontal ? undefined : ipixels.size; + }, + + /** + * Returns the stacks based on groups and bar visibility. + * @param {number} [last] - The dataset index + * @returns {string[]} The list of stack IDs + * @private + */ + _getStacks: function(last) { + var me = this; + var chart = me.chart; + var scale = me._getIndexScale(); + var stacked = scale.options.stacked; + var ilen = last === undefined ? chart.data.datasets.length : last + 1; + var stacks = []; + var i, meta; + + for (i = 0; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + if (meta.bar && chart.isDatasetVisible(i) && + (stacked === false || + (stacked === true && stacks.indexOf(meta.stack) === -1) || + (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { + stacks.push(meta.stack); + } + } + + return stacks; + }, + + /** + * Returns the effective number of stacks based on groups and bar visibility. + * @private + */ + getStackCount: function() { + return this._getStacks().length; + }, + + /** + * Returns the stack index for the given dataset based on groups and bar visibility. + * @param {number} [datasetIndex] - The dataset index + * @param {string} [name] - The stack name to find + * @returns {number} The stack index + * @private + */ + getStackIndex: function(datasetIndex, name) { + var stacks = this._getStacks(datasetIndex); + var index = (name !== undefined) + ? stacks.indexOf(name) + : -1; // indexOf returns -1 if element is not present + + return (index === -1) + ? stacks.length - 1 + : index; + }, + + /** + * @private + */ + getRuler: function() { + var me = this; + var scale = me._getIndexScale(); + var stackCount = me.getStackCount(); + var datasetIndex = me.index; + var isHorizontal = scale.isHorizontal(); + var start = isHorizontal ? scale.left : scale.top; + var end = start + (isHorizontal ? scale.width : scale.height); + var pixels = []; + var i, ilen, min; + + for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { + pixels.push(scale.getPixelForValue(null, i, datasetIndex)); + } + + min = helpers$1.isNullOrUndef(scale.options.barThickness) + ? computeMinSampleSize(scale, pixels) + : -1; + + return { + min: min, + pixels: pixels, + start: start, + end: end, + stackCount: stackCount, + scale: scale + }; + }, + + /** + * Note: pixel values are not clamped to the scale area. + * @private + */ + calculateBarValuePixels: function(datasetIndex, index) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var scale = me._getValueScale(); + var isHorizontal = scale.isHorizontal(); + var datasets = chart.data.datasets; + var value = +scale.getRightValue(datasets[datasetIndex].data[index]); + var minBarLength = scale.options.minBarLength; + var stacked = scale.options.stacked; + var stack = meta.stack; + var start = 0; + var i, imeta, ivalue, base, head, size; + + if (stacked || (stacked === undefined && stack !== undefined)) { + for (i = 0; i < datasetIndex; ++i) { + imeta = chart.getDatasetMeta(i); + + if (imeta.bar && + imeta.stack === stack && + imeta.controller._getValueScaleId() === scale.id && + chart.isDatasetVisible(i)) { + + ivalue = +scale.getRightValue(datasets[i].data[index]); + if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { + start += ivalue; + } + } + } + } + + base = scale.getPixelForValue(start); + head = scale.getPixelForValue(start + value); + size = head - base; + + if (minBarLength !== undefined && Math.abs(size) < minBarLength) { + size = minBarLength; + if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) { + head = base - minBarLength; + } else { + head = base + minBarLength; + } + } + + return { + size: size, + base: base, + head: head, + center: head + size / 2 + }; + }, + + /** + * @private + */ + calculateBarIndexPixels: function(datasetIndex, index, ruler) { + var me = this; + var options = ruler.scale.options; + var range = options.barThickness === 'flex' + ? computeFlexCategoryTraits(index, ruler, options) + : computeFitCategoryTraits(index, ruler, options); + + var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); + var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); + var size = Math.min( + helpers$1.valueOrDefault(options.maxBarThickness, Infinity), + range.chunk * range.ratio); + + return { + base: center - size / 2, + head: center + size / 2, + center: center, + size: size + }; + }, + + draw: function() { + var me = this; + var chart = me.chart; + var scale = me._getValueScale(); + var rects = me.getMeta().data; + var dataset = me.getDataset(); + var ilen = rects.length; + var i = 0; + + helpers$1.canvas.clipArea(chart.ctx, chart.chartArea); + + for (; i < ilen; ++i) { + if (!isNaN(scale.getRightValue(dataset.data[i]))) { + rects[i].draw(); + } + } + + helpers$1.canvas.unclipArea(chart.ctx); + }, + + /** + * @private + */ + _resolveElementOptions: function(rectangle, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = rectangle.custom || {}; + var options = chart.options.elements.rectangle; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderSkipped', + 'borderWidth' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$1([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + } +}); + +var valueOrDefault$3 = helpers$1.valueOrDefault; +var resolve$2 = helpers$1.options.resolve; + +core_defaults._set('bubble', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + type: 'linear', // bubble should probably use a linear scale by default + position: 'bottom', + id: 'x-axis-0' // need an ID so datasets can reference the scale + }], + yAxes: [{ + type: 'linear', + position: 'left', + id: 'y-axis-0' + }] + }, + + tooltips: { + callbacks: { + title: function() { + // Title doesn't make sense for scatter since we format the data as a point + return ''; + }, + label: function(item, data) { + var datasetLabel = data.datasets[item.datasetIndex].label || ''; + var dataPoint = data.datasets[item.datasetIndex].data[item.index]; + return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; + } + } + } +}); + +var controller_bubble = core_datasetController.extend({ + /** + * @protected + */ + dataElementType: elements.Point, + + /** + * @protected + */ + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var points = meta.data; + + // Update Points + helpers$1.each(points, function(point, index) { + me.updateElement(point, index, reset); + }); + }, + + /** + * @protected + */ + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var xScale = me.getScaleForId(meta.xAxisID); + var yScale = me.getScaleForId(meta.yAxisID); + var options = me._resolveElementOptions(point, index); + var data = me.getDataset().data[index]; + var dsIndex = me.index; + + var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); + var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); + + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = dsIndex; + point._index = index; + point._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + hitRadius: options.hitRadius, + pointStyle: options.pointStyle, + rotation: options.rotation, + radius: reset ? 0 : options.radius, + skip: custom.skip || isNaN(x) || isNaN(y), + x: x, + y: y, + }; + + point.pivot(); + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth); + model.radius = options.radius + options.hoverRadius; + }, + + /** + * @private + */ + _resolveElementOptions: function(point, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = point.custom || {}; + var options = chart.options.elements.point; + var data = dataset.data[index]; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + 'hoverRadius', + 'hitRadius', + 'pointStyle', + 'rotation' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$2([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + // Custom radius resolution + values.radius = resolve$2([ + custom.radius, + data ? data.r : undefined, + dataset.radius, + options.radius + ], context, index); + + return values; + } +}); + +var resolve$3 = helpers$1.options.resolve; +var valueOrDefault$4 = helpers$1.valueOrDefault; + +core_defaults._set('doughnut', { + animation: { + // Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + // Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false + }, + hover: { + mode: 'single' + }, + legendCallback: function(chart) { + var text = []; + text.push('
    '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
  • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
  • '); + } + } + + text.push('
'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc && arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + // toggle visibility of index if exists + if (meta.data[index]) { + meta.data[index].hidden = !meta.data[index].hidden; + } + } + + chart.update(); + } + }, + + // The percentage of the chart that we cut out of the middle. + cutoutPercentage: 50, + + // The rotation of the chart, where the first data arc begins. + rotation: Math.PI * -0.5, + + // The total circumference of the chart. + circumference: Math.PI * 2.0, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(tooltipItem, data) { + var dataLabel = data.labels[tooltipItem.index]; + var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; + + if (helpers$1.isArray(dataLabel)) { + // show value on first line of multiline label + // need to clone because we are changing the value + dataLabel = dataLabel.slice(); + dataLabel[0] += value; + } else { + dataLabel += value; + } + + return dataLabel; + } + } + } +}); + +var controller_doughnut = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly + getRingIndex: function(datasetIndex) { + var ringIndex = 0; + + for (var j = 0; j < datasetIndex; ++j) { + if (this.chart.isDatasetVisible(j)) { + ++ringIndex; + } + } + + return ringIndex; + }, + + update: function(reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var availableWidth = chartArea.right - chartArea.left; + var availableHeight = chartArea.bottom - chartArea.top; + var minSize = Math.min(availableWidth, availableHeight); + var offset = {x: 0, y: 0}; + var meta = me.getMeta(); + var arcs = meta.data; + var cutoutPercentage = opts.cutoutPercentage; + var circumference = opts.circumference; + var chartWeight = me._getRingWeight(me.index); + var i, ilen; + + // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc + if (circumference < Math.PI * 2.0) { + var startAngle = opts.rotation % (Math.PI * 2.0); + startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); + var endAngle = startAngle + circumference; + var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; + var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; + var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); + var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); + var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); + var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); + var cutout = cutoutPercentage / 100.0; + var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; + var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; + var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; + minSize = Math.min(availableWidth / size.width, availableHeight / size.height); + offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + } + + chart.borderWidth = me.getMaxBorderWidth(); + chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); + chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1); + chart.offsetX = offset.x * chart.outerRadius; + chart.offsetY = offset.y * chart.outerRadius; + + meta.total = me.calculateTotal(); + + me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index); + me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0); + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + me.updateElement(arcs[i], i, reset); + } + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var animationOpts = opts.animation; + var centerX = (chartArea.left + chartArea.right) / 2; + var centerY = (chartArea.top + chartArea.bottom) / 2; + var startAngle = opts.rotation; // non reset case handled later + var endAngle = opts.rotation; // non reset case handled later + var dataset = me.getDataset(); + var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); + var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; + var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX + chart.offsetX, + y: centerY + chart.offsetY, + startAngle: startAngle, + endAngle: endAngle, + circumference: circumference, + outerRadius: outerRadius, + innerRadius: innerRadius, + label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) + } + }); + + var model = arc._model; + + // Set correct angles if not resetting + if (!reset || !animationOpts.animateRotate) { + if (index === 0) { + model.startAngle = opts.rotation; + } else { + model.startAngle = me.getMeta().data[index - 1]._model.endAngle; + } + + model.endAngle = model.startAngle + model.circumference; + } + + arc.pivot(); + }, + + calculateTotal: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var total = 0; + var value; + + helpers$1.each(meta.data, function(element, index) { + value = dataset.data[index]; + if (!isNaN(value) && !element.hidden) { + total += Math.abs(value); + } + }); + + /* if (total === 0) { + total = NaN; + }*/ + + return total; + }, + + calculateCircumference: function(value) { + var total = this.getMeta().total; + if (total > 0 && !isNaN(value)) { + return (Math.PI * 2.0) * (Math.abs(value) / total); + } + return 0; + }, + + // gets the max border or hover width to properly scale pie charts + getMaxBorderWidth: function(arcs) { + var me = this; + var max = 0; + var chart = me.chart; + var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth; + + if (!arcs) { + // Find the outmost visible dataset + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + arcs = meta.data; + if (i !== me.index) { + controller = meta.controller; + } + break; + } + } + } + + if (!arcs) { + return 0; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arc = arcs[i]; + options = controller ? controller._resolveElementOptions(arc, i) : arc._options; + if (options.borderAlign !== 'inner') { + borderWidth = options.borderWidth; + hoverWidth = options.hoverBorderWidth; + + max = borderWidth > max ? borderWidth : max; + max = hoverWidth > max ? hoverWidth : max; + } + } + return max; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function(arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$3([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly + * @private + */ + _getRingWeightOffset: function(datasetIndex) { + var ringWeightOffset = 0; + + for (var i = 0; i < datasetIndex; ++i) { + if (this.chart.isDatasetVisible(i)) { + ringWeightOffset += this._getRingWeight(i); + } + } + + return ringWeightOffset; + }, + + /** + * @private + */ + _getRingWeight: function(dataSetIndex) { + return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0); + }, + + /** + * Returns the sum of all visibile data set weights. This value can be 0. + * @private + */ + _getVisibleDatasetWeightTotal: function() { + return this._getRingWeightOffset(this.chart.data.datasets.length); + } +}); + +core_defaults._set('horizontalBar', { + hover: { + mode: 'index', + axis: 'y' + }, + + scales: { + xAxes: [{ + type: 'linear', + position: 'bottom' + }], + + yAxes: [{ + type: 'category', + position: 'left', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }] + }, + + elements: { + rectangle: { + borderSkipped: 'left' + } + }, + + tooltips: { + mode: 'index', + axis: 'y' + } +}); + +var controller_horizontalBar = controller_bar.extend({ + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().yAxisID; + } +}); + +var valueOrDefault$5 = helpers$1.valueOrDefault; +var resolve$4 = helpers$1.options.resolve; +var isPointInArea = helpers$1.canvas._isPointInArea; + +core_defaults._set('line', { + showLines: true, + spanGaps: false, + + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + id: 'x-axis-0' + }], + yAxes: [{ + type: 'linear', + id: 'y-axis-0' + }] + } +}); + +function lineEnabled(dataset, options) { + return valueOrDefault$5(dataset.showLine, options.showLines); +} + +var controller_line = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.getScaleForId(meta.yAxisID); + var dataset = me.getDataset(); + var showLine = lineEnabled(dataset, me.chart.options); + var i, ilen; + + // Update Line + if (showLine) { + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + } + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + if (showLine && line._model.tension !== 0) { + me.updateBezierControlPoints(); + } + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var dataset = me.getDataset(); + var datasetIndex = me.index; + var value = dataset.data[index]; + var yScale = me.getScaleForId(meta.yAxisID); + var xScale = me.getScaleForId(meta.xAxisID); + var lineModel = meta.dataset._model; + var x, y; + + var options = me._resolvePointOptions(point, index); + + x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); + y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); + + // Utility + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = datasetIndex; + point._index = index; + + // Desired view properties + point._model = { + x: x, + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0), + steppedLine: lineModel ? lineModel.steppedLine : false, + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function(element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function(element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options; + var elementOptions = options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill', + 'cubicInterpolationMode' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[key], + elementOptions[key] + ]); + } + + // The default behavior of lines is to break at null values, according + // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 + // This option gives lines the ability to span gaps + values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps); + values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension); + values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]); + + return values; + }, + + calculatePointY: function(value, index, datasetIndex) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var yScale = me.getScaleForId(meta.yAxisID); + var sumPos = 0; + var sumNeg = 0; + var i, ds, dsMeta; + + if (yScale.options.stacked) { + for (i = 0; i < datasetIndex; i++) { + ds = chart.data.datasets[i]; + dsMeta = chart.getDatasetMeta(i); + if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { + var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); + if (stackedRightValue < 0) { + sumNeg += stackedRightValue || 0; + } else { + sumPos += stackedRightValue || 0; + } + } + } + + var rightValue = Number(yScale.getRightValue(value)); + if (rightValue < 0) { + return yScale.getPixelForValue(sumNeg + rightValue); + } + return yScale.getPixelForValue(sumPos + rightValue); + } + + return yScale.getPixelForValue(value); + }, + + updateBezierControlPoints: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var lineModel = meta.dataset._model; + var area = chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + // Only consider points that are drawn in case the spanGaps option is used + if (lineModel.spanGaps) { + points = points.filter(function(pt) { + return !pt._model.skip; + }); + } + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + if (lineModel.cubicInterpolationMode === 'monotone') { + helpers$1.splineCurveMonotone(points); + } else { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i)._model, + model, + helpers$1.nextItem(points, i)._model, + lineModel.tension + ); + model.controlPointPreviousX = controlPoints.previous.x; + model.controlPointPreviousY = controlPoints.previous.y; + model.controlPointNextX = controlPoints.next.x; + model.controlPointNextY = controlPoints.next.y; + } + } + + if (chart.options.elements.line.capBezierPoints) { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + if (isPointInArea(model, area)) { + if (i > 0 && isPointInArea(points[i - 1]._model, area)) { + model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); + model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); + } + if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) { + model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); + model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); + } + } + } + } + }, + + draw: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var points = meta.data || []; + var area = chart.chartArea; + var ilen = points.length; + var halfBorderWidth; + var i = 0; + + if (lineEnabled(me.getDataset(), chart.options)) { + halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2; + + helpers$1.canvas.clipArea(chart.ctx, { + left: area.left, + right: area.right, + top: area.top - halfBorderWidth, + bottom: area.bottom + halfBorderWidth + }); + + meta.dataset.draw(); + + helpers$1.canvas.unclipArea(chart.ctx); + } + + // Draw the points + for (; i < ilen; ++i) { + points[i].draw(area); + } + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$5(options.hoverRadius, options.radius); + }, +}); + +var resolve$5 = helpers$1.options.resolve; + +core_defaults._set('polarArea', { + scale: { + type: 'radialLinear', + angleLines: { + display: false + }, + gridLines: { + circular: true + }, + pointLabels: { + display: false + }, + ticks: { + beginAtZero: true + } + }, + + // Boolean - Whether to animate the rotation of the chart + animation: { + animateRotate: true, + animateScale: true + }, + + startAngle: -0.5 * Math.PI, + legendCallback: function(chart) { + var text = []; + text.push('
    '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
  • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
  • '); + } + } + + text.push('
'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + meta.data[index].hidden = !meta.data[index].hidden; + } + + chart.update(); + } + }, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(item, data) { + return data.labels[item.index] + ': ' + item.yLabel; + } + } + } +}); + +var controller_polarArea = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + update: function(reset) { + var me = this; + var dataset = me.getDataset(); + var meta = me.getMeta(); + var start = me.chart.options.startAngle || 0; + var starts = me._starts = []; + var angles = me._angles = []; + var arcs = meta.data; + var i, ilen, angle; + + me._updateRadius(); + + meta.count = me.countVisibleElements(); + + for (i = 0, ilen = dataset.data.length; i < ilen; i++) { + starts[i] = start; + angle = me._computeAngle(i); + angles[i] = angle; + start += angle; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + me.updateElement(arcs[i], i, reset); + } + }, + + /** + * @private + */ + _updateRadius: function() { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); + + chart.outerRadius = Math.max(minSize / 2, 0); + chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + + me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); + me.innerRadius = me.outerRadius - chart.radiusLength; + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var opts = chart.options; + var animationOpts = opts.animation; + var scale = chart.scale; + var labels = chart.data.labels; + + var centerX = scale.xCenter; + var centerY = scale.yCenter; + + // var negHalfPI = -0.5 * Math.PI; + var datasetStartAngle = opts.startAngle; + var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var startAngle = me._starts[index]; + var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]); + + var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX, + y: centerY, + innerRadius: 0, + outerRadius: reset ? resetRadius : distance, + startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, + endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, + label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index]) + } + }); + + arc.pivot(); + }, + + countVisibleElements: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var count = 0; + + helpers$1.each(meta.data, function(element, index) { + if (!isNaN(dataset.data[index]) && !element.hidden) { + count++; + } + }); + + return count; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + var valueOrDefault = helpers$1.valueOrDefault; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function(arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$5([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _computeAngle: function(index) { + var me = this; + var count = this.getMeta().count; + var dataset = me.getDataset(); + var meta = me.getMeta(); + + if (isNaN(dataset.data[index]) || meta.data[index].hidden) { + return 0; + } + + // Scriptable options + var context = { + chart: me.chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + return resolve$5([ + me.chart.options.elements.arc.angle, + (2 * Math.PI) / count + ], context, index); + } +}); + +core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut)); +core_defaults._set('pie', { + cutoutPercentage: 0 +}); + +// Pie charts are Doughnut chart with different defaults +var controller_pie = controller_doughnut; + +var valueOrDefault$6 = helpers$1.valueOrDefault; +var resolve$6 = helpers$1.options.resolve; + +core_defaults._set('radar', { + scale: { + type: 'radialLinear' + }, + elements: { + line: { + tension: 0 // no bezier in radar + } + } +}); + +var controller_radar = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + linkScales: helpers$1.noop, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.chart.scale; + var dataset = me.getDataset(); + var i, ilen; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + line._loop = true; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + // Update bezier control points + me.updateBezierControlPoints(); + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var custom = point.custom || {}; + var dataset = me.getDataset(); + var scale = me.chart.scale; + var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); + var options = me._resolvePointOptions(point, index); + var lineModel = me.getMeta().dataset._model; + var x = reset ? scale.xCenter : pointPosition.x; + var y = reset ? scale.yCenter : pointPosition.y; + + // Utility + point._scale = scale; + point._options = options; + point._datasetIndex = me.index; + point._index = index; + + // Desired view properties + point._model = { + x: x, // value not used in dataset scale, but we want a consistent API between scales + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0), + + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function(element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function(element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[key], + options[key] + ]); + } + + values.tension = valueOrDefault$6(dataset.lineTension, options.tension); + + return values; + }, + + updateBezierControlPoints: function() { + var me = this; + var meta = me.getMeta(); + var area = me.chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i, true)._model, + model, + helpers$1.nextItem(points, i, true)._model, + model.tension + ); + + // Prevent the bezier going outside of the bounds of the graph + model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right); + model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom); + model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right); + model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom); + } + }, + + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$6(options.hoverRadius, options.radius); + } +}); + +core_defaults._set('scatter', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + id: 'x-axis-1', // need an ID so datasets can reference the scale + type: 'linear', // scatter should not use a category axis + position: 'bottom' + }], + yAxes: [{ + id: 'y-axis-1', + type: 'linear', + position: 'left' + }] + }, + + showLines: false, + + tooltips: { + callbacks: { + title: function() { + return ''; // doesn't make sense for scatter since data are formatted as a point + }, + label: function(item) { + return '(' + item.xLabel + ', ' + item.yLabel + ')'; + } + } + } +}); + +// Scatter charts use line controllers +var controller_scatter = controller_line; + +// NOTE export a map in which the key represents the controller type, not +// the class, and so must be CamelCase in order to be correctly retrieved +// by the controller in core.controller.js (`controllers[meta.type]`). + +var controllers = { + bar: controller_bar, + bubble: controller_bubble, + doughnut: controller_doughnut, + horizontalBar: controller_horizontalBar, + line: controller_line, + polarArea: controller_polarArea, + pie: controller_pie, + radar: controller_radar, + scatter: controller_scatter +}; + +/** + * Helper function to get relative position for an event + * @param {Event|IEvent} event - The event to get the position for + * @param {Chart} chart - The chart + * @returns {object} the event position + */ +function getRelativePosition(e, chart) { + if (e.native) { + return { + x: e.x, + y: e.y + }; + } + + return helpers$1.getRelativePosition(e, chart); +} + +/** + * Helper function to traverse all of the visible elements in the chart + * @param {Chart} chart - the chart + * @param {function} handler - the callback to execute for each visible item + */ +function parseVisibleItems(chart, handler) { + var datasets = chart.data.datasets; + var meta, i, j, ilen, jlen; + + for (i = 0, ilen = datasets.length; i < ilen; ++i) { + if (!chart.isDatasetVisible(i)) { + continue; + } + + meta = chart.getDatasetMeta(i); + for (j = 0, jlen = meta.data.length; j < jlen; ++j) { + var element = meta.data[j]; + if (!element._view.skip) { + handler(element); + } + } + } +} + +/** + * Helper function to get the items that intersect the event position + * @param {ChartElement[]} items - elements to filter + * @param {object} position - the point to be nearest to + * @return {ChartElement[]} the nearest items + */ +function getIntersectItems(chart, position) { + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + } + }); + + return elements; +} + +/** + * Helper function to get the items nearest to the event position considering all visible items in teh chart + * @param {Chart} chart - the chart to look at elements from + * @param {object} position - the point to be nearest to + * @param {boolean} intersect - if true, only consider items that intersect the position + * @param {function} distanceMetric - function to provide the distance between points + * @return {ChartElement[]} the nearest items + */ +function getNearestItems(chart, position, intersect, distanceMetric) { + var minDistance = Number.POSITIVE_INFINITY; + var nearestItems = []; + + parseVisibleItems(chart, function(element) { + if (intersect && !element.inRange(position.x, position.y)) { + return; + } + + var center = element.getCenterPoint(); + var distance = distanceMetric(position, center); + if (distance < minDistance) { + nearestItems = [element]; + minDistance = distance; + } else if (distance === minDistance) { + // Can have multiple items at the same distance in which case we sort by size + nearestItems.push(element); + } + }); + + return nearestItems; +} + +/** + * Get a distance metric function for two points based on the + * axis mode setting + * @param {string} axis - the axis mode. x|y|xy + */ +function getDistanceMetricForAxis(axis) { + var useX = axis.indexOf('x') !== -1; + var useY = axis.indexOf('y') !== -1; + + return function(pt1, pt2) { + var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; + var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; + return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); + }; +} + +function indexMode(chart, e, options) { + var position = getRelativePosition(e, chart); + // Default axis for index mode is 'x' to match old behaviour + options.axis = options.axis || 'x'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + var elements = []; + + if (!items.length) { + return []; + } + + chart.data.datasets.forEach(function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + var element = meta.data[items[0]._index]; + + // don't count items that are skipped (null data) + if (element && !element._view.skip) { + elements.push(element); + } + } + }); + + return elements; +} + +/** + * @interface IInteractionOptions + */ +/** + * If true, only consider items that intersect the point + * @name IInterfaceOptions#boolean + * @type Boolean + */ + +/** + * Contains interaction related functions + * @namespace Chart.Interaction + */ +var core_interaction = { + // Helper function for different modes + modes: { + single: function(chart, e) { + var position = getRelativePosition(e, chart); + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + return elements; + } + }); + + return elements.slice(0, 1); + }, + + /** + * @function Chart.Interaction.modes.label + * @deprecated since version 2.4.0 + * @todo remove at version 3 + * @private + */ + label: indexMode, + + /** + * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item + * @function Chart.Interaction.modes.index + * @since v2.4.0 + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + index: indexMode, + + /** + * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect is false, we find the nearest item and return the items in that dataset + * @function Chart.Interaction.modes.dataset + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + dataset: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + + if (items.length > 0) { + items = chart.getDatasetMeta(items[0]._datasetIndex).data; + } + + return items; + }, + + /** + * @function Chart.Interaction.modes.x-axis + * @deprecated since version 2.4.0. Use index mode and intersect == true + * @todo remove at version 3 + * @private + */ + 'x-axis': function(chart, e) { + return indexMode(chart, e, {intersect: false}); + }, + + /** + * Point mode returns all elements that hit test based on the event position + * of the event + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + point: function(chart, e) { + var position = getRelativePosition(e, chart); + return getIntersectItems(chart, position); + }, + + /** + * nearest mode returns the element closest to the point + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + nearest: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + return getNearestItems(chart, position, options.intersect, distanceMetric); + }, + + /** + * x mode returns the elements that hit-test at the current x coordinate + * @function Chart.Interaction.modes.x + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + x: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inXRange(position.x)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + }, + + /** + * y mode returns the elements that hit-test at the current y coordinate + * @function Chart.Interaction.modes.y + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + y: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inYRange(position.y)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + } + } +}; + +function filterByPosition(array, position) { + return helpers$1.where(array, function(v) { + return v.position === position; + }); +} + +function sortByWeight(array, reverse) { + array.forEach(function(v, i) { + v._tmpIndex_ = i; + return v; + }); + array.sort(function(a, b) { + var v0 = reverse ? b : a; + var v1 = reverse ? a : b; + return v0.weight === v1.weight ? + v0._tmpIndex_ - v1._tmpIndex_ : + v0.weight - v1.weight; + }); + array.forEach(function(v) { + delete v._tmpIndex_; + }); +} + +function findMaxPadding(boxes) { + var top = 0; + var left = 0; + var bottom = 0; + var right = 0; + helpers$1.each(boxes, function(box) { + if (box.getPadding) { + var boxPadding = box.getPadding(); + top = Math.max(top, boxPadding.top); + left = Math.max(left, boxPadding.left); + bottom = Math.max(bottom, boxPadding.bottom); + right = Math.max(right, boxPadding.right); + } + }); + return { + top: top, + left: left, + bottom: bottom, + right: right + }; +} + +function addSizeByPosition(boxes, size) { + helpers$1.each(boxes, function(box) { + size[box.position] += box.isHorizontal() ? box.height : box.width; + }); +} + +core_defaults._set('global', { + layout: { + padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + } +}); + +/** + * @interface ILayoutItem + * @prop {string} position - The position of the item in the chart layout. Possible values are + * 'left', 'top', 'right', 'bottom', and 'chartArea' + * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area + * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down + * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) + * @prop {function} update - Takes two parameters: width and height. Returns size of item + * @prop {function} getPadding - Returns an object with padding on the edges + * @prop {number} width - Width of item. Must be valid after update() + * @prop {number} height - Height of item. Must be valid after update() + * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update + * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update + * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update + * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update + */ + +// The layout service is very self explanatory. It's responsible for the layout within a chart. +// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need +// It is this service's responsibility of carrying out that layout. +var core_layouts = { + defaults: {}, + + /** + * Register a box to a chart. + * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. + * @param {Chart} chart - the chart to use + * @param {ILayoutItem} item - the item to add to be layed out + */ + addBox: function(chart, item) { + if (!chart.boxes) { + chart.boxes = []; + } + + // initialize item with default values + item.fullWidth = item.fullWidth || false; + item.position = item.position || 'top'; + item.weight = item.weight || 0; + + chart.boxes.push(item); + }, + + /** + * Remove a layoutItem from a chart + * @param {Chart} chart - the chart to remove the box from + * @param {ILayoutItem} layoutItem - the item to remove from the layout + */ + removeBox: function(chart, layoutItem) { + var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; + if (index !== -1) { + chart.boxes.splice(index, 1); + } + }, + + /** + * Sets (or updates) options on the given `item`. + * @param {Chart} chart - the chart in which the item lives (or will be added to) + * @param {ILayoutItem} item - the item to configure with the given options + * @param {object} options - the new item options. + */ + configure: function(chart, item, options) { + var props = ['fullWidth', 'position', 'weight']; + var ilen = props.length; + var i = 0; + var prop; + + for (; i < ilen; ++i) { + prop = props[i]; + if (options.hasOwnProperty(prop)) { + item[prop] = options[prop]; + } + } + }, + + /** + * Fits boxes of the given chart into the given size by having each box measure itself + * then running a fitting algorithm + * @param {Chart} chart - the chart + * @param {number} width - the width to fit into + * @param {number} height - the height to fit into + */ + update: function(chart, width, height) { + if (!chart) { + return; + } + + var layoutOptions = chart.options.layout || {}; + var padding = helpers$1.options.toPadding(layoutOptions.padding); + var leftPadding = padding.left; + var rightPadding = padding.right; + var topPadding = padding.top; + var bottomPadding = padding.bottom; + + var leftBoxes = filterByPosition(chart.boxes, 'left'); + var rightBoxes = filterByPosition(chart.boxes, 'right'); + var topBoxes = filterByPosition(chart.boxes, 'top'); + var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); + var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); + + // Sort boxes by weight. A higher weight is further away from the chart area + sortByWeight(leftBoxes, true); + sortByWeight(rightBoxes, false); + sortByWeight(topBoxes, true); + sortByWeight(bottomBoxes, false); + + var verticalBoxes = leftBoxes.concat(rightBoxes); + var horizontalBoxes = topBoxes.concat(bottomBoxes); + var outerBoxes = verticalBoxes.concat(horizontalBoxes); + + // Essentially we now have any number of boxes on each of the 4 sides. + // Our canvas looks like the following. + // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and + // B1 is the bottom axis + // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays + // These locations are single-box locations only, when trying to register a chartArea location that is already taken, + // an error will be thrown. + // + // |----------------------------------------------------| + // | T1 (Full Width) | + // |----------------------------------------------------| + // | | | T2 | | + // | |----|-------------------------------------|----| + // | | | C1 | | C2 | | + // | | |----| |----| | + // | | | | | + // | L1 | L2 | ChartArea (C0) | R1 | + // | | | | | + // | | |----| |----| | + // | | | C3 | | C4 | | + // | |----|-------------------------------------|----| + // | | | B1 | | + // |----------------------------------------------------| + // | B2 (Full Width) | + // |----------------------------------------------------| + // + // What we do to find the best sizing, we do the following + // 1. Determine the minimum size of the chart area. + // 2. Split the remaining width equally between each vertical axis + // 3. Split the remaining height equally between each horizontal axis + // 4. Give each layout the maximum size it can be. The layout will return it's minimum size + // 5. Adjust the sizes of each axis based on it's minimum reported size. + // 6. Refit each axis + // 7. Position each axis in the final location + // 8. Tell the chart the final location of the chart area + // 9. Tell any axes that overlay the chart area the positions of the chart area + + // Step 1 + var chartWidth = width - leftPadding - rightPadding; + var chartHeight = height - topPadding - bottomPadding; + var chartAreaWidth = chartWidth / 2; // min 50% + + // Step 2 + var verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length; + + // Step 3 + // TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837) + // var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length; + + // Step 4 + var maxChartAreaWidth = chartWidth; + var maxChartAreaHeight = chartHeight; + var outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; + var minBoxSizes = []; + var maxPadding; + + function getMinimumBoxSize(box) { + var minSize; + var isHorizontal = box.isHorizontal(); + + if (isHorizontal) { + minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2); + maxChartAreaHeight -= minSize.height; + } else { + minSize = box.update(verticalBoxWidth, maxChartAreaHeight); + maxChartAreaWidth -= minSize.width; + } + + minBoxSizes.push({ + horizontal: isHorizontal, + width: minSize.width, + box: box, + }); + } + + helpers$1.each(outerBoxes, getMinimumBoxSize); + + // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) + maxPadding = findMaxPadding(outerBoxes); + + // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could + // be if the axes are drawn at their minimum sizes. + // Steps 5 & 6 + + // Function to fit a box + function fitBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minBox) { + return minBox.box === box; + }); + + if (minBoxSize) { + if (minBoxSize.horizontal) { + var scaleMargin = { + left: Math.max(outerBoxSizes.left, maxPadding.left), + right: Math.max(outerBoxSizes.right, maxPadding.right), + top: 0, + bottom: 0 + }; + + // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends + // on the margin. Sometimes they need to increase in size slightly + box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); + } else { + box.update(minBoxSize.width, maxChartAreaHeight); + } + } + } + + // Update, and calculate the left and right margins for the horizontal boxes + helpers$1.each(verticalBoxes, fitBox); + addSizeByPosition(verticalBoxes, outerBoxSizes); + + // Set the Left and Right margins for the horizontal boxes + helpers$1.each(horizontalBoxes, fitBox); + addSizeByPosition(horizontalBoxes, outerBoxSizes); + + function finalFitVerticalBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minSize) { + return minSize.box === box; + }); + + var scaleMargin = { + left: 0, + right: 0, + top: outerBoxSizes.top, + bottom: outerBoxSizes.bottom + }; + + if (minBoxSize) { + box.update(minBoxSize.width, maxChartAreaHeight, scaleMargin); + } + } + + // Let the left layout know the final margin + helpers$1.each(verticalBoxes, finalFitVerticalBox); + + // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) + outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; + addSizeByPosition(outerBoxes, outerBoxSizes); + + // We may be adding some padding to account for rotated x axis labels + var leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0); + outerBoxSizes.left += leftPaddingAddition; + outerBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0); + + var topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0); + outerBoxSizes.top += topPaddingAddition; + outerBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 0); + + // Figure out if our chart area changed. This would occur if the dataset layout label rotation + // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do + // without calling `fit` again + var newMaxChartAreaHeight = height - outerBoxSizes.top - outerBoxSizes.bottom; + var newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right; + + if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { + helpers$1.each(verticalBoxes, function(box) { + box.height = newMaxChartAreaHeight; + }); + + helpers$1.each(horizontalBoxes, function(box) { + if (!box.fullWidth) { + box.width = newMaxChartAreaWidth; + } + }); + + maxChartAreaHeight = newMaxChartAreaHeight; + maxChartAreaWidth = newMaxChartAreaWidth; + } + + // Step 7 - Position the boxes + var left = leftPadding + leftPaddingAddition; + var top = topPadding + topPaddingAddition; + + function placeBox(box) { + if (box.isHorizontal()) { + box.left = box.fullWidth ? leftPadding : outerBoxSizes.left; + box.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + maxChartAreaWidth; + box.top = top; + box.bottom = top + box.height; + + // Move to next point + top = box.bottom; + + } else { + + box.left = left; + box.right = left + box.width; + box.top = outerBoxSizes.top; + box.bottom = outerBoxSizes.top + maxChartAreaHeight; + + // Move to next point + left = box.right; + } + } + + helpers$1.each(leftBoxes.concat(topBoxes), placeBox); + + // Account for chart width and height + left += maxChartAreaWidth; + top += maxChartAreaHeight; + + helpers$1.each(rightBoxes, placeBox); + helpers$1.each(bottomBoxes, placeBox); + + // Step 8 + chart.chartArea = { + left: outerBoxSizes.left, + top: outerBoxSizes.top, + right: outerBoxSizes.left + maxChartAreaWidth, + bottom: outerBoxSizes.top + maxChartAreaHeight + }; + + // Step 9 + helpers$1.each(chartAreaBoxes, function(box) { + box.left = chart.chartArea.left; + box.top = chart.chartArea.top; + box.right = chart.chartArea.right; + box.bottom = chart.chartArea.bottom; + + box.update(maxChartAreaWidth, maxChartAreaHeight); + }); + } +}; + +/** + * Platform fallback implementation (minimal). + * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 + */ + +var platform_basic = { + acquireContext: function(item) { + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + return item && item.getContext('2d') || null; + } +}; + +var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n"; + +var platform_dom$1 = /*#__PURE__*/Object.freeze({ +default: platform_dom +}); + +function getCjsExportFromNamespace (n) { + return n && n.default || n; +} + +var stylesheet = getCjsExportFromNamespace(platform_dom$1); + +var EXPANDO_KEY = '$chartjs'; +var CSS_PREFIX = 'chartjs-'; +var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor'; +var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; +var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; +var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; + +/** + * DOM event types -> Chart.js event types. + * Note: only events with different types are mapped. + * @see https://developer.mozilla.org/en-US/docs/Web/Events + */ +var EVENT_TYPES = { + touchstart: 'mousedown', + touchmove: 'mousemove', + touchend: 'mouseup', + pointerenter: 'mouseenter', + pointerdown: 'mousedown', + pointermove: 'mousemove', + pointerup: 'mouseup', + pointerleave: 'mouseout', + pointerout: 'mouseout' +}; + +/** + * The "used" size is the final value of a dimension property after all calculations have + * been performed. This method uses the computed style of `element` but returns undefined + * if the computed style is not expressed in pixels. That can happen in some cases where + * `element` has a size relative to its parent and this last one is not yet displayed, + * for example because of `display: none` on a parent node. + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value + * @returns {number} Size in pixels or undefined if unknown. + */ +function readUsedSize(element, property) { + var value = helpers$1.getStyle(element, property); + var matches = value && value.match(/^(\d+)(\.\d+)?px$/); + return matches ? Number(matches[1]) : undefined; +} + +/** + * Initializes the canvas style and render size without modifying the canvas display size, + * since responsiveness is handled by the controller.resize() method. The config is used + * to determine the aspect ratio to apply in case no explicit height has been specified. + */ +function initCanvas(canvas, config) { + var style = canvas.style; + + // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it + // returns null or '' if no explicit value has been set to the canvas attribute. + var renderHeight = canvas.getAttribute('height'); + var renderWidth = canvas.getAttribute('width'); + + // Chart.js modifies some canvas values that we want to restore on destroy + canvas[EXPANDO_KEY] = { + initial: { + height: renderHeight, + width: renderWidth, + style: { + display: style.display, + height: style.height, + width: style.width + } + } + }; + + // Force canvas to display as block to avoid extra space caused by inline + // elements, which would interfere with the responsive resize process. + // https://github.com/chartjs/Chart.js/issues/2538 + style.display = style.display || 'block'; + + if (renderWidth === null || renderWidth === '') { + var displayWidth = readUsedSize(canvas, 'width'); + if (displayWidth !== undefined) { + canvas.width = displayWidth; + } + } + + if (renderHeight === null || renderHeight === '') { + if (canvas.style.height === '') { + // If no explicit render height and style height, let's apply the aspect ratio, + // which one can be specified by the user but also by charts as default option + // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. + canvas.height = canvas.width / (config.options.aspectRatio || 2); + } else { + var displayHeight = readUsedSize(canvas, 'height'); + if (displayWidth !== undefined) { + canvas.height = displayHeight; + } + } + } + + return canvas; +} + +/** + * Detects support for options object argument in addEventListener. + * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + * @private + */ +var supportsEventListenerOptions = (function() { + var supports = false; + try { + var options = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line getter-return + get: function() { + supports = true; + } + }); + window.addEventListener('e', null, options); + } catch (e) { + // continue regardless of error + } + return supports; +}()); + +// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. +// https://github.com/chartjs/Chart.js/issues/4287 +var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; + +function addListener(node, type, listener) { + node.addEventListener(type, listener, eventListenerOptions); +} + +function removeListener(node, type, listener) { + node.removeEventListener(type, listener, eventListenerOptions); +} + +function createEvent(type, chart, x, y, nativeEvent) { + return { + type: type, + chart: chart, + native: nativeEvent || null, + x: x !== undefined ? x : null, + y: y !== undefined ? y : null, + }; +} + +function fromNativeEvent(event, chart) { + var type = EVENT_TYPES[event.type] || event.type; + var pos = helpers$1.getRelativePosition(event, chart); + return createEvent(type, chart, pos.x, pos.y, event); +} + +function throttled(fn, thisArg) { + var ticking = false; + var args = []; + + return function() { + args = Array.prototype.slice.call(arguments); + thisArg = thisArg || this; + + if (!ticking) { + ticking = true; + helpers$1.requestAnimFrame.call(window, function() { + ticking = false; + fn.apply(thisArg, args); + }); + } + }; +} + +function createDiv(cls) { + var el = document.createElement('div'); + el.className = cls || ''; + return el; +} + +// Implementation based on https://github.com/marcj/css-element-queries +function createResizer(handler) { + var maxSize = 1000000; + + // NOTE(SB) Don't use innerHTML because it could be considered unsafe. + // https://github.com/chartjs/Chart.js/issues/5902 + var resizer = createDiv(CSS_SIZE_MONITOR); + var expand = createDiv(CSS_SIZE_MONITOR + '-expand'); + var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink'); + + expand.appendChild(createDiv()); + shrink.appendChild(createDiv()); + + resizer.appendChild(expand); + resizer.appendChild(shrink); + resizer._reset = function() { + expand.scrollLeft = maxSize; + expand.scrollTop = maxSize; + shrink.scrollLeft = maxSize; + shrink.scrollTop = maxSize; + }; + + var onScroll = function() { + resizer._reset(); + handler(); + }; + + addListener(expand, 'scroll', onScroll.bind(expand, 'expand')); + addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); + + return resizer; +} + +// https://davidwalsh.name/detect-node-insertion +function watchForRender(node, handler) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + var proxy = expando.renderProxy = function(e) { + if (e.animationName === CSS_RENDER_ANIMATION) { + handler(); + } + }; + + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + addListener(node, type, proxy); + }); + + // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class + // is removed then added back immediately (same animation frame?). Accessing the + // `offsetParent` property will force a reflow and re-evaluate the CSS animation. + // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics + // https://github.com/chartjs/Chart.js/issues/4737 + expando.reflow = !!node.offsetParent; + + node.classList.add(CSS_RENDER_MONITOR); +} + +function unwatchForRender(node) { + var expando = node[EXPANDO_KEY] || {}; + var proxy = expando.renderProxy; + + if (proxy) { + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + removeListener(node, type, proxy); + }); + + delete expando.renderProxy; + } + + node.classList.remove(CSS_RENDER_MONITOR); +} + +function addResizeListener(node, listener, chart) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + + // Let's keep track of this added resizer and thus avoid DOM query when removing it. + var resizer = expando.resizer = createResizer(throttled(function() { + if (expando.resizer) { + var container = chart.options.maintainAspectRatio && node.parentNode; + var w = container ? container.clientWidth : 0; + listener(createEvent('resize', chart)); + if (container && container.clientWidth < w && chart.canvas) { + // If the container size shrank during chart resize, let's assume + // scrollbar appeared. So we resize again with the scrollbar visible - + // effectively making chart smaller and the scrollbar hidden again. + // Because we are inside `throttled`, and currently `ticking`, scroll + // events are ignored during this whole 2 resize process. + // If we assumed wrong and something else happened, we are resizing + // twice in a frame (potential performance issue) + listener(createEvent('resize', chart)); + } + } + })); + + // The resizer needs to be attached to the node parent, so we first need to be + // sure that `node` is attached to the DOM before injecting the resizer element. + watchForRender(node, function() { + if (expando.resizer) { + var container = node.parentNode; + if (container && container !== resizer.parentNode) { + container.insertBefore(resizer, container.firstChild); + } + + // The container size might have changed, let's reset the resizer state. + resizer._reset(); + } + }); +} + +function removeResizeListener(node) { + var expando = node[EXPANDO_KEY] || {}; + var resizer = expando.resizer; + + delete expando.resizer; + unwatchForRender(node); + + if (resizer && resizer.parentNode) { + resizer.parentNode.removeChild(resizer); + } +} + +function injectCSS(platform, css) { + // https://stackoverflow.com/q/3922139 + var style = platform._style || document.createElement('style'); + if (!platform._style) { + platform._style = style; + css = '/* Chart.js */\n' + css; + style.setAttribute('type', 'text/css'); + document.getElementsByTagName('head')[0].appendChild(style); + } + + style.appendChild(document.createTextNode(css)); +} + +var platform_dom$2 = { + /** + * When `true`, prevents the automatic injection of the stylesheet required to + * correctly detect when the chart is added to the DOM and then resized. This + * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`) + * to be manually imported to make this library compatible with any CSP. + * See https://github.com/chartjs/Chart.js/issues/5208 + */ + disableCSSInjection: false, + + /** + * This property holds whether this platform is enabled for the current environment. + * Currently used by platform.js to select the proper implementation. + * @private + */ + _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', + + /** + * @private + */ + _ensureLoaded: function() { + if (this._loaded) { + return; + } + + this._loaded = true; + + // https://github.com/chartjs/Chart.js/issues/5208 + if (!this.disableCSSInjection) { + injectCSS(this, stylesheet); + } + }, + + acquireContext: function(item, config) { + if (typeof item === 'string') { + item = document.getElementById(item); + } else if (item.length) { + // Support for array based queries (such as jQuery) + item = item[0]; + } + + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + // To prevent canvas fingerprinting, some add-ons undefine the getContext + // method, for example: https://github.com/kkapsner/CanvasBlocker + // https://github.com/chartjs/Chart.js/issues/2807 + var context = item && item.getContext && item.getContext('2d'); + + // Load platform resources on first chart creation, to make possible to change + // platform options after importing the library (e.g. `disableCSSInjection`). + this._ensureLoaded(); + + // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is + // inside an iframe or when running in a protected environment. We could guess the + // types from their toString() value but let's keep things flexible and assume it's + // a sufficient condition if the item has a context2D which has item as `canvas`. + // https://github.com/chartjs/Chart.js/issues/3887 + // https://github.com/chartjs/Chart.js/issues/4102 + // https://github.com/chartjs/Chart.js/issues/4152 + if (context && context.canvas === item) { + initCanvas(item, config); + return context; + } + + return null; + }, + + releaseContext: function(context) { + var canvas = context.canvas; + if (!canvas[EXPANDO_KEY]) { + return; + } + + var initial = canvas[EXPANDO_KEY].initial; + ['height', 'width'].forEach(function(prop) { + var value = initial[prop]; + if (helpers$1.isNullOrUndef(value)) { + canvas.removeAttribute(prop); + } else { + canvas.setAttribute(prop, value); + } + }); + + helpers$1.each(initial.style || {}, function(value, key) { + canvas.style[key] = value; + }); + + // The canvas render size might have been changed (and thus the state stack discarded), + // we can't use save() and restore() to restore the initial state. So make sure that at + // least the canvas context is reset to the default state by setting the canvas width. + // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html + // eslint-disable-next-line no-self-assign + canvas.width = canvas.width; + + delete canvas[EXPANDO_KEY]; + }, + + addEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + addResizeListener(canvas, listener, chart); + return; + } + + var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); + var proxies = expando.proxies || (expando.proxies = {}); + var proxy = proxies[chart.id + '_' + type] = function(event) { + listener(fromNativeEvent(event, chart)); + }; + + addListener(canvas, type, proxy); + }, + + removeEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + removeResizeListener(canvas); + return; + } + + var expando = listener[EXPANDO_KEY] || {}; + var proxies = expando.proxies || {}; + var proxy = proxies[chart.id + '_' + type]; + if (!proxy) { + return; + } + + removeListener(canvas, type, proxy); + } +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use EventTarget.addEventListener instead. + * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener + * @function Chart.helpers.addEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers$1.addEvent = addListener; + +/** + * Provided for backward compatibility, use EventTarget.removeEventListener instead. + * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener + * @function Chart.helpers.removeEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers$1.removeEvent = removeListener; + +// @TODO Make possible to select another platform at build time. +var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic; + +/** + * @namespace Chart.platform + * @see https://chartjs.gitbooks.io/proposals/content/Platform.html + * @since 2.4.0 + */ +var platform = helpers$1.extend({ + /** + * @since 2.7.0 + */ + initialize: function() {}, + + /** + * Called at chart construction time, returns a context2d instance implementing + * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. + * @param {*} item - The native item from which to acquire context (platform specific) + * @param {object} options - The chart options + * @returns {CanvasRenderingContext2D} context2d instance + */ + acquireContext: function() {}, + + /** + * Called at chart destruction time, releases any resources associated to the context + * previously returned by the acquireContext() method. + * @param {CanvasRenderingContext2D} context - The context2d instance + * @returns {boolean} true if the method succeeded, else false + */ + releaseContext: function() {}, + + /** + * Registers the specified listener on the given chart. + * @param {Chart} chart - Chart from which to listen for event + * @param {string} type - The ({@link IEvent}) type to listen for + * @param {function} listener - Receives a notification (an object that implements + * the {@link IEvent} interface) when an event of the specified type occurs. + */ + addEventListener: function() {}, + + /** + * Removes the specified listener previously registered with addEventListener. + * @param {Chart} chart - Chart from which to remove the listener + * @param {string} type - The ({@link IEvent}) type to remove + * @param {function} listener - The listener function to remove from the event target. + */ + removeEventListener: function() {} + +}, implementation); + +core_defaults._set('global', { + plugins: {} +}); + +/** + * The plugin service singleton + * @namespace Chart.plugins + * @since 2.1.0 + */ +var core_plugins = { + /** + * Globally registered plugins. + * @private + */ + _plugins: [], + + /** + * This identifier is used to invalidate the descriptors cache attached to each chart + * when a global plugin is registered or unregistered. In this case, the cache ID is + * incremented and descriptors are regenerated during following API calls. + * @private + */ + _cacheId: 0, + + /** + * Registers the given plugin(s) if not already registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + register: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + if (p.indexOf(plugin) === -1) { + p.push(plugin); + } + }); + + this._cacheId++; + }, + + /** + * Unregisters the given plugin(s) only if registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + unregister: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + var idx = p.indexOf(plugin); + if (idx !== -1) { + p.splice(idx, 1); + } + }); + + this._cacheId++; + }, + + /** + * Remove all registered plugins. + * @since 2.1.5 + */ + clear: function() { + this._plugins = []; + this._cacheId++; + }, + + /** + * Returns the number of registered plugins? + * @returns {number} + * @since 2.1.5 + */ + count: function() { + return this._plugins.length; + }, + + /** + * Returns all registered plugin instances. + * @returns {IPlugin[]} array of plugin objects. + * @since 2.1.5 + */ + getAll: function() { + return this._plugins; + }, + + /** + * Calls enabled plugins for `chart` on the specified hook and with the given args. + * This method immediately returns as soon as a plugin explicitly returns false. The + * returned value can be used, for instance, to interrupt the current action. + * @param {Chart} chart - The chart instance for which plugins should be called. + * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). + * @param {Array} [args] - Extra arguments to apply to the hook call. + * @returns {boolean} false if any of the plugins return false, else returns true. + */ + notify: function(chart, hook, args) { + var descriptors = this.descriptors(chart); + var ilen = descriptors.length; + var i, descriptor, plugin, params, method; + + for (i = 0; i < ilen; ++i) { + descriptor = descriptors[i]; + plugin = descriptor.plugin; + method = plugin[hook]; + if (typeof method === 'function') { + params = [chart].concat(args || []); + params.push(descriptor.options); + if (method.apply(plugin, params) === false) { + return false; + } + } + } + + return true; + }, + + /** + * Returns descriptors of enabled plugins for the given chart. + * @returns {object[]} [{ plugin, options }] + * @private + */ + descriptors: function(chart) { + var cache = chart.$plugins || (chart.$plugins = {}); + if (cache.id === this._cacheId) { + return cache.descriptors; + } + + var plugins = []; + var descriptors = []; + var config = (chart && chart.config) || {}; + var options = (config.options && config.options.plugins) || {}; + + this._plugins.concat(config.plugins || []).forEach(function(plugin) { + var idx = plugins.indexOf(plugin); + if (idx !== -1) { + return; + } + + var id = plugin.id; + var opts = options[id]; + if (opts === false) { + return; + } + + if (opts === true) { + opts = helpers$1.clone(core_defaults.global.plugins[id]); + } + + plugins.push(plugin); + descriptors.push({ + plugin: plugin, + options: opts || {} + }); + }); + + cache.descriptors = descriptors; + cache.id = this._cacheId; + return descriptors; + }, + + /** + * Invalidates cache for the given chart: descriptors hold a reference on plugin option, + * but in some cases, this reference can be changed by the user when updating options. + * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + * @private + */ + _invalidate: function(chart) { + delete chart.$plugins; + } +}; + +var core_scaleService = { + // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then + // use the new chart options to grab the correct scale + constructors: {}, + // Use a registration function so that we can move to an ES6 map when we no longer need to support + // old browsers + + // Scale config defaults + defaults: {}, + registerScaleType: function(type, scaleConstructor, scaleDefaults) { + this.constructors[type] = scaleConstructor; + this.defaults[type] = helpers$1.clone(scaleDefaults); + }, + getScaleConstructor: function(type) { + return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; + }, + getScaleDefaults: function(type) { + // Return the scale defaults merged with the global settings so that we always use the latest ones + return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {}; + }, + updateScaleDefaults: function(type, additions) { + var me = this; + if (me.defaults.hasOwnProperty(type)) { + me.defaults[type] = helpers$1.extend(me.defaults[type], additions); + } + }, + addScalesToLayout: function(chart) { + // Adds each scale to the chart.boxes array to be sized accordingly + helpers$1.each(chart.scales, function(scale) { + // Set ILayoutItem parameters for backwards compatibility + scale.fullWidth = scale.options.fullWidth; + scale.position = scale.options.position; + scale.weight = scale.options.weight; + core_layouts.addBox(chart, scale); + }); + } +}; + +var valueOrDefault$7 = helpers$1.valueOrDefault; + +core_defaults._set('global', { + tooltips: { + enabled: true, + custom: null, + mode: 'nearest', + position: 'average', + intersect: true, + backgroundColor: 'rgba(0,0,0,0.8)', + titleFontStyle: 'bold', + titleSpacing: 2, + titleMarginBottom: 6, + titleFontColor: '#fff', + titleAlign: 'left', + bodySpacing: 2, + bodyFontColor: '#fff', + bodyAlign: 'left', + footerFontStyle: 'bold', + footerSpacing: 2, + footerMarginTop: 6, + footerFontColor: '#fff', + footerAlign: 'left', + yPadding: 6, + xPadding: 6, + caretPadding: 2, + caretSize: 5, + cornerRadius: 6, + multiKeyBackground: '#fff', + displayColors: true, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 0, + callbacks: { + // Args are: (tooltipItems, data) + beforeTitle: helpers$1.noop, + title: function(tooltipItems, data) { + var title = ''; + var labels = data.labels; + var labelCount = labels ? labels.length : 0; + + if (tooltipItems.length > 0) { + var item = tooltipItems[0]; + if (item.label) { + title = item.label; + } else if (item.xLabel) { + title = item.xLabel; + } else if (labelCount > 0 && item.index < labelCount) { + title = labels[item.index]; + } + } + + return title; + }, + afterTitle: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeBody: helpers$1.noop, + + // Args are: (tooltipItem, data) + beforeLabel: helpers$1.noop, + label: function(tooltipItem, data) { + var label = data.datasets[tooltipItem.datasetIndex].label || ''; + + if (label) { + label += ': '; + } + if (!helpers$1.isNullOrUndef(tooltipItem.value)) { + label += tooltipItem.value; + } else { + label += tooltipItem.yLabel; + } + return label; + }, + labelColor: function(tooltipItem, chart) { + var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); + var activeElement = meta.data[tooltipItem.index]; + var view = activeElement._view; + return { + borderColor: view.borderColor, + backgroundColor: view.backgroundColor + }; + }, + labelTextColor: function() { + return this._options.bodyFontColor; + }, + afterLabel: helpers$1.noop, + + // Args are: (tooltipItems, data) + afterBody: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeFooter: helpers$1.noop, + footer: helpers$1.noop, + afterFooter: helpers$1.noop + } + } +}); + +var positioners = { + /** + * Average mode places the tooltip at the average position of the elements shown + * @function Chart.Tooltip.positioners.average + * @param elements {ChartElement[]} the elements being displayed in the tooltip + * @returns {object} tooltip position + */ + average: function(elements) { + if (!elements.length) { + return false; + } + + var i, len; + var x = 0; + var y = 0; + var count = 0; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var pos = el.tooltipPosition(); + x += pos.x; + y += pos.y; + ++count; + } + } + + return { + x: x / count, + y: y / count + }; + }, + + /** + * Gets the tooltip position nearest of the item nearest to the event position + * @function Chart.Tooltip.positioners.nearest + * @param elements {Chart.Element[]} the tooltip elements + * @param eventPosition {object} the position of the event in canvas coordinates + * @returns {object} the tooltip position + */ + nearest: function(elements, eventPosition) { + var x = eventPosition.x; + var y = eventPosition.y; + var minDistance = Number.POSITIVE_INFINITY; + var i, len, nearestElement; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var center = el.getCenterPoint(); + var d = helpers$1.distanceBetweenPoints(eventPosition, center); + + if (d < minDistance) { + minDistance = d; + nearestElement = el; + } + } + } + + if (nearestElement) { + var tp = nearestElement.tooltipPosition(); + x = tp.x; + y = tp.y; + } + + return { + x: x, + y: y + }; + } +}; + +// Helper to push or concat based on if the 2nd parameter is an array or not +function pushOrConcat(base, toPush) { + if (toPush) { + if (helpers$1.isArray(toPush)) { + // base = base.concat(toPush); + Array.prototype.push.apply(base, toPush); + } else { + base.push(toPush); + } + } + + return base; +} + +/** + * Returns array of strings split by newline + * @param {string} value - The value to split by newline. + * @returns {string[]} value if newline present - Returned from String split() method + * @function + */ +function splitNewlines(str) { + if ((typeof str === 'string' || str instanceof String) && str.indexOf('\n') > -1) { + return str.split('\n'); + } + return str; +} + + +/** + * Private helper to create a tooltip item model + * @param element - the chart element (point, arc, bar) to create the tooltip item for + * @return new tooltip item + */ +function createTooltipItem(element) { + var xScale = element._xScale; + var yScale = element._yScale || element._scale; // handle radar || polarArea charts + var index = element._index; + var datasetIndex = element._datasetIndex; + var controller = element._chart.getDatasetMeta(datasetIndex).controller; + var indexScale = controller._getIndexScale(); + var valueScale = controller._getValueScale(); + + return { + xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', + yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', + label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '', + value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '', + index: index, + datasetIndex: datasetIndex, + x: element._model.x, + y: element._model.y + }; +} + +/** + * Helper to get the reset model for the tooltip + * @param tooltipOpts {object} the tooltip options + */ +function getBaseModel(tooltipOpts) { + var globalDefaults = core_defaults.global; + + return { + // Positioning + xPadding: tooltipOpts.xPadding, + yPadding: tooltipOpts.yPadding, + xAlign: tooltipOpts.xAlign, + yAlign: tooltipOpts.yAlign, + + // Body + bodyFontColor: tooltipOpts.bodyFontColor, + _bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), + _bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), + _bodyAlign: tooltipOpts.bodyAlign, + bodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), + bodySpacing: tooltipOpts.bodySpacing, + + // Title + titleFontColor: tooltipOpts.titleFontColor, + _titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), + _titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), + titleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), + _titleAlign: tooltipOpts.titleAlign, + titleSpacing: tooltipOpts.titleSpacing, + titleMarginBottom: tooltipOpts.titleMarginBottom, + + // Footer + footerFontColor: tooltipOpts.footerFontColor, + _footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), + _footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), + footerFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), + _footerAlign: tooltipOpts.footerAlign, + footerSpacing: tooltipOpts.footerSpacing, + footerMarginTop: tooltipOpts.footerMarginTop, + + // Appearance + caretSize: tooltipOpts.caretSize, + cornerRadius: tooltipOpts.cornerRadius, + backgroundColor: tooltipOpts.backgroundColor, + opacity: 0, + legendColorBackground: tooltipOpts.multiKeyBackground, + displayColors: tooltipOpts.displayColors, + borderColor: tooltipOpts.borderColor, + borderWidth: tooltipOpts.borderWidth + }; +} + +/** + * Get the size of the tooltip + */ +function getTooltipSize(tooltip, model) { + var ctx = tooltip._chart.ctx; + + var height = model.yPadding * 2; // Tooltip Padding + var width = 0; + + // Count of all lines in the body + var body = model.body; + var combinedBodyLength = body.reduce(function(count, bodyItem) { + return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; + }, 0); + combinedBodyLength += model.beforeBody.length + model.afterBody.length; + + var titleLineCount = model.title.length; + var footerLineCount = model.footer.length; + var titleFontSize = model.titleFontSize; + var bodyFontSize = model.bodyFontSize; + var footerFontSize = model.footerFontSize; + + height += titleLineCount * titleFontSize; // Title Lines + height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing + height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin + height += combinedBodyLength * bodyFontSize; // Body Lines + height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing + height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin + height += footerLineCount * (footerFontSize); // Footer Lines + height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing + + // Title width + var widthPadding = 0; + var maxLineWidth = function(line) { + width = Math.max(width, ctx.measureText(line).width + widthPadding); + }; + + ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); + helpers$1.each(model.title, maxLineWidth); + + // Body width + ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); + helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth); + + // Body lines may include some extra width due to the color box + widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; + helpers$1.each(body, function(bodyItem) { + helpers$1.each(bodyItem.before, maxLineWidth); + helpers$1.each(bodyItem.lines, maxLineWidth); + helpers$1.each(bodyItem.after, maxLineWidth); + }); + + // Reset back to 0 + widthPadding = 0; + + // Footer width + ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); + helpers$1.each(model.footer, maxLineWidth); + + // Add padding + width += 2 * model.xPadding; + + return { + width: width, + height: height + }; +} + +/** + * Helper to get the alignment of a tooltip given the size + */ +function determineAlignment(tooltip, size) { + var model = tooltip._model; + var chart = tooltip._chart; + var chartArea = tooltip._chart.chartArea; + var xAlign = 'center'; + var yAlign = 'center'; + + if (model.y < size.height) { + yAlign = 'top'; + } else if (model.y > (chart.height - size.height)) { + yAlign = 'bottom'; + } + + var lf, rf; // functions to determine left, right alignment + var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart + var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges + var midX = (chartArea.left + chartArea.right) / 2; + var midY = (chartArea.top + chartArea.bottom) / 2; + + if (yAlign === 'center') { + lf = function(x) { + return x <= midX; + }; + rf = function(x) { + return x > midX; + }; + } else { + lf = function(x) { + return x <= (size.width / 2); + }; + rf = function(x) { + return x >= (chart.width - (size.width / 2)); + }; + } + + olf = function(x) { + return x + size.width + model.caretSize + model.caretPadding > chart.width; + }; + orf = function(x) { + return x - size.width - model.caretSize - model.caretPadding < 0; + }; + yf = function(y) { + return y <= midY ? 'top' : 'bottom'; + }; + + if (lf(model.x)) { + xAlign = 'left'; + + // Is tooltip too wide and goes over the right side of the chart.? + if (olf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } else if (rf(model.x)) { + xAlign = 'right'; + + // Is tooltip too wide and goes outside left edge of canvas? + if (orf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } + + var opts = tooltip._options; + return { + xAlign: opts.xAlign ? opts.xAlign : xAlign, + yAlign: opts.yAlign ? opts.yAlign : yAlign + }; +} + +/** + * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment + */ +function getBackgroundPoint(vm, size, alignment, chart) { + // Background Position + var x = vm.x; + var y = vm.y; + + var caretSize = vm.caretSize; + var caretPadding = vm.caretPadding; + var cornerRadius = vm.cornerRadius; + var xAlign = alignment.xAlign; + var yAlign = alignment.yAlign; + var paddingAndSize = caretSize + caretPadding; + var radiusAndPadding = cornerRadius + caretPadding; + + if (xAlign === 'right') { + x -= size.width; + } else if (xAlign === 'center') { + x -= (size.width / 2); + if (x + size.width > chart.width) { + x = chart.width - size.width; + } + if (x < 0) { + x = 0; + } + } + + if (yAlign === 'top') { + y += paddingAndSize; + } else if (yAlign === 'bottom') { + y -= size.height + paddingAndSize; + } else { + y -= (size.height / 2); + } + + if (yAlign === 'center') { + if (xAlign === 'left') { + x += paddingAndSize; + } else if (xAlign === 'right') { + x -= paddingAndSize; + } + } else if (xAlign === 'left') { + x -= radiusAndPadding; + } else if (xAlign === 'right') { + x += radiusAndPadding; + } + + return { + x: x, + y: y + }; +} + +function getAlignedX(vm, align) { + return align === 'center' + ? vm.x + vm.width / 2 + : align === 'right' + ? vm.x + vm.width - vm.xPadding + : vm.x + vm.xPadding; +} + +/** + * Helper to build before and after body lines + */ +function getBeforeAfterBodyLines(callback) { + return pushOrConcat([], splitNewlines(callback)); +} + +var exports$3 = core_element.extend({ + initialize: function() { + this._model = getBaseModel(this._options); + this._lastActive = []; + }, + + // Get the title + // Args are: (tooltipItem, data) + getTitle: function() { + var me = this; + var opts = me._options; + var callbacks = opts.callbacks; + + var beforeTitle = callbacks.beforeTitle.apply(me, arguments); + var title = callbacks.title.apply(me, arguments); + var afterTitle = callbacks.afterTitle.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeTitle)); + lines = pushOrConcat(lines, splitNewlines(title)); + lines = pushOrConcat(lines, splitNewlines(afterTitle)); + + return lines; + }, + + // Args are: (tooltipItem, data) + getBeforeBody: function() { + return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments)); + }, + + // Args are: (tooltipItem, data) + getBody: function(tooltipItems, data) { + var me = this; + var callbacks = me._options.callbacks; + var bodyItems = []; + + helpers$1.each(tooltipItems, function(tooltipItem) { + var bodyItem = { + before: [], + lines: [], + after: [] + }; + pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data))); + pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); + pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data))); + + bodyItems.push(bodyItem); + }); + + return bodyItems; + }, + + // Args are: (tooltipItem, data) + getAfterBody: function() { + return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments)); + }, + + // Get the footer and beforeFooter and afterFooter lines + // Args are: (tooltipItem, data) + getFooter: function() { + var me = this; + var callbacks = me._options.callbacks; + + var beforeFooter = callbacks.beforeFooter.apply(me, arguments); + var footer = callbacks.footer.apply(me, arguments); + var afterFooter = callbacks.afterFooter.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeFooter)); + lines = pushOrConcat(lines, splitNewlines(footer)); + lines = pushOrConcat(lines, splitNewlines(afterFooter)); + + return lines; + }, + + update: function(changed) { + var me = this; + var opts = me._options; + + // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition + // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time + // which breaks any animations. + var existingModel = me._model; + var model = me._model = getBaseModel(opts); + var active = me._active; + + var data = me._data; + + // In the case where active.length === 0 we need to keep these at existing values for good animations + var alignment = { + xAlign: existingModel.xAlign, + yAlign: existingModel.yAlign + }; + var backgroundPoint = { + x: existingModel.x, + y: existingModel.y + }; + var tooltipSize = { + width: existingModel.width, + height: existingModel.height + }; + var tooltipPosition = { + x: existingModel.caretX, + y: existingModel.caretY + }; + + var i, len; + + if (active.length) { + model.opacity = 1; + + var labelColors = []; + var labelTextColors = []; + tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition); + + var tooltipItems = []; + for (i = 0, len = active.length; i < len; ++i) { + tooltipItems.push(createTooltipItem(active[i])); + } + + // If the user provided a filter function, use it to modify the tooltip items + if (opts.filter) { + tooltipItems = tooltipItems.filter(function(a) { + return opts.filter(a, data); + }); + } + + // If the user provided a sorting function, use it to modify the tooltip items + if (opts.itemSort) { + tooltipItems = tooltipItems.sort(function(a, b) { + return opts.itemSort(a, b, data); + }); + } + + // Determine colors for boxes + helpers$1.each(tooltipItems, function(tooltipItem) { + labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); + labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); + }); + + + // Build the Text Lines + model.title = me.getTitle(tooltipItems, data); + model.beforeBody = me.getBeforeBody(tooltipItems, data); + model.body = me.getBody(tooltipItems, data); + model.afterBody = me.getAfterBody(tooltipItems, data); + model.footer = me.getFooter(tooltipItems, data); + + // Initial positioning and colors + model.x = tooltipPosition.x; + model.y = tooltipPosition.y; + model.caretPadding = opts.caretPadding; + model.labelColors = labelColors; + model.labelTextColors = labelTextColors; + + // data points + model.dataPoints = tooltipItems; + + // We need to determine alignment of the tooltip + tooltipSize = getTooltipSize(this, model); + alignment = determineAlignment(this, tooltipSize); + // Final Size and Position + backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart); + } else { + model.opacity = 0; + } + + model.xAlign = alignment.xAlign; + model.yAlign = alignment.yAlign; + model.x = backgroundPoint.x; + model.y = backgroundPoint.y; + model.width = tooltipSize.width; + model.height = tooltipSize.height; + + // Point where the caret on the tooltip points to + model.caretX = tooltipPosition.x; + model.caretY = tooltipPosition.y; + + me._model = model; + + if (changed && opts.custom) { + opts.custom.call(me, model); + } + + return me; + }, + + drawCaret: function(tooltipPoint, size) { + var ctx = this._chart.ctx; + var vm = this._view; + var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); + + ctx.lineTo(caretPosition.x1, caretPosition.y1); + ctx.lineTo(caretPosition.x2, caretPosition.y2); + ctx.lineTo(caretPosition.x3, caretPosition.y3); + }, + getCaretPosition: function(tooltipPoint, size, vm) { + var x1, x2, x3, y1, y2, y3; + var caretSize = vm.caretSize; + var cornerRadius = vm.cornerRadius; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var ptX = tooltipPoint.x; + var ptY = tooltipPoint.y; + var width = size.width; + var height = size.height; + + if (yAlign === 'center') { + y2 = ptY + (height / 2); + + if (xAlign === 'left') { + x1 = ptX; + x2 = x1 - caretSize; + x3 = x1; + + y1 = y2 + caretSize; + y3 = y2 - caretSize; + } else { + x1 = ptX + width; + x2 = x1 + caretSize; + x3 = x1; + + y1 = y2 - caretSize; + y3 = y2 + caretSize; + } + } else { + if (xAlign === 'left') { + x2 = ptX + cornerRadius + (caretSize); + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else if (xAlign === 'right') { + x2 = ptX + width - cornerRadius - caretSize; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else { + x2 = vm.caretX; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } + if (yAlign === 'top') { + y1 = ptY; + y2 = y1 - caretSize; + y3 = y1; + } else { + y1 = ptY + height; + y2 = y1 + caretSize; + y3 = y1; + // invert drawing order + var tmp = x3; + x3 = x1; + x1 = tmp; + } + } + return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; + }, + + drawTitle: function(pt, vm, ctx) { + var title = vm.title; + + if (title.length) { + pt.x = getAlignedX(vm, vm._titleAlign); + + ctx.textAlign = vm._titleAlign; + ctx.textBaseline = 'top'; + + var titleFontSize = vm.titleFontSize; + var titleSpacing = vm.titleSpacing; + + ctx.fillStyle = vm.titleFontColor; + ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); + + var i, len; + for (i = 0, len = title.length; i < len; ++i) { + ctx.fillText(title[i], pt.x, pt.y); + pt.y += titleFontSize + titleSpacing; // Line Height and spacing + + if (i + 1 === title.length) { + pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing + } + } + } + }, + + drawBody: function(pt, vm, ctx) { + var bodyFontSize = vm.bodyFontSize; + var bodySpacing = vm.bodySpacing; + var bodyAlign = vm._bodyAlign; + var body = vm.body; + var drawColorBoxes = vm.displayColors; + var labelColors = vm.labelColors; + var xLinePadding = 0; + var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0; + var textColor; + + ctx.textAlign = bodyAlign; + ctx.textBaseline = 'top'; + ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); + + pt.x = getAlignedX(vm, bodyAlign); + + // Before Body + var fillLineOfText = function(line) { + ctx.fillText(line, pt.x + xLinePadding, pt.y); + pt.y += bodyFontSize + bodySpacing; + }; + + // Before body lines + ctx.fillStyle = vm.bodyFontColor; + helpers$1.each(vm.beforeBody, fillLineOfText); + + xLinePadding = drawColorBoxes && bodyAlign !== 'right' + ? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2) + : 0; + + // Draw body lines now + helpers$1.each(body, function(bodyItem, i) { + textColor = vm.labelTextColors[i]; + ctx.fillStyle = textColor; + helpers$1.each(bodyItem.before, fillLineOfText); + + helpers$1.each(bodyItem.lines, function(line) { + // Draw Legend-like boxes if needed + if (drawColorBoxes) { + // Fill a white rect so that colours merge nicely if the opacity is < 1 + ctx.fillStyle = vm.legendColorBackground; + ctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Border + ctx.lineWidth = 1; + ctx.strokeStyle = labelColors[i].borderColor; + ctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Inner square + ctx.fillStyle = labelColors[i].backgroundColor; + ctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); + ctx.fillStyle = textColor; + } + + fillLineOfText(line); + }); + + helpers$1.each(bodyItem.after, fillLineOfText); + }); + + // Reset back to 0 for after body + xLinePadding = 0; + + // After body lines + helpers$1.each(vm.afterBody, fillLineOfText); + pt.y -= bodySpacing; // Remove last body spacing + }, + + drawFooter: function(pt, vm, ctx) { + var footer = vm.footer; + + if (footer.length) { + pt.x = getAlignedX(vm, vm._footerAlign); + pt.y += vm.footerMarginTop; + + ctx.textAlign = vm._footerAlign; + ctx.textBaseline = 'top'; + + ctx.fillStyle = vm.footerFontColor; + ctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); + + helpers$1.each(footer, function(line) { + ctx.fillText(line, pt.x, pt.y); + pt.y += vm.footerFontSize + vm.footerSpacing; + }); + } + }, + + drawBackground: function(pt, vm, ctx, tooltipSize) { + ctx.fillStyle = vm.backgroundColor; + ctx.strokeStyle = vm.borderColor; + ctx.lineWidth = vm.borderWidth; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var x = pt.x; + var y = pt.y; + var width = tooltipSize.width; + var height = tooltipSize.height; + var radius = vm.cornerRadius; + + ctx.beginPath(); + ctx.moveTo(x + radius, y); + if (yAlign === 'top') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + if (yAlign === 'center' && xAlign === 'right') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + if (yAlign === 'bottom') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + if (yAlign === 'center' && xAlign === 'left') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + + ctx.fill(); + + if (vm.borderWidth > 0) { + ctx.stroke(); + } + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + + if (vm.opacity === 0) { + return; + } + + var tooltipSize = { + width: vm.width, + height: vm.height + }; + var pt = { + x: vm.x, + y: vm.y + }; + + // IE11/Edge does not like very small opacities, so snap to 0 + var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; + + // Truthy/falsey value for empty tooltip + var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; + + if (this._options.enabled && hasTooltipContent) { + ctx.save(); + ctx.globalAlpha = opacity; + + // Draw Background + this.drawBackground(pt, vm, ctx, tooltipSize); + + // Draw Title, Body, and Footer + pt.y += vm.yPadding; + + // Titles + this.drawTitle(pt, vm, ctx); + + // Body + this.drawBody(pt, vm, ctx); + + // Footer + this.drawFooter(pt, vm, ctx); + + ctx.restore(); + } + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + * @returns {boolean} true if the tooltip changed + */ + handleEvent: function(e) { + var me = this; + var options = me._options; + var changed = false; + + me._lastActive = me._lastActive || []; + + // Find Active Elements for tooltips + if (e.type === 'mouseout') { + me._active = []; + } else { + me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); + } + + // Remember Last Actives + changed = !helpers$1.arrayEquals(me._active, me._lastActive); + + // Only handle target event on tooltip change + if (changed) { + me._lastActive = me._active; + + if (options.enabled || options.custom) { + me._eventPosition = { + x: e.x, + y: e.y + }; + + me.update(true); + me.pivot(); + } + } + + return changed; + } +}); + +/** + * @namespace Chart.Tooltip.positioners + */ +var positioners_1 = positioners; + +var core_tooltip = exports$3; +core_tooltip.positioners = positioners_1; + +var valueOrDefault$8 = helpers$1.valueOrDefault; + +core_defaults._set('global', { + elements: {}, + events: [ + 'mousemove', + 'mouseout', + 'click', + 'touchstart', + 'touchmove' + ], + hover: { + onHover: null, + mode: 'nearest', + intersect: true, + animationDuration: 400 + }, + onClick: null, + maintainAspectRatio: true, + responsive: true, + responsiveAnimationDuration: 0 +}); + +/** + * Recursively merge the given config objects representing the `scales` option + * by incorporating scale defaults in `xAxes` and `yAxes` array items, then + * returns a deep copy of the result, thus doesn't alter inputs. + */ +function mergeScaleConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function(key, target, source, options) { + if (key === 'xAxes' || key === 'yAxes') { + var slen = source[key].length; + var i, type, scale; + + if (!target[key]) { + target[key] = []; + } + + for (i = 0; i < slen; ++i) { + scale = source[key][i]; + type = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear'); + + if (i >= target[key].length) { + target[key].push({}); + } + + if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { + // new/untyped scale or type changed: let's apply the new defaults + // then merge source scale to correctly overwrite the defaults. + helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]); + } else { + // scales type are the same + helpers$1.merge(target[key][i], scale); + } + } + } else { + helpers$1._merger(key, target, source, options); + } + } + }); +} + +/** + * Recursively merge the given config objects as the root options by handling + * default scale options for the `scales` and `scale` properties, then returns + * a deep copy of the result, thus doesn't alter inputs. + */ +function mergeConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function(key, target, source, options) { + var tval = target[key] || {}; + var sval = source[key]; + + if (key === 'scales') { + // scale config merging is complex. Add our own function here for that + target[key] = mergeScaleConfig(tval, sval); + } else if (key === 'scale') { + // used in polar area & radar charts since there is only one scale + target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]); + } else { + helpers$1._merger(key, target, source, options); + } + } + }); +} + +function initConfig(config) { + config = config || {}; + + // Do NOT use mergeConfig for the data object because this method merges arrays + // and so would change references to labels and datasets, preventing data updates. + var data = config.data = config.data || {}; + data.datasets = data.datasets || []; + data.labels = data.labels || []; + + config.options = mergeConfig( + core_defaults.global, + core_defaults[config.type], + config.options || {}); + + return config; +} + +function updateConfig(chart) { + var newOptions = chart.options; + + helpers$1.each(chart.scales, function(scale) { + core_layouts.removeBox(chart, scale); + }); + + newOptions = mergeConfig( + core_defaults.global, + core_defaults[chart.config.type], + newOptions); + + chart.options = chart.config.options = newOptions; + chart.ensureScalesHaveIDs(); + chart.buildOrUpdateScales(); + + // Tooltip + chart.tooltip._options = newOptions.tooltips; + chart.tooltip.initialize(); +} + +function positionIsHorizontal(position) { + return position === 'top' || position === 'bottom'; +} + +var Chart = function(item, config) { + this.construct(item, config); + return this; +}; + +helpers$1.extend(Chart.prototype, /** @lends Chart */ { + /** + * @private + */ + construct: function(item, config) { + var me = this; + + config = initConfig(config); + + var context = platform.acquireContext(item, config); + var canvas = context && context.canvas; + var height = canvas && canvas.height; + var width = canvas && canvas.width; + + me.id = helpers$1.uid(); + me.ctx = context; + me.canvas = canvas; + me.config = config; + me.width = width; + me.height = height; + me.aspectRatio = height ? width / height : null; + me.options = config.options; + me._bufferedRender = false; + + /** + * Provided for backward compatibility, Chart and Chart.Controller have been merged, + * the "instance" still need to be defined since it might be called from plugins. + * @prop Chart#chart + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ + me.chart = me; + me.controller = me; // chart.chart.controller #inception + + // Add the chart instance to the global namespace + Chart.instances[me.id] = me; + + // Define alias to the config data: `chart.data === chart.config.data` + Object.defineProperty(me, 'data', { + get: function() { + return me.config.data; + }, + set: function(value) { + me.config.data = value; + } + }); + + if (!context || !canvas) { + // The given item is not a compatible context2d element, let's return before finalizing + // the chart initialization but after setting basic chart / controller properties that + // can help to figure out that the chart is not valid (e.g chart.canvas !== null); + // https://github.com/chartjs/Chart.js/issues/2807 + console.error("Failed to create chart: can't acquire context from the given item"); + return; + } + + me.initialize(); + me.update(); + }, + + /** + * @private + */ + initialize: function() { + var me = this; + + // Before init plugin notification + core_plugins.notify(me, 'beforeInit'); + + helpers$1.retinaScale(me, me.options.devicePixelRatio); + + me.bindEvents(); + + if (me.options.responsive) { + // Initial resize before chart draws (must be silent to preserve initial animations). + me.resize(true); + } + + // Make sure scales have IDs and are built before we build any controllers. + me.ensureScalesHaveIDs(); + me.buildOrUpdateScales(); + me.initToolTip(); + + // After init plugin notification + core_plugins.notify(me, 'afterInit'); + + return me; + }, + + clear: function() { + helpers$1.canvas.clear(this); + return this; + }, + + stop: function() { + // Stops any current animation loop occurring + core_animations.cancelAnimation(this); + return this; + }, + + resize: function(silent) { + var me = this; + var options = me.options; + var canvas = me.canvas; + var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; + + // the canvas render width and height will be casted to integers so make sure that + // the canvas display style uses the same integer values to avoid blurring effect. + + // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed + var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas))); + var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas))); + + if (me.width === newWidth && me.height === newHeight) { + return; + } + + canvas.width = me.width = newWidth; + canvas.height = me.height = newHeight; + canvas.style.width = newWidth + 'px'; + canvas.style.height = newHeight + 'px'; + + helpers$1.retinaScale(me, options.devicePixelRatio); + + if (!silent) { + // Notify any plugins about the resize + var newSize = {width: newWidth, height: newHeight}; + core_plugins.notify(me, 'resize', [newSize]); + + // Notify of resize + if (options.onResize) { + options.onResize(me, newSize); + } + + me.stop(); + me.update({ + duration: options.responsiveAnimationDuration + }); + } + }, + + ensureScalesHaveIDs: function() { + var options = this.options; + var scalesOptions = options.scales || {}; + var scaleOptions = options.scale; + + helpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) { + xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); + }); + + helpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) { + yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); + }); + + if (scaleOptions) { + scaleOptions.id = scaleOptions.id || 'scale'; + } + }, + + /** + * Builds a map of scale ID to scale object for future lookup. + */ + buildOrUpdateScales: function() { + var me = this; + var options = me.options; + var scales = me.scales || {}; + var items = []; + var updated = Object.keys(scales).reduce(function(obj, id) { + obj[id] = false; + return obj; + }, {}); + + if (options.scales) { + items = items.concat( + (options.scales.xAxes || []).map(function(xAxisOptions) { + return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; + }), + (options.scales.yAxes || []).map(function(yAxisOptions) { + return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; + }) + ); + } + + if (options.scale) { + items.push({ + options: options.scale, + dtype: 'radialLinear', + isDefault: true, + dposition: 'chartArea' + }); + } + + helpers$1.each(items, function(item) { + var scaleOptions = item.options; + var id = scaleOptions.id; + var scaleType = valueOrDefault$8(scaleOptions.type, item.dtype); + + if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { + scaleOptions.position = item.dposition; + } + + updated[id] = true; + var scale = null; + if (id in scales && scales[id].type === scaleType) { + scale = scales[id]; + scale.options = scaleOptions; + scale.ctx = me.ctx; + scale.chart = me; + } else { + var scaleClass = core_scaleService.getScaleConstructor(scaleType); + if (!scaleClass) { + return; + } + scale = new scaleClass({ + id: id, + type: scaleType, + options: scaleOptions, + ctx: me.ctx, + chart: me + }); + scales[scale.id] = scale; + } + + scale.mergeTicksOptions(); + + // TODO(SB): I think we should be able to remove this custom case (options.scale) + // and consider it as a regular scale part of the "scales"" map only! This would + // make the logic easier and remove some useless? custom code. + if (item.isDefault) { + me.scale = scale; + } + }); + // clear up discarded scales + helpers$1.each(updated, function(hasUpdated, id) { + if (!hasUpdated) { + delete scales[id]; + } + }); + + me.scales = scales; + + core_scaleService.addScalesToLayout(this); + }, + + buildOrUpdateControllers: function() { + var me = this; + var newControllers = []; + + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + var meta = me.getDatasetMeta(datasetIndex); + var type = dataset.type || me.config.type; + + if (meta.type && meta.type !== type) { + me.destroyDatasetMeta(datasetIndex); + meta = me.getDatasetMeta(datasetIndex); + } + meta.type = type; + + if (meta.controller) { + meta.controller.updateIndex(datasetIndex); + meta.controller.linkScales(); + } else { + var ControllerClass = controllers[meta.type]; + if (ControllerClass === undefined) { + throw new Error('"' + meta.type + '" is not a chart type.'); + } + + meta.controller = new ControllerClass(me, datasetIndex); + newControllers.push(meta.controller); + } + }, me); + + return newControllers; + }, + + /** + * Reset the elements of all datasets + * @private + */ + resetElements: function() { + var me = this; + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.reset(); + }, me); + }, + + /** + * Resets the chart back to it's state before the initial animation + */ + reset: function() { + this.resetElements(); + this.tooltip.initialize(); + }, + + update: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + updateConfig(me); + + // plugins options references might have change, let's invalidate the cache + // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + core_plugins._invalidate(me); + + if (core_plugins.notify(me, 'beforeUpdate') === false) { + return; + } + + // In case the entire data object changed + me.tooltip._data = me.data; + + // Make sure dataset controllers are updated and new controllers are reset + var newControllers = me.buildOrUpdateControllers(); + + // Make sure all dataset controllers have correct meta data counts + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); + }, me); + + me.updateLayout(); + + // Can only reset the new controllers after the scales have been updated + if (me.options.animation && me.options.animation.duration) { + helpers$1.each(newControllers, function(controller) { + controller.reset(); + }); + } + + me.updateDatasets(); + + // Need to reset tooltip in case it is displayed with elements that are removed + // after update. + me.tooltip.initialize(); + + // Last active contains items that were previously in the tooltip. + // When we reset the tooltip, we need to clear it + me.lastActive = []; + + // Do this before render so that any plugins that need final scale updates can use it + core_plugins.notify(me, 'afterUpdate'); + + if (me._bufferedRender) { + me._bufferedRequest = { + duration: config.duration, + easing: config.easing, + lazy: config.lazy + }; + } else { + me.render(config); + } + }, + + /** + * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` + * hook, in which case, plugins will not be called on `afterLayout`. + * @private + */ + updateLayout: function() { + var me = this; + + if (core_plugins.notify(me, 'beforeLayout') === false) { + return; + } + + core_layouts.update(this, this.width, this.height); + + /** + * Provided for backward compatibility, use `afterLayout` instead. + * @method IPlugin#afterScaleUpdate + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ + core_plugins.notify(me, 'afterScaleUpdate'); + core_plugins.notify(me, 'afterLayout'); + }, + + /** + * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` + * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. + * @private + */ + updateDatasets: function() { + var me = this; + + if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) { + return; + } + + for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.updateDataset(i); + } + + core_plugins.notify(me, 'afterDatasetsUpdate'); + }, + + /** + * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` + * hook, in which case, plugins will not be called on `afterDatasetUpdate`. + * @private + */ + updateDataset: function(index) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index + }; + + if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { + return; + } + + meta.controller.update(); + + core_plugins.notify(me, 'afterDatasetUpdate', [args]); + }, + + render: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + var animationOptions = me.options.animation; + var duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration); + var lazy = config.lazy; + + if (core_plugins.notify(me, 'beforeRender') === false) { + return; + } + + var onComplete = function(animation) { + core_plugins.notify(me, 'afterRender'); + helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me); + }; + + if (animationOptions && duration) { + var animation = new core_animation({ + numSteps: duration / 16.66, // 60 fps + easing: config.easing || animationOptions.easing, + + render: function(chart, animationObject) { + var easingFunction = helpers$1.easing.effects[animationObject.easing]; + var currentStep = animationObject.currentStep; + var stepDecimal = currentStep / animationObject.numSteps; + + chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); + }, + + onAnimationProgress: animationOptions.onProgress, + onAnimationComplete: onComplete + }); + + core_animations.addAnimation(me, animation, duration, lazy); + } else { + me.draw(); + + // See https://github.com/chartjs/Chart.js/issues/3781 + onComplete(new core_animation({numSteps: 0, chart: me})); + } + + return me; + }, + + draw: function(easingValue) { + var me = this; + + me.clear(); + + if (helpers$1.isNullOrUndef(easingValue)) { + easingValue = 1; + } + + me.transition(easingValue); + + if (me.width <= 0 || me.height <= 0) { + return; + } + + if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) { + return; + } + + // Draw all the scales + helpers$1.each(me.boxes, function(box) { + box.draw(me.chartArea); + }, me); + + me.drawDatasets(easingValue); + me._drawTooltip(easingValue); + + core_plugins.notify(me, 'afterDraw', [easingValue]); + }, + + /** + * @private + */ + transition: function(easingValue) { + var me = this; + + for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { + if (me.isDatasetVisible(i)) { + me.getDatasetMeta(i).controller.transition(easingValue); + } + } + + me.tooltip.transition(easingValue); + }, + + /** + * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` + * hook, in which case, plugins will not be called on `afterDatasetsDraw`. + * @private + */ + drawDatasets: function(easingValue) { + var me = this; + + if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { + return; + } + + // Draw datasets reversed to support proper line stacking + for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { + if (me.isDatasetVisible(i)) { + me.drawDataset(i, easingValue); + } + } + + core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]); + }, + + /** + * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` + * hook, in which case, plugins will not be called on `afterDatasetDraw`. + * @private + */ + drawDataset: function(index, easingValue) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index, + easingValue: easingValue + }; + + if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { + return; + } + + meta.controller.draw(easingValue); + + core_plugins.notify(me, 'afterDatasetDraw', [args]); + }, + + /** + * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` + * hook, in which case, plugins will not be called on `afterTooltipDraw`. + * @private + */ + _drawTooltip: function(easingValue) { + var me = this; + var tooltip = me.tooltip; + var args = { + tooltip: tooltip, + easingValue: easingValue + }; + + if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { + return; + } + + tooltip.draw(); + + core_plugins.notify(me, 'afterTooltipDraw', [args]); + }, + + /** + * Get the single element that was clicked on + * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw + */ + getElementAtEvent: function(e) { + return core_interaction.modes.single(this, e); + }, + + getElementsAtEvent: function(e) { + return core_interaction.modes.label(this, e, {intersect: true}); + }, + + getElementsAtXAxis: function(e) { + return core_interaction.modes['x-axis'](this, e, {intersect: true}); + }, + + getElementsAtEventForMode: function(e, mode, options) { + var method = core_interaction.modes[mode]; + if (typeof method === 'function') { + return method(this, e, options); + } + + return []; + }, + + getDatasetAtEvent: function(e) { + return core_interaction.modes.dataset(this, e, {intersect: true}); + }, + + getDatasetMeta: function(datasetIndex) { + var me = this; + var dataset = me.data.datasets[datasetIndex]; + if (!dataset._meta) { + dataset._meta = {}; + } + + var meta = dataset._meta[me.id]; + if (!meta) { + meta = dataset._meta[me.id] = { + type: null, + data: [], + dataset: null, + controller: null, + hidden: null, // See isDatasetVisible() comment + xAxisID: null, + yAxisID: null + }; + } + + return meta; + }, + + getVisibleDatasetCount: function() { + var count = 0; + for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + if (this.isDatasetVisible(i)) { + count++; + } + } + return count; + }, + + isDatasetVisible: function(datasetIndex) { + var meta = this.getDatasetMeta(datasetIndex); + + // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, + // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. + return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; + }, + + generateLegend: function() { + return this.options.legendCallback(this); + }, + + /** + * @private + */ + destroyDatasetMeta: function(datasetIndex) { + var id = this.id; + var dataset = this.data.datasets[datasetIndex]; + var meta = dataset._meta && dataset._meta[id]; + + if (meta) { + meta.controller.destroy(); + delete dataset._meta[id]; + } + }, + + destroy: function() { + var me = this; + var canvas = me.canvas; + var i, ilen; + + me.stop(); + + // dataset controllers need to cleanup associated data + for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.destroyDatasetMeta(i); + } + + if (canvas) { + me.unbindEvents(); + helpers$1.canvas.clear(me); + platform.releaseContext(me.ctx); + me.canvas = null; + me.ctx = null; + } + + core_plugins.notify(me, 'destroy'); + + delete Chart.instances[me.id]; + }, + + toBase64Image: function() { + return this.canvas.toDataURL.apply(this.canvas, arguments); + }, + + initToolTip: function() { + var me = this; + me.tooltip = new core_tooltip({ + _chart: me, + _chartInstance: me, // deprecated, backward compatibility + _data: me.data, + _options: me.options.tooltips + }, me); + }, + + /** + * @private + */ + bindEvents: function() { + var me = this; + var listeners = me._listeners = {}; + var listener = function() { + me.eventHandler.apply(me, arguments); + }; + + helpers$1.each(me.options.events, function(type) { + platform.addEventListener(me, type, listener); + listeners[type] = listener; + }); + + // Elements used to detect size change should not be injected for non responsive charts. + // See https://github.com/chartjs/Chart.js/issues/2210 + if (me.options.responsive) { + listener = function() { + me.resize(); + }; + + platform.addEventListener(me, 'resize', listener); + listeners.resize = listener; + } + }, + + /** + * @private + */ + unbindEvents: function() { + var me = this; + var listeners = me._listeners; + if (!listeners) { + return; + } + + delete me._listeners; + helpers$1.each(listeners, function(listener, type) { + platform.removeEventListener(me, type, listener); + }); + }, + + updateHoverStyle: function(elements, mode, enabled) { + var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; + var element, i, ilen; + + for (i = 0, ilen = elements.length; i < ilen; ++i) { + element = elements[i]; + if (element) { + this.getDatasetMeta(element._datasetIndex).controller[method](element); + } + } + }, + + /** + * @private + */ + eventHandler: function(e) { + var me = this; + var tooltip = me.tooltip; + + if (core_plugins.notify(me, 'beforeEvent', [e]) === false) { + return; + } + + // Buffer any update calls so that renders do not occur + me._bufferedRender = true; + me._bufferedRequest = null; + + var changed = me.handleEvent(e); + // for smooth tooltip animations issue #4989 + // the tooltip should be the source of change + // Animation check workaround: + // tooltip._start will be null when tooltip isn't animating + if (tooltip) { + changed = tooltip._start + ? tooltip.handleEvent(e) + : changed | tooltip.handleEvent(e); + } + + core_plugins.notify(me, 'afterEvent', [e]); + + var bufferedRequest = me._bufferedRequest; + if (bufferedRequest) { + // If we have an update that was triggered, we need to do a normal render + me.render(bufferedRequest); + } else if (changed && !me.animating) { + // If entering, leaving, or changing elements, animate the change via pivot + me.stop(); + + // We only need to render at this point. Updating will cause scales to be + // recomputed generating flicker & using more memory than necessary. + me.render({ + duration: me.options.hover.animationDuration, + lazy: true + }); + } + + me._bufferedRender = false; + me._bufferedRequest = null; + + return me; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event the event to handle + * @return {boolean} true if the chart needs to re-render + */ + handleEvent: function(e) { + var me = this; + var options = me.options || {}; + var hoverOptions = options.hover; + var changed = false; + + me.lastActive = me.lastActive || []; + + // Find Active Elements for hover and tooltips + if (e.type === 'mouseout') { + me.active = []; + } else { + me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); + } + + // Invoke onHover hook + // Need to call with native event here to not break backwards compatibility + helpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); + + if (e.type === 'mouseup' || e.type === 'click') { + if (options.onClick) { + // Use e.native here for backwards compatibility + options.onClick.call(me, e.native, me.active); + } + } + + // Remove styling for last active (even if it may still be active) + if (me.lastActive.length) { + me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); + } + + // Built in hover styling + if (me.active.length && hoverOptions.mode) { + me.updateHoverStyle(me.active, hoverOptions.mode, true); + } + + changed = !helpers$1.arrayEquals(me.active, me.lastActive); + + // Remember Last Actives + me.lastActive = me.active; + + return changed; + } +}); + +/** + * NOTE(SB) We actually don't use this container anymore but we need to keep it + * for backward compatibility. Though, it can still be useful for plugins that + * would need to work on multiple charts?! + */ +Chart.instances = {}; + +var core_controller = Chart; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart instead. + * @class Chart.Controller + * @deprecated since version 2.6 + * @todo remove at version 3 + * @private + */ +Chart.Controller = Chart; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ +Chart.types = {}; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.configMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +helpers$1.configMerge = mergeConfig; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.scaleMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +helpers$1.scaleMerge = mergeScaleConfig; + +var core_helpers = function() { + + // -- Basic js utility methods + + helpers$1.where = function(collection, filterCallback) { + if (helpers$1.isArray(collection) && Array.prototype.filter) { + return collection.filter(filterCallback); + } + var filtered = []; + + helpers$1.each(collection, function(item) { + if (filterCallback(item)) { + filtered.push(item); + } + }); + + return filtered; + }; + helpers$1.findIndex = Array.prototype.findIndex ? + function(array, callback, scope) { + return array.findIndex(callback, scope); + } : + function(array, callback, scope) { + scope = scope === undefined ? array : scope; + for (var i = 0, ilen = array.length; i < ilen; ++i) { + if (callback.call(scope, array[i], i, array)) { + return i; + } + } + return -1; + }; + helpers$1.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to start of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = -1; + } + for (var i = startIndex + 1; i < arrayToSearch.length; i++) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + helpers$1.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to end of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = arrayToSearch.length; + } + for (var i = startIndex - 1; i >= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + + // -- Math methods + helpers$1.isNumber = function(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }; + helpers$1.almostEquals = function(x, y, epsilon) { + return Math.abs(x - y) < epsilon; + }; + helpers$1.almostWhole = function(x, epsilon) { + var rounded = Math.round(x); + return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); + }; + helpers$1.max = function(array) { + return array.reduce(function(max, value) { + if (!isNaN(value)) { + return Math.max(max, value); + } + return max; + }, Number.NEGATIVE_INFINITY); + }; + helpers$1.min = function(array) { + return array.reduce(function(min, value) { + if (!isNaN(value)) { + return Math.min(min, value); + } + return min; + }, Number.POSITIVE_INFINITY); + }; + helpers$1.sign = Math.sign ? + function(x) { + return Math.sign(x); + } : + function(x) { + x = +x; // convert to a number + if (x === 0 || isNaN(x)) { + return x; + } + return x > 0 ? 1 : -1; + }; + helpers$1.log10 = Math.log10 ? + function(x) { + return Math.log10(x); + } : + function(x) { + var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. + // Check for whole powers of 10, + // which due to floating point rounding error should be corrected. + var powerOf10 = Math.round(exponent); + var isPowerOf10 = x === Math.pow(10, powerOf10); + + return isPowerOf10 ? powerOf10 : exponent; + }; + helpers$1.toRadians = function(degrees) { + return degrees * (Math.PI / 180); + }; + helpers$1.toDegrees = function(radians) { + return radians * (180 / Math.PI); + }; + + /** + * Returns the number of decimal places + * i.e. the number of digits after the decimal point, of the value of this Number. + * @param {number} x - A number. + * @returns {number} The number of decimal places. + * @private + */ + helpers$1._decimalPlaces = function(x) { + if (!helpers$1.isFinite(x)) { + return; + } + var e = 1; + var p = 0; + while (Math.round(x * e) / e !== x) { + e *= 10; + p++; + } + return p; + }; + + // Gets the angle from vertical upright to the point about a centre. + helpers$1.getAngleFromPoint = function(centrePoint, anglePoint) { + var distanceFromXCenter = anglePoint.x - centrePoint.x; + var distanceFromYCenter = anglePoint.y - centrePoint.y; + var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + + var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); + + if (angle < (-0.5 * Math.PI)) { + angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }; + helpers$1.distanceBetweenPoints = function(pt1, pt2) { + return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); + }; + + /** + * Provided for backward compatibility, not available anymore + * @function Chart.helpers.aliasPixel + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ + helpers$1.aliasPixel = function(pixelWidth) { + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }; + + /** + * Returns the aligned pixel value to avoid anti-aliasing blur + * @param {Chart} chart - The chart instance. + * @param {number} pixel - A pixel value. + * @param {number} width - The width of the element. + * @returns {number} The aligned pixel value. + * @private + */ + helpers$1._alignPixel = function(chart, pixel, width) { + var devicePixelRatio = chart.currentDevicePixelRatio; + var halfWidth = width / 2; + return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; + }; + + helpers$1.splineCurve = function(firstPoint, middlePoint, afterPoint, t) { + // Props to Rob Spencer at scaled innovation for his post on splining between points + // http://scaledinnovation.com/analytics/splines/aboutSplines.html + + // This function must also respect "skipped" points + + var previous = firstPoint.skip ? middlePoint : firstPoint; + var current = middlePoint; + var next = afterPoint.skip ? middlePoint : afterPoint; + + var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); + var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); + + var s01 = d01 / (d01 + d12); + var s12 = d12 / (d01 + d12); + + // If all points are the same, s01 & s02 will be inf + s01 = isNaN(s01) ? 0 : s01; + s12 = isNaN(s12) ? 0 : s12; + + var fa = t * s01; // scaling factor for triangle Ta + var fb = t * s12; + + return { + previous: { + x: current.x - fa * (next.x - previous.x), + y: current.y - fa * (next.y - previous.y) + }, + next: { + x: current.x + fb * (next.x - previous.x), + y: current.y + fb * (next.y - previous.y) + } + }; + }; + helpers$1.EPSILON = Number.EPSILON || 1e-14; + helpers$1.splineCurveMonotone = function(points) { + // This function calculates Bézier control points in a similar way than |splineCurve|, + // but preserves monotonicity of the provided data and ensures no local extremums are added + // between the dataset discrete points due to the interpolation. + // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation + + var pointsWithTangents = (points || []).map(function(point) { + return { + model: point._model, + deltaK: 0, + mK: 0 + }; + }); + + // Calculate slopes (deltaK) and initialize tangents (mK) + var pointsLen = pointsWithTangents.length; + var i, pointBefore, pointCurrent, pointAfter; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointAfter && !pointAfter.model.skip) { + var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); + + // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 + pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; + } + + if (!pointBefore || pointBefore.model.skip) { + pointCurrent.mK = pointCurrent.deltaK; + } else if (!pointAfter || pointAfter.model.skip) { + pointCurrent.mK = pointBefore.deltaK; + } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { + pointCurrent.mK = 0; + } else { + pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; + } + } + + // Adjust tangents to ensure monotonic properties + var alphaK, betaK, tauK, squaredMagnitude; + for (i = 0; i < pointsLen - 1; ++i) { + pointCurrent = pointsWithTangents[i]; + pointAfter = pointsWithTangents[i + 1]; + if (pointCurrent.model.skip || pointAfter.model.skip) { + continue; + } + + if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { + pointCurrent.mK = pointAfter.mK = 0; + continue; + } + + alphaK = pointCurrent.mK / pointCurrent.deltaK; + betaK = pointAfter.mK / pointCurrent.deltaK; + squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); + if (squaredMagnitude <= 9) { + continue; + } + + tauK = 3 / Math.sqrt(squaredMagnitude); + pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; + pointAfter.mK = betaK * tauK * pointCurrent.deltaK; + } + + // Compute control points + var deltaX; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointBefore && !pointBefore.model.skip) { + deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; + pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; + pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; + } + if (pointAfter && !pointAfter.model.skip) { + deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; + pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; + pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; + } + } + }; + helpers$1.nextItem = function(collection, index, loop) { + if (loop) { + return index >= collection.length - 1 ? collection[0] : collection[index + 1]; + } + return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; + }; + helpers$1.previousItem = function(collection, index, loop) { + if (loop) { + return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; + } + return index <= 0 ? collection[0] : collection[index - 1]; + }; + // Implementation of the nice number algorithm used in determining where axis labels will go + helpers$1.niceNum = function(range, round) { + var exponent = Math.floor(helpers$1.log10(range)); + var fraction = range / Math.pow(10, exponent); + var niceFraction; + + if (round) { + if (fraction < 1.5) { + niceFraction = 1; + } else if (fraction < 3) { + niceFraction = 2; + } else if (fraction < 7) { + niceFraction = 5; + } else { + niceFraction = 10; + } + } else if (fraction <= 1.0) { + niceFraction = 1; + } else if (fraction <= 2) { + niceFraction = 2; + } else if (fraction <= 5) { + niceFraction = 5; + } else { + niceFraction = 10; + } + + return niceFraction * Math.pow(10, exponent); + }; + // Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + helpers$1.requestAnimFrame = (function() { + if (typeof window === 'undefined') { + return function(callback) { + callback(); + }; + } + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + }()); + // -- DOM methods + helpers$1.getRelativePosition = function(evt, chart) { + var mouseX, mouseY; + var e = evt.originalEvent || evt; + var canvas = evt.target || evt.srcElement; + var boundingRect = canvas.getBoundingClientRect(); + + var touches = e.touches; + if (touches && touches.length > 0) { + mouseX = touches[0].clientX; + mouseY = touches[0].clientY; + + } else { + mouseX = e.clientX; + mouseY = e.clientY; + } + + // Scale mouse coordinates into canvas coordinates + // by following the pattern laid out by 'jerryj' in the comments of + // https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ + var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left')); + var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top')); + var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right')); + var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom')); + var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; + var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; + + // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However + // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here + mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); + mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); + + return { + x: mouseX, + y: mouseY + }; + + }; + + // Private helper function to convert max-width/max-height values that may be percentages into a number + function parseMaxStyle(styleValue, node, parentProperty) { + var valueInPixels; + if (typeof styleValue === 'string') { + valueInPixels = parseInt(styleValue, 10); + + if (styleValue.indexOf('%') !== -1) { + // percentage * size in dimension + valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; + } + } else { + valueInPixels = styleValue; + } + + return valueInPixels; + } + + /** + * Returns if the given value contains an effective constraint. + * @private + */ + function isConstrainedValue(value) { + return value !== undefined && value !== null && value !== 'none'; + } + + /** + * Returns the max width or height of the given DOM node in a cross-browser compatible fashion + * @param {HTMLElement} domNode - the node to check the constraint on + * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height') + * @param {string} percentageProperty - property of parent to use when calculating width as a percentage + * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser} + */ + function getConstraintDimension(domNode, maxStyle, percentageProperty) { + var view = document.defaultView; + var parentNode = helpers$1._getParentNode(domNode); + var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; + var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; + var hasCNode = isConstrainedValue(constrainedNode); + var hasCContainer = isConstrainedValue(constrainedContainer); + var infinity = Number.POSITIVE_INFINITY; + + if (hasCNode || hasCContainer) { + return Math.min( + hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, + hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); + } + + return 'none'; + } + // returns Number or undefined if no constraint + helpers$1.getConstraintWidth = function(domNode) { + return getConstraintDimension(domNode, 'max-width', 'clientWidth'); + }; + // returns Number or undefined if no constraint + helpers$1.getConstraintHeight = function(domNode) { + return getConstraintDimension(domNode, 'max-height', 'clientHeight'); + }; + /** + * @private + */ + helpers$1._calculatePadding = function(container, padding, parentDimension) { + padding = helpers$1.getStyle(container, padding); + + return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10); + }; + /** + * @private + */ + helpers$1._getParentNode = function(domNode) { + var parent = domNode.parentNode; + if (parent && parent.toString() === '[object ShadowRoot]') { + parent = parent.host; + } + return parent; + }; + helpers$1.getMaximumWidth = function(domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientWidth; + } + + var clientWidth = container.clientWidth; + var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth); + var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth); + + var w = clientWidth - paddingLeft - paddingRight; + var cw = helpers$1.getConstraintWidth(domNode); + return isNaN(cw) ? w : Math.min(w, cw); + }; + helpers$1.getMaximumHeight = function(domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientHeight; + } + + var clientHeight = container.clientHeight; + var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight); + var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight); + + var h = clientHeight - paddingTop - paddingBottom; + var ch = helpers$1.getConstraintHeight(domNode); + return isNaN(ch) ? h : Math.min(h, ch); + }; + helpers$1.getStyle = function(el, property) { + return el.currentStyle ? + el.currentStyle[property] : + document.defaultView.getComputedStyle(el, null).getPropertyValue(property); + }; + helpers$1.retinaScale = function(chart, forceRatio) { + var pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && window.devicePixelRatio) || 1; + if (pixelRatio === 1) { + return; + } + + var canvas = chart.canvas; + var height = chart.height; + var width = chart.width; + + canvas.height = height * pixelRatio; + canvas.width = width * pixelRatio; + chart.ctx.scale(pixelRatio, pixelRatio); + + // If no style has been set on the canvas, the render size is used as display size, + // making the chart visually bigger, so let's enforce it to the "correct" values. + // See https://github.com/chartjs/Chart.js/issues/3575 + if (!canvas.style.height && !canvas.style.width) { + canvas.style.height = height + 'px'; + canvas.style.width = width + 'px'; + } + }; + // -- Canvas methods + helpers$1.fontString = function(pixelSize, fontStyle, fontFamily) { + return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; + }; + helpers$1.longestText = function(ctx, font, arrayOfThings, cache) { + cache = cache || {}; + var data = cache.data = cache.data || {}; + var gc = cache.garbageCollect = cache.garbageCollect || []; + + if (cache.font !== font) { + data = cache.data = {}; + gc = cache.garbageCollect = []; + cache.font = font; + } + + ctx.font = font; + var longest = 0; + helpers$1.each(arrayOfThings, function(thing) { + // Undefined strings and arrays should not be measured + if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) { + longest = helpers$1.measureText(ctx, data, gc, longest, thing); + } else if (helpers$1.isArray(thing)) { + // if it is an array lets measure each element + // to do maybe simplify this function a bit so we can do this more recursively? + helpers$1.each(thing, function(nestedThing) { + // Undefined strings and arrays should not be measured + if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) { + longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing); + } + }); + } + }); + + var gcLen = gc.length / 2; + if (gcLen > arrayOfThings.length) { + for (var i = 0; i < gcLen; i++) { + delete data[gc[i]]; + } + gc.splice(0, gcLen); + } + return longest; + }; + helpers$1.measureText = function(ctx, data, gc, longest, string) { + var textWidth = data[string]; + if (!textWidth) { + textWidth = data[string] = ctx.measureText(string).width; + gc.push(string); + } + if (textWidth > longest) { + longest = textWidth; + } + return longest; + }; + helpers$1.numberOfLabelLines = function(arrayOfThings) { + var numberOfLines = 1; + helpers$1.each(arrayOfThings, function(thing) { + if (helpers$1.isArray(thing)) { + if (thing.length > numberOfLines) { + numberOfLines = thing.length; + } + } + }); + return numberOfLines; + }; + + helpers$1.color = !chartjsColor ? + function(value) { + console.error('Color.js not found!'); + return value; + } : + function(value) { + /* global CanvasGradient */ + if (value instanceof CanvasGradient) { + value = core_defaults.global.defaultColor; + } + + return chartjsColor(value); + }; + + helpers$1.getHoverColor = function(colorValue) { + /* global CanvasPattern */ + return (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ? + colorValue : + helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString(); + }; +}; + +function abstract() { + throw new Error( + 'This method is not implemented: either no adapter can ' + + 'be found or an incomplete integration was provided.' + ); +} + +/** + * Date adapter (current used by the time scale) + * @namespace Chart._adapters._date + * @memberof Chart._adapters + * @private + */ + +/** + * Currently supported unit string values. + * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')} + * @memberof Chart._adapters._date + * @name Unit + */ + +/** + * @class + */ +function DateAdapter(options) { + this.options = options || {}; +} + +helpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */ { + /** + * Returns a map of time formats for the supported formatting units defined + * in Unit as well as 'datetime' representing a detailed date/time string. + * @returns {{string: string}} + */ + formats: abstract, + + /** + * Parses the given `value` and return the associated timestamp. + * @param {any} value - the value to parse (usually comes from the data) + * @param {string} [format] - the expected data format + * @returns {(number|null)} + * @function + */ + parse: abstract, + + /** + * Returns the formatted date in the specified `format` for a given `timestamp`. + * @param {number} timestamp - the timestamp to format + * @param {string} format - the date/time token + * @return {string} + * @function + */ + format: abstract, + + /** + * Adds the specified `amount` of `unit` to the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {number} amount - the amount to add + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + add: abstract, + + /** + * Returns the number of `unit` between the given timestamps. + * @param {number} max - the input timestamp (reference) + * @param {number} min - the timestamp to substract + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + diff: abstract, + + /** + * Returns start of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @param {number} [weekday] - the ISO day of the week with 1 being Monday + * and 7 being Sunday (only needed if param *unit* is `isoWeek`). + * @function + */ + startOf: abstract, + + /** + * Returns end of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @function + */ + endOf: abstract, + + // DEPRECATIONS + + /** + * Provided for backward compatibility for scale.getValueForPixel(), + * this method should be overridden only by the moment adapter. + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function(value) { + return value; + } +}); + +DateAdapter.override = function(members) { + helpers$1.extend(DateAdapter.prototype, members); +}; + +var _date = DateAdapter; + +var core_adapters = { + _date: _date +}; + +/** + * Namespace to hold static tick generation functions + * @namespace Chart.Ticks + */ +var core_ticks = { + /** + * Namespace to hold formatters for different types of ticks + * @namespace Chart.Ticks.formatters + */ + formatters: { + /** + * Formatter for value labels + * @method Chart.Ticks.formatters.values + * @param value the value to display + * @return {string|string[]} the label to display + */ + values: function(value) { + return helpers$1.isArray(value) ? value : '' + value; + }, + + /** + * Formatter for linear numeric ticks + * @method Chart.Ticks.formatters.linear + * @param tickValue {number} the value to be formatted + * @param index {number} the position of the tickValue parameter in the ticks array + * @param ticks {number[]} the list of ticks being converted + * @return {string} string representation of the tickValue parameter + */ + linear: function(tickValue, index, ticks) { + // If we have lots of ticks, don't use the ones + var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; + + // If we have a number like 2.5 as the delta, figure out how many decimal places we need + if (Math.abs(delta) > 1) { + if (tickValue !== Math.floor(tickValue)) { + // not an integer + delta = tickValue - Math.floor(tickValue); + } + } + + var logDelta = helpers$1.log10(Math.abs(delta)); + var tickString = ''; + + if (tickValue !== 0) { + var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1])); + if (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation + var logTick = helpers$1.log10(Math.abs(tickValue)); + tickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta)); + } else { + var numDecimal = -1 * Math.floor(logDelta); + numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places + tickString = tickValue.toFixed(numDecimal); + } + } else { + tickString = '0'; // never show decimal places for 0 + } + + return tickString; + }, + + logarithmic: function(tickValue, index, ticks) { + var remain = tickValue / (Math.pow(10, Math.floor(helpers$1.log10(tickValue)))); + + if (tickValue === 0) { + return '0'; + } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { + return tickValue.toExponential(); + } + return ''; + } + } +}; + +var valueOrDefault$9 = helpers$1.valueOrDefault; +var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault; + +core_defaults._set('scale', { + display: true, + position: 'left', + offset: false, + + // grid line settings + gridLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + drawBorder: true, + drawOnChartArea: true, + drawTicks: true, + tickMarkLength: 10, + zeroLineWidth: 1, + zeroLineColor: 'rgba(0,0,0,0.25)', + zeroLineBorderDash: [], + zeroLineBorderDashOffset: 0.0, + offsetGridLines: false, + borderDash: [], + borderDashOffset: 0.0 + }, + + // scale label + scaleLabel: { + // display property + display: false, + + // actual label + labelString: '', + + // top/bottom padding + padding: { + top: 4, + bottom: 4 + } + }, + + // label settings + ticks: { + beginAtZero: false, + minRotation: 0, + maxRotation: 50, + mirror: false, + padding: 0, + reverse: false, + display: true, + autoSkip: true, + autoSkipPadding: 0, + labelOffset: 0, + // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. + callback: core_ticks.formatters.values, + minor: {}, + major: {} + } +}); + +function labelsFromTicks(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(ticks[i].label); + } + + return labels; +} + +function getPixelForGridLine(scale, index, offsetGridLines) { + var lineValue = scale.getPixelForTick(index); + + if (offsetGridLines) { + if (scale.getTicks().length === 1) { + lineValue -= scale.isHorizontal() ? + Math.max(lineValue - scale.left, scale.right - lineValue) : + Math.max(lineValue - scale.top, scale.bottom - lineValue); + } else if (index === 0) { + lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; + } else { + lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; + } + } + return lineValue; +} + +function computeTextSize(context, tick, font) { + return helpers$1.isArray(tick) ? + helpers$1.longestText(context, font, tick) : + context.measureText(tick).width; +} + +var core_scale = core_element.extend({ + /** + * Get the padding needed for the scale + * @method getPadding + * @private + * @returns {Padding} the necessary padding + */ + getPadding: function() { + var me = this; + return { + left: me.paddingLeft || 0, + top: me.paddingTop || 0, + right: me.paddingRight || 0, + bottom: me.paddingBottom || 0 + }; + }, + + /** + * Returns the scale tick objects ({label, major}) + * @since 2.7 + */ + getTicks: function() { + return this._ticks; + }, + + // These methods are ordered by lifecyle. Utilities then follow. + // Any function defined here is inherited by all scale types. + // Any function can be extended by the scale type + + mergeTicksOptions: function() { + var ticks = this.options.ticks; + if (ticks.minor === false) { + ticks.minor = { + display: false + }; + } + if (ticks.major === false) { + ticks.major = { + display: false + }; + } + for (var key in ticks) { + if (key !== 'major' && key !== 'minor') { + if (typeof ticks.minor[key] === 'undefined') { + ticks.minor[key] = ticks[key]; + } + if (typeof ticks.major[key] === 'undefined') { + ticks.major[key] = ticks[key]; + } + } + } + }, + beforeUpdate: function() { + helpers$1.callback(this.options.beforeUpdate, [this]); + }, + + update: function(maxWidth, maxHeight, margins) { + var me = this; + var i, ilen, labels, label, ticks, tick; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = helpers$1.extend({ + left: 0, + right: 0, + top: 0, + bottom: 0 + }, margins); + + me._maxLabelLines = 0; + me.longestLabelWidth = 0; + me.longestTextCache = me.longestTextCache || {}; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + + // Data min/max + me.beforeDataLimits(); + me.determineDataLimits(); + me.afterDataLimits(); + + // Ticks - `this.ticks` is now DEPRECATED! + // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member + // and must not be accessed directly from outside this class. `this.ticks` being + // around for long time and not marked as private, we can't change its structure + // without unexpected breaking changes. If you need to access the scale ticks, + // use scale.getTicks() instead. + + me.beforeBuildTicks(); + + // New implementations should return an array of objects but for BACKWARD COMPAT, + // we still support no return (`this.ticks` internally set by calling this method). + ticks = me.buildTicks() || []; + + // Allow modification of ticks in callback. + ticks = me.afterBuildTicks(ticks) || ticks; + + me.beforeTickToLabelConversion(); + + // New implementations should return the formatted tick labels but for BACKWARD + // COMPAT, we still support no return (`this.ticks` internally changed by calling + // this method and supposed to contain only string values). + labels = me.convertTicksToLabels(ticks) || me.ticks; + + me.afterTickToLabelConversion(); + + me.ticks = labels; // BACKWARD COMPATIBILITY + + // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! + + // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) + for (i = 0, ilen = labels.length; i < ilen; ++i) { + label = labels[i]; + tick = ticks[i]; + if (!tick) { + ticks.push(tick = { + label: label, + major: false + }); + } else { + tick.label = label; + } + } + + me._ticks = ticks; + + // Tick Rotation + me.beforeCalculateTickRotation(); + me.calculateTickRotation(); + me.afterCalculateTickRotation(); + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: function() { + helpers$1.callback(this.options.afterUpdate, [this]); + }, + + // + + beforeSetDimensions: function() { + helpers$1.callback(this.options.beforeSetDimensions, [this]); + }, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + }, + afterSetDimensions: function() { + helpers$1.callback(this.options.afterSetDimensions, [this]); + }, + + // Data limits + beforeDataLimits: function() { + helpers$1.callback(this.options.beforeDataLimits, [this]); + }, + determineDataLimits: helpers$1.noop, + afterDataLimits: function() { + helpers$1.callback(this.options.afterDataLimits, [this]); + }, + + // + beforeBuildTicks: function() { + helpers$1.callback(this.options.beforeBuildTicks, [this]); + }, + buildTicks: helpers$1.noop, + afterBuildTicks: function(ticks) { + var me = this; + // ticks is empty for old axis implementations here + if (helpers$1.isArray(ticks) && ticks.length) { + return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]); + } + // Support old implementations (that modified `this.ticks` directly in buildTicks) + me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks; + return ticks; + }, + + beforeTickToLabelConversion: function() { + helpers$1.callback(this.options.beforeTickToLabelConversion, [this]); + }, + convertTicksToLabels: function() { + var me = this; + // Convert ticks to strings + var tickOpts = me.options.ticks; + me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); + }, + afterTickToLabelConversion: function() { + helpers$1.callback(this.options.afterTickToLabelConversion, [this]); + }, + + // + + beforeCalculateTickRotation: function() { + helpers$1.callback(this.options.beforeCalculateTickRotation, [this]); + }, + calculateTickRotation: function() { + var me = this; + var context = me.ctx; + var tickOpts = me.options.ticks; + var labels = labelsFromTicks(me._ticks); + + // Get the width of each grid by calculating the difference + // between x offsets between 0 and 1. + var tickFont = helpers$1.options._parseFont(tickOpts); + context.font = tickFont.string; + + var labelRotation = tickOpts.minRotation || 0; + + if (labels.length && me.options.display && me.isHorizontal()) { + var originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache); + var labelWidth = originalLabelWidth; + var cosRotation, sinRotation; + + // Allow 3 pixels x2 padding either side for label readability + var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; + + // Max label rotation can be set or default to 90 - also act as a loop counter + while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { + var angleRadians = helpers$1.toRadians(labelRotation); + cosRotation = Math.cos(angleRadians); + sinRotation = Math.sin(angleRadians); + + if (sinRotation * originalLabelWidth > me.maxHeight) { + // go back one step + labelRotation--; + break; + } + + labelRotation++; + labelWidth = cosRotation * originalLabelWidth; + } + } + + me.labelRotation = labelRotation; + }, + afterCalculateTickRotation: function() { + helpers$1.callback(this.options.afterCalculateTickRotation, [this]); + }, + + // + + beforeFit: function() { + helpers$1.callback(this.options.beforeFit, [this]); + }, + fit: function() { + var me = this; + // Reset + var minSize = me.minSize = { + width: 0, + height: 0 + }; + + var labels = labelsFromTicks(me._ticks); + + var opts = me.options; + var tickOpts = opts.ticks; + var scaleLabelOpts = opts.scaleLabel; + var gridLineOpts = opts.gridLines; + var display = me._isVisible(); + var position = opts.position; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var tickFont = parseFont(tickOpts); + var tickMarkLength = opts.gridLines.tickMarkLength; + + // Width + if (isHorizontal) { + // subtract the margins to line up with the chartArea if we are a full width scale + minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; + } else { + minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } + + // height + if (isHorizontal) { + minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } else { + minSize.height = me.maxHeight; // fill all the height + } + + // Are we showing a title for the scale? + if (scaleLabelOpts.display && display) { + var scaleLabelFont = parseFont(scaleLabelOpts); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding); + var deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height; + + if (isHorizontal) { + minSize.height += deltaHeight; + } else { + minSize.width += deltaHeight; + } + } + + // Don't bother fitting the ticks if we are not showing the labels + if (tickOpts.display && display) { + var largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache); + var tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels); + var lineSpace = tickFont.size * 0.5; + var tickPadding = me.options.ticks.padding; + + // Store max number of lines and widest label for _autoSkip + me._maxLabelLines = tallestLabelHeightInLines; + me.longestLabelWidth = largestTextWidth; + + if (isHorizontal) { + var angleRadians = helpers$1.toRadians(me.labelRotation); + var cosRotation = Math.cos(angleRadians); + var sinRotation = Math.sin(angleRadians); + + // TODO - improve this calculation + var labelHeight = (sinRotation * largestTextWidth) + + (tickFont.lineHeight * tallestLabelHeightInLines) + + lineSpace; // padding + + minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); + + me.ctx.font = tickFont.string; + var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string); + var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string); + var offsetLeft = me.getPixelForTick(0) - me.left; + var offsetRight = me.right - me.getPixelForTick(labels.length - 1); + var paddingLeft, paddingRight; + + // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned + // which means that the right padding is dominated by the font height + if (me.labelRotation !== 0) { + paddingLeft = position === 'bottom' ? (cosRotation * firstLabelWidth) : (cosRotation * lineSpace); + paddingRight = position === 'bottom' ? (cosRotation * lineSpace) : (cosRotation * lastLabelWidth); + } else { + paddingLeft = firstLabelWidth / 2; + paddingRight = lastLabelWidth / 2; + } + me.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges + me.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3; + } else { + // A vertical axis is more constrained by the width. Labels are the + // dominant factor here, so get that length first and account for padding + if (tickOpts.mirror) { + largestTextWidth = 0; + } else { + // use lineSpace for consistency with horizontal axis + // tickPadding is not implemented for horizontal + largestTextWidth += tickPadding + lineSpace; + } + + minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); + + me.paddingTop = tickFont.size / 2; + me.paddingBottom = tickFont.size / 2; + } + } + + me.handleMargins(); + + me.width = minSize.width; + me.height = minSize.height; + }, + + /** + * Handle margins and padding interactions + * @private + */ + handleMargins: function() { + var me = this; + if (me.margins) { + me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); + me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); + me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); + me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); + } + }, + + afterFit: function() { + helpers$1.callback(this.options.afterFit, [this]); + }, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + isFullWidth: function() { + return (this.options.fullWidth); + }, + + // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not + getRightValue: function(rawValue) { + // Null and undefined values first + if (helpers$1.isNullOrUndef(rawValue)) { + return NaN; + } + // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values + if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) { + return NaN; + } + // If it is in fact an object, dive in one more level + if (rawValue) { + if (this.isHorizontal()) { + if (rawValue.x !== undefined) { + return this.getRightValue(rawValue.x); + } + } else if (rawValue.y !== undefined) { + return this.getRightValue(rawValue.y); + } + } + + // Value is good, return it + return rawValue; + }, + + /** + * Used to get the value to display in the tooltip for the data at the given index + * @param index + * @param datasetIndex + */ + getLabelForIndex: helpers$1.noop, + + /** + * Returns the location of the given data point. Value can either be an index or a numerical value + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param value + * @param index + * @param datasetIndex + */ + getPixelForValue: helpers$1.noop, + + /** + * Used to get the data value from a given pixel. This is the inverse of getPixelForValue + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param pixel + */ + getValueForPixel: helpers$1.noop, + + /** + * Returns the location of the tick at the given index + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForTick: function(index) { + var me = this; + var offset = me.options.offset; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var pixel = (tickWidth * index) + me.paddingLeft; + + if (offset) { + pixel += tickWidth / 2; + } + + var finalVal = me.left + pixel; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + var innerHeight = me.height - (me.paddingTop + me.paddingBottom); + return me.top + (index * (innerHeight / (me._ticks.length - 1))); + }, + + /** + * Utility for getting the pixel location of a percentage of scale + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForDecimal: function(decimal) { + var me = this; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var valueOffset = (innerWidth * decimal) + me.paddingLeft; + + var finalVal = me.left + valueOffset; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + return me.top + (decimal * me.height); + }, + + /** + * Returns the pixel for the minimum chart value + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getBasePixel: function() { + return this.getPixelForValue(this.getBaseValue()); + }, + + getBaseValue: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0; + }, + + /** + * Returns a subset of ticks to be plotted to avoid overlapping labels. + * @private + */ + _autoSkip: function(ticks) { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + var tickCount = ticks.length; + var skipRatio = false; + var maxTicks = optionTicks.maxTicksLimit; + + // Total space needed to display all ticks. First and last ticks are + // drawn as their center at end of axis, so tickCount-1 + var ticksLength = me._tickSize() * (tickCount - 1); + + // Axis length + var axisLength = isHorizontal + ? me.width - (me.paddingLeft + me.paddingRight) + : me.height - (me.paddingTop + me.PaddingBottom); + + var result = []; + var i, tick; + + if (ticksLength > axisLength) { + skipRatio = 1 + Math.floor(ticksLength / axisLength); + } + + // if they defined a max number of optionTicks, + // increase skipRatio until that number is met + if (tickCount > maxTicks) { + skipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks)); + } + + for (i = 0; i < tickCount; i++) { + tick = ticks[i]; + + if (skipRatio > 1 && i % skipRatio > 0) { + // leave tick in place but make sure it's not displayed (#4635) + delete tick.label; + } + result.push(tick); + } + return result; + }, + + /** + * @private + */ + _tickSize: function() { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + + // Calculate space needed by label in axis direction. + var rot = helpers$1.toRadians(me.labelRotation); + var cos = Math.abs(Math.cos(rot)); + var sin = Math.abs(Math.sin(rot)); + + var padding = optionTicks.autoSkipPadding || 0; + var w = (me.longestLabelWidth + padding) || 0; + + var tickFont = helpers$1.options._parseFont(optionTicks); + var h = (me._maxLabelLines * tickFont.lineHeight + padding) || 0; + + // Calculate space needed for 1 tick in axis direction. + return isHorizontal + ? h * cos > w * sin ? w / cos : h / sin + : h * sin < w * cos ? h / cos : w / sin; + }, + + /** + * @private + */ + _isVisible: function() { + var me = this; + var chart = me.chart; + var display = me.options.display; + var i, ilen, meta; + + if (display !== 'auto') { + return !!display; + } + + // When 'auto', the scale is visible if at least one associated dataset is visible. + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + if (meta.xAxisID === me.id || meta.yAxisID === me.id) { + return true; + } + } + } + + return false; + }, + + /** + * Actually draw the scale on the canvas + * @param {object} chartArea - the area of the chart to draw full grid lines on + */ + draw: function(chartArea) { + var me = this; + var options = me.options; + + if (!me._isVisible()) { + return; + } + + var chart = me.chart; + var context = me.ctx; + var globalDefaults = core_defaults.global; + var defaultFontColor = globalDefaults.defaultFontColor; + var optionTicks = options.ticks.minor; + var optionMajorTicks = options.ticks.major || optionTicks; + var gridLines = options.gridLines; + var scaleLabel = options.scaleLabel; + var position = options.position; + + var isRotated = me.labelRotation !== 0; + var isMirrored = optionTicks.mirror; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); + var tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor); + var tickFont = parseFont(optionTicks); + var lineHeight = tickFont.lineHeight; + var majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor); + var majorTickFont = parseFont(optionMajorTicks); + var tickPadding = optionTicks.padding; + var labelOffset = optionTicks.labelOffset; + + var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; + + var scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor); + var scaleLabelFont = parseFont(scaleLabel); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding); + var labelRotationRadians = helpers$1.toRadians(me.labelRotation); + + var itemsToDraw = []; + + var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0; + var alignPixel = helpers$1._alignPixel; + var borderValue, tickStart, tickEnd; + + if (position === 'top') { + borderValue = alignPixel(chart, me.bottom, axisWidth); + tickStart = me.bottom - tl; + tickEnd = borderValue - axisWidth / 2; + } else if (position === 'bottom') { + borderValue = alignPixel(chart, me.top, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.top + tl; + } else if (position === 'left') { + borderValue = alignPixel(chart, me.right, axisWidth); + tickStart = me.right - tl; + tickEnd = borderValue - axisWidth / 2; + } else { + borderValue = alignPixel(chart, me.left, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.left + tl; + } + + var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error. + + helpers$1.each(ticks, function(tick, index) { + // autoskipper skipped this tick (#4635) + if (helpers$1.isNullOrUndef(tick.label)) { + return; + } + + var label = tick.label; + var lineWidth, lineColor, borderDash, borderDashOffset; + if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { + // Draw the first index specially + lineWidth = gridLines.zeroLineWidth; + lineColor = gridLines.zeroLineColor; + borderDash = gridLines.zeroLineBorderDash || []; + borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0; + } else { + lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index); + lineColor = valueAtIndexOrDefault(gridLines.color, index); + borderDash = gridLines.borderDash || []; + borderDashOffset = gridLines.borderDashOffset || 0.0; + } + + // Common properties + var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign; + var labelCount = helpers$1.isArray(label) ? label.length : 1; + var lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines); + + if (isHorizontal) { + var labelYOffset = tl + tickPadding; + + if (lineValue < me.left - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth); + ty1 = tickStart; + ty2 = tickEnd; + labelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option) + + if (position === 'top') { + y1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2; + y2 = chartArea.bottom; + textOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight; + textAlign = !isRotated ? 'center' : 'left'; + labelY = me.bottom - labelYOffset; + } else { + y1 = chartArea.top; + y2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2; + textOffset = (!isRotated ? 0.5 : 0) * lineHeight; + textAlign = !isRotated ? 'center' : 'right'; + labelY = me.top + labelYOffset; + } + } else { + var labelXOffset = (isMirrored ? 0 : tl) + tickPadding; + + if (lineValue < me.top - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tickStart; + tx2 = tickEnd; + ty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth); + labelY = me.getPixelForTick(index) + labelOffset; + textOffset = (1 - labelCount) * lineHeight / 2; + + if (position === 'left') { + x1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2; + x2 = chartArea.right; + textAlign = isMirrored ? 'left' : 'right'; + labelX = me.right - labelXOffset; + } else { + x1 = chartArea.left; + x2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2; + textAlign = isMirrored ? 'right' : 'left'; + labelX = me.left + labelXOffset; + } + } + + itemsToDraw.push({ + tx1: tx1, + ty1: ty1, + tx2: tx2, + ty2: ty2, + x1: x1, + y1: y1, + x2: x2, + y2: y2, + labelX: labelX, + labelY: labelY, + glWidth: lineWidth, + glColor: lineColor, + glBorderDash: borderDash, + glBorderDashOffset: borderDashOffset, + rotation: -1 * labelRotationRadians, + label: label, + major: tick.major, + textOffset: textOffset, + textAlign: textAlign + }); + }); + + // Draw all of the tick labels, tick marks, and grid lines at the correct places + helpers$1.each(itemsToDraw, function(itemToDraw) { + var glWidth = itemToDraw.glWidth; + var glColor = itemToDraw.glColor; + + if (gridLines.display && glWidth && glColor) { + context.save(); + context.lineWidth = glWidth; + context.strokeStyle = glColor; + if (context.setLineDash) { + context.setLineDash(itemToDraw.glBorderDash); + context.lineDashOffset = itemToDraw.glBorderDashOffset; + } + + context.beginPath(); + + if (gridLines.drawTicks) { + context.moveTo(itemToDraw.tx1, itemToDraw.ty1); + context.lineTo(itemToDraw.tx2, itemToDraw.ty2); + } + + if (gridLines.drawOnChartArea) { + context.moveTo(itemToDraw.x1, itemToDraw.y1); + context.lineTo(itemToDraw.x2, itemToDraw.y2); + } + + context.stroke(); + context.restore(); + } + + if (optionTicks.display) { + // Make sure we draw text in the correct color and font + context.save(); + context.translate(itemToDraw.labelX, itemToDraw.labelY); + context.rotate(itemToDraw.rotation); + context.font = itemToDraw.major ? majorTickFont.string : tickFont.string; + context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; + context.textBaseline = 'middle'; + context.textAlign = itemToDraw.textAlign; + + var label = itemToDraw.label; + var y = itemToDraw.textOffset; + if (helpers$1.isArray(label)) { + for (var i = 0; i < label.length; ++i) { + // We just make sure the multiline element is a string here.. + context.fillText('' + label[i], 0, y); + y += lineHeight; + } + } else { + context.fillText(label, 0, y); + } + context.restore(); + } + }); + + if (scaleLabel.display) { + // Draw the scale label + var scaleLabelX; + var scaleLabelY; + var rotation = 0; + var halfLineHeight = scaleLabelFont.lineHeight / 2; + + if (isHorizontal) { + scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width + scaleLabelY = position === 'bottom' + ? me.bottom - halfLineHeight - scaleLabelPadding.bottom + : me.top + halfLineHeight + scaleLabelPadding.top; + } else { + var isLeft = position === 'left'; + scaleLabelX = isLeft + ? me.left + halfLineHeight + scaleLabelPadding.top + : me.right - halfLineHeight - scaleLabelPadding.top; + scaleLabelY = me.top + ((me.bottom - me.top) / 2); + rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; + } + + context.save(); + context.translate(scaleLabelX, scaleLabelY); + context.rotate(rotation); + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.fillStyle = scaleLabelFontColor; // render in correct colour + context.font = scaleLabelFont.string; + context.fillText(scaleLabel.labelString, 0, 0); + context.restore(); + } + + if (axisWidth) { + // Draw the line at the edge of the axis + var firstLineWidth = axisWidth; + var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0); + var x1, x2, y1, y2; + + if (isHorizontal) { + x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2; + x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2; + y1 = y2 = borderValue; + } else { + y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2; + y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2; + x1 = x2 = borderValue; + } + + context.lineWidth = axisWidth; + context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0); + context.beginPath(); + context.moveTo(x1, y1); + context.lineTo(x2, y2); + context.stroke(); + } + } +}); + +var defaultConfig = { + position: 'bottom' +}; + +var scale_category = core_scale.extend({ + /** + * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those + * else fall back to data.labels + * @private + */ + getLabels: function() { + var data = this.chart.data; + return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; + }, + + determineDataLimits: function() { + var me = this; + var labels = me.getLabels(); + me.minIndex = 0; + me.maxIndex = labels.length - 1; + var findIndex; + + if (me.options.ticks.min !== undefined) { + // user specified min value + findIndex = labels.indexOf(me.options.ticks.min); + me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; + } + + if (me.options.ticks.max !== undefined) { + // user specified max value + findIndex = labels.indexOf(me.options.ticks.max); + me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; + } + + me.min = labels[me.minIndex]; + me.max = labels[me.maxIndex]; + }, + + buildTicks: function() { + var me = this; + var labels = me.getLabels(); + // If we are viewing some subset of labels, slice the original array + me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var chart = me.chart; + + if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) { + return me.getRightValue(chart.data.datasets[datasetIndex].data[index]); + } + + return me.ticks[index - me.minIndex]; + }, + + // Used to get data value locations. Value can either be an index or a numerical value + getPixelForValue: function(value, index) { + var me = this; + var offset = me.options.offset; + // 1 is added because we need the length but we have the indexes + var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); + + // If value is a data object, then index is the index in the data array, + // not the index of the scale. We need to change that. + var valueCategory; + if (value !== undefined && value !== null) { + valueCategory = me.isHorizontal() ? value.x : value.y; + } + if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { + var labels = me.getLabels(); + value = valueCategory || value; + var idx = labels.indexOf(value); + index = idx !== -1 ? idx : index; + } + + if (me.isHorizontal()) { + var valueWidth = me.width / offsetAmt; + var widthOffset = (valueWidth * (index - me.minIndex)); + + if (offset) { + widthOffset += (valueWidth / 2); + } + + return me.left + widthOffset; + } + var valueHeight = me.height / offsetAmt; + var heightOffset = (valueHeight * (index - me.minIndex)); + + if (offset) { + heightOffset += (valueHeight / 2); + } + + return me.top + heightOffset; + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); + }, + + getValueForPixel: function(pixel) { + var me = this; + var offset = me.options.offset; + var value; + var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var horz = me.isHorizontal(); + var valueDimension = (horz ? me.width : me.height) / offsetAmt; + + pixel -= horz ? me.left : me.top; + + if (offset) { + pixel -= (valueDimension / 2); + } + + if (pixel <= 0) { + value = 0; + } else { + value = Math.round(pixel / valueDimension); + } + + return value + me.minIndex; + }, + + getBasePixel: function() { + return this.bottom; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults = defaultConfig; +scale_category._defaults = _defaults; + +var noop = helpers$1.noop; +var isNullOrUndef = helpers$1.isNullOrUndef; + +/** + * Generate a set of linear ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ +function generateTicks(generationOptions, dataRange) { + var ticks = []; + // To get a "nice" value for the tick spacing, we will use the appropriately named + // "nice number" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks + // for details. + + var MIN_SPACING = 1e-14; + var stepSize = generationOptions.stepSize; + var unit = stepSize || 1; + var maxNumSpaces = generationOptions.maxTicks - 1; + var min = generationOptions.min; + var max = generationOptions.max; + var precision = generationOptions.precision; + var rmin = dataRange.min; + var rmax = dataRange.max; + var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit; + var factor, niceMin, niceMax, numSpaces; + + // Beyond MIN_SPACING floating point numbers being to lose precision + // such that we can't do the math necessary to generate ticks + if (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) { + return [rmin, rmax]; + } + + numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); + if (numSpaces > maxNumSpaces) { + // If the calculated num of spaces exceeds maxNumSpaces, recalculate it + spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit; + } + + if (stepSize || isNullOrUndef(precision)) { + // If a precision is not specified, calculate factor based on spacing + factor = Math.pow(10, helpers$1._decimalPlaces(spacing)); + } else { + // If the user specified a precision, round to that number of decimal places + factor = Math.pow(10, precision); + spacing = Math.ceil(spacing * factor) / factor; + } + + niceMin = Math.floor(rmin / spacing) * spacing; + niceMax = Math.ceil(rmax / spacing) * spacing; + + // If min, max and stepSize is set and they make an evenly spaced scale use it. + if (stepSize) { + // If very close to our whole number, use it. + if (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) { + niceMin = min; + } + if (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) { + niceMax = max; + } + } + + numSpaces = (niceMax - niceMin) / spacing; + // If very close to our rounded value, use it. + if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { + numSpaces = Math.round(numSpaces); + } else { + numSpaces = Math.ceil(numSpaces); + } + + niceMin = Math.round(niceMin * factor) / factor; + niceMax = Math.round(niceMax * factor) / factor; + ticks.push(isNullOrUndef(min) ? niceMin : min); + for (var j = 1; j < numSpaces; ++j) { + ticks.push(Math.round((niceMin + j * spacing) * factor) / factor); + } + ticks.push(isNullOrUndef(max) ? niceMax : max); + + return ticks; +} + +var scale_linearbase = core_scale.extend({ + getRightValue: function(value) { + if (typeof value === 'string') { + return +value; + } + return core_scale.prototype.getRightValue.call(this, value); + }, + + handleTickRangeOptions: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, + // do nothing since that would make the chart weird. If the user really wants a weird chart + // axis, they can manually override it + if (tickOpts.beginAtZero) { + var minSign = helpers$1.sign(me.min); + var maxSign = helpers$1.sign(me.max); + + if (minSign < 0 && maxSign < 0) { + // move the top up to 0 + me.max = 0; + } else if (minSign > 0 && maxSign > 0) { + // move the bottom down to 0 + me.min = 0; + } + } + + var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; + var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; + + if (tickOpts.min !== undefined) { + me.min = tickOpts.min; + } else if (tickOpts.suggestedMin !== undefined) { + if (me.min === null) { + me.min = tickOpts.suggestedMin; + } else { + me.min = Math.min(me.min, tickOpts.suggestedMin); + } + } + + if (tickOpts.max !== undefined) { + me.max = tickOpts.max; + } else if (tickOpts.suggestedMax !== undefined) { + if (me.max === null) { + me.max = tickOpts.suggestedMax; + } else { + me.max = Math.max(me.max, tickOpts.suggestedMax); + } + } + + if (setMin !== setMax) { + // We set the min or the max but not both. + // So ensure that our range is good + // Inverted or 0 length range can happen when + // ticks.min is set, and no datasets are visible + if (me.min >= me.max) { + if (setMin) { + me.max = me.min + 1; + } else { + me.min = me.max - 1; + } + } + } + + if (me.min === me.max) { + me.max++; + + if (!tickOpts.beginAtZero) { + me.min--; + } + } + }, + + getTickLimit: function() { + var me = this; + var tickOpts = me.options.ticks; + var stepSize = tickOpts.stepSize; + var maxTicksLimit = tickOpts.maxTicksLimit; + var maxTicks; + + if (stepSize) { + maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1; + } else { + maxTicks = me._computeTickLimit(); + maxTicksLimit = maxTicksLimit || 11; + } + + if (maxTicksLimit) { + maxTicks = Math.min(maxTicksLimit, maxTicks); + } + + return maxTicks; + }, + + _computeTickLimit: function() { + return Number.POSITIVE_INFINITY; + }, + + handleDirectionalChanges: noop, + + buildTicks: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // Figure out what the max number of ticks we can support it is based on the size of + // the axis area. For now, we say that the minimum tick spacing in pixels must be 40 + // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on + // the graph. Make sure we always have at least 2 ticks + var maxTicks = me.getTickLimit(); + maxTicks = Math.max(2, maxTicks); + + var numericGeneratorOptions = { + maxTicks: maxTicks, + min: tickOpts.min, + max: tickOpts.max, + precision: tickOpts.precision, + stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) + }; + var ticks = me.ticks = generateTicks(numericGeneratorOptions, me); + + me.handleDirectionalChanges(); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + ticks.reverse(); + + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + }, + + convertTicksToLabels: function() { + var me = this; + me.ticksAsNumbers = me.ticks.slice(); + me.zeroLineIndex = me.ticks.indexOf(0); + + core_scale.prototype.convertTicksToLabels.call(me); + } +}); + +var defaultConfig$1 = { + position: 'left', + ticks: { + callback: core_ticks.formatters.linear + } +}; + +var scale_linear = scale_linearbase.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + var DEFAULT_MIN = 0; + var DEFAULT_MAX = 1; + + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // First Calculate the range + me.min = null; + me.max = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = { + positiveValues: [], + negativeValues: [] + }; + } + + // Store these per type + var positiveValues = valuesPerStack[key].positiveValues; + var negativeValues = valuesPerStack[key].negativeValues; + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + positiveValues[index] = positiveValues[index] || 0; + negativeValues[index] = negativeValues[index] || 0; + + if (opts.relativePoints) { + positiveValues[index] = 100; + } else if (value < 0) { + negativeValues[index] += value; + } else { + positiveValues[index] += value; + } + }); + } + }); + + helpers$1.each(valuesPerStack, function(valuesForType) { + var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); + var minVal = helpers$1.min(values); + var maxVal = helpers$1.max(values); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + }); + + } else { + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + }); + } + }); + } + + me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; + me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + this.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function() { + var me = this; + var tickFont; + + if (me.isHorizontal()) { + return Math.ceil(me.width / 40); + } + tickFont = helpers$1.options._parseFont(me.options.ticks); + return Math.ceil(me.height / tickFont.lineHeight); + }, + + // Called after the ticks are built. We need + handleDirectionalChanges: function() { + if (!this.isHorizontal()) { + // We are in a vertical orientation. The top value is the highest. So reverse the array + this.ticks.reverse(); + } + }, + + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + // Utils + getPixelForValue: function(value) { + // This must be called after fit has been run so that + // this.left, this.top, this.right, and this.bottom have been defined + var me = this; + var start = me.start; + + var rightValue = +me.getRightValue(value); + var pixel; + var range = me.end - start; + + if (me.isHorizontal()) { + pixel = me.left + (me.width / range * (rightValue - start)); + } else { + pixel = me.bottom - (me.height / range * (rightValue - start)); + } + return pixel; + }, + + getValueForPixel: function(pixel) { + var me = this; + var isHorizontal = me.isHorizontal(); + var innerDimension = isHorizontal ? me.width : me.height; + var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; + return me.start + ((me.end - me.start) * offset); + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticksAsNumbers[index]); + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$1 = defaultConfig$1; +scale_linear._defaults = _defaults$1; + +var valueOrDefault$a = helpers$1.valueOrDefault; + +/** + * Generate a set of logarithmic ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ +function generateTicks$1(generationOptions, dataRange) { + var ticks = []; + + var tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min)))); + + var endExp = Math.floor(helpers$1.log10(dataRange.max)); + var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); + var exp, significand; + + if (tickVal === 0) { + exp = Math.floor(helpers$1.log10(dataRange.minNotZero)); + significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); + + ticks.push(tickVal); + tickVal = significand * Math.pow(10, exp); + } else { + exp = Math.floor(helpers$1.log10(tickVal)); + significand = Math.floor(tickVal / Math.pow(10, exp)); + } + var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; + + do { + ticks.push(tickVal); + + ++significand; + if (significand === 10) { + significand = 1; + ++exp; + precision = exp >= 0 ? 1 : precision; + } + + tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision; + } while (exp < endExp || (exp === endExp && significand < endSignificand)); + + var lastTick = valueOrDefault$a(generationOptions.max, tickVal); + ticks.push(lastTick); + + return ticks; +} + +var defaultConfig$2 = { + position: 'left', + + // label settings + ticks: { + callback: core_ticks.formatters.logarithmic + } +}; + +// TODO(v3): change this to positiveOrDefault +function nonNegativeOrDefault(value, defaultValue) { + return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue; +} + +var scale_logarithmic = core_scale.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // Calculate Range + me.min = null; + me.max = null; + me.minNotZero = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = []; + } + + helpers$1.each(dataset.data, function(rawValue, index) { + var values = valuesPerStack[key]; + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + values[index] = values[index] || 0; + values[index] += value; + }); + } + }); + + helpers$1.each(valuesPerStack, function(valuesForType) { + if (valuesForType.length > 0) { + var minVal = helpers$1.min(valuesForType); + var maxVal = helpers$1.max(valuesForType); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + } + }); + + } else { + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + + if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { + me.minNotZero = value; + } + }); + } + }); + } + + // Common base implementation to handle ticks.min, ticks.max + this.handleTickRangeOptions(); + }, + + handleTickRangeOptions: function() { + var me = this; + var tickOpts = me.options.ticks; + var DEFAULT_MIN = 1; + var DEFAULT_MAX = 10; + + me.min = nonNegativeOrDefault(tickOpts.min, me.min); + me.max = nonNegativeOrDefault(tickOpts.max, me.max); + + if (me.min === me.max) { + if (me.min !== 0 && me.min !== null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1); + me.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1); + } else { + me.min = DEFAULT_MIN; + me.max = DEFAULT_MAX; + } + } + if (me.min === null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1); + } + if (me.max === null) { + me.max = me.min !== 0 + ? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1) + : DEFAULT_MAX; + } + if (me.minNotZero === null) { + if (me.min > 0) { + me.minNotZero = me.min; + } else if (me.max < 1) { + me.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max))); + } else { + me.minNotZero = DEFAULT_MIN; + } + } + }, + + buildTicks: function() { + var me = this; + var tickOpts = me.options.ticks; + var reverse = !me.isHorizontal(); + + var generationOptions = { + min: nonNegativeOrDefault(tickOpts.min), + max: nonNegativeOrDefault(tickOpts.max) + }; + var ticks = me.ticks = generateTicks$1(generationOptions, me); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + reverse = !reverse; + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + if (reverse) { + ticks.reverse(); + } + }, + + convertTicksToLabels: function() { + this.tickValues = this.ticks.slice(); + + core_scale.prototype.convertTicksToLabels.call(this); + }, + + // Get the correct tooltip label + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.tickValues[index]); + }, + + /** + * Returns the value of the first tick. + * @param {number} value - The minimum not zero value. + * @return {number} The first tick value. + * @private + */ + _getFirstTickValue: function(value) { + var exp = Math.floor(helpers$1.log10(value)); + var significand = Math.floor(value / Math.pow(10, exp)); + + return significand * Math.pow(10, exp); + }, + + getPixelForValue: function(value) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var offset = 0; + var innerDimension, pixel, start, end, sign; + + value = +me.getRightValue(value); + if (reverse) { + start = me.end; + end = me.start; + sign = -1; + } else { + start = me.start; + end = me.end; + sign = 1; + } + if (me.isHorizontal()) { + innerDimension = me.width; + pixel = reverse ? me.right : me.left; + } else { + innerDimension = me.height; + sign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0) + pixel = reverse ? me.top : me.bottom; + } + if (value !== start) { + if (start === 0) { // include zero tick + offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + innerDimension -= offset; + start = firstTickValue; + } + if (value !== 0) { + offset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start)); + } + pixel += sign * offset; + } + return pixel; + }, + + getValueForPixel: function(pixel) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var innerDimension, start, end, value; + + if (reverse) { + start = me.end; + end = me.start; + } else { + start = me.start; + end = me.end; + } + if (me.isHorizontal()) { + innerDimension = me.width; + value = reverse ? me.right - pixel : pixel - me.left; + } else { + innerDimension = me.height; + value = reverse ? pixel - me.top : me.bottom - pixel; + } + if (value !== start) { + if (start === 0) { // include zero tick + var offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + value -= offset; + innerDimension -= offset; + start = firstTickValue; + } + value *= log10(end) - log10(start); + value /= innerDimension; + value = Math.pow(10, log10(start) + value); + } + return value; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$2 = defaultConfig$2; +scale_logarithmic._defaults = _defaults$2; + +var valueOrDefault$b = helpers$1.valueOrDefault; +var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault; +var resolve$7 = helpers$1.options.resolve; + +var defaultConfig$3 = { + display: true, + + // Boolean - Whether to animate scaling the chart from the centre + animate: true, + position: 'chartArea', + + angleLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + borderDash: [], + borderDashOffset: 0.0 + }, + + gridLines: { + circular: false + }, + + // label settings + ticks: { + // Boolean - Show a backdrop to the scale label + showLabelBackdrop: true, + + // String - The colour of the label backdrop + backdropColor: 'rgba(255,255,255,0.75)', + + // Number - The backdrop padding above & below the label in pixels + backdropPaddingY: 2, + + // Number - The backdrop padding to the side of the label in pixels + backdropPaddingX: 2, + + callback: core_ticks.formatters.linear + }, + + pointLabels: { + // Boolean - if true, show point labels + display: true, + + // Number - Point label font size in pixels + fontSize: 10, + + // Function - Used to convert point labels + callback: function(label) { + return label; + } + } +}; + +function getValueCount(scale) { + var opts = scale.options; + return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; +} + +function getTickBackdropHeight(opts) { + var tickOpts = opts.ticks; + + if (tickOpts.display && opts.display) { + return valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2; + } + return 0; +} + +function measureLabelSize(ctx, lineHeight, label) { + if (helpers$1.isArray(label)) { + return { + w: helpers$1.longestText(ctx, ctx.font, label), + h: label.length * lineHeight + }; + } + + return { + w: ctx.measureText(label).width, + h: lineHeight + }; +} + +function determineLimits(angle, pos, size, min, max) { + if (angle === min || angle === max) { + return { + start: pos - (size / 2), + end: pos + (size / 2) + }; + } else if (angle < min || angle > max) { + return { + start: pos - size, + end: pos + }; + } + + return { + start: pos, + end: pos + size + }; +} + +/** + * Helper function to fit a radial linear scale with point labels + */ +function fitWithPointLabels(scale) { + + // Right, this is really confusing and there is a lot of maths going on here + // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + // + // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + // + // Solution: + // + // We assume the radius of the polygon is half the size of the canvas at first + // at each index we check if the text overlaps. + // + // Where it does, we store that angle and that index. + // + // After finding the largest index and angle we calculate how much we need to remove + // from the shape radius to move the point inwards by that x. + // + // We average the left and right distances to get the maximum shape radius that can fit in the box + // along with labels. + // + // Once we have that, we can find the centre point for the chart, by taking the x text protrusion + // on each side, removing that from the size, halving it and adding the left x protrusion width. + // + // This will mean we have a shape fitted to the canvas, as large as it can be with the labels + // and position it in the most space efficient manner + // + // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + + var plFont = helpers$1.options._parseFont(scale.options.pointLabels); + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var furthestLimits = { + l: 0, + r: scale.width, + t: 0, + b: scale.height - scale.paddingTop + }; + var furthestAngles = {}; + var i, textSize, pointPosition; + + scale.ctx.font = plFont.string; + scale._pointLabelSizes = []; + + var valueCount = getValueCount(scale); + for (i = 0; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, scale.drawingArea + 5); + textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || ''); + scale._pointLabelSizes[i] = textSize; + + // Add quarter circle to make degree 0 mean top of circle + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians) % 360; + var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); + var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); + + if (hLimits.start < furthestLimits.l) { + furthestLimits.l = hLimits.start; + furthestAngles.l = angleRadians; + } + + if (hLimits.end > furthestLimits.r) { + furthestLimits.r = hLimits.end; + furthestAngles.r = angleRadians; + } + + if (vLimits.start < furthestLimits.t) { + furthestLimits.t = vLimits.start; + furthestAngles.t = angleRadians; + } + + if (vLimits.end > furthestLimits.b) { + furthestLimits.b = vLimits.end; + furthestAngles.b = angleRadians; + } + } + + scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles); +} + +function getTextAlignForAngle(angle) { + if (angle === 0 || angle === 180) { + return 'center'; + } else if (angle < 180) { + return 'left'; + } + + return 'right'; +} + +function fillText(ctx, text, position, lineHeight) { + var y = position.y + lineHeight / 2; + var i, ilen; + + if (helpers$1.isArray(text)) { + for (i = 0, ilen = text.length; i < ilen; ++i) { + ctx.fillText(text[i], position.x, y); + y += lineHeight; + } + } else { + ctx.fillText(text, position.x, y); + } +} + +function adjustPointPositionForLabelHeight(angle, textSize, position) { + if (angle === 90 || angle === 270) { + position.y -= (textSize.h / 2); + } else if (angle > 270 || angle < 90) { + position.y -= textSize.h; + } +} + +function drawPointLabels(scale) { + var ctx = scale.ctx; + var opts = scale.options; + var angleLineOpts = opts.angleLines; + var gridLineOpts = opts.gridLines; + var pointLabelOpts = opts.pointLabels; + var lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth); + var lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color); + var tickBackdropHeight = getTickBackdropHeight(opts); + + ctx.save(); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = lineColor; + if (ctx.setLineDash) { + ctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []])); + ctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]); + } + + var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); + + // Point Label Font + var plFont = helpers$1.options._parseFont(pointLabelOpts); + + ctx.font = plFont.string; + ctx.textBaseline = 'middle'; + + for (var i = getValueCount(scale) - 1; i >= 0; i--) { + if (angleLineOpts.display && lineWidth && lineColor) { + var outerPosition = scale.getPointPosition(i, outerDistance); + ctx.beginPath(); + ctx.moveTo(scale.xCenter, scale.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + } + + if (pointLabelOpts.display) { + // Extra pixels out for some label spacing + var extra = (i === 0 ? tickBackdropHeight / 2 : 0); + var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5); + + // Keep this in loop since we may support array properties here + var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor); + ctx.fillStyle = pointLabelFontColor; + + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians); + ctx.textAlign = getTextAlignForAngle(angle); + adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); + fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight); + } + } + ctx.restore(); +} + +function drawRadiusLine(scale, gridLineOpts, radius, index) { + var ctx = scale.ctx; + var circular = gridLineOpts.circular; + var valueCount = getValueCount(scale); + var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1); + var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1); + var pointPosition; + + if ((!circular && !valueCount) || !lineColor || !lineWidth) { + return; + } + + ctx.save(); + ctx.strokeStyle = lineColor; + ctx.lineWidth = lineWidth; + if (ctx.setLineDash) { + ctx.setLineDash(gridLineOpts.borderDash || []); + ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0; + } + + ctx.beginPath(); + if (circular) { + // Draw circular arcs between the points + ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); + } else { + // Draw straight lines connecting each index + pointPosition = scale.getPointPosition(0, radius); + ctx.moveTo(pointPosition.x, pointPosition.y); + + for (var i = 1; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, radius); + ctx.lineTo(pointPosition.x, pointPosition.y); + } + } + ctx.closePath(); + ctx.stroke(); + ctx.restore(); +} + +function numberOrZero(param) { + return helpers$1.isNumber(param) ? param : 0; +} + +var scale_radialLinear = scale_linearbase.extend({ + setDimensions: function() { + var me = this; + + // Set the unconstrained dimension before label rotation + me.width = me.maxWidth; + me.height = me.maxHeight; + me.paddingTop = getTickBackdropHeight(me.options) / 2; + me.xCenter = Math.floor(me.width / 2); + me.yCenter = Math.floor((me.height - me.paddingTop) / 2); + me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2; + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var min = Number.POSITIVE_INFINITY; + var max = Number.NEGATIVE_INFINITY; + + helpers$1.each(chart.data.datasets, function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + min = Math.min(value, min); + max = Math.max(value, max); + }); + } + }); + + me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); + me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + me.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function() { + return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); + }, + + convertTicksToLabels: function() { + var me = this; + + scale_linearbase.prototype.convertTicksToLabels.call(me); + + // Point labels + me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); + }, + + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + fit: function() { + var me = this; + var opts = me.options; + + if (opts.display && opts.pointLabels.display) { + fitWithPointLabels(me); + } else { + me.setCenterPoint(0, 0, 0, 0); + } + }, + + /** + * Set radius reductions and determine new radius and center point + * @private + */ + setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) { + var me = this; + var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); + var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); + var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); + var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b); + + radiusReductionLeft = numberOrZero(radiusReductionLeft); + radiusReductionRight = numberOrZero(radiusReductionRight); + radiusReductionTop = numberOrZero(radiusReductionTop); + radiusReductionBottom = numberOrZero(radiusReductionBottom); + + me.drawingArea = Math.min( + Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), + Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); + me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); + }, + + setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) { + var me = this; + var maxRight = me.width - rightMovement - me.drawingArea; + var maxLeft = leftMovement + me.drawingArea; + var maxTop = topMovement + me.drawingArea; + var maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea; + + me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left); + me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop); + }, + + getIndexAngle: function(index) { + var angleMultiplier = (Math.PI * 2) / getValueCount(this); + var startAngle = this.chart.options && this.chart.options.startAngle ? + this.chart.options.startAngle : + 0; + + var startAngleRadians = startAngle * Math.PI * 2 / 360; + + // Start from the top instead of right, so remove a quarter of the circle + return index * angleMultiplier + startAngleRadians; + }, + + getDistanceFromCenterForValue: function(value) { + var me = this; + + if (value === null) { + return 0; // null always in center + } + + // Take into account half font size + the yPadding of the top value + var scalingFactor = me.drawingArea / (me.max - me.min); + if (me.options.ticks.reverse) { + return (me.max - value) * scalingFactor; + } + return (value - me.min) * scalingFactor; + }, + + getPointPosition: function(index, distanceFromCenter) { + var me = this; + var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); + return { + x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter, + y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter + }; + }, + + getPointPositionForValue: function(index, value) { + return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); + }, + + getBasePosition: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.getPointPositionForValue(0, + me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0); + }, + + draw: function() { + var me = this; + var opts = me.options; + var gridLineOpts = opts.gridLines; + var tickOpts = opts.ticks; + + if (opts.display) { + var ctx = me.ctx; + var startAngle = this.getIndexAngle(0); + var tickFont = helpers$1.options._parseFont(tickOpts); + + if (opts.angleLines.display || opts.pointLabels.display) { + drawPointLabels(me); + } + + helpers$1.each(me.ticks, function(label, index) { + // Don't draw a centre value (if it is minimum) + if (index > 0 || tickOpts.reverse) { + var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); + + // Draw circular lines around the scale + if (gridLineOpts.display && index !== 0) { + drawRadiusLine(me, gridLineOpts, yCenterOffset, index); + } + + if (tickOpts.display) { + var tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor); + ctx.font = tickFont.string; + + ctx.save(); + ctx.translate(me.xCenter, me.yCenter); + ctx.rotate(startAngle); + + if (tickOpts.showLabelBackdrop) { + var labelWidth = ctx.measureText(label).width; + ctx.fillStyle = tickOpts.backdropColor; + ctx.fillRect( + -labelWidth / 2 - tickOpts.backdropPaddingX, + -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY, + labelWidth + tickOpts.backdropPaddingX * 2, + tickFont.size + tickOpts.backdropPaddingY * 2 + ); + } + + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = tickFontColor; + ctx.fillText(label, 0, -yCenterOffset); + ctx.restore(); + } + } + }); + } + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$3 = defaultConfig$3; +scale_radialLinear._defaults = _defaults$3; + +var valueOrDefault$c = helpers$1.valueOrDefault; + +// Integer constants are from the ES6 spec. +var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; +var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +var INTERVALS = { + millisecond: { + common: true, + size: 1, + steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] + }, + second: { + common: true, + size: 1000, + steps: [1, 2, 5, 10, 15, 30] + }, + minute: { + common: true, + size: 60000, + steps: [1, 2, 5, 10, 15, 30] + }, + hour: { + common: true, + size: 3600000, + steps: [1, 2, 3, 6, 12] + }, + day: { + common: true, + size: 86400000, + steps: [1, 2, 5] + }, + week: { + common: false, + size: 604800000, + steps: [1, 2, 3, 4] + }, + month: { + common: true, + size: 2.628e9, + steps: [1, 2, 3] + }, + quarter: { + common: false, + size: 7.884e9, + steps: [1, 2, 3, 4] + }, + year: { + common: true, + size: 3.154e10 + } +}; + +var UNITS = Object.keys(INTERVALS); + +function sorter(a, b) { + return a - b; +} + +function arrayUnique(items) { + var hash = {}; + var out = []; + var i, ilen, item; + + for (i = 0, ilen = items.length; i < ilen; ++i) { + item = items[i]; + if (!hash[item]) { + hash[item] = true; + out.push(item); + } + } + + return out; +} + +/** + * Returns an array of {time, pos} objects used to interpolate a specific `time` or position + * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is + * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other + * extremity (left + width or top + height). Note that it would be more optimized to directly + * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need + * to create the lookup table. The table ALWAYS contains at least two items: min and max. + * + * @param {number[]} timestamps - timestamps sorted from lowest to highest. + * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min + * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. + * If 'series', timestamps will be positioned at the same distance from each other. In this + * case, only timestamps that break the time linearity are registered, meaning that in the + * best case, all timestamps are linear, the table contains only min and max. + */ +function buildLookupTable(timestamps, min, max, distribution) { + if (distribution === 'linear' || !timestamps.length) { + return [ + {time: min, pos: 0}, + {time: max, pos: 1} + ]; + } + + var table = []; + var items = [min]; + var i, ilen, prev, curr, next; + + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + curr = timestamps[i]; + if (curr > min && curr < max) { + items.push(curr); + } + } + + items.push(max); + + for (i = 0, ilen = items.length; i < ilen; ++i) { + next = items[i + 1]; + prev = items[i - 1]; + curr = items[i]; + + // only add points that breaks the scale linearity + if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { + table.push({time: curr, pos: i / (ilen - 1)}); + } + } + + return table; +} + +// @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ +function lookup(table, key, value) { + var lo = 0; + var hi = table.length - 1; + var mid, i0, i1; + + while (lo >= 0 && lo <= hi) { + mid = (lo + hi) >> 1; + i0 = table[mid - 1] || null; + i1 = table[mid]; + + if (!i0) { + // given value is outside table (before first item) + return {lo: null, hi: i1}; + } else if (i1[key] < value) { + lo = mid + 1; + } else if (i0[key] > value) { + hi = mid - 1; + } else { + return {lo: i0, hi: i1}; + } + } + + // given value is outside table (after last item) + return {lo: i1, hi: null}; +} + +/** + * Linearly interpolates the given source `value` using the table items `skey` values and + * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') + * returns the position for a timestamp equal to 42. If value is out of bounds, values at + * index [0, 1] or [n - 1, n] are used for the interpolation. + */ +function interpolate$1(table, skey, sval, tkey) { + var range = lookup(table, skey, sval); + + // Note: the lookup table ALWAYS contains at least 2 items (min and max) + var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; + var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; + + var span = next[skey] - prev[skey]; + var ratio = span ? (sval - prev[skey]) / span : 0; + var offset = (next[tkey] - prev[tkey]) * ratio; + + return prev[tkey] + offset; +} + +function toTimestamp(scale, input) { + var adapter = scale._adapter; + var options = scale.options.time; + var parser = options.parser; + var format = parser || options.format; + var value = input; + + if (typeof parser === 'function') { + value = parser(value); + } + + // Only parse if its not a timestamp already + if (!helpers$1.isFinite(value)) { + value = typeof format === 'string' + ? adapter.parse(value, format) + : adapter.parse(value); + } + + if (value !== null) { + return +value; + } + + // Labels are in an incompatible format and no `parser` has been provided. + // The user might still use the deprecated `format` option for parsing. + if (!parser && typeof format === 'function') { + value = format(input); + + // `format` could return something else than a timestamp, if so, parse it + if (!helpers$1.isFinite(value)) { + value = adapter.parse(value); + } + } + + return value; +} + +function parse(scale, input) { + if (helpers$1.isNullOrUndef(input)) { + return null; + } + + var options = scale.options.time; + var value = toTimestamp(scale, scale.getRightValue(input)); + if (value === null) { + return value; + } + + if (options.round) { + value = +scale._adapter.startOf(value, options.round); + } + + return value; +} + +/** + * Returns the number of unit to skip to be able to display up to `capacity` number of ticks + * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. + */ +function determineStepSize(min, max, unit, capacity) { + var range = max - min; + var interval = INTERVALS[unit]; + var milliseconds = interval.size; + var steps = interval.steps; + var i, ilen, factor; + + if (!steps) { + return Math.ceil(range / (capacity * milliseconds)); + } + + for (i = 0, ilen = steps.length; i < ilen; ++i) { + factor = steps[i]; + if (Math.ceil(range / (milliseconds * factor)) <= capacity) { + break; + } + } + + return factor; +} + +/** + * Figures out what unit results in an appropriate number of auto-generated ticks + */ +function determineUnitForAutoTicks(minUnit, min, max, capacity) { + var ilen = UNITS.length; + var i, interval, factor; + + for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { + interval = INTERVALS[UNITS[i]]; + factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; + + if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { + return UNITS[i]; + } + } + + return UNITS[ilen - 1]; +} + +/** + * Figures out what unit to format a set of ticks with + */ +function determineUnitForFormatting(scale, ticks, minUnit, min, max) { + var ilen = UNITS.length; + var i, unit; + + for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { + unit = UNITS[i]; + if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) { + return unit; + } + } + + return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; +} + +function determineMajorUnit(unit) { + for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { + if (INTERVALS[UNITS[i]].common) { + return UNITS[i]; + } + } +} + +/** + * Generates a maximum of `capacity` timestamps between min and max, rounded to the + * `minor` unit, aligned on the `major` unit and using the given scale time `options`. + * Important: this method can return ticks outside the min and max range, it's the + * responsibility of the calling code to clamp values if needed. + */ +function generate(scale, min, max, capacity) { + var adapter = scale._adapter; + var options = scale.options; + var timeOpts = options.time; + var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); + var major = determineMajorUnit(minor); + var stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize); + var weekday = minor === 'week' ? timeOpts.isoWeekday : false; + var majorTicksEnabled = options.ticks.major.enabled; + var interval = INTERVALS[minor]; + var first = min; + var last = max; + var ticks = []; + var time; + + if (!stepSize) { + stepSize = determineStepSize(min, max, minor, capacity); + } + + // For 'week' unit, handle the first day of week option + if (weekday) { + first = +adapter.startOf(first, 'isoWeek', weekday); + last = +adapter.startOf(last, 'isoWeek', weekday); + } + + // Align first/last ticks on unit + first = +adapter.startOf(first, weekday ? 'day' : minor); + last = +adapter.startOf(last, weekday ? 'day' : minor); + + // Make sure that the last tick include max + if (last < max) { + last = +adapter.add(last, 1, minor); + } + + time = first; + + if (majorTicksEnabled && major && !weekday && !timeOpts.round) { + // Align the first tick on the previous `minor` unit aligned on the `major` unit: + // we first aligned time on the previous `major` unit then add the number of full + // stepSize there is between first and the previous major time. + time = +adapter.startOf(time, major); + time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor); + } + + for (; time < last; time = +adapter.add(time, stepSize, minor)) { + ticks.push(+time); + } + + ticks.push(+time); + + return ticks; +} + +/** + * Returns the start and end offsets from edges in the form of {start, end} + * where each value is a relative width to the scale and ranges between 0 and 1. + * They add extra margins on the both sides by scaling down the original scale. + * Offsets are added when the `offset` option is true. + */ +function computeOffsets(table, ticks, min, max, options) { + var start = 0; + var end = 0; + var first, last; + + if (options.offset && ticks.length) { + if (!options.time.min) { + first = interpolate$1(table, 'time', ticks[0], 'pos'); + if (ticks.length === 1) { + start = 1 - first; + } else { + start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2; + } + } + if (!options.time.max) { + last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos'); + if (ticks.length === 1) { + end = last; + } else { + end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2; + } + } + } + + return {start: start, end: end}; +} + +function ticksFromTimestamps(scale, values, majorUnit) { + var ticks = []; + var i, ilen, value, major; + + for (i = 0, ilen = values.length; i < ilen; ++i) { + value = values[i]; + major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false; + + ticks.push({ + value: value, + major: major + }); + } + + return ticks; +} + +var defaultConfig$4 = { + position: 'bottom', + + /** + * Data distribution along the scale: + * - 'linear': data are spread according to their time (distances can vary), + * - 'series': data are spread at the same distance from each other. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + distribution: 'linear', + + /** + * Scale boundary strategy (bypassed by min/max time options) + * - `data`: make sure data are fully visible, ticks outside are removed + * - `ticks`: make sure ticks are fully visible, data outside are truncated + * @see https://github.com/chartjs/Chart.js/pull/4556 + * @since 2.7.0 + */ + bounds: 'data', + + adapters: {}, + time: { + parser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment + format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/ + unit: false, // false == automatic or override with week, month, year, etc. + round: false, // none, or override with week, month, year, etc. + displayFormat: false, // DEPRECATED + isoWeekday: false, // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/ + minUnit: 'millisecond', + displayFormats: {} + }, + ticks: { + autoSkip: false, + + /** + * Ticks generation input values: + * - 'auto': generates "optimal" ticks based on scale size and time options. + * - 'data': generates ticks from data (including labels from data {t|x|y} objects). + * - 'labels': generates ticks from user given `data.labels` values ONLY. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + source: 'auto', + + major: { + enabled: false + } + } +}; + +var scale_time = core_scale.extend({ + initialize: function() { + this.mergeTicksOptions(); + core_scale.prototype.initialize.call(this); + }, + + update: function() { + var me = this; + var options = me.options; + var time = options.time || (options.time = {}); + var adapter = me._adapter = new core_adapters._date(options.adapters.date); + + // DEPRECATIONS: output a message only one time per update + if (time.format) { + console.warn('options.time.format is deprecated and replaced by options.time.parser.'); + } + + // Backward compatibility: before introducing adapter, `displayFormats` was + // supposed to contain *all* unit/string pairs but this can't be resolved + // when loading the scale (adapters are loaded afterward), so let's populate + // missing formats on update + helpers$1.mergeIf(time.displayFormats, adapter.formats()); + + return core_scale.prototype.update.apply(me, arguments); + }, + + /** + * Allows data to be referenced via 't' attribute + */ + getRightValue: function(rawValue) { + if (rawValue && rawValue.t !== undefined) { + rawValue = rawValue.t; + } + return core_scale.prototype.getRightValue.call(this, rawValue); + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var adapter = me._adapter; + var timeOpts = me.options.time; + var unit = timeOpts.unit || 'day'; + var min = MAX_INTEGER; + var max = MIN_INTEGER; + var timestamps = []; + var datasets = []; + var labels = []; + var i, j, ilen, jlen, data, timestamp; + var dataLabels = chart.data.labels || []; + + // Convert labels to timestamps + for (i = 0, ilen = dataLabels.length; i < ilen; ++i) { + labels.push(parse(me, dataLabels[i])); + } + + // Convert data to timestamps + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + data = chart.data.datasets[i].data; + + // Let's consider that all data have the same format. + if (helpers$1.isObject(data[0])) { + datasets[i] = []; + + for (j = 0, jlen = data.length; j < jlen; ++j) { + timestamp = parse(me, data[j]); + timestamps.push(timestamp); + datasets[i][j] = timestamp; + } + } else { + for (j = 0, jlen = labels.length; j < jlen; ++j) { + timestamps.push(labels[j]); + } + datasets[i] = labels.slice(0); + } + } else { + datasets[i] = []; + } + } + + if (labels.length) { + // Sort labels **after** data have been converted + labels = arrayUnique(labels).sort(sorter); + min = Math.min(min, labels[0]); + max = Math.max(max, labels[labels.length - 1]); + } + + if (timestamps.length) { + timestamps = arrayUnique(timestamps).sort(sorter); + min = Math.min(min, timestamps[0]); + max = Math.max(max, timestamps[timestamps.length - 1]); + } + + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // In case there is no valid min/max, set limits based on unit time option + min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min; + max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max; + + // Make sure that max is strictly higher than min (required by the lookup table) + me.min = Math.min(min, max); + me.max = Math.max(min + 1, max); + + // PRIVATE + me._horizontal = me.isHorizontal(); + me._table = []; + me._timestamps = { + data: timestamps, + datasets: datasets, + labels: labels + }; + }, + + buildTicks: function() { + var me = this; + var min = me.min; + var max = me.max; + var options = me.options; + var timeOpts = options.time; + var timestamps = []; + var ticks = []; + var i, ilen, timestamp; + + switch (options.ticks.source) { + case 'data': + timestamps = me._timestamps.data; + break; + case 'labels': + timestamps = me._timestamps.labels; + break; + case 'auto': + default: + timestamps = generate(me, min, max, me.getLabelCapacity(min), options); + } + + if (options.bounds === 'ticks' && timestamps.length) { + min = timestamps[0]; + max = timestamps[timestamps.length - 1]; + } + + // Enforce limits with user min/max options + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // Remove ticks outside the min/max range + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + timestamp = timestamps[i]; + if (timestamp >= min && timestamp <= max) { + ticks.push(timestamp); + } + } + + me.min = min; + me.max = max; + + // PRIVATE + me._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max); + me._majorUnit = determineMajorUnit(me._unit); + me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); + me._offsets = computeOffsets(me._table, ticks, min, max, options); + + if (options.ticks.reverse) { + ticks.reverse(); + } + + return ticksFromTimestamps(me, ticks, me._majorUnit); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var adapter = me._adapter; + var data = me.chart.data; + var timeOpts = me.options.time; + var label = data.labels && index < data.labels.length ? data.labels[index] : ''; + var value = data.datasets[datasetIndex].data[index]; + + if (helpers$1.isObject(value)) { + label = me.getRightValue(value); + } + if (timeOpts.tooltipFormat) { + return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat); + } + if (typeof label === 'string') { + return label; + } + return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime); + }, + + /** + * Function to format an individual tick mark + * @private + */ + tickFormatFunction: function(time, index, ticks, format) { + var me = this; + var adapter = me._adapter; + var options = me.options; + var formats = options.time.displayFormats; + var minorFormat = formats[me._unit]; + var majorUnit = me._majorUnit; + var majorFormat = formats[majorUnit]; + var majorTime = +adapter.startOf(time, majorUnit); + var majorTickOpts = options.ticks.major; + var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; + var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat); + var tickOpts = major ? majorTickOpts : options.ticks.minor; + var formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback); + + return formatter ? formatter(label, index, ticks) : label; + }, + + convertTicksToLabels: function(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(this.tickFormatFunction(ticks[i].value, i, ticks)); + } + + return labels; + }, + + /** + * @private + */ + getPixelForOffset: function(time) { + var me = this; + var isReverse = me.options.ticks.reverse; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top; + var pos = interpolate$1(me._table, 'time', time, 'pos'); + var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end); + + return isReverse ? start - offset : start + offset; + }, + + getPixelForValue: function(value, index, datasetIndex) { + var me = this; + var time = null; + + if (index !== undefined && datasetIndex !== undefined) { + time = me._timestamps.datasets[datasetIndex][index]; + } + + if (time === null) { + time = parse(me, value); + } + + if (time !== null) { + return me.getPixelForOffset(time); + } + }, + + getPixelForTick: function(index) { + var ticks = this.getTicks(); + return index >= 0 && index < ticks.length ? + this.getPixelForOffset(ticks[index].value) : + null; + }, + + getValueForPixel: function(pixel) { + var me = this; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? me.left : me.top; + var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end; + var time = interpolate$1(me._table, 'pos', pos, 'time'); + + // DEPRECATION, we should return time directly + return me._adapter._create(time); + }, + + /** + * Crude approximation of what the label width might be + * @private + */ + getLabelWidth: function(label) { + var me = this; + var ticksOpts = me.options.ticks; + var tickLabelWidth = me.ctx.measureText(label).width; + var angle = helpers$1.toRadians(ticksOpts.maxRotation); + var cosRotation = Math.cos(angle); + var sinRotation = Math.sin(angle); + var tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize); + + return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); + }, + + /** + * @private + */ + getLabelCapacity: function(exampleTime) { + var me = this; + + // pick the longest format (milliseconds) for guestimation + var format = me.options.time.displayFormats.millisecond; + var exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format); + var tickLabelWidth = me.getLabelWidth(exampleLabel); + var innerWidth = me.isHorizontal() ? me.width : me.height; + var capacity = Math.floor(innerWidth / tickLabelWidth); + + return capacity > 0 ? capacity : 1; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$4 = defaultConfig$4; +scale_time._defaults = _defaults$4; + +var scales = { + category: scale_category, + linear: scale_linear, + logarithmic: scale_logarithmic, + radialLinear: scale_radialLinear, + time: scale_time +}; + +var FORMATS = { + datetime: 'MMM D, YYYY, h:mm:ss a', + millisecond: 'h:mm:ss.SSS a', + second: 'h:mm:ss a', + minute: 'h:mm a', + hour: 'hA', + day: 'MMM D', + week: 'll', + month: 'MMM YYYY', + quarter: '[Q]Q - YYYY', + year: 'YYYY' +}; + +core_adapters._date.override(typeof moment === 'function' ? { + _id: 'moment', // DEBUG ONLY + + formats: function() { + return FORMATS; + }, + + parse: function(value, format) { + if (typeof value === 'string' && typeof format === 'string') { + value = moment(value, format); + } else if (!(value instanceof moment)) { + value = moment(value); + } + return value.isValid() ? value.valueOf() : null; + }, + + format: function(time, format) { + return moment(time).format(format); + }, + + add: function(time, amount, unit) { + return moment(time).add(amount, unit).valueOf(); + }, + + diff: function(max, min, unit) { + return moment.duration(moment(max).diff(moment(min))).as(unit); + }, + + startOf: function(time, unit, weekday) { + time = moment(time); + if (unit === 'isoWeek') { + return time.isoWeekday(weekday).valueOf(); + } + return time.startOf(unit).valueOf(); + }, + + endOf: function(time, unit) { + return moment(time).endOf(unit).valueOf(); + }, + + // DEPRECATIONS + + /** + * Provided for backward compatibility with scale.getValueForPixel(). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function(time) { + return moment(time); + }, +} : {}); + +core_defaults._set('global', { + plugins: { + filler: { + propagate: true + } + } +}); + +var mappers = { + dataset: function(source) { + var index = source.fill; + var chart = source.chart; + var meta = chart.getDatasetMeta(index); + var visible = meta && chart.isDatasetVisible(index); + var points = (visible && meta.dataset._children) || []; + var length = points.length || 0; + + return !length ? null : function(point, i) { + return (i < length && points[i]._view) || null; + }; + }, + + boundary: function(source) { + var boundary = source.boundary; + var x = boundary ? boundary.x : null; + var y = boundary ? boundary.y : null; + + return function(point) { + return { + x: x === null ? point.x : x, + y: y === null ? point.y : y, + }; + }; + } +}; + +// @todo if (fill[0] === '#') +function decodeFill(el, index, count) { + var model = el._model || {}; + var fill = model.fill; + var target; + + if (fill === undefined) { + fill = !!model.backgroundColor; + } + + if (fill === false || fill === null) { + return false; + } + + if (fill === true) { + return 'origin'; + } + + target = parseFloat(fill, 10); + if (isFinite(target) && Math.floor(target) === target) { + if (fill[0] === '-' || fill[0] === '+') { + target = index + target; + } + + if (target === index || target < 0 || target >= count) { + return false; + } + + return target; + } + + switch (fill) { + // compatibility + case 'bottom': + return 'start'; + case 'top': + return 'end'; + case 'zero': + return 'origin'; + // supported boundaries + case 'origin': + case 'start': + case 'end': + return fill; + // invalid fill values + default: + return false; + } +} + +function computeBoundary(source) { + var model = source.el._model || {}; + var scale = source.el._scale || {}; + var fill = source.fill; + var target = null; + var horizontal; + + if (isFinite(fill)) { + return null; + } + + // Backward compatibility: until v3, we still need to support boundary values set on + // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and + // controllers might still use it (e.g. the Smith chart). + + if (fill === 'start') { + target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; + } else if (fill === 'end') { + target = model.scaleTop === undefined ? scale.top : model.scaleTop; + } else if (model.scaleZero !== undefined) { + target = model.scaleZero; + } else if (scale.getBasePosition) { + target = scale.getBasePosition(); + } else if (scale.getBasePixel) { + target = scale.getBasePixel(); + } + + if (target !== undefined && target !== null) { + if (target.x !== undefined && target.y !== undefined) { + return target; + } + + if (helpers$1.isFinite(target)) { + horizontal = scale.isHorizontal(); + return { + x: horizontal ? target : null, + y: horizontal ? null : target + }; + } + } + + return null; +} + +function resolveTarget(sources, index, propagate) { + var source = sources[index]; + var fill = source.fill; + var visited = [index]; + var target; + + if (!propagate) { + return fill; + } + + while (fill !== false && visited.indexOf(fill) === -1) { + if (!isFinite(fill)) { + return fill; + } + + target = sources[fill]; + if (!target) { + return false; + } + + if (target.visible) { + return fill; + } + + visited.push(fill); + fill = target.fill; + } + + return false; +} + +function createMapper(source) { + var fill = source.fill; + var type = 'dataset'; + + if (fill === false) { + return null; + } + + if (!isFinite(fill)) { + type = 'boundary'; + } + + return mappers[type](source); +} + +function isDrawable(point) { + return point && !point.skip; +} + +function drawArea(ctx, curve0, curve1, len0, len1) { + var i; + + if (!len0 || !len1) { + return; + } + + // building first area curve (normal) + ctx.moveTo(curve0[0].x, curve0[0].y); + for (i = 1; i < len0; ++i) { + helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); + } + + // joining the two area curves + ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); + + // building opposite area curve (reverse) + for (i = len1 - 1; i > 0; --i) { + helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); + } +} + +function doFill(ctx, points, mapper, view, color, loop) { + var count = points.length; + var span = view.spanGaps; + var curve0 = []; + var curve1 = []; + var len0 = 0; + var len1 = 0; + var i, ilen, index, p0, p1, d0, d1; + + ctx.beginPath(); + + for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { + index = i % count; + p0 = points[index]._view; + p1 = mapper(p0, index, view); + d0 = isDrawable(p0); + d1 = isDrawable(p1); + + if (d0 && d1) { + len0 = curve0.push(p0); + len1 = curve1.push(p1); + } else if (len0 && len1) { + if (!span) { + drawArea(ctx, curve0, curve1, len0, len1); + len0 = len1 = 0; + curve0 = []; + curve1 = []; + } else { + if (d0) { + curve0.push(p0); + } + if (d1) { + curve1.push(p1); + } + } + } + } + + drawArea(ctx, curve0, curve1, len0, len1); + + ctx.closePath(); + ctx.fillStyle = color; + ctx.fill(); +} + +var plugin_filler = { + id: 'filler', + + afterDatasetsUpdate: function(chart, options) { + var count = (chart.data.datasets || []).length; + var propagate = options.propagate; + var sources = []; + var meta, i, el, source; + + for (i = 0; i < count; ++i) { + meta = chart.getDatasetMeta(i); + el = meta.dataset; + source = null; + + if (el && el._model && el instanceof elements.Line) { + source = { + visible: chart.isDatasetVisible(i), + fill: decodeFill(el, i, count), + chart: chart, + el: el + }; + } + + meta.$filler = source; + sources.push(source); + } + + for (i = 0; i < count; ++i) { + source = sources[i]; + if (!source) { + continue; + } + + source.fill = resolveTarget(sources, i, propagate); + source.boundary = computeBoundary(source); + source.mapper = createMapper(source); + } + }, + + beforeDatasetDraw: function(chart, args) { + var meta = args.meta.$filler; + if (!meta) { + return; + } + + var ctx = chart.ctx; + var el = meta.el; + var view = el._view; + var points = el._children || []; + var mapper = meta.mapper; + var color = view.backgroundColor || core_defaults.global.defaultColor; + + if (mapper && color && points.length) { + helpers$1.canvas.clipArea(ctx, chart.chartArea); + doFill(ctx, points, mapper, view, color, el._loop); + helpers$1.canvas.unclipArea(ctx); + } + } +}; + +var noop$1 = helpers$1.noop; +var valueOrDefault$d = helpers$1.valueOrDefault; + +core_defaults._set('global', { + legend: { + display: true, + position: 'top', + fullWidth: true, + reverse: false, + weight: 1000, + + // a callback that will handle + onClick: function(e, legendItem) { + var index = legendItem.datasetIndex; + var ci = this.chart; + var meta = ci.getDatasetMeta(index); + + // See controller.isDatasetVisible comment + meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; + + // We hid a dataset ... rerender the chart + ci.update(); + }, + + onHover: null, + onLeave: null, + + labels: { + boxWidth: 40, + padding: 10, + // Generates labels shown in the legend + // Valid properties to return: + // text : text to display + // fillStyle : fill of coloured box + // strokeStyle: stroke of coloured box + // hidden : if this legend item refers to a hidden item + // lineCap : cap style for line + // lineDash + // lineDashOffset : + // lineJoin : + // lineWidth : + generateLabels: function(chart) { + var data = chart.data; + return helpers$1.isArray(data.datasets) ? data.datasets.map(function(dataset, i) { + return { + text: dataset.label, + fillStyle: (!helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), + hidden: !chart.isDatasetVisible(i), + lineCap: dataset.borderCapStyle, + lineDash: dataset.borderDash, + lineDashOffset: dataset.borderDashOffset, + lineJoin: dataset.borderJoinStyle, + lineWidth: dataset.borderWidth, + strokeStyle: dataset.borderColor, + pointStyle: dataset.pointStyle, + + // Below is extra data used for toggling the datasets + datasetIndex: i + }; + }, this) : []; + } + } + }, + + legendCallback: function(chart) { + var text = []; + text.push('
    '); + for (var i = 0; i < chart.data.datasets.length; i++) { + text.push('
  • '); + if (chart.data.datasets[i].label) { + text.push(chart.data.datasets[i].label); + } + text.push('
  • '); + } + text.push('
'); + return text.join(''); + } +}); + +/** + * Helper function to get the box width based on the usePointStyle option + * @param {object} labelopts - the label options on the legend + * @param {number} fontSize - the label font size + * @return {number} width of the color box area + */ +function getBoxWidth(labelOpts, fontSize) { + return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ? + fontSize : + labelOpts.boxWidth; +} + +/** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ +var Legend = core_element.extend({ + + initialize: function(config) { + helpers$1.extend(this, config); + + // Contains hit boxes for each dataset (in dataset order) + this.legendHitBoxes = []; + + /** + * @private + */ + this._hoveredItem = null; + + // Are we in doughnut mode which has a different data type + this.doughnutMode = false; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + // Any function defined here is inherited by all legend types. + // Any function can be extended by the legend type + + beforeUpdate: noop$1, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + }, + afterUpdate: noop$1, + + // + + beforeSetDimensions: noop$1, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$1, + + // + + beforeBuildLabels: noop$1, + buildLabels: function() { + var me = this; + var labelOpts = me.options.labels || {}; + var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || []; + + if (labelOpts.filter) { + legendItems = legendItems.filter(function(item) { + return labelOpts.filter(item, me.chart.data); + }); + } + + if (me.options.reverse) { + legendItems.reverse(); + } + + me.legendItems = legendItems; + }, + afterBuildLabels: noop$1, + + // + + beforeFit: noop$1, + fit: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var display = opts.display; + + var ctx = me.ctx; + + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + + // Reset hit boxes + var hitboxes = me.legendHitBoxes = []; + + var minSize = me.minSize; + var isHorizontal = me.isHorizontal(); + + if (isHorizontal) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = display ? 10 : 0; + } else { + minSize.width = display ? 10 : 0; + minSize.height = me.maxHeight; // fill all the height + } + + // Increase sizes here + if (display) { + ctx.font = labelFont.string; + + if (isHorizontal) { + // Labels + + // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one + var lineWidths = me.lineWidths = [0]; + var totalHeight = 0; + + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + + helpers$1.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + if (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) { + totalHeight += fontSize + labelOpts.padding; + lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding; + } + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: width, + height: fontSize + }; + + lineWidths[lineWidths.length - 1] += width + labelOpts.padding; + }); + + minSize.height += totalHeight; + + } else { + var vPadding = labelOpts.padding; + var columnWidths = me.columnWidths = []; + var totalWidth = labelOpts.padding; + var currentColWidth = 0; + var currentColHeight = 0; + var itemHeight = fontSize + vPadding; + + helpers$1.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + // If too tall, go to new column + if (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) { + totalWidth += currentColWidth + labelOpts.padding; + columnWidths.push(currentColWidth); // previous column width + + currentColWidth = 0; + currentColHeight = 0; + } + + // Get max width + currentColWidth = Math.max(currentColWidth, itemWidth); + currentColHeight += itemHeight; + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: itemWidth, + height: fontSize + }; + }); + + totalWidth += currentColWidth; + columnWidths.push(currentColWidth); + minSize.width += totalWidth; + } + } + + me.width = minSize.width; + me.height = minSize.height; + }, + afterFit: noop$1, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + + // Actually draw the legend on the canvas + draw: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; + var lineDefault = globalDefaults.elements.line; + var legendWidth = me.width; + var lineWidths = me.lineWidths; + + if (opts.display) { + var ctx = me.ctx; + var fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor); + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + var cursor; + + // Canvas setup + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + ctx.lineWidth = 0.5; + ctx.strokeStyle = fontColor; // for strikethrough effect + ctx.fillStyle = fontColor; // render in correct colour + ctx.font = labelFont.string; + + var boxWidth = getBoxWidth(labelOpts, fontSize); + var hitboxes = me.legendHitBoxes; + + // current position + var drawLegendBox = function(x, y, legendItem) { + if (isNaN(boxWidth) || boxWidth <= 0) { + return; + } + + // Set the ctx for the box + ctx.save(); + + var lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth); + ctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor); + ctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle); + ctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset); + ctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor); + + if (ctx.setLineDash) { + // IE 9 and 10 do not support line dash + ctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash)); + } + + if (opts.labels && opts.labels.usePointStyle) { + // Recalculate x and y for drawPoint() because its expecting + // x and y to be center of figure (instead of top left) + var radius = boxWidth * Math.SQRT2 / 2; + var centerX = x + boxWidth / 2; + var centerY = y + fontSize / 2; + + // Draw pointStyle as legend symbol + helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); + } else { + // Draw box as legend symbol + if (lineWidth !== 0) { + ctx.strokeRect(x, y, boxWidth, fontSize); + } + ctx.fillRect(x, y, boxWidth, fontSize); + } + + ctx.restore(); + }; + var fillText = function(x, y, legendItem, textWidth) { + var halfFontSize = fontSize / 2; + var xLeft = boxWidth + halfFontSize + x; + var yMiddle = y + halfFontSize; + + ctx.fillText(legendItem.text, xLeft, yMiddle); + + if (legendItem.hidden) { + // Strikethrough the text if hidden + ctx.beginPath(); + ctx.lineWidth = 2; + ctx.moveTo(xLeft, yMiddle); + ctx.lineTo(xLeft + textWidth, yMiddle); + ctx.stroke(); + } + }; + + // Horizontal + var isHorizontal = me.isHorizontal(); + if (isHorizontal) { + cursor = { + x: me.left + ((legendWidth - lineWidths[0]) / 2) + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } else { + cursor = { + x: me.left + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } + + var itemHeight = fontSize + labelOpts.padding; + helpers$1.each(me.legendItems, function(legendItem, i) { + var textWidth = ctx.measureText(legendItem.text).width; + var width = boxWidth + (fontSize / 2) + textWidth; + var x = cursor.x; + var y = cursor.y; + + // Use (me.left + me.minSize.width) and (me.top + me.minSize.height) + // instead of me.right and me.bottom because me.width and me.height + // may have been changed since me.minSize was calculated + if (isHorizontal) { + if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) { + y = cursor.y += itemHeight; + cursor.line++; + x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2) + labelOpts.padding; + } + } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) { + x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; + y = cursor.y = me.top + labelOpts.padding; + cursor.line++; + } + + drawLegendBox(x, y, legendItem); + + hitboxes[i].left = x; + hitboxes[i].top = y; + + // Fill the actual label + fillText(x, y, legendItem, textWidth); + + if (isHorizontal) { + cursor.x += width + labelOpts.padding; + } else { + cursor.y += itemHeight; + } + + }); + } + }, + + /** + * @private + */ + _getLegendItemAt: function(x, y) { + var me = this; + var i, hitBox, lh; + + if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { + // See if we are touching one of the dataset boxes + lh = me.legendHitBoxes; + for (i = 0; i < lh.length; ++i) { + hitBox = lh[i]; + + if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { + // Touching an element + return me.legendItems[i]; + } + } + } + + return null; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + */ + handleEvent: function(e) { + var me = this; + var opts = me.options; + var type = e.type === 'mouseup' ? 'click' : e.type; + var hoveredItem; + + if (type === 'mousemove') { + if (!opts.onHover && !opts.onLeave) { + return; + } + } else if (type === 'click') { + if (!opts.onClick) { + return; + } + } else { + return; + } + + // Chart event already has relative position in it + hoveredItem = me._getLegendItemAt(e.x, e.y); + + if (type === 'click') { + if (hoveredItem && opts.onClick) { + // use e.native for backwards compatibility + opts.onClick.call(me, e.native, hoveredItem); + } + } else { + if (opts.onLeave && hoveredItem !== me._hoveredItem) { + if (me._hoveredItem) { + opts.onLeave.call(me, e.native, me._hoveredItem); + } + me._hoveredItem = hoveredItem; + } + + if (opts.onHover && hoveredItem) { + // use e.native for backwards compatibility + opts.onHover.call(me, e.native, hoveredItem); + } + } + } +}); + +function createNewLegendAndAttach(chart, legendOpts) { + var legend = new Legend({ + ctx: chart.ctx, + options: legendOpts, + chart: chart + }); + + core_layouts.configure(chart, legend, legendOpts); + core_layouts.addBox(chart, legend); + chart.legend = legend; +} + +var plugin_legend = { + id: 'legend', + + /** + * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making + * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Legend, + + beforeInit: function(chart) { + var legendOpts = chart.options.legend; + + if (legendOpts) { + createNewLegendAndAttach(chart, legendOpts); + } + }, + + beforeUpdate: function(chart) { + var legendOpts = chart.options.legend; + var legend = chart.legend; + + if (legendOpts) { + helpers$1.mergeIf(legendOpts, core_defaults.global.legend); + + if (legend) { + core_layouts.configure(chart, legend, legendOpts); + legend.options = legendOpts; + } else { + createNewLegendAndAttach(chart, legendOpts); + } + } else if (legend) { + core_layouts.removeBox(chart, legend); + delete chart.legend; + } + }, + + afterEvent: function(chart, e) { + var legend = chart.legend; + if (legend) { + legend.handleEvent(e); + } + } +}; + +var noop$2 = helpers$1.noop; + +core_defaults._set('global', { + title: { + display: false, + fontStyle: 'bold', + fullWidth: true, + padding: 10, + position: 'top', + text: '', + weight: 2000 // by default greater than legend (1000) to be above + } +}); + +/** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ +var Title = core_element.extend({ + initialize: function(config) { + var me = this; + helpers$1.extend(me, config); + + // Contains hit boxes for each dataset (in dataset order) + me.legendHitBoxes = []; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + + beforeUpdate: noop$2, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: noop$2, + + // + + beforeSetDimensions: noop$2, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$2, + + // + + beforeBuildLabels: noop$2, + buildLabels: noop$2, + afterBuildLabels: noop$2, + + // + + beforeFit: noop$2, + fit: function() { + var me = this; + var opts = me.options; + var display = opts.display; + var minSize = me.minSize; + var lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1; + var fontOpts = helpers$1.options._parseFont(opts); + var textSize = display ? (lineCount * fontOpts.lineHeight) + (opts.padding * 2) : 0; + + if (me.isHorizontal()) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = textSize; + } else { + minSize.width = textSize; + minSize.height = me.maxHeight; // fill all the height + } + + me.width = minSize.width; + me.height = minSize.height; + + }, + afterFit: noop$2, + + // Shared Methods + isHorizontal: function() { + var pos = this.options.position; + return pos === 'top' || pos === 'bottom'; + }, + + // Actually draw the title block on the canvas + draw: function() { + var me = this; + var ctx = me.ctx; + var opts = me.options; + + if (opts.display) { + var fontOpts = helpers$1.options._parseFont(opts); + var lineHeight = fontOpts.lineHeight; + var offset = lineHeight / 2 + opts.padding; + var rotation = 0; + var top = me.top; + var left = me.left; + var bottom = me.bottom; + var right = me.right; + var maxWidth, titleX, titleY; + + ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour + ctx.font = fontOpts.string; + + // Horizontal + if (me.isHorizontal()) { + titleX = left + ((right - left) / 2); // midpoint of the width + titleY = top + offset; + maxWidth = right - left; + } else { + titleX = opts.position === 'left' ? left + offset : right - offset; + titleY = top + ((bottom - top) / 2); + maxWidth = bottom - top; + rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); + } + + ctx.save(); + ctx.translate(titleX, titleY); + ctx.rotate(rotation); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + var text = opts.text; + if (helpers$1.isArray(text)) { + var y = 0; + for (var i = 0; i < text.length; ++i) { + ctx.fillText(text[i], 0, y, maxWidth); + y += lineHeight; + } + } else { + ctx.fillText(text, 0, 0, maxWidth); + } + + ctx.restore(); + } + } +}); + +function createNewTitleBlockAndAttach(chart, titleOpts) { + var title = new Title({ + ctx: chart.ctx, + options: titleOpts, + chart: chart + }); + + core_layouts.configure(chart, title, titleOpts); + core_layouts.addBox(chart, title); + chart.titleBlock = title; +} + +var plugin_title = { + id: 'title', + + /** + * Backward compatibility: since 2.1.5, the title is registered as a plugin, making + * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Title, + + beforeInit: function(chart) { + var titleOpts = chart.options.title; + + if (titleOpts) { + createNewTitleBlockAndAttach(chart, titleOpts); + } + }, + + beforeUpdate: function(chart) { + var titleOpts = chart.options.title; + var titleBlock = chart.titleBlock; + + if (titleOpts) { + helpers$1.mergeIf(titleOpts, core_defaults.global.title); + + if (titleBlock) { + core_layouts.configure(chart, titleBlock, titleOpts); + titleBlock.options = titleOpts; + } else { + createNewTitleBlockAndAttach(chart, titleOpts); + } + } else if (titleBlock) { + core_layouts.removeBox(chart, titleBlock); + delete chart.titleBlock; + } + } +}; + +var plugins = {}; +var filler = plugin_filler; +var legend = plugin_legend; +var title = plugin_title; +plugins.filler = filler; +plugins.legend = legend; +plugins.title = title; + +/** + * @namespace Chart + */ + + +core_controller.helpers = helpers$1; + +// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! +core_helpers(core_controller); + +core_controller._adapters = core_adapters; +core_controller.Animation = core_animation; +core_controller.animationService = core_animations; +core_controller.controllers = controllers; +core_controller.DatasetController = core_datasetController; +core_controller.defaults = core_defaults; +core_controller.Element = core_element; +core_controller.elements = elements; +core_controller.Interaction = core_interaction; +core_controller.layouts = core_layouts; +core_controller.platform = platform; +core_controller.plugins = core_plugins; +core_controller.Scale = core_scale; +core_controller.scaleService = core_scaleService; +core_controller.Ticks = core_ticks; +core_controller.Tooltip = core_tooltip; + +// Register built-in scales + +core_controller.helpers.each(scales, function(scale, type) { + core_controller.scaleService.registerScaleType(type, scale, scale._defaults); +}); + +// Load to register built-in adapters (as side effects) + + +// Loading built-in plugins + +for (var k in plugins) { + if (plugins.hasOwnProperty(k)) { + core_controller.plugins.register(plugins[k]); + } +} + +core_controller.platform.initialize(); + +var src = core_controller; +if (typeof window !== 'undefined') { + window.Chart = core_controller; +} + +// DEPRECATIONS + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Chart + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +core_controller.Chart = core_controller; + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Legend + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.Legend = plugins.legend._element; + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Title + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.Title = plugins.title._element; + +/** + * Provided for backward compatibility, use Chart.plugins instead + * @namespace Chart.pluginService + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.pluginService = core_controller.plugins; + +/** + * Provided for backward compatibility, inheriting from Chart.PlugingBase has no + * effect, instead simply create/register plugins via plain JavaScript objects. + * @interface Chart.PluginBase + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ +core_controller.PluginBase = core_controller.Element.extend({}); + +/** + * Provided for backward compatibility, use Chart.helpers.canvas instead. + * @namespace Chart.canvasHelpers + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +core_controller.canvasHelpers = core_controller.helpers.canvas; + +/** + * Provided for backward compatibility, use Chart.layouts instead. + * @namespace Chart.layoutService + * @deprecated since version 2.7.3 + * @todo remove at version 3 + * @private + */ +core_controller.layoutService = core_controller.layouts; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.LinearScaleBase + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ +core_controller.LinearScaleBase = scale_linearbase; + +/** + * Provided for backward compatibility, instead we should create a new Chart + * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ +core_controller.helpers.each( + [ + 'Bar', + 'Bubble', + 'Doughnut', + 'Line', + 'PolarArea', + 'Radar', + 'Scatter' + ], + function(klass) { + core_controller[klass] = function(ctx, cfg) { + return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, { + type: klass.charAt(0).toLowerCase() + klass.slice(1) + })); + }; + } +); + +return src; + +}))); diff --git a/SRIP/Project-2 Issue Number 243/README.txt b/SRIP/Project-2 Issue Number 243/README.txt new file mode 100644 index 00000000..7d7553c3 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/README.txt @@ -0,0 +1,15 @@ +This is Readme file containing instruction for running the experiment: MLE: Learning the classifier from data + +TO RUN THE EXPERIMENT OF PERCEPTRON: +1. Download the SRIP folder +2. Go to Codes folder +3. Run the .html file + +HTML file will open in the browser and all functionalities will run from the HTML file. + + +TAKE A QUIZ OF THE EXPERIMENT: +1. Go to Quiz folder +2. Run quiz.html +3. Quiz will open in the browser +4. Give the quiz From 3389d3ec3553e392a4e90271e6689a35ee2dfabd Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 12 Jun 2019 15:41:48 +0530 Subject: [PATCH 088/166] project 2 added --- SRIP/Codes/exp3.css | 139 - SRIP/Codes/exp3.html | 115 - SRIP/Codes/exp3.js | 292 - SRIP/Libraries/Chart.js | 14680 ------------------------ SRIP/Quiz/quiz.css | 174 - SRIP/Quiz/quiz.html | 117 - SRIP/Quiz/quiz.js | 137 - SRIP/README.txt | 15 - SRIP/SRIP Project 1 Documentation.pdf | Bin 235622 -> 0 bytes SRIP/Test Cases for Project 1.pdf | Bin 53126 -> 0 bytes 10 files changed, 15669 deletions(-) delete mode 100644 SRIP/Codes/exp3.css delete mode 100644 SRIP/Codes/exp3.html delete mode 100644 SRIP/Codes/exp3.js delete mode 100644 SRIP/Libraries/Chart.js delete mode 100644 SRIP/Quiz/quiz.css delete mode 100644 SRIP/Quiz/quiz.html delete mode 100644 SRIP/Quiz/quiz.js delete mode 100644 SRIP/README.txt delete mode 100644 SRIP/SRIP Project 1 Documentation.pdf delete mode 100644 SRIP/Test Cases for Project 1.pdf diff --git a/SRIP/Codes/exp3.css b/SRIP/Codes/exp3.css deleted file mode 100644 index 81828b8e..00000000 --- a/SRIP/Codes/exp3.css +++ /dev/null @@ -1,139 +0,0 @@ -* { - -box-sizing: border-box; - -} - - -body { - -margin: 0; - -} - - -/*Graphs Layout */ -.graph { - -float: left; - -width: 50%; - -padding: 15px; - -max-width: 800px; - -margin: 50px auto; - -} - - - -.row:after { - -content: ""; - -display: table; - -clear: both; - -} - - -@media screen and (max-width:600px) { - -.graph { - -width: 100%; - -} - -} - - -/* 1st row Input Output Layout */ -.column-0 { - -float: left; - -padding: 10px; - -} - - -.column-0.side { - -width: 37.5%; - -} - - -.column-0.right { - -width: 25%; - -} - - -@media screen and (max-width: 600px) { - -.column-0.side, .column-0.right { - -width: 100%; - -} - -} - - -.button{ - margin:5px; -} - - -/* 2nd row Input Output Layout */ -.column-1 { - -float: left; - -width: 37.5%; - -padding: 15px; - -} - - -.row:after { - -content: ""; - -display: table; - -clear: both; - -} - - -@media screen and (max-width:600px) { - -.column-1 { - -width: 100%; - -} - -} - - -#input-data-from-user-class1{ - -visibility: hidden; - -} - - -#input-data-from-user-class2{ - -visibility: hidden; - -} \ No newline at end of file diff --git a/SRIP/Codes/exp3.html b/SRIP/Codes/exp3.html deleted file mode 100644 index bc64ddf8..00000000 --- a/SRIP/Codes/exp3.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - Pattern Recognition: Experiment 3- Perceptron - - - - - - - - - - - - - -
-
- -
- -
- -
-
- - - -
- -
-

Learning Parameter

- -
- - -
-

Add Data

-
- - - -
-
- -
-

Steps

-
- - - - -
-
- -
- - - -
-
-

Status

-
-
-
- -
-

Value of Weights

-

[]

-
-
- - -
-
-

- X Value- Class 1: - - -

-

- Y Value- Class 1: - - - -

-
-
-

- X Value- Class 2: - - -

-

- Y Value- Class 2: - - -

-
-
- - - - - - - \ No newline at end of file diff --git a/SRIP/Codes/exp3.js b/SRIP/Codes/exp3.js deleted file mode 100644 index ab9484fa..00000000 --- a/SRIP/Codes/exp3.js +++ /dev/null @@ -1,292 +0,0 @@ -//var xaxis = [-1.0 ,-0.75, -0.50, -0.25, 0.0, 0.25, 0.50, 0.75, 1.0]; -var finaldata = []; //dataset for Perceptron -var chart1data = []; -var chart2data = []; -var data1 = []; //for class 1 -var count1 = parseInt("0", 10); //count of all points of class 1 -var data2 = []; //for class 2 -var count2 = parseInt("0", 10); //count of all points of class 2 -var learningParameter; -var dataArray = []; -var q1 = parseInt("0", 10); -var q2 = parseInt("0", 10); -var weights = [0, 0]; -var bias = parseFloat("1"); -var c = parseInt("0", 10); -var d = parseInt("0", 10); -var activation = parseFloat("0"); -var k = parseFloat("0.05"); -var nEpoch = parseInt("5", 10); - -//Initializing the graph -function generateData() { - var data = []; - data.push({ - x: "0", - y: "0" - }); - return data; -} - - -//Manually adding data points for class 1 -function addDataPoints1x() { - var xValue1; - xValue1 = Number(document.getElementById("xValue1").value); - data1[q1] = xValue1; - chart1data.push({ - x: xValue1 - }); - q1++; - count1++; //Ctrl+Shift+J - return data1; //seeing the output in console window -} - - -function addDataPoints1y() { - var yValue1; - yValue1 = Number(document.getElementById("yValue1").value); - data1[q1] = yValue1; - chart1data.push({ - y: yValue1 - }); - q1++; - count1++; - return data1; -} - - -//Manually adding data points for class 2 -function addDataPoints2x() { - var xValue2; - xValue2 = Number(document.getElementById("xValue2").value); - data2[q2] = xValue2; - chart2data.push({ - x: xValue2 - }); - q2++; - count2++; - return data2; //seeing the output in console window -} - - -function addDataPoints2y() { - var yValue2; - yValue2 = Number(document.getElementById("yValue2").value); - data2[q2] = yValue2; - chart2data.push({ - y: yValue2 - }); - q2++; - count2++; - return data2; -} - -//Graph 1 creation -var myChart1 = { - type: "scatter", - data:{ - datasets: [{ - label: "Class 1", - backgroundColor: window.chartColors.red, - borderColor: window.chartColors.red, - data: generateData() - }, { - label: "Class 2", - backgroundColor: window.chartColors.blue, - borderColor: window.chartColors.blue, - data: generateData() - }] - } -}; - - -window.onload = function(){ - var ctx = document.getElementById("graph-1"); - window.myScatter = new Chart(ctx, myChart1); -}; - -/*document.getElementById('add-Data-Point').addEventListener('click', function() { - myChart1.data.datasets.forEach(function(dataset) { - dataset.data.push(data1); - }); - window.myScatter.update(); -});*/ - - -//after clicking Add Class 1 button, Add Data Point button is made visible -function addClass1(){ - document.getElementById("input-data-from-user-class1").style.visibility="visible"; -} - - -//after clicking Add Class 2 button, Add Data Point button is made visible -function addClass2(){ - document.getElementById("input-data-from-user-class2").style.visibility="visible"; -} - - -/*Creating Graph 2*/ -var ctx = document.getElementById("graph-2"); -var myChart2 = new Chart(ctx, { - }); - - - - -function plotGraph(){ - var ptx = document.getElementById("graph-2"); - window.myLine = new Chart(ptx, { - type: "scatter", - data: { - datasets: [{ - label: "Perceptron Line", - borderColor: window.chartColors.green, - data: [{ - x: (-bias/weights[0]), - y: 0 - },{ - x: 0, - y: (-bias/weights[1]) - }] - },{ - label: "Class 1", - backgroundColor: window.chartColors.red, - borderColor: window.chartColors.red, - data: chart1data - },{ - label: "Class 2", - backgroundColor: window.chartColors.blue, - borderColor: window.chartColors.blue, - data: chart2data - }]}, - options: { - responsive: true - } - }); -} - - - //Perceptron function -function predict(c, weights){ - for(d = 0; d < 2; d++){ - activation = activation + (weights[d] * dataArray[c][d]) + bias; - } - if(activation >= 0.0){ - return 1.0; - } - else{ - return 0.0; - } - -} - - -function perceptronTrainWeights(dataArray, learningParameter){ - var j = 0; - var sumError = 0; - var error = 1; - var prediction = 0; - for(var epoch=0; epoch 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); - g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); - b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); - - var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); - var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); - var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); - - return [x * 100, y *100, z * 100]; -} - -function rgb2lab(rgb) { - var xyz = rgb2xyz(rgb), - x = xyz[0], - y = xyz[1], - z = xyz[2], - l, a, b; - - x /= 95.047; - y /= 100; - z /= 108.883; - - x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); - - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); - - return [l, a, b]; -} - -function rgb2lch(args) { - return lab2lch(rgb2lab(args)); -} - -function hsl2rgb(hsl) { - var h = hsl[0] / 360, - s = hsl[1] / 100, - l = hsl[2] / 100, - t1, t2, t3, rgb, val; - - if (s == 0) { - val = l * 255; - return [val, val, val]; - } - - if (l < 0.5) - t2 = l * (1 + s); - else - t2 = l + s - l * s; - t1 = 2 * l - t2; - - rgb = [0, 0, 0]; - for (var i = 0; i < 3; i++) { - t3 = h + 1 / 3 * - (i - 1); - t3 < 0 && t3++; - t3 > 1 && t3--; - - if (6 * t3 < 1) - val = t1 + (t2 - t1) * 6 * t3; - else if (2 * t3 < 1) - val = t2; - else if (3 * t3 < 2) - val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; - else - val = t1; - - rgb[i] = val * 255; - } - - return rgb; -} - -function hsl2hsv(hsl) { - var h = hsl[0], - s = hsl[1] / 100, - l = hsl[2] / 100, - sv, v; - - if(l === 0) { - // no need to do calc on black - // also avoids divide by 0 error - return [0, 0, 0]; - } - - l *= 2; - s *= (l <= 1) ? l : 2 - l; - v = (l + s) / 2; - sv = (2 * s) / (l + s); - return [h, sv * 100, v * 100]; -} - -function hsl2hwb(args) { - return rgb2hwb(hsl2rgb(args)); -} - -function hsl2cmyk(args) { - return rgb2cmyk(hsl2rgb(args)); -} - -function hsl2keyword(args) { - return rgb2keyword(hsl2rgb(args)); -} - - -function hsv2rgb(hsv) { - var h = hsv[0] / 60, - s = hsv[1] / 100, - v = hsv[2] / 100, - hi = Math.floor(h) % 6; - - var f = h - Math.floor(h), - p = 255 * v * (1 - s), - q = 255 * v * (1 - (s * f)), - t = 255 * v * (1 - (s * (1 - f))), - v = 255 * v; - - switch(hi) { - case 0: - return [v, t, p]; - case 1: - return [q, v, p]; - case 2: - return [p, v, t]; - case 3: - return [p, q, v]; - case 4: - return [t, p, v]; - case 5: - return [v, p, q]; - } -} - -function hsv2hsl(hsv) { - var h = hsv[0], - s = hsv[1] / 100, - v = hsv[2] / 100, - sl, l; - - l = (2 - s) * v; - sl = s * v; - sl /= (l <= 1) ? l : 2 - l; - sl = sl || 0; - l /= 2; - return [h, sl * 100, l * 100]; -} - -function hsv2hwb(args) { - return rgb2hwb(hsv2rgb(args)) -} - -function hsv2cmyk(args) { - return rgb2cmyk(hsv2rgb(args)); -} - -function hsv2keyword(args) { - return rgb2keyword(hsv2rgb(args)); -} - -// http://dev.w3.org/csswg/css-color/#hwb-to-rgb -function hwb2rgb(hwb) { - var h = hwb[0] / 360, - wh = hwb[1] / 100, - bl = hwb[2] / 100, - ratio = wh + bl, - i, v, f, n; - - // wh + bl cant be > 1 - if (ratio > 1) { - wh /= ratio; - bl /= ratio; - } - - i = Math.floor(6 * h); - v = 1 - bl; - f = 6 * h - i; - if ((i & 0x01) != 0) { - f = 1 - f; - } - n = wh + f * (v - wh); // linear interpolation - - switch (i) { - default: - case 6: - case 0: r = v; g = n; b = wh; break; - case 1: r = n; g = v; b = wh; break; - case 2: r = wh; g = v; b = n; break; - case 3: r = wh; g = n; b = v; break; - case 4: r = n; g = wh; b = v; break; - case 5: r = v; g = wh; b = n; break; - } - - return [r * 255, g * 255, b * 255]; -} - -function hwb2hsl(args) { - return rgb2hsl(hwb2rgb(args)); -} - -function hwb2hsv(args) { - return rgb2hsv(hwb2rgb(args)); -} - -function hwb2cmyk(args) { - return rgb2cmyk(hwb2rgb(args)); -} - -function hwb2keyword(args) { - return rgb2keyword(hwb2rgb(args)); -} - -function cmyk2rgb(cmyk) { - var c = cmyk[0] / 100, - m = cmyk[1] / 100, - y = cmyk[2] / 100, - k = cmyk[3] / 100, - r, g, b; - - r = 1 - Math.min(1, c * (1 - k) + k); - g = 1 - Math.min(1, m * (1 - k) + k); - b = 1 - Math.min(1, y * (1 - k) + k); - return [r * 255, g * 255, b * 255]; -} - -function cmyk2hsl(args) { - return rgb2hsl(cmyk2rgb(args)); -} - -function cmyk2hsv(args) { - return rgb2hsv(cmyk2rgb(args)); -} - -function cmyk2hwb(args) { - return rgb2hwb(cmyk2rgb(args)); -} - -function cmyk2keyword(args) { - return rgb2keyword(cmyk2rgb(args)); -} - - -function xyz2rgb(xyz) { - var x = xyz[0] / 100, - y = xyz[1] / 100, - z = xyz[2] / 100, - r, g, b; - - r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); - g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); - b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); - - // assume sRGB - r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) - : r = (r * 12.92); - - g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) - : g = (g * 12.92); - - b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) - : b = (b * 12.92); - - r = Math.min(Math.max(0, r), 1); - g = Math.min(Math.max(0, g), 1); - b = Math.min(Math.max(0, b), 1); - - return [r * 255, g * 255, b * 255]; -} - -function xyz2lab(xyz) { - var x = xyz[0], - y = xyz[1], - z = xyz[2], - l, a, b; - - x /= 95.047; - y /= 100; - z /= 108.883; - - x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); - - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); - - return [l, a, b]; -} - -function xyz2lch(args) { - return lab2lch(xyz2lab(args)); -} - -function lab2xyz(lab) { - var l = lab[0], - a = lab[1], - b = lab[2], - x, y, z, y2; - - if (l <= 8) { - y = (l * 100) / 903.3; - y2 = (7.787 * (y / 100)) + (16 / 116); - } else { - y = 100 * Math.pow((l + 16) / 116, 3); - y2 = Math.pow(y / 100, 1/3); - } - - x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); - - z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); - - return [x, y, z]; -} - -function lab2lch(lab) { - var l = lab[0], - a = lab[1], - b = lab[2], - hr, h, c; - - hr = Math.atan2(b, a); - h = hr * 360 / 2 / Math.PI; - if (h < 0) { - h += 360; - } - c = Math.sqrt(a * a + b * b); - return [l, c, h]; -} - -function lab2rgb(args) { - return xyz2rgb(lab2xyz(args)); -} - -function lch2lab(lch) { - var l = lch[0], - c = lch[1], - h = lch[2], - a, b, hr; - - hr = h / 360 * 2 * Math.PI; - a = c * Math.cos(hr); - b = c * Math.sin(hr); - return [l, a, b]; -} - -function lch2xyz(args) { - return lab2xyz(lch2lab(args)); -} - -function lch2rgb(args) { - return lab2rgb(lch2lab(args)); -} - -function keyword2rgb(keyword) { - return cssKeywords[keyword]; -} - -function keyword2hsl(args) { - return rgb2hsl(keyword2rgb(args)); -} - -function keyword2hsv(args) { - return rgb2hsv(keyword2rgb(args)); -} - -function keyword2hwb(args) { - return rgb2hwb(keyword2rgb(args)); -} - -function keyword2cmyk(args) { - return rgb2cmyk(keyword2rgb(args)); -} - -function keyword2lab(args) { - return rgb2lab(keyword2rgb(args)); -} - -function keyword2xyz(args) { - return rgb2xyz(keyword2rgb(args)); -} - -var cssKeywords = { - aliceblue: [240,248,255], - antiquewhite: [250,235,215], - aqua: [0,255,255], - aquamarine: [127,255,212], - azure: [240,255,255], - beige: [245,245,220], - bisque: [255,228,196], - black: [0,0,0], - blanchedalmond: [255,235,205], - blue: [0,0,255], - blueviolet: [138,43,226], - brown: [165,42,42], - burlywood: [222,184,135], - cadetblue: [95,158,160], - chartreuse: [127,255,0], - chocolate: [210,105,30], - coral: [255,127,80], - cornflowerblue: [100,149,237], - cornsilk: [255,248,220], - crimson: [220,20,60], - cyan: [0,255,255], - darkblue: [0,0,139], - darkcyan: [0,139,139], - darkgoldenrod: [184,134,11], - darkgray: [169,169,169], - darkgreen: [0,100,0], - darkgrey: [169,169,169], - darkkhaki: [189,183,107], - darkmagenta: [139,0,139], - darkolivegreen: [85,107,47], - darkorange: [255,140,0], - darkorchid: [153,50,204], - darkred: [139,0,0], - darksalmon: [233,150,122], - darkseagreen: [143,188,143], - darkslateblue: [72,61,139], - darkslategray: [47,79,79], - darkslategrey: [47,79,79], - darkturquoise: [0,206,209], - darkviolet: [148,0,211], - deeppink: [255,20,147], - deepskyblue: [0,191,255], - dimgray: [105,105,105], - dimgrey: [105,105,105], - dodgerblue: [30,144,255], - firebrick: [178,34,34], - floralwhite: [255,250,240], - forestgreen: [34,139,34], - fuchsia: [255,0,255], - gainsboro: [220,220,220], - ghostwhite: [248,248,255], - gold: [255,215,0], - goldenrod: [218,165,32], - gray: [128,128,128], - green: [0,128,0], - greenyellow: [173,255,47], - grey: [128,128,128], - honeydew: [240,255,240], - hotpink: [255,105,180], - indianred: [205,92,92], - indigo: [75,0,130], - ivory: [255,255,240], - khaki: [240,230,140], - lavender: [230,230,250], - lavenderblush: [255,240,245], - lawngreen: [124,252,0], - lemonchiffon: [255,250,205], - lightblue: [173,216,230], - lightcoral: [240,128,128], - lightcyan: [224,255,255], - lightgoldenrodyellow: [250,250,210], - lightgray: [211,211,211], - lightgreen: [144,238,144], - lightgrey: [211,211,211], - lightpink: [255,182,193], - lightsalmon: [255,160,122], - lightseagreen: [32,178,170], - lightskyblue: [135,206,250], - lightslategray: [119,136,153], - lightslategrey: [119,136,153], - lightsteelblue: [176,196,222], - lightyellow: [255,255,224], - lime: [0,255,0], - limegreen: [50,205,50], - linen: [250,240,230], - magenta: [255,0,255], - maroon: [128,0,0], - mediumaquamarine: [102,205,170], - mediumblue: [0,0,205], - mediumorchid: [186,85,211], - mediumpurple: [147,112,219], - mediumseagreen: [60,179,113], - mediumslateblue: [123,104,238], - mediumspringgreen: [0,250,154], - mediumturquoise: [72,209,204], - mediumvioletred: [199,21,133], - midnightblue: [25,25,112], - mintcream: [245,255,250], - mistyrose: [255,228,225], - moccasin: [255,228,181], - navajowhite: [255,222,173], - navy: [0,0,128], - oldlace: [253,245,230], - olive: [128,128,0], - olivedrab: [107,142,35], - orange: [255,165,0], - orangered: [255,69,0], - orchid: [218,112,214], - palegoldenrod: [238,232,170], - palegreen: [152,251,152], - paleturquoise: [175,238,238], - palevioletred: [219,112,147], - papayawhip: [255,239,213], - peachpuff: [255,218,185], - peru: [205,133,63], - pink: [255,192,203], - plum: [221,160,221], - powderblue: [176,224,230], - purple: [128,0,128], - rebeccapurple: [102, 51, 153], - red: [255,0,0], - rosybrown: [188,143,143], - royalblue: [65,105,225], - saddlebrown: [139,69,19], - salmon: [250,128,114], - sandybrown: [244,164,96], - seagreen: [46,139,87], - seashell: [255,245,238], - sienna: [160,82,45], - silver: [192,192,192], - skyblue: [135,206,235], - slateblue: [106,90,205], - slategray: [112,128,144], - slategrey: [112,128,144], - snow: [255,250,250], - springgreen: [0,255,127], - steelblue: [70,130,180], - tan: [210,180,140], - teal: [0,128,128], - thistle: [216,191,216], - tomato: [255,99,71], - turquoise: [64,224,208], - violet: [238,130,238], - wheat: [245,222,179], - white: [255,255,255], - whitesmoke: [245,245,245], - yellow: [255,255,0], - yellowgreen: [154,205,50] -}; - -var reverseKeywords = {}; -for (var key in cssKeywords) { - reverseKeywords[JSON.stringify(cssKeywords[key])] = key; -} - -var convert = function() { - return new Converter(); -}; - -for (var func in conversions) { - // export Raw versions - convert[func + "Raw"] = (function(func) { - // accept array or plain args - return function(arg) { - if (typeof arg == "number") - arg = Array.prototype.slice.call(arguments); - return conversions[func](arg); - } - })(func); - - var pair = /(\w+)2(\w+)/.exec(func), - from = pair[1], - to = pair[2]; - - // export rgb2hsl and ["rgb"]["hsl"] - convert[from] = convert[from] || {}; - - convert[from][to] = convert[func] = (function(func) { - return function(arg) { - if (typeof arg == "number") - arg = Array.prototype.slice.call(arguments); - - var val = conversions[func](arg); - if (typeof val == "string" || val === undefined) - return val; // keyword - - for (var i = 0; i < val.length; i++) - val[i] = Math.round(val[i]); - return val; - } - })(func); -} - - -/* Converter does lazy conversion and caching */ -var Converter = function() { - this.convs = {}; -}; - -/* Either get the values for a space or - set the values for a space, depending on args */ -Converter.prototype.routeSpace = function(space, args) { - var values = args[0]; - if (values === undefined) { - // color.rgb() - return this.getValues(space); - } - // color.rgb(10, 10, 10) - if (typeof values == "number") { - values = Array.prototype.slice.call(args); - } - - return this.setValues(space, values); -}; - -/* Set the values for a space, invalidating cache */ -Converter.prototype.setValues = function(space, values) { - this.space = space; - this.convs = {}; - this.convs[space] = values; - return this; -}; - -/* Get the values for a space. If there's already - a conversion for the space, fetch it, otherwise - compute it */ -Converter.prototype.getValues = function(space) { - var vals = this.convs[space]; - if (!vals) { - var fspace = this.space, - from = this.convs[fspace]; - vals = convert[fspace][space](from); - - this.convs[space] = vals; - } - return vals; -}; - -["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { - Converter.prototype[space] = function(vals) { - return this.routeSpace(space, arguments); - }; -}); - -var colorConvert = convert; - -var colorName = { - "aliceblue": [240, 248, 255], - "antiquewhite": [250, 235, 215], - "aqua": [0, 255, 255], - "aquamarine": [127, 255, 212], - "azure": [240, 255, 255], - "beige": [245, 245, 220], - "bisque": [255, 228, 196], - "black": [0, 0, 0], - "blanchedalmond": [255, 235, 205], - "blue": [0, 0, 255], - "blueviolet": [138, 43, 226], - "brown": [165, 42, 42], - "burlywood": [222, 184, 135], - "cadetblue": [95, 158, 160], - "chartreuse": [127, 255, 0], - "chocolate": [210, 105, 30], - "coral": [255, 127, 80], - "cornflowerblue": [100, 149, 237], - "cornsilk": [255, 248, 220], - "crimson": [220, 20, 60], - "cyan": [0, 255, 255], - "darkblue": [0, 0, 139], - "darkcyan": [0, 139, 139], - "darkgoldenrod": [184, 134, 11], - "darkgray": [169, 169, 169], - "darkgreen": [0, 100, 0], - "darkgrey": [169, 169, 169], - "darkkhaki": [189, 183, 107], - "darkmagenta": [139, 0, 139], - "darkolivegreen": [85, 107, 47], - "darkorange": [255, 140, 0], - "darkorchid": [153, 50, 204], - "darkred": [139, 0, 0], - "darksalmon": [233, 150, 122], - "darkseagreen": [143, 188, 143], - "darkslateblue": [72, 61, 139], - "darkslategray": [47, 79, 79], - "darkslategrey": [47, 79, 79], - "darkturquoise": [0, 206, 209], - "darkviolet": [148, 0, 211], - "deeppink": [255, 20, 147], - "deepskyblue": [0, 191, 255], - "dimgray": [105, 105, 105], - "dimgrey": [105, 105, 105], - "dodgerblue": [30, 144, 255], - "firebrick": [178, 34, 34], - "floralwhite": [255, 250, 240], - "forestgreen": [34, 139, 34], - "fuchsia": [255, 0, 255], - "gainsboro": [220, 220, 220], - "ghostwhite": [248, 248, 255], - "gold": [255, 215, 0], - "goldenrod": [218, 165, 32], - "gray": [128, 128, 128], - "green": [0, 128, 0], - "greenyellow": [173, 255, 47], - "grey": [128, 128, 128], - "honeydew": [240, 255, 240], - "hotpink": [255, 105, 180], - "indianred": [205, 92, 92], - "indigo": [75, 0, 130], - "ivory": [255, 255, 240], - "khaki": [240, 230, 140], - "lavender": [230, 230, 250], - "lavenderblush": [255, 240, 245], - "lawngreen": [124, 252, 0], - "lemonchiffon": [255, 250, 205], - "lightblue": [173, 216, 230], - "lightcoral": [240, 128, 128], - "lightcyan": [224, 255, 255], - "lightgoldenrodyellow": [250, 250, 210], - "lightgray": [211, 211, 211], - "lightgreen": [144, 238, 144], - "lightgrey": [211, 211, 211], - "lightpink": [255, 182, 193], - "lightsalmon": [255, 160, 122], - "lightseagreen": [32, 178, 170], - "lightskyblue": [135, 206, 250], - "lightslategray": [119, 136, 153], - "lightslategrey": [119, 136, 153], - "lightsteelblue": [176, 196, 222], - "lightyellow": [255, 255, 224], - "lime": [0, 255, 0], - "limegreen": [50, 205, 50], - "linen": [250, 240, 230], - "magenta": [255, 0, 255], - "maroon": [128, 0, 0], - "mediumaquamarine": [102, 205, 170], - "mediumblue": [0, 0, 205], - "mediumorchid": [186, 85, 211], - "mediumpurple": [147, 112, 219], - "mediumseagreen": [60, 179, 113], - "mediumslateblue": [123, 104, 238], - "mediumspringgreen": [0, 250, 154], - "mediumturquoise": [72, 209, 204], - "mediumvioletred": [199, 21, 133], - "midnightblue": [25, 25, 112], - "mintcream": [245, 255, 250], - "mistyrose": [255, 228, 225], - "moccasin": [255, 228, 181], - "navajowhite": [255, 222, 173], - "navy": [0, 0, 128], - "oldlace": [253, 245, 230], - "olive": [128, 128, 0], - "olivedrab": [107, 142, 35], - "orange": [255, 165, 0], - "orangered": [255, 69, 0], - "orchid": [218, 112, 214], - "palegoldenrod": [238, 232, 170], - "palegreen": [152, 251, 152], - "paleturquoise": [175, 238, 238], - "palevioletred": [219, 112, 147], - "papayawhip": [255, 239, 213], - "peachpuff": [255, 218, 185], - "peru": [205, 133, 63], - "pink": [255, 192, 203], - "plum": [221, 160, 221], - "powderblue": [176, 224, 230], - "purple": [128, 0, 128], - "rebeccapurple": [102, 51, 153], - "red": [255, 0, 0], - "rosybrown": [188, 143, 143], - "royalblue": [65, 105, 225], - "saddlebrown": [139, 69, 19], - "salmon": [250, 128, 114], - "sandybrown": [244, 164, 96], - "seagreen": [46, 139, 87], - "seashell": [255, 245, 238], - "sienna": [160, 82, 45], - "silver": [192, 192, 192], - "skyblue": [135, 206, 235], - "slateblue": [106, 90, 205], - "slategray": [112, 128, 144], - "slategrey": [112, 128, 144], - "snow": [255, 250, 250], - "springgreen": [0, 255, 127], - "steelblue": [70, 130, 180], - "tan": [210, 180, 140], - "teal": [0, 128, 128], - "thistle": [216, 191, 216], - "tomato": [255, 99, 71], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "wheat": [245, 222, 179], - "white": [255, 255, 255], - "whitesmoke": [245, 245, 245], - "yellow": [255, 255, 0], - "yellowgreen": [154, 205, 50] -}; - -/* MIT license */ - - -var colorString = { - getRgba: getRgba, - getHsla: getHsla, - getRgb: getRgb, - getHsl: getHsl, - getHwb: getHwb, - getAlpha: getAlpha, - - hexString: hexString, - rgbString: rgbString, - rgbaString: rgbaString, - percentString: percentString, - percentaString: percentaString, - hslString: hslString, - hslaString: hslaString, - hwbString: hwbString, - keyword: keyword -}; - -function getRgba(string) { - if (!string) { - return; - } - var abbr = /^#([a-fA-F0-9]{3,4})$/i, - hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i, - rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, - per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, - keyword = /(\w+)/; - - var rgb = [0, 0, 0], - a = 1, - match = string.match(abbr), - hexAlpha = ""; - if (match) { - match = match[1]; - hexAlpha = match[3]; - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match[i] + match[i], 16); - } - if (hexAlpha) { - a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100; - } - } - else if (match = string.match(hex)) { - hexAlpha = match[2]; - match = match[1]; - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); - } - if (hexAlpha) { - a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100; - } - } - else if (match = string.match(rgba)) { - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match[i + 1]); - } - a = parseFloat(match[4]); - } - else if (match = string.match(per)) { - for (var i = 0; i < rgb.length; i++) { - rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); - } - a = parseFloat(match[4]); - } - else if (match = string.match(keyword)) { - if (match[1] == "transparent") { - return [0, 0, 0, 0]; - } - rgb = colorName[match[1]]; - if (!rgb) { - return; - } - } - - for (var i = 0; i < rgb.length; i++) { - rgb[i] = scale(rgb[i], 0, 255); - } - if (!a && a != 0) { - a = 1; - } - else { - a = scale(a, 0, 1); - } - rgb[3] = a; - return rgb; -} - -function getHsla(string) { - if (!string) { - return; - } - var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; - var match = string.match(hsl); - if (match) { - var alpha = parseFloat(match[4]); - var h = scale(parseInt(match[1]), 0, 360), - s = scale(parseFloat(match[2]), 0, 100), - l = scale(parseFloat(match[3]), 0, 100), - a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); - return [h, s, l, a]; - } -} - -function getHwb(string) { - if (!string) { - return; - } - var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; - var match = string.match(hwb); - if (match) { - var alpha = parseFloat(match[4]); - var h = scale(parseInt(match[1]), 0, 360), - w = scale(parseFloat(match[2]), 0, 100), - b = scale(parseFloat(match[3]), 0, 100), - a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); - return [h, w, b, a]; - } -} - -function getRgb(string) { - var rgba = getRgba(string); - return rgba && rgba.slice(0, 3); -} - -function getHsl(string) { - var hsla = getHsla(string); - return hsla && hsla.slice(0, 3); -} - -function getAlpha(string) { - var vals = getRgba(string); - if (vals) { - return vals[3]; - } - else if (vals = getHsla(string)) { - return vals[3]; - } - else if (vals = getHwb(string)) { - return vals[3]; - } -} - -// generators -function hexString(rgba, a) { - var a = (a !== undefined && rgba.length === 3) ? a : rgba[3]; - return "#" + hexDouble(rgba[0]) - + hexDouble(rgba[1]) - + hexDouble(rgba[2]) - + ( - (a >= 0 && a < 1) - ? hexDouble(Math.round(a * 255)) - : "" - ); -} - -function rgbString(rgba, alpha) { - if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { - return rgbaString(rgba, alpha); - } - return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; -} - -function rgbaString(rgba, alpha) { - if (alpha === undefined) { - alpha = (rgba[3] !== undefined ? rgba[3] : 1); - } - return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] - + ", " + alpha + ")"; -} - -function percentString(rgba, alpha) { - if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { - return percentaString(rgba, alpha); - } - var r = Math.round(rgba[0]/255 * 100), - g = Math.round(rgba[1]/255 * 100), - b = Math.round(rgba[2]/255 * 100); - - return "rgb(" + r + "%, " + g + "%, " + b + "%)"; -} - -function percentaString(rgba, alpha) { - var r = Math.round(rgba[0]/255 * 100), - g = Math.round(rgba[1]/255 * 100), - b = Math.round(rgba[2]/255 * 100); - return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; -} - -function hslString(hsla, alpha) { - if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { - return hslaString(hsla, alpha); - } - return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; -} - -function hslaString(hsla, alpha) { - if (alpha === undefined) { - alpha = (hsla[3] !== undefined ? hsla[3] : 1); - } - return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " - + alpha + ")"; -} - -// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax -// (hwb have alpha optional & 1 is default value) -function hwbString(hwb, alpha) { - if (alpha === undefined) { - alpha = (hwb[3] !== undefined ? hwb[3] : 1); - } - return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" - + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; -} - -function keyword(rgb) { - return reverseNames[rgb.slice(0, 3)]; -} - -// helpers -function scale(num, min, max) { - return Math.min(Math.max(min, num), max); -} - -function hexDouble(num) { - var str = num.toString(16).toUpperCase(); - return (str.length < 2) ? "0" + str : str; -} - - -//create a list of reverse color names -var reverseNames = {}; -for (var name in colorName) { - reverseNames[colorName[name]] = name; -} - -/* MIT license */ - - - -var Color = function (obj) { - if (obj instanceof Color) { - return obj; - } - if (!(this instanceof Color)) { - return new Color(obj); - } - - this.valid = false; - this.values = { - rgb: [0, 0, 0], - hsl: [0, 0, 0], - hsv: [0, 0, 0], - hwb: [0, 0, 0], - cmyk: [0, 0, 0, 0], - alpha: 1 - }; - - // parse Color() argument - var vals; - if (typeof obj === 'string') { - vals = colorString.getRgba(obj); - if (vals) { - this.setValues('rgb', vals); - } else if (vals = colorString.getHsla(obj)) { - this.setValues('hsl', vals); - } else if (vals = colorString.getHwb(obj)) { - this.setValues('hwb', vals); - } - } else if (typeof obj === 'object') { - vals = obj; - if (vals.r !== undefined || vals.red !== undefined) { - this.setValues('rgb', vals); - } else if (vals.l !== undefined || vals.lightness !== undefined) { - this.setValues('hsl', vals); - } else if (vals.v !== undefined || vals.value !== undefined) { - this.setValues('hsv', vals); - } else if (vals.w !== undefined || vals.whiteness !== undefined) { - this.setValues('hwb', vals); - } else if (vals.c !== undefined || vals.cyan !== undefined) { - this.setValues('cmyk', vals); - } - } -}; - -Color.prototype = { - isValid: function () { - return this.valid; - }, - rgb: function () { - return this.setSpace('rgb', arguments); - }, - hsl: function () { - return this.setSpace('hsl', arguments); - }, - hsv: function () { - return this.setSpace('hsv', arguments); - }, - hwb: function () { - return this.setSpace('hwb', arguments); - }, - cmyk: function () { - return this.setSpace('cmyk', arguments); - }, - - rgbArray: function () { - return this.values.rgb; - }, - hslArray: function () { - return this.values.hsl; - }, - hsvArray: function () { - return this.values.hsv; - }, - hwbArray: function () { - var values = this.values; - if (values.alpha !== 1) { - return values.hwb.concat([values.alpha]); - } - return values.hwb; - }, - cmykArray: function () { - return this.values.cmyk; - }, - rgbaArray: function () { - var values = this.values; - return values.rgb.concat([values.alpha]); - }, - hslaArray: function () { - var values = this.values; - return values.hsl.concat([values.alpha]); - }, - alpha: function (val) { - if (val === undefined) { - return this.values.alpha; - } - this.setValues('alpha', val); - return this; - }, - - red: function (val) { - return this.setChannel('rgb', 0, val); - }, - green: function (val) { - return this.setChannel('rgb', 1, val); - }, - blue: function (val) { - return this.setChannel('rgb', 2, val); - }, - hue: function (val) { - if (val) { - val %= 360; - val = val < 0 ? 360 + val : val; - } - return this.setChannel('hsl', 0, val); - }, - saturation: function (val) { - return this.setChannel('hsl', 1, val); - }, - lightness: function (val) { - return this.setChannel('hsl', 2, val); - }, - saturationv: function (val) { - return this.setChannel('hsv', 1, val); - }, - whiteness: function (val) { - return this.setChannel('hwb', 1, val); - }, - blackness: function (val) { - return this.setChannel('hwb', 2, val); - }, - value: function (val) { - return this.setChannel('hsv', 2, val); - }, - cyan: function (val) { - return this.setChannel('cmyk', 0, val); - }, - magenta: function (val) { - return this.setChannel('cmyk', 1, val); - }, - yellow: function (val) { - return this.setChannel('cmyk', 2, val); - }, - black: function (val) { - return this.setChannel('cmyk', 3, val); - }, - - hexString: function () { - return colorString.hexString(this.values.rgb); - }, - rgbString: function () { - return colorString.rgbString(this.values.rgb, this.values.alpha); - }, - rgbaString: function () { - return colorString.rgbaString(this.values.rgb, this.values.alpha); - }, - percentString: function () { - return colorString.percentString(this.values.rgb, this.values.alpha); - }, - hslString: function () { - return colorString.hslString(this.values.hsl, this.values.alpha); - }, - hslaString: function () { - return colorString.hslaString(this.values.hsl, this.values.alpha); - }, - hwbString: function () { - return colorString.hwbString(this.values.hwb, this.values.alpha); - }, - keyword: function () { - return colorString.keyword(this.values.rgb, this.values.alpha); - }, - - rgbNumber: function () { - var rgb = this.values.rgb; - return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; - }, - - luminosity: function () { - // http://www.w3.org/TR/WCAG20/#relativeluminancedef - var rgb = this.values.rgb; - var lum = []; - for (var i = 0; i < rgb.length; i++) { - var chan = rgb[i] / 255; - lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); - } - return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; - }, - - contrast: function (color2) { - // http://www.w3.org/TR/WCAG20/#contrast-ratiodef - var lum1 = this.luminosity(); - var lum2 = color2.luminosity(); - if (lum1 > lum2) { - return (lum1 + 0.05) / (lum2 + 0.05); - } - return (lum2 + 0.05) / (lum1 + 0.05); - }, - - level: function (color2) { - var contrastRatio = this.contrast(color2); - if (contrastRatio >= 7.1) { - return 'AAA'; - } - - return (contrastRatio >= 4.5) ? 'AA' : ''; - }, - - dark: function () { - // YIQ equation from http://24ways.org/2010/calculating-color-contrast - var rgb = this.values.rgb; - var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; - return yiq < 128; - }, - - light: function () { - return !this.dark(); - }, - - negate: function () { - var rgb = []; - for (var i = 0; i < 3; i++) { - rgb[i] = 255 - this.values.rgb[i]; - } - this.setValues('rgb', rgb); - return this; - }, - - lighten: function (ratio) { - var hsl = this.values.hsl; - hsl[2] += hsl[2] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - darken: function (ratio) { - var hsl = this.values.hsl; - hsl[2] -= hsl[2] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - saturate: function (ratio) { - var hsl = this.values.hsl; - hsl[1] += hsl[1] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - desaturate: function (ratio) { - var hsl = this.values.hsl; - hsl[1] -= hsl[1] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - whiten: function (ratio) { - var hwb = this.values.hwb; - hwb[1] += hwb[1] * ratio; - this.setValues('hwb', hwb); - return this; - }, - - blacken: function (ratio) { - var hwb = this.values.hwb; - hwb[2] += hwb[2] * ratio; - this.setValues('hwb', hwb); - return this; - }, - - greyscale: function () { - var rgb = this.values.rgb; - // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale - var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; - this.setValues('rgb', [val, val, val]); - return this; - }, - - clearer: function (ratio) { - var alpha = this.values.alpha; - this.setValues('alpha', alpha - (alpha * ratio)); - return this; - }, - - opaquer: function (ratio) { - var alpha = this.values.alpha; - this.setValues('alpha', alpha + (alpha * ratio)); - return this; - }, - - rotate: function (degrees) { - var hsl = this.values.hsl; - var hue = (hsl[0] + degrees) % 360; - hsl[0] = hue < 0 ? 360 + hue : hue; - this.setValues('hsl', hsl); - return this; - }, - - /** - * Ported from sass implementation in C - * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 - */ - mix: function (mixinColor, weight) { - var color1 = this; - var color2 = mixinColor; - var p = weight === undefined ? 0.5 : weight; - - var w = 2 * p - 1; - var a = color1.alpha() - color2.alpha(); - - var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; - var w2 = 1 - w1; - - return this - .rgb( - w1 * color1.red() + w2 * color2.red(), - w1 * color1.green() + w2 * color2.green(), - w1 * color1.blue() + w2 * color2.blue() - ) - .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); - }, - - toJSON: function () { - return this.rgb(); - }, - - clone: function () { - // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, - // making the final build way to big to embed in Chart.js. So let's do it manually, - // assuming that values to clone are 1 dimension arrays containing only numbers, - // except 'alpha' which is a number. - var result = new Color(); - var source = this.values; - var target = result.values; - var value, type; - - for (var prop in source) { - if (source.hasOwnProperty(prop)) { - value = source[prop]; - type = ({}).toString.call(value); - if (type === '[object Array]') { - target[prop] = value.slice(0); - } else if (type === '[object Number]') { - target[prop] = value; - } else { - console.error('unexpected color value:', value); - } - } - } - - return result; - } -}; - -Color.prototype.spaces = { - rgb: ['red', 'green', 'blue'], - hsl: ['hue', 'saturation', 'lightness'], - hsv: ['hue', 'saturation', 'value'], - hwb: ['hue', 'whiteness', 'blackness'], - cmyk: ['cyan', 'magenta', 'yellow', 'black'] -}; - -Color.prototype.maxes = { - rgb: [255, 255, 255], - hsl: [360, 100, 100], - hsv: [360, 100, 100], - hwb: [360, 100, 100], - cmyk: [100, 100, 100, 100] -}; - -Color.prototype.getValues = function (space) { - var values = this.values; - var vals = {}; - - for (var i = 0; i < space.length; i++) { - vals[space.charAt(i)] = values[space][i]; - } - - if (values.alpha !== 1) { - vals.a = values.alpha; - } - - // {r: 255, g: 255, b: 255, a: 0.4} - return vals; -}; - -Color.prototype.setValues = function (space, vals) { - var values = this.values; - var spaces = this.spaces; - var maxes = this.maxes; - var alpha = 1; - var i; - - this.valid = true; - - if (space === 'alpha') { - alpha = vals; - } else if (vals.length) { - // [10, 10, 10] - values[space] = vals.slice(0, space.length); - alpha = vals[space.length]; - } else if (vals[space.charAt(0)] !== undefined) { - // {r: 10, g: 10, b: 10} - for (i = 0; i < space.length; i++) { - values[space][i] = vals[space.charAt(i)]; - } - - alpha = vals.a; - } else if (vals[spaces[space][0]] !== undefined) { - // {red: 10, green: 10, blue: 10} - var chans = spaces[space]; - - for (i = 0; i < space.length; i++) { - values[space][i] = vals[chans[i]]; - } - - alpha = vals.alpha; - } - - values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); - - if (space === 'alpha') { - return false; - } - - var capped; - - // cap values of the space prior converting all values - for (i = 0; i < space.length; i++) { - capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); - values[space][i] = Math.round(capped); - } - - // convert to all the other color spaces - for (var sname in spaces) { - if (sname !== space) { - values[sname] = colorConvert[space][sname](values[space]); - } - } - - return true; -}; - -Color.prototype.setSpace = function (space, args) { - var vals = args[0]; - - if (vals === undefined) { - // color.rgb() - return this.getValues(space); - } - - // color.rgb(10, 10, 10) - if (typeof vals === 'number') { - vals = Array.prototype.slice.call(args); - } - - this.setValues(space, vals); - return this; -}; - -Color.prototype.setChannel = function (space, index, val) { - var svalues = this.values[space]; - if (val === undefined) { - // color.red() - return svalues[index]; - } else if (val === svalues[index]) { - // color.red(color.red()) - return this; - } - - // color.red(100) - svalues[index] = val; - this.setValues(space, svalues); - - return this; -}; - -if (typeof window !== 'undefined') { - window.Color = Color; -} - -var chartjsColor = Color; - -/** - * @namespace Chart.helpers - */ -var helpers = { - /** - * An empty function that can be used, for example, for optional callback. - */ - noop: function() {}, - - /** - * Returns a unique id, sequentially generated from a global variable. - * @returns {number} - * @function - */ - uid: (function() { - var id = 0; - return function() { - return id++; - }; - }()), - - /** - * Returns true if `value` is neither null nor undefined, else returns false. - * @param {*} value - The value to test. - * @returns {boolean} - * @since 2.7.0 - */ - isNullOrUndef: function(value) { - return value === null || typeof value === 'undefined'; - }, - - /** - * Returns true if `value` is an array (including typed arrays), else returns false. - * @param {*} value - The value to test. - * @returns {boolean} - * @function - */ - isArray: function(value) { - if (Array.isArray && Array.isArray(value)) { - return true; - } - var type = Object.prototype.toString.call(value); - if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { - return true; - } - return false; - }, - - /** - * Returns true if `value` is an object (excluding null), else returns false. - * @param {*} value - The value to test. - * @returns {boolean} - * @since 2.7.0 - */ - isObject: function(value) { - return value !== null && Object.prototype.toString.call(value) === '[object Object]'; - }, - - /** - * Returns true if `value` is a finite number, else returns false - * @param {*} value - The value to test. - * @returns {boolean} - */ - isFinite: function(value) { - return (typeof value === 'number' || value instanceof Number) && isFinite(value); - }, - - /** - * Returns `value` if defined, else returns `defaultValue`. - * @param {*} value - The value to return if defined. - * @param {*} defaultValue - The value to return if `value` is undefined. - * @returns {*} - */ - valueOrDefault: function(value, defaultValue) { - return typeof value === 'undefined' ? defaultValue : value; - }, - - /** - * Returns value at the given `index` in array if defined, else returns `defaultValue`. - * @param {Array} value - The array to lookup for value at `index`. - * @param {number} index - The index in `value` to lookup for value. - * @param {*} defaultValue - The value to return if `value[index]` is undefined. - * @returns {*} - */ - valueAtIndexOrDefault: function(value, index, defaultValue) { - return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); - }, - - /** - * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the - * value returned by `fn`. If `fn` is not a function, this method returns undefined. - * @param {function} fn - The function to call. - * @param {Array|undefined|null} args - The arguments with which `fn` should be called. - * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. - * @returns {*} - */ - callback: function(fn, args, thisArg) { - if (fn && typeof fn.call === 'function') { - return fn.apply(thisArg, args); - } - }, - - /** - * Note(SB) for performance sake, this method should only be used when loopable type - * is unknown or in none intensive code (not called often and small loopable). Else - * it's preferable to use a regular for() loop and save extra function calls. - * @param {object|Array} loopable - The object or array to be iterated. - * @param {function} fn - The function to call for each item. - * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. - * @param {boolean} [reverse] - If true, iterates backward on the loopable. - */ - each: function(loopable, fn, thisArg, reverse) { - var i, len, keys; - if (helpers.isArray(loopable)) { - len = loopable.length; - if (reverse) { - for (i = len - 1; i >= 0; i--) { - fn.call(thisArg, loopable[i], i); - } - } else { - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[i], i); - } - } - } else if (helpers.isObject(loopable)) { - keys = Object.keys(loopable); - len = keys.length; - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[keys[i]], keys[i]); - } - } - }, - - /** - * Returns true if the `a0` and `a1` arrays have the same content, else returns false. - * @see https://stackoverflow.com/a/14853974 - * @param {Array} a0 - The array to compare - * @param {Array} a1 - The array to compare - * @returns {boolean} - */ - arrayEquals: function(a0, a1) { - var i, ilen, v0, v1; - - if (!a0 || !a1 || a0.length !== a1.length) { - return false; - } - - for (i = 0, ilen = a0.length; i < ilen; ++i) { - v0 = a0[i]; - v1 = a1[i]; - - if (v0 instanceof Array && v1 instanceof Array) { - if (!helpers.arrayEquals(v0, v1)) { - return false; - } - } else if (v0 !== v1) { - // NOTE: two different object instances will never be equal: {x:20} != {x:20} - return false; - } - } - - return true; - }, - - /** - * Returns a deep copy of `source` without keeping references on objects and arrays. - * @param {*} source - The value to clone. - * @returns {*} - */ - clone: function(source) { - if (helpers.isArray(source)) { - return source.map(helpers.clone); - } - - if (helpers.isObject(source)) { - var target = {}; - var keys = Object.keys(source); - var klen = keys.length; - var k = 0; - - for (; k < klen; ++k) { - target[keys[k]] = helpers.clone(source[keys[k]]); - } - - return target; - } - - return source; - }, - - /** - * The default merger when Chart.helpers.merge is called without merger option. - * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. - * @private - */ - _merger: function(key, target, source, options) { - var tval = target[key]; - var sval = source[key]; - - if (helpers.isObject(tval) && helpers.isObject(sval)) { - helpers.merge(tval, sval, options); - } else { - target[key] = helpers.clone(sval); - } - }, - - /** - * Merges source[key] in target[key] only if target[key] is undefined. - * @private - */ - _mergerIf: function(key, target, source) { - var tval = target[key]; - var sval = source[key]; - - if (helpers.isObject(tval) && helpers.isObject(sval)) { - helpers.mergeIf(tval, sval); - } else if (!target.hasOwnProperty(key)) { - target[key] = helpers.clone(sval); - } - }, - - /** - * Recursively deep copies `source` properties into `target` with the given `options`. - * IMPORTANT: `target` is not cloned and will be updated with `source` properties. - * @param {object} target - The target object in which all sources are merged into. - * @param {object|object[]} source - Object(s) to merge into `target`. - * @param {object} [options] - Merging options: - * @param {function} [options.merger] - The merge method (key, target, source, options) - * @returns {object} The `target` object. - */ - merge: function(target, source, options) { - var sources = helpers.isArray(source) ? source : [source]; - var ilen = sources.length; - var merge, i, keys, klen, k; - - if (!helpers.isObject(target)) { - return target; - } - - options = options || {}; - merge = options.merger || helpers._merger; - - for (i = 0; i < ilen; ++i) { - source = sources[i]; - if (!helpers.isObject(source)) { - continue; - } - - keys = Object.keys(source); - for (k = 0, klen = keys.length; k < klen; ++k) { - merge(keys[k], target, source, options); - } - } - - return target; - }, - - /** - * Recursively deep copies `source` properties into `target` *only* if not defined in target. - * IMPORTANT: `target` is not cloned and will be updated with `source` properties. - * @param {object} target - The target object in which all sources are merged into. - * @param {object|object[]} source - Object(s) to merge into `target`. - * @returns {object} The `target` object. - */ - mergeIf: function(target, source) { - return helpers.merge(target, source, {merger: helpers._mergerIf}); - }, - - /** - * Applies the contents of two or more objects together into the first object. - * @param {object} target - The target object in which all objects are merged into. - * @param {object} arg1 - Object containing additional properties to merge in target. - * @param {object} argN - Additional objects containing properties to merge in target. - * @returns {object} The `target` object. - */ - extend: function(target) { - var setFn = function(value, key) { - target[key] = value; - }; - for (var i = 1, ilen = arguments.length; i < ilen; ++i) { - helpers.each(arguments[i], setFn); - } - return target; - }, - - /** - * Basic javascript inheritance based on the model created in Backbone.js - */ - inherits: function(extensions) { - var me = this; - var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { - return me.apply(this, arguments); - }; - - var Surrogate = function() { - this.constructor = ChartElement; - }; - - Surrogate.prototype = me.prototype; - ChartElement.prototype = new Surrogate(); - ChartElement.extend = helpers.inherits; - - if (extensions) { - helpers.extend(ChartElement.prototype, extensions); - } - - ChartElement.__super__ = me.prototype; - return ChartElement; - } -}; - -var helpers_core = helpers; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.helpers.callback instead. - * @function Chart.helpers.callCallback - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ -helpers.callCallback = helpers.callback; - -/** - * Provided for backward compatibility, use Array.prototype.indexOf instead. - * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ - * @function Chart.helpers.indexOf - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers.indexOf = function(array, item, fromIndex) { - return Array.prototype.indexOf.call(array, item, fromIndex); -}; - -/** - * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. - * @function Chart.helpers.getValueOrDefault - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers.getValueOrDefault = helpers.valueOrDefault; - -/** - * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. - * @function Chart.helpers.getValueAtIndexOrDefault - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; - -/** - * Easing functions adapted from Robert Penner's easing equations. - * @namespace Chart.helpers.easingEffects - * @see http://www.robertpenner.com/easing/ - */ -var effects = { - linear: function(t) { - return t; - }, - - easeInQuad: function(t) { - return t * t; - }, - - easeOutQuad: function(t) { - return -t * (t - 2); - }, - - easeInOutQuad: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t; - } - return -0.5 * ((--t) * (t - 2) - 1); - }, - - easeInCubic: function(t) { - return t * t * t; - }, - - easeOutCubic: function(t) { - return (t = t - 1) * t * t + 1; - }, - - easeInOutCubic: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t; - } - return 0.5 * ((t -= 2) * t * t + 2); - }, - - easeInQuart: function(t) { - return t * t * t * t; - }, - - easeOutQuart: function(t) { - return -((t = t - 1) * t * t * t - 1); - }, - - easeInOutQuart: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t * t; - } - return -0.5 * ((t -= 2) * t * t * t - 2); - }, - - easeInQuint: function(t) { - return t * t * t * t * t; - }, - - easeOutQuint: function(t) { - return (t = t - 1) * t * t * t * t + 1; - }, - - easeInOutQuint: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t * t * t; - } - return 0.5 * ((t -= 2) * t * t * t * t + 2); - }, - - easeInSine: function(t) { - return -Math.cos(t * (Math.PI / 2)) + 1; - }, - - easeOutSine: function(t) { - return Math.sin(t * (Math.PI / 2)); - }, - - easeInOutSine: function(t) { - return -0.5 * (Math.cos(Math.PI * t) - 1); - }, - - easeInExpo: function(t) { - return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); - }, - - easeOutExpo: function(t) { - return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; - }, - - easeInOutExpo: function(t) { - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if ((t /= 0.5) < 1) { - return 0.5 * Math.pow(2, 10 * (t - 1)); - } - return 0.5 * (-Math.pow(2, -10 * --t) + 2); - }, - - easeInCirc: function(t) { - if (t >= 1) { - return t; - } - return -(Math.sqrt(1 - t * t) - 1); - }, - - easeOutCirc: function(t) { - return Math.sqrt(1 - (t = t - 1) * t); - }, - - easeInOutCirc: function(t) { - if ((t /= 0.5) < 1) { - return -0.5 * (Math.sqrt(1 - t * t) - 1); - } - return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); - }, - - easeInElastic: function(t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if (!p) { - p = 0.3; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); - }, - - easeOutElastic: function(t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if (!p) { - p = 0.3; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; - }, - - easeInOutElastic: function(t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if ((t /= 0.5) === 2) { - return 1; - } - if (!p) { - p = 0.45; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - if (t < 1) { - return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); - } - return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; - }, - easeInBack: function(t) { - var s = 1.70158; - return t * t * ((s + 1) * t - s); - }, - - easeOutBack: function(t) { - var s = 1.70158; - return (t = t - 1) * t * ((s + 1) * t + s) + 1; - }, - - easeInOutBack: function(t) { - var s = 1.70158; - if ((t /= 0.5) < 1) { - return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); - } - return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); - }, - - easeInBounce: function(t) { - return 1 - effects.easeOutBounce(1 - t); - }, - - easeOutBounce: function(t) { - if (t < (1 / 2.75)) { - return 7.5625 * t * t; - } - if (t < (2 / 2.75)) { - return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; - } - if (t < (2.5 / 2.75)) { - return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; - } - return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; - }, - - easeInOutBounce: function(t) { - if (t < 0.5) { - return effects.easeInBounce(t * 2) * 0.5; - } - return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; - } -}; - -var helpers_easing = { - effects: effects -}; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.helpers.easing.effects instead. - * @function Chart.helpers.easingEffects - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers_core.easingEffects = effects; - -var PI = Math.PI; -var RAD_PER_DEG = PI / 180; -var DOUBLE_PI = PI * 2; -var HALF_PI = PI / 2; -var QUARTER_PI = PI / 4; -var TWO_THIRDS_PI = PI * 2 / 3; - -/** - * @namespace Chart.helpers.canvas - */ -var exports$1 = { - /** - * Clears the entire canvas associated to the given `chart`. - * @param {Chart} chart - The chart for which to clear the canvas. - */ - clear: function(chart) { - chart.ctx.clearRect(0, 0, chart.width, chart.height); - }, - - /** - * Creates a "path" for a rectangle with rounded corners at position (x, y) with a - * given size (width, height) and the same `radius` for all corners. - * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. - * @param {number} x - The x axis of the coordinate for the rectangle starting point. - * @param {number} y - The y axis of the coordinate for the rectangle starting point. - * @param {number} width - The rectangle's width. - * @param {number} height - The rectangle's height. - * @param {number} radius - The rounded amount (in pixels) for the four corners. - * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? - */ - roundedRect: function(ctx, x, y, width, height, radius) { - if (radius) { - var r = Math.min(radius, height / 2, width / 2); - var left = x + r; - var top = y + r; - var right = x + width - r; - var bottom = y + height - r; - - ctx.moveTo(x, top); - if (left < right && top < bottom) { - ctx.arc(left, top, r, -PI, -HALF_PI); - ctx.arc(right, top, r, -HALF_PI, 0); - ctx.arc(right, bottom, r, 0, HALF_PI); - ctx.arc(left, bottom, r, HALF_PI, PI); - } else if (left < right) { - ctx.moveTo(left, y); - ctx.arc(right, top, r, -HALF_PI, HALF_PI); - ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); - } else if (top < bottom) { - ctx.arc(left, top, r, -PI, 0); - ctx.arc(left, bottom, r, 0, PI); - } else { - ctx.arc(left, top, r, -PI, PI); - } - ctx.closePath(); - ctx.moveTo(x, y); - } else { - ctx.rect(x, y, width, height); - } - }, - - drawPoint: function(ctx, style, radius, x, y, rotation) { - var type, xOffset, yOffset, size, cornerRadius; - var rad = (rotation || 0) * RAD_PER_DEG; - - if (style && typeof style === 'object') { - type = style.toString(); - if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { - ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); - return; - } - } - - if (isNaN(radius) || radius <= 0) { - return; - } - - ctx.beginPath(); - - switch (style) { - // Default includes circle - default: - ctx.arc(x, y, radius, 0, DOUBLE_PI); - ctx.closePath(); - break; - case 'triangle': - ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); - rad += TWO_THIRDS_PI; - ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); - rad += TWO_THIRDS_PI; - ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); - ctx.closePath(); - break; - case 'rectRounded': - // NOTE: the rounded rect implementation changed to use `arc` instead of - // `quadraticCurveTo` since it generates better results when rect is - // almost a circle. 0.516 (instead of 0.5) produces results with visually - // closer proportion to the previous impl and it is inscribed in the - // circle with `radius`. For more details, see the following PRs: - // https://github.com/chartjs/Chart.js/issues/5597 - // https://github.com/chartjs/Chart.js/issues/5858 - cornerRadius = radius * 0.516; - size = radius - cornerRadius; - xOffset = Math.cos(rad + QUARTER_PI) * size; - yOffset = Math.sin(rad + QUARTER_PI) * size; - ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); - ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); - ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); - ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); - ctx.closePath(); - break; - case 'rect': - if (!rotation) { - size = Math.SQRT1_2 * radius; - ctx.rect(x - size, y - size, 2 * size, 2 * size); - break; - } - rad += QUARTER_PI; - /* falls through */ - case 'rectRot': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + yOffset, y - xOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.lineTo(x - yOffset, y + xOffset); - ctx.closePath(); - break; - case 'crossRot': - rad += QUARTER_PI; - /* falls through */ - case 'cross': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); - break; - case 'star': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); - rad += QUARTER_PI; - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); - break; - case 'line': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - break; - case 'dash': - ctx.moveTo(x, y); - ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); - break; - } - - ctx.fill(); - ctx.stroke(); - }, - - /** - * Returns true if the point is inside the rectangle - * @param {object} point - The point to test - * @param {object} area - The rectangle - * @returns {boolean} - * @private - */ - _isPointInArea: function(point, area) { - var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error. - - return point.x > area.left - epsilon && point.x < area.right + epsilon && - point.y > area.top - epsilon && point.y < area.bottom + epsilon; - }, - - clipArea: function(ctx, area) { - ctx.save(); - ctx.beginPath(); - ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); - ctx.clip(); - }, - - unclipArea: function(ctx) { - ctx.restore(); - }, - - lineTo: function(ctx, previous, target, flip) { - var stepped = target.steppedLine; - if (stepped) { - if (stepped === 'middle') { - var midpoint = (previous.x + target.x) / 2.0; - ctx.lineTo(midpoint, flip ? target.y : previous.y); - ctx.lineTo(midpoint, flip ? previous.y : target.y); - } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) { - ctx.lineTo(previous.x, target.y); - } else { - ctx.lineTo(target.x, previous.y); - } - ctx.lineTo(target.x, target.y); - return; - } - - if (!target.tension) { - ctx.lineTo(target.x, target.y); - return; - } - - ctx.bezierCurveTo( - flip ? previous.controlPointPreviousX : previous.controlPointNextX, - flip ? previous.controlPointPreviousY : previous.controlPointNextY, - flip ? target.controlPointNextX : target.controlPointPreviousX, - flip ? target.controlPointNextY : target.controlPointPreviousY, - target.x, - target.y); - } -}; - -var helpers_canvas = exports$1; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. - * @namespace Chart.helpers.clear - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers_core.clear = exports$1.clear; - -/** - * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. - * @namespace Chart.helpers.drawRoundedRectangle - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers_core.drawRoundedRectangle = function(ctx) { - ctx.beginPath(); - exports$1.roundedRect.apply(exports$1, arguments); -}; - -var defaults = { - /** - * @private - */ - _set: function(scope, values) { - return helpers_core.merge(this[scope] || (this[scope] = {}), values); - } -}; - -defaults._set('global', { - defaultColor: 'rgba(0,0,0,0.1)', - defaultFontColor: '#666', - defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", - defaultFontSize: 12, - defaultFontStyle: 'normal', - defaultLineHeight: 1.2, - showLines: true -}); - -var core_defaults = defaults; - -var valueOrDefault = helpers_core.valueOrDefault; - -/** - * Converts the given font object into a CSS font string. - * @param {object} font - A font object. - * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font - * @private - */ -function toFontString(font) { - if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) { - return null; - } - - return (font.style ? font.style + ' ' : '') - + (font.weight ? font.weight + ' ' : '') - + font.size + 'px ' - + font.family; -} - -/** - * @alias Chart.helpers.options - * @namespace - */ -var helpers_options = { - /** - * Converts the given line height `value` in pixels for a specific font `size`. - * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). - * @param {number} size - The font size (in pixels) used to resolve relative `value`. - * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid). - * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height - * @since 2.7.0 - */ - toLineHeight: function(value, size) { - var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); - if (!matches || matches[1] === 'normal') { - return size * 1.2; - } - - value = +matches[2]; - - switch (matches[3]) { - case 'px': - return value; - case '%': - value /= 100; - break; - default: - break; - } - - return size * value; - }, - - /** - * Converts the given value into a padding object with pre-computed width/height. - * @param {number|object} value - If a number, set the value to all TRBL component, - * else, if and object, use defined properties and sets undefined ones to 0. - * @returns {object} The padding values (top, right, bottom, left, width, height) - * @since 2.7.0 - */ - toPadding: function(value) { - var t, r, b, l; - - if (helpers_core.isObject(value)) { - t = +value.top || 0; - r = +value.right || 0; - b = +value.bottom || 0; - l = +value.left || 0; - } else { - t = r = b = l = +value || 0; - } - - return { - top: t, - right: r, - bottom: b, - left: l, - height: t + b, - width: l + r - }; - }, - - /** - * Parses font options and returns the font object. - * @param {object} options - A object that contains font options to be parsed. - * @return {object} The font object. - * @todo Support font.* options and renamed to toFont(). - * @private - */ - _parseFont: function(options) { - var globalDefaults = core_defaults.global; - var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); - var font = { - family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily), - lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size), - size: size, - style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle), - weight: null, - string: '' - }; - - font.string = toFontString(font); - return font; - }, - - /** - * Evaluates the given `inputs` sequentially and returns the first defined value. - * @param {Array} inputs - An array of values, falling back to the last value. - * @param {object} [context] - If defined and the current value is a function, the value - * is called with `context` as first argument and the result becomes the new input. - * @param {number} [index] - If defined and the current value is an array, the value - * at `index` become the new input. - * @since 2.7.0 - */ - resolve: function(inputs, context, index) { - var i, ilen, value; - - for (i = 0, ilen = inputs.length; i < ilen; ++i) { - value = inputs[i]; - if (value === undefined) { - continue; - } - if (context !== undefined && typeof value === 'function') { - value = value(context); - } - if (index !== undefined && helpers_core.isArray(value)) { - value = value[index]; - } - if (value !== undefined) { - return value; - } - } - } -}; - -var helpers$1 = helpers_core; -var easing = helpers_easing; -var canvas = helpers_canvas; -var options = helpers_options; -helpers$1.easing = easing; -helpers$1.canvas = canvas; -helpers$1.options = options; - -function interpolate(start, view, model, ease) { - var keys = Object.keys(model); - var i, ilen, key, actual, origin, target, type, c0, c1; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - - target = model[key]; - - // if a value is added to the model after pivot() has been called, the view - // doesn't contain it, so let's initialize the view to the target value. - if (!view.hasOwnProperty(key)) { - view[key] = target; - } - - actual = view[key]; - - if (actual === target || key[0] === '_') { - continue; - } - - if (!start.hasOwnProperty(key)) { - start[key] = actual; - } - - origin = start[key]; - - type = typeof target; - - if (type === typeof origin) { - if (type === 'string') { - c0 = chartjsColor(origin); - if (c0.valid) { - c1 = chartjsColor(target); - if (c1.valid) { - view[key] = c1.mix(c0, ease).rgbString(); - continue; - } - } - } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) { - view[key] = origin + (target - origin) * ease; - continue; - } - } - - view[key] = target; - } -} - -var Element = function(configuration) { - helpers$1.extend(this, configuration); - this.initialize.apply(this, arguments); -}; - -helpers$1.extend(Element.prototype, { - - initialize: function() { - this.hidden = false; - }, - - pivot: function() { - var me = this; - if (!me._view) { - me._view = helpers$1.clone(me._model); - } - me._start = {}; - return me; - }, - - transition: function(ease) { - var me = this; - var model = me._model; - var start = me._start; - var view = me._view; - - // No animation -> No Transition - if (!model || ease === 1) { - me._view = model; - me._start = null; - return me; - } - - if (!view) { - view = me._view = {}; - } - - if (!start) { - start = me._start = {}; - } - - interpolate(start, view, model, ease); - - return me; - }, - - tooltipPosition: function() { - return { - x: this._model.x, - y: this._model.y - }; - }, - - hasValue: function() { - return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y); - } -}); - -Element.extend = helpers$1.inherits; - -var core_element = Element; - -var exports$2 = core_element.extend({ - chart: null, // the animation associated chart instance - currentStep: 0, // the current animation step - numSteps: 60, // default number of steps - easing: '', // the easing to use for this animation - render: null, // render function used by the animation service - - onAnimationProgress: null, // user specified callback to fire on each step of the animation - onAnimationComplete: null, // user specified callback to fire when the animation finishes -}); - -var core_animation = exports$2; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.Animation instead - * @prop Chart.Animation#animationObject - * @deprecated since version 2.6.0 - * @todo remove at version 3 - */ -Object.defineProperty(exports$2.prototype, 'animationObject', { - get: function() { - return this; - } -}); - -/** - * Provided for backward compatibility, use Chart.Animation#chart instead - * @prop Chart.Animation#chartInstance - * @deprecated since version 2.6.0 - * @todo remove at version 3 - */ -Object.defineProperty(exports$2.prototype, 'chartInstance', { - get: function() { - return this.chart; - }, - set: function(value) { - this.chart = value; - } -}); - -core_defaults._set('global', { - animation: { - duration: 1000, - easing: 'easeOutQuart', - onProgress: helpers$1.noop, - onComplete: helpers$1.noop - } -}); - -var core_animations = { - animations: [], - request: null, - - /** - * @param {Chart} chart - The chart to animate. - * @param {Chart.Animation} animation - The animation that we will animate. - * @param {number} duration - The animation duration in ms. - * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions - */ - addAnimation: function(chart, animation, duration, lazy) { - var animations = this.animations; - var i, ilen; - - animation.chart = chart; - animation.startTime = Date.now(); - animation.duration = duration; - - if (!lazy) { - chart.animating = true; - } - - for (i = 0, ilen = animations.length; i < ilen; ++i) { - if (animations[i].chart === chart) { - animations[i] = animation; - return; - } - } - - animations.push(animation); - - // If there are no animations queued, manually kickstart a digest, for lack of a better word - if (animations.length === 1) { - this.requestAnimationFrame(); - } - }, - - cancelAnimation: function(chart) { - var index = helpers$1.findIndex(this.animations, function(animation) { - return animation.chart === chart; - }); - - if (index !== -1) { - this.animations.splice(index, 1); - chart.animating = false; - } - }, - - requestAnimationFrame: function() { - var me = this; - if (me.request === null) { - // Skip animation frame requests until the active one is executed. - // This can happen when processing mouse events, e.g. 'mousemove' - // and 'mouseout' events will trigger multiple renders. - me.request = helpers$1.requestAnimFrame.call(window, function() { - me.request = null; - me.startDigest(); - }); - } - }, - - /** - * @private - */ - startDigest: function() { - var me = this; - - me.advance(); - - // Do we have more stuff to animate? - if (me.animations.length > 0) { - me.requestAnimationFrame(); - } - }, - - /** - * @private - */ - advance: function() { - var animations = this.animations; - var animation, chart, numSteps, nextStep; - var i = 0; - - // 1 animation per chart, so we are looping charts here - while (i < animations.length) { - animation = animations[i]; - chart = animation.chart; - numSteps = animation.numSteps; - - // Make sure that currentStep starts at 1 - // https://github.com/chartjs/Chart.js/issues/6104 - nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1; - animation.currentStep = Math.min(nextStep, numSteps); - - helpers$1.callback(animation.render, [chart, animation], chart); - helpers$1.callback(animation.onAnimationProgress, [animation], chart); - - if (animation.currentStep >= numSteps) { - helpers$1.callback(animation.onAnimationComplete, [animation], chart); - chart.animating = false; - animations.splice(i, 1); - } else { - ++i; - } - } - } -}; - -var resolve = helpers$1.options.resolve; - -var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; - -/** - * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', - * 'unshift') and notify the listener AFTER the array has been altered. Listeners are - * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. - */ -function listenArrayEvents(array, listener) { - if (array._chartjs) { - array._chartjs.listeners.push(listener); - return; - } - - Object.defineProperty(array, '_chartjs', { - configurable: true, - enumerable: false, - value: { - listeners: [listener] - } - }); - - arrayEvents.forEach(function(key) { - var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); - var base = array[key]; - - Object.defineProperty(array, key, { - configurable: true, - enumerable: false, - value: function() { - var args = Array.prototype.slice.call(arguments); - var res = base.apply(this, args); - - helpers$1.each(array._chartjs.listeners, function(object) { - if (typeof object[method] === 'function') { - object[method].apply(object, args); - } - }); - - return res; - } - }); - }); -} - -/** - * Removes the given array event listener and cleanup extra attached properties (such as - * the _chartjs stub and overridden methods) if array doesn't have any more listeners. - */ -function unlistenArrayEvents(array, listener) { - var stub = array._chartjs; - if (!stub) { - return; - } - - var listeners = stub.listeners; - var index = listeners.indexOf(listener); - if (index !== -1) { - listeners.splice(index, 1); - } - - if (listeners.length > 0) { - return; - } - - arrayEvents.forEach(function(key) { - delete array[key]; - }); - - delete array._chartjs; -} - -// Base class for all dataset controllers (line, bar, etc) -var DatasetController = function(chart, datasetIndex) { - this.initialize(chart, datasetIndex); -}; - -helpers$1.extend(DatasetController.prototype, { - - /** - * Element type used to generate a meta dataset (e.g. Chart.element.Line). - * @type {Chart.core.element} - */ - datasetElementType: null, - - /** - * Element type used to generate a meta data (e.g. Chart.element.Point). - * @type {Chart.core.element} - */ - dataElementType: null, - - initialize: function(chart, datasetIndex) { - var me = this; - me.chart = chart; - me.index = datasetIndex; - me.linkScales(); - me.addElements(); - }, - - updateIndex: function(datasetIndex) { - this.index = datasetIndex; - }, - - linkScales: function() { - var me = this; - var meta = me.getMeta(); - var dataset = me.getDataset(); - - if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) { - meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; - } - if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) { - meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; - } - }, - - getDataset: function() { - return this.chart.data.datasets[this.index]; - }, - - getMeta: function() { - return this.chart.getDatasetMeta(this.index); - }, - - getScaleForId: function(scaleID) { - return this.chart.scales[scaleID]; - }, - - /** - * @private - */ - _getValueScaleId: function() { - return this.getMeta().yAxisID; - }, - - /** - * @private - */ - _getIndexScaleId: function() { - return this.getMeta().xAxisID; - }, - - /** - * @private - */ - _getValueScale: function() { - return this.getScaleForId(this._getValueScaleId()); - }, - - /** - * @private - */ - _getIndexScale: function() { - return this.getScaleForId(this._getIndexScaleId()); - }, - - reset: function() { - this.update(true); - }, - - /** - * @private - */ - destroy: function() { - if (this._data) { - unlistenArrayEvents(this._data, this); - } - }, - - createMetaDataset: function() { - var me = this; - var type = me.datasetElementType; - return type && new type({ - _chart: me.chart, - _datasetIndex: me.index - }); - }, - - createMetaData: function(index) { - var me = this; - var type = me.dataElementType; - return type && new type({ - _chart: me.chart, - _datasetIndex: me.index, - _index: index - }); - }, - - addElements: function() { - var me = this; - var meta = me.getMeta(); - var data = me.getDataset().data || []; - var metaData = meta.data; - var i, ilen; - - for (i = 0, ilen = data.length; i < ilen; ++i) { - metaData[i] = metaData[i] || me.createMetaData(i); - } - - meta.dataset = meta.dataset || me.createMetaDataset(); - }, - - addElementAndReset: function(index) { - var element = this.createMetaData(index); - this.getMeta().data.splice(index, 0, element); - this.updateElement(element, index, true); - }, - - buildOrUpdateElements: function() { - var me = this; - var dataset = me.getDataset(); - var data = dataset.data || (dataset.data = []); - - // In order to correctly handle data addition/deletion animation (an thus simulate - // real-time charts), we need to monitor these data modifications and synchronize - // the internal meta data accordingly. - if (me._data !== data) { - if (me._data) { - // This case happens when the user replaced the data array instance. - unlistenArrayEvents(me._data, me); - } - - if (data && Object.isExtensible(data)) { - listenArrayEvents(data, me); - } - me._data = data; - } - - // Re-sync meta data in case the user replaced the data array or if we missed - // any updates and so make sure that we handle number of datapoints changing. - me.resyncElements(); - }, - - update: helpers$1.noop, - - transition: function(easingValue) { - var meta = this.getMeta(); - var elements = meta.data || []; - var ilen = elements.length; - var i = 0; - - for (; i < ilen; ++i) { - elements[i].transition(easingValue); - } - - if (meta.dataset) { - meta.dataset.transition(easingValue); - } - }, - - draw: function() { - var meta = this.getMeta(); - var elements = meta.data || []; - var ilen = elements.length; - var i = 0; - - if (meta.dataset) { - meta.dataset.draw(); - } - - for (; i < ilen; ++i) { - elements[i].draw(); - } - }, - - removeHoverStyle: function(element) { - helpers$1.merge(element._model, element.$previousStyle || {}); - delete element.$previousStyle; - }, - - setHoverStyle: function(element) { - var dataset = this.chart.data.datasets[element._datasetIndex]; - var index = element._index; - var custom = element.custom || {}; - var model = element._model; - var getHoverColor = helpers$1.getHoverColor; - - element.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth - }; - - model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index); - model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index); - model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index); - }, - - /** - * @private - */ - resyncElements: function() { - var me = this; - var meta = me.getMeta(); - var data = me.getDataset().data; - var numMeta = meta.data.length; - var numData = data.length; - - if (numData < numMeta) { - meta.data.splice(numData, numMeta - numData); - } else if (numData > numMeta) { - me.insertElements(numMeta, numData - numMeta); - } - }, - - /** - * @private - */ - insertElements: function(start, count) { - for (var i = 0; i < count; ++i) { - this.addElementAndReset(start + i); - } - }, - - /** - * @private - */ - onDataPush: function() { - var count = arguments.length; - this.insertElements(this.getDataset().data.length - count, count); - }, - - /** - * @private - */ - onDataPop: function() { - this.getMeta().data.pop(); - }, - - /** - * @private - */ - onDataShift: function() { - this.getMeta().data.shift(); - }, - - /** - * @private - */ - onDataSplice: function(start, count) { - this.getMeta().data.splice(start, count); - this.insertElements(start, arguments.length - 2); - }, - - /** - * @private - */ - onDataUnshift: function() { - this.insertElements(0, arguments.length); - } -}); - -DatasetController.extend = helpers$1.inherits; - -var core_datasetController = DatasetController; - -core_defaults._set('global', { - elements: { - arc: { - backgroundColor: core_defaults.global.defaultColor, - borderColor: '#fff', - borderWidth: 2, - borderAlign: 'center' - } - } -}); - -var element_arc = core_element.extend({ - inLabelRange: function(mouseX) { - var vm = this._view; - - if (vm) { - return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); - } - return false; - }, - - inRange: function(chartX, chartY) { - var vm = this._view; - - if (vm) { - var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY}); - var angle = pointRelativePosition.angle; - var distance = pointRelativePosition.distance; - - // Sanitise angle range - var startAngle = vm.startAngle; - var endAngle = vm.endAngle; - while (endAngle < startAngle) { - endAngle += 2.0 * Math.PI; - } - while (angle > endAngle) { - angle -= 2.0 * Math.PI; - } - while (angle < startAngle) { - angle += 2.0 * Math.PI; - } - - // Check if within the range of the open/close angle - var betweenAngles = (angle >= startAngle && angle <= endAngle); - var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); - - return (betweenAngles && withinRadius); - } - return false; - }, - - getCenterPoint: function() { - var vm = this._view; - var halfAngle = (vm.startAngle + vm.endAngle) / 2; - var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; - return { - x: vm.x + Math.cos(halfAngle) * halfRadius, - y: vm.y + Math.sin(halfAngle) * halfRadius - }; - }, - - getArea: function() { - var vm = this._view; - return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); - }, - - tooltipPosition: function() { - var vm = this._view; - var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); - var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; - - return { - x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), - y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) - }; - }, - - draw: function() { - var ctx = this._chart.ctx; - var vm = this._view; - var sA = vm.startAngle; - var eA = vm.endAngle; - var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0; - var angleMargin; - - ctx.save(); - - ctx.beginPath(); - ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA); - ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); - ctx.closePath(); - - ctx.fillStyle = vm.backgroundColor; - ctx.fill(); - - if (vm.borderWidth) { - if (vm.borderAlign === 'inner') { - // Draw an inner border by cliping the arc and drawing a double-width border - // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders - ctx.beginPath(); - angleMargin = pixelMargin / vm.outerRadius; - ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin); - if (vm.innerRadius > pixelMargin) { - angleMargin = pixelMargin / vm.innerRadius; - ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true); - } else { - ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2); - } - ctx.closePath(); - ctx.clip(); - - ctx.beginPath(); - ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); - ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); - ctx.closePath(); - - ctx.lineWidth = vm.borderWidth * 2; - ctx.lineJoin = 'round'; - } else { - ctx.lineWidth = vm.borderWidth; - ctx.lineJoin = 'bevel'; - } - - ctx.strokeStyle = vm.borderColor; - ctx.stroke(); - } - - ctx.restore(); - } -}); - -var valueOrDefault$1 = helpers$1.valueOrDefault; - -var defaultColor = core_defaults.global.defaultColor; - -core_defaults._set('global', { - elements: { - line: { - tension: 0.4, - backgroundColor: defaultColor, - borderWidth: 3, - borderColor: defaultColor, - borderCapStyle: 'butt', - borderDash: [], - borderDashOffset: 0.0, - borderJoinStyle: 'miter', - capBezierPoints: true, - fill: true, // do we fill in the area between the line and its base axis - } - } -}); - -var element_line = core_element.extend({ - draw: function() { - var me = this; - var vm = me._view; - var ctx = me._chart.ctx; - var spanGaps = vm.spanGaps; - var points = me._children.slice(); // clone array - var globalDefaults = core_defaults.global; - var globalOptionLineElements = globalDefaults.elements.line; - var lastDrawnIndex = -1; - var index, current, previous, currentVM; - - // If we are looping, adding the first point again - if (me._loop && points.length) { - points.push(points[0]); - } - - ctx.save(); - - // Stroke Line Options - ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; - - // IE 9 and 10 do not support line dash - if (ctx.setLineDash) { - ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); - } - - ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset); - ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; - ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth); - ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; - - // Stroke Line - ctx.beginPath(); - lastDrawnIndex = -1; - - for (index = 0; index < points.length; ++index) { - current = points[index]; - previous = helpers$1.previousItem(points, index); - currentVM = current._view; - - // First point moves to it's starting position no matter what - if (index === 0) { - if (!currentVM.skip) { - ctx.moveTo(currentVM.x, currentVM.y); - lastDrawnIndex = index; - } - } else { - previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; - - if (!currentVM.skip) { - if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { - // There was a gap and this is the first point after the gap - ctx.moveTo(currentVM.x, currentVM.y); - } else { - // Line to next point - helpers$1.canvas.lineTo(ctx, previous._view, current._view); - } - lastDrawnIndex = index; - } - } - } - - ctx.stroke(); - ctx.restore(); - } -}); - -var valueOrDefault$2 = helpers$1.valueOrDefault; - -var defaultColor$1 = core_defaults.global.defaultColor; - -core_defaults._set('global', { - elements: { - point: { - radius: 3, - pointStyle: 'circle', - backgroundColor: defaultColor$1, - borderColor: defaultColor$1, - borderWidth: 1, - // Hover - hitRadius: 1, - hoverRadius: 4, - hoverBorderWidth: 1 - } - } -}); - -function xRange(mouseX) { - var vm = this._view; - return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false; -} - -function yRange(mouseY) { - var vm = this._view; - return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false; -} - -var element_point = core_element.extend({ - inRange: function(mouseX, mouseY) { - var vm = this._view; - return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; - }, - - inLabelRange: xRange, - inXRange: xRange, - inYRange: yRange, - - getCenterPoint: function() { - var vm = this._view; - return { - x: vm.x, - y: vm.y - }; - }, - - getArea: function() { - return Math.PI * Math.pow(this._view.radius, 2); - }, - - tooltipPosition: function() { - var vm = this._view; - return { - x: vm.x, - y: vm.y, - padding: vm.radius + vm.borderWidth - }; - }, - - draw: function(chartArea) { - var vm = this._view; - var ctx = this._chart.ctx; - var pointStyle = vm.pointStyle; - var rotation = vm.rotation; - var radius = vm.radius; - var x = vm.x; - var y = vm.y; - var globalDefaults = core_defaults.global; - var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow - - if (vm.skip) { - return; - } - - // Clipping for Points. - if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) { - ctx.strokeStyle = vm.borderColor || defaultColor; - ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth); - ctx.fillStyle = vm.backgroundColor || defaultColor; - helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation); - } - } -}); - -var defaultColor$2 = core_defaults.global.defaultColor; - -core_defaults._set('global', { - elements: { - rectangle: { - backgroundColor: defaultColor$2, - borderColor: defaultColor$2, - borderSkipped: 'bottom', - borderWidth: 0 - } - } -}); - -function isVertical(vm) { - return vm && vm.width !== undefined; -} - -/** - * Helper function to get the bounds of the bar regardless of the orientation - * @param bar {Chart.Element.Rectangle} the bar - * @return {Bounds} bounds of the bar - * @private - */ -function getBarBounds(vm) { - var x1, x2, y1, y2, half; - - if (isVertical(vm)) { - half = vm.width / 2; - x1 = vm.x - half; - x2 = vm.x + half; - y1 = Math.min(vm.y, vm.base); - y2 = Math.max(vm.y, vm.base); - } else { - half = vm.height / 2; - x1 = Math.min(vm.x, vm.base); - x2 = Math.max(vm.x, vm.base); - y1 = vm.y - half; - y2 = vm.y + half; - } - - return { - left: x1, - top: y1, - right: x2, - bottom: y2 - }; -} - -function swap(orig, v1, v2) { - return orig === v1 ? v2 : orig === v2 ? v1 : orig; -} - -function parseBorderSkipped(vm) { - var edge = vm.borderSkipped; - var res = {}; - - if (!edge) { - return res; - } - - if (vm.horizontal) { - if (vm.base > vm.x) { - edge = swap(edge, 'left', 'right'); - } - } else if (vm.base < vm.y) { - edge = swap(edge, 'bottom', 'top'); - } - - res[edge] = true; - return res; -} - -function parseBorderWidth(vm, maxW, maxH) { - var value = vm.borderWidth; - var skip = parseBorderSkipped(vm); - var t, r, b, l; - - if (helpers$1.isObject(value)) { - t = +value.top || 0; - r = +value.right || 0; - b = +value.bottom || 0; - l = +value.left || 0; - } else { - t = r = b = l = +value || 0; - } - - return { - t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t, - r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r, - b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b, - l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l - }; -} - -function boundingRects(vm) { - var bounds = getBarBounds(vm); - var width = bounds.right - bounds.left; - var height = bounds.bottom - bounds.top; - var border = parseBorderWidth(vm, width / 2, height / 2); - - return { - outer: { - x: bounds.left, - y: bounds.top, - w: width, - h: height - }, - inner: { - x: bounds.left + border.l, - y: bounds.top + border.t, - w: width - border.l - border.r, - h: height - border.t - border.b - } - }; -} - -function inRange(vm, x, y) { - var skipX = x === null; - var skipY = y === null; - var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm); - - return bounds - && (skipX || x >= bounds.left && x <= bounds.right) - && (skipY || y >= bounds.top && y <= bounds.bottom); -} - -var element_rectangle = core_element.extend({ - draw: function() { - var ctx = this._chart.ctx; - var vm = this._view; - var rects = boundingRects(vm); - var outer = rects.outer; - var inner = rects.inner; - - ctx.fillStyle = vm.backgroundColor; - ctx.fillRect(outer.x, outer.y, outer.w, outer.h); - - if (outer.w === inner.w && outer.h === inner.h) { - return; - } - - ctx.save(); - ctx.beginPath(); - ctx.rect(outer.x, outer.y, outer.w, outer.h); - ctx.clip(); - ctx.fillStyle = vm.borderColor; - ctx.rect(inner.x, inner.y, inner.w, inner.h); - ctx.fill('evenodd'); - ctx.restore(); - }, - - height: function() { - var vm = this._view; - return vm.base - vm.y; - }, - - inRange: function(mouseX, mouseY) { - return inRange(this._view, mouseX, mouseY); - }, - - inLabelRange: function(mouseX, mouseY) { - var vm = this._view; - return isVertical(vm) - ? inRange(vm, mouseX, null) - : inRange(vm, null, mouseY); - }, - - inXRange: function(mouseX) { - return inRange(this._view, mouseX, null); - }, - - inYRange: function(mouseY) { - return inRange(this._view, null, mouseY); - }, - - getCenterPoint: function() { - var vm = this._view; - var x, y; - if (isVertical(vm)) { - x = vm.x; - y = (vm.y + vm.base) / 2; - } else { - x = (vm.x + vm.base) / 2; - y = vm.y; - } - - return {x: x, y: y}; - }, - - getArea: function() { - var vm = this._view; - - return isVertical(vm) - ? vm.width * Math.abs(vm.y - vm.base) - : vm.height * Math.abs(vm.x - vm.base); - }, - - tooltipPosition: function() { - var vm = this._view; - return { - x: vm.x, - y: vm.y - }; - } -}); - -var elements = {}; -var Arc = element_arc; -var Line = element_line; -var Point = element_point; -var Rectangle = element_rectangle; -elements.Arc = Arc; -elements.Line = Line; -elements.Point = Point; -elements.Rectangle = Rectangle; - -var resolve$1 = helpers$1.options.resolve; - -core_defaults._set('bar', { - hover: { - mode: 'label' - }, - - scales: { - xAxes: [{ - type: 'category', - categoryPercentage: 0.8, - barPercentage: 0.9, - offset: true, - gridLines: { - offsetGridLines: true - } - }], - - yAxes: [{ - type: 'linear' - }] - } -}); - -/** - * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. - * @private - */ -function computeMinSampleSize(scale, pixels) { - var min = scale.isHorizontal() ? scale.width : scale.height; - var ticks = scale.getTicks(); - var prev, curr, i, ilen; - - for (i = 1, ilen = pixels.length; i < ilen; ++i) { - min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1])); - } - - for (i = 0, ilen = ticks.length; i < ilen; ++i) { - curr = scale.getPixelForTick(i); - min = i > 0 ? Math.min(min, curr - prev) : min; - prev = curr; - } - - return min; -} - -/** - * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, - * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This - * mode currently always generates bars equally sized (until we introduce scriptable options?). - * @private - */ -function computeFitCategoryTraits(index, ruler, options) { - var thickness = options.barThickness; - var count = ruler.stackCount; - var curr = ruler.pixels[index]; - var size, ratio; - - if (helpers$1.isNullOrUndef(thickness)) { - size = ruler.min * options.categoryPercentage; - ratio = options.barPercentage; - } else { - // When bar thickness is enforced, category and bar percentages are ignored. - // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') - // and deprecate barPercentage since this value is ignored when thickness is absolute. - size = thickness * count; - ratio = 1; - } - - return { - chunk: size / count, - ratio: ratio, - start: curr - (size / 2) - }; -} - -/** - * Computes an "optimal" category that globally arranges bars side by side (no gap when - * percentage options are 1), based on the previous and following categories. This mode - * generates bars with different widths when data are not evenly spaced. - * @private - */ -function computeFlexCategoryTraits(index, ruler, options) { - var pixels = ruler.pixels; - var curr = pixels[index]; - var prev = index > 0 ? pixels[index - 1] : null; - var next = index < pixels.length - 1 ? pixels[index + 1] : null; - var percent = options.categoryPercentage; - var start, size; - - if (prev === null) { - // first data: its size is double based on the next point or, - // if it's also the last data, we use the scale size. - prev = curr - (next === null ? ruler.end - ruler.start : next - curr); - } - - if (next === null) { - // last data: its size is also double based on the previous point. - next = curr + curr - prev; - } - - start = curr - (curr - Math.min(prev, next)) / 2 * percent; - size = Math.abs(next - prev) / 2 * percent; - - return { - chunk: size / ruler.stackCount, - ratio: options.barPercentage, - start: start - }; -} - -var controller_bar = core_datasetController.extend({ - - dataElementType: elements.Rectangle, - - initialize: function() { - var me = this; - var meta; - - core_datasetController.prototype.initialize.apply(me, arguments); - - meta = me.getMeta(); - meta.stack = me.getDataset().stack; - meta.bar = true; - }, - - update: function(reset) { - var me = this; - var rects = me.getMeta().data; - var i, ilen; - - me._ruler = me.getRuler(); - - for (i = 0, ilen = rects.length; i < ilen; ++i) { - me.updateElement(rects[i], i, reset); - } - }, - - updateElement: function(rectangle, index, reset) { - var me = this; - var meta = me.getMeta(); - var dataset = me.getDataset(); - var options = me._resolveElementOptions(rectangle, index); - - rectangle._xScale = me.getScaleForId(meta.xAxisID); - rectangle._yScale = me.getScaleForId(meta.yAxisID); - rectangle._datasetIndex = me.index; - rectangle._index = index; - rectangle._model = { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderSkipped: options.borderSkipped, - borderWidth: options.borderWidth, - datasetLabel: dataset.label, - label: me.chart.data.labels[index] - }; - - me._updateElementGeometry(rectangle, index, reset); - - rectangle.pivot(); - }, - - /** - * @private - */ - _updateElementGeometry: function(rectangle, index, reset) { - var me = this; - var model = rectangle._model; - var vscale = me._getValueScale(); - var base = vscale.getBasePixel(); - var horizontal = vscale.isHorizontal(); - var ruler = me._ruler || me.getRuler(); - var vpixels = me.calculateBarValuePixels(me.index, index); - var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); - - model.horizontal = horizontal; - model.base = reset ? base : vpixels.base; - model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; - model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; - model.height = horizontal ? ipixels.size : undefined; - model.width = horizontal ? undefined : ipixels.size; - }, - - /** - * Returns the stacks based on groups and bar visibility. - * @param {number} [last] - The dataset index - * @returns {string[]} The list of stack IDs - * @private - */ - _getStacks: function(last) { - var me = this; - var chart = me.chart; - var scale = me._getIndexScale(); - var stacked = scale.options.stacked; - var ilen = last === undefined ? chart.data.datasets.length : last + 1; - var stacks = []; - var i, meta; - - for (i = 0; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - if (meta.bar && chart.isDatasetVisible(i) && - (stacked === false || - (stacked === true && stacks.indexOf(meta.stack) === -1) || - (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { - stacks.push(meta.stack); - } - } - - return stacks; - }, - - /** - * Returns the effective number of stacks based on groups and bar visibility. - * @private - */ - getStackCount: function() { - return this._getStacks().length; - }, - - /** - * Returns the stack index for the given dataset based on groups and bar visibility. - * @param {number} [datasetIndex] - The dataset index - * @param {string} [name] - The stack name to find - * @returns {number} The stack index - * @private - */ - getStackIndex: function(datasetIndex, name) { - var stacks = this._getStacks(datasetIndex); - var index = (name !== undefined) - ? stacks.indexOf(name) - : -1; // indexOf returns -1 if element is not present - - return (index === -1) - ? stacks.length - 1 - : index; - }, - - /** - * @private - */ - getRuler: function() { - var me = this; - var scale = me._getIndexScale(); - var stackCount = me.getStackCount(); - var datasetIndex = me.index; - var isHorizontal = scale.isHorizontal(); - var start = isHorizontal ? scale.left : scale.top; - var end = start + (isHorizontal ? scale.width : scale.height); - var pixels = []; - var i, ilen, min; - - for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { - pixels.push(scale.getPixelForValue(null, i, datasetIndex)); - } - - min = helpers$1.isNullOrUndef(scale.options.barThickness) - ? computeMinSampleSize(scale, pixels) - : -1; - - return { - min: min, - pixels: pixels, - start: start, - end: end, - stackCount: stackCount, - scale: scale - }; - }, - - /** - * Note: pixel values are not clamped to the scale area. - * @private - */ - calculateBarValuePixels: function(datasetIndex, index) { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var scale = me._getValueScale(); - var isHorizontal = scale.isHorizontal(); - var datasets = chart.data.datasets; - var value = +scale.getRightValue(datasets[datasetIndex].data[index]); - var minBarLength = scale.options.minBarLength; - var stacked = scale.options.stacked; - var stack = meta.stack; - var start = 0; - var i, imeta, ivalue, base, head, size; - - if (stacked || (stacked === undefined && stack !== undefined)) { - for (i = 0; i < datasetIndex; ++i) { - imeta = chart.getDatasetMeta(i); - - if (imeta.bar && - imeta.stack === stack && - imeta.controller._getValueScaleId() === scale.id && - chart.isDatasetVisible(i)) { - - ivalue = +scale.getRightValue(datasets[i].data[index]); - if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { - start += ivalue; - } - } - } - } - - base = scale.getPixelForValue(start); - head = scale.getPixelForValue(start + value); - size = head - base; - - if (minBarLength !== undefined && Math.abs(size) < minBarLength) { - size = minBarLength; - if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) { - head = base - minBarLength; - } else { - head = base + minBarLength; - } - } - - return { - size: size, - base: base, - head: head, - center: head + size / 2 - }; - }, - - /** - * @private - */ - calculateBarIndexPixels: function(datasetIndex, index, ruler) { - var me = this; - var options = ruler.scale.options; - var range = options.barThickness === 'flex' - ? computeFlexCategoryTraits(index, ruler, options) - : computeFitCategoryTraits(index, ruler, options); - - var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); - var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); - var size = Math.min( - helpers$1.valueOrDefault(options.maxBarThickness, Infinity), - range.chunk * range.ratio); - - return { - base: center - size / 2, - head: center + size / 2, - center: center, - size: size - }; - }, - - draw: function() { - var me = this; - var chart = me.chart; - var scale = me._getValueScale(); - var rects = me.getMeta().data; - var dataset = me.getDataset(); - var ilen = rects.length; - var i = 0; - - helpers$1.canvas.clipArea(chart.ctx, chart.chartArea); - - for (; i < ilen; ++i) { - if (!isNaN(scale.getRightValue(dataset.data[i]))) { - rects[i].draw(); - } - } - - helpers$1.canvas.unclipArea(chart.ctx); - }, - - /** - * @private - */ - _resolveElementOptions: function(rectangle, index) { - var me = this; - var chart = me.chart; - var datasets = chart.data.datasets; - var dataset = datasets[me.index]; - var custom = rectangle.custom || {}; - var options = chart.options.elements.rectangle; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var keys = [ - 'backgroundColor', - 'borderColor', - 'borderSkipped', - 'borderWidth' - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$1([ - custom[key], - dataset[key], - options[key] - ], context, index); - } - - return values; - } -}); - -var valueOrDefault$3 = helpers$1.valueOrDefault; -var resolve$2 = helpers$1.options.resolve; - -core_defaults._set('bubble', { - hover: { - mode: 'single' - }, - - scales: { - xAxes: [{ - type: 'linear', // bubble should probably use a linear scale by default - position: 'bottom', - id: 'x-axis-0' // need an ID so datasets can reference the scale - }], - yAxes: [{ - type: 'linear', - position: 'left', - id: 'y-axis-0' - }] - }, - - tooltips: { - callbacks: { - title: function() { - // Title doesn't make sense for scatter since we format the data as a point - return ''; - }, - label: function(item, data) { - var datasetLabel = data.datasets[item.datasetIndex].label || ''; - var dataPoint = data.datasets[item.datasetIndex].data[item.index]; - return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; - } - } - } -}); - -var controller_bubble = core_datasetController.extend({ - /** - * @protected - */ - dataElementType: elements.Point, - - /** - * @protected - */ - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var points = meta.data; - - // Update Points - helpers$1.each(points, function(point, index) { - me.updateElement(point, index, reset); - }); - }, - - /** - * @protected - */ - updateElement: function(point, index, reset) { - var me = this; - var meta = me.getMeta(); - var custom = point.custom || {}; - var xScale = me.getScaleForId(meta.xAxisID); - var yScale = me.getScaleForId(meta.yAxisID); - var options = me._resolveElementOptions(point, index); - var data = me.getDataset().data[index]; - var dsIndex = me.index; - - var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); - var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); - - point._xScale = xScale; - point._yScale = yScale; - point._options = options; - point._datasetIndex = dsIndex; - point._index = index; - point._model = { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - hitRadius: options.hitRadius, - pointStyle: options.pointStyle, - rotation: options.rotation, - radius: reset ? 0 : options.radius, - skip: custom.skip || isNaN(x) || isNaN(y), - x: x, - y: y, - }; - - point.pivot(); - }, - - /** - * @protected - */ - setHoverStyle: function(point) { - var model = point._model; - var options = point._options; - var getHoverColor = helpers$1.getHoverColor; - - point.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - radius: model.radius - }; - - model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth); - model.radius = options.radius + options.hoverRadius; - }, - - /** - * @private - */ - _resolveElementOptions: function(point, index) { - var me = this; - var chart = me.chart; - var datasets = chart.data.datasets; - var dataset = datasets[me.index]; - var custom = point.custom || {}; - var options = chart.options.elements.point; - var data = dataset.data[index]; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var keys = [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'hoverBackgroundColor', - 'hoverBorderColor', - 'hoverBorderWidth', - 'hoverRadius', - 'hitRadius', - 'pointStyle', - 'rotation' - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$2([ - custom[key], - dataset[key], - options[key] - ], context, index); - } - - // Custom radius resolution - values.radius = resolve$2([ - custom.radius, - data ? data.r : undefined, - dataset.radius, - options.radius - ], context, index); - - return values; - } -}); - -var resolve$3 = helpers$1.options.resolve; -var valueOrDefault$4 = helpers$1.valueOrDefault; - -core_defaults._set('doughnut', { - animation: { - // Boolean - Whether we animate the rotation of the Doughnut - animateRotate: true, - // Boolean - Whether we animate scaling the Doughnut from the centre - animateScale: false - }, - hover: { - mode: 'single' - }, - legendCallback: function(chart) { - var text = []; - text.push('
    '); - - var data = chart.data; - var datasets = data.datasets; - var labels = data.labels; - - if (datasets.length) { - for (var i = 0; i < datasets[0].data.length; ++i) { - text.push('
  • '); - if (labels[i]) { - text.push(labels[i]); - } - text.push('
  • '); - } - } - - text.push('
'); - return text.join(''); - }, - legend: { - labels: { - generateLabels: function(chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function(label, i) { - var meta = chart.getDatasetMeta(0); - var ds = data.datasets[0]; - var arc = meta.data[i]; - var custom = arc && arc.custom || {}; - var arcOpts = chart.options.elements.arc; - var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); - var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); - var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); - - return { - text: label, - fillStyle: fill, - strokeStyle: stroke, - lineWidth: bw, - hidden: isNaN(ds.data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }); - } - return []; - } - }, - - onClick: function(e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - // toggle visibility of index if exists - if (meta.data[index]) { - meta.data[index].hidden = !meta.data[index].hidden; - } - } - - chart.update(); - } - }, - - // The percentage of the chart that we cut out of the middle. - cutoutPercentage: 50, - - // The rotation of the chart, where the first data arc begins. - rotation: Math.PI * -0.5, - - // The total circumference of the chart. - circumference: Math.PI * 2.0, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function() { - return ''; - }, - label: function(tooltipItem, data) { - var dataLabel = data.labels[tooltipItem.index]; - var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; - - if (helpers$1.isArray(dataLabel)) { - // show value on first line of multiline label - // need to clone because we are changing the value - dataLabel = dataLabel.slice(); - dataLabel[0] += value; - } else { - dataLabel += value; - } - - return dataLabel; - } - } - } -}); - -var controller_doughnut = core_datasetController.extend({ - - dataElementType: elements.Arc, - - linkScales: helpers$1.noop, - - // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly - getRingIndex: function(datasetIndex) { - var ringIndex = 0; - - for (var j = 0; j < datasetIndex; ++j) { - if (this.chart.isDatasetVisible(j)) { - ++ringIndex; - } - } - - return ringIndex; - }, - - update: function(reset) { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var availableWidth = chartArea.right - chartArea.left; - var availableHeight = chartArea.bottom - chartArea.top; - var minSize = Math.min(availableWidth, availableHeight); - var offset = {x: 0, y: 0}; - var meta = me.getMeta(); - var arcs = meta.data; - var cutoutPercentage = opts.cutoutPercentage; - var circumference = opts.circumference; - var chartWeight = me._getRingWeight(me.index); - var i, ilen; - - // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc - if (circumference < Math.PI * 2.0) { - var startAngle = opts.rotation % (Math.PI * 2.0); - startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); - var endAngle = startAngle + circumference; - var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; - var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; - var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); - var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); - var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); - var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); - var cutout = cutoutPercentage / 100.0; - var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; - var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; - var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; - minSize = Math.min(availableWidth / size.width, availableHeight / size.height); - offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; - } - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - arcs[i]._options = me._resolveElementOptions(arcs[i], i); - } - - chart.borderWidth = me.getMaxBorderWidth(); - chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); - chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); - chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1); - chart.offsetX = offset.x * chart.outerRadius; - chart.offsetY = offset.y * chart.outerRadius; - - meta.total = me.calculateTotal(); - - me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index); - me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0); - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - me.updateElement(arcs[i], i, reset); - } - }, - - updateElement: function(arc, index, reset) { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var animationOpts = opts.animation; - var centerX = (chartArea.left + chartArea.right) / 2; - var centerY = (chartArea.top + chartArea.bottom) / 2; - var startAngle = opts.rotation; // non reset case handled later - var endAngle = opts.rotation; // non reset case handled later - var dataset = me.getDataset(); - var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); - var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; - var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; - var options = arc._options || {}; - - helpers$1.extend(arc, { - // Utility - _datasetIndex: me.index, - _index: index, - - // Desired view properties - _model: { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - borderAlign: options.borderAlign, - x: centerX + chart.offsetX, - y: centerY + chart.offsetY, - startAngle: startAngle, - endAngle: endAngle, - circumference: circumference, - outerRadius: outerRadius, - innerRadius: innerRadius, - label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) - } - }); - - var model = arc._model; - - // Set correct angles if not resetting - if (!reset || !animationOpts.animateRotate) { - if (index === 0) { - model.startAngle = opts.rotation; - } else { - model.startAngle = me.getMeta().data[index - 1]._model.endAngle; - } - - model.endAngle = model.startAngle + model.circumference; - } - - arc.pivot(); - }, - - calculateTotal: function() { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var total = 0; - var value; - - helpers$1.each(meta.data, function(element, index) { - value = dataset.data[index]; - if (!isNaN(value) && !element.hidden) { - total += Math.abs(value); - } - }); - - /* if (total === 0) { - total = NaN; - }*/ - - return total; - }, - - calculateCircumference: function(value) { - var total = this.getMeta().total; - if (total > 0 && !isNaN(value)) { - return (Math.PI * 2.0) * (Math.abs(value) / total); - } - return 0; - }, - - // gets the max border or hover width to properly scale pie charts - getMaxBorderWidth: function(arcs) { - var me = this; - var max = 0; - var chart = me.chart; - var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth; - - if (!arcs) { - // Find the outmost visible dataset - for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { - if (chart.isDatasetVisible(i)) { - meta = chart.getDatasetMeta(i); - arcs = meta.data; - if (i !== me.index) { - controller = meta.controller; - } - break; - } - } - } - - if (!arcs) { - return 0; - } - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - arc = arcs[i]; - options = controller ? controller._resolveElementOptions(arc, i) : arc._options; - if (options.borderAlign !== 'inner') { - borderWidth = options.borderWidth; - hoverWidth = options.hoverBorderWidth; - - max = borderWidth > max ? borderWidth : max; - max = hoverWidth > max ? hoverWidth : max; - } - } - return max; - }, - - /** - * @protected - */ - setHoverStyle: function(arc) { - var model = arc._model; - var options = arc._options; - var getHoverColor = helpers$1.getHoverColor; - - arc.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - }; - - model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth); - }, - - /** - * @private - */ - _resolveElementOptions: function(arc, index) { - var me = this; - var chart = me.chart; - var dataset = me.getDataset(); - var custom = arc.custom || {}; - var options = chart.options.elements.arc; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var keys = [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'borderAlign', - 'hoverBackgroundColor', - 'hoverBorderColor', - 'hoverBorderWidth', - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$3([ - custom[key], - dataset[key], - options[key] - ], context, index); - } - - return values; - }, - - /** - * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly - * @private - */ - _getRingWeightOffset: function(datasetIndex) { - var ringWeightOffset = 0; - - for (var i = 0; i < datasetIndex; ++i) { - if (this.chart.isDatasetVisible(i)) { - ringWeightOffset += this._getRingWeight(i); - } - } - - return ringWeightOffset; - }, - - /** - * @private - */ - _getRingWeight: function(dataSetIndex) { - return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0); - }, - - /** - * Returns the sum of all visibile data set weights. This value can be 0. - * @private - */ - _getVisibleDatasetWeightTotal: function() { - return this._getRingWeightOffset(this.chart.data.datasets.length); - } -}); - -core_defaults._set('horizontalBar', { - hover: { - mode: 'index', - axis: 'y' - }, - - scales: { - xAxes: [{ - type: 'linear', - position: 'bottom' - }], - - yAxes: [{ - type: 'category', - position: 'left', - categoryPercentage: 0.8, - barPercentage: 0.9, - offset: true, - gridLines: { - offsetGridLines: true - } - }] - }, - - elements: { - rectangle: { - borderSkipped: 'left' - } - }, - - tooltips: { - mode: 'index', - axis: 'y' - } -}); - -var controller_horizontalBar = controller_bar.extend({ - /** - * @private - */ - _getValueScaleId: function() { - return this.getMeta().xAxisID; - }, - - /** - * @private - */ - _getIndexScaleId: function() { - return this.getMeta().yAxisID; - } -}); - -var valueOrDefault$5 = helpers$1.valueOrDefault; -var resolve$4 = helpers$1.options.resolve; -var isPointInArea = helpers$1.canvas._isPointInArea; - -core_defaults._set('line', { - showLines: true, - spanGaps: false, - - hover: { - mode: 'label' - }, - - scales: { - xAxes: [{ - type: 'category', - id: 'x-axis-0' - }], - yAxes: [{ - type: 'linear', - id: 'y-axis-0' - }] - } -}); - -function lineEnabled(dataset, options) { - return valueOrDefault$5(dataset.showLine, options.showLines); -} - -var controller_line = core_datasetController.extend({ - - datasetElementType: elements.Line, - - dataElementType: elements.Point, - - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var line = meta.dataset; - var points = meta.data || []; - var scale = me.getScaleForId(meta.yAxisID); - var dataset = me.getDataset(); - var showLine = lineEnabled(dataset, me.chart.options); - var i, ilen; - - // Update Line - if (showLine) { - // Compatibility: If the properties are defined with only the old name, use those values - if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { - dataset.lineTension = dataset.tension; - } - - // Utility - line._scale = scale; - line._datasetIndex = me.index; - // Data - line._children = points; - // Model - line._model = me._resolveLineOptions(line); - - line.pivot(); - } - - // Update Points - for (i = 0, ilen = points.length; i < ilen; ++i) { - me.updateElement(points[i], i, reset); - } - - if (showLine && line._model.tension !== 0) { - me.updateBezierControlPoints(); - } - - // Now pivot the point for animation - for (i = 0, ilen = points.length; i < ilen; ++i) { - points[i].pivot(); - } - }, - - updateElement: function(point, index, reset) { - var me = this; - var meta = me.getMeta(); - var custom = point.custom || {}; - var dataset = me.getDataset(); - var datasetIndex = me.index; - var value = dataset.data[index]; - var yScale = me.getScaleForId(meta.yAxisID); - var xScale = me.getScaleForId(meta.xAxisID); - var lineModel = meta.dataset._model; - var x, y; - - var options = me._resolvePointOptions(point, index); - - x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); - y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); - - // Utility - point._xScale = xScale; - point._yScale = yScale; - point._options = options; - point._datasetIndex = datasetIndex; - point._index = index; - - // Desired view properties - point._model = { - x: x, - y: y, - skip: custom.skip || isNaN(x) || isNaN(y), - // Appearance - radius: options.radius, - pointStyle: options.pointStyle, - rotation: options.rotation, - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0), - steppedLine: lineModel ? lineModel.steppedLine : false, - // Tooltip - hitRadius: options.hitRadius - }; - }, - - /** - * @private - */ - _resolvePointOptions: function(element, index) { - var me = this; - var chart = me.chart; - var dataset = chart.data.datasets[me.index]; - var custom = element.custom || {}; - var options = chart.options.elements.point; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var ELEMENT_OPTIONS = { - backgroundColor: 'pointBackgroundColor', - borderColor: 'pointBorderColor', - borderWidth: 'pointBorderWidth', - hitRadius: 'pointHitRadius', - hoverBackgroundColor: 'pointHoverBackgroundColor', - hoverBorderColor: 'pointHoverBorderColor', - hoverBorderWidth: 'pointHoverBorderWidth', - hoverRadius: 'pointHoverRadius', - pointStyle: 'pointStyle', - radius: 'pointRadius', - rotation: 'pointRotation' - }; - var keys = Object.keys(ELEMENT_OPTIONS); - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$4([ - custom[key], - dataset[ELEMENT_OPTIONS[key]], - dataset[key], - options[key] - ], context, index); - } - - return values; - }, - - /** - * @private - */ - _resolveLineOptions: function(element) { - var me = this; - var chart = me.chart; - var dataset = chart.data.datasets[me.index]; - var custom = element.custom || {}; - var options = chart.options; - var elementOptions = options.elements.line; - var values = {}; - var i, ilen, key; - - var keys = [ - 'backgroundColor', - 'borderWidth', - 'borderColor', - 'borderCapStyle', - 'borderDash', - 'borderDashOffset', - 'borderJoinStyle', - 'fill', - 'cubicInterpolationMode' - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$4([ - custom[key], - dataset[key], - elementOptions[key] - ]); - } - - // The default behavior of lines is to break at null values, according - // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 - // This option gives lines the ability to span gaps - values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps); - values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension); - values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]); - - return values; - }, - - calculatePointY: function(value, index, datasetIndex) { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var yScale = me.getScaleForId(meta.yAxisID); - var sumPos = 0; - var sumNeg = 0; - var i, ds, dsMeta; - - if (yScale.options.stacked) { - for (i = 0; i < datasetIndex; i++) { - ds = chart.data.datasets[i]; - dsMeta = chart.getDatasetMeta(i); - if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { - var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); - if (stackedRightValue < 0) { - sumNeg += stackedRightValue || 0; - } else { - sumPos += stackedRightValue || 0; - } - } - } - - var rightValue = Number(yScale.getRightValue(value)); - if (rightValue < 0) { - return yScale.getPixelForValue(sumNeg + rightValue); - } - return yScale.getPixelForValue(sumPos + rightValue); - } - - return yScale.getPixelForValue(value); - }, - - updateBezierControlPoints: function() { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var lineModel = meta.dataset._model; - var area = chart.chartArea; - var points = meta.data || []; - var i, ilen, model, controlPoints; - - // Only consider points that are drawn in case the spanGaps option is used - if (lineModel.spanGaps) { - points = points.filter(function(pt) { - return !pt._model.skip; - }); - } - - function capControlPoint(pt, min, max) { - return Math.max(Math.min(pt, max), min); - } - - if (lineModel.cubicInterpolationMode === 'monotone') { - helpers$1.splineCurveMonotone(points); - } else { - for (i = 0, ilen = points.length; i < ilen; ++i) { - model = points[i]._model; - controlPoints = helpers$1.splineCurve( - helpers$1.previousItem(points, i)._model, - model, - helpers$1.nextItem(points, i)._model, - lineModel.tension - ); - model.controlPointPreviousX = controlPoints.previous.x; - model.controlPointPreviousY = controlPoints.previous.y; - model.controlPointNextX = controlPoints.next.x; - model.controlPointNextY = controlPoints.next.y; - } - } - - if (chart.options.elements.line.capBezierPoints) { - for (i = 0, ilen = points.length; i < ilen; ++i) { - model = points[i]._model; - if (isPointInArea(model, area)) { - if (i > 0 && isPointInArea(points[i - 1]._model, area)) { - model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); - model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); - } - if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) { - model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); - model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); - } - } - } - } - }, - - draw: function() { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var points = meta.data || []; - var area = chart.chartArea; - var ilen = points.length; - var halfBorderWidth; - var i = 0; - - if (lineEnabled(me.getDataset(), chart.options)) { - halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2; - - helpers$1.canvas.clipArea(chart.ctx, { - left: area.left, - right: area.right, - top: area.top - halfBorderWidth, - bottom: area.bottom + halfBorderWidth - }); - - meta.dataset.draw(); - - helpers$1.canvas.unclipArea(chart.ctx); - } - - // Draw the points - for (; i < ilen; ++i) { - points[i].draw(area); - } - }, - - /** - * @protected - */ - setHoverStyle: function(point) { - var model = point._model; - var options = point._options; - var getHoverColor = helpers$1.getHoverColor; - - point.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - radius: model.radius - }; - - model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth); - model.radius = valueOrDefault$5(options.hoverRadius, options.radius); - }, -}); - -var resolve$5 = helpers$1.options.resolve; - -core_defaults._set('polarArea', { - scale: { - type: 'radialLinear', - angleLines: { - display: false - }, - gridLines: { - circular: true - }, - pointLabels: { - display: false - }, - ticks: { - beginAtZero: true - } - }, - - // Boolean - Whether to animate the rotation of the chart - animation: { - animateRotate: true, - animateScale: true - }, - - startAngle: -0.5 * Math.PI, - legendCallback: function(chart) { - var text = []; - text.push('
    '); - - var data = chart.data; - var datasets = data.datasets; - var labels = data.labels; - - if (datasets.length) { - for (var i = 0; i < datasets[0].data.length; ++i) { - text.push('
  • '); - if (labels[i]) { - text.push(labels[i]); - } - text.push('
  • '); - } - } - - text.push('
'); - return text.join(''); - }, - legend: { - labels: { - generateLabels: function(chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function(label, i) { - var meta = chart.getDatasetMeta(0); - var ds = data.datasets[0]; - var arc = meta.data[i]; - var custom = arc.custom || {}; - var arcOpts = chart.options.elements.arc; - var fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); - var stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); - var bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); - - return { - text: label, - fillStyle: fill, - strokeStyle: stroke, - lineWidth: bw, - hidden: isNaN(ds.data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }); - } - return []; - } - }, - - onClick: function(e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - meta.data[index].hidden = !meta.data[index].hidden; - } - - chart.update(); - } - }, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function() { - return ''; - }, - label: function(item, data) { - return data.labels[item.index] + ': ' + item.yLabel; - } - } - } -}); - -var controller_polarArea = core_datasetController.extend({ - - dataElementType: elements.Arc, - - linkScales: helpers$1.noop, - - update: function(reset) { - var me = this; - var dataset = me.getDataset(); - var meta = me.getMeta(); - var start = me.chart.options.startAngle || 0; - var starts = me._starts = []; - var angles = me._angles = []; - var arcs = meta.data; - var i, ilen, angle; - - me._updateRadius(); - - meta.count = me.countVisibleElements(); - - for (i = 0, ilen = dataset.data.length; i < ilen; i++) { - starts[i] = start; - angle = me._computeAngle(i); - angles[i] = angle; - start += angle; - } - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - arcs[i]._options = me._resolveElementOptions(arcs[i], i); - me.updateElement(arcs[i], i, reset); - } - }, - - /** - * @private - */ - _updateRadius: function() { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); - - chart.outerRadius = Math.max(minSize / 2, 0); - chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); - chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); - - me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); - me.innerRadius = me.outerRadius - chart.radiusLength; - }, - - updateElement: function(arc, index, reset) { - var me = this; - var chart = me.chart; - var dataset = me.getDataset(); - var opts = chart.options; - var animationOpts = opts.animation; - var scale = chart.scale; - var labels = chart.data.labels; - - var centerX = scale.xCenter; - var centerY = scale.yCenter; - - // var negHalfPI = -0.5 * Math.PI; - var datasetStartAngle = opts.startAngle; - var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); - var startAngle = me._starts[index]; - var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]); - - var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); - var options = arc._options || {}; - - helpers$1.extend(arc, { - // Utility - _datasetIndex: me.index, - _index: index, - _scale: scale, - - // Desired view properties - _model: { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - borderAlign: options.borderAlign, - x: centerX, - y: centerY, - innerRadius: 0, - outerRadius: reset ? resetRadius : distance, - startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, - endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, - label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index]) - } - }); - - arc.pivot(); - }, - - countVisibleElements: function() { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var count = 0; - - helpers$1.each(meta.data, function(element, index) { - if (!isNaN(dataset.data[index]) && !element.hidden) { - count++; - } - }); - - return count; - }, - - /** - * @protected - */ - setHoverStyle: function(arc) { - var model = arc._model; - var options = arc._options; - var getHoverColor = helpers$1.getHoverColor; - var valueOrDefault = helpers$1.valueOrDefault; - - arc.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - }; - - model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth); - }, - - /** - * @private - */ - _resolveElementOptions: function(arc, index) { - var me = this; - var chart = me.chart; - var dataset = me.getDataset(); - var custom = arc.custom || {}; - var options = chart.options.elements.arc; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var keys = [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'borderAlign', - 'hoverBackgroundColor', - 'hoverBorderColor', - 'hoverBorderWidth', - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$5([ - custom[key], - dataset[key], - options[key] - ], context, index); - } - - return values; - }, - - /** - * @private - */ - _computeAngle: function(index) { - var me = this; - var count = this.getMeta().count; - var dataset = me.getDataset(); - var meta = me.getMeta(); - - if (isNaN(dataset.data[index]) || meta.data[index].hidden) { - return 0; - } - - // Scriptable options - var context = { - chart: me.chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - return resolve$5([ - me.chart.options.elements.arc.angle, - (2 * Math.PI) / count - ], context, index); - } -}); - -core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut)); -core_defaults._set('pie', { - cutoutPercentage: 0 -}); - -// Pie charts are Doughnut chart with different defaults -var controller_pie = controller_doughnut; - -var valueOrDefault$6 = helpers$1.valueOrDefault; -var resolve$6 = helpers$1.options.resolve; - -core_defaults._set('radar', { - scale: { - type: 'radialLinear' - }, - elements: { - line: { - tension: 0 // no bezier in radar - } - } -}); - -var controller_radar = core_datasetController.extend({ - - datasetElementType: elements.Line, - - dataElementType: elements.Point, - - linkScales: helpers$1.noop, - - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var line = meta.dataset; - var points = meta.data || []; - var scale = me.chart.scale; - var dataset = me.getDataset(); - var i, ilen; - - // Compatibility: If the properties are defined with only the old name, use those values - if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { - dataset.lineTension = dataset.tension; - } - - // Utility - line._scale = scale; - line._datasetIndex = me.index; - // Data - line._children = points; - line._loop = true; - // Model - line._model = me._resolveLineOptions(line); - - line.pivot(); - - // Update Points - for (i = 0, ilen = points.length; i < ilen; ++i) { - me.updateElement(points[i], i, reset); - } - - // Update bezier control points - me.updateBezierControlPoints(); - - // Now pivot the point for animation - for (i = 0, ilen = points.length; i < ilen; ++i) { - points[i].pivot(); - } - }, - - updateElement: function(point, index, reset) { - var me = this; - var custom = point.custom || {}; - var dataset = me.getDataset(); - var scale = me.chart.scale; - var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); - var options = me._resolvePointOptions(point, index); - var lineModel = me.getMeta().dataset._model; - var x = reset ? scale.xCenter : pointPosition.x; - var y = reset ? scale.yCenter : pointPosition.y; - - // Utility - point._scale = scale; - point._options = options; - point._datasetIndex = me.index; - point._index = index; - - // Desired view properties - point._model = { - x: x, // value not used in dataset scale, but we want a consistent API between scales - y: y, - skip: custom.skip || isNaN(x) || isNaN(y), - // Appearance - radius: options.radius, - pointStyle: options.pointStyle, - rotation: options.rotation, - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0), - - // Tooltip - hitRadius: options.hitRadius - }; - }, - - /** - * @private - */ - _resolvePointOptions: function(element, index) { - var me = this; - var chart = me.chart; - var dataset = chart.data.datasets[me.index]; - var custom = element.custom || {}; - var options = chart.options.elements.point; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var ELEMENT_OPTIONS = { - backgroundColor: 'pointBackgroundColor', - borderColor: 'pointBorderColor', - borderWidth: 'pointBorderWidth', - hitRadius: 'pointHitRadius', - hoverBackgroundColor: 'pointHoverBackgroundColor', - hoverBorderColor: 'pointHoverBorderColor', - hoverBorderWidth: 'pointHoverBorderWidth', - hoverRadius: 'pointHoverRadius', - pointStyle: 'pointStyle', - radius: 'pointRadius', - rotation: 'pointRotation' - }; - var keys = Object.keys(ELEMENT_OPTIONS); - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$6([ - custom[key], - dataset[ELEMENT_OPTIONS[key]], - dataset[key], - options[key] - ], context, index); - } - - return values; - }, - - /** - * @private - */ - _resolveLineOptions: function(element) { - var me = this; - var chart = me.chart; - var dataset = chart.data.datasets[me.index]; - var custom = element.custom || {}; - var options = chart.options.elements.line; - var values = {}; - var i, ilen, key; - - var keys = [ - 'backgroundColor', - 'borderWidth', - 'borderColor', - 'borderCapStyle', - 'borderDash', - 'borderDashOffset', - 'borderJoinStyle', - 'fill' - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$6([ - custom[key], - dataset[key], - options[key] - ]); - } - - values.tension = valueOrDefault$6(dataset.lineTension, options.tension); - - return values; - }, - - updateBezierControlPoints: function() { - var me = this; - var meta = me.getMeta(); - var area = me.chart.chartArea; - var points = meta.data || []; - var i, ilen, model, controlPoints; - - function capControlPoint(pt, min, max) { - return Math.max(Math.min(pt, max), min); - } - - for (i = 0, ilen = points.length; i < ilen; ++i) { - model = points[i]._model; - controlPoints = helpers$1.splineCurve( - helpers$1.previousItem(points, i, true)._model, - model, - helpers$1.nextItem(points, i, true)._model, - model.tension - ); - - // Prevent the bezier going outside of the bounds of the graph - model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right); - model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom); - model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right); - model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom); - } - }, - - setHoverStyle: function(point) { - var model = point._model; - var options = point._options; - var getHoverColor = helpers$1.getHoverColor; - - point.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - radius: model.radius - }; - - model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth); - model.radius = valueOrDefault$6(options.hoverRadius, options.radius); - } -}); - -core_defaults._set('scatter', { - hover: { - mode: 'single' - }, - - scales: { - xAxes: [{ - id: 'x-axis-1', // need an ID so datasets can reference the scale - type: 'linear', // scatter should not use a category axis - position: 'bottom' - }], - yAxes: [{ - id: 'y-axis-1', - type: 'linear', - position: 'left' - }] - }, - - showLines: false, - - tooltips: { - callbacks: { - title: function() { - return ''; // doesn't make sense for scatter since data are formatted as a point - }, - label: function(item) { - return '(' + item.xLabel + ', ' + item.yLabel + ')'; - } - } - } -}); - -// Scatter charts use line controllers -var controller_scatter = controller_line; - -// NOTE export a map in which the key represents the controller type, not -// the class, and so must be CamelCase in order to be correctly retrieved -// by the controller in core.controller.js (`controllers[meta.type]`). - -var controllers = { - bar: controller_bar, - bubble: controller_bubble, - doughnut: controller_doughnut, - horizontalBar: controller_horizontalBar, - line: controller_line, - polarArea: controller_polarArea, - pie: controller_pie, - radar: controller_radar, - scatter: controller_scatter -}; - -/** - * Helper function to get relative position for an event - * @param {Event|IEvent} event - The event to get the position for - * @param {Chart} chart - The chart - * @returns {object} the event position - */ -function getRelativePosition(e, chart) { - if (e.native) { - return { - x: e.x, - y: e.y - }; - } - - return helpers$1.getRelativePosition(e, chart); -} - -/** - * Helper function to traverse all of the visible elements in the chart - * @param {Chart} chart - the chart - * @param {function} handler - the callback to execute for each visible item - */ -function parseVisibleItems(chart, handler) { - var datasets = chart.data.datasets; - var meta, i, j, ilen, jlen; - - for (i = 0, ilen = datasets.length; i < ilen; ++i) { - if (!chart.isDatasetVisible(i)) { - continue; - } - - meta = chart.getDatasetMeta(i); - for (j = 0, jlen = meta.data.length; j < jlen; ++j) { - var element = meta.data[j]; - if (!element._view.skip) { - handler(element); - } - } - } -} - -/** - * Helper function to get the items that intersect the event position - * @param {ChartElement[]} items - elements to filter - * @param {object} position - the point to be nearest to - * @return {ChartElement[]} the nearest items - */ -function getIntersectItems(chart, position) { - var elements = []; - - parseVisibleItems(chart, function(element) { - if (element.inRange(position.x, position.y)) { - elements.push(element); - } - }); - - return elements; -} - -/** - * Helper function to get the items nearest to the event position considering all visible items in teh chart - * @param {Chart} chart - the chart to look at elements from - * @param {object} position - the point to be nearest to - * @param {boolean} intersect - if true, only consider items that intersect the position - * @param {function} distanceMetric - function to provide the distance between points - * @return {ChartElement[]} the nearest items - */ -function getNearestItems(chart, position, intersect, distanceMetric) { - var minDistance = Number.POSITIVE_INFINITY; - var nearestItems = []; - - parseVisibleItems(chart, function(element) { - if (intersect && !element.inRange(position.x, position.y)) { - return; - } - - var center = element.getCenterPoint(); - var distance = distanceMetric(position, center); - if (distance < minDistance) { - nearestItems = [element]; - minDistance = distance; - } else if (distance === minDistance) { - // Can have multiple items at the same distance in which case we sort by size - nearestItems.push(element); - } - }); - - return nearestItems; -} - -/** - * Get a distance metric function for two points based on the - * axis mode setting - * @param {string} axis - the axis mode. x|y|xy - */ -function getDistanceMetricForAxis(axis) { - var useX = axis.indexOf('x') !== -1; - var useY = axis.indexOf('y') !== -1; - - return function(pt1, pt2) { - var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; - var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; - return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); - }; -} - -function indexMode(chart, e, options) { - var position = getRelativePosition(e, chart); - // Default axis for index mode is 'x' to match old behaviour - options.axis = options.axis || 'x'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); - var elements = []; - - if (!items.length) { - return []; - } - - chart.data.datasets.forEach(function(dataset, datasetIndex) { - if (chart.isDatasetVisible(datasetIndex)) { - var meta = chart.getDatasetMeta(datasetIndex); - var element = meta.data[items[0]._index]; - - // don't count items that are skipped (null data) - if (element && !element._view.skip) { - elements.push(element); - } - } - }); - - return elements; -} - -/** - * @interface IInteractionOptions - */ -/** - * If true, only consider items that intersect the point - * @name IInterfaceOptions#boolean - * @type Boolean - */ - -/** - * Contains interaction related functions - * @namespace Chart.Interaction - */ -var core_interaction = { - // Helper function for different modes - modes: { - single: function(chart, e) { - var position = getRelativePosition(e, chart); - var elements = []; - - parseVisibleItems(chart, function(element) { - if (element.inRange(position.x, position.y)) { - elements.push(element); - return elements; - } - }); - - return elements.slice(0, 1); - }, - - /** - * @function Chart.Interaction.modes.label - * @deprecated since version 2.4.0 - * @todo remove at version 3 - * @private - */ - label: indexMode, - - /** - * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something - * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item - * @function Chart.Interaction.modes.index - * @since v2.4.0 - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use during interaction - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - index: indexMode, - - /** - * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something - * If the options.intersect is false, we find the nearest item and return the items in that dataset - * @function Chart.Interaction.modes.dataset - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use during interaction - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - dataset: function(chart, e, options) { - var position = getRelativePosition(e, chart); - options.axis = options.axis || 'xy'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); - - if (items.length > 0) { - items = chart.getDatasetMeta(items[0]._datasetIndex).data; - } - - return items; - }, - - /** - * @function Chart.Interaction.modes.x-axis - * @deprecated since version 2.4.0. Use index mode and intersect == true - * @todo remove at version 3 - * @private - */ - 'x-axis': function(chart, e) { - return indexMode(chart, e, {intersect: false}); - }, - - /** - * Point mode returns all elements that hit test based on the event position - * of the event - * @function Chart.Interaction.modes.intersect - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - point: function(chart, e) { - var position = getRelativePosition(e, chart); - return getIntersectItems(chart, position); - }, - - /** - * nearest mode returns the element closest to the point - * @function Chart.Interaction.modes.intersect - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - nearest: function(chart, e, options) { - var position = getRelativePosition(e, chart); - options.axis = options.axis || 'xy'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - return getNearestItems(chart, position, options.intersect, distanceMetric); - }, - - /** - * x mode returns the elements that hit-test at the current x coordinate - * @function Chart.Interaction.modes.x - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - x: function(chart, e, options) { - var position = getRelativePosition(e, chart); - var items = []; - var intersectsItem = false; - - parseVisibleItems(chart, function(element) { - if (element.inXRange(position.x)) { - items.push(element); - } - - if (element.inRange(position.x, position.y)) { - intersectsItem = true; - } - }); - - // If we want to trigger on an intersect and we don't have any items - // that intersect the position, return nothing - if (options.intersect && !intersectsItem) { - items = []; - } - return items; - }, - - /** - * y mode returns the elements that hit-test at the current y coordinate - * @function Chart.Interaction.modes.y - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - y: function(chart, e, options) { - var position = getRelativePosition(e, chart); - var items = []; - var intersectsItem = false; - - parseVisibleItems(chart, function(element) { - if (element.inYRange(position.y)) { - items.push(element); - } - - if (element.inRange(position.x, position.y)) { - intersectsItem = true; - } - }); - - // If we want to trigger on an intersect and we don't have any items - // that intersect the position, return nothing - if (options.intersect && !intersectsItem) { - items = []; - } - return items; - } - } -}; - -function filterByPosition(array, position) { - return helpers$1.where(array, function(v) { - return v.position === position; - }); -} - -function sortByWeight(array, reverse) { - array.forEach(function(v, i) { - v._tmpIndex_ = i; - return v; - }); - array.sort(function(a, b) { - var v0 = reverse ? b : a; - var v1 = reverse ? a : b; - return v0.weight === v1.weight ? - v0._tmpIndex_ - v1._tmpIndex_ : - v0.weight - v1.weight; - }); - array.forEach(function(v) { - delete v._tmpIndex_; - }); -} - -function findMaxPadding(boxes) { - var top = 0; - var left = 0; - var bottom = 0; - var right = 0; - helpers$1.each(boxes, function(box) { - if (box.getPadding) { - var boxPadding = box.getPadding(); - top = Math.max(top, boxPadding.top); - left = Math.max(left, boxPadding.left); - bottom = Math.max(bottom, boxPadding.bottom); - right = Math.max(right, boxPadding.right); - } - }); - return { - top: top, - left: left, - bottom: bottom, - right: right - }; -} - -function addSizeByPosition(boxes, size) { - helpers$1.each(boxes, function(box) { - size[box.position] += box.isHorizontal() ? box.height : box.width; - }); -} - -core_defaults._set('global', { - layout: { - padding: { - top: 0, - right: 0, - bottom: 0, - left: 0 - } - } -}); - -/** - * @interface ILayoutItem - * @prop {string} position - The position of the item in the chart layout. Possible values are - * 'left', 'top', 'right', 'bottom', and 'chartArea' - * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area - * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down - * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) - * @prop {function} update - Takes two parameters: width and height. Returns size of item - * @prop {function} getPadding - Returns an object with padding on the edges - * @prop {number} width - Width of item. Must be valid after update() - * @prop {number} height - Height of item. Must be valid after update() - * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update - * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update - * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update - * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update - */ - -// The layout service is very self explanatory. It's responsible for the layout within a chart. -// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need -// It is this service's responsibility of carrying out that layout. -var core_layouts = { - defaults: {}, - - /** - * Register a box to a chart. - * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. - * @param {Chart} chart - the chart to use - * @param {ILayoutItem} item - the item to add to be layed out - */ - addBox: function(chart, item) { - if (!chart.boxes) { - chart.boxes = []; - } - - // initialize item with default values - item.fullWidth = item.fullWidth || false; - item.position = item.position || 'top'; - item.weight = item.weight || 0; - - chart.boxes.push(item); - }, - - /** - * Remove a layoutItem from a chart - * @param {Chart} chart - the chart to remove the box from - * @param {ILayoutItem} layoutItem - the item to remove from the layout - */ - removeBox: function(chart, layoutItem) { - var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; - if (index !== -1) { - chart.boxes.splice(index, 1); - } - }, - - /** - * Sets (or updates) options on the given `item`. - * @param {Chart} chart - the chart in which the item lives (or will be added to) - * @param {ILayoutItem} item - the item to configure with the given options - * @param {object} options - the new item options. - */ - configure: function(chart, item, options) { - var props = ['fullWidth', 'position', 'weight']; - var ilen = props.length; - var i = 0; - var prop; - - for (; i < ilen; ++i) { - prop = props[i]; - if (options.hasOwnProperty(prop)) { - item[prop] = options[prop]; - } - } - }, - - /** - * Fits boxes of the given chart into the given size by having each box measure itself - * then running a fitting algorithm - * @param {Chart} chart - the chart - * @param {number} width - the width to fit into - * @param {number} height - the height to fit into - */ - update: function(chart, width, height) { - if (!chart) { - return; - } - - var layoutOptions = chart.options.layout || {}; - var padding = helpers$1.options.toPadding(layoutOptions.padding); - var leftPadding = padding.left; - var rightPadding = padding.right; - var topPadding = padding.top; - var bottomPadding = padding.bottom; - - var leftBoxes = filterByPosition(chart.boxes, 'left'); - var rightBoxes = filterByPosition(chart.boxes, 'right'); - var topBoxes = filterByPosition(chart.boxes, 'top'); - var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); - var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); - - // Sort boxes by weight. A higher weight is further away from the chart area - sortByWeight(leftBoxes, true); - sortByWeight(rightBoxes, false); - sortByWeight(topBoxes, true); - sortByWeight(bottomBoxes, false); - - var verticalBoxes = leftBoxes.concat(rightBoxes); - var horizontalBoxes = topBoxes.concat(bottomBoxes); - var outerBoxes = verticalBoxes.concat(horizontalBoxes); - - // Essentially we now have any number of boxes on each of the 4 sides. - // Our canvas looks like the following. - // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and - // B1 is the bottom axis - // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays - // These locations are single-box locations only, when trying to register a chartArea location that is already taken, - // an error will be thrown. - // - // |----------------------------------------------------| - // | T1 (Full Width) | - // |----------------------------------------------------| - // | | | T2 | | - // | |----|-------------------------------------|----| - // | | | C1 | | C2 | | - // | | |----| |----| | - // | | | | | - // | L1 | L2 | ChartArea (C0) | R1 | - // | | | | | - // | | |----| |----| | - // | | | C3 | | C4 | | - // | |----|-------------------------------------|----| - // | | | B1 | | - // |----------------------------------------------------| - // | B2 (Full Width) | - // |----------------------------------------------------| - // - // What we do to find the best sizing, we do the following - // 1. Determine the minimum size of the chart area. - // 2. Split the remaining width equally between each vertical axis - // 3. Split the remaining height equally between each horizontal axis - // 4. Give each layout the maximum size it can be. The layout will return it's minimum size - // 5. Adjust the sizes of each axis based on it's minimum reported size. - // 6. Refit each axis - // 7. Position each axis in the final location - // 8. Tell the chart the final location of the chart area - // 9. Tell any axes that overlay the chart area the positions of the chart area - - // Step 1 - var chartWidth = width - leftPadding - rightPadding; - var chartHeight = height - topPadding - bottomPadding; - var chartAreaWidth = chartWidth / 2; // min 50% - - // Step 2 - var verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length; - - // Step 3 - // TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837) - // var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length; - - // Step 4 - var maxChartAreaWidth = chartWidth; - var maxChartAreaHeight = chartHeight; - var outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; - var minBoxSizes = []; - var maxPadding; - - function getMinimumBoxSize(box) { - var minSize; - var isHorizontal = box.isHorizontal(); - - if (isHorizontal) { - minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2); - maxChartAreaHeight -= minSize.height; - } else { - minSize = box.update(verticalBoxWidth, maxChartAreaHeight); - maxChartAreaWidth -= minSize.width; - } - - minBoxSizes.push({ - horizontal: isHorizontal, - width: minSize.width, - box: box, - }); - } - - helpers$1.each(outerBoxes, getMinimumBoxSize); - - // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) - maxPadding = findMaxPadding(outerBoxes); - - // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could - // be if the axes are drawn at their minimum sizes. - // Steps 5 & 6 - - // Function to fit a box - function fitBox(box) { - var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minBox) { - return minBox.box === box; - }); - - if (minBoxSize) { - if (minBoxSize.horizontal) { - var scaleMargin = { - left: Math.max(outerBoxSizes.left, maxPadding.left), - right: Math.max(outerBoxSizes.right, maxPadding.right), - top: 0, - bottom: 0 - }; - - // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends - // on the margin. Sometimes they need to increase in size slightly - box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); - } else { - box.update(minBoxSize.width, maxChartAreaHeight); - } - } - } - - // Update, and calculate the left and right margins for the horizontal boxes - helpers$1.each(verticalBoxes, fitBox); - addSizeByPosition(verticalBoxes, outerBoxSizes); - - // Set the Left and Right margins for the horizontal boxes - helpers$1.each(horizontalBoxes, fitBox); - addSizeByPosition(horizontalBoxes, outerBoxSizes); - - function finalFitVerticalBox(box) { - var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minSize) { - return minSize.box === box; - }); - - var scaleMargin = { - left: 0, - right: 0, - top: outerBoxSizes.top, - bottom: outerBoxSizes.bottom - }; - - if (minBoxSize) { - box.update(minBoxSize.width, maxChartAreaHeight, scaleMargin); - } - } - - // Let the left layout know the final margin - helpers$1.each(verticalBoxes, finalFitVerticalBox); - - // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) - outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; - addSizeByPosition(outerBoxes, outerBoxSizes); - - // We may be adding some padding to account for rotated x axis labels - var leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0); - outerBoxSizes.left += leftPaddingAddition; - outerBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0); - - var topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0); - outerBoxSizes.top += topPaddingAddition; - outerBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 0); - - // Figure out if our chart area changed. This would occur if the dataset layout label rotation - // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do - // without calling `fit` again - var newMaxChartAreaHeight = height - outerBoxSizes.top - outerBoxSizes.bottom; - var newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right; - - if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { - helpers$1.each(verticalBoxes, function(box) { - box.height = newMaxChartAreaHeight; - }); - - helpers$1.each(horizontalBoxes, function(box) { - if (!box.fullWidth) { - box.width = newMaxChartAreaWidth; - } - }); - - maxChartAreaHeight = newMaxChartAreaHeight; - maxChartAreaWidth = newMaxChartAreaWidth; - } - - // Step 7 - Position the boxes - var left = leftPadding + leftPaddingAddition; - var top = topPadding + topPaddingAddition; - - function placeBox(box) { - if (box.isHorizontal()) { - box.left = box.fullWidth ? leftPadding : outerBoxSizes.left; - box.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + maxChartAreaWidth; - box.top = top; - box.bottom = top + box.height; - - // Move to next point - top = box.bottom; - - } else { - - box.left = left; - box.right = left + box.width; - box.top = outerBoxSizes.top; - box.bottom = outerBoxSizes.top + maxChartAreaHeight; - - // Move to next point - left = box.right; - } - } - - helpers$1.each(leftBoxes.concat(topBoxes), placeBox); - - // Account for chart width and height - left += maxChartAreaWidth; - top += maxChartAreaHeight; - - helpers$1.each(rightBoxes, placeBox); - helpers$1.each(bottomBoxes, placeBox); - - // Step 8 - chart.chartArea = { - left: outerBoxSizes.left, - top: outerBoxSizes.top, - right: outerBoxSizes.left + maxChartAreaWidth, - bottom: outerBoxSizes.top + maxChartAreaHeight - }; - - // Step 9 - helpers$1.each(chartAreaBoxes, function(box) { - box.left = chart.chartArea.left; - box.top = chart.chartArea.top; - box.right = chart.chartArea.right; - box.bottom = chart.chartArea.bottom; - - box.update(maxChartAreaWidth, maxChartAreaHeight); - }); - } -}; - -/** - * Platform fallback implementation (minimal). - * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 - */ - -var platform_basic = { - acquireContext: function(item) { - if (item && item.canvas) { - // Support for any object associated to a canvas (including a context2d) - item = item.canvas; - } - - return item && item.getContext('2d') || null; - } -}; - -var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n"; - -var platform_dom$1 = /*#__PURE__*/Object.freeze({ -default: platform_dom -}); - -function getCjsExportFromNamespace (n) { - return n && n.default || n; -} - -var stylesheet = getCjsExportFromNamespace(platform_dom$1); - -var EXPANDO_KEY = '$chartjs'; -var CSS_PREFIX = 'chartjs-'; -var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor'; -var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; -var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; -var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; - -/** - * DOM event types -> Chart.js event types. - * Note: only events with different types are mapped. - * @see https://developer.mozilla.org/en-US/docs/Web/Events - */ -var EVENT_TYPES = { - touchstart: 'mousedown', - touchmove: 'mousemove', - touchend: 'mouseup', - pointerenter: 'mouseenter', - pointerdown: 'mousedown', - pointermove: 'mousemove', - pointerup: 'mouseup', - pointerleave: 'mouseout', - pointerout: 'mouseout' -}; - -/** - * The "used" size is the final value of a dimension property after all calculations have - * been performed. This method uses the computed style of `element` but returns undefined - * if the computed style is not expressed in pixels. That can happen in some cases where - * `element` has a size relative to its parent and this last one is not yet displayed, - * for example because of `display: none` on a parent node. - * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value - * @returns {number} Size in pixels or undefined if unknown. - */ -function readUsedSize(element, property) { - var value = helpers$1.getStyle(element, property); - var matches = value && value.match(/^(\d+)(\.\d+)?px$/); - return matches ? Number(matches[1]) : undefined; -} - -/** - * Initializes the canvas style and render size without modifying the canvas display size, - * since responsiveness is handled by the controller.resize() method. The config is used - * to determine the aspect ratio to apply in case no explicit height has been specified. - */ -function initCanvas(canvas, config) { - var style = canvas.style; - - // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it - // returns null or '' if no explicit value has been set to the canvas attribute. - var renderHeight = canvas.getAttribute('height'); - var renderWidth = canvas.getAttribute('width'); - - // Chart.js modifies some canvas values that we want to restore on destroy - canvas[EXPANDO_KEY] = { - initial: { - height: renderHeight, - width: renderWidth, - style: { - display: style.display, - height: style.height, - width: style.width - } - } - }; - - // Force canvas to display as block to avoid extra space caused by inline - // elements, which would interfere with the responsive resize process. - // https://github.com/chartjs/Chart.js/issues/2538 - style.display = style.display || 'block'; - - if (renderWidth === null || renderWidth === '') { - var displayWidth = readUsedSize(canvas, 'width'); - if (displayWidth !== undefined) { - canvas.width = displayWidth; - } - } - - if (renderHeight === null || renderHeight === '') { - if (canvas.style.height === '') { - // If no explicit render height and style height, let's apply the aspect ratio, - // which one can be specified by the user but also by charts as default option - // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. - canvas.height = canvas.width / (config.options.aspectRatio || 2); - } else { - var displayHeight = readUsedSize(canvas, 'height'); - if (displayWidth !== undefined) { - canvas.height = displayHeight; - } - } - } - - return canvas; -} - -/** - * Detects support for options object argument in addEventListener. - * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support - * @private - */ -var supportsEventListenerOptions = (function() { - var supports = false; - try { - var options = Object.defineProperty({}, 'passive', { - // eslint-disable-next-line getter-return - get: function() { - supports = true; - } - }); - window.addEventListener('e', null, options); - } catch (e) { - // continue regardless of error - } - return supports; -}()); - -// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. -// https://github.com/chartjs/Chart.js/issues/4287 -var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; - -function addListener(node, type, listener) { - node.addEventListener(type, listener, eventListenerOptions); -} - -function removeListener(node, type, listener) { - node.removeEventListener(type, listener, eventListenerOptions); -} - -function createEvent(type, chart, x, y, nativeEvent) { - return { - type: type, - chart: chart, - native: nativeEvent || null, - x: x !== undefined ? x : null, - y: y !== undefined ? y : null, - }; -} - -function fromNativeEvent(event, chart) { - var type = EVENT_TYPES[event.type] || event.type; - var pos = helpers$1.getRelativePosition(event, chart); - return createEvent(type, chart, pos.x, pos.y, event); -} - -function throttled(fn, thisArg) { - var ticking = false; - var args = []; - - return function() { - args = Array.prototype.slice.call(arguments); - thisArg = thisArg || this; - - if (!ticking) { - ticking = true; - helpers$1.requestAnimFrame.call(window, function() { - ticking = false; - fn.apply(thisArg, args); - }); - } - }; -} - -function createDiv(cls) { - var el = document.createElement('div'); - el.className = cls || ''; - return el; -} - -// Implementation based on https://github.com/marcj/css-element-queries -function createResizer(handler) { - var maxSize = 1000000; - - // NOTE(SB) Don't use innerHTML because it could be considered unsafe. - // https://github.com/chartjs/Chart.js/issues/5902 - var resizer = createDiv(CSS_SIZE_MONITOR); - var expand = createDiv(CSS_SIZE_MONITOR + '-expand'); - var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink'); - - expand.appendChild(createDiv()); - shrink.appendChild(createDiv()); - - resizer.appendChild(expand); - resizer.appendChild(shrink); - resizer._reset = function() { - expand.scrollLeft = maxSize; - expand.scrollTop = maxSize; - shrink.scrollLeft = maxSize; - shrink.scrollTop = maxSize; - }; - - var onScroll = function() { - resizer._reset(); - handler(); - }; - - addListener(expand, 'scroll', onScroll.bind(expand, 'expand')); - addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); - - return resizer; -} - -// https://davidwalsh.name/detect-node-insertion -function watchForRender(node, handler) { - var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); - var proxy = expando.renderProxy = function(e) { - if (e.animationName === CSS_RENDER_ANIMATION) { - handler(); - } - }; - - helpers$1.each(ANIMATION_START_EVENTS, function(type) { - addListener(node, type, proxy); - }); - - // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class - // is removed then added back immediately (same animation frame?). Accessing the - // `offsetParent` property will force a reflow and re-evaluate the CSS animation. - // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics - // https://github.com/chartjs/Chart.js/issues/4737 - expando.reflow = !!node.offsetParent; - - node.classList.add(CSS_RENDER_MONITOR); -} - -function unwatchForRender(node) { - var expando = node[EXPANDO_KEY] || {}; - var proxy = expando.renderProxy; - - if (proxy) { - helpers$1.each(ANIMATION_START_EVENTS, function(type) { - removeListener(node, type, proxy); - }); - - delete expando.renderProxy; - } - - node.classList.remove(CSS_RENDER_MONITOR); -} - -function addResizeListener(node, listener, chart) { - var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); - - // Let's keep track of this added resizer and thus avoid DOM query when removing it. - var resizer = expando.resizer = createResizer(throttled(function() { - if (expando.resizer) { - var container = chart.options.maintainAspectRatio && node.parentNode; - var w = container ? container.clientWidth : 0; - listener(createEvent('resize', chart)); - if (container && container.clientWidth < w && chart.canvas) { - // If the container size shrank during chart resize, let's assume - // scrollbar appeared. So we resize again with the scrollbar visible - - // effectively making chart smaller and the scrollbar hidden again. - // Because we are inside `throttled`, and currently `ticking`, scroll - // events are ignored during this whole 2 resize process. - // If we assumed wrong and something else happened, we are resizing - // twice in a frame (potential performance issue) - listener(createEvent('resize', chart)); - } - } - })); - - // The resizer needs to be attached to the node parent, so we first need to be - // sure that `node` is attached to the DOM before injecting the resizer element. - watchForRender(node, function() { - if (expando.resizer) { - var container = node.parentNode; - if (container && container !== resizer.parentNode) { - container.insertBefore(resizer, container.firstChild); - } - - // The container size might have changed, let's reset the resizer state. - resizer._reset(); - } - }); -} - -function removeResizeListener(node) { - var expando = node[EXPANDO_KEY] || {}; - var resizer = expando.resizer; - - delete expando.resizer; - unwatchForRender(node); - - if (resizer && resizer.parentNode) { - resizer.parentNode.removeChild(resizer); - } -} - -function injectCSS(platform, css) { - // https://stackoverflow.com/q/3922139 - var style = platform._style || document.createElement('style'); - if (!platform._style) { - platform._style = style; - css = '/* Chart.js */\n' + css; - style.setAttribute('type', 'text/css'); - document.getElementsByTagName('head')[0].appendChild(style); - } - - style.appendChild(document.createTextNode(css)); -} - -var platform_dom$2 = { - /** - * When `true`, prevents the automatic injection of the stylesheet required to - * correctly detect when the chart is added to the DOM and then resized. This - * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`) - * to be manually imported to make this library compatible with any CSP. - * See https://github.com/chartjs/Chart.js/issues/5208 - */ - disableCSSInjection: false, - - /** - * This property holds whether this platform is enabled for the current environment. - * Currently used by platform.js to select the proper implementation. - * @private - */ - _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', - - /** - * @private - */ - _ensureLoaded: function() { - if (this._loaded) { - return; - } - - this._loaded = true; - - // https://github.com/chartjs/Chart.js/issues/5208 - if (!this.disableCSSInjection) { - injectCSS(this, stylesheet); - } - }, - - acquireContext: function(item, config) { - if (typeof item === 'string') { - item = document.getElementById(item); - } else if (item.length) { - // Support for array based queries (such as jQuery) - item = item[0]; - } - - if (item && item.canvas) { - // Support for any object associated to a canvas (including a context2d) - item = item.canvas; - } - - // To prevent canvas fingerprinting, some add-ons undefine the getContext - // method, for example: https://github.com/kkapsner/CanvasBlocker - // https://github.com/chartjs/Chart.js/issues/2807 - var context = item && item.getContext && item.getContext('2d'); - - // Load platform resources on first chart creation, to make possible to change - // platform options after importing the library (e.g. `disableCSSInjection`). - this._ensureLoaded(); - - // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is - // inside an iframe or when running in a protected environment. We could guess the - // types from their toString() value but let's keep things flexible and assume it's - // a sufficient condition if the item has a context2D which has item as `canvas`. - // https://github.com/chartjs/Chart.js/issues/3887 - // https://github.com/chartjs/Chart.js/issues/4102 - // https://github.com/chartjs/Chart.js/issues/4152 - if (context && context.canvas === item) { - initCanvas(item, config); - return context; - } - - return null; - }, - - releaseContext: function(context) { - var canvas = context.canvas; - if (!canvas[EXPANDO_KEY]) { - return; - } - - var initial = canvas[EXPANDO_KEY].initial; - ['height', 'width'].forEach(function(prop) { - var value = initial[prop]; - if (helpers$1.isNullOrUndef(value)) { - canvas.removeAttribute(prop); - } else { - canvas.setAttribute(prop, value); - } - }); - - helpers$1.each(initial.style || {}, function(value, key) { - canvas.style[key] = value; - }); - - // The canvas render size might have been changed (and thus the state stack discarded), - // we can't use save() and restore() to restore the initial state. So make sure that at - // least the canvas context is reset to the default state by setting the canvas width. - // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html - // eslint-disable-next-line no-self-assign - canvas.width = canvas.width; - - delete canvas[EXPANDO_KEY]; - }, - - addEventListener: function(chart, type, listener) { - var canvas = chart.canvas; - if (type === 'resize') { - // Note: the resize event is not supported on all browsers. - addResizeListener(canvas, listener, chart); - return; - } - - var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); - var proxies = expando.proxies || (expando.proxies = {}); - var proxy = proxies[chart.id + '_' + type] = function(event) { - listener(fromNativeEvent(event, chart)); - }; - - addListener(canvas, type, proxy); - }, - - removeEventListener: function(chart, type, listener) { - var canvas = chart.canvas; - if (type === 'resize') { - // Note: the resize event is not supported on all browsers. - removeResizeListener(canvas); - return; - } - - var expando = listener[EXPANDO_KEY] || {}; - var proxies = expando.proxies || {}; - var proxy = proxies[chart.id + '_' + type]; - if (!proxy) { - return; - } - - removeListener(canvas, type, proxy); - } -}; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use EventTarget.addEventListener instead. - * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ - * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener - * @function Chart.helpers.addEvent - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers$1.addEvent = addListener; - -/** - * Provided for backward compatibility, use EventTarget.removeEventListener instead. - * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ - * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener - * @function Chart.helpers.removeEvent - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers$1.removeEvent = removeListener; - -// @TODO Make possible to select another platform at build time. -var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic; - -/** - * @namespace Chart.platform - * @see https://chartjs.gitbooks.io/proposals/content/Platform.html - * @since 2.4.0 - */ -var platform = helpers$1.extend({ - /** - * @since 2.7.0 - */ - initialize: function() {}, - - /** - * Called at chart construction time, returns a context2d instance implementing - * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. - * @param {*} item - The native item from which to acquire context (platform specific) - * @param {object} options - The chart options - * @returns {CanvasRenderingContext2D} context2d instance - */ - acquireContext: function() {}, - - /** - * Called at chart destruction time, releases any resources associated to the context - * previously returned by the acquireContext() method. - * @param {CanvasRenderingContext2D} context - The context2d instance - * @returns {boolean} true if the method succeeded, else false - */ - releaseContext: function() {}, - - /** - * Registers the specified listener on the given chart. - * @param {Chart} chart - Chart from which to listen for event - * @param {string} type - The ({@link IEvent}) type to listen for - * @param {function} listener - Receives a notification (an object that implements - * the {@link IEvent} interface) when an event of the specified type occurs. - */ - addEventListener: function() {}, - - /** - * Removes the specified listener previously registered with addEventListener. - * @param {Chart} chart - Chart from which to remove the listener - * @param {string} type - The ({@link IEvent}) type to remove - * @param {function} listener - The listener function to remove from the event target. - */ - removeEventListener: function() {} - -}, implementation); - -core_defaults._set('global', { - plugins: {} -}); - -/** - * The plugin service singleton - * @namespace Chart.plugins - * @since 2.1.0 - */ -var core_plugins = { - /** - * Globally registered plugins. - * @private - */ - _plugins: [], - - /** - * This identifier is used to invalidate the descriptors cache attached to each chart - * when a global plugin is registered or unregistered. In this case, the cache ID is - * incremented and descriptors are regenerated during following API calls. - * @private - */ - _cacheId: 0, - - /** - * Registers the given plugin(s) if not already registered. - * @param {IPlugin[]|IPlugin} plugins plugin instance(s). - */ - register: function(plugins) { - var p = this._plugins; - ([]).concat(plugins).forEach(function(plugin) { - if (p.indexOf(plugin) === -1) { - p.push(plugin); - } - }); - - this._cacheId++; - }, - - /** - * Unregisters the given plugin(s) only if registered. - * @param {IPlugin[]|IPlugin} plugins plugin instance(s). - */ - unregister: function(plugins) { - var p = this._plugins; - ([]).concat(plugins).forEach(function(plugin) { - var idx = p.indexOf(plugin); - if (idx !== -1) { - p.splice(idx, 1); - } - }); - - this._cacheId++; - }, - - /** - * Remove all registered plugins. - * @since 2.1.5 - */ - clear: function() { - this._plugins = []; - this._cacheId++; - }, - - /** - * Returns the number of registered plugins? - * @returns {number} - * @since 2.1.5 - */ - count: function() { - return this._plugins.length; - }, - - /** - * Returns all registered plugin instances. - * @returns {IPlugin[]} array of plugin objects. - * @since 2.1.5 - */ - getAll: function() { - return this._plugins; - }, - - /** - * Calls enabled plugins for `chart` on the specified hook and with the given args. - * This method immediately returns as soon as a plugin explicitly returns false. The - * returned value can be used, for instance, to interrupt the current action. - * @param {Chart} chart - The chart instance for which plugins should be called. - * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). - * @param {Array} [args] - Extra arguments to apply to the hook call. - * @returns {boolean} false if any of the plugins return false, else returns true. - */ - notify: function(chart, hook, args) { - var descriptors = this.descriptors(chart); - var ilen = descriptors.length; - var i, descriptor, plugin, params, method; - - for (i = 0; i < ilen; ++i) { - descriptor = descriptors[i]; - plugin = descriptor.plugin; - method = plugin[hook]; - if (typeof method === 'function') { - params = [chart].concat(args || []); - params.push(descriptor.options); - if (method.apply(plugin, params) === false) { - return false; - } - } - } - - return true; - }, - - /** - * Returns descriptors of enabled plugins for the given chart. - * @returns {object[]} [{ plugin, options }] - * @private - */ - descriptors: function(chart) { - var cache = chart.$plugins || (chart.$plugins = {}); - if (cache.id === this._cacheId) { - return cache.descriptors; - } - - var plugins = []; - var descriptors = []; - var config = (chart && chart.config) || {}; - var options = (config.options && config.options.plugins) || {}; - - this._plugins.concat(config.plugins || []).forEach(function(plugin) { - var idx = plugins.indexOf(plugin); - if (idx !== -1) { - return; - } - - var id = plugin.id; - var opts = options[id]; - if (opts === false) { - return; - } - - if (opts === true) { - opts = helpers$1.clone(core_defaults.global.plugins[id]); - } - - plugins.push(plugin); - descriptors.push({ - plugin: plugin, - options: opts || {} - }); - }); - - cache.descriptors = descriptors; - cache.id = this._cacheId; - return descriptors; - }, - - /** - * Invalidates cache for the given chart: descriptors hold a reference on plugin option, - * but in some cases, this reference can be changed by the user when updating options. - * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 - * @private - */ - _invalidate: function(chart) { - delete chart.$plugins; - } -}; - -var core_scaleService = { - // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then - // use the new chart options to grab the correct scale - constructors: {}, - // Use a registration function so that we can move to an ES6 map when we no longer need to support - // old browsers - - // Scale config defaults - defaults: {}, - registerScaleType: function(type, scaleConstructor, scaleDefaults) { - this.constructors[type] = scaleConstructor; - this.defaults[type] = helpers$1.clone(scaleDefaults); - }, - getScaleConstructor: function(type) { - return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; - }, - getScaleDefaults: function(type) { - // Return the scale defaults merged with the global settings so that we always use the latest ones - return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {}; - }, - updateScaleDefaults: function(type, additions) { - var me = this; - if (me.defaults.hasOwnProperty(type)) { - me.defaults[type] = helpers$1.extend(me.defaults[type], additions); - } - }, - addScalesToLayout: function(chart) { - // Adds each scale to the chart.boxes array to be sized accordingly - helpers$1.each(chart.scales, function(scale) { - // Set ILayoutItem parameters for backwards compatibility - scale.fullWidth = scale.options.fullWidth; - scale.position = scale.options.position; - scale.weight = scale.options.weight; - core_layouts.addBox(chart, scale); - }); - } -}; - -var valueOrDefault$7 = helpers$1.valueOrDefault; - -core_defaults._set('global', { - tooltips: { - enabled: true, - custom: null, - mode: 'nearest', - position: 'average', - intersect: true, - backgroundColor: 'rgba(0,0,0,0.8)', - titleFontStyle: 'bold', - titleSpacing: 2, - titleMarginBottom: 6, - titleFontColor: '#fff', - titleAlign: 'left', - bodySpacing: 2, - bodyFontColor: '#fff', - bodyAlign: 'left', - footerFontStyle: 'bold', - footerSpacing: 2, - footerMarginTop: 6, - footerFontColor: '#fff', - footerAlign: 'left', - yPadding: 6, - xPadding: 6, - caretPadding: 2, - caretSize: 5, - cornerRadius: 6, - multiKeyBackground: '#fff', - displayColors: true, - borderColor: 'rgba(0,0,0,0)', - borderWidth: 0, - callbacks: { - // Args are: (tooltipItems, data) - beforeTitle: helpers$1.noop, - title: function(tooltipItems, data) { - var title = ''; - var labels = data.labels; - var labelCount = labels ? labels.length : 0; - - if (tooltipItems.length > 0) { - var item = tooltipItems[0]; - if (item.label) { - title = item.label; - } else if (item.xLabel) { - title = item.xLabel; - } else if (labelCount > 0 && item.index < labelCount) { - title = labels[item.index]; - } - } - - return title; - }, - afterTitle: helpers$1.noop, - - // Args are: (tooltipItems, data) - beforeBody: helpers$1.noop, - - // Args are: (tooltipItem, data) - beforeLabel: helpers$1.noop, - label: function(tooltipItem, data) { - var label = data.datasets[tooltipItem.datasetIndex].label || ''; - - if (label) { - label += ': '; - } - if (!helpers$1.isNullOrUndef(tooltipItem.value)) { - label += tooltipItem.value; - } else { - label += tooltipItem.yLabel; - } - return label; - }, - labelColor: function(tooltipItem, chart) { - var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); - var activeElement = meta.data[tooltipItem.index]; - var view = activeElement._view; - return { - borderColor: view.borderColor, - backgroundColor: view.backgroundColor - }; - }, - labelTextColor: function() { - return this._options.bodyFontColor; - }, - afterLabel: helpers$1.noop, - - // Args are: (tooltipItems, data) - afterBody: helpers$1.noop, - - // Args are: (tooltipItems, data) - beforeFooter: helpers$1.noop, - footer: helpers$1.noop, - afterFooter: helpers$1.noop - } - } -}); - -var positioners = { - /** - * Average mode places the tooltip at the average position of the elements shown - * @function Chart.Tooltip.positioners.average - * @param elements {ChartElement[]} the elements being displayed in the tooltip - * @returns {object} tooltip position - */ - average: function(elements) { - if (!elements.length) { - return false; - } - - var i, len; - var x = 0; - var y = 0; - var count = 0; - - for (i = 0, len = elements.length; i < len; ++i) { - var el = elements[i]; - if (el && el.hasValue()) { - var pos = el.tooltipPosition(); - x += pos.x; - y += pos.y; - ++count; - } - } - - return { - x: x / count, - y: y / count - }; - }, - - /** - * Gets the tooltip position nearest of the item nearest to the event position - * @function Chart.Tooltip.positioners.nearest - * @param elements {Chart.Element[]} the tooltip elements - * @param eventPosition {object} the position of the event in canvas coordinates - * @returns {object} the tooltip position - */ - nearest: function(elements, eventPosition) { - var x = eventPosition.x; - var y = eventPosition.y; - var minDistance = Number.POSITIVE_INFINITY; - var i, len, nearestElement; - - for (i = 0, len = elements.length; i < len; ++i) { - var el = elements[i]; - if (el && el.hasValue()) { - var center = el.getCenterPoint(); - var d = helpers$1.distanceBetweenPoints(eventPosition, center); - - if (d < minDistance) { - minDistance = d; - nearestElement = el; - } - } - } - - if (nearestElement) { - var tp = nearestElement.tooltipPosition(); - x = tp.x; - y = tp.y; - } - - return { - x: x, - y: y - }; - } -}; - -// Helper to push or concat based on if the 2nd parameter is an array or not -function pushOrConcat(base, toPush) { - if (toPush) { - if (helpers$1.isArray(toPush)) { - // base = base.concat(toPush); - Array.prototype.push.apply(base, toPush); - } else { - base.push(toPush); - } - } - - return base; -} - -/** - * Returns array of strings split by newline - * @param {string} value - The value to split by newline. - * @returns {string[]} value if newline present - Returned from String split() method - * @function - */ -function splitNewlines(str) { - if ((typeof str === 'string' || str instanceof String) && str.indexOf('\n') > -1) { - return str.split('\n'); - } - return str; -} - - -/** - * Private helper to create a tooltip item model - * @param element - the chart element (point, arc, bar) to create the tooltip item for - * @return new tooltip item - */ -function createTooltipItem(element) { - var xScale = element._xScale; - var yScale = element._yScale || element._scale; // handle radar || polarArea charts - var index = element._index; - var datasetIndex = element._datasetIndex; - var controller = element._chart.getDatasetMeta(datasetIndex).controller; - var indexScale = controller._getIndexScale(); - var valueScale = controller._getValueScale(); - - return { - xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', - yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', - label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '', - value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '', - index: index, - datasetIndex: datasetIndex, - x: element._model.x, - y: element._model.y - }; -} - -/** - * Helper to get the reset model for the tooltip - * @param tooltipOpts {object} the tooltip options - */ -function getBaseModel(tooltipOpts) { - var globalDefaults = core_defaults.global; - - return { - // Positioning - xPadding: tooltipOpts.xPadding, - yPadding: tooltipOpts.yPadding, - xAlign: tooltipOpts.xAlign, - yAlign: tooltipOpts.yAlign, - - // Body - bodyFontColor: tooltipOpts.bodyFontColor, - _bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), - _bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), - _bodyAlign: tooltipOpts.bodyAlign, - bodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), - bodySpacing: tooltipOpts.bodySpacing, - - // Title - titleFontColor: tooltipOpts.titleFontColor, - _titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), - _titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), - titleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), - _titleAlign: tooltipOpts.titleAlign, - titleSpacing: tooltipOpts.titleSpacing, - titleMarginBottom: tooltipOpts.titleMarginBottom, - - // Footer - footerFontColor: tooltipOpts.footerFontColor, - _footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), - _footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), - footerFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), - _footerAlign: tooltipOpts.footerAlign, - footerSpacing: tooltipOpts.footerSpacing, - footerMarginTop: tooltipOpts.footerMarginTop, - - // Appearance - caretSize: tooltipOpts.caretSize, - cornerRadius: tooltipOpts.cornerRadius, - backgroundColor: tooltipOpts.backgroundColor, - opacity: 0, - legendColorBackground: tooltipOpts.multiKeyBackground, - displayColors: tooltipOpts.displayColors, - borderColor: tooltipOpts.borderColor, - borderWidth: tooltipOpts.borderWidth - }; -} - -/** - * Get the size of the tooltip - */ -function getTooltipSize(tooltip, model) { - var ctx = tooltip._chart.ctx; - - var height = model.yPadding * 2; // Tooltip Padding - var width = 0; - - // Count of all lines in the body - var body = model.body; - var combinedBodyLength = body.reduce(function(count, bodyItem) { - return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; - }, 0); - combinedBodyLength += model.beforeBody.length + model.afterBody.length; - - var titleLineCount = model.title.length; - var footerLineCount = model.footer.length; - var titleFontSize = model.titleFontSize; - var bodyFontSize = model.bodyFontSize; - var footerFontSize = model.footerFontSize; - - height += titleLineCount * titleFontSize; // Title Lines - height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing - height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin - height += combinedBodyLength * bodyFontSize; // Body Lines - height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing - height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin - height += footerLineCount * (footerFontSize); // Footer Lines - height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing - - // Title width - var widthPadding = 0; - var maxLineWidth = function(line) { - width = Math.max(width, ctx.measureText(line).width + widthPadding); - }; - - ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); - helpers$1.each(model.title, maxLineWidth); - - // Body width - ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); - helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth); - - // Body lines may include some extra width due to the color box - widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; - helpers$1.each(body, function(bodyItem) { - helpers$1.each(bodyItem.before, maxLineWidth); - helpers$1.each(bodyItem.lines, maxLineWidth); - helpers$1.each(bodyItem.after, maxLineWidth); - }); - - // Reset back to 0 - widthPadding = 0; - - // Footer width - ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); - helpers$1.each(model.footer, maxLineWidth); - - // Add padding - width += 2 * model.xPadding; - - return { - width: width, - height: height - }; -} - -/** - * Helper to get the alignment of a tooltip given the size - */ -function determineAlignment(tooltip, size) { - var model = tooltip._model; - var chart = tooltip._chart; - var chartArea = tooltip._chart.chartArea; - var xAlign = 'center'; - var yAlign = 'center'; - - if (model.y < size.height) { - yAlign = 'top'; - } else if (model.y > (chart.height - size.height)) { - yAlign = 'bottom'; - } - - var lf, rf; // functions to determine left, right alignment - var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart - var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges - var midX = (chartArea.left + chartArea.right) / 2; - var midY = (chartArea.top + chartArea.bottom) / 2; - - if (yAlign === 'center') { - lf = function(x) { - return x <= midX; - }; - rf = function(x) { - return x > midX; - }; - } else { - lf = function(x) { - return x <= (size.width / 2); - }; - rf = function(x) { - return x >= (chart.width - (size.width / 2)); - }; - } - - olf = function(x) { - return x + size.width + model.caretSize + model.caretPadding > chart.width; - }; - orf = function(x) { - return x - size.width - model.caretSize - model.caretPadding < 0; - }; - yf = function(y) { - return y <= midY ? 'top' : 'bottom'; - }; - - if (lf(model.x)) { - xAlign = 'left'; - - // Is tooltip too wide and goes over the right side of the chart.? - if (olf(model.x)) { - xAlign = 'center'; - yAlign = yf(model.y); - } - } else if (rf(model.x)) { - xAlign = 'right'; - - // Is tooltip too wide and goes outside left edge of canvas? - if (orf(model.x)) { - xAlign = 'center'; - yAlign = yf(model.y); - } - } - - var opts = tooltip._options; - return { - xAlign: opts.xAlign ? opts.xAlign : xAlign, - yAlign: opts.yAlign ? opts.yAlign : yAlign - }; -} - -/** - * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment - */ -function getBackgroundPoint(vm, size, alignment, chart) { - // Background Position - var x = vm.x; - var y = vm.y; - - var caretSize = vm.caretSize; - var caretPadding = vm.caretPadding; - var cornerRadius = vm.cornerRadius; - var xAlign = alignment.xAlign; - var yAlign = alignment.yAlign; - var paddingAndSize = caretSize + caretPadding; - var radiusAndPadding = cornerRadius + caretPadding; - - if (xAlign === 'right') { - x -= size.width; - } else if (xAlign === 'center') { - x -= (size.width / 2); - if (x + size.width > chart.width) { - x = chart.width - size.width; - } - if (x < 0) { - x = 0; - } - } - - if (yAlign === 'top') { - y += paddingAndSize; - } else if (yAlign === 'bottom') { - y -= size.height + paddingAndSize; - } else { - y -= (size.height / 2); - } - - if (yAlign === 'center') { - if (xAlign === 'left') { - x += paddingAndSize; - } else if (xAlign === 'right') { - x -= paddingAndSize; - } - } else if (xAlign === 'left') { - x -= radiusAndPadding; - } else if (xAlign === 'right') { - x += radiusAndPadding; - } - - return { - x: x, - y: y - }; -} - -function getAlignedX(vm, align) { - return align === 'center' - ? vm.x + vm.width / 2 - : align === 'right' - ? vm.x + vm.width - vm.xPadding - : vm.x + vm.xPadding; -} - -/** - * Helper to build before and after body lines - */ -function getBeforeAfterBodyLines(callback) { - return pushOrConcat([], splitNewlines(callback)); -} - -var exports$3 = core_element.extend({ - initialize: function() { - this._model = getBaseModel(this._options); - this._lastActive = []; - }, - - // Get the title - // Args are: (tooltipItem, data) - getTitle: function() { - var me = this; - var opts = me._options; - var callbacks = opts.callbacks; - - var beforeTitle = callbacks.beforeTitle.apply(me, arguments); - var title = callbacks.title.apply(me, arguments); - var afterTitle = callbacks.afterTitle.apply(me, arguments); - - var lines = []; - lines = pushOrConcat(lines, splitNewlines(beforeTitle)); - lines = pushOrConcat(lines, splitNewlines(title)); - lines = pushOrConcat(lines, splitNewlines(afterTitle)); - - return lines; - }, - - // Args are: (tooltipItem, data) - getBeforeBody: function() { - return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments)); - }, - - // Args are: (tooltipItem, data) - getBody: function(tooltipItems, data) { - var me = this; - var callbacks = me._options.callbacks; - var bodyItems = []; - - helpers$1.each(tooltipItems, function(tooltipItem) { - var bodyItem = { - before: [], - lines: [], - after: [] - }; - pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data))); - pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); - pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data))); - - bodyItems.push(bodyItem); - }); - - return bodyItems; - }, - - // Args are: (tooltipItem, data) - getAfterBody: function() { - return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments)); - }, - - // Get the footer and beforeFooter and afterFooter lines - // Args are: (tooltipItem, data) - getFooter: function() { - var me = this; - var callbacks = me._options.callbacks; - - var beforeFooter = callbacks.beforeFooter.apply(me, arguments); - var footer = callbacks.footer.apply(me, arguments); - var afterFooter = callbacks.afterFooter.apply(me, arguments); - - var lines = []; - lines = pushOrConcat(lines, splitNewlines(beforeFooter)); - lines = pushOrConcat(lines, splitNewlines(footer)); - lines = pushOrConcat(lines, splitNewlines(afterFooter)); - - return lines; - }, - - update: function(changed) { - var me = this; - var opts = me._options; - - // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition - // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time - // which breaks any animations. - var existingModel = me._model; - var model = me._model = getBaseModel(opts); - var active = me._active; - - var data = me._data; - - // In the case where active.length === 0 we need to keep these at existing values for good animations - var alignment = { - xAlign: existingModel.xAlign, - yAlign: existingModel.yAlign - }; - var backgroundPoint = { - x: existingModel.x, - y: existingModel.y - }; - var tooltipSize = { - width: existingModel.width, - height: existingModel.height - }; - var tooltipPosition = { - x: existingModel.caretX, - y: existingModel.caretY - }; - - var i, len; - - if (active.length) { - model.opacity = 1; - - var labelColors = []; - var labelTextColors = []; - tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition); - - var tooltipItems = []; - for (i = 0, len = active.length; i < len; ++i) { - tooltipItems.push(createTooltipItem(active[i])); - } - - // If the user provided a filter function, use it to modify the tooltip items - if (opts.filter) { - tooltipItems = tooltipItems.filter(function(a) { - return opts.filter(a, data); - }); - } - - // If the user provided a sorting function, use it to modify the tooltip items - if (opts.itemSort) { - tooltipItems = tooltipItems.sort(function(a, b) { - return opts.itemSort(a, b, data); - }); - } - - // Determine colors for boxes - helpers$1.each(tooltipItems, function(tooltipItem) { - labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); - labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); - }); - - - // Build the Text Lines - model.title = me.getTitle(tooltipItems, data); - model.beforeBody = me.getBeforeBody(tooltipItems, data); - model.body = me.getBody(tooltipItems, data); - model.afterBody = me.getAfterBody(tooltipItems, data); - model.footer = me.getFooter(tooltipItems, data); - - // Initial positioning and colors - model.x = tooltipPosition.x; - model.y = tooltipPosition.y; - model.caretPadding = opts.caretPadding; - model.labelColors = labelColors; - model.labelTextColors = labelTextColors; - - // data points - model.dataPoints = tooltipItems; - - // We need to determine alignment of the tooltip - tooltipSize = getTooltipSize(this, model); - alignment = determineAlignment(this, tooltipSize); - // Final Size and Position - backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart); - } else { - model.opacity = 0; - } - - model.xAlign = alignment.xAlign; - model.yAlign = alignment.yAlign; - model.x = backgroundPoint.x; - model.y = backgroundPoint.y; - model.width = tooltipSize.width; - model.height = tooltipSize.height; - - // Point where the caret on the tooltip points to - model.caretX = tooltipPosition.x; - model.caretY = tooltipPosition.y; - - me._model = model; - - if (changed && opts.custom) { - opts.custom.call(me, model); - } - - return me; - }, - - drawCaret: function(tooltipPoint, size) { - var ctx = this._chart.ctx; - var vm = this._view; - var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); - - ctx.lineTo(caretPosition.x1, caretPosition.y1); - ctx.lineTo(caretPosition.x2, caretPosition.y2); - ctx.lineTo(caretPosition.x3, caretPosition.y3); - }, - getCaretPosition: function(tooltipPoint, size, vm) { - var x1, x2, x3, y1, y2, y3; - var caretSize = vm.caretSize; - var cornerRadius = vm.cornerRadius; - var xAlign = vm.xAlign; - var yAlign = vm.yAlign; - var ptX = tooltipPoint.x; - var ptY = tooltipPoint.y; - var width = size.width; - var height = size.height; - - if (yAlign === 'center') { - y2 = ptY + (height / 2); - - if (xAlign === 'left') { - x1 = ptX; - x2 = x1 - caretSize; - x3 = x1; - - y1 = y2 + caretSize; - y3 = y2 - caretSize; - } else { - x1 = ptX + width; - x2 = x1 + caretSize; - x3 = x1; - - y1 = y2 - caretSize; - y3 = y2 + caretSize; - } - } else { - if (xAlign === 'left') { - x2 = ptX + cornerRadius + (caretSize); - x1 = x2 - caretSize; - x3 = x2 + caretSize; - } else if (xAlign === 'right') { - x2 = ptX + width - cornerRadius - caretSize; - x1 = x2 - caretSize; - x3 = x2 + caretSize; - } else { - x2 = vm.caretX; - x1 = x2 - caretSize; - x3 = x2 + caretSize; - } - if (yAlign === 'top') { - y1 = ptY; - y2 = y1 - caretSize; - y3 = y1; - } else { - y1 = ptY + height; - y2 = y1 + caretSize; - y3 = y1; - // invert drawing order - var tmp = x3; - x3 = x1; - x1 = tmp; - } - } - return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; - }, - - drawTitle: function(pt, vm, ctx) { - var title = vm.title; - - if (title.length) { - pt.x = getAlignedX(vm, vm._titleAlign); - - ctx.textAlign = vm._titleAlign; - ctx.textBaseline = 'top'; - - var titleFontSize = vm.titleFontSize; - var titleSpacing = vm.titleSpacing; - - ctx.fillStyle = vm.titleFontColor; - ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); - - var i, len; - for (i = 0, len = title.length; i < len; ++i) { - ctx.fillText(title[i], pt.x, pt.y); - pt.y += titleFontSize + titleSpacing; // Line Height and spacing - - if (i + 1 === title.length) { - pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing - } - } - } - }, - - drawBody: function(pt, vm, ctx) { - var bodyFontSize = vm.bodyFontSize; - var bodySpacing = vm.bodySpacing; - var bodyAlign = vm._bodyAlign; - var body = vm.body; - var drawColorBoxes = vm.displayColors; - var labelColors = vm.labelColors; - var xLinePadding = 0; - var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0; - var textColor; - - ctx.textAlign = bodyAlign; - ctx.textBaseline = 'top'; - ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); - - pt.x = getAlignedX(vm, bodyAlign); - - // Before Body - var fillLineOfText = function(line) { - ctx.fillText(line, pt.x + xLinePadding, pt.y); - pt.y += bodyFontSize + bodySpacing; - }; - - // Before body lines - ctx.fillStyle = vm.bodyFontColor; - helpers$1.each(vm.beforeBody, fillLineOfText); - - xLinePadding = drawColorBoxes && bodyAlign !== 'right' - ? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2) - : 0; - - // Draw body lines now - helpers$1.each(body, function(bodyItem, i) { - textColor = vm.labelTextColors[i]; - ctx.fillStyle = textColor; - helpers$1.each(bodyItem.before, fillLineOfText); - - helpers$1.each(bodyItem.lines, function(line) { - // Draw Legend-like boxes if needed - if (drawColorBoxes) { - // Fill a white rect so that colours merge nicely if the opacity is < 1 - ctx.fillStyle = vm.legendColorBackground; - ctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize); - - // Border - ctx.lineWidth = 1; - ctx.strokeStyle = labelColors[i].borderColor; - ctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize); - - // Inner square - ctx.fillStyle = labelColors[i].backgroundColor; - ctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); - ctx.fillStyle = textColor; - } - - fillLineOfText(line); - }); - - helpers$1.each(bodyItem.after, fillLineOfText); - }); - - // Reset back to 0 for after body - xLinePadding = 0; - - // After body lines - helpers$1.each(vm.afterBody, fillLineOfText); - pt.y -= bodySpacing; // Remove last body spacing - }, - - drawFooter: function(pt, vm, ctx) { - var footer = vm.footer; - - if (footer.length) { - pt.x = getAlignedX(vm, vm._footerAlign); - pt.y += vm.footerMarginTop; - - ctx.textAlign = vm._footerAlign; - ctx.textBaseline = 'top'; - - ctx.fillStyle = vm.footerFontColor; - ctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); - - helpers$1.each(footer, function(line) { - ctx.fillText(line, pt.x, pt.y); - pt.y += vm.footerFontSize + vm.footerSpacing; - }); - } - }, - - drawBackground: function(pt, vm, ctx, tooltipSize) { - ctx.fillStyle = vm.backgroundColor; - ctx.strokeStyle = vm.borderColor; - ctx.lineWidth = vm.borderWidth; - var xAlign = vm.xAlign; - var yAlign = vm.yAlign; - var x = pt.x; - var y = pt.y; - var width = tooltipSize.width; - var height = tooltipSize.height; - var radius = vm.cornerRadius; - - ctx.beginPath(); - ctx.moveTo(x + radius, y); - if (yAlign === 'top') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x + width - radius, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + radius); - if (yAlign === 'center' && xAlign === 'right') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x + width, y + height - radius); - ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); - if (yAlign === 'bottom') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x + radius, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - radius); - if (yAlign === 'center' && xAlign === 'left') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x, y + radius); - ctx.quadraticCurveTo(x, y, x + radius, y); - ctx.closePath(); - - ctx.fill(); - - if (vm.borderWidth > 0) { - ctx.stroke(); - } - }, - - draw: function() { - var ctx = this._chart.ctx; - var vm = this._view; - - if (vm.opacity === 0) { - return; - } - - var tooltipSize = { - width: vm.width, - height: vm.height - }; - var pt = { - x: vm.x, - y: vm.y - }; - - // IE11/Edge does not like very small opacities, so snap to 0 - var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; - - // Truthy/falsey value for empty tooltip - var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; - - if (this._options.enabled && hasTooltipContent) { - ctx.save(); - ctx.globalAlpha = opacity; - - // Draw Background - this.drawBackground(pt, vm, ctx, tooltipSize); - - // Draw Title, Body, and Footer - pt.y += vm.yPadding; - - // Titles - this.drawTitle(pt, vm, ctx); - - // Body - this.drawBody(pt, vm, ctx); - - // Footer - this.drawFooter(pt, vm, ctx); - - ctx.restore(); - } - }, - - /** - * Handle an event - * @private - * @param {IEvent} event - The event to handle - * @returns {boolean} true if the tooltip changed - */ - handleEvent: function(e) { - var me = this; - var options = me._options; - var changed = false; - - me._lastActive = me._lastActive || []; - - // Find Active Elements for tooltips - if (e.type === 'mouseout') { - me._active = []; - } else { - me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); - } - - // Remember Last Actives - changed = !helpers$1.arrayEquals(me._active, me._lastActive); - - // Only handle target event on tooltip change - if (changed) { - me._lastActive = me._active; - - if (options.enabled || options.custom) { - me._eventPosition = { - x: e.x, - y: e.y - }; - - me.update(true); - me.pivot(); - } - } - - return changed; - } -}); - -/** - * @namespace Chart.Tooltip.positioners - */ -var positioners_1 = positioners; - -var core_tooltip = exports$3; -core_tooltip.positioners = positioners_1; - -var valueOrDefault$8 = helpers$1.valueOrDefault; - -core_defaults._set('global', { - elements: {}, - events: [ - 'mousemove', - 'mouseout', - 'click', - 'touchstart', - 'touchmove' - ], - hover: { - onHover: null, - mode: 'nearest', - intersect: true, - animationDuration: 400 - }, - onClick: null, - maintainAspectRatio: true, - responsive: true, - responsiveAnimationDuration: 0 -}); - -/** - * Recursively merge the given config objects representing the `scales` option - * by incorporating scale defaults in `xAxes` and `yAxes` array items, then - * returns a deep copy of the result, thus doesn't alter inputs. - */ -function mergeScaleConfig(/* config objects ... */) { - return helpers$1.merge({}, [].slice.call(arguments), { - merger: function(key, target, source, options) { - if (key === 'xAxes' || key === 'yAxes') { - var slen = source[key].length; - var i, type, scale; - - if (!target[key]) { - target[key] = []; - } - - for (i = 0; i < slen; ++i) { - scale = source[key][i]; - type = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear'); - - if (i >= target[key].length) { - target[key].push({}); - } - - if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { - // new/untyped scale or type changed: let's apply the new defaults - // then merge source scale to correctly overwrite the defaults. - helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]); - } else { - // scales type are the same - helpers$1.merge(target[key][i], scale); - } - } - } else { - helpers$1._merger(key, target, source, options); - } - } - }); -} - -/** - * Recursively merge the given config objects as the root options by handling - * default scale options for the `scales` and `scale` properties, then returns - * a deep copy of the result, thus doesn't alter inputs. - */ -function mergeConfig(/* config objects ... */) { - return helpers$1.merge({}, [].slice.call(arguments), { - merger: function(key, target, source, options) { - var tval = target[key] || {}; - var sval = source[key]; - - if (key === 'scales') { - // scale config merging is complex. Add our own function here for that - target[key] = mergeScaleConfig(tval, sval); - } else if (key === 'scale') { - // used in polar area & radar charts since there is only one scale - target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]); - } else { - helpers$1._merger(key, target, source, options); - } - } - }); -} - -function initConfig(config) { - config = config || {}; - - // Do NOT use mergeConfig for the data object because this method merges arrays - // and so would change references to labels and datasets, preventing data updates. - var data = config.data = config.data || {}; - data.datasets = data.datasets || []; - data.labels = data.labels || []; - - config.options = mergeConfig( - core_defaults.global, - core_defaults[config.type], - config.options || {}); - - return config; -} - -function updateConfig(chart) { - var newOptions = chart.options; - - helpers$1.each(chart.scales, function(scale) { - core_layouts.removeBox(chart, scale); - }); - - newOptions = mergeConfig( - core_defaults.global, - core_defaults[chart.config.type], - newOptions); - - chart.options = chart.config.options = newOptions; - chart.ensureScalesHaveIDs(); - chart.buildOrUpdateScales(); - - // Tooltip - chart.tooltip._options = newOptions.tooltips; - chart.tooltip.initialize(); -} - -function positionIsHorizontal(position) { - return position === 'top' || position === 'bottom'; -} - -var Chart = function(item, config) { - this.construct(item, config); - return this; -}; - -helpers$1.extend(Chart.prototype, /** @lends Chart */ { - /** - * @private - */ - construct: function(item, config) { - var me = this; - - config = initConfig(config); - - var context = platform.acquireContext(item, config); - var canvas = context && context.canvas; - var height = canvas && canvas.height; - var width = canvas && canvas.width; - - me.id = helpers$1.uid(); - me.ctx = context; - me.canvas = canvas; - me.config = config; - me.width = width; - me.height = height; - me.aspectRatio = height ? width / height : null; - me.options = config.options; - me._bufferedRender = false; - - /** - * Provided for backward compatibility, Chart and Chart.Controller have been merged, - * the "instance" still need to be defined since it might be called from plugins. - * @prop Chart#chart - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ - me.chart = me; - me.controller = me; // chart.chart.controller #inception - - // Add the chart instance to the global namespace - Chart.instances[me.id] = me; - - // Define alias to the config data: `chart.data === chart.config.data` - Object.defineProperty(me, 'data', { - get: function() { - return me.config.data; - }, - set: function(value) { - me.config.data = value; - } - }); - - if (!context || !canvas) { - // The given item is not a compatible context2d element, let's return before finalizing - // the chart initialization but after setting basic chart / controller properties that - // can help to figure out that the chart is not valid (e.g chart.canvas !== null); - // https://github.com/chartjs/Chart.js/issues/2807 - console.error("Failed to create chart: can't acquire context from the given item"); - return; - } - - me.initialize(); - me.update(); - }, - - /** - * @private - */ - initialize: function() { - var me = this; - - // Before init plugin notification - core_plugins.notify(me, 'beforeInit'); - - helpers$1.retinaScale(me, me.options.devicePixelRatio); - - me.bindEvents(); - - if (me.options.responsive) { - // Initial resize before chart draws (must be silent to preserve initial animations). - me.resize(true); - } - - // Make sure scales have IDs and are built before we build any controllers. - me.ensureScalesHaveIDs(); - me.buildOrUpdateScales(); - me.initToolTip(); - - // After init plugin notification - core_plugins.notify(me, 'afterInit'); - - return me; - }, - - clear: function() { - helpers$1.canvas.clear(this); - return this; - }, - - stop: function() { - // Stops any current animation loop occurring - core_animations.cancelAnimation(this); - return this; - }, - - resize: function(silent) { - var me = this; - var options = me.options; - var canvas = me.canvas; - var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; - - // the canvas render width and height will be casted to integers so make sure that - // the canvas display style uses the same integer values to avoid blurring effect. - - // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed - var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas))); - var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas))); - - if (me.width === newWidth && me.height === newHeight) { - return; - } - - canvas.width = me.width = newWidth; - canvas.height = me.height = newHeight; - canvas.style.width = newWidth + 'px'; - canvas.style.height = newHeight + 'px'; - - helpers$1.retinaScale(me, options.devicePixelRatio); - - if (!silent) { - // Notify any plugins about the resize - var newSize = {width: newWidth, height: newHeight}; - core_plugins.notify(me, 'resize', [newSize]); - - // Notify of resize - if (options.onResize) { - options.onResize(me, newSize); - } - - me.stop(); - me.update({ - duration: options.responsiveAnimationDuration - }); - } - }, - - ensureScalesHaveIDs: function() { - var options = this.options; - var scalesOptions = options.scales || {}; - var scaleOptions = options.scale; - - helpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) { - xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); - }); - - helpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) { - yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); - }); - - if (scaleOptions) { - scaleOptions.id = scaleOptions.id || 'scale'; - } - }, - - /** - * Builds a map of scale ID to scale object for future lookup. - */ - buildOrUpdateScales: function() { - var me = this; - var options = me.options; - var scales = me.scales || {}; - var items = []; - var updated = Object.keys(scales).reduce(function(obj, id) { - obj[id] = false; - return obj; - }, {}); - - if (options.scales) { - items = items.concat( - (options.scales.xAxes || []).map(function(xAxisOptions) { - return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; - }), - (options.scales.yAxes || []).map(function(yAxisOptions) { - return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; - }) - ); - } - - if (options.scale) { - items.push({ - options: options.scale, - dtype: 'radialLinear', - isDefault: true, - dposition: 'chartArea' - }); - } - - helpers$1.each(items, function(item) { - var scaleOptions = item.options; - var id = scaleOptions.id; - var scaleType = valueOrDefault$8(scaleOptions.type, item.dtype); - - if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { - scaleOptions.position = item.dposition; - } - - updated[id] = true; - var scale = null; - if (id in scales && scales[id].type === scaleType) { - scale = scales[id]; - scale.options = scaleOptions; - scale.ctx = me.ctx; - scale.chart = me; - } else { - var scaleClass = core_scaleService.getScaleConstructor(scaleType); - if (!scaleClass) { - return; - } - scale = new scaleClass({ - id: id, - type: scaleType, - options: scaleOptions, - ctx: me.ctx, - chart: me - }); - scales[scale.id] = scale; - } - - scale.mergeTicksOptions(); - - // TODO(SB): I think we should be able to remove this custom case (options.scale) - // and consider it as a regular scale part of the "scales"" map only! This would - // make the logic easier and remove some useless? custom code. - if (item.isDefault) { - me.scale = scale; - } - }); - // clear up discarded scales - helpers$1.each(updated, function(hasUpdated, id) { - if (!hasUpdated) { - delete scales[id]; - } - }); - - me.scales = scales; - - core_scaleService.addScalesToLayout(this); - }, - - buildOrUpdateControllers: function() { - var me = this; - var newControllers = []; - - helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { - var meta = me.getDatasetMeta(datasetIndex); - var type = dataset.type || me.config.type; - - if (meta.type && meta.type !== type) { - me.destroyDatasetMeta(datasetIndex); - meta = me.getDatasetMeta(datasetIndex); - } - meta.type = type; - - if (meta.controller) { - meta.controller.updateIndex(datasetIndex); - meta.controller.linkScales(); - } else { - var ControllerClass = controllers[meta.type]; - if (ControllerClass === undefined) { - throw new Error('"' + meta.type + '" is not a chart type.'); - } - - meta.controller = new ControllerClass(me, datasetIndex); - newControllers.push(meta.controller); - } - }, me); - - return newControllers; - }, - - /** - * Reset the elements of all datasets - * @private - */ - resetElements: function() { - var me = this; - helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { - me.getDatasetMeta(datasetIndex).controller.reset(); - }, me); - }, - - /** - * Resets the chart back to it's state before the initial animation - */ - reset: function() { - this.resetElements(); - this.tooltip.initialize(); - }, - - update: function(config) { - var me = this; - - if (!config || typeof config !== 'object') { - // backwards compatibility - config = { - duration: config, - lazy: arguments[1] - }; - } - - updateConfig(me); - - // plugins options references might have change, let's invalidate the cache - // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 - core_plugins._invalidate(me); - - if (core_plugins.notify(me, 'beforeUpdate') === false) { - return; - } - - // In case the entire data object changed - me.tooltip._data = me.data; - - // Make sure dataset controllers are updated and new controllers are reset - var newControllers = me.buildOrUpdateControllers(); - - // Make sure all dataset controllers have correct meta data counts - helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { - me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); - }, me); - - me.updateLayout(); - - // Can only reset the new controllers after the scales have been updated - if (me.options.animation && me.options.animation.duration) { - helpers$1.each(newControllers, function(controller) { - controller.reset(); - }); - } - - me.updateDatasets(); - - // Need to reset tooltip in case it is displayed with elements that are removed - // after update. - me.tooltip.initialize(); - - // Last active contains items that were previously in the tooltip. - // When we reset the tooltip, we need to clear it - me.lastActive = []; - - // Do this before render so that any plugins that need final scale updates can use it - core_plugins.notify(me, 'afterUpdate'); - - if (me._bufferedRender) { - me._bufferedRequest = { - duration: config.duration, - easing: config.easing, - lazy: config.lazy - }; - } else { - me.render(config); - } - }, - - /** - * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` - * hook, in which case, plugins will not be called on `afterLayout`. - * @private - */ - updateLayout: function() { - var me = this; - - if (core_plugins.notify(me, 'beforeLayout') === false) { - return; - } - - core_layouts.update(this, this.width, this.height); - - /** - * Provided for backward compatibility, use `afterLayout` instead. - * @method IPlugin#afterScaleUpdate - * @deprecated since version 2.5.0 - * @todo remove at version 3 - * @private - */ - core_plugins.notify(me, 'afterScaleUpdate'); - core_plugins.notify(me, 'afterLayout'); - }, - - /** - * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` - * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. - * @private - */ - updateDatasets: function() { - var me = this; - - if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) { - return; - } - - for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { - me.updateDataset(i); - } - - core_plugins.notify(me, 'afterDatasetsUpdate'); - }, - - /** - * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` - * hook, in which case, plugins will not be called on `afterDatasetUpdate`. - * @private - */ - updateDataset: function(index) { - var me = this; - var meta = me.getDatasetMeta(index); - var args = { - meta: meta, - index: index - }; - - if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { - return; - } - - meta.controller.update(); - - core_plugins.notify(me, 'afterDatasetUpdate', [args]); - }, - - render: function(config) { - var me = this; - - if (!config || typeof config !== 'object') { - // backwards compatibility - config = { - duration: config, - lazy: arguments[1] - }; - } - - var animationOptions = me.options.animation; - var duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration); - var lazy = config.lazy; - - if (core_plugins.notify(me, 'beforeRender') === false) { - return; - } - - var onComplete = function(animation) { - core_plugins.notify(me, 'afterRender'); - helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me); - }; - - if (animationOptions && duration) { - var animation = new core_animation({ - numSteps: duration / 16.66, // 60 fps - easing: config.easing || animationOptions.easing, - - render: function(chart, animationObject) { - var easingFunction = helpers$1.easing.effects[animationObject.easing]; - var currentStep = animationObject.currentStep; - var stepDecimal = currentStep / animationObject.numSteps; - - chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); - }, - - onAnimationProgress: animationOptions.onProgress, - onAnimationComplete: onComplete - }); - - core_animations.addAnimation(me, animation, duration, lazy); - } else { - me.draw(); - - // See https://github.com/chartjs/Chart.js/issues/3781 - onComplete(new core_animation({numSteps: 0, chart: me})); - } - - return me; - }, - - draw: function(easingValue) { - var me = this; - - me.clear(); - - if (helpers$1.isNullOrUndef(easingValue)) { - easingValue = 1; - } - - me.transition(easingValue); - - if (me.width <= 0 || me.height <= 0) { - return; - } - - if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) { - return; - } - - // Draw all the scales - helpers$1.each(me.boxes, function(box) { - box.draw(me.chartArea); - }, me); - - me.drawDatasets(easingValue); - me._drawTooltip(easingValue); - - core_plugins.notify(me, 'afterDraw', [easingValue]); - }, - - /** - * @private - */ - transition: function(easingValue) { - var me = this; - - for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { - if (me.isDatasetVisible(i)) { - me.getDatasetMeta(i).controller.transition(easingValue); - } - } - - me.tooltip.transition(easingValue); - }, - - /** - * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` - * hook, in which case, plugins will not be called on `afterDatasetsDraw`. - * @private - */ - drawDatasets: function(easingValue) { - var me = this; - - if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { - return; - } - - // Draw datasets reversed to support proper line stacking - for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { - if (me.isDatasetVisible(i)) { - me.drawDataset(i, easingValue); - } - } - - core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]); - }, - - /** - * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` - * hook, in which case, plugins will not be called on `afterDatasetDraw`. - * @private - */ - drawDataset: function(index, easingValue) { - var me = this; - var meta = me.getDatasetMeta(index); - var args = { - meta: meta, - index: index, - easingValue: easingValue - }; - - if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { - return; - } - - meta.controller.draw(easingValue); - - core_plugins.notify(me, 'afterDatasetDraw', [args]); - }, - - /** - * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` - * hook, in which case, plugins will not be called on `afterTooltipDraw`. - * @private - */ - _drawTooltip: function(easingValue) { - var me = this; - var tooltip = me.tooltip; - var args = { - tooltip: tooltip, - easingValue: easingValue - }; - - if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { - return; - } - - tooltip.draw(); - - core_plugins.notify(me, 'afterTooltipDraw', [args]); - }, - - /** - * Get the single element that was clicked on - * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw - */ - getElementAtEvent: function(e) { - return core_interaction.modes.single(this, e); - }, - - getElementsAtEvent: function(e) { - return core_interaction.modes.label(this, e, {intersect: true}); - }, - - getElementsAtXAxis: function(e) { - return core_interaction.modes['x-axis'](this, e, {intersect: true}); - }, - - getElementsAtEventForMode: function(e, mode, options) { - var method = core_interaction.modes[mode]; - if (typeof method === 'function') { - return method(this, e, options); - } - - return []; - }, - - getDatasetAtEvent: function(e) { - return core_interaction.modes.dataset(this, e, {intersect: true}); - }, - - getDatasetMeta: function(datasetIndex) { - var me = this; - var dataset = me.data.datasets[datasetIndex]; - if (!dataset._meta) { - dataset._meta = {}; - } - - var meta = dataset._meta[me.id]; - if (!meta) { - meta = dataset._meta[me.id] = { - type: null, - data: [], - dataset: null, - controller: null, - hidden: null, // See isDatasetVisible() comment - xAxisID: null, - yAxisID: null - }; - } - - return meta; - }, - - getVisibleDatasetCount: function() { - var count = 0; - for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { - if (this.isDatasetVisible(i)) { - count++; - } - } - return count; - }, - - isDatasetVisible: function(datasetIndex) { - var meta = this.getDatasetMeta(datasetIndex); - - // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, - // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. - return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; - }, - - generateLegend: function() { - return this.options.legendCallback(this); - }, - - /** - * @private - */ - destroyDatasetMeta: function(datasetIndex) { - var id = this.id; - var dataset = this.data.datasets[datasetIndex]; - var meta = dataset._meta && dataset._meta[id]; - - if (meta) { - meta.controller.destroy(); - delete dataset._meta[id]; - } - }, - - destroy: function() { - var me = this; - var canvas = me.canvas; - var i, ilen; - - me.stop(); - - // dataset controllers need to cleanup associated data - for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { - me.destroyDatasetMeta(i); - } - - if (canvas) { - me.unbindEvents(); - helpers$1.canvas.clear(me); - platform.releaseContext(me.ctx); - me.canvas = null; - me.ctx = null; - } - - core_plugins.notify(me, 'destroy'); - - delete Chart.instances[me.id]; - }, - - toBase64Image: function() { - return this.canvas.toDataURL.apply(this.canvas, arguments); - }, - - initToolTip: function() { - var me = this; - me.tooltip = new core_tooltip({ - _chart: me, - _chartInstance: me, // deprecated, backward compatibility - _data: me.data, - _options: me.options.tooltips - }, me); - }, - - /** - * @private - */ - bindEvents: function() { - var me = this; - var listeners = me._listeners = {}; - var listener = function() { - me.eventHandler.apply(me, arguments); - }; - - helpers$1.each(me.options.events, function(type) { - platform.addEventListener(me, type, listener); - listeners[type] = listener; - }); - - // Elements used to detect size change should not be injected for non responsive charts. - // See https://github.com/chartjs/Chart.js/issues/2210 - if (me.options.responsive) { - listener = function() { - me.resize(); - }; - - platform.addEventListener(me, 'resize', listener); - listeners.resize = listener; - } - }, - - /** - * @private - */ - unbindEvents: function() { - var me = this; - var listeners = me._listeners; - if (!listeners) { - return; - } - - delete me._listeners; - helpers$1.each(listeners, function(listener, type) { - platform.removeEventListener(me, type, listener); - }); - }, - - updateHoverStyle: function(elements, mode, enabled) { - var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; - var element, i, ilen; - - for (i = 0, ilen = elements.length; i < ilen; ++i) { - element = elements[i]; - if (element) { - this.getDatasetMeta(element._datasetIndex).controller[method](element); - } - } - }, - - /** - * @private - */ - eventHandler: function(e) { - var me = this; - var tooltip = me.tooltip; - - if (core_plugins.notify(me, 'beforeEvent', [e]) === false) { - return; - } - - // Buffer any update calls so that renders do not occur - me._bufferedRender = true; - me._bufferedRequest = null; - - var changed = me.handleEvent(e); - // for smooth tooltip animations issue #4989 - // the tooltip should be the source of change - // Animation check workaround: - // tooltip._start will be null when tooltip isn't animating - if (tooltip) { - changed = tooltip._start - ? tooltip.handleEvent(e) - : changed | tooltip.handleEvent(e); - } - - core_plugins.notify(me, 'afterEvent', [e]); - - var bufferedRequest = me._bufferedRequest; - if (bufferedRequest) { - // If we have an update that was triggered, we need to do a normal render - me.render(bufferedRequest); - } else if (changed && !me.animating) { - // If entering, leaving, or changing elements, animate the change via pivot - me.stop(); - - // We only need to render at this point. Updating will cause scales to be - // recomputed generating flicker & using more memory than necessary. - me.render({ - duration: me.options.hover.animationDuration, - lazy: true - }); - } - - me._bufferedRender = false; - me._bufferedRequest = null; - - return me; - }, - - /** - * Handle an event - * @private - * @param {IEvent} event the event to handle - * @return {boolean} true if the chart needs to re-render - */ - handleEvent: function(e) { - var me = this; - var options = me.options || {}; - var hoverOptions = options.hover; - var changed = false; - - me.lastActive = me.lastActive || []; - - // Find Active Elements for hover and tooltips - if (e.type === 'mouseout') { - me.active = []; - } else { - me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); - } - - // Invoke onHover hook - // Need to call with native event here to not break backwards compatibility - helpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); - - if (e.type === 'mouseup' || e.type === 'click') { - if (options.onClick) { - // Use e.native here for backwards compatibility - options.onClick.call(me, e.native, me.active); - } - } - - // Remove styling for last active (even if it may still be active) - if (me.lastActive.length) { - me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); - } - - // Built in hover styling - if (me.active.length && hoverOptions.mode) { - me.updateHoverStyle(me.active, hoverOptions.mode, true); - } - - changed = !helpers$1.arrayEquals(me.active, me.lastActive); - - // Remember Last Actives - me.lastActive = me.active; - - return changed; - } -}); - -/** - * NOTE(SB) We actually don't use this container anymore but we need to keep it - * for backward compatibility. Though, it can still be useful for plugins that - * would need to work on multiple charts?! - */ -Chart.instances = {}; - -var core_controller = Chart; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart instead. - * @class Chart.Controller - * @deprecated since version 2.6 - * @todo remove at version 3 - * @private - */ -Chart.Controller = Chart; - -/** - * Provided for backward compatibility, not available anymore. - * @namespace Chart - * @deprecated since version 2.8 - * @todo remove at version 3 - * @private - */ -Chart.types = {}; - -/** - * Provided for backward compatibility, not available anymore. - * @namespace Chart.helpers.configMerge - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ -helpers$1.configMerge = mergeConfig; - -/** - * Provided for backward compatibility, not available anymore. - * @namespace Chart.helpers.scaleMerge - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ -helpers$1.scaleMerge = mergeScaleConfig; - -var core_helpers = function() { - - // -- Basic js utility methods - - helpers$1.where = function(collection, filterCallback) { - if (helpers$1.isArray(collection) && Array.prototype.filter) { - return collection.filter(filterCallback); - } - var filtered = []; - - helpers$1.each(collection, function(item) { - if (filterCallback(item)) { - filtered.push(item); - } - }); - - return filtered; - }; - helpers$1.findIndex = Array.prototype.findIndex ? - function(array, callback, scope) { - return array.findIndex(callback, scope); - } : - function(array, callback, scope) { - scope = scope === undefined ? array : scope; - for (var i = 0, ilen = array.length; i < ilen; ++i) { - if (callback.call(scope, array[i], i, array)) { - return i; - } - } - return -1; - }; - helpers$1.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { - // Default to start of the array - if (helpers$1.isNullOrUndef(startIndex)) { - startIndex = -1; - } - for (var i = startIndex + 1; i < arrayToSearch.length; i++) { - var currentItem = arrayToSearch[i]; - if (filterCallback(currentItem)) { - return currentItem; - } - } - }; - helpers$1.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { - // Default to end of the array - if (helpers$1.isNullOrUndef(startIndex)) { - startIndex = arrayToSearch.length; - } - for (var i = startIndex - 1; i >= 0; i--) { - var currentItem = arrayToSearch[i]; - if (filterCallback(currentItem)) { - return currentItem; - } - } - }; - - // -- Math methods - helpers$1.isNumber = function(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - }; - helpers$1.almostEquals = function(x, y, epsilon) { - return Math.abs(x - y) < epsilon; - }; - helpers$1.almostWhole = function(x, epsilon) { - var rounded = Math.round(x); - return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); - }; - helpers$1.max = function(array) { - return array.reduce(function(max, value) { - if (!isNaN(value)) { - return Math.max(max, value); - } - return max; - }, Number.NEGATIVE_INFINITY); - }; - helpers$1.min = function(array) { - return array.reduce(function(min, value) { - if (!isNaN(value)) { - return Math.min(min, value); - } - return min; - }, Number.POSITIVE_INFINITY); - }; - helpers$1.sign = Math.sign ? - function(x) { - return Math.sign(x); - } : - function(x) { - x = +x; // convert to a number - if (x === 0 || isNaN(x)) { - return x; - } - return x > 0 ? 1 : -1; - }; - helpers$1.log10 = Math.log10 ? - function(x) { - return Math.log10(x); - } : - function(x) { - var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. - // Check for whole powers of 10, - // which due to floating point rounding error should be corrected. - var powerOf10 = Math.round(exponent); - var isPowerOf10 = x === Math.pow(10, powerOf10); - - return isPowerOf10 ? powerOf10 : exponent; - }; - helpers$1.toRadians = function(degrees) { - return degrees * (Math.PI / 180); - }; - helpers$1.toDegrees = function(radians) { - return radians * (180 / Math.PI); - }; - - /** - * Returns the number of decimal places - * i.e. the number of digits after the decimal point, of the value of this Number. - * @param {number} x - A number. - * @returns {number} The number of decimal places. - * @private - */ - helpers$1._decimalPlaces = function(x) { - if (!helpers$1.isFinite(x)) { - return; - } - var e = 1; - var p = 0; - while (Math.round(x * e) / e !== x) { - e *= 10; - p++; - } - return p; - }; - - // Gets the angle from vertical upright to the point about a centre. - helpers$1.getAngleFromPoint = function(centrePoint, anglePoint) { - var distanceFromXCenter = anglePoint.x - centrePoint.x; - var distanceFromYCenter = anglePoint.y - centrePoint.y; - var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); - - var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); - - if (angle < (-0.5 * Math.PI)) { - angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] - } - - return { - angle: angle, - distance: radialDistanceFromCenter - }; - }; - helpers$1.distanceBetweenPoints = function(pt1, pt2) { - return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); - }; - - /** - * Provided for backward compatibility, not available anymore - * @function Chart.helpers.aliasPixel - * @deprecated since version 2.8.0 - * @todo remove at version 3 - */ - helpers$1.aliasPixel = function(pixelWidth) { - return (pixelWidth % 2 === 0) ? 0 : 0.5; - }; - - /** - * Returns the aligned pixel value to avoid anti-aliasing blur - * @param {Chart} chart - The chart instance. - * @param {number} pixel - A pixel value. - * @param {number} width - The width of the element. - * @returns {number} The aligned pixel value. - * @private - */ - helpers$1._alignPixel = function(chart, pixel, width) { - var devicePixelRatio = chart.currentDevicePixelRatio; - var halfWidth = width / 2; - return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; - }; - - helpers$1.splineCurve = function(firstPoint, middlePoint, afterPoint, t) { - // Props to Rob Spencer at scaled innovation for his post on splining between points - // http://scaledinnovation.com/analytics/splines/aboutSplines.html - - // This function must also respect "skipped" points - - var previous = firstPoint.skip ? middlePoint : firstPoint; - var current = middlePoint; - var next = afterPoint.skip ? middlePoint : afterPoint; - - var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); - var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); - - var s01 = d01 / (d01 + d12); - var s12 = d12 / (d01 + d12); - - // If all points are the same, s01 & s02 will be inf - s01 = isNaN(s01) ? 0 : s01; - s12 = isNaN(s12) ? 0 : s12; - - var fa = t * s01; // scaling factor for triangle Ta - var fb = t * s12; - - return { - previous: { - x: current.x - fa * (next.x - previous.x), - y: current.y - fa * (next.y - previous.y) - }, - next: { - x: current.x + fb * (next.x - previous.x), - y: current.y + fb * (next.y - previous.y) - } - }; - }; - helpers$1.EPSILON = Number.EPSILON || 1e-14; - helpers$1.splineCurveMonotone = function(points) { - // This function calculates Bézier control points in a similar way than |splineCurve|, - // but preserves monotonicity of the provided data and ensures no local extremums are added - // between the dataset discrete points due to the interpolation. - // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation - - var pointsWithTangents = (points || []).map(function(point) { - return { - model: point._model, - deltaK: 0, - mK: 0 - }; - }); - - // Calculate slopes (deltaK) and initialize tangents (mK) - var pointsLen = pointsWithTangents.length; - var i, pointBefore, pointCurrent, pointAfter; - for (i = 0; i < pointsLen; ++i) { - pointCurrent = pointsWithTangents[i]; - if (pointCurrent.model.skip) { - continue; - } - - pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; - pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; - if (pointAfter && !pointAfter.model.skip) { - var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); - - // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 - pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; - } - - if (!pointBefore || pointBefore.model.skip) { - pointCurrent.mK = pointCurrent.deltaK; - } else if (!pointAfter || pointAfter.model.skip) { - pointCurrent.mK = pointBefore.deltaK; - } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { - pointCurrent.mK = 0; - } else { - pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; - } - } - - // Adjust tangents to ensure monotonic properties - var alphaK, betaK, tauK, squaredMagnitude; - for (i = 0; i < pointsLen - 1; ++i) { - pointCurrent = pointsWithTangents[i]; - pointAfter = pointsWithTangents[i + 1]; - if (pointCurrent.model.skip || pointAfter.model.skip) { - continue; - } - - if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { - pointCurrent.mK = pointAfter.mK = 0; - continue; - } - - alphaK = pointCurrent.mK / pointCurrent.deltaK; - betaK = pointAfter.mK / pointCurrent.deltaK; - squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); - if (squaredMagnitude <= 9) { - continue; - } - - tauK = 3 / Math.sqrt(squaredMagnitude); - pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; - pointAfter.mK = betaK * tauK * pointCurrent.deltaK; - } - - // Compute control points - var deltaX; - for (i = 0; i < pointsLen; ++i) { - pointCurrent = pointsWithTangents[i]; - if (pointCurrent.model.skip) { - continue; - } - - pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; - pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; - if (pointBefore && !pointBefore.model.skip) { - deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; - pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; - pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; - } - if (pointAfter && !pointAfter.model.skip) { - deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; - pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; - pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; - } - } - }; - helpers$1.nextItem = function(collection, index, loop) { - if (loop) { - return index >= collection.length - 1 ? collection[0] : collection[index + 1]; - } - return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; - }; - helpers$1.previousItem = function(collection, index, loop) { - if (loop) { - return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; - } - return index <= 0 ? collection[0] : collection[index - 1]; - }; - // Implementation of the nice number algorithm used in determining where axis labels will go - helpers$1.niceNum = function(range, round) { - var exponent = Math.floor(helpers$1.log10(range)); - var fraction = range / Math.pow(10, exponent); - var niceFraction; - - if (round) { - if (fraction < 1.5) { - niceFraction = 1; - } else if (fraction < 3) { - niceFraction = 2; - } else if (fraction < 7) { - niceFraction = 5; - } else { - niceFraction = 10; - } - } else if (fraction <= 1.0) { - niceFraction = 1; - } else if (fraction <= 2) { - niceFraction = 2; - } else if (fraction <= 5) { - niceFraction = 5; - } else { - niceFraction = 10; - } - - return niceFraction * Math.pow(10, exponent); - }; - // Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ - helpers$1.requestAnimFrame = (function() { - if (typeof window === 'undefined') { - return function(callback) { - callback(); - }; - } - return window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || - function(callback) { - return window.setTimeout(callback, 1000 / 60); - }; - }()); - // -- DOM methods - helpers$1.getRelativePosition = function(evt, chart) { - var mouseX, mouseY; - var e = evt.originalEvent || evt; - var canvas = evt.target || evt.srcElement; - var boundingRect = canvas.getBoundingClientRect(); - - var touches = e.touches; - if (touches && touches.length > 0) { - mouseX = touches[0].clientX; - mouseY = touches[0].clientY; - - } else { - mouseX = e.clientX; - mouseY = e.clientY; - } - - // Scale mouse coordinates into canvas coordinates - // by following the pattern laid out by 'jerryj' in the comments of - // https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ - var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left')); - var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top')); - var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right')); - var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom')); - var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; - var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; - - // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However - // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here - mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); - mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); - - return { - x: mouseX, - y: mouseY - }; - - }; - - // Private helper function to convert max-width/max-height values that may be percentages into a number - function parseMaxStyle(styleValue, node, parentProperty) { - var valueInPixels; - if (typeof styleValue === 'string') { - valueInPixels = parseInt(styleValue, 10); - - if (styleValue.indexOf('%') !== -1) { - // percentage * size in dimension - valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; - } - } else { - valueInPixels = styleValue; - } - - return valueInPixels; - } - - /** - * Returns if the given value contains an effective constraint. - * @private - */ - function isConstrainedValue(value) { - return value !== undefined && value !== null && value !== 'none'; - } - - /** - * Returns the max width or height of the given DOM node in a cross-browser compatible fashion - * @param {HTMLElement} domNode - the node to check the constraint on - * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height') - * @param {string} percentageProperty - property of parent to use when calculating width as a percentage - * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser} - */ - function getConstraintDimension(domNode, maxStyle, percentageProperty) { - var view = document.defaultView; - var parentNode = helpers$1._getParentNode(domNode); - var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; - var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; - var hasCNode = isConstrainedValue(constrainedNode); - var hasCContainer = isConstrainedValue(constrainedContainer); - var infinity = Number.POSITIVE_INFINITY; - - if (hasCNode || hasCContainer) { - return Math.min( - hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, - hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); - } - - return 'none'; - } - // returns Number or undefined if no constraint - helpers$1.getConstraintWidth = function(domNode) { - return getConstraintDimension(domNode, 'max-width', 'clientWidth'); - }; - // returns Number or undefined if no constraint - helpers$1.getConstraintHeight = function(domNode) { - return getConstraintDimension(domNode, 'max-height', 'clientHeight'); - }; - /** - * @private - */ - helpers$1._calculatePadding = function(container, padding, parentDimension) { - padding = helpers$1.getStyle(container, padding); - - return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10); - }; - /** - * @private - */ - helpers$1._getParentNode = function(domNode) { - var parent = domNode.parentNode; - if (parent && parent.toString() === '[object ShadowRoot]') { - parent = parent.host; - } - return parent; - }; - helpers$1.getMaximumWidth = function(domNode) { - var container = helpers$1._getParentNode(domNode); - if (!container) { - return domNode.clientWidth; - } - - var clientWidth = container.clientWidth; - var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth); - var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth); - - var w = clientWidth - paddingLeft - paddingRight; - var cw = helpers$1.getConstraintWidth(domNode); - return isNaN(cw) ? w : Math.min(w, cw); - }; - helpers$1.getMaximumHeight = function(domNode) { - var container = helpers$1._getParentNode(domNode); - if (!container) { - return domNode.clientHeight; - } - - var clientHeight = container.clientHeight; - var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight); - var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight); - - var h = clientHeight - paddingTop - paddingBottom; - var ch = helpers$1.getConstraintHeight(domNode); - return isNaN(ch) ? h : Math.min(h, ch); - }; - helpers$1.getStyle = function(el, property) { - return el.currentStyle ? - el.currentStyle[property] : - document.defaultView.getComputedStyle(el, null).getPropertyValue(property); - }; - helpers$1.retinaScale = function(chart, forceRatio) { - var pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && window.devicePixelRatio) || 1; - if (pixelRatio === 1) { - return; - } - - var canvas = chart.canvas; - var height = chart.height; - var width = chart.width; - - canvas.height = height * pixelRatio; - canvas.width = width * pixelRatio; - chart.ctx.scale(pixelRatio, pixelRatio); - - // If no style has been set on the canvas, the render size is used as display size, - // making the chart visually bigger, so let's enforce it to the "correct" values. - // See https://github.com/chartjs/Chart.js/issues/3575 - if (!canvas.style.height && !canvas.style.width) { - canvas.style.height = height + 'px'; - canvas.style.width = width + 'px'; - } - }; - // -- Canvas methods - helpers$1.fontString = function(pixelSize, fontStyle, fontFamily) { - return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; - }; - helpers$1.longestText = function(ctx, font, arrayOfThings, cache) { - cache = cache || {}; - var data = cache.data = cache.data || {}; - var gc = cache.garbageCollect = cache.garbageCollect || []; - - if (cache.font !== font) { - data = cache.data = {}; - gc = cache.garbageCollect = []; - cache.font = font; - } - - ctx.font = font; - var longest = 0; - helpers$1.each(arrayOfThings, function(thing) { - // Undefined strings and arrays should not be measured - if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) { - longest = helpers$1.measureText(ctx, data, gc, longest, thing); - } else if (helpers$1.isArray(thing)) { - // if it is an array lets measure each element - // to do maybe simplify this function a bit so we can do this more recursively? - helpers$1.each(thing, function(nestedThing) { - // Undefined strings and arrays should not be measured - if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) { - longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing); - } - }); - } - }); - - var gcLen = gc.length / 2; - if (gcLen > arrayOfThings.length) { - for (var i = 0; i < gcLen; i++) { - delete data[gc[i]]; - } - gc.splice(0, gcLen); - } - return longest; - }; - helpers$1.measureText = function(ctx, data, gc, longest, string) { - var textWidth = data[string]; - if (!textWidth) { - textWidth = data[string] = ctx.measureText(string).width; - gc.push(string); - } - if (textWidth > longest) { - longest = textWidth; - } - return longest; - }; - helpers$1.numberOfLabelLines = function(arrayOfThings) { - var numberOfLines = 1; - helpers$1.each(arrayOfThings, function(thing) { - if (helpers$1.isArray(thing)) { - if (thing.length > numberOfLines) { - numberOfLines = thing.length; - } - } - }); - return numberOfLines; - }; - - helpers$1.color = !chartjsColor ? - function(value) { - console.error('Color.js not found!'); - return value; - } : - function(value) { - /* global CanvasGradient */ - if (value instanceof CanvasGradient) { - value = core_defaults.global.defaultColor; - } - - return chartjsColor(value); - }; - - helpers$1.getHoverColor = function(colorValue) { - /* global CanvasPattern */ - return (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ? - colorValue : - helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString(); - }; -}; - -function abstract() { - throw new Error( - 'This method is not implemented: either no adapter can ' + - 'be found or an incomplete integration was provided.' - ); -} - -/** - * Date adapter (current used by the time scale) - * @namespace Chart._adapters._date - * @memberof Chart._adapters - * @private - */ - -/** - * Currently supported unit string values. - * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')} - * @memberof Chart._adapters._date - * @name Unit - */ - -/** - * @class - */ -function DateAdapter(options) { - this.options = options || {}; -} - -helpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */ { - /** - * Returns a map of time formats for the supported formatting units defined - * in Unit as well as 'datetime' representing a detailed date/time string. - * @returns {{string: string}} - */ - formats: abstract, - - /** - * Parses the given `value` and return the associated timestamp. - * @param {any} value - the value to parse (usually comes from the data) - * @param {string} [format] - the expected data format - * @returns {(number|null)} - * @function - */ - parse: abstract, - - /** - * Returns the formatted date in the specified `format` for a given `timestamp`. - * @param {number} timestamp - the timestamp to format - * @param {string} format - the date/time token - * @return {string} - * @function - */ - format: abstract, - - /** - * Adds the specified `amount` of `unit` to the given `timestamp`. - * @param {number} timestamp - the input timestamp - * @param {number} amount - the amount to add - * @param {Unit} unit - the unit as string - * @return {number} - * @function - */ - add: abstract, - - /** - * Returns the number of `unit` between the given timestamps. - * @param {number} max - the input timestamp (reference) - * @param {number} min - the timestamp to substract - * @param {Unit} unit - the unit as string - * @return {number} - * @function - */ - diff: abstract, - - /** - * Returns start of `unit` for the given `timestamp`. - * @param {number} timestamp - the input timestamp - * @param {Unit} unit - the unit as string - * @param {number} [weekday] - the ISO day of the week with 1 being Monday - * and 7 being Sunday (only needed if param *unit* is `isoWeek`). - * @function - */ - startOf: abstract, - - /** - * Returns end of `unit` for the given `timestamp`. - * @param {number} timestamp - the input timestamp - * @param {Unit} unit - the unit as string - * @function - */ - endOf: abstract, - - // DEPRECATIONS - - /** - * Provided for backward compatibility for scale.getValueForPixel(), - * this method should be overridden only by the moment adapter. - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ - _create: function(value) { - return value; - } -}); - -DateAdapter.override = function(members) { - helpers$1.extend(DateAdapter.prototype, members); -}; - -var _date = DateAdapter; - -var core_adapters = { - _date: _date -}; - -/** - * Namespace to hold static tick generation functions - * @namespace Chart.Ticks - */ -var core_ticks = { - /** - * Namespace to hold formatters for different types of ticks - * @namespace Chart.Ticks.formatters - */ - formatters: { - /** - * Formatter for value labels - * @method Chart.Ticks.formatters.values - * @param value the value to display - * @return {string|string[]} the label to display - */ - values: function(value) { - return helpers$1.isArray(value) ? value : '' + value; - }, - - /** - * Formatter for linear numeric ticks - * @method Chart.Ticks.formatters.linear - * @param tickValue {number} the value to be formatted - * @param index {number} the position of the tickValue parameter in the ticks array - * @param ticks {number[]} the list of ticks being converted - * @return {string} string representation of the tickValue parameter - */ - linear: function(tickValue, index, ticks) { - // If we have lots of ticks, don't use the ones - var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; - - // If we have a number like 2.5 as the delta, figure out how many decimal places we need - if (Math.abs(delta) > 1) { - if (tickValue !== Math.floor(tickValue)) { - // not an integer - delta = tickValue - Math.floor(tickValue); - } - } - - var logDelta = helpers$1.log10(Math.abs(delta)); - var tickString = ''; - - if (tickValue !== 0) { - var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1])); - if (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation - var logTick = helpers$1.log10(Math.abs(tickValue)); - tickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta)); - } else { - var numDecimal = -1 * Math.floor(logDelta); - numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places - tickString = tickValue.toFixed(numDecimal); - } - } else { - tickString = '0'; // never show decimal places for 0 - } - - return tickString; - }, - - logarithmic: function(tickValue, index, ticks) { - var remain = tickValue / (Math.pow(10, Math.floor(helpers$1.log10(tickValue)))); - - if (tickValue === 0) { - return '0'; - } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { - return tickValue.toExponential(); - } - return ''; - } - } -}; - -var valueOrDefault$9 = helpers$1.valueOrDefault; -var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault; - -core_defaults._set('scale', { - display: true, - position: 'left', - offset: false, - - // grid line settings - gridLines: { - display: true, - color: 'rgba(0, 0, 0, 0.1)', - lineWidth: 1, - drawBorder: true, - drawOnChartArea: true, - drawTicks: true, - tickMarkLength: 10, - zeroLineWidth: 1, - zeroLineColor: 'rgba(0,0,0,0.25)', - zeroLineBorderDash: [], - zeroLineBorderDashOffset: 0.0, - offsetGridLines: false, - borderDash: [], - borderDashOffset: 0.0 - }, - - // scale label - scaleLabel: { - // display property - display: false, - - // actual label - labelString: '', - - // top/bottom padding - padding: { - top: 4, - bottom: 4 - } - }, - - // label settings - ticks: { - beginAtZero: false, - minRotation: 0, - maxRotation: 50, - mirror: false, - padding: 0, - reverse: false, - display: true, - autoSkip: true, - autoSkipPadding: 0, - labelOffset: 0, - // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. - callback: core_ticks.formatters.values, - minor: {}, - major: {} - } -}); - -function labelsFromTicks(ticks) { - var labels = []; - var i, ilen; - - for (i = 0, ilen = ticks.length; i < ilen; ++i) { - labels.push(ticks[i].label); - } - - return labels; -} - -function getPixelForGridLine(scale, index, offsetGridLines) { - var lineValue = scale.getPixelForTick(index); - - if (offsetGridLines) { - if (scale.getTicks().length === 1) { - lineValue -= scale.isHorizontal() ? - Math.max(lineValue - scale.left, scale.right - lineValue) : - Math.max(lineValue - scale.top, scale.bottom - lineValue); - } else if (index === 0) { - lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; - } else { - lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; - } - } - return lineValue; -} - -function computeTextSize(context, tick, font) { - return helpers$1.isArray(tick) ? - helpers$1.longestText(context, font, tick) : - context.measureText(tick).width; -} - -var core_scale = core_element.extend({ - /** - * Get the padding needed for the scale - * @method getPadding - * @private - * @returns {Padding} the necessary padding - */ - getPadding: function() { - var me = this; - return { - left: me.paddingLeft || 0, - top: me.paddingTop || 0, - right: me.paddingRight || 0, - bottom: me.paddingBottom || 0 - }; - }, - - /** - * Returns the scale tick objects ({label, major}) - * @since 2.7 - */ - getTicks: function() { - return this._ticks; - }, - - // These methods are ordered by lifecyle. Utilities then follow. - // Any function defined here is inherited by all scale types. - // Any function can be extended by the scale type - - mergeTicksOptions: function() { - var ticks = this.options.ticks; - if (ticks.minor === false) { - ticks.minor = { - display: false - }; - } - if (ticks.major === false) { - ticks.major = { - display: false - }; - } - for (var key in ticks) { - if (key !== 'major' && key !== 'minor') { - if (typeof ticks.minor[key] === 'undefined') { - ticks.minor[key] = ticks[key]; - } - if (typeof ticks.major[key] === 'undefined') { - ticks.major[key] = ticks[key]; - } - } - } - }, - beforeUpdate: function() { - helpers$1.callback(this.options.beforeUpdate, [this]); - }, - - update: function(maxWidth, maxHeight, margins) { - var me = this; - var i, ilen, labels, label, ticks, tick; - - // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) - me.beforeUpdate(); - - // Absorb the master measurements - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me.margins = helpers$1.extend({ - left: 0, - right: 0, - top: 0, - bottom: 0 - }, margins); - - me._maxLabelLines = 0; - me.longestLabelWidth = 0; - me.longestTextCache = me.longestTextCache || {}; - - // Dimensions - me.beforeSetDimensions(); - me.setDimensions(); - me.afterSetDimensions(); - - // Data min/max - me.beforeDataLimits(); - me.determineDataLimits(); - me.afterDataLimits(); - - // Ticks - `this.ticks` is now DEPRECATED! - // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member - // and must not be accessed directly from outside this class. `this.ticks` being - // around for long time and not marked as private, we can't change its structure - // without unexpected breaking changes. If you need to access the scale ticks, - // use scale.getTicks() instead. - - me.beforeBuildTicks(); - - // New implementations should return an array of objects but for BACKWARD COMPAT, - // we still support no return (`this.ticks` internally set by calling this method). - ticks = me.buildTicks() || []; - - // Allow modification of ticks in callback. - ticks = me.afterBuildTicks(ticks) || ticks; - - me.beforeTickToLabelConversion(); - - // New implementations should return the formatted tick labels but for BACKWARD - // COMPAT, we still support no return (`this.ticks` internally changed by calling - // this method and supposed to contain only string values). - labels = me.convertTicksToLabels(ticks) || me.ticks; - - me.afterTickToLabelConversion(); - - me.ticks = labels; // BACKWARD COMPATIBILITY - - // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! - - // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) - for (i = 0, ilen = labels.length; i < ilen; ++i) { - label = labels[i]; - tick = ticks[i]; - if (!tick) { - ticks.push(tick = { - label: label, - major: false - }); - } else { - tick.label = label; - } - } - - me._ticks = ticks; - - // Tick Rotation - me.beforeCalculateTickRotation(); - me.calculateTickRotation(); - me.afterCalculateTickRotation(); - // Fit - me.beforeFit(); - me.fit(); - me.afterFit(); - // - me.afterUpdate(); - - return me.minSize; - - }, - afterUpdate: function() { - helpers$1.callback(this.options.afterUpdate, [this]); - }, - - // - - beforeSetDimensions: function() { - helpers$1.callback(this.options.beforeSetDimensions, [this]); - }, - setDimensions: function() { - var me = this; - // Set the unconstrained dimension before label rotation - if (me.isHorizontal()) { - // Reset position before calculating rotation - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; - } else { - me.height = me.maxHeight; - - // Reset position before calculating rotation - me.top = 0; - me.bottom = me.height; - } - - // Reset padding - me.paddingLeft = 0; - me.paddingTop = 0; - me.paddingRight = 0; - me.paddingBottom = 0; - }, - afterSetDimensions: function() { - helpers$1.callback(this.options.afterSetDimensions, [this]); - }, - - // Data limits - beforeDataLimits: function() { - helpers$1.callback(this.options.beforeDataLimits, [this]); - }, - determineDataLimits: helpers$1.noop, - afterDataLimits: function() { - helpers$1.callback(this.options.afterDataLimits, [this]); - }, - - // - beforeBuildTicks: function() { - helpers$1.callback(this.options.beforeBuildTicks, [this]); - }, - buildTicks: helpers$1.noop, - afterBuildTicks: function(ticks) { - var me = this; - // ticks is empty for old axis implementations here - if (helpers$1.isArray(ticks) && ticks.length) { - return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]); - } - // Support old implementations (that modified `this.ticks` directly in buildTicks) - me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks; - return ticks; - }, - - beforeTickToLabelConversion: function() { - helpers$1.callback(this.options.beforeTickToLabelConversion, [this]); - }, - convertTicksToLabels: function() { - var me = this; - // Convert ticks to strings - var tickOpts = me.options.ticks; - me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); - }, - afterTickToLabelConversion: function() { - helpers$1.callback(this.options.afterTickToLabelConversion, [this]); - }, - - // - - beforeCalculateTickRotation: function() { - helpers$1.callback(this.options.beforeCalculateTickRotation, [this]); - }, - calculateTickRotation: function() { - var me = this; - var context = me.ctx; - var tickOpts = me.options.ticks; - var labels = labelsFromTicks(me._ticks); - - // Get the width of each grid by calculating the difference - // between x offsets between 0 and 1. - var tickFont = helpers$1.options._parseFont(tickOpts); - context.font = tickFont.string; - - var labelRotation = tickOpts.minRotation || 0; - - if (labels.length && me.options.display && me.isHorizontal()) { - var originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache); - var labelWidth = originalLabelWidth; - var cosRotation, sinRotation; - - // Allow 3 pixels x2 padding either side for label readability - var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; - - // Max label rotation can be set or default to 90 - also act as a loop counter - while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { - var angleRadians = helpers$1.toRadians(labelRotation); - cosRotation = Math.cos(angleRadians); - sinRotation = Math.sin(angleRadians); - - if (sinRotation * originalLabelWidth > me.maxHeight) { - // go back one step - labelRotation--; - break; - } - - labelRotation++; - labelWidth = cosRotation * originalLabelWidth; - } - } - - me.labelRotation = labelRotation; - }, - afterCalculateTickRotation: function() { - helpers$1.callback(this.options.afterCalculateTickRotation, [this]); - }, - - // - - beforeFit: function() { - helpers$1.callback(this.options.beforeFit, [this]); - }, - fit: function() { - var me = this; - // Reset - var minSize = me.minSize = { - width: 0, - height: 0 - }; - - var labels = labelsFromTicks(me._ticks); - - var opts = me.options; - var tickOpts = opts.ticks; - var scaleLabelOpts = opts.scaleLabel; - var gridLineOpts = opts.gridLines; - var display = me._isVisible(); - var position = opts.position; - var isHorizontal = me.isHorizontal(); - - var parseFont = helpers$1.options._parseFont; - var tickFont = parseFont(tickOpts); - var tickMarkLength = opts.gridLines.tickMarkLength; - - // Width - if (isHorizontal) { - // subtract the margins to line up with the chartArea if we are a full width scale - minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; - } else { - minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; - } - - // height - if (isHorizontal) { - minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; - } else { - minSize.height = me.maxHeight; // fill all the height - } - - // Are we showing a title for the scale? - if (scaleLabelOpts.display && display) { - var scaleLabelFont = parseFont(scaleLabelOpts); - var scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding); - var deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height; - - if (isHorizontal) { - minSize.height += deltaHeight; - } else { - minSize.width += deltaHeight; - } - } - - // Don't bother fitting the ticks if we are not showing the labels - if (tickOpts.display && display) { - var largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache); - var tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels); - var lineSpace = tickFont.size * 0.5; - var tickPadding = me.options.ticks.padding; - - // Store max number of lines and widest label for _autoSkip - me._maxLabelLines = tallestLabelHeightInLines; - me.longestLabelWidth = largestTextWidth; - - if (isHorizontal) { - var angleRadians = helpers$1.toRadians(me.labelRotation); - var cosRotation = Math.cos(angleRadians); - var sinRotation = Math.sin(angleRadians); - - // TODO - improve this calculation - var labelHeight = (sinRotation * largestTextWidth) - + (tickFont.lineHeight * tallestLabelHeightInLines) - + lineSpace; // padding - - minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); - - me.ctx.font = tickFont.string; - var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string); - var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string); - var offsetLeft = me.getPixelForTick(0) - me.left; - var offsetRight = me.right - me.getPixelForTick(labels.length - 1); - var paddingLeft, paddingRight; - - // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned - // which means that the right padding is dominated by the font height - if (me.labelRotation !== 0) { - paddingLeft = position === 'bottom' ? (cosRotation * firstLabelWidth) : (cosRotation * lineSpace); - paddingRight = position === 'bottom' ? (cosRotation * lineSpace) : (cosRotation * lastLabelWidth); - } else { - paddingLeft = firstLabelWidth / 2; - paddingRight = lastLabelWidth / 2; - } - me.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges - me.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3; - } else { - // A vertical axis is more constrained by the width. Labels are the - // dominant factor here, so get that length first and account for padding - if (tickOpts.mirror) { - largestTextWidth = 0; - } else { - // use lineSpace for consistency with horizontal axis - // tickPadding is not implemented for horizontal - largestTextWidth += tickPadding + lineSpace; - } - - minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); - - me.paddingTop = tickFont.size / 2; - me.paddingBottom = tickFont.size / 2; - } - } - - me.handleMargins(); - - me.width = minSize.width; - me.height = minSize.height; - }, - - /** - * Handle margins and padding interactions - * @private - */ - handleMargins: function() { - var me = this; - if (me.margins) { - me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); - me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); - me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); - me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); - } - }, - - afterFit: function() { - helpers$1.callback(this.options.afterFit, [this]); - }, - - // Shared Methods - isHorizontal: function() { - return this.options.position === 'top' || this.options.position === 'bottom'; - }, - isFullWidth: function() { - return (this.options.fullWidth); - }, - - // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not - getRightValue: function(rawValue) { - // Null and undefined values first - if (helpers$1.isNullOrUndef(rawValue)) { - return NaN; - } - // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values - if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) { - return NaN; - } - // If it is in fact an object, dive in one more level - if (rawValue) { - if (this.isHorizontal()) { - if (rawValue.x !== undefined) { - return this.getRightValue(rawValue.x); - } - } else if (rawValue.y !== undefined) { - return this.getRightValue(rawValue.y); - } - } - - // Value is good, return it - return rawValue; - }, - - /** - * Used to get the value to display in the tooltip for the data at the given index - * @param index - * @param datasetIndex - */ - getLabelForIndex: helpers$1.noop, - - /** - * Returns the location of the given data point. Value can either be an index or a numerical value - * The coordinate (0, 0) is at the upper-left corner of the canvas - * @param value - * @param index - * @param datasetIndex - */ - getPixelForValue: helpers$1.noop, - - /** - * Used to get the data value from a given pixel. This is the inverse of getPixelForValue - * The coordinate (0, 0) is at the upper-left corner of the canvas - * @param pixel - */ - getValueForPixel: helpers$1.noop, - - /** - * Returns the location of the tick at the given index - * The coordinate (0, 0) is at the upper-left corner of the canvas - */ - getPixelForTick: function(index) { - var me = this; - var offset = me.options.offset; - if (me.isHorizontal()) { - var innerWidth = me.width - (me.paddingLeft + me.paddingRight); - var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); - var pixel = (tickWidth * index) + me.paddingLeft; - - if (offset) { - pixel += tickWidth / 2; - } - - var finalVal = me.left + pixel; - finalVal += me.isFullWidth() ? me.margins.left : 0; - return finalVal; - } - var innerHeight = me.height - (me.paddingTop + me.paddingBottom); - return me.top + (index * (innerHeight / (me._ticks.length - 1))); - }, - - /** - * Utility for getting the pixel location of a percentage of scale - * The coordinate (0, 0) is at the upper-left corner of the canvas - */ - getPixelForDecimal: function(decimal) { - var me = this; - if (me.isHorizontal()) { - var innerWidth = me.width - (me.paddingLeft + me.paddingRight); - var valueOffset = (innerWidth * decimal) + me.paddingLeft; - - var finalVal = me.left + valueOffset; - finalVal += me.isFullWidth() ? me.margins.left : 0; - return finalVal; - } - return me.top + (decimal * me.height); - }, - - /** - * Returns the pixel for the minimum chart value - * The coordinate (0, 0) is at the upper-left corner of the canvas - */ - getBasePixel: function() { - return this.getPixelForValue(this.getBaseValue()); - }, - - getBaseValue: function() { - var me = this; - var min = me.min; - var max = me.max; - - return me.beginAtZero ? 0 : - min < 0 && max < 0 ? max : - min > 0 && max > 0 ? min : - 0; - }, - - /** - * Returns a subset of ticks to be plotted to avoid overlapping labels. - * @private - */ - _autoSkip: function(ticks) { - var me = this; - var isHorizontal = me.isHorizontal(); - var optionTicks = me.options.ticks.minor; - var tickCount = ticks.length; - var skipRatio = false; - var maxTicks = optionTicks.maxTicksLimit; - - // Total space needed to display all ticks. First and last ticks are - // drawn as their center at end of axis, so tickCount-1 - var ticksLength = me._tickSize() * (tickCount - 1); - - // Axis length - var axisLength = isHorizontal - ? me.width - (me.paddingLeft + me.paddingRight) - : me.height - (me.paddingTop + me.PaddingBottom); - - var result = []; - var i, tick; - - if (ticksLength > axisLength) { - skipRatio = 1 + Math.floor(ticksLength / axisLength); - } - - // if they defined a max number of optionTicks, - // increase skipRatio until that number is met - if (tickCount > maxTicks) { - skipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks)); - } - - for (i = 0; i < tickCount; i++) { - tick = ticks[i]; - - if (skipRatio > 1 && i % skipRatio > 0) { - // leave tick in place but make sure it's not displayed (#4635) - delete tick.label; - } - result.push(tick); - } - return result; - }, - - /** - * @private - */ - _tickSize: function() { - var me = this; - var isHorizontal = me.isHorizontal(); - var optionTicks = me.options.ticks.minor; - - // Calculate space needed by label in axis direction. - var rot = helpers$1.toRadians(me.labelRotation); - var cos = Math.abs(Math.cos(rot)); - var sin = Math.abs(Math.sin(rot)); - - var padding = optionTicks.autoSkipPadding || 0; - var w = (me.longestLabelWidth + padding) || 0; - - var tickFont = helpers$1.options._parseFont(optionTicks); - var h = (me._maxLabelLines * tickFont.lineHeight + padding) || 0; - - // Calculate space needed for 1 tick in axis direction. - return isHorizontal - ? h * cos > w * sin ? w / cos : h / sin - : h * sin < w * cos ? h / cos : w / sin; - }, - - /** - * @private - */ - _isVisible: function() { - var me = this; - var chart = me.chart; - var display = me.options.display; - var i, ilen, meta; - - if (display !== 'auto') { - return !!display; - } - - // When 'auto', the scale is visible if at least one associated dataset is visible. - for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { - if (chart.isDatasetVisible(i)) { - meta = chart.getDatasetMeta(i); - if (meta.xAxisID === me.id || meta.yAxisID === me.id) { - return true; - } - } - } - - return false; - }, - - /** - * Actually draw the scale on the canvas - * @param {object} chartArea - the area of the chart to draw full grid lines on - */ - draw: function(chartArea) { - var me = this; - var options = me.options; - - if (!me._isVisible()) { - return; - } - - var chart = me.chart; - var context = me.ctx; - var globalDefaults = core_defaults.global; - var defaultFontColor = globalDefaults.defaultFontColor; - var optionTicks = options.ticks.minor; - var optionMajorTicks = options.ticks.major || optionTicks; - var gridLines = options.gridLines; - var scaleLabel = options.scaleLabel; - var position = options.position; - - var isRotated = me.labelRotation !== 0; - var isMirrored = optionTicks.mirror; - var isHorizontal = me.isHorizontal(); - - var parseFont = helpers$1.options._parseFont; - var ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); - var tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor); - var tickFont = parseFont(optionTicks); - var lineHeight = tickFont.lineHeight; - var majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor); - var majorTickFont = parseFont(optionMajorTicks); - var tickPadding = optionTicks.padding; - var labelOffset = optionTicks.labelOffset; - - var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; - - var scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor); - var scaleLabelFont = parseFont(scaleLabel); - var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding); - var labelRotationRadians = helpers$1.toRadians(me.labelRotation); - - var itemsToDraw = []; - - var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0; - var alignPixel = helpers$1._alignPixel; - var borderValue, tickStart, tickEnd; - - if (position === 'top') { - borderValue = alignPixel(chart, me.bottom, axisWidth); - tickStart = me.bottom - tl; - tickEnd = borderValue - axisWidth / 2; - } else if (position === 'bottom') { - borderValue = alignPixel(chart, me.top, axisWidth); - tickStart = borderValue + axisWidth / 2; - tickEnd = me.top + tl; - } else if (position === 'left') { - borderValue = alignPixel(chart, me.right, axisWidth); - tickStart = me.right - tl; - tickEnd = borderValue - axisWidth / 2; - } else { - borderValue = alignPixel(chart, me.left, axisWidth); - tickStart = borderValue + axisWidth / 2; - tickEnd = me.left + tl; - } - - var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error. - - helpers$1.each(ticks, function(tick, index) { - // autoskipper skipped this tick (#4635) - if (helpers$1.isNullOrUndef(tick.label)) { - return; - } - - var label = tick.label; - var lineWidth, lineColor, borderDash, borderDashOffset; - if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { - // Draw the first index specially - lineWidth = gridLines.zeroLineWidth; - lineColor = gridLines.zeroLineColor; - borderDash = gridLines.zeroLineBorderDash || []; - borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0; - } else { - lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index); - lineColor = valueAtIndexOrDefault(gridLines.color, index); - borderDash = gridLines.borderDash || []; - borderDashOffset = gridLines.borderDashOffset || 0.0; - } - - // Common properties - var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign; - var labelCount = helpers$1.isArray(label) ? label.length : 1; - var lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines); - - if (isHorizontal) { - var labelYOffset = tl + tickPadding; - - if (lineValue < me.left - epsilon) { - lineColor = 'rgba(0,0,0,0)'; - } - - tx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth); - ty1 = tickStart; - ty2 = tickEnd; - labelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option) - - if (position === 'top') { - y1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2; - y2 = chartArea.bottom; - textOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight; - textAlign = !isRotated ? 'center' : 'left'; - labelY = me.bottom - labelYOffset; - } else { - y1 = chartArea.top; - y2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2; - textOffset = (!isRotated ? 0.5 : 0) * lineHeight; - textAlign = !isRotated ? 'center' : 'right'; - labelY = me.top + labelYOffset; - } - } else { - var labelXOffset = (isMirrored ? 0 : tl) + tickPadding; - - if (lineValue < me.top - epsilon) { - lineColor = 'rgba(0,0,0,0)'; - } - - tx1 = tickStart; - tx2 = tickEnd; - ty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth); - labelY = me.getPixelForTick(index) + labelOffset; - textOffset = (1 - labelCount) * lineHeight / 2; - - if (position === 'left') { - x1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2; - x2 = chartArea.right; - textAlign = isMirrored ? 'left' : 'right'; - labelX = me.right - labelXOffset; - } else { - x1 = chartArea.left; - x2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2; - textAlign = isMirrored ? 'right' : 'left'; - labelX = me.left + labelXOffset; - } - } - - itemsToDraw.push({ - tx1: tx1, - ty1: ty1, - tx2: tx2, - ty2: ty2, - x1: x1, - y1: y1, - x2: x2, - y2: y2, - labelX: labelX, - labelY: labelY, - glWidth: lineWidth, - glColor: lineColor, - glBorderDash: borderDash, - glBorderDashOffset: borderDashOffset, - rotation: -1 * labelRotationRadians, - label: label, - major: tick.major, - textOffset: textOffset, - textAlign: textAlign - }); - }); - - // Draw all of the tick labels, tick marks, and grid lines at the correct places - helpers$1.each(itemsToDraw, function(itemToDraw) { - var glWidth = itemToDraw.glWidth; - var glColor = itemToDraw.glColor; - - if (gridLines.display && glWidth && glColor) { - context.save(); - context.lineWidth = glWidth; - context.strokeStyle = glColor; - if (context.setLineDash) { - context.setLineDash(itemToDraw.glBorderDash); - context.lineDashOffset = itemToDraw.glBorderDashOffset; - } - - context.beginPath(); - - if (gridLines.drawTicks) { - context.moveTo(itemToDraw.tx1, itemToDraw.ty1); - context.lineTo(itemToDraw.tx2, itemToDraw.ty2); - } - - if (gridLines.drawOnChartArea) { - context.moveTo(itemToDraw.x1, itemToDraw.y1); - context.lineTo(itemToDraw.x2, itemToDraw.y2); - } - - context.stroke(); - context.restore(); - } - - if (optionTicks.display) { - // Make sure we draw text in the correct color and font - context.save(); - context.translate(itemToDraw.labelX, itemToDraw.labelY); - context.rotate(itemToDraw.rotation); - context.font = itemToDraw.major ? majorTickFont.string : tickFont.string; - context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; - context.textBaseline = 'middle'; - context.textAlign = itemToDraw.textAlign; - - var label = itemToDraw.label; - var y = itemToDraw.textOffset; - if (helpers$1.isArray(label)) { - for (var i = 0; i < label.length; ++i) { - // We just make sure the multiline element is a string here.. - context.fillText('' + label[i], 0, y); - y += lineHeight; - } - } else { - context.fillText(label, 0, y); - } - context.restore(); - } - }); - - if (scaleLabel.display) { - // Draw the scale label - var scaleLabelX; - var scaleLabelY; - var rotation = 0; - var halfLineHeight = scaleLabelFont.lineHeight / 2; - - if (isHorizontal) { - scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width - scaleLabelY = position === 'bottom' - ? me.bottom - halfLineHeight - scaleLabelPadding.bottom - : me.top + halfLineHeight + scaleLabelPadding.top; - } else { - var isLeft = position === 'left'; - scaleLabelX = isLeft - ? me.left + halfLineHeight + scaleLabelPadding.top - : me.right - halfLineHeight - scaleLabelPadding.top; - scaleLabelY = me.top + ((me.bottom - me.top) / 2); - rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; - } - - context.save(); - context.translate(scaleLabelX, scaleLabelY); - context.rotate(rotation); - context.textAlign = 'center'; - context.textBaseline = 'middle'; - context.fillStyle = scaleLabelFontColor; // render in correct colour - context.font = scaleLabelFont.string; - context.fillText(scaleLabel.labelString, 0, 0); - context.restore(); - } - - if (axisWidth) { - // Draw the line at the edge of the axis - var firstLineWidth = axisWidth; - var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0); - var x1, x2, y1, y2; - - if (isHorizontal) { - x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2; - x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2; - y1 = y2 = borderValue; - } else { - y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2; - y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2; - x1 = x2 = borderValue; - } - - context.lineWidth = axisWidth; - context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0); - context.beginPath(); - context.moveTo(x1, y1); - context.lineTo(x2, y2); - context.stroke(); - } - } -}); - -var defaultConfig = { - position: 'bottom' -}; - -var scale_category = core_scale.extend({ - /** - * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those - * else fall back to data.labels - * @private - */ - getLabels: function() { - var data = this.chart.data; - return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; - }, - - determineDataLimits: function() { - var me = this; - var labels = me.getLabels(); - me.minIndex = 0; - me.maxIndex = labels.length - 1; - var findIndex; - - if (me.options.ticks.min !== undefined) { - // user specified min value - findIndex = labels.indexOf(me.options.ticks.min); - me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; - } - - if (me.options.ticks.max !== undefined) { - // user specified max value - findIndex = labels.indexOf(me.options.ticks.max); - me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; - } - - me.min = labels[me.minIndex]; - me.max = labels[me.maxIndex]; - }, - - buildTicks: function() { - var me = this; - var labels = me.getLabels(); - // If we are viewing some subset of labels, slice the original array - me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); - }, - - getLabelForIndex: function(index, datasetIndex) { - var me = this; - var chart = me.chart; - - if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) { - return me.getRightValue(chart.data.datasets[datasetIndex].data[index]); - } - - return me.ticks[index - me.minIndex]; - }, - - // Used to get data value locations. Value can either be an index or a numerical value - getPixelForValue: function(value, index) { - var me = this; - var offset = me.options.offset; - // 1 is added because we need the length but we have the indexes - var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); - - // If value is a data object, then index is the index in the data array, - // not the index of the scale. We need to change that. - var valueCategory; - if (value !== undefined && value !== null) { - valueCategory = me.isHorizontal() ? value.x : value.y; - } - if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { - var labels = me.getLabels(); - value = valueCategory || value; - var idx = labels.indexOf(value); - index = idx !== -1 ? idx : index; - } - - if (me.isHorizontal()) { - var valueWidth = me.width / offsetAmt; - var widthOffset = (valueWidth * (index - me.minIndex)); - - if (offset) { - widthOffset += (valueWidth / 2); - } - - return me.left + widthOffset; - } - var valueHeight = me.height / offsetAmt; - var heightOffset = (valueHeight * (index - me.minIndex)); - - if (offset) { - heightOffset += (valueHeight / 2); - } - - return me.top + heightOffset; - }, - - getPixelForTick: function(index) { - return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); - }, - - getValueForPixel: function(pixel) { - var me = this; - var offset = me.options.offset; - var value; - var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); - var horz = me.isHorizontal(); - var valueDimension = (horz ? me.width : me.height) / offsetAmt; - - pixel -= horz ? me.left : me.top; - - if (offset) { - pixel -= (valueDimension / 2); - } - - if (pixel <= 0) { - value = 0; - } else { - value = Math.round(pixel / valueDimension); - } - - return value + me.minIndex; - }, - - getBasePixel: function() { - return this.bottom; - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults = defaultConfig; -scale_category._defaults = _defaults; - -var noop = helpers$1.noop; -var isNullOrUndef = helpers$1.isNullOrUndef; - -/** - * Generate a set of linear ticks - * @param generationOptions the options used to generate the ticks - * @param dataRange the range of the data - * @returns {number[]} array of tick values - */ -function generateTicks(generationOptions, dataRange) { - var ticks = []; - // To get a "nice" value for the tick spacing, we will use the appropriately named - // "nice number" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks - // for details. - - var MIN_SPACING = 1e-14; - var stepSize = generationOptions.stepSize; - var unit = stepSize || 1; - var maxNumSpaces = generationOptions.maxTicks - 1; - var min = generationOptions.min; - var max = generationOptions.max; - var precision = generationOptions.precision; - var rmin = dataRange.min; - var rmax = dataRange.max; - var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit; - var factor, niceMin, niceMax, numSpaces; - - // Beyond MIN_SPACING floating point numbers being to lose precision - // such that we can't do the math necessary to generate ticks - if (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) { - return [rmin, rmax]; - } - - numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); - if (numSpaces > maxNumSpaces) { - // If the calculated num of spaces exceeds maxNumSpaces, recalculate it - spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit; - } - - if (stepSize || isNullOrUndef(precision)) { - // If a precision is not specified, calculate factor based on spacing - factor = Math.pow(10, helpers$1._decimalPlaces(spacing)); - } else { - // If the user specified a precision, round to that number of decimal places - factor = Math.pow(10, precision); - spacing = Math.ceil(spacing * factor) / factor; - } - - niceMin = Math.floor(rmin / spacing) * spacing; - niceMax = Math.ceil(rmax / spacing) * spacing; - - // If min, max and stepSize is set and they make an evenly spaced scale use it. - if (stepSize) { - // If very close to our whole number, use it. - if (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) { - niceMin = min; - } - if (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) { - niceMax = max; - } - } - - numSpaces = (niceMax - niceMin) / spacing; - // If very close to our rounded value, use it. - if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { - numSpaces = Math.round(numSpaces); - } else { - numSpaces = Math.ceil(numSpaces); - } - - niceMin = Math.round(niceMin * factor) / factor; - niceMax = Math.round(niceMax * factor) / factor; - ticks.push(isNullOrUndef(min) ? niceMin : min); - for (var j = 1; j < numSpaces; ++j) { - ticks.push(Math.round((niceMin + j * spacing) * factor) / factor); - } - ticks.push(isNullOrUndef(max) ? niceMax : max); - - return ticks; -} - -var scale_linearbase = core_scale.extend({ - getRightValue: function(value) { - if (typeof value === 'string') { - return +value; - } - return core_scale.prototype.getRightValue.call(this, value); - }, - - handleTickRangeOptions: function() { - var me = this; - var opts = me.options; - var tickOpts = opts.ticks; - - // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, - // do nothing since that would make the chart weird. If the user really wants a weird chart - // axis, they can manually override it - if (tickOpts.beginAtZero) { - var minSign = helpers$1.sign(me.min); - var maxSign = helpers$1.sign(me.max); - - if (minSign < 0 && maxSign < 0) { - // move the top up to 0 - me.max = 0; - } else if (minSign > 0 && maxSign > 0) { - // move the bottom down to 0 - me.min = 0; - } - } - - var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; - var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; - - if (tickOpts.min !== undefined) { - me.min = tickOpts.min; - } else if (tickOpts.suggestedMin !== undefined) { - if (me.min === null) { - me.min = tickOpts.suggestedMin; - } else { - me.min = Math.min(me.min, tickOpts.suggestedMin); - } - } - - if (tickOpts.max !== undefined) { - me.max = tickOpts.max; - } else if (tickOpts.suggestedMax !== undefined) { - if (me.max === null) { - me.max = tickOpts.suggestedMax; - } else { - me.max = Math.max(me.max, tickOpts.suggestedMax); - } - } - - if (setMin !== setMax) { - // We set the min or the max but not both. - // So ensure that our range is good - // Inverted or 0 length range can happen when - // ticks.min is set, and no datasets are visible - if (me.min >= me.max) { - if (setMin) { - me.max = me.min + 1; - } else { - me.min = me.max - 1; - } - } - } - - if (me.min === me.max) { - me.max++; - - if (!tickOpts.beginAtZero) { - me.min--; - } - } - }, - - getTickLimit: function() { - var me = this; - var tickOpts = me.options.ticks; - var stepSize = tickOpts.stepSize; - var maxTicksLimit = tickOpts.maxTicksLimit; - var maxTicks; - - if (stepSize) { - maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1; - } else { - maxTicks = me._computeTickLimit(); - maxTicksLimit = maxTicksLimit || 11; - } - - if (maxTicksLimit) { - maxTicks = Math.min(maxTicksLimit, maxTicks); - } - - return maxTicks; - }, - - _computeTickLimit: function() { - return Number.POSITIVE_INFINITY; - }, - - handleDirectionalChanges: noop, - - buildTicks: function() { - var me = this; - var opts = me.options; - var tickOpts = opts.ticks; - - // Figure out what the max number of ticks we can support it is based on the size of - // the axis area. For now, we say that the minimum tick spacing in pixels must be 40 - // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on - // the graph. Make sure we always have at least 2 ticks - var maxTicks = me.getTickLimit(); - maxTicks = Math.max(2, maxTicks); - - var numericGeneratorOptions = { - maxTicks: maxTicks, - min: tickOpts.min, - max: tickOpts.max, - precision: tickOpts.precision, - stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) - }; - var ticks = me.ticks = generateTicks(numericGeneratorOptions, me); - - me.handleDirectionalChanges(); - - // At this point, we need to update our max and min given the tick values since we have expanded the - // range of the scale - me.max = helpers$1.max(ticks); - me.min = helpers$1.min(ticks); - - if (tickOpts.reverse) { - ticks.reverse(); - - me.start = me.max; - me.end = me.min; - } else { - me.start = me.min; - me.end = me.max; - } - }, - - convertTicksToLabels: function() { - var me = this; - me.ticksAsNumbers = me.ticks.slice(); - me.zeroLineIndex = me.ticks.indexOf(0); - - core_scale.prototype.convertTicksToLabels.call(me); - } -}); - -var defaultConfig$1 = { - position: 'left', - ticks: { - callback: core_ticks.formatters.linear - } -}; - -var scale_linear = scale_linearbase.extend({ - determineDataLimits: function() { - var me = this; - var opts = me.options; - var chart = me.chart; - var data = chart.data; - var datasets = data.datasets; - var isHorizontal = me.isHorizontal(); - var DEFAULT_MIN = 0; - var DEFAULT_MAX = 1; - - function IDMatches(meta) { - return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; - } - - // First Calculate the range - me.min = null; - me.max = null; - - var hasStacks = opts.stacked; - if (hasStacks === undefined) { - helpers$1.each(datasets, function(dataset, datasetIndex) { - if (hasStacks) { - return; - } - - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && - meta.stack !== undefined) { - hasStacks = true; - } - }); - } - - if (opts.stacked || hasStacks) { - var valuesPerStack = {}; - - helpers$1.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - var key = [ - meta.type, - // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined - ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), - meta.stack - ].join('.'); - - if (valuesPerStack[key] === undefined) { - valuesPerStack[key] = { - positiveValues: [], - negativeValues: [] - }; - } - - // Store these per type - var positiveValues = valuesPerStack[key].positiveValues; - var negativeValues = valuesPerStack[key].negativeValues; - - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers$1.each(dataset.data, function(rawValue, index) { - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - positiveValues[index] = positiveValues[index] || 0; - negativeValues[index] = negativeValues[index] || 0; - - if (opts.relativePoints) { - positiveValues[index] = 100; - } else if (value < 0) { - negativeValues[index] += value; - } else { - positiveValues[index] += value; - } - }); - } - }); - - helpers$1.each(valuesPerStack, function(valuesForType) { - var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); - var minVal = helpers$1.min(values); - var maxVal = helpers$1.max(values); - me.min = me.min === null ? minVal : Math.min(me.min, minVal); - me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); - }); - - } else { - helpers$1.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers$1.each(dataset.data, function(rawValue, index) { - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - if (me.min === null) { - me.min = value; - } else if (value < me.min) { - me.min = value; - } - - if (me.max === null) { - me.max = value; - } else if (value > me.max) { - me.max = value; - } - }); - } - }); - } - - me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; - me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; - - // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero - this.handleTickRangeOptions(); - }, - - // Returns the maximum number of ticks based on the scale dimension - _computeTickLimit: function() { - var me = this; - var tickFont; - - if (me.isHorizontal()) { - return Math.ceil(me.width / 40); - } - tickFont = helpers$1.options._parseFont(me.options.ticks); - return Math.ceil(me.height / tickFont.lineHeight); - }, - - // Called after the ticks are built. We need - handleDirectionalChanges: function() { - if (!this.isHorizontal()) { - // We are in a vertical orientation. The top value is the highest. So reverse the array - this.ticks.reverse(); - } - }, - - getLabelForIndex: function(index, datasetIndex) { - return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); - }, - - // Utils - getPixelForValue: function(value) { - // This must be called after fit has been run so that - // this.left, this.top, this.right, and this.bottom have been defined - var me = this; - var start = me.start; - - var rightValue = +me.getRightValue(value); - var pixel; - var range = me.end - start; - - if (me.isHorizontal()) { - pixel = me.left + (me.width / range * (rightValue - start)); - } else { - pixel = me.bottom - (me.height / range * (rightValue - start)); - } - return pixel; - }, - - getValueForPixel: function(pixel) { - var me = this; - var isHorizontal = me.isHorizontal(); - var innerDimension = isHorizontal ? me.width : me.height; - var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; - return me.start + ((me.end - me.start) * offset); - }, - - getPixelForTick: function(index) { - return this.getPixelForValue(this.ticksAsNumbers[index]); - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults$1 = defaultConfig$1; -scale_linear._defaults = _defaults$1; - -var valueOrDefault$a = helpers$1.valueOrDefault; - -/** - * Generate a set of logarithmic ticks - * @param generationOptions the options used to generate the ticks - * @param dataRange the range of the data - * @returns {number[]} array of tick values - */ -function generateTicks$1(generationOptions, dataRange) { - var ticks = []; - - var tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min)))); - - var endExp = Math.floor(helpers$1.log10(dataRange.max)); - var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); - var exp, significand; - - if (tickVal === 0) { - exp = Math.floor(helpers$1.log10(dataRange.minNotZero)); - significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); - - ticks.push(tickVal); - tickVal = significand * Math.pow(10, exp); - } else { - exp = Math.floor(helpers$1.log10(tickVal)); - significand = Math.floor(tickVal / Math.pow(10, exp)); - } - var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; - - do { - ticks.push(tickVal); - - ++significand; - if (significand === 10) { - significand = 1; - ++exp; - precision = exp >= 0 ? 1 : precision; - } - - tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision; - } while (exp < endExp || (exp === endExp && significand < endSignificand)); - - var lastTick = valueOrDefault$a(generationOptions.max, tickVal); - ticks.push(lastTick); - - return ticks; -} - -var defaultConfig$2 = { - position: 'left', - - // label settings - ticks: { - callback: core_ticks.formatters.logarithmic - } -}; - -// TODO(v3): change this to positiveOrDefault -function nonNegativeOrDefault(value, defaultValue) { - return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue; -} - -var scale_logarithmic = core_scale.extend({ - determineDataLimits: function() { - var me = this; - var opts = me.options; - var chart = me.chart; - var data = chart.data; - var datasets = data.datasets; - var isHorizontal = me.isHorizontal(); - function IDMatches(meta) { - return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; - } - - // Calculate Range - me.min = null; - me.max = null; - me.minNotZero = null; - - var hasStacks = opts.stacked; - if (hasStacks === undefined) { - helpers$1.each(datasets, function(dataset, datasetIndex) { - if (hasStacks) { - return; - } - - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && - meta.stack !== undefined) { - hasStacks = true; - } - }); - } - - if (opts.stacked || hasStacks) { - var valuesPerStack = {}; - - helpers$1.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - var key = [ - meta.type, - // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined - ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), - meta.stack - ].join('.'); - - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - if (valuesPerStack[key] === undefined) { - valuesPerStack[key] = []; - } - - helpers$1.each(dataset.data, function(rawValue, index) { - var values = valuesPerStack[key]; - var value = +me.getRightValue(rawValue); - // invalid, hidden and negative values are ignored - if (isNaN(value) || meta.data[index].hidden || value < 0) { - return; - } - values[index] = values[index] || 0; - values[index] += value; - }); - } - }); - - helpers$1.each(valuesPerStack, function(valuesForType) { - if (valuesForType.length > 0) { - var minVal = helpers$1.min(valuesForType); - var maxVal = helpers$1.max(valuesForType); - me.min = me.min === null ? minVal : Math.min(me.min, minVal); - me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); - } - }); - - } else { - helpers$1.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers$1.each(dataset.data, function(rawValue, index) { - var value = +me.getRightValue(rawValue); - // invalid, hidden and negative values are ignored - if (isNaN(value) || meta.data[index].hidden || value < 0) { - return; - } - - if (me.min === null) { - me.min = value; - } else if (value < me.min) { - me.min = value; - } - - if (me.max === null) { - me.max = value; - } else if (value > me.max) { - me.max = value; - } - - if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { - me.minNotZero = value; - } - }); - } - }); - } - - // Common base implementation to handle ticks.min, ticks.max - this.handleTickRangeOptions(); - }, - - handleTickRangeOptions: function() { - var me = this; - var tickOpts = me.options.ticks; - var DEFAULT_MIN = 1; - var DEFAULT_MAX = 10; - - me.min = nonNegativeOrDefault(tickOpts.min, me.min); - me.max = nonNegativeOrDefault(tickOpts.max, me.max); - - if (me.min === me.max) { - if (me.min !== 0 && me.min !== null) { - me.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1); - me.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1); - } else { - me.min = DEFAULT_MIN; - me.max = DEFAULT_MAX; - } - } - if (me.min === null) { - me.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1); - } - if (me.max === null) { - me.max = me.min !== 0 - ? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1) - : DEFAULT_MAX; - } - if (me.minNotZero === null) { - if (me.min > 0) { - me.minNotZero = me.min; - } else if (me.max < 1) { - me.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max))); - } else { - me.minNotZero = DEFAULT_MIN; - } - } - }, - - buildTicks: function() { - var me = this; - var tickOpts = me.options.ticks; - var reverse = !me.isHorizontal(); - - var generationOptions = { - min: nonNegativeOrDefault(tickOpts.min), - max: nonNegativeOrDefault(tickOpts.max) - }; - var ticks = me.ticks = generateTicks$1(generationOptions, me); - - // At this point, we need to update our max and min given the tick values since we have expanded the - // range of the scale - me.max = helpers$1.max(ticks); - me.min = helpers$1.min(ticks); - - if (tickOpts.reverse) { - reverse = !reverse; - me.start = me.max; - me.end = me.min; - } else { - me.start = me.min; - me.end = me.max; - } - if (reverse) { - ticks.reverse(); - } - }, - - convertTicksToLabels: function() { - this.tickValues = this.ticks.slice(); - - core_scale.prototype.convertTicksToLabels.call(this); - }, - - // Get the correct tooltip label - getLabelForIndex: function(index, datasetIndex) { - return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); - }, - - getPixelForTick: function(index) { - return this.getPixelForValue(this.tickValues[index]); - }, - - /** - * Returns the value of the first tick. - * @param {number} value - The minimum not zero value. - * @return {number} The first tick value. - * @private - */ - _getFirstTickValue: function(value) { - var exp = Math.floor(helpers$1.log10(value)); - var significand = Math.floor(value / Math.pow(10, exp)); - - return significand * Math.pow(10, exp); - }, - - getPixelForValue: function(value) { - var me = this; - var tickOpts = me.options.ticks; - var reverse = tickOpts.reverse; - var log10 = helpers$1.log10; - var firstTickValue = me._getFirstTickValue(me.minNotZero); - var offset = 0; - var innerDimension, pixel, start, end, sign; - - value = +me.getRightValue(value); - if (reverse) { - start = me.end; - end = me.start; - sign = -1; - } else { - start = me.start; - end = me.end; - sign = 1; - } - if (me.isHorizontal()) { - innerDimension = me.width; - pixel = reverse ? me.right : me.left; - } else { - innerDimension = me.height; - sign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0) - pixel = reverse ? me.top : me.bottom; - } - if (value !== start) { - if (start === 0) { // include zero tick - offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); - innerDimension -= offset; - start = firstTickValue; - } - if (value !== 0) { - offset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start)); - } - pixel += sign * offset; - } - return pixel; - }, - - getValueForPixel: function(pixel) { - var me = this; - var tickOpts = me.options.ticks; - var reverse = tickOpts.reverse; - var log10 = helpers$1.log10; - var firstTickValue = me._getFirstTickValue(me.minNotZero); - var innerDimension, start, end, value; - - if (reverse) { - start = me.end; - end = me.start; - } else { - start = me.start; - end = me.end; - } - if (me.isHorizontal()) { - innerDimension = me.width; - value = reverse ? me.right - pixel : pixel - me.left; - } else { - innerDimension = me.height; - value = reverse ? pixel - me.top : me.bottom - pixel; - } - if (value !== start) { - if (start === 0) { // include zero tick - var offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); - value -= offset; - innerDimension -= offset; - start = firstTickValue; - } - value *= log10(end) - log10(start); - value /= innerDimension; - value = Math.pow(10, log10(start) + value); - } - return value; - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults$2 = defaultConfig$2; -scale_logarithmic._defaults = _defaults$2; - -var valueOrDefault$b = helpers$1.valueOrDefault; -var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault; -var resolve$7 = helpers$1.options.resolve; - -var defaultConfig$3 = { - display: true, - - // Boolean - Whether to animate scaling the chart from the centre - animate: true, - position: 'chartArea', - - angleLines: { - display: true, - color: 'rgba(0, 0, 0, 0.1)', - lineWidth: 1, - borderDash: [], - borderDashOffset: 0.0 - }, - - gridLines: { - circular: false - }, - - // label settings - ticks: { - // Boolean - Show a backdrop to the scale label - showLabelBackdrop: true, - - // String - The colour of the label backdrop - backdropColor: 'rgba(255,255,255,0.75)', - - // Number - The backdrop padding above & below the label in pixels - backdropPaddingY: 2, - - // Number - The backdrop padding to the side of the label in pixels - backdropPaddingX: 2, - - callback: core_ticks.formatters.linear - }, - - pointLabels: { - // Boolean - if true, show point labels - display: true, - - // Number - Point label font size in pixels - fontSize: 10, - - // Function - Used to convert point labels - callback: function(label) { - return label; - } - } -}; - -function getValueCount(scale) { - var opts = scale.options; - return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; -} - -function getTickBackdropHeight(opts) { - var tickOpts = opts.ticks; - - if (tickOpts.display && opts.display) { - return valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2; - } - return 0; -} - -function measureLabelSize(ctx, lineHeight, label) { - if (helpers$1.isArray(label)) { - return { - w: helpers$1.longestText(ctx, ctx.font, label), - h: label.length * lineHeight - }; - } - - return { - w: ctx.measureText(label).width, - h: lineHeight - }; -} - -function determineLimits(angle, pos, size, min, max) { - if (angle === min || angle === max) { - return { - start: pos - (size / 2), - end: pos + (size / 2) - }; - } else if (angle < min || angle > max) { - return { - start: pos - size, - end: pos - }; - } - - return { - start: pos, - end: pos + size - }; -} - -/** - * Helper function to fit a radial linear scale with point labels - */ -function fitWithPointLabels(scale) { - - // Right, this is really confusing and there is a lot of maths going on here - // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 - // - // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif - // - // Solution: - // - // We assume the radius of the polygon is half the size of the canvas at first - // at each index we check if the text overlaps. - // - // Where it does, we store that angle and that index. - // - // After finding the largest index and angle we calculate how much we need to remove - // from the shape radius to move the point inwards by that x. - // - // We average the left and right distances to get the maximum shape radius that can fit in the box - // along with labels. - // - // Once we have that, we can find the centre point for the chart, by taking the x text protrusion - // on each side, removing that from the size, halving it and adding the left x protrusion width. - // - // This will mean we have a shape fitted to the canvas, as large as it can be with the labels - // and position it in the most space efficient manner - // - // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif - - var plFont = helpers$1.options._parseFont(scale.options.pointLabels); - - // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. - // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points - var furthestLimits = { - l: 0, - r: scale.width, - t: 0, - b: scale.height - scale.paddingTop - }; - var furthestAngles = {}; - var i, textSize, pointPosition; - - scale.ctx.font = plFont.string; - scale._pointLabelSizes = []; - - var valueCount = getValueCount(scale); - for (i = 0; i < valueCount; i++) { - pointPosition = scale.getPointPosition(i, scale.drawingArea + 5); - textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || ''); - scale._pointLabelSizes[i] = textSize; - - // Add quarter circle to make degree 0 mean top of circle - var angleRadians = scale.getIndexAngle(i); - var angle = helpers$1.toDegrees(angleRadians) % 360; - var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); - var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); - - if (hLimits.start < furthestLimits.l) { - furthestLimits.l = hLimits.start; - furthestAngles.l = angleRadians; - } - - if (hLimits.end > furthestLimits.r) { - furthestLimits.r = hLimits.end; - furthestAngles.r = angleRadians; - } - - if (vLimits.start < furthestLimits.t) { - furthestLimits.t = vLimits.start; - furthestAngles.t = angleRadians; - } - - if (vLimits.end > furthestLimits.b) { - furthestLimits.b = vLimits.end; - furthestAngles.b = angleRadians; - } - } - - scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles); -} - -function getTextAlignForAngle(angle) { - if (angle === 0 || angle === 180) { - return 'center'; - } else if (angle < 180) { - return 'left'; - } - - return 'right'; -} - -function fillText(ctx, text, position, lineHeight) { - var y = position.y + lineHeight / 2; - var i, ilen; - - if (helpers$1.isArray(text)) { - for (i = 0, ilen = text.length; i < ilen; ++i) { - ctx.fillText(text[i], position.x, y); - y += lineHeight; - } - } else { - ctx.fillText(text, position.x, y); - } -} - -function adjustPointPositionForLabelHeight(angle, textSize, position) { - if (angle === 90 || angle === 270) { - position.y -= (textSize.h / 2); - } else if (angle > 270 || angle < 90) { - position.y -= textSize.h; - } -} - -function drawPointLabels(scale) { - var ctx = scale.ctx; - var opts = scale.options; - var angleLineOpts = opts.angleLines; - var gridLineOpts = opts.gridLines; - var pointLabelOpts = opts.pointLabels; - var lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth); - var lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color); - var tickBackdropHeight = getTickBackdropHeight(opts); - - ctx.save(); - ctx.lineWidth = lineWidth; - ctx.strokeStyle = lineColor; - if (ctx.setLineDash) { - ctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []])); - ctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]); - } - - var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); - - // Point Label Font - var plFont = helpers$1.options._parseFont(pointLabelOpts); - - ctx.font = plFont.string; - ctx.textBaseline = 'middle'; - - for (var i = getValueCount(scale) - 1; i >= 0; i--) { - if (angleLineOpts.display && lineWidth && lineColor) { - var outerPosition = scale.getPointPosition(i, outerDistance); - ctx.beginPath(); - ctx.moveTo(scale.xCenter, scale.yCenter); - ctx.lineTo(outerPosition.x, outerPosition.y); - ctx.stroke(); - } - - if (pointLabelOpts.display) { - // Extra pixels out for some label spacing - var extra = (i === 0 ? tickBackdropHeight / 2 : 0); - var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5); - - // Keep this in loop since we may support array properties here - var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor); - ctx.fillStyle = pointLabelFontColor; - - var angleRadians = scale.getIndexAngle(i); - var angle = helpers$1.toDegrees(angleRadians); - ctx.textAlign = getTextAlignForAngle(angle); - adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); - fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight); - } - } - ctx.restore(); -} - -function drawRadiusLine(scale, gridLineOpts, radius, index) { - var ctx = scale.ctx; - var circular = gridLineOpts.circular; - var valueCount = getValueCount(scale); - var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1); - var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1); - var pointPosition; - - if ((!circular && !valueCount) || !lineColor || !lineWidth) { - return; - } - - ctx.save(); - ctx.strokeStyle = lineColor; - ctx.lineWidth = lineWidth; - if (ctx.setLineDash) { - ctx.setLineDash(gridLineOpts.borderDash || []); - ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0; - } - - ctx.beginPath(); - if (circular) { - // Draw circular arcs between the points - ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); - } else { - // Draw straight lines connecting each index - pointPosition = scale.getPointPosition(0, radius); - ctx.moveTo(pointPosition.x, pointPosition.y); - - for (var i = 1; i < valueCount; i++) { - pointPosition = scale.getPointPosition(i, radius); - ctx.lineTo(pointPosition.x, pointPosition.y); - } - } - ctx.closePath(); - ctx.stroke(); - ctx.restore(); -} - -function numberOrZero(param) { - return helpers$1.isNumber(param) ? param : 0; -} - -var scale_radialLinear = scale_linearbase.extend({ - setDimensions: function() { - var me = this; - - // Set the unconstrained dimension before label rotation - me.width = me.maxWidth; - me.height = me.maxHeight; - me.paddingTop = getTickBackdropHeight(me.options) / 2; - me.xCenter = Math.floor(me.width / 2); - me.yCenter = Math.floor((me.height - me.paddingTop) / 2); - me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2; - }, - - determineDataLimits: function() { - var me = this; - var chart = me.chart; - var min = Number.POSITIVE_INFINITY; - var max = Number.NEGATIVE_INFINITY; - - helpers$1.each(chart.data.datasets, function(dataset, datasetIndex) { - if (chart.isDatasetVisible(datasetIndex)) { - var meta = chart.getDatasetMeta(datasetIndex); - - helpers$1.each(dataset.data, function(rawValue, index) { - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - min = Math.min(value, min); - max = Math.max(value, max); - }); - } - }); - - me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); - me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); - - // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero - me.handleTickRangeOptions(); - }, - - // Returns the maximum number of ticks based on the scale dimension - _computeTickLimit: function() { - return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); - }, - - convertTicksToLabels: function() { - var me = this; - - scale_linearbase.prototype.convertTicksToLabels.call(me); - - // Point labels - me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); - }, - - getLabelForIndex: function(index, datasetIndex) { - return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); - }, - - fit: function() { - var me = this; - var opts = me.options; - - if (opts.display && opts.pointLabels.display) { - fitWithPointLabels(me); - } else { - me.setCenterPoint(0, 0, 0, 0); - } - }, - - /** - * Set radius reductions and determine new radius and center point - * @private - */ - setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) { - var me = this; - var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); - var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); - var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); - var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b); - - radiusReductionLeft = numberOrZero(radiusReductionLeft); - radiusReductionRight = numberOrZero(radiusReductionRight); - radiusReductionTop = numberOrZero(radiusReductionTop); - radiusReductionBottom = numberOrZero(radiusReductionBottom); - - me.drawingArea = Math.min( - Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), - Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); - me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); - }, - - setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) { - var me = this; - var maxRight = me.width - rightMovement - me.drawingArea; - var maxLeft = leftMovement + me.drawingArea; - var maxTop = topMovement + me.drawingArea; - var maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea; - - me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left); - me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop); - }, - - getIndexAngle: function(index) { - var angleMultiplier = (Math.PI * 2) / getValueCount(this); - var startAngle = this.chart.options && this.chart.options.startAngle ? - this.chart.options.startAngle : - 0; - - var startAngleRadians = startAngle * Math.PI * 2 / 360; - - // Start from the top instead of right, so remove a quarter of the circle - return index * angleMultiplier + startAngleRadians; - }, - - getDistanceFromCenterForValue: function(value) { - var me = this; - - if (value === null) { - return 0; // null always in center - } - - // Take into account half font size + the yPadding of the top value - var scalingFactor = me.drawingArea / (me.max - me.min); - if (me.options.ticks.reverse) { - return (me.max - value) * scalingFactor; - } - return (value - me.min) * scalingFactor; - }, - - getPointPosition: function(index, distanceFromCenter) { - var me = this; - var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); - return { - x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter, - y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter - }; - }, - - getPointPositionForValue: function(index, value) { - return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); - }, - - getBasePosition: function() { - var me = this; - var min = me.min; - var max = me.max; - - return me.getPointPositionForValue(0, - me.beginAtZero ? 0 : - min < 0 && max < 0 ? max : - min > 0 && max > 0 ? min : - 0); - }, - - draw: function() { - var me = this; - var opts = me.options; - var gridLineOpts = opts.gridLines; - var tickOpts = opts.ticks; - - if (opts.display) { - var ctx = me.ctx; - var startAngle = this.getIndexAngle(0); - var tickFont = helpers$1.options._parseFont(tickOpts); - - if (opts.angleLines.display || opts.pointLabels.display) { - drawPointLabels(me); - } - - helpers$1.each(me.ticks, function(label, index) { - // Don't draw a centre value (if it is minimum) - if (index > 0 || tickOpts.reverse) { - var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); - - // Draw circular lines around the scale - if (gridLineOpts.display && index !== 0) { - drawRadiusLine(me, gridLineOpts, yCenterOffset, index); - } - - if (tickOpts.display) { - var tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor); - ctx.font = tickFont.string; - - ctx.save(); - ctx.translate(me.xCenter, me.yCenter); - ctx.rotate(startAngle); - - if (tickOpts.showLabelBackdrop) { - var labelWidth = ctx.measureText(label).width; - ctx.fillStyle = tickOpts.backdropColor; - ctx.fillRect( - -labelWidth / 2 - tickOpts.backdropPaddingX, - -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY, - labelWidth + tickOpts.backdropPaddingX * 2, - tickFont.size + tickOpts.backdropPaddingY * 2 - ); - } - - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = tickFontColor; - ctx.fillText(label, 0, -yCenterOffset); - ctx.restore(); - } - } - }); - } - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults$3 = defaultConfig$3; -scale_radialLinear._defaults = _defaults$3; - -var valueOrDefault$c = helpers$1.valueOrDefault; - -// Integer constants are from the ES6 spec. -var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; -var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; - -var INTERVALS = { - millisecond: { - common: true, - size: 1, - steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] - }, - second: { - common: true, - size: 1000, - steps: [1, 2, 5, 10, 15, 30] - }, - minute: { - common: true, - size: 60000, - steps: [1, 2, 5, 10, 15, 30] - }, - hour: { - common: true, - size: 3600000, - steps: [1, 2, 3, 6, 12] - }, - day: { - common: true, - size: 86400000, - steps: [1, 2, 5] - }, - week: { - common: false, - size: 604800000, - steps: [1, 2, 3, 4] - }, - month: { - common: true, - size: 2.628e9, - steps: [1, 2, 3] - }, - quarter: { - common: false, - size: 7.884e9, - steps: [1, 2, 3, 4] - }, - year: { - common: true, - size: 3.154e10 - } -}; - -var UNITS = Object.keys(INTERVALS); - -function sorter(a, b) { - return a - b; -} - -function arrayUnique(items) { - var hash = {}; - var out = []; - var i, ilen, item; - - for (i = 0, ilen = items.length; i < ilen; ++i) { - item = items[i]; - if (!hash[item]) { - hash[item] = true; - out.push(item); - } - } - - return out; -} - -/** - * Returns an array of {time, pos} objects used to interpolate a specific `time` or position - * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is - * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other - * extremity (left + width or top + height). Note that it would be more optimized to directly - * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need - * to create the lookup table. The table ALWAYS contains at least two items: min and max. - * - * @param {number[]} timestamps - timestamps sorted from lowest to highest. - * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min - * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. - * If 'series', timestamps will be positioned at the same distance from each other. In this - * case, only timestamps that break the time linearity are registered, meaning that in the - * best case, all timestamps are linear, the table contains only min and max. - */ -function buildLookupTable(timestamps, min, max, distribution) { - if (distribution === 'linear' || !timestamps.length) { - return [ - {time: min, pos: 0}, - {time: max, pos: 1} - ]; - } - - var table = []; - var items = [min]; - var i, ilen, prev, curr, next; - - for (i = 0, ilen = timestamps.length; i < ilen; ++i) { - curr = timestamps[i]; - if (curr > min && curr < max) { - items.push(curr); - } - } - - items.push(max); - - for (i = 0, ilen = items.length; i < ilen; ++i) { - next = items[i + 1]; - prev = items[i - 1]; - curr = items[i]; - - // only add points that breaks the scale linearity - if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { - table.push({time: curr, pos: i / (ilen - 1)}); - } - } - - return table; -} - -// @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ -function lookup(table, key, value) { - var lo = 0; - var hi = table.length - 1; - var mid, i0, i1; - - while (lo >= 0 && lo <= hi) { - mid = (lo + hi) >> 1; - i0 = table[mid - 1] || null; - i1 = table[mid]; - - if (!i0) { - // given value is outside table (before first item) - return {lo: null, hi: i1}; - } else if (i1[key] < value) { - lo = mid + 1; - } else if (i0[key] > value) { - hi = mid - 1; - } else { - return {lo: i0, hi: i1}; - } - } - - // given value is outside table (after last item) - return {lo: i1, hi: null}; -} - -/** - * Linearly interpolates the given source `value` using the table items `skey` values and - * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') - * returns the position for a timestamp equal to 42. If value is out of bounds, values at - * index [0, 1] or [n - 1, n] are used for the interpolation. - */ -function interpolate$1(table, skey, sval, tkey) { - var range = lookup(table, skey, sval); - - // Note: the lookup table ALWAYS contains at least 2 items (min and max) - var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; - var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; - - var span = next[skey] - prev[skey]; - var ratio = span ? (sval - prev[skey]) / span : 0; - var offset = (next[tkey] - prev[tkey]) * ratio; - - return prev[tkey] + offset; -} - -function toTimestamp(scale, input) { - var adapter = scale._adapter; - var options = scale.options.time; - var parser = options.parser; - var format = parser || options.format; - var value = input; - - if (typeof parser === 'function') { - value = parser(value); - } - - // Only parse if its not a timestamp already - if (!helpers$1.isFinite(value)) { - value = typeof format === 'string' - ? adapter.parse(value, format) - : adapter.parse(value); - } - - if (value !== null) { - return +value; - } - - // Labels are in an incompatible format and no `parser` has been provided. - // The user might still use the deprecated `format` option for parsing. - if (!parser && typeof format === 'function') { - value = format(input); - - // `format` could return something else than a timestamp, if so, parse it - if (!helpers$1.isFinite(value)) { - value = adapter.parse(value); - } - } - - return value; -} - -function parse(scale, input) { - if (helpers$1.isNullOrUndef(input)) { - return null; - } - - var options = scale.options.time; - var value = toTimestamp(scale, scale.getRightValue(input)); - if (value === null) { - return value; - } - - if (options.round) { - value = +scale._adapter.startOf(value, options.round); - } - - return value; -} - -/** - * Returns the number of unit to skip to be able to display up to `capacity` number of ticks - * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. - */ -function determineStepSize(min, max, unit, capacity) { - var range = max - min; - var interval = INTERVALS[unit]; - var milliseconds = interval.size; - var steps = interval.steps; - var i, ilen, factor; - - if (!steps) { - return Math.ceil(range / (capacity * milliseconds)); - } - - for (i = 0, ilen = steps.length; i < ilen; ++i) { - factor = steps[i]; - if (Math.ceil(range / (milliseconds * factor)) <= capacity) { - break; - } - } - - return factor; -} - -/** - * Figures out what unit results in an appropriate number of auto-generated ticks - */ -function determineUnitForAutoTicks(minUnit, min, max, capacity) { - var ilen = UNITS.length; - var i, interval, factor; - - for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { - interval = INTERVALS[UNITS[i]]; - factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; - - if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { - return UNITS[i]; - } - } - - return UNITS[ilen - 1]; -} - -/** - * Figures out what unit to format a set of ticks with - */ -function determineUnitForFormatting(scale, ticks, minUnit, min, max) { - var ilen = UNITS.length; - var i, unit; - - for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { - unit = UNITS[i]; - if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) { - return unit; - } - } - - return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; -} - -function determineMajorUnit(unit) { - for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { - if (INTERVALS[UNITS[i]].common) { - return UNITS[i]; - } - } -} - -/** - * Generates a maximum of `capacity` timestamps between min and max, rounded to the - * `minor` unit, aligned on the `major` unit and using the given scale time `options`. - * Important: this method can return ticks outside the min and max range, it's the - * responsibility of the calling code to clamp values if needed. - */ -function generate(scale, min, max, capacity) { - var adapter = scale._adapter; - var options = scale.options; - var timeOpts = options.time; - var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); - var major = determineMajorUnit(minor); - var stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize); - var weekday = minor === 'week' ? timeOpts.isoWeekday : false; - var majorTicksEnabled = options.ticks.major.enabled; - var interval = INTERVALS[minor]; - var first = min; - var last = max; - var ticks = []; - var time; - - if (!stepSize) { - stepSize = determineStepSize(min, max, minor, capacity); - } - - // For 'week' unit, handle the first day of week option - if (weekday) { - first = +adapter.startOf(first, 'isoWeek', weekday); - last = +adapter.startOf(last, 'isoWeek', weekday); - } - - // Align first/last ticks on unit - first = +adapter.startOf(first, weekday ? 'day' : minor); - last = +adapter.startOf(last, weekday ? 'day' : minor); - - // Make sure that the last tick include max - if (last < max) { - last = +adapter.add(last, 1, minor); - } - - time = first; - - if (majorTicksEnabled && major && !weekday && !timeOpts.round) { - // Align the first tick on the previous `minor` unit aligned on the `major` unit: - // we first aligned time on the previous `major` unit then add the number of full - // stepSize there is between first and the previous major time. - time = +adapter.startOf(time, major); - time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor); - } - - for (; time < last; time = +adapter.add(time, stepSize, minor)) { - ticks.push(+time); - } - - ticks.push(+time); - - return ticks; -} - -/** - * Returns the start and end offsets from edges in the form of {start, end} - * where each value is a relative width to the scale and ranges between 0 and 1. - * They add extra margins on the both sides by scaling down the original scale. - * Offsets are added when the `offset` option is true. - */ -function computeOffsets(table, ticks, min, max, options) { - var start = 0; - var end = 0; - var first, last; - - if (options.offset && ticks.length) { - if (!options.time.min) { - first = interpolate$1(table, 'time', ticks[0], 'pos'); - if (ticks.length === 1) { - start = 1 - first; - } else { - start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2; - } - } - if (!options.time.max) { - last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos'); - if (ticks.length === 1) { - end = last; - } else { - end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2; - } - } - } - - return {start: start, end: end}; -} - -function ticksFromTimestamps(scale, values, majorUnit) { - var ticks = []; - var i, ilen, value, major; - - for (i = 0, ilen = values.length; i < ilen; ++i) { - value = values[i]; - major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false; - - ticks.push({ - value: value, - major: major - }); - } - - return ticks; -} - -var defaultConfig$4 = { - position: 'bottom', - - /** - * Data distribution along the scale: - * - 'linear': data are spread according to their time (distances can vary), - * - 'series': data are spread at the same distance from each other. - * @see https://github.com/chartjs/Chart.js/pull/4507 - * @since 2.7.0 - */ - distribution: 'linear', - - /** - * Scale boundary strategy (bypassed by min/max time options) - * - `data`: make sure data are fully visible, ticks outside are removed - * - `ticks`: make sure ticks are fully visible, data outside are truncated - * @see https://github.com/chartjs/Chart.js/pull/4556 - * @since 2.7.0 - */ - bounds: 'data', - - adapters: {}, - time: { - parser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment - format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/ - unit: false, // false == automatic or override with week, month, year, etc. - round: false, // none, or override with week, month, year, etc. - displayFormat: false, // DEPRECATED - isoWeekday: false, // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/ - minUnit: 'millisecond', - displayFormats: {} - }, - ticks: { - autoSkip: false, - - /** - * Ticks generation input values: - * - 'auto': generates "optimal" ticks based on scale size and time options. - * - 'data': generates ticks from data (including labels from data {t|x|y} objects). - * - 'labels': generates ticks from user given `data.labels` values ONLY. - * @see https://github.com/chartjs/Chart.js/pull/4507 - * @since 2.7.0 - */ - source: 'auto', - - major: { - enabled: false - } - } -}; - -var scale_time = core_scale.extend({ - initialize: function() { - this.mergeTicksOptions(); - core_scale.prototype.initialize.call(this); - }, - - update: function() { - var me = this; - var options = me.options; - var time = options.time || (options.time = {}); - var adapter = me._adapter = new core_adapters._date(options.adapters.date); - - // DEPRECATIONS: output a message only one time per update - if (time.format) { - console.warn('options.time.format is deprecated and replaced by options.time.parser.'); - } - - // Backward compatibility: before introducing adapter, `displayFormats` was - // supposed to contain *all* unit/string pairs but this can't be resolved - // when loading the scale (adapters are loaded afterward), so let's populate - // missing formats on update - helpers$1.mergeIf(time.displayFormats, adapter.formats()); - - return core_scale.prototype.update.apply(me, arguments); - }, - - /** - * Allows data to be referenced via 't' attribute - */ - getRightValue: function(rawValue) { - if (rawValue && rawValue.t !== undefined) { - rawValue = rawValue.t; - } - return core_scale.prototype.getRightValue.call(this, rawValue); - }, - - determineDataLimits: function() { - var me = this; - var chart = me.chart; - var adapter = me._adapter; - var timeOpts = me.options.time; - var unit = timeOpts.unit || 'day'; - var min = MAX_INTEGER; - var max = MIN_INTEGER; - var timestamps = []; - var datasets = []; - var labels = []; - var i, j, ilen, jlen, data, timestamp; - var dataLabels = chart.data.labels || []; - - // Convert labels to timestamps - for (i = 0, ilen = dataLabels.length; i < ilen; ++i) { - labels.push(parse(me, dataLabels[i])); - } - - // Convert data to timestamps - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - if (chart.isDatasetVisible(i)) { - data = chart.data.datasets[i].data; - - // Let's consider that all data have the same format. - if (helpers$1.isObject(data[0])) { - datasets[i] = []; - - for (j = 0, jlen = data.length; j < jlen; ++j) { - timestamp = parse(me, data[j]); - timestamps.push(timestamp); - datasets[i][j] = timestamp; - } - } else { - for (j = 0, jlen = labels.length; j < jlen; ++j) { - timestamps.push(labels[j]); - } - datasets[i] = labels.slice(0); - } - } else { - datasets[i] = []; - } - } - - if (labels.length) { - // Sort labels **after** data have been converted - labels = arrayUnique(labels).sort(sorter); - min = Math.min(min, labels[0]); - max = Math.max(max, labels[labels.length - 1]); - } - - if (timestamps.length) { - timestamps = arrayUnique(timestamps).sort(sorter); - min = Math.min(min, timestamps[0]); - max = Math.max(max, timestamps[timestamps.length - 1]); - } - - min = parse(me, timeOpts.min) || min; - max = parse(me, timeOpts.max) || max; - - // In case there is no valid min/max, set limits based on unit time option - min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min; - max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max; - - // Make sure that max is strictly higher than min (required by the lookup table) - me.min = Math.min(min, max); - me.max = Math.max(min + 1, max); - - // PRIVATE - me._horizontal = me.isHorizontal(); - me._table = []; - me._timestamps = { - data: timestamps, - datasets: datasets, - labels: labels - }; - }, - - buildTicks: function() { - var me = this; - var min = me.min; - var max = me.max; - var options = me.options; - var timeOpts = options.time; - var timestamps = []; - var ticks = []; - var i, ilen, timestamp; - - switch (options.ticks.source) { - case 'data': - timestamps = me._timestamps.data; - break; - case 'labels': - timestamps = me._timestamps.labels; - break; - case 'auto': - default: - timestamps = generate(me, min, max, me.getLabelCapacity(min), options); - } - - if (options.bounds === 'ticks' && timestamps.length) { - min = timestamps[0]; - max = timestamps[timestamps.length - 1]; - } - - // Enforce limits with user min/max options - min = parse(me, timeOpts.min) || min; - max = parse(me, timeOpts.max) || max; - - // Remove ticks outside the min/max range - for (i = 0, ilen = timestamps.length; i < ilen; ++i) { - timestamp = timestamps[i]; - if (timestamp >= min && timestamp <= max) { - ticks.push(timestamp); - } - } - - me.min = min; - me.max = max; - - // PRIVATE - me._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max); - me._majorUnit = determineMajorUnit(me._unit); - me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); - me._offsets = computeOffsets(me._table, ticks, min, max, options); - - if (options.ticks.reverse) { - ticks.reverse(); - } - - return ticksFromTimestamps(me, ticks, me._majorUnit); - }, - - getLabelForIndex: function(index, datasetIndex) { - var me = this; - var adapter = me._adapter; - var data = me.chart.data; - var timeOpts = me.options.time; - var label = data.labels && index < data.labels.length ? data.labels[index] : ''; - var value = data.datasets[datasetIndex].data[index]; - - if (helpers$1.isObject(value)) { - label = me.getRightValue(value); - } - if (timeOpts.tooltipFormat) { - return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat); - } - if (typeof label === 'string') { - return label; - } - return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime); - }, - - /** - * Function to format an individual tick mark - * @private - */ - tickFormatFunction: function(time, index, ticks, format) { - var me = this; - var adapter = me._adapter; - var options = me.options; - var formats = options.time.displayFormats; - var minorFormat = formats[me._unit]; - var majorUnit = me._majorUnit; - var majorFormat = formats[majorUnit]; - var majorTime = +adapter.startOf(time, majorUnit); - var majorTickOpts = options.ticks.major; - var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; - var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat); - var tickOpts = major ? majorTickOpts : options.ticks.minor; - var formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback); - - return formatter ? formatter(label, index, ticks) : label; - }, - - convertTicksToLabels: function(ticks) { - var labels = []; - var i, ilen; - - for (i = 0, ilen = ticks.length; i < ilen; ++i) { - labels.push(this.tickFormatFunction(ticks[i].value, i, ticks)); - } - - return labels; - }, - - /** - * @private - */ - getPixelForOffset: function(time) { - var me = this; - var isReverse = me.options.ticks.reverse; - var size = me._horizontal ? me.width : me.height; - var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top; - var pos = interpolate$1(me._table, 'time', time, 'pos'); - var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end); - - return isReverse ? start - offset : start + offset; - }, - - getPixelForValue: function(value, index, datasetIndex) { - var me = this; - var time = null; - - if (index !== undefined && datasetIndex !== undefined) { - time = me._timestamps.datasets[datasetIndex][index]; - } - - if (time === null) { - time = parse(me, value); - } - - if (time !== null) { - return me.getPixelForOffset(time); - } - }, - - getPixelForTick: function(index) { - var ticks = this.getTicks(); - return index >= 0 && index < ticks.length ? - this.getPixelForOffset(ticks[index].value) : - null; - }, - - getValueForPixel: function(pixel) { - var me = this; - var size = me._horizontal ? me.width : me.height; - var start = me._horizontal ? me.left : me.top; - var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end; - var time = interpolate$1(me._table, 'pos', pos, 'time'); - - // DEPRECATION, we should return time directly - return me._adapter._create(time); - }, - - /** - * Crude approximation of what the label width might be - * @private - */ - getLabelWidth: function(label) { - var me = this; - var ticksOpts = me.options.ticks; - var tickLabelWidth = me.ctx.measureText(label).width; - var angle = helpers$1.toRadians(ticksOpts.maxRotation); - var cosRotation = Math.cos(angle); - var sinRotation = Math.sin(angle); - var tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize); - - return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); - }, - - /** - * @private - */ - getLabelCapacity: function(exampleTime) { - var me = this; - - // pick the longest format (milliseconds) for guestimation - var format = me.options.time.displayFormats.millisecond; - var exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format); - var tickLabelWidth = me.getLabelWidth(exampleLabel); - var innerWidth = me.isHorizontal() ? me.width : me.height; - var capacity = Math.floor(innerWidth / tickLabelWidth); - - return capacity > 0 ? capacity : 1; - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults$4 = defaultConfig$4; -scale_time._defaults = _defaults$4; - -var scales = { - category: scale_category, - linear: scale_linear, - logarithmic: scale_logarithmic, - radialLinear: scale_radialLinear, - time: scale_time -}; - -var FORMATS = { - datetime: 'MMM D, YYYY, h:mm:ss a', - millisecond: 'h:mm:ss.SSS a', - second: 'h:mm:ss a', - minute: 'h:mm a', - hour: 'hA', - day: 'MMM D', - week: 'll', - month: 'MMM YYYY', - quarter: '[Q]Q - YYYY', - year: 'YYYY' -}; - -core_adapters._date.override(typeof moment === 'function' ? { - _id: 'moment', // DEBUG ONLY - - formats: function() { - return FORMATS; - }, - - parse: function(value, format) { - if (typeof value === 'string' && typeof format === 'string') { - value = moment(value, format); - } else if (!(value instanceof moment)) { - value = moment(value); - } - return value.isValid() ? value.valueOf() : null; - }, - - format: function(time, format) { - return moment(time).format(format); - }, - - add: function(time, amount, unit) { - return moment(time).add(amount, unit).valueOf(); - }, - - diff: function(max, min, unit) { - return moment.duration(moment(max).diff(moment(min))).as(unit); - }, - - startOf: function(time, unit, weekday) { - time = moment(time); - if (unit === 'isoWeek') { - return time.isoWeekday(weekday).valueOf(); - } - return time.startOf(unit).valueOf(); - }, - - endOf: function(time, unit) { - return moment(time).endOf(unit).valueOf(); - }, - - // DEPRECATIONS - - /** - * Provided for backward compatibility with scale.getValueForPixel(). - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ - _create: function(time) { - return moment(time); - }, -} : {}); - -core_defaults._set('global', { - plugins: { - filler: { - propagate: true - } - } -}); - -var mappers = { - dataset: function(source) { - var index = source.fill; - var chart = source.chart; - var meta = chart.getDatasetMeta(index); - var visible = meta && chart.isDatasetVisible(index); - var points = (visible && meta.dataset._children) || []; - var length = points.length || 0; - - return !length ? null : function(point, i) { - return (i < length && points[i]._view) || null; - }; - }, - - boundary: function(source) { - var boundary = source.boundary; - var x = boundary ? boundary.x : null; - var y = boundary ? boundary.y : null; - - return function(point) { - return { - x: x === null ? point.x : x, - y: y === null ? point.y : y, - }; - }; - } -}; - -// @todo if (fill[0] === '#') -function decodeFill(el, index, count) { - var model = el._model || {}; - var fill = model.fill; - var target; - - if (fill === undefined) { - fill = !!model.backgroundColor; - } - - if (fill === false || fill === null) { - return false; - } - - if (fill === true) { - return 'origin'; - } - - target = parseFloat(fill, 10); - if (isFinite(target) && Math.floor(target) === target) { - if (fill[0] === '-' || fill[0] === '+') { - target = index + target; - } - - if (target === index || target < 0 || target >= count) { - return false; - } - - return target; - } - - switch (fill) { - // compatibility - case 'bottom': - return 'start'; - case 'top': - return 'end'; - case 'zero': - return 'origin'; - // supported boundaries - case 'origin': - case 'start': - case 'end': - return fill; - // invalid fill values - default: - return false; - } -} - -function computeBoundary(source) { - var model = source.el._model || {}; - var scale = source.el._scale || {}; - var fill = source.fill; - var target = null; - var horizontal; - - if (isFinite(fill)) { - return null; - } - - // Backward compatibility: until v3, we still need to support boundary values set on - // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and - // controllers might still use it (e.g. the Smith chart). - - if (fill === 'start') { - target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; - } else if (fill === 'end') { - target = model.scaleTop === undefined ? scale.top : model.scaleTop; - } else if (model.scaleZero !== undefined) { - target = model.scaleZero; - } else if (scale.getBasePosition) { - target = scale.getBasePosition(); - } else if (scale.getBasePixel) { - target = scale.getBasePixel(); - } - - if (target !== undefined && target !== null) { - if (target.x !== undefined && target.y !== undefined) { - return target; - } - - if (helpers$1.isFinite(target)) { - horizontal = scale.isHorizontal(); - return { - x: horizontal ? target : null, - y: horizontal ? null : target - }; - } - } - - return null; -} - -function resolveTarget(sources, index, propagate) { - var source = sources[index]; - var fill = source.fill; - var visited = [index]; - var target; - - if (!propagate) { - return fill; - } - - while (fill !== false && visited.indexOf(fill) === -1) { - if (!isFinite(fill)) { - return fill; - } - - target = sources[fill]; - if (!target) { - return false; - } - - if (target.visible) { - return fill; - } - - visited.push(fill); - fill = target.fill; - } - - return false; -} - -function createMapper(source) { - var fill = source.fill; - var type = 'dataset'; - - if (fill === false) { - return null; - } - - if (!isFinite(fill)) { - type = 'boundary'; - } - - return mappers[type](source); -} - -function isDrawable(point) { - return point && !point.skip; -} - -function drawArea(ctx, curve0, curve1, len0, len1) { - var i; - - if (!len0 || !len1) { - return; - } - - // building first area curve (normal) - ctx.moveTo(curve0[0].x, curve0[0].y); - for (i = 1; i < len0; ++i) { - helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); - } - - // joining the two area curves - ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); - - // building opposite area curve (reverse) - for (i = len1 - 1; i > 0; --i) { - helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); - } -} - -function doFill(ctx, points, mapper, view, color, loop) { - var count = points.length; - var span = view.spanGaps; - var curve0 = []; - var curve1 = []; - var len0 = 0; - var len1 = 0; - var i, ilen, index, p0, p1, d0, d1; - - ctx.beginPath(); - - for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { - index = i % count; - p0 = points[index]._view; - p1 = mapper(p0, index, view); - d0 = isDrawable(p0); - d1 = isDrawable(p1); - - if (d0 && d1) { - len0 = curve0.push(p0); - len1 = curve1.push(p1); - } else if (len0 && len1) { - if (!span) { - drawArea(ctx, curve0, curve1, len0, len1); - len0 = len1 = 0; - curve0 = []; - curve1 = []; - } else { - if (d0) { - curve0.push(p0); - } - if (d1) { - curve1.push(p1); - } - } - } - } - - drawArea(ctx, curve0, curve1, len0, len1); - - ctx.closePath(); - ctx.fillStyle = color; - ctx.fill(); -} - -var plugin_filler = { - id: 'filler', - - afterDatasetsUpdate: function(chart, options) { - var count = (chart.data.datasets || []).length; - var propagate = options.propagate; - var sources = []; - var meta, i, el, source; - - for (i = 0; i < count; ++i) { - meta = chart.getDatasetMeta(i); - el = meta.dataset; - source = null; - - if (el && el._model && el instanceof elements.Line) { - source = { - visible: chart.isDatasetVisible(i), - fill: decodeFill(el, i, count), - chart: chart, - el: el - }; - } - - meta.$filler = source; - sources.push(source); - } - - for (i = 0; i < count; ++i) { - source = sources[i]; - if (!source) { - continue; - } - - source.fill = resolveTarget(sources, i, propagate); - source.boundary = computeBoundary(source); - source.mapper = createMapper(source); - } - }, - - beforeDatasetDraw: function(chart, args) { - var meta = args.meta.$filler; - if (!meta) { - return; - } - - var ctx = chart.ctx; - var el = meta.el; - var view = el._view; - var points = el._children || []; - var mapper = meta.mapper; - var color = view.backgroundColor || core_defaults.global.defaultColor; - - if (mapper && color && points.length) { - helpers$1.canvas.clipArea(ctx, chart.chartArea); - doFill(ctx, points, mapper, view, color, el._loop); - helpers$1.canvas.unclipArea(ctx); - } - } -}; - -var noop$1 = helpers$1.noop; -var valueOrDefault$d = helpers$1.valueOrDefault; - -core_defaults._set('global', { - legend: { - display: true, - position: 'top', - fullWidth: true, - reverse: false, - weight: 1000, - - // a callback that will handle - onClick: function(e, legendItem) { - var index = legendItem.datasetIndex; - var ci = this.chart; - var meta = ci.getDatasetMeta(index); - - // See controller.isDatasetVisible comment - meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; - - // We hid a dataset ... rerender the chart - ci.update(); - }, - - onHover: null, - onLeave: null, - - labels: { - boxWidth: 40, - padding: 10, - // Generates labels shown in the legend - // Valid properties to return: - // text : text to display - // fillStyle : fill of coloured box - // strokeStyle: stroke of coloured box - // hidden : if this legend item refers to a hidden item - // lineCap : cap style for line - // lineDash - // lineDashOffset : - // lineJoin : - // lineWidth : - generateLabels: function(chart) { - var data = chart.data; - return helpers$1.isArray(data.datasets) ? data.datasets.map(function(dataset, i) { - return { - text: dataset.label, - fillStyle: (!helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), - hidden: !chart.isDatasetVisible(i), - lineCap: dataset.borderCapStyle, - lineDash: dataset.borderDash, - lineDashOffset: dataset.borderDashOffset, - lineJoin: dataset.borderJoinStyle, - lineWidth: dataset.borderWidth, - strokeStyle: dataset.borderColor, - pointStyle: dataset.pointStyle, - - // Below is extra data used for toggling the datasets - datasetIndex: i - }; - }, this) : []; - } - } - }, - - legendCallback: function(chart) { - var text = []; - text.push('
    '); - for (var i = 0; i < chart.data.datasets.length; i++) { - text.push('
  • '); - if (chart.data.datasets[i].label) { - text.push(chart.data.datasets[i].label); - } - text.push('
  • '); - } - text.push('
'); - return text.join(''); - } -}); - -/** - * Helper function to get the box width based on the usePointStyle option - * @param {object} labelopts - the label options on the legend - * @param {number} fontSize - the label font size - * @return {number} width of the color box area - */ -function getBoxWidth(labelOpts, fontSize) { - return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ? - fontSize : - labelOpts.boxWidth; -} - -/** - * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! - */ -var Legend = core_element.extend({ - - initialize: function(config) { - helpers$1.extend(this, config); - - // Contains hit boxes for each dataset (in dataset order) - this.legendHitBoxes = []; - - /** - * @private - */ - this._hoveredItem = null; - - // Are we in doughnut mode which has a different data type - this.doughnutMode = false; - }, - - // These methods are ordered by lifecycle. Utilities then follow. - // Any function defined here is inherited by all legend types. - // Any function can be extended by the legend type - - beforeUpdate: noop$1, - update: function(maxWidth, maxHeight, margins) { - var me = this; - - // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) - me.beforeUpdate(); - - // Absorb the master measurements - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me.margins = margins; - - // Dimensions - me.beforeSetDimensions(); - me.setDimensions(); - me.afterSetDimensions(); - // Labels - me.beforeBuildLabels(); - me.buildLabels(); - me.afterBuildLabels(); - - // Fit - me.beforeFit(); - me.fit(); - me.afterFit(); - // - me.afterUpdate(); - - return me.minSize; - }, - afterUpdate: noop$1, - - // - - beforeSetDimensions: noop$1, - setDimensions: function() { - var me = this; - // Set the unconstrained dimension before label rotation - if (me.isHorizontal()) { - // Reset position before calculating rotation - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; - } else { - me.height = me.maxHeight; - - // Reset position before calculating rotation - me.top = 0; - me.bottom = me.height; - } - - // Reset padding - me.paddingLeft = 0; - me.paddingTop = 0; - me.paddingRight = 0; - me.paddingBottom = 0; - - // Reset minSize - me.minSize = { - width: 0, - height: 0 - }; - }, - afterSetDimensions: noop$1, - - // - - beforeBuildLabels: noop$1, - buildLabels: function() { - var me = this; - var labelOpts = me.options.labels || {}; - var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || []; - - if (labelOpts.filter) { - legendItems = legendItems.filter(function(item) { - return labelOpts.filter(item, me.chart.data); - }); - } - - if (me.options.reverse) { - legendItems.reverse(); - } - - me.legendItems = legendItems; - }, - afterBuildLabels: noop$1, - - // - - beforeFit: noop$1, - fit: function() { - var me = this; - var opts = me.options; - var labelOpts = opts.labels; - var display = opts.display; - - var ctx = me.ctx; - - var labelFont = helpers$1.options._parseFont(labelOpts); - var fontSize = labelFont.size; - - // Reset hit boxes - var hitboxes = me.legendHitBoxes = []; - - var minSize = me.minSize; - var isHorizontal = me.isHorizontal(); - - if (isHorizontal) { - minSize.width = me.maxWidth; // fill all the width - minSize.height = display ? 10 : 0; - } else { - minSize.width = display ? 10 : 0; - minSize.height = me.maxHeight; // fill all the height - } - - // Increase sizes here - if (display) { - ctx.font = labelFont.string; - - if (isHorizontal) { - // Labels - - // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one - var lineWidths = me.lineWidths = [0]; - var totalHeight = 0; - - ctx.textAlign = 'left'; - ctx.textBaseline = 'top'; - - helpers$1.each(me.legendItems, function(legendItem, i) { - var boxWidth = getBoxWidth(labelOpts, fontSize); - var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; - - if (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) { - totalHeight += fontSize + labelOpts.padding; - lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding; - } - - // Store the hitbox width and height here. Final position will be updated in `draw` - hitboxes[i] = { - left: 0, - top: 0, - width: width, - height: fontSize - }; - - lineWidths[lineWidths.length - 1] += width + labelOpts.padding; - }); - - minSize.height += totalHeight; - - } else { - var vPadding = labelOpts.padding; - var columnWidths = me.columnWidths = []; - var totalWidth = labelOpts.padding; - var currentColWidth = 0; - var currentColHeight = 0; - var itemHeight = fontSize + vPadding; - - helpers$1.each(me.legendItems, function(legendItem, i) { - var boxWidth = getBoxWidth(labelOpts, fontSize); - var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; - - // If too tall, go to new column - if (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) { - totalWidth += currentColWidth + labelOpts.padding; - columnWidths.push(currentColWidth); // previous column width - - currentColWidth = 0; - currentColHeight = 0; - } - - // Get max width - currentColWidth = Math.max(currentColWidth, itemWidth); - currentColHeight += itemHeight; - - // Store the hitbox width and height here. Final position will be updated in `draw` - hitboxes[i] = { - left: 0, - top: 0, - width: itemWidth, - height: fontSize - }; - }); - - totalWidth += currentColWidth; - columnWidths.push(currentColWidth); - minSize.width += totalWidth; - } - } - - me.width = minSize.width; - me.height = minSize.height; - }, - afterFit: noop$1, - - // Shared Methods - isHorizontal: function() { - return this.options.position === 'top' || this.options.position === 'bottom'; - }, - - // Actually draw the legend on the canvas - draw: function() { - var me = this; - var opts = me.options; - var labelOpts = opts.labels; - var globalDefaults = core_defaults.global; - var defaultColor = globalDefaults.defaultColor; - var lineDefault = globalDefaults.elements.line; - var legendWidth = me.width; - var lineWidths = me.lineWidths; - - if (opts.display) { - var ctx = me.ctx; - var fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor); - var labelFont = helpers$1.options._parseFont(labelOpts); - var fontSize = labelFont.size; - var cursor; - - // Canvas setup - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; - ctx.lineWidth = 0.5; - ctx.strokeStyle = fontColor; // for strikethrough effect - ctx.fillStyle = fontColor; // render in correct colour - ctx.font = labelFont.string; - - var boxWidth = getBoxWidth(labelOpts, fontSize); - var hitboxes = me.legendHitBoxes; - - // current position - var drawLegendBox = function(x, y, legendItem) { - if (isNaN(boxWidth) || boxWidth <= 0) { - return; - } - - // Set the ctx for the box - ctx.save(); - - var lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth); - ctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor); - ctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle); - ctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset); - ctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle); - ctx.lineWidth = lineWidth; - ctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor); - - if (ctx.setLineDash) { - // IE 9 and 10 do not support line dash - ctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash)); - } - - if (opts.labels && opts.labels.usePointStyle) { - // Recalculate x and y for drawPoint() because its expecting - // x and y to be center of figure (instead of top left) - var radius = boxWidth * Math.SQRT2 / 2; - var centerX = x + boxWidth / 2; - var centerY = y + fontSize / 2; - - // Draw pointStyle as legend symbol - helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); - } else { - // Draw box as legend symbol - if (lineWidth !== 0) { - ctx.strokeRect(x, y, boxWidth, fontSize); - } - ctx.fillRect(x, y, boxWidth, fontSize); - } - - ctx.restore(); - }; - var fillText = function(x, y, legendItem, textWidth) { - var halfFontSize = fontSize / 2; - var xLeft = boxWidth + halfFontSize + x; - var yMiddle = y + halfFontSize; - - ctx.fillText(legendItem.text, xLeft, yMiddle); - - if (legendItem.hidden) { - // Strikethrough the text if hidden - ctx.beginPath(); - ctx.lineWidth = 2; - ctx.moveTo(xLeft, yMiddle); - ctx.lineTo(xLeft + textWidth, yMiddle); - ctx.stroke(); - } - }; - - // Horizontal - var isHorizontal = me.isHorizontal(); - if (isHorizontal) { - cursor = { - x: me.left + ((legendWidth - lineWidths[0]) / 2) + labelOpts.padding, - y: me.top + labelOpts.padding, - line: 0 - }; - } else { - cursor = { - x: me.left + labelOpts.padding, - y: me.top + labelOpts.padding, - line: 0 - }; - } - - var itemHeight = fontSize + labelOpts.padding; - helpers$1.each(me.legendItems, function(legendItem, i) { - var textWidth = ctx.measureText(legendItem.text).width; - var width = boxWidth + (fontSize / 2) + textWidth; - var x = cursor.x; - var y = cursor.y; - - // Use (me.left + me.minSize.width) and (me.top + me.minSize.height) - // instead of me.right and me.bottom because me.width and me.height - // may have been changed since me.minSize was calculated - if (isHorizontal) { - if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) { - y = cursor.y += itemHeight; - cursor.line++; - x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2) + labelOpts.padding; - } - } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) { - x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; - y = cursor.y = me.top + labelOpts.padding; - cursor.line++; - } - - drawLegendBox(x, y, legendItem); - - hitboxes[i].left = x; - hitboxes[i].top = y; - - // Fill the actual label - fillText(x, y, legendItem, textWidth); - - if (isHorizontal) { - cursor.x += width + labelOpts.padding; - } else { - cursor.y += itemHeight; - } - - }); - } - }, - - /** - * @private - */ - _getLegendItemAt: function(x, y) { - var me = this; - var i, hitBox, lh; - - if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { - // See if we are touching one of the dataset boxes - lh = me.legendHitBoxes; - for (i = 0; i < lh.length; ++i) { - hitBox = lh[i]; - - if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { - // Touching an element - return me.legendItems[i]; - } - } - } - - return null; - }, - - /** - * Handle an event - * @private - * @param {IEvent} event - The event to handle - */ - handleEvent: function(e) { - var me = this; - var opts = me.options; - var type = e.type === 'mouseup' ? 'click' : e.type; - var hoveredItem; - - if (type === 'mousemove') { - if (!opts.onHover && !opts.onLeave) { - return; - } - } else if (type === 'click') { - if (!opts.onClick) { - return; - } - } else { - return; - } - - // Chart event already has relative position in it - hoveredItem = me._getLegendItemAt(e.x, e.y); - - if (type === 'click') { - if (hoveredItem && opts.onClick) { - // use e.native for backwards compatibility - opts.onClick.call(me, e.native, hoveredItem); - } - } else { - if (opts.onLeave && hoveredItem !== me._hoveredItem) { - if (me._hoveredItem) { - opts.onLeave.call(me, e.native, me._hoveredItem); - } - me._hoveredItem = hoveredItem; - } - - if (opts.onHover && hoveredItem) { - // use e.native for backwards compatibility - opts.onHover.call(me, e.native, hoveredItem); - } - } - } -}); - -function createNewLegendAndAttach(chart, legendOpts) { - var legend = new Legend({ - ctx: chart.ctx, - options: legendOpts, - chart: chart - }); - - core_layouts.configure(chart, legend, legendOpts); - core_layouts.addBox(chart, legend); - chart.legend = legend; -} - -var plugin_legend = { - id: 'legend', - - /** - * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making - * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of - * the plugin, which one will be re-exposed in the chart.js file. - * https://github.com/chartjs/Chart.js/pull/2640 - * @private - */ - _element: Legend, - - beforeInit: function(chart) { - var legendOpts = chart.options.legend; - - if (legendOpts) { - createNewLegendAndAttach(chart, legendOpts); - } - }, - - beforeUpdate: function(chart) { - var legendOpts = chart.options.legend; - var legend = chart.legend; - - if (legendOpts) { - helpers$1.mergeIf(legendOpts, core_defaults.global.legend); - - if (legend) { - core_layouts.configure(chart, legend, legendOpts); - legend.options = legendOpts; - } else { - createNewLegendAndAttach(chart, legendOpts); - } - } else if (legend) { - core_layouts.removeBox(chart, legend); - delete chart.legend; - } - }, - - afterEvent: function(chart, e) { - var legend = chart.legend; - if (legend) { - legend.handleEvent(e); - } - } -}; - -var noop$2 = helpers$1.noop; - -core_defaults._set('global', { - title: { - display: false, - fontStyle: 'bold', - fullWidth: true, - padding: 10, - position: 'top', - text: '', - weight: 2000 // by default greater than legend (1000) to be above - } -}); - -/** - * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! - */ -var Title = core_element.extend({ - initialize: function(config) { - var me = this; - helpers$1.extend(me, config); - - // Contains hit boxes for each dataset (in dataset order) - me.legendHitBoxes = []; - }, - - // These methods are ordered by lifecycle. Utilities then follow. - - beforeUpdate: noop$2, - update: function(maxWidth, maxHeight, margins) { - var me = this; - - // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) - me.beforeUpdate(); - - // Absorb the master measurements - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me.margins = margins; - - // Dimensions - me.beforeSetDimensions(); - me.setDimensions(); - me.afterSetDimensions(); - // Labels - me.beforeBuildLabels(); - me.buildLabels(); - me.afterBuildLabels(); - - // Fit - me.beforeFit(); - me.fit(); - me.afterFit(); - // - me.afterUpdate(); - - return me.minSize; - - }, - afterUpdate: noop$2, - - // - - beforeSetDimensions: noop$2, - setDimensions: function() { - var me = this; - // Set the unconstrained dimension before label rotation - if (me.isHorizontal()) { - // Reset position before calculating rotation - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; - } else { - me.height = me.maxHeight; - - // Reset position before calculating rotation - me.top = 0; - me.bottom = me.height; - } - - // Reset padding - me.paddingLeft = 0; - me.paddingTop = 0; - me.paddingRight = 0; - me.paddingBottom = 0; - - // Reset minSize - me.minSize = { - width: 0, - height: 0 - }; - }, - afterSetDimensions: noop$2, - - // - - beforeBuildLabels: noop$2, - buildLabels: noop$2, - afterBuildLabels: noop$2, - - // - - beforeFit: noop$2, - fit: function() { - var me = this; - var opts = me.options; - var display = opts.display; - var minSize = me.minSize; - var lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1; - var fontOpts = helpers$1.options._parseFont(opts); - var textSize = display ? (lineCount * fontOpts.lineHeight) + (opts.padding * 2) : 0; - - if (me.isHorizontal()) { - minSize.width = me.maxWidth; // fill all the width - minSize.height = textSize; - } else { - minSize.width = textSize; - minSize.height = me.maxHeight; // fill all the height - } - - me.width = minSize.width; - me.height = minSize.height; - - }, - afterFit: noop$2, - - // Shared Methods - isHorizontal: function() { - var pos = this.options.position; - return pos === 'top' || pos === 'bottom'; - }, - - // Actually draw the title block on the canvas - draw: function() { - var me = this; - var ctx = me.ctx; - var opts = me.options; - - if (opts.display) { - var fontOpts = helpers$1.options._parseFont(opts); - var lineHeight = fontOpts.lineHeight; - var offset = lineHeight / 2 + opts.padding; - var rotation = 0; - var top = me.top; - var left = me.left; - var bottom = me.bottom; - var right = me.right; - var maxWidth, titleX, titleY; - - ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour - ctx.font = fontOpts.string; - - // Horizontal - if (me.isHorizontal()) { - titleX = left + ((right - left) / 2); // midpoint of the width - titleY = top + offset; - maxWidth = right - left; - } else { - titleX = opts.position === 'left' ? left + offset : right - offset; - titleY = top + ((bottom - top) / 2); - maxWidth = bottom - top; - rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); - } - - ctx.save(); - ctx.translate(titleX, titleY); - ctx.rotate(rotation); - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - - var text = opts.text; - if (helpers$1.isArray(text)) { - var y = 0; - for (var i = 0; i < text.length; ++i) { - ctx.fillText(text[i], 0, y, maxWidth); - y += lineHeight; - } - } else { - ctx.fillText(text, 0, 0, maxWidth); - } - - ctx.restore(); - } - } -}); - -function createNewTitleBlockAndAttach(chart, titleOpts) { - var title = new Title({ - ctx: chart.ctx, - options: titleOpts, - chart: chart - }); - - core_layouts.configure(chart, title, titleOpts); - core_layouts.addBox(chart, title); - chart.titleBlock = title; -} - -var plugin_title = { - id: 'title', - - /** - * Backward compatibility: since 2.1.5, the title is registered as a plugin, making - * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of - * the plugin, which one will be re-exposed in the chart.js file. - * https://github.com/chartjs/Chart.js/pull/2640 - * @private - */ - _element: Title, - - beforeInit: function(chart) { - var titleOpts = chart.options.title; - - if (titleOpts) { - createNewTitleBlockAndAttach(chart, titleOpts); - } - }, - - beforeUpdate: function(chart) { - var titleOpts = chart.options.title; - var titleBlock = chart.titleBlock; - - if (titleOpts) { - helpers$1.mergeIf(titleOpts, core_defaults.global.title); - - if (titleBlock) { - core_layouts.configure(chart, titleBlock, titleOpts); - titleBlock.options = titleOpts; - } else { - createNewTitleBlockAndAttach(chart, titleOpts); - } - } else if (titleBlock) { - core_layouts.removeBox(chart, titleBlock); - delete chart.titleBlock; - } - } -}; - -var plugins = {}; -var filler = plugin_filler; -var legend = plugin_legend; -var title = plugin_title; -plugins.filler = filler; -plugins.legend = legend; -plugins.title = title; - -/** - * @namespace Chart - */ - - -core_controller.helpers = helpers$1; - -// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! -core_helpers(core_controller); - -core_controller._adapters = core_adapters; -core_controller.Animation = core_animation; -core_controller.animationService = core_animations; -core_controller.controllers = controllers; -core_controller.DatasetController = core_datasetController; -core_controller.defaults = core_defaults; -core_controller.Element = core_element; -core_controller.elements = elements; -core_controller.Interaction = core_interaction; -core_controller.layouts = core_layouts; -core_controller.platform = platform; -core_controller.plugins = core_plugins; -core_controller.Scale = core_scale; -core_controller.scaleService = core_scaleService; -core_controller.Ticks = core_ticks; -core_controller.Tooltip = core_tooltip; - -// Register built-in scales - -core_controller.helpers.each(scales, function(scale, type) { - core_controller.scaleService.registerScaleType(type, scale, scale._defaults); -}); - -// Load to register built-in adapters (as side effects) - - -// Loading built-in plugins - -for (var k in plugins) { - if (plugins.hasOwnProperty(k)) { - core_controller.plugins.register(plugins[k]); - } -} - -core_controller.platform.initialize(); - -var src = core_controller; -if (typeof window !== 'undefined') { - window.Chart = core_controller; -} - -// DEPRECATIONS - -/** - * Provided for backward compatibility, not available anymore - * @namespace Chart.Chart - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ -core_controller.Chart = core_controller; - -/** - * Provided for backward compatibility, not available anymore - * @namespace Chart.Legend - * @deprecated since version 2.1.5 - * @todo remove at version 3 - * @private - */ -core_controller.Legend = plugins.legend._element; - -/** - * Provided for backward compatibility, not available anymore - * @namespace Chart.Title - * @deprecated since version 2.1.5 - * @todo remove at version 3 - * @private - */ -core_controller.Title = plugins.title._element; - -/** - * Provided for backward compatibility, use Chart.plugins instead - * @namespace Chart.pluginService - * @deprecated since version 2.1.5 - * @todo remove at version 3 - * @private - */ -core_controller.pluginService = core_controller.plugins; - -/** - * Provided for backward compatibility, inheriting from Chart.PlugingBase has no - * effect, instead simply create/register plugins via plain JavaScript objects. - * @interface Chart.PluginBase - * @deprecated since version 2.5.0 - * @todo remove at version 3 - * @private - */ -core_controller.PluginBase = core_controller.Element.extend({}); - -/** - * Provided for backward compatibility, use Chart.helpers.canvas instead. - * @namespace Chart.canvasHelpers - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ -core_controller.canvasHelpers = core_controller.helpers.canvas; - -/** - * Provided for backward compatibility, use Chart.layouts instead. - * @namespace Chart.layoutService - * @deprecated since version 2.7.3 - * @todo remove at version 3 - * @private - */ -core_controller.layoutService = core_controller.layouts; - -/** - * Provided for backward compatibility, not available anymore. - * @namespace Chart.LinearScaleBase - * @deprecated since version 2.8 - * @todo remove at version 3 - * @private - */ -core_controller.LinearScaleBase = scale_linearbase; - -/** - * Provided for backward compatibility, instead we should create a new Chart - * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`). - * @deprecated since version 2.8.0 - * @todo remove at version 3 - */ -core_controller.helpers.each( - [ - 'Bar', - 'Bubble', - 'Doughnut', - 'Line', - 'PolarArea', - 'Radar', - 'Scatter' - ], - function(klass) { - core_controller[klass] = function(ctx, cfg) { - return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, { - type: klass.charAt(0).toLowerCase() + klass.slice(1) - })); - }; - } -); - -return src; - -}))); diff --git a/SRIP/Quiz/quiz.css b/SRIP/Quiz/quiz.css deleted file mode 100644 index 33d3c6a0..00000000 --- a/SRIP/Quiz/quiz.css +++ /dev/null @@ -1,174 +0,0 @@ -{ - -border: 1px dotted black; - -} - -p.question { - -font-family: Arial, sans-serif; - -font-size:20px; - -color: #2E2E2E; - -margin-bottom:0px; - -} - - -h2.quizHeader { - -font-family: Arial, sans-serif; - -font-weight:normal; - -font-size:25px; - -line-height: 27px; - -margin: 24px 0 12px 0; - -padding: 0 0 4px 0; - -border-bottom: 1px solid #a2a2a2; - -} - - -h2.quizScore{ - -font-family: Arial, sans-serif; - -font-size:25px; - -} - - -div.quizAnswers{ - -font-family: Arial, sans-serif; - -font-size:16px; - -color: #424242; - -padding: 4px 0 4px 0; - -} - - -label { - -font-family: Arial, sans-serif; - -font-size:14px; - -color: #424242; - -vertical-align:top; - -} - - -input.answer[type="radio"] { - -margin-bottom: 10px; - -} - -input.quizSubmit[type="submit"] { - --webkit-background-clip: border-box; - --webkit-background-origin: padding-box; - --webkit-background-size: auto; - --webkit-transition-delay: 0s, 0s; - --webkit-transition-duration: 0.2s, 0.2s; - --webkit-transition-property: color, background-color; - --webkit-transition-timing-function: ease, ease; - -box-shadow: rgba(0, 0, 0, 0.498039) 0px 0px 5px 0px; - -color: #ffffff; - -background-color: #c30b0a; - -margin: 0; - -border: 0; - -outline: 0; - -text-transform:uppercase; - -height:35px; - -width:85px; - -border: 1px solid #5E5E5E; - -border-radius:5px; - -} - - -input.quizSubmit[type="submit"]:hover { - -color: #ffffff; - -background: #680f11; - -text-decoration: none; - -} - - -table { - -background-color: #F2F2F2; - -border:1px solid #BDBDBD; - -border-radius:5px; - -padding:10px; - -padding-left:25px; - -box-shadow: rgba(0, 0, 0, 0.498039) 0px 0px 1px 0px; - -} - - -th { - -} - - -tr { - -} - - -td { - -} - -.submitter { - -width:85px; - -} - - -.hide { - -display:none; - -} \ No newline at end of file diff --git a/SRIP/Quiz/quiz.html b/SRIP/Quiz/quiz.html deleted file mode 100644 index 79c198fc..00000000 --- a/SRIP/Quiz/quiz.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - Quiz on Experiment- Perceptron - - - - - - - - -

Take a Quiz!

- - - - - - - - - - - - - - -
-
-

1. A perceptron adds up all the weighted inputs it receives, and if it exceeds a certain value, it outputs a 1, otherwise outputs a 0.

- -
    - - -
    - - -
    - - -
    - - -
-
-
-
-

2. Which of the following points will not form any perceptron line?

- -
    - - -
    - - -
    - - -
-
-
-
-

3. Which of these points represent the perceptron line?

- -
    - - -
    - - -
    - - -
    - - -
-
-
-
-

4. A perceptron classifier works,

- -
    - - -
    - - -
    - - -
    - - -
-
-
- -
- -
- - -
-
-
-
- - -
-

-
-
- - - \ No newline at end of file diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js deleted file mode 100644 index 0d4fd43f..00000000 --- a/SRIP/Quiz/quiz.js +++ /dev/null @@ -1,137 +0,0 @@ -function submitQuiz() { - - // get each answer - function answerScore (qName) { - var radiosNo = document.getElementsByName(qName); - - for (var i = 0, length = radiosNo.length; i < length; i++) { - if (radiosNo[i].checked) { - // do something with radiosNo - var answerValue = Number(radiosNo[i].value); - } - } - // change NaNs to zero - if (isNaN(answerValue)) { - answerValue = 0; - } - return answerValue; - } - - // calc score with answerScore function - var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); - //console.log("CalcScore: " + calcScore); // it works! - - // function to return correct answer string - function correctAnswer (correctStringNo, qNumber) { - //console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below - return ("The correct answer for question #" + qNumber + ":  " + - (document.getElementById(correctStringNo).innerHTML) + ""); - } - - // print correct answers only if wrong (calls correctAnswer function) - if (answerScore('q1') === 0) { - document.getElementById('correctAnswer1').innerHTML = correctAnswer('correctString1', 1); - } - if (answerScore('q2') === 0) { - document.getElementById('correctAnswer2').innerHTML = correctAnswer('correctString2', 2); - } - if (answerScore('q3') === 0) { - document.getElementById('correctAnswer3').innerHTML = correctAnswer('correctString3', 3); - } - if (answerScore('q4') === 0) { - document.getElementById('correctAnswer4').innerHTML = correctAnswer('correctString4', 4); - } - - // calculate "possible score" integer - var questionCountArray = document.getElementsByClassName('question'); - - var questionCounter = 0; - for (var i = 0, length = questionCountArray.length; i < length; i++) { - questionCounter++; - } - - // show score as "score/possible score" - var showScore = "Your Score: " + calcScore +"/" + questionCounter; - // if 4/4, "perfect score!" - if (calcScore === questionCounter) { - showScore = showScore + "  Perfect Score!" - }; - document.getElementById('userScore').innerHTML = showScore; - } - -$(document).ready(function() { - - $('#submitButton').click(function() { - $(this).addClass('hide'); - }); - -}); - - function submitQuiz() { - //console.log('submitted'); - - // get each answer score - function answerScore (qName) { - var radiosNo = document.getElementsByName(qName); - - for (var i = 0, length = radiosNo.length; i < length; i++) { - if (radiosNo[i].checked) { - // do something with radiosNo - var answerValue = Number(radiosNo[i].value); - } - } - // change NaNs to zero - if (isNaN(answerValue)) { - answerValue = 0; - } - return answerValue; - } - - // calc score with answerScore function - var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); - //console.log("CalcScore: " + calcScore); // it works! - - // function to return correct answer string - function correctAnswer (correctStringNo, qNumber) { - //console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below - return ("The correct answer for question " + qNumber + ":  " + - (document.getElementById(correctStringNo).innerHTML) + ""); - } - - // print correct answers only if wrong (calls correctAnswer function) - if (answerScore('q1') === 0) { - document.getElementById('correctAnswer1').innerHTML = correctAnswer('correctString1', 1); - } - if (answerScore('q2') === 0) { - document.getElementById('correctAnswer2').innerHTML = correctAnswer('correctString2', 2); - } - if (answerScore('q3') === 0) { - document.getElementById('correctAnswer3').innerHTML = correctAnswer('correctString3', 3); - } - if (answerScore('q4') === 0) { - document.getElementById('correctAnswer4').innerHTML = correctAnswer('correctString4', 4); - } - - // calculate "possible score" integer - var questionCountArray = document.getElementsByClassName('question'); - - var questionCounter = 0; - for (var i = 0, length = questionCountArray.length; i < length; i++) { - questionCounter++; - } - - // show score as "score/possible score" - var showScore = "Your Score: " + calcScore +"/" + questionCounter; - if (calcScore === questionCounter) { - showScore = showScore + "  Perfect Score!" + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973) - }; - document.getElementById('userScore').innerHTML = showScore; - } - -$(document).ready(function() { - - $('#submitButton').click(function() { - $(this).addClass('hide'); - }); - -}); \ No newline at end of file diff --git a/SRIP/README.txt b/SRIP/README.txt deleted file mode 100644 index 561a02e8..00000000 --- a/SRIP/README.txt +++ /dev/null @@ -1,15 +0,0 @@ -This is Readme file containing instruction for running the experiment: Perceptron - -TO RUN THE EXPERIMENT OF PERCEPTRON: -1. Download the SRIP folder -2. Go to Codes folder -3. Run the .html file - -HTML file will open in the browser and all functionalities will run from the HTML file. - - -TAKE A QUIZ OF THE EXPERIMENT: -1. Go to Quiz folder -2. Run quiz.html -3. Quiz will open in the browser -4. Give the quiz diff --git a/SRIP/SRIP Project 1 Documentation.pdf b/SRIP/SRIP Project 1 Documentation.pdf deleted file mode 100644 index a3fde9f332c318eb9fa1ac7b4da5be2397bcb44d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235622 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 diff --git a/SRIP/Test Cases for Project 1.pdf b/SRIP/Test Cases for Project 1.pdf deleted file mode 100644 index 2960b63fbdbf7765e49c7e9dffb9f80ec3009023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53126 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 Date: Wed, 12 Jun 2019 15:44:04 +0530 Subject: [PATCH 089/166] project 2 added --- .../Project-2 Issue Number 243/Codes/exp6.css | 0 .../Codes/exp6.html | 0 SRIP/Project-2 Issue Number 243/Codes/exp6.js | 112 ++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 SRIP/Project-2 Issue Number 243/Codes/exp6.css create mode 100644 SRIP/Project-2 Issue Number 243/Codes/exp6.html create mode 100644 SRIP/Project-2 Issue Number 243/Codes/exp6.js diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.css b/SRIP/Project-2 Issue Number 243/Codes/exp6.css new file mode 100644 index 00000000..e69de29b diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.html b/SRIP/Project-2 Issue Number 243/Codes/exp6.html new file mode 100644 index 00000000..e69de29b diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Project-2 Issue Number 243/Codes/exp6.js new file mode 100644 index 00000000..21e9a528 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.js @@ -0,0 +1,112 @@ +var data1=[0,0,0]; +var data=[]; +var res=0; +var learning_rate=0.001; +var iterations=0; +var row=[]; +var xVal; +var yVal = 100; +var dataLength=50; +window.onload = function() { +var dps=[]; +var dps1 = []; +var dps2 = []; +var chart = new CanvasJS.Chart("chartContainer", { + axisX:{ + title: "X-axis", + gridThickness: 1 + }, + axisY: { + title: "Y-axis" + }, + data: [ + { + showInLegend: true, + legendText: "Class 1", + color: "red", + type: "scatter", + dataPoints: dps + }, + { + showInLegend: true, + legendText: "Class 2", + color: "blue", + type: "scatter", + dataPoints: dps1 + }] + }); + +var chart1 = new CanvasJS.Chart("chartContainer1",{ + zoomEnabled: true, + axisX:{ + title: "X-axis", + gridThickness: 1 + }, + axisY: { + title: "Y-axis" + }, + data: [{ + showInLegend: true, + legendText: "Class 1", + color: "red", + type: "scatter", + dataPoints: dps + }, + { + showInLegend: true, + legendText: "Class 2", + color: "blue", + type: "scatter", + dataPoints: dps1 + }, + { + type: "line", + dataPoints: dps2 + }] + }); + +function addDataPoints() { + for (var j = 0; j < dataLength; j++) { + console.log(data[j][0]); + xVal = data[j][0]; + yVal = (-data1[0]/data1[1])*xVal -(data1[2]/data1[1]); + dps2.push({ + x: xVal, + y: yVal + }); + chart1.render(); + } + } + + function addDataPointsAndRender1() { + xValue = Number(document.getElementById("xValue").value); + yValue = Number(document.getElementById("yValue").value); + var arr=[]; + arr.push(xValue,yValue,1); + row.push(1); + data.push(arr); + arr=[]; + dps.push({ + x: xValue, + y: yValue + }); + chart.render(); + + } + + function addDataPointsAndRender2() { + xValue = Number(document.getElementById("xValue").value); + yValue = Number(document.getElementById("yValue").value); + var arr=[]; + arr.push(xValue,yValue,1); + row.push(0); + data.push(arr); + arr=[]; + dps1.push({ + x: xValue, + y: yValue + + }); + chart.render(); + + } \ No newline at end of file From 193dacfd30eaaf38a9f5be9eaf86243b76b38db1 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 12 Jun 2019 17:28:38 +0530 Subject: [PATCH 090/166] basic layout --- .../Project-2 Issue Number 243/Codes/exp6.css | 87 ++++++++++++ .../Codes/exp6.html | 56 ++++++++ SRIP/Project-2 Issue Number 243/Codes/exp6.js | 132 +++++------------- 3 files changed, 176 insertions(+), 99 deletions(-) diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.css b/SRIP/Project-2 Issue Number 243/Codes/exp6.css index e69de29b..aa53d557 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.css +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.css @@ -0,0 +1,87 @@ +*{ + +box-sizing: border-box; + +} + +body{ + +font-family: Arial; + +padding: 10px; + +background-color: #f1f1f1; + +} + +/* Create two columns that floats next to each other */ +/* Left column */ +.leftcolumn { + +float: left; + +width: 50%; + +} + +/* Right column */ +.rightcolumn { + +float: left; + +width: 50%; + +background-color: #f1f1f1; + +padding-left: 20px; + +} + +.graph { + +float: left; + +width: 50%; + +padding: 15px; + +max-width: 800px; + +margin: 50px auto; + +} + +.card { + +background-color: white; + +padding: 20px; + +margin-top: 25px; + +} + +.row:after { + +content: ""; + +display: table; + +clear: both; + +} + +/* Responsive layout - when the screen is less than 800px wide, make the two columns stack on top of each other instead of next to each other */ +@media screen and (max-width: 800px) { + +.leftcolumn, .rightcolumn { + +width: 100%; + +padding: 0; + +} + +} + +} \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.html b/SRIP/Project-2 Issue Number 243/Codes/exp6.html index e69de29b..b391d50d 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.html +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.html @@ -0,0 +1,56 @@ + + + + + MLE: Learning the classifier from data + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+

Distribution Function

+

Select Distribution Function

+ +
+ +
+

Mark Points

+
+ +
+

Add Data

+
+ + + +

+ + +

+
+
+
+
+ + + + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Project-2 Issue Number 243/Codes/exp6.js index 21e9a528..a833a19c 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.js +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.js @@ -7,106 +7,40 @@ var row=[]; var xVal; var yVal = 100; var dataLength=50; -window.onload = function() { -var dps=[]; -var dps1 = []; -var dps2 = []; -var chart = new CanvasJS.Chart("chartContainer", { - axisX:{ - title: "X-axis", - gridThickness: 1 - }, - axisY: { - title: "Y-axis" - }, - data: [ - { - showInLegend: true, - legendText: "Class 1", - color: "red", - type: "scatter", - dataPoints: dps - }, - { - showInLegend: true, - legendText: "Class 2", - color: "blue", - type: "scatter", - dataPoints: dps1 - }] - }); -var chart1 = new CanvasJS.Chart("chartContainer1",{ - zoomEnabled: true, - axisX:{ - title: "X-axis", - gridThickness: 1 - }, - axisY: { - title: "Y-axis" - }, - data: [{ - showInLegend: true, - legendText: "Class 1", - color: "red", - type: "scatter", - dataPoints: dps - }, - { - showInLegend: true, - legendText: "Class 2", - color: "blue", - type: "scatter", - dataPoints: dps1 - }, - { - type: "line", - dataPoints: dps2 - }] - }); -function addDataPoints() { - for (var j = 0; j < dataLength; j++) { - console.log(data[j][0]); - xVal = data[j][0]; - yVal = (-data1[0]/data1[1])*xVal -(data1[2]/data1[1]); - dps2.push({ - x: xVal, - y: yVal - }); - chart1.render(); - } - } +var chart1 = { + axisX:{ + title: "X-axis", + gridThickness: 1 + }, + axisY: { + title: "Y-axis" + }, + data: [ + { + showInLegend: true, + legendText: "Class 1", + color: "red", + type: "scatter", + dataPoints: dps + }, + { + showInLegend: true, + legendText: "Class 2", + color: "blue", + type: "scatter", + dataPoints: dps1 + }] +} - function addDataPointsAndRender1() { - xValue = Number(document.getElementById("xValue").value); - yValue = Number(document.getElementById("yValue").value); - var arr=[]; - arr.push(xValue,yValue,1); - row.push(1); - data.push(arr); - arr=[]; - dps.push({ - x: xValue, - y: yValue - }); - chart.render(); - - } - function addDataPointsAndRender2() { - xValue = Number(document.getElementById("xValue").value); - yValue = Number(document.getElementById("yValue").value); - var arr=[]; - arr.push(xValue,yValue,1); - row.push(0); - data.push(arr); - arr=[]; - dps1.push({ - x: xValue, - y: yValue - - }); - chart.render(); - - } \ No newline at end of file +window.onload = function() { + var dps=[]; + var dps1 = []; + var dps2 = []; + var ctx = document.getElementById("chartContainer"); + window.myScatter = new Chart(ctx, myChart1); + + chart.render(); +} \ No newline at end of file From 5c9b358a1916613ebfcbaae7a405b6d850098766 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 12 Jun 2019 18:26:47 +0530 Subject: [PATCH 091/166] basic layout --- .../Project-2 Issue Number 243/Codes/exp6.css | 20 +- .../Codes/exp6.html | 86 +++++---- SRIP/Project-2 Issue Number 243/Codes/exp6.js | 177 ++++++++++++++---- 3 files changed, 188 insertions(+), 95 deletions(-) diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.css b/SRIP/Project-2 Issue Number 243/Codes/exp6.css index aa53d557..c61348f1 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.css +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.css @@ -8,9 +8,7 @@ body{ font-family: Arial; -padding: 10px; - -background-color: #f1f1f1; +padding: 50px; } @@ -37,23 +35,9 @@ padding-left: 20px; } -.graph { - -float: left; - -width: 50%; - -padding: 15px; - -max-width: 800px; - -margin: 50px auto; - -} - .card { -background-color: white; +background-color: #f1f1f1; padding: 20px; diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.html b/SRIP/Project-2 Issue Number 243/Codes/exp6.html index b391d50d..3a56db83 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.html +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.html @@ -1,56 +1,60 @@ - - - + + - MLE: Learning the classifier from data - - - - + + + + - - - - - -
-
-
- + +
+
-
-
-

Distribution Function

-

Select Distribution Function

- -
-
-

Mark Points

+
+
+

Distribution Function

+

Select Distribution Function + +

-

Add Data

-
- - - -

- - -

-
-
-
-
+

Mark Points

+

Class 1

+

Mean:

+

Covariance: +

+ +

Class 2

+

Mean:

+

Covariance: +

+ +
+
+

Add Data

+ X Value: + Y Value: + + + +

+ + +

+
+
+ + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Project-2 Issue Number 243/Codes/exp6.js index a833a19c..67dd24b0 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.js +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.js @@ -5,42 +5,147 @@ var learning_rate=0.001; var iterations=0; var row=[]; var xVal; -var yVal = 100; -var dataLength=50; - +var yVal = 10; +window.onload = function() { + var dps=[]; + var dps1 = []; + var dps2 = []; + var chart = new CanvasJS.Chart("chartContainer", { + axisX:{ + title: "X-axis" + }, + axisY: { + title: "Y-axis" + }, + data: [ + { + showInLegend: true, + legendText: "Class 1", + color: "red", + type: "scatter", + dataPoints: dps + }, + { + showInLegend: true, + legendText: "Class 2", + color: "blue", + type: "scatter", + dataPoints: dps1 + }] + }); -var chart1 = { - axisX:{ - title: "X-axis", - gridThickness: 1 - }, - axisY: { - title: "Y-axis" - }, - data: [ - { - showInLegend: true, - legendText: "Class 1", - color: "red", - type: "scatter", - dataPoints: dps - }, - { - showInLegend: true, - legendText: "Class 2", - color: "blue", - type: "scatter", - dataPoints: dps1 - }] -} + function addDataPoints() { + for (var j = 0; j < data.length; j++) { + xVal = data[j][0]; + yVal = (-data1[0]/data1[1])*xVal -(data1[2]/data1[1]); + dps2.push({ + x: xVal, + y: yVal + }); + chart1.render(); + } + } + function addDataPointsAndRender1() { + xValue = Number(document.getElementById("xValue").value); + yValue = Number(document.getElementById("yValue").value); + var arr=[]; + arr.push(xValue,yValue,1); + row.push(1); + data.push(arr); + arr=[]; + dps.push({ + x: xValue, + y: yValue + }); + chart.render(); + + } -window.onload = function() { - var dps=[]; - var dps1 = []; - var dps2 = []; - var ctx = document.getElementById("chartContainer"); - window.myScatter = new Chart(ctx, myChart1); - - chart.render(); -} \ No newline at end of file + function addDataPointsAndRender2() { + xValue = Number(document.getElementById("xValue").value); + yValue = Number(document.getElementById("yValue").value); + var arr=[]; + arr.push(xValue,yValue,1); + row.push(0); + data.push(arr); + arr=[]; + dps1.push({ + x: xValue, + y: yValue + + }); + chart.render(); + + } + function addstart() { + iterations=1; + document.getElementById("demo").innerHTML="iterations: " +iterations; + var sign=0; + for(var i=0; i<3; i++) { + sign=sign + data1[i]*data[iterations-1][i]; + } + if(sign>=0){ + sign=1; + } + else { + sign=0; + } + var res = (row[iterations-1] - sign); + for(var i=0;i<3;i++){ + data1[i]=data1[i]+data[iterations-1][i]* learning_rate*res; + } + document.getElementById("demo1").innerHTML=data1[0]+","+data1[1]+","+data1[2];; + addDataPoints(); + } + function addstep() { + iterations=iterations+1; + document.getElementById("demo").innerHTML="iterations: " +iterations; + var sign=0; + for(var i=0; i<3; i++) { + sign=sign + data1[i]*data[iterations-1][i]; + } + if(sign>=0){ + sign=1; + } + else { + sign=0; + } + var res = (row[iterations-1] - sign); + for(var i=0; i<3; i++) { + data1[i]=data1[i]+data[iterations-1][i]*learning_rate*res; + } + document.getElementById("demo1").innerHTML=data1[0]+","+data1[1]+","+data1[2];; + addDataPoints(); + } + function addstep100() { + iterations=iterations+100; + document.getElementById("demo").innerHTML="iterations: " +iterations; + var sign=0; + for(var i=0; i<3; i++) { + sign=sign + data1[i]*data[iterations-1][i]; + } + if(sign>=0){ + sign=1; + } + else { + sign=0; + } + var res = (row[iterations-1] - sign); + for(var i=0; i<3; i++) { + data1[i]=data1[i]+data[iterations-1][i]* learning_rate*res; + } + document.getElementById("demo1").innerHTML=data1[0]+","+data1[1]+","+data1[2]; + addDataPoints(); + } + var renderButton1 = document.getElementById("renderButton1"); + renderButton1.addEventListener("click", addDataPointsAndRender1); + var renderButton2 = document.getElementById("renderButton2"); + renderButton2.addEventListener("click", addDataPointsAndRender2); + var start1=document.getElementById("start1"); + start1.addEventListener("click", addstart); + var step1=document.getElementById("step1"); + step1.addEventListener("click", addstep); + var step100=document.getElementById("step100"); + step100.addEventListener("click", addstep100); + } \ No newline at end of file From abc11bce4e9184c4a0bf3fc9d70808f2b4a46909 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 13 Jun 2019 14:57:11 +0530 Subject: [PATCH 092/166] basic layout --- .../Codes/exp6.html | 13 +- SRIP/Project-2 Issue Number 243/Codes/exp6.js | 222 +++++++----------- 2 files changed, 89 insertions(+), 146 deletions(-) diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.html b/SRIP/Project-2 Issue Number 243/Codes/exp6.html index 3a56db83..7a7973ae 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.html +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.html @@ -36,25 +36,22 @@

Class 2

Mean:

Covariance:

- -

Add Data

X Value: Y Value: - - - + + +

- - + +

- \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Project-2 Issue Number 243/Codes/exp6.js index 67dd24b0..d739e182 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.js +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.js @@ -7,145 +7,91 @@ var row=[]; var xVal; var yVal = 10; window.onload = function() { - var dps=[]; - var dps1 = []; - var dps2 = []; - var chart = new CanvasJS.Chart("chartContainer", { - axisX:{ - title: "X-axis" - }, - axisY: { - title: "Y-axis" - }, - data: [ - { - showInLegend: true, - legendText: "Class 1", - color: "red", - type: "scatter", - dataPoints: dps - }, - { - showInLegend: true, - legendText: "Class 2", - color: "blue", - type: "scatter", - dataPoints: dps1 - }] - }); + var dps=[]; //stores class 1 points and plots on chart + var dps1 = []; //stores class 2 points and plots on chart + var dps2 = []; + var chart = new CanvasJS.Chart("chartContainer", { + axisX:{ + title: "X-axis" + }, + axisY: { + title: "Y-axis" + }, + data: [{ + showInLegend: true, + legendText: "Class 1", + color: "red", + type: "scatter", + dataPoints: dps + }, + { + showInLegend: true, + legendText: "Class 2", + color: "blue", + type: "scatter", + dataPoints: dps1 + }] + }); - function addDataPoints() { - for (var j = 0; j < data.length; j++) { - xVal = data[j][0]; - yVal = (-data1[0]/data1[1])*xVal -(data1[2]/data1[1]); - dps2.push({ - x: xVal, - y: yVal - }); - chart1.render(); - } - } + function addDataPoints() { + for(var j = 0; j < data.length; j++) { + xVal = data[j][0]; + yVal = (-data1[0]/data1[1])*xVal -(data1[2]/data1[1]); + dps2.push({ + x: xVal, + y: yVal + }); + chart.render(); + } + } - function addDataPointsAndRender1() { - xValue = Number(document.getElementById("xValue").value); - yValue = Number(document.getElementById("yValue").value); - var arr=[]; - arr.push(xValue,yValue,1); - row.push(1); - data.push(arr); - arr=[]; - dps.push({ - x: xValue, - y: yValue - }); - chart.render(); + function addDataPointsAndRender1() { + xValue = Number(document.getElementById("xValue").value); + yValue = Number(document.getElementById("yValue").value); + /*var arr=[]; + arr.push(xValue,yValue,1); + row.push(1); + data.push(arr); + arr=[];*/ + dps.push({ + x: xValue, + y: yValue + }); + chart.render(); + console.log(dps); - } + } - function addDataPointsAndRender2() { - xValue = Number(document.getElementById("xValue").value); - yValue = Number(document.getElementById("yValue").value); - var arr=[]; - arr.push(xValue,yValue,1); - row.push(0); - data.push(arr); - arr=[]; - dps1.push({ - x: xValue, - y: yValue - - }); - chart.render(); - - } - function addstart() { - iterations=1; - document.getElementById("demo").innerHTML="iterations: " +iterations; - var sign=0; - for(var i=0; i<3; i++) { - sign=sign + data1[i]*data[iterations-1][i]; - } - if(sign>=0){ - sign=1; - } - else { - sign=0; - } - var res = (row[iterations-1] - sign); - for(var i=0;i<3;i++){ - data1[i]=data1[i]+data[iterations-1][i]* learning_rate*res; - } - document.getElementById("demo1").innerHTML=data1[0]+","+data1[1]+","+data1[2];; - addDataPoints(); - } - function addstep() { - iterations=iterations+1; - document.getElementById("demo").innerHTML="iterations: " +iterations; - var sign=0; - for(var i=0; i<3; i++) { - sign=sign + data1[i]*data[iterations-1][i]; - } - if(sign>=0){ - sign=1; - } - else { - sign=0; - } - var res = (row[iterations-1] - sign); - for(var i=0; i<3; i++) { - data1[i]=data1[i]+data[iterations-1][i]*learning_rate*res; - } - document.getElementById("demo1").innerHTML=data1[0]+","+data1[1]+","+data1[2];; - addDataPoints(); - } - function addstep100() { - iterations=iterations+100; - document.getElementById("demo").innerHTML="iterations: " +iterations; - var sign=0; - for(var i=0; i<3; i++) { - sign=sign + data1[i]*data[iterations-1][i]; - } - if(sign>=0){ - sign=1; - } - else { - sign=0; - } - var res = (row[iterations-1] - sign); - for(var i=0; i<3; i++) { - data1[i]=data1[i]+data[iterations-1][i]* learning_rate*res; - } - document.getElementById("demo1").innerHTML=data1[0]+","+data1[1]+","+data1[2]; - addDataPoints(); - } - var renderButton1 = document.getElementById("renderButton1"); - renderButton1.addEventListener("click", addDataPointsAndRender1); - var renderButton2 = document.getElementById("renderButton2"); - renderButton2.addEventListener("click", addDataPointsAndRender2); - var start1=document.getElementById("start1"); - start1.addEventListener("click", addstart); - var step1=document.getElementById("step1"); - step1.addEventListener("click", addstep); - var step100=document.getElementById("step100"); - step100.addEventListener("click", addstep100); - } \ No newline at end of file + function addDataPointsAndRender2() { + xValue = Number(document.getElementById("xValue").value); + yValue = Number(document.getElementById("yValue").value); + /*var arr=[]; + arr.push(xValue,yValue,1); + row.push(0); + data.push(arr); + arr=[];*/ + dps1.push({ + x: xValue, + y: yValue + }); + chart.render(); + console.log(dps1); + } + + function addcalculateMLE() { + + } + + function addmarkAll() { + + } + + var addClass1 = document.getElementById("add-class-1"); + addClass1.addEventListener("click", addDataPointsAndRender1); + var addClass2 = document.getElementById("add-class-2"); + addClass2.addEventListener("click", addDataPointsAndRender2); + var calculateMLE = document.getElementById("calculate-mle"); + calculateMLE.addEventListener("click", addcalculateMLE); + var markAll=document.getElementById("mark-all"); + markAll.addEventListener("click", addmarkAll); +} \ No newline at end of file From 83764da20ccd90d2f761d1bb082b4ba56cafa551 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 13 Jun 2019 19:04:04 +0530 Subject: [PATCH 093/166] basic layout 1 --- .../Codes/exp6.html | 12 ++-- SRIP/Project-2 Issue Number 243/Codes/exp6.js | 55 +++++++++++++++---- 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.html b/SRIP/Project-2 Issue Number 243/Codes/exp6.html index 7a7973ae..5302c09a 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.html +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.html @@ -28,14 +28,14 @@

Distribution Function

Mark Points

Class 1

-

Mean:

-

Covariance: -

+

Mean:

+

Covariance:

+

Class 2

-

Mean:

-

Covariance: -

+

Mean:

+

Covariance:

+

diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Project-2 Issue Number 243/Codes/exp6.js index d739e182..8bdf2c97 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.js +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.js @@ -6,10 +6,20 @@ var iterations=0; var row=[]; var xVal; var yVal = 10; + window.onload = function() { var dps=[]; //stores class 1 points and plots on chart var dps1 = []; //stores class 2 points and plots on chart var dps2 = []; + var xValClass1=[]; + var yValClass1=[]; + var xValClass2=[]; + var yValClass2=[]; + var xmeanClass1=0; + var ymeanClass1=0; + var xmeanClass2=0; + var ymeanClass2=0; + var chart = new CanvasJS.Chart("chartContainer", { axisX:{ title: "X-axis" @@ -48,23 +58,23 @@ window.onload = function() { function addDataPointsAndRender1() { xValue = Number(document.getElementById("xValue").value); yValue = Number(document.getElementById("yValue").value); - /*var arr=[]; - arr.push(xValue,yValue,1); - row.push(1); - data.push(arr); - arr=[];*/ + xValClass1.push(xValue); + yValClass1.push(yValue); + dps.push({ x: xValue, y: yValue }); chart.render(); - console.log(dps); - + console.log(xValClass1); + console.log(yValClass1); } - + function addDataPointsAndRender2() { xValue = Number(document.getElementById("xValue").value); yValue = Number(document.getElementById("yValue").value); + xValClass2.push(xValue); + yValClass2.push(yValue); /*var arr=[]; arr.push(xValue,yValue,1); row.push(0); @@ -75,13 +85,38 @@ window.onload = function() { y: yValue }); chart.render(); - console.log(dps1); + console.log(xValClass2); + console.log(yValClass2); } function addcalculateMLE() { - + for(var i=0; i Date: Fri, 14 Jun 2019 16:51:33 +0530 Subject: [PATCH 094/166] algorithm added --- .../Codes/exp6.html | 13 +- SRIP/Project-2 Issue Number 243/Codes/exp6.js | 348 ++++++++++++++---- 2 files changed, 287 insertions(+), 74 deletions(-) diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.html b/SRIP/Project-2 Issue Number 243/Codes/exp6.html index 5302c09a..059b9642 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.html +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.html @@ -2,6 +2,7 @@ + MLE: Learning the Classifier from Data @@ -19,8 +20,8 @@

Distribution Function

Select Distribution Function

@@ -29,13 +30,13 @@

Distribution Function

Mark Points

Class 1

Mean:

-

Covariance:

-

+

Covariance:

+

Class 2

Mean:

-

Covariance:

-

+

Covariance:

+

diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Project-2 Issue Number 243/Codes/exp6.js index 8bdf2c97..df891a0b 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.js +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.js @@ -1,24 +1,27 @@ -var data1=[0,0,0]; -var data=[]; -var res=0; -var learning_rate=0.001; -var iterations=0; -var row=[]; -var xVal; -var yVal = 10; - window.onload = function() { - var dps=[]; //stores class 1 points and plots on chart - var dps1 = []; //stores class 2 points and plots on chart - var dps2 = []; - var xValClass1=[]; - var yValClass1=[]; - var xValClass2=[]; - var yValClass2=[]; - var xmeanClass1=0; - var ymeanClass1=0; - var xmeanClass2=0; - var ymeanClass2=0; + var distributionFunction = 0; + var series1 = []; //stores class 1 points and plots on chart + var series2 = []; //stores class 2 points and plots on chart + var xmin_1 = 0; + var ymin_1 = 0; + var xmin_2 = 0; + var ymin_2 = 0; + var xmax_1 = 0; + var ymax_1 = 0; + var xmax_2 = 0; + var ymax_2 = 0; + var xmeanClass1 = 0; + var ymeanClass1 = 0; + var xmeanClass2 = 0; + var ymeanClass2 = 0; + var covariance11Val1 = 0; + var covariance12Val1 = 0; + var covariance22Val1 = 0; + var covariance11Val2 = 0; + var covariance12Val2 = 0; + var covariance22Val2 = 0; + var s1Size = 0; + var s2Size = 0; var chart = new CanvasJS.Chart("chartContainer", { axisX:{ @@ -32,99 +35,308 @@ window.onload = function() { legendText: "Class 1", color: "red", type: "scatter", - dataPoints: dps + dataPoints: series1 }, { showInLegend: true, legendText: "Class 2", color: "blue", type: "scatter", - dataPoints: dps1 + dataPoints: series2 }] }); - function addDataPoints() { - for(var j = 0; j < data.length; j++) { - xVal = data[j][0]; - yVal = (-data1[0]/data1[1])*xVal -(data1[2]/data1[1]); - dps2.push({ - x: xVal, - y: yVal - }); - chart.render(); - } - } - function addDataPointsAndRender1() { xValue = Number(document.getElementById("xValue").value); yValue = Number(document.getElementById("yValue").value); - xValClass1.push(xValue); - yValClass1.push(yValue); - - dps.push({ + series1.push({ x: xValue, y: yValue }); chart.render(); - console.log(xValClass1); - console.log(yValClass1); } function addDataPointsAndRender2() { xValue = Number(document.getElementById("xValue").value); yValue = Number(document.getElementById("yValue").value); - xValClass2.push(xValue); - yValClass2.push(yValue); - /*var arr=[]; - arr.push(xValue,yValue,1); - row.push(0); - data.push(arr); - arr=[];*/ - dps1.push({ + series2.push({ x: xValue, y: yValue }); chart.render(); - console.log(xValClass2); - console.log(yValClass2); } + function clear(){ + series1=[]; + series2 = []; + xmeanClass1=0.0; + ymeanClass1=0.0; + xmeanClass2=0.0; + ymeanClass2=0.0; + chart.render(); + } + function addcalculateMLE() { - for(var i=0; i xmax_1) { + xmax_1 = series1[i1].x; + } + if (series1[i1].y < ymin_1) { + ymin_1 = series1[i1].y; + } + if (!series1[i1].y > ymax_1) + continue; + ymax_1 = series1[i1].y; } - xmeanClass1 = xmeanClass1/xValClass1.length; - for(var i=0; i xmax_2) { + xmax_2 = series2[i2].x; + } + if (series2[i2].y < ymin_2) { + ymin_2 = series2[i2].y; + } + if (!series2[i2].y > ymax_2) + continue; + ymax_2 = series2[i2].y; + } + + if (distributionFunction == 1) { + l2gammax /= series2.length; + l2gammay /= series2.length; + } + xmeanClass2 = xmeanClass2 / series2.length; + ymeanClass2 = ymeanClass2 / series2.length; + if (distributionFunction == 0) { + document.getElementById("mean2x").innerHTML = xmeanClass2; + document.getElementById("mean2y").innerHTML = ymeanClass2; + } + + //VARIANCE CALCULATION FOR X-VALUE AND Y-VALUE OF CLASS 2 + covariance11Val2 = 0.0; + covariance12Val2 = 0.0; + covariance22Val2 = 0.0; + for (i2 = 0; i2 < series2.length; i2++) { + covariance11Val2 += Math.pow(series2[i2].x, 2.0); + covariance22Val2 += Math.pow(series2[i2].y, 2.0); + covariance12Val2 += series2[i2].y * series2[i2].x; + } + + covariance11Val2 = covariance11Val2 / series2.length - xmeanClass2 * xmeanClass2; + covariance22Val2 = covariance22Val2 / series2.length - ymeanClass2 * ymeanClass2; + covariance12Val2 = covariance12Val2 / series2.length - xmeanClass2 * ymeanClass2; + + if (distributionFunction == 0) { + document.getElementById("c11-2").innerHTML = covariance11Val2; + document.getElementById("c12-2").innerHTML = covariance12Val2; + document.getElementById("c21-2").innerHTML = covariance12Val2; + document.getElementById("c22-2").innerHTML = covariance22Val2; + } + + if (distributionFunction == 1) { + document.getElementById("c11-1").innerHTML = ""; + document.getElementById("c12-1").innerHTML = ""; + document.getElementById("c21-1").innerHTML = ""; + document.getElementById("c22-1").innerHTML = ""; + document.getElementById("c11-2").innerHTML = ""; + document.getElementById("c12-2").innerHTML = ""; + document.getElementById("c21-2").innerHTML = ""; + document.getElementById("c22-2").innerHTML = ""; + } + s2Size = series2.length; + + } + function addmarkAll() { + var j; + var p1; + var p2; + var i; + var series1=[]; + var series2 = []; + var l = -1; + var r = 1; + if(distributionFunction == 0){ + for(i = l; i < r; i += (r - l) / 100.0){ + for (j = l; j < r; j += (r - l) / 100.0) { + p1 = prob1(j, i); + if (p1 > (p2 = prob2(j, i))) { + series1.push({ + x: i, + y: j + }); + chart.render(); + continue; + } + series2.push({ + x: i, + y: j + }); + chart.render(); + } + } + //chart.render(); + } + + if (distributionFunction == 1) { + for (i = l; i < r; i += (r - l) / 100.0) { + for (j = l; j < r; j += (r - l) / 100.0) { + p1 = prob1(j, i); + if (p1 > (p2 = prob2(j, i))) { + series1.push({ + x: i, + y: j + }); + chart.render(); + } + if (p2 > p1) { + series2.push({ + x: i, + y: j + }); + chart.render(); + } + if (p1 != p2 || p1 == 0.0) + continue; + series2.push({ + x: i, + y: j + }); + chart.render(); + } + } + //chart.render(); + } + console.log(series1); + console.log(series2); } + function prob1(x, y){ + var r = 0.0; + if(distributionFunction == 0){ + var sigmax = Math.sqrt(covariance22Val1); + var sigmay = Math.sqrt(covariance11Val1); + var rho = covariance12Val1 / (sigmax * sigmay); + rho = 0.0; + r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass1, 2.0) / covariance11Val1 + Math.pow(x - ymeanClass1, 2.0) / covariance22Val1 - 2.0 * rho * (y - xmeanClass1) * (x - ymeanClass1) / (sigmax * sigmay))); + if (distributionFunction == 1 && x <= xmax_1 && x >= xmin_1 && y <= ymax_1 && y >= ymin_1) { + r = s1Size; + } + console.log(r); + return r; + } + + } + + function prob2(x, y) { + var r = 0.0; + if (distributionFunction == 0) { + var sigmax = Math.sqrt(covariance22Val2); + var sigmay = Math.sqrt(covariance11Val2); + var rho = covariance12Val2 / (sigmax * sigmay); + rho = 0.0; + r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass2, 2.0) / covariance11Val2 + Math.pow(x - ymeanClass2, 2.0) / covariance22Val2 - 2.0 * rho * (y - xmeanClass2) * (x - ymeanClass2) / (sigmax * sigmay))); + } + if (distributionFunction == 1 && x <= xmax_2 && x >= xmin_2 && y <= ymax_2 && y >= ymin_2) { + r = s2Size; + } + console.log(r); + return r; + } + + var addClass1 = document.getElementById("add-class-1"); addClass1.addEventListener("click", addDataPointsAndRender1); var addClass2 = document.getElementById("add-class-2"); addClass2.addEventListener("click", addDataPointsAndRender2); + var clearButton = document.getElementById("clear"); + clearButton.addEventListener("click", clear) var calculateMLE = document.getElementById("calculate-mle"); calculateMLE.addEventListener("click", addcalculateMLE); var markAll=document.getElementById("mark-all"); From 76f3303fd05afe318f71bbb25995d09be23a7ecf Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Fri, 14 Jun 2019 17:05:48 +0530 Subject: [PATCH 095/166] algorithm added --- SRIP/Project-2 Issue Number 243/Codes/exp6.js | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Project-2 Issue Number 243/Codes/exp6.js index df891a0b..1f7d6194 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.js +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.js @@ -2,14 +2,14 @@ window.onload = function() { var distributionFunction = 0; var series1 = []; //stores class 1 points and plots on chart var series2 = []; //stores class 2 points and plots on chart - var xmin_1 = 0; - var ymin_1 = 0; - var xmin_2 = 0; - var ymin_2 = 0; - var xmax_1 = 0; - var ymax_1 = 0; - var xmax_2 = 0; - var ymax_2 = 0; + var xmin1 = 0; + var ymin1 = 0; + var xmin2 = 0; + var ymin2 = 0; + var xmax1 = 0; + var ymax1 = 0; + var xmax2 = 0; + var ymax2 = 0; var xmeanClass1 = 0; var ymeanClass1 = 0; var xmeanClass2 = 0; @@ -67,27 +67,27 @@ window.onload = function() { } function clear(){ - series1=[]; + series1 = []; series2 = []; - xmeanClass1=0.0; - ymeanClass1=0.0; - xmeanClass2=0.0; - ymeanClass2=0.0; + xmeanClass1 = 0.0; + ymeanClass1 = 0.0; + xmeanClass2 = 0.0; + ymeanClass2 = 0.0; chart.render(); } function addcalculateMLE() { distributionFunction = document.getElementById("distribution-function").value; - var i1=0; - var i2=0; - xmin_1 = 100.0; - ymin_1 = 100.0; - xmin_2 = 100.0; - ymin_2 = 100.0; - xmax_1 = -100.0; - ymax_1 = -100.0; - xmax_2 = -100.0; - ymax_2 = -100.0; + var i1 = 0; + var i2 = 0; + xmin1 = 100.0; + ymin1 = 100.0; + xmin2 = 100.0; + ymin2 = 100.0; + xmax1 = -100.0; + ymax1 = -100.0; + xmax2 = -100.0; + ymax2 = -100.0; xmeanClass1 = 0.0; ymeanClass1 = 0.0; xmeanClass2 = 0.0; @@ -100,32 +100,32 @@ window.onload = function() { xmeanClass1 += series1[i1].x; ymeanClass1 += series1[i1].y; - if (distributionFunction == 1) { + if (distributionFunction === 1) { l1gammax += series1[i1].x; l1gammay += series1[i1].y; } - if (series1[i1].x < xmin_1) { - xmin_1 = series1[i1].x; + if (series1[i1].x < xmin1) { + xmin1 = series1[i1].x; } - if (series1[i1].x > xmax_1) { - xmax_1 = series1[i1].x; + if (series1[i1].x > xmax1) { + xmax1 = series1[i1].x; } - if (series1[i1].y < ymin_1) { - ymin_1 = series1[i1].y; + if (series1[i1].y < ymin1) { + ymin1 = series1[i1].y; } - if (!series1[i1].y > ymax_1) + if (!series1[i1].y > ymax1) continue; - ymax_1 = series1[i1].y; + ymax1 = series1[i1].y; } - if (distributionFunction == 1) { + if (distributionFunction === 1) { l1gammax /= series1.length; l1gammay /= series1.length; } xmeanClass1 = xmeanClass1 / series1.length; ymeanClass1 = ymeanClass1 / series1.length; - if (distributionFunction == 0) { + if (distributionFunction === 0) { document.getElementById("mean1x").innerHTML = xmeanClass1; document.getElementById("mean1y").innerHTML = ymeanClass1; } @@ -144,14 +144,14 @@ window.onload = function() { covariance22Val1 = covariance22Val1 / series1.length - ymeanClass1 * ymeanClass1; covariance12Val1 = covariance12Val1 / series1.length - xmeanClass1 * ymeanClass1; - if (distributionFunction == 0) { + if (distributionFunction === 0) { document.getElementById("c11-1").innerHTML = covariance11Val1; document.getElementById("c12-1").innerHTML = covariance12Val1; document.getElementById("c21-1").innerHTML = covariance12Val1; document.getElementById("c22-1").innerHTML = covariance22Val1; } - if (distributionFunction == 1) { + if (distributionFunction === 1) { document.getElementById("c11-1").innerHTML = ""; document.getElementById("c12-1").innerHTML = ""; document.getElementById("c21-1").innerHTML = ""; @@ -167,32 +167,32 @@ window.onload = function() { xmeanClass2 += series2[i2].x; ymeanClass2 += series2[i2].y; - if (distributionFunction == 1) { + if (distributionFunction === 1) { l2gammax += series2[i2].x; l2gammay += series2[i2].y; } - if (series2[i2].x < xmin_2) { - xmin_2 = series2[i2].x; + if (series2[i2].x < xmin2) { + xmin2 = series2[i2].x; } - if (series2[i2].x > xmax_2) { - xmax_2 = series2[i2].x; + if (series2[i2].x > xmax2) { + xmax2 = series2[i2].x; } - if (series2[i2].y < ymin_2) { - ymin_2 = series2[i2].y; + if (series2[i2].y < ymin2) { + ymin2 = series2[i2].y; } - if (!series2[i2].y > ymax_2) + if (!series2[i2].y > ymax2) continue; - ymax_2 = series2[i2].y; + ymax2 = series2[i2].y; } - if (distributionFunction == 1) { + if (distributionFunction === 1) { l2gammax /= series2.length; l2gammay /= series2.length; } xmeanClass2 = xmeanClass2 / series2.length; ymeanClass2 = ymeanClass2 / series2.length; - if (distributionFunction == 0) { + if (distributionFunction === 0) { document.getElementById("mean2x").innerHTML = xmeanClass2; document.getElementById("mean2y").innerHTML = ymeanClass2; } @@ -211,14 +211,14 @@ window.onload = function() { covariance22Val2 = covariance22Val2 / series2.length - ymeanClass2 * ymeanClass2; covariance12Val2 = covariance12Val2 / series2.length - xmeanClass2 * ymeanClass2; - if (distributionFunction == 0) { + if (distributionFunction === 0) { document.getElementById("c11-2").innerHTML = covariance11Val2; document.getElementById("c12-2").innerHTML = covariance12Val2; document.getElementById("c21-2").innerHTML = covariance12Val2; document.getElementById("c22-2").innerHTML = covariance22Val2; } - if (distributionFunction == 1) { + if (distributionFunction === 1) { document.getElementById("c11-1").innerHTML = ""; document.getElementById("c12-1").innerHTML = ""; document.getElementById("c21-1").innerHTML = ""; @@ -241,7 +241,7 @@ window.onload = function() { var series2 = []; var l = -1; var r = 1; - if(distributionFunction == 0){ + if(distributionFunction === 0){ for(i = l; i < r; i += (r - l) / 100.0){ for (j = l; j < r; j += (r - l) / 100.0) { p1 = prob1(j, i); @@ -263,7 +263,7 @@ window.onload = function() { //chart.render(); } - if (distributionFunction == 1) { + if (distributionFunction === 1) { for (i = l; i < r; i += (r - l) / 100.0) { for (j = l; j < r; j += (r - l) / 100.0) { p1 = prob1(j, i); @@ -281,7 +281,7 @@ window.onload = function() { }); chart.render(); } - if (p1 != p2 || p1 == 0.0) + if (p1 !== p2 || p1 === 0.0) continue; series2.push({ x: i, @@ -305,7 +305,7 @@ window.onload = function() { var rho = covariance12Val1 / (sigmax * sigmay); rho = 0.0; r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass1, 2.0) / covariance11Val1 + Math.pow(x - ymeanClass1, 2.0) / covariance22Val1 - 2.0 * rho * (y - xmeanClass1) * (x - ymeanClass1) / (sigmax * sigmay))); - if (distributionFunction == 1 && x <= xmax_1 && x >= xmin_1 && y <= ymax_1 && y >= ymin_1) { + if (distributionFunction == 1 && x <= xmax1 && x >= xmin1 && y <= ymax1 && y >= ymin1) { r = s1Size; } console.log(r); @@ -323,7 +323,7 @@ window.onload = function() { rho = 0.0; r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass2, 2.0) / covariance11Val2 + Math.pow(x - ymeanClass2, 2.0) / covariance22Val2 - 2.0 * rho * (y - xmeanClass2) * (x - ymeanClass2) / (sigmax * sigmay))); } - if (distributionFunction == 1 && x <= xmax_2 && x >= xmin_2 && y <= ymax_2 && y >= ymin_2) { + if (distributionFunction == 1 && x <= xmax2 && x >= xmin2 && y <= ymax2 && y >= ymin2) { r = s2Size; } console.log(r); From 4df9ea152e07a46dcad030e451fcda5e488d9837 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Fri, 14 Jun 2019 17:12:03 +0530 Subject: [PATCH 096/166] algorithm added --- SRIP/Project-2 Issue Number 243/Codes/exp6.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Project-2 Issue Number 243/Codes/exp6.js index 1f7d6194..4c470ac8 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.js +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.js @@ -180,8 +180,9 @@ window.onload = function() { if (series2[i2].y < ymin2) { ymin2 = series2[i2].y; } - if (!series2[i2].y > ymax2) + if (!series2[i2].y > ymax2){ continue; + } ymax2 = series2[i2].y; } @@ -281,8 +282,9 @@ window.onload = function() { }); chart.render(); } - if (p1 !== p2 || p1 === 0.0) + if (p1 !== p2 || p1 === 0.0) { continue; + } series2.push({ x: i, y: j From 8dc814914f8e75a04d51061887a8416aa3420d10 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Fri, 14 Jun 2019 17:22:48 +0530 Subject: [PATCH 097/166] algorithm added --- SRIP/Project-2 Issue Number 243/Codes/exp6.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Project-2 Issue Number 243/Codes/exp6.js index 4c470ac8..cf721c84 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.js +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.js @@ -47,8 +47,8 @@ window.onload = function() { }); function addDataPointsAndRender1() { - xValue = Number(document.getElementById("xValue").value); - yValue = Number(document.getElementById("yValue").value); + var xValue = Number(document.getElementById("xValue").value); + var yValue = Number(document.getElementById("yValue").value); series1.push({ x: xValue, y: yValue @@ -113,8 +113,9 @@ window.onload = function() { if (series1[i1].y < ymin1) { ymin1 = series1[i1].y; } - if (!series1[i1].y > ymax1) + if (!series1[i1].y > ymax1){ continue; + } ymax1 = series1[i1].y; } @@ -301,13 +302,13 @@ window.onload = function() { function prob1(x, y){ var r = 0.0; - if(distributionFunction == 0){ + if(distributionFunction === 0){ var sigmax = Math.sqrt(covariance22Val1); var sigmay = Math.sqrt(covariance11Val1); var rho = covariance12Val1 / (sigmax * sigmay); rho = 0.0; r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass1, 2.0) / covariance11Val1 + Math.pow(x - ymeanClass1, 2.0) / covariance22Val1 - 2.0 * rho * (y - xmeanClass1) * (x - ymeanClass1) / (sigmax * sigmay))); - if (distributionFunction == 1 && x <= xmax1 && x >= xmin1 && y <= ymax1 && y >= ymin1) { + if (distributionFunction === 1 && x <= xmax1 && x >= xmin1 && y <= ymax1 && y >= ymin1) { r = s1Size; } console.log(r); @@ -318,14 +319,14 @@ window.onload = function() { function prob2(x, y) { var r = 0.0; - if (distributionFunction == 0) { + if (distributionFunction === 0) { var sigmax = Math.sqrt(covariance22Val2); var sigmay = Math.sqrt(covariance11Val2); var rho = covariance12Val2 / (sigmax * sigmay); rho = 0.0; r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass2, 2.0) / covariance11Val2 + Math.pow(x - ymeanClass2, 2.0) / covariance22Val2 - 2.0 * rho * (y - xmeanClass2) * (x - ymeanClass2) / (sigmax * sigmay))); } - if (distributionFunction == 1 && x <= xmax2 && x >= xmin2 && y <= ymax2 && y >= ymin2) { + if (distributionFunction === 1 && x <= xmax2 && x >= xmin2 && y <= ymax2 && y >= ymin2) { r = s2Size; } console.log(r); @@ -341,6 +342,6 @@ window.onload = function() { clearButton.addEventListener("click", clear) var calculateMLE = document.getElementById("calculate-mle"); calculateMLE.addEventListener("click", addcalculateMLE); - var markAll=document.getElementById("mark-all"); + var markAll = document.getElementById("mark-all"); markAll.addEventListener("click", addmarkAll); } \ No newline at end of file From 107ffb648b87db6a1fa4488280ceadc58c4590d5 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Fri, 14 Jun 2019 17:35:51 +0530 Subject: [PATCH 098/166] algorithm added --- .../Libraries/canvasjs-2.3.1/canvasjs.min.js | 911 +++++++++++++++++ .../canvasjs-2.3.1/canvasjs.react.js | 48 + .../examples/01-overview/animated-chart.html | 43 + .../01-overview/chart-from-json-data.html | 50 + .../chart-with-axis-scale-breaks.html | 51 + .../01-overview/chart-with-crosshair.html | 72 ++ .../chart-with-custom-legend-chart.html | 233 +++++ .../01-overview/chart-with-image-overlay.html | 108 ++ .../chart-with-index-data-label.html | 46 + .../chart-with-inverted-reversed-axis.html | 46 + .../chart-with-logarithmic-axis.html | 128 +++ .../chart-with-secondary-axis.html | 87 ++ .../01-overview/chart-with-zoom-pan.html | 40 + .../examples/01-overview/dynamic-chart.html | 57 ++ .../interactive-draggable-chart.html | 115 +++ .../01-overview/multi-series-chart.html | 94 ++ .../examples/01-overview/null-data-chart.html | 62 ++ .../01-overview/performance-demo.html | 43 + .../dashed-line-chart.html | 102 ++ .../dynamic-spline-chart.html | 56 ++ .../line-chart-with-axis-scale-breaks.html | 71 ++ .../line-chart-with-data-markers.html | 53 + .../line-chart-with-logarithmic-axis.html | 107 ++ .../line-chart-with-multiple-axis.html | 125 +++ .../line-chart-with-zoom-pan.html | 46 + .../line-chart.html | 44 + .../multi-series-line-chart.html | 257 +++++ .../multi-series-spline-chart.html | 171 ++++ .../multi-series-step-line-chart.html | 67 ++ .../spline-chart-with-legends.html | 123 +++ .../spline-chart-with-secondary-axis.html | 100 ++ .../spline-chart.html | 55 ++ .../step-line-chart.html | 57 ++ .../area-chart.html | 50 + .../multi-series-area-chart.html | 73 ++ .../multi-series-range-area-chart.html | 127 +++ .../multi-series-spline-area-chart.html | 113 +++ .../range-area-chart.html | 72 ++ .../range-spline-area-chart.html | 51 + .../spline-area-chart.html | 55 ++ ...ed-area-100-chart-with-date-time-axis.html | 120 +++ .../stacked-area-100-chart.html | 78 ++ .../stacked-area-chart.html | 68 ++ .../step-area-chart.html | 42 + .../bar-chart-with-axis-scale-break.html | 58 ++ .../bar-chart.html | 58 ++ .../column-chart-with-multiple-axis.html | 83 ++ .../column-chart.html | 43 + .../multi-series-bar-chart.html | 104 ++ .../multi-series-range-column-chart.html | 89 ++ .../multi-series-waterfall-chart.html | 98 ++ .../range-bar-chart.html | 49 + .../range-column-chart.html | 49 + .../stacked-bar-100-chart.html | 76 ++ .../stacked-bar-chart.html | 126 +++ .../stacked-column-100-chart.html | 103 ++ .../stacked-column-chart.html | 113 +++ .../waterfall-chart-with-custom-color.html | 51 + .../waterfall-chart.html | 48 + .../doughnut-Chart.html | 40 + ...ughnut-chart-with-custom-inner-radius.html | 55 ++ .../funnel-chart-with-custom-neck.html | 52 + .../funnel-chart.html | 52 + .../inverted-reversed-funnel-chart.html | 54 + .../pie-chart-with-custom-radius.html | 51 + .../pie-chart-with-legends.html | 52 + .../pie-chart.html | 36 + ...mid-chart-where-area-represents-value.html | 39 + ...-chart-with-index-label-placed-Inside.html | 40 + .../pyramid-chart.html | 40 + .../candlestick-line-chart.html | 108 ++ .../multi-series-candlestick-chart.html | 90 ++ .../ohlc-chart-from-json-data.html | 58 ++ .../ohlc-stock-chart.html | 54 + .../bubble-chart-with-data-marker.html | 59 ++ .../bubble-chart-with-zoom-pan.html | 60 ++ .../bubble-chart.html | 69 ++ .../multi-series-scatter-point-chart.html | 73 ++ ...catter-point-chart-with-custom-marker.html | 129 +++ .../scatter-point-chart.html | 63 ++ ...x-and-whisker-chart-with-custom-color.html | 43 + .../box-and-whisker-chart-with-outliers.html | 81 ++ .../box-and-whisker-chart.html | 43 + .../column-line-area-chart.html | 122 +++ .../error-bar-chart.html | 54 + .../09-combination-charts/error-chart.html | 58 ++ .../error-line-chart.html | 73 ++ .../ohlc-line-chart.html | 106 ++ .../pareto-chart-with-index-data-label.html | 68 ++ .../09-combination-charts/pareto-chart.html | 66 ++ .../range-area-line-chart.html | 108 ++ .../dynamic-column-chart.html | 54 + .../10-dynamic-charts/dynamic-line-chart.html | 58 ++ .../dynamic-multi-series-chart.html | 113 +++ .../11-integration/jquery-charts.html | 42 + .../jquery-line-chart-with-zoom-pan.html | 49 + .../jquery-resizable-chart.html | 55 ++ .../jquery-spline-area-chart-in-tab.html | 98 ++ ...jquery-spline-chart-with-image-export.html | 41 + .../Libraries/canvasjs-2.3.1/instruction.txt | 4 + .../canvasjs-2.3.1/jquery.canvasjs.min.js | 922 ++++++++++++++++++ .../Libraries/canvasjs-2.3.1/license.txt | 9 + 102 files changed, 9206 insertions(+) create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.min.js create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.react.js create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/instruction.txt create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js create mode 100644 SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/license.txt diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.min.js b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.min.js new file mode 100644 index 00000000..0ef77455 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.min.js @@ -0,0 +1,911 @@ +/* + CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ + Copyright 2018 fenopix + + --------------------- License Information -------------------- + CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. + https://canvasjs.com/license/ + +*/ +/*eslint-disable*/ +/*jshint ignore:start*/ +(function(){function qa(k,p){k.prototype=eb(p.prototype);k.prototype.constructor=k;k.base=p.prototype}function eb(k){function p(){}p.prototype=k;return new p}function Ya(k,p,D){"millisecond"===D?k.setMilliseconds(k.getMilliseconds()+1*p):"second"===D?k.setSeconds(k.getSeconds()+1*p):"minute"===D?k.setMinutes(k.getMinutes()+1*p):"hour"===D?k.setHours(k.getHours()+1*p):"day"===D?k.setDate(k.getDate()+1*p):"week"===D?k.setDate(k.getDate()+7*p):"month"===D?k.setMonth(k.getMonth()+1*p):"year"===D&&k.setFullYear(k.getFullYear()+ +1*p);return k}function $(k,p){var D=!1;0>k&&(D=!0,k*=-1);k=""+k;for(p=p?p:1;k.length
Please right click on the image and save it to your device
"), +p.document.close()}}}function N(k){var p=((k&16711680)>>16).toString(16),D=((k&65280)>>8).toString(16);k=((k&255)>>0).toString(16);p=2>p.length?"0"+p:p;D=2>D.length?"0"+D:D;k=2>k.length?"0"+k:k;return"#"+p+D+k}function fb(k,p){var D=this.length>>>0,r=Number(p)||0,r=0>r?Math.ceil(r):Math.floor(r);for(0>r&&(r+=D);rD;D++)if(k[D]!==k[D+4]|k[D]!==k[D+8]|k[D]!==k[D+12]){p=!1;break}return p?k[0]<<16|k[1]<<8|k[2]:0}function na(k,p,D){return k in p?p[k]:D[k]}function Oa(k,p,D){if(r&&bb){var u=k.getContext("2d");Pa=u.webkitBackingStorePixelRatio|| +u.mozBackingStorePixelRatio||u.msBackingStorePixelRatio||u.oBackingStorePixelRatio||u.backingStorePixelRatio||1;W=Ua/Pa;k.width=p*W;k.height=D*W;Ua!==Pa&&(k.style.width=p+"px",k.style.height=D+"px",u.scale(W,W))}else k.width=p,k.height=D}function hb(k){if(!ib){var p=!1,D=!1;"undefined"===typeof ra.Chart.creditHref?(k.creditHref=ja("iuuqr;..b`ow`rkr/bnl."),k.creditText=ja("B`ow`rKR/bnl")):(p=k.updateOption("creditText"),D=k.updateOption("creditHref"));if(k.creditHref&&k.creditText){k._creditLink|| +(k._creditLink=document.createElement("a"),k._creditLink.setAttribute("class","canvasjs-chart-credit"),k._creditLink.setAttribute("title","JavaScript Charts"),k._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:2px;top:"+(k.height-14)+"px;color:dimgrey;text-decoration:none;font-size:11px;font-family: Calibri, Lucida Grande, Lucida Sans Unicode, Arial, sans-serif"),k._creditLink.setAttribute("tabIndex",-1),k._creditLink.setAttribute("target","_blank"));if(0===k.renderCount|| +p||D)k._creditLink.setAttribute("href",k.creditHref),k._creditLink.innerHTML=k.creditText;k._creditLink&&k.creditHref&&k.creditText?(k._creditLink.parentElement||k._canvasJSContainer.appendChild(k._creditLink),k._creditLink.style.top=k.height-14+"px"):k._creditLink.parentElement&&k._canvasJSContainer.removeChild(k._creditLink)}}}function ta(k,p){Ja&&(this.canvasCount|=0,window.console.log(++this.canvasCount));var D=document.createElement("canvas");D.setAttribute("class","canvasjs-chart-canvas");Oa(D, +k,p);r||"undefined"===typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(D);return D}function sa(k,p,D){for(var r in D)p.style[r]=D[r]}function ua(k,p,D){p.getAttribute("state")||(p.style.backgroundColor=k.toolbar.backgroundColor,p.style.color=k.toolbar.fontColor,p.style.border="none",sa(k,p,{WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",userSelect:"none"}));p.getAttribute("state")!==D&&(p.setAttribute("state",D),p.setAttribute("type","button"),sa(k,p,{padding:"5px 12px", +cursor:"pointer","float":"left",width:"40px",height:"25px",outline:"0px",verticalAlign:"baseline",lineHeight:"0"}),p.setAttribute("title",k._cultureInfo[D+"Text"]),p.innerHTML=""+k._cultureInfo[D+"Text"]+"")}function Qa(){for(var k=null,p=0;pa?"a":"p";case "tt":return 12>a?"am":"pm";case "T":return 12>a?"A": +"P";case "TT":return 12>a?"AM":"PM";case "K":return S?"UTC":(String(z).match(H)||[""]).pop().replace(F,"");case "z":return(0k?!0:!1;u&&(k*=-1);var v=r?r.decimalSeparator:".",H=r?r.digitGroupSeparator: +",",F="";p=String(p);var F=1,z=r="",E=-1,L=[],R=[],I=0,N=0,S=0,O=!1,U=0,z=p.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|\u2030|./g);p=null;for(var Q=0;z&&QE)E=Q;else{if("%"===p)F*=100;else if("\u2030"===p){F*=1E3;continue}else if(","===p[0]&&"."===p[p.length-1]){F/=Math.pow(1E3,p.length-1);E=Q+p.length-1;continue}else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||(O=!0);0>E?(L.push(p),"#"===p||"0"===p?I++:","===p&&S++):(R.push(p),"#"!==p&&"0"!==p||N++)}O&&(p=Math.floor(k), +z=-Math.floor(Math.log(k)/Math.LN10+1),U=0===k?0:0===p?-(I+z):String(p).length-I,F/=Math.pow(10,U));0>E&&(E=Q);F=(k*F).toFixed(N);p=F.split(".");F=(p[0]+"").split("");k=(p[1]+"").split("");F&&"0"===F[0]&&F.shift();for(O=z=Q=N=E=0;0U?p.replace("+","").replace("-",""):p.replace("-",""),r+=p.replace(/[0]+/,function(k){return $(U,k.length)}));H="";for(L=!1;0U?p.replace("+","").replace("-",""):p.replace("-",""),H+=p.replace(/[0]+/,function(k){return $(U,k.length)}));r+=(L?v:"")+H;return u?"-"+r:r},Ra=function(k){var p=0,r=0;k=k||window.event;k.offsetX||0===k.offsetX?(p=k.offsetX,r=k.offsetY):k.layerX||0==k.layerX?(p=k.layerX,r=k.layerY):(p=k.pageX-k.target.offsetLeft, +r=k.pageY-k.target.offsetTop);return{x:p,y:r}},bb=!0,Ua=window.devicePixelRatio||1,Pa=1,W=bb?Ua/Pa:1,ea=function(k,p,r,u,v,H,F,z,E,L,R,N,O){"undefined"===typeof O&&(O=1);F=F||0;z=z||"black";var I=15p)v=H-1;else break}r>p&&1H&&(F=p.pop(),u-=F.height,v=z)}this._wrappedText={lines:p,width:v,height:u};this.width=v+(this.leftPadding+this.rightPadding);this.height=u+(this.topPadding+this.bottomPadding);this.ctx.font=r};ka.prototype._getFontString=function(){var k;k=""+(this.fontStyle?this.fontStyle+" ":"");k+=this.fontWeight?this.fontWeight+" ":"";k+=this.fontSize?this.fontSize+"px ":"";var p=this.fontFamily?this.fontFamily+"":"";!r&&p&&(p=p.split(",")[0],"'"!==p[0]&&'"'!==p[0]&&(p="'"+p+"'"));return k+=p}; +qa(Va,V);qa(Aa,V);Aa.prototype.setLayout=function(){if(this.text){var k=this.dockInsidePlotArea?this.chart.plotArea:this.chart,p=k.layoutManager.getFreeSpace(),r=p.x1,v=p.y1,E=0,H=0,F=this.chart._menuButton&&this.chart.exportEnabled&&"top"===this.verticalAlign?22:0,z,I;"top"===this.verticalAlign||"bottom"===this.verticalAlign?(null===this.maxWidth&&(this.maxWidth=p.width-4-F*("center"===this.horizontalAlign?2:1)),H=0.5*p.height-this.margin-2,E=0):"center"===this.verticalAlign&&("left"===this.horizontalAlign|| +"right"===this.horizontalAlign?(null===this.maxWidth&&(this.maxWidth=p.height-4),H=0.5*p.width-this.margin-2):"center"===this.horizontalAlign&&(null===this.maxWidth&&(this.maxWidth=p.width-4),H=0.5*p.height-4));var L;u(this.padding)||"number"!==typeof this.padding?u(this.padding)||"object"!==typeof this.padding||(L=this.padding.top?this.padding.top:this.padding.bottom?this.padding.bottom:0,L+=this.padding.bottom?this.padding.bottom:this.padding.top?this.padding.top:0,L*=1.25):L=2.5*this.padding;this.wrap|| +(H=Math.min(H,Math.max(1.5*this.fontSize,this.fontSize+L)));H=new ka(this.ctx,{fontSize:this.fontSize,fontFamily:this.fontFamily,fontColor:this.fontColor,fontStyle:this.fontStyle,fontWeight:this.fontWeight,horizontalAlign:this.horizontalAlign,verticalAlign:this.verticalAlign,borderColor:this.borderColor,borderThickness:this.borderThickness,backgroundColor:this.backgroundColor,maxWidth:this.maxWidth,maxHeight:H,cornerRadius:this.cornerRadius,text:this.text,padding:this.padding,textBaseline:"top"}); +L=H.measureText();"top"===this.verticalAlign||"bottom"===this.verticalAlign?("top"===this.verticalAlign?(v=p.y1+2,I="top"):"bottom"===this.verticalAlign&&(v=p.y2-2-L.height,I="bottom"),"left"===this.horizontalAlign?r=p.x1+2:"center"===this.horizontalAlign?r=p.x1+p.width/2-L.width/2:"right"===this.horizontalAlign&&(r=p.x2-2-L.width-F),z=this.horizontalAlign,this.width=L.width,this.height=L.height):"center"===this.verticalAlign&&("left"===this.horizontalAlign?(r=p.x1+2,v=p.y2-2-(this.maxWidth/2-L.width/ +2),E=-90,I="left",this.width=L.height,this.height=L.width):"right"===this.horizontalAlign?(r=p.x2-2,v=p.y1+2+(this.maxWidth/2-L.width/2),E=90,I="right",this.width=L.height,this.height=L.width):"center"===this.horizontalAlign&&(v=k.y1+(k.height/2-L.height/2),r=k.x1+(k.width/2-L.width/2),I="center",this.width=L.width,this.height=L.height),z="center");H.x=r;H.y=v;H.angle=E;H.horizontalAlign=z;this._textBlock=H;k.layoutManager.registerSpace(I,{width:this.width+("left"===I||"right"===I?this.margin+2:0), +height:this.height+("top"===I||"bottom"===I?this.margin+2:0)});this.bounds={x1:r,y1:v,x2:r+this.width,y2:v+this.height};this.ctx.textBaseline="top"}};Aa.prototype.render=function(){this._textBlock&&this._textBlock.render(!0)};qa(Ka,V);Ka.prototype.setLayout=Aa.prototype.setLayout;Ka.prototype.render=Aa.prototype.render;Wa.prototype.get=function(k,p){var r=null;0a[g].x&&0w?{x:a[l].x+w/3,y:a[l].y+c/3}:{x:a[l].x,y:a[l].y+c/9};l=e;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[l].x-a[g].x?0.01:a[l].x-a[g].x))*(d- +1)/2+1;w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0w?{x:a[l].x-w/3,y:a[l].y-c/3}:{x:a[l].x,y:a[l].y-c/9};b[b.length]=a[e]}return b}function E(a,d,b,c,e,g,m,l,w,h){var s=0;h?(m.color=g,l.color=g):h=1;s=w?Math.abs(e-b):Math.abs(c-d);s=0this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360);this.options.scaleBreaks&&(this.scaleBreaks=new Q(this.chart, +this.options.scaleBreaks,++this.chart._eventManager.lastObjectId,this));this.stripLines=[];if(this.options.stripLines&&0=this._appliedBreaks[a+1].startValue&&(this._appliedBreaks[a].endValue=Math.max(this._appliedBreaks[a].endValue,this._appliedBreaks[a+1].endValue),window.console&&window.console.log("CanvasJS Error: Breaks "+a+" and "+(a+1)+" are overlapping."),this._appliedBreaks.splice(a,2),a--)}}function L(a,d,b,c,e,g){L.base.constructor.call(this,"Break",d,b,c,g);this.id=e;this.chart=a;this.ctx=this.chart.ctx;this.scaleBreaks=g;this.optionsName= +d;this.isOptionsInArray=!0;this.type=b.type?this.type:g.type;this.fillOpacity=u(b.fillOpacity)?g.fillOpacity:this.fillOpacity;this.lineThickness=u(b.lineThickness)?g.lineThickness:this.lineThickness;this.color=b.color?this.color:g.color;this.lineColor=b.lineColor?this.lineColor:g.lineColor;this.lineDashType=b.lineDashType?this.lineDashType:g.lineDashType;!u(this.startValue)&&this.startValue.getTime&&(this.startValue=this.startValue.getTime());!u(this.endValue)&&this.endValue.getTime&&(this.endValue= +this.endValue.getTime());"number"===typeof this.startValue&&("number"===typeof this.endValue&&this.endValue=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers);O(this._zoomButton,"mouseout",function(){d||(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(0%)", +filter:"invert(0%)"}))},this.allDOMEventHandlers)}this._resetButton||(d=!1,va(this._resetButton=document.createElement("button")),ua(this,this._resetButton,"reset"),this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor,this._toolBar.appendChild(this._resetButton),O(this._resetButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._resetButton,"click",function(){a.toolTip.hide();a.zoomEnabled||a.panEnabled?(a.zoomEnabled= +!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"),a._defaultCursor="default",a.overlaidCanvas.style.cursor=a._defaultCursor):(a.zoomEnabled=!1,a.panEnabled=!1);if(a.sessionVariables.axisX)for(var c=0;c=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers),O(this._resetButton,"mouseout",function(){d||(sa(a,a._resetButton, +{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers),this.overlaidCanvas.style.cursor=a._defaultCursor);this.zoomEnabled||this.panEnabled||(this._zoomButton?(a._zoomButton.getAttribute("state")===a._cultureInfo.zoomText?(this.panEnabled=!0,this.zoomEnabled=!1):(this.zoomEnabled=!0,this.panEnabled= +!1),Qa(a._zoomButton,a._resetButton)):(this.zoomEnabled=!0,this.panEnabled=!1))}else this.panEnabled=this.zoomEnabled=!1;this._menuButton?this.exportEnabled?Qa(this._menuButton):va(this._menuButton):this.exportEnabled&&r&&(d=!1,this._menuButton=document.createElement("button"),ua(this,this._menuButton,"menu"),this._toolBar.appendChild(this._menuButton),O(this._menuButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._menuButton,"click",function(){"none"!==a._dropdownMenu.style.display|| +a._dropDownCloseTime&&500>=(new Date).getTime()-a._dropDownCloseTime.getTime()||(a._dropdownMenu.style.display="block",a._menuButton.blur(),a._dropdownMenu.focus())},this.allDOMEventHandlers,!0),O(this._menuButton,"mouseover",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.fontColorOnHover}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers,!0), +O(this._menuButton,"mouseout",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers,!0));if(!this._dropdownMenu&&this.exportEnabled&&r){d=!1;this._dropdownMenu=document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);var b=-1!==this.theme.indexOf("dark")?"black":"#888888";this._dropdownMenu.style.cssText= +"position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 0px;top: 25px;min-width: 120px;outline: 0;font-size: 14px; font-family: Arial, Helvetica, sans-serif;padding: 5px 0px 5px 0px;text-align: left;line-height: 10px;background-color:"+this.toolbar.backgroundColor+";box-shadow: 2px 2px 10px "+b;a._dropdownMenu.style.display="none";this._toolBar.appendChild(this._dropdownMenu);O(this._dropdownMenu,"blur",function(){va(a._dropdownMenu); +a._dropDownCloseTime=new Date},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.printText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers, +!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){a.print();va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.saveJPGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d= +!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"jpeg",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText= +"padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.savePNGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor, +this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"png",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0)}"none"!==this._toolBar.style.display&&this._zoomButton&&(this.panEnabled?ua(a,a._zoomButton,"zoom"):ua(a,a._zoomButton,"pan"),a._resetButton.getAttribute("state")!==a._cultureInfo.resetText&&ua(a,a._resetButton,"reset"));this.options.toolTip&&this.toolTip.options!==this.options.toolTip&&(this.toolTip.options=this.options.toolTip); +for(var c in this.toolTip.options)this.toolTip.options.hasOwnProperty(c)&&this.toolTip.updateOption(c)};p.prototype._updateSize=function(){var a;a=[this.canvas,this._preRenderCanvas,this.overlaidCanvas,this._eventManager.ghostCanvas];var d=0,b=0;this.options.width?d=this.width:this.width=d=0c.linkedDataSeriesIndex||c.linkedDataSeriesIndex>=this.options.data.length||"number"!==typeof c.linkedDataSeriesIndex|| +"error"===this.options.data[c.linkedDataSeriesIndex].type)&&(c.linkedDataSeriesIndex=null);null===c.name&&(c.name="DataSeries "+a);null===c.color?1a&&"undefined"!==typeof w.startTimePercent?a>=w.startTimePercent&&w.animationCallback(w.easingFunction(a-w.startTimePercent,0,1,1-w.startTimePercent),w):w.animationCallback(w.easingFunction(a,0,1,1),w);s.dispatchEvent("dataAnimationIterationEnd",{chart:s})},function(){b=[];for(var a=0;aa.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c);ed.max&&"number"===typeof e&&(d.max=e);if(0B&&(B=1/B);b.minDiff>B&&1!==B&&(b.minDiff=B)}else B=c-l.dataPoints[w-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B);null!==e&&null!==l.dataPoints[w-1].y&&(a.axisY.logarithmic?(B=e/l.dataPoints[w-1].y,1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e-l.dataPoints[w-1].y,0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B)))}if(cf&& +!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&qd.viewPortMax&&"number"===typeof e&&(d.viewPortMax=e))}}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype._processStackedPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d= +a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=[],l=[],w=Infinity,h=-Infinity,s=0;sb.max&&(b.max=c);if(0r&&(r=1/r);b.minDiff>r&&1!==r&&(b.minDiff=r)}else r=c-q.dataPoints[n-1].x,0>r&&(r*=-1),b.minDiff>r&&0!==r&&(b.minDiff=r);null!==e&&null!==q.dataPoints[n-1].y&&(a.axisY.logarithmic?0r&&(r=1/r),d.minDiff>r&&1!==r&&(d.minDiff=r)):(r=e-q.dataPoints[n-1].y,0>r&&(r*=-1),d.minDiff>r&&0!==r&&(d.minDiff=r)))}if(ct&&!B)B=!0;else if(c>t&&B)continue;q.dataPoints[n].label&&(a.axisX.labels[c]=q.dataPoints[n].label);cb.viewPortMax&&(b.viewPortMax=c);null===q.dataPoints[n].y?b.viewPortMin===c&&kd.max&&(d.max=a),nb.viewPortMax||(ad.viewPortMax&& +(d.viewPortMax=a)));for(n in l)l.hasOwnProperty(n)&&!isNaN(n)&&(a=l[n],ad.max&&(d.max=Math.max(a,h)),nb.viewPortMax||(ad.viewPortMax&&(d.viewPortMax=Math.max(a,h))))}};p.prototype._processStacked100PlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=!1,l=!1,w=[],h=0;hb.max&&(b.max=c);if(0t&&(t=1/t);b.minDiff>t&&1!==t&&(b.minDiff=t)}else t=c-s.dataPoints[q-1].x,0>t&&(t*=-1),b.minDiff>t&&0!==t&&(b.minDiff=t);u(e)||null===s.dataPoints[q-1].y||(a.axisY.logarithmic?0t&&(t=1/t),d.minDiff>t&&1!==t&&(d.minDiff=t)):(t=e-s.dataPoints[q-1].y,0>t&&(t*=-1),d.minDiff>t&&0!==t&&(d.minDiff=t)))}if(cr&&!f)f=!0;else if(c>r&&f)continue;s.dataPoints[q].label&&(a.axisX.labels[c]=s.dataPoints[q].label); +cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&Be&&(l=!0),w[c]=w[c]?w[c]+Math.abs(e):Math.abs(e))}}s.axisX.valueType=s.xValueType=g?"dateTime":"number"}a.axisY.logarithmic?(d.max=u(d.viewPortMax)?99*Math.pow(a.axisY.logarithmBase,-0.05):Math.max(d.viewPortMax,99*Math.pow(a.axisY.logarithmBase,-0.05)),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&!l?(d.max=u(d.viewPortMax)? +99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&l?(d.max=u(d.viewPortMax)?99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99)):!m&&l&&(d.max=u(d.viewPortMax)?-1:Math.max(d.viewPortMax,-1),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99));d.viewPortMin=d.min;d.viewPortMax=d.max;a.dataPointYSums=w}};p.prototype._processMultiYPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo, +b=a.axisX.dataInfo,c,e,g,m,l=!1,w=0;wb.max&&(b.max=c);gd.max&&(d.max=m);0B&&(B=1/B),b.minDiff>B&&1!==B&&(b.minDiff=B)):(B=c-h.dataPoints[s-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B)),e&&(null!==e[0]&&h.dataPoints[s-1].y&&null!==h.dataPoints[s-1].y[0])&&(a.axisY.logarithmic?(B=e[0]/ +h.dataPoints[s-1].y[0],1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e[0]-h.dataPoints[s-1].y[0],0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B))));if(!(ct&&!n)n=!0;else if(c>t&&n)continue;h.dataPoints[s].label&&(a.axisX.labels[c]=h.dataPoints[s].label);cb.viewPortMax&&(b.viewPortMax=c);if(b.viewPortMin===c&&e)for(p=0;pd.viewPortMax&&(d.viewPortMax=m))}}h.axisX.valueType=h.xValueType=l?"dateTime":"number"}};p.prototype._processSpecificPlotUnit=function(a){if("waterfall"===a.type&&a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c),l.dataPointEOs[w].cumulativeSumd.max&&(d.max=l.dataPointEOs[w].cumulativeSum),0q&&(q=1/q),b.minDiff>q&&1!==q&&(b.minDiff=q)):(q=c-l.dataPoints[w-1].x,0>q&&(q*=-1),b.minDiff>q&&0!==q&&(b.minDiff=q)),null!==e&&null!==l.dataPoints[w- +1].y&&(a.axisY.logarithmic?(e=l.dataPointEOs[w].cumulativeSum/l.dataPointEOs[w-1].cumulativeSum,1>e&&(e=1/e),d.minDiff>e&&1!==e&&(d.minDiff=e)):(e=l.dataPointEOs[w].cumulativeSum-l.dataPointEOs[w-1].cumulativeSum,0>e&&(e*=-1),d.minDiff>e&&0!==e&&(d.minDiff=e)))),!(cf&&!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);0d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w-1].cumulativeSum));l.dataPointEOs[w].cumulativeSumd.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w].cumulativeSum)}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype.calculateAutoBreaks=function(){function a(a,c,b,e){if(e)return b= +Math.pow(Math.min(b*a/c,c/a),0.2),1>=b&&(b=Math.pow(1>a?1/a:Math.min(c/a,a),0.25)),{startValue:a*b,endValue:c/b};b=0.2*Math.min(b-c+a,c-a);0>=b&&(b=0.25*Math.min(c-a,Math.abs(a)));return{startValue:a+b,endValue:c-b}}function d(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){var c=a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<=a.axisX.scaleBreaks.maxNumberOfAutoBreaks,b=a.axisY.scaleBreaks&&a.axisY.scaleBreaks.autoCalculate&&1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks;if(c|| +b)for(var d=a.axisY.dataInfo,f=a.axisX.dataInfo,g,h=f.min,l=f.max,m=d.min,n=d.max,f=f._dataRanges,d=d._dataRanges,q,w=0,s=0;sk.dataPoints.length))for(w=0;wf[q].max&&(f[q].max=g)),b){var r= +(n+1-m)*Math.max(parseFloat(a.axisY.scaleBreaks.collapsibleThreshold)||10,10)/100;if((g="waterfall"===a.type?k.dataPointEOs[w].cumulativeSum:k.dataPoints[w].y)&&g.length)for(var p=0;pd[q].max&&(d[q].max=g[p]);else u(g)||(q=Math.floor((g-m)/r),gd[q].max&&(d[q].max=g))}}}}function b(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)&&a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<= +a.axisX.scaleBreaks.maxNumberOfAutoBreaks)for(var c=a.axisX.dataInfo,b=c.min,d=c.max,f=c._dataRanges,g,h=0,l=0;lm.dataPoints.length))for(h=0;hf[g].max&&(f[g].max=c)}}for(var c,e=this,g=!1,m=0;m< +this._axes.length;m++)if(this._axes[m].scaleBreaks&&this._axes[m].scaleBreaks.autoCalculate&&1<=this._axes[m].scaleBreaks.maxNumberOfAutoBreaks){g=!0;this._axes[m].dataInfo._dataRanges=[];for(var l=0;l<100/Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10);l++)this._axes[m].dataInfo._dataRanges.push({min:Infinity,max:-Infinity})}if(g){for(m=0;ms[f].max&&(s[f].max=q)}delete this._axes[m].dataInfo.dataPointYPositiveSums}if(this._axes[m].dataInfo.dataPointYNegativeSums){n= +this._axes[m].dataInfo.dataPointYNegativeSums;s=h;for(l in n)n.hasOwnProperty(l)&&!isNaN(l)&&(q=-1*n[l],u(q)||(f=Math.floor((q-w)/c),qs[f].max&&(s[f].max=q)));delete this._axes[m].dataInfo.dataPointYNegativeSums}for(l=0;lc&&g.push({diff:q,start:s,end:w});break}else l++;if(this._axes[m].scaleBreaks.customBreaks)for(l=0;l=e.x1&&(a<=e.x2&&d>=e.y1&&d<=e.y2)&&(c=e.id)}return c};p.prototype.getAutoFontSize=lb;p.prototype.resetOverlayedCanvas=function(){this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height)};p.prototype.clearCanvas=kb;p.prototype.attachEvent=function(a){this._events.push(a)};p.prototype._touchEventHandler=function(a){if(a.changedTouches&&this.interactivityEnabled){var d=[],b=a.changedTouches,c=b?b[0]:a,e=null;switch(a.type){case "touchstart":case "MSPointerDown":d=["mousemove","mousedown"];this._lastTouchData= +Ra(c);this._lastTouchData.time=new Date;break;case "touchmove":case "MSPointerMove":d=["mousemove"];break;case "touchend":case "MSPointerUp":var g=this._lastTouchData&&this._lastTouchData.time?new Date-this._lastTouchData.time:0,d="touchstart"===this._lastTouchEventType||"MSPointerDown"===this._lastTouchEventType||300>g?["mouseup","click"]:["mouseup"];break;default:return}if(!(b&&1g)this._lastTouchData.scroll=!0}catch(l){}this._lastTouchEventType=a.type;if(this._lastTouchData.scroll&&this.zoomEnabled)this.isDrag&&this.resetOverlayedCanvas(),this.isDrag=!1;else for(b=0;b=e.x1&&d.x<=e.x2&&d.y>=e.y1&&d.y<=e.y2){c[b].call(c.context,d.x,d.y);"mousedown"===b&&!0===c.capture?(p.capturedEventParam=c,this.overlaidCanvas.setCapture?this.overlaidCanvas.setCapture():document.documentElement.addEventListener("mouseup", +this._mouseEventHandler,!1)):"mouseup"===b&&(c.chart.overlaidCanvas.releaseCapture?c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",this._mouseEventHandler,!1));break}else c=null;a.target.style.cursor=c&&c.cursor?c.cursor:this._defaultCursor}b=this.plotArea;if(d.xb.x2||d.yb.y2)this.toolTip&&this.toolTip.enabled?this.toolTip.hide():this.resetOverlayedCanvas();this.isDrag&&this.zoomEnabled||!this._eventManager||this._eventManager.mouseEventHandler(a)}}; +p.prototype._plotAreaMouseDown=function(a,d){this.isDrag=!0;this.dragStartPoint={x:a,y:d}};p.prototype._plotAreaMouseUp=function(a,d){if(("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)&&this.isDrag){var b=d-this.dragStartPoint.y,c=a-this.dragStartPoint.x,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=!1;this.resetOverlayedCanvas();if("xySwapped"===this.plotInfo.axisPlacement)var l=g,g=e,e=l;if(this.panEnabled||this.zoomEnabled){if(this.panEnabled)for(e= +g=0;eb.maximum&&(g=b.viewportMaximum/b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum/g,b.sessionVariables.newViewportMaximum=b.viewportMaximum/g,m=!0):b.viewportMinimumb.maximum&&(g=b.viewportMaximum-b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum-g,b.sessionVariables.newViewportMaximum=b.viewportMaximum-g,m=!0);else if((!e||2Math.abs(b)&&(this.panEnabled||this.zoomEnabled)?this.toolTip.hide():this.panEnabled||this.zoomEnabled||this.toolTip.mouseMoveHandler(a, +d);if((!e||2f)var B=f,f=n,n=B;if(q.scaleBreaks)for(B=0;!g&&B=f;if(isFinite(q.dataInfo.minDiff))if(B=q.getApparentDifference(n,f,null,!0),!(g||!(this.panEnabled&&q.scaleBreaks&&q.scaleBreaks._appliedBreaks.length)&&(q.logarithmic&&Bq.maximum))w.push(q),s.push({val1:n,val2:f}),l=!0;else if(!e){l=!1;break}}return{isValid:l,axesWithValidRange:w,axesRanges:s}};p.prototype.preparePlotArea=function(){var a=this.plotArea;!r&&(0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2;a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2;a.width=a.x2-a.x1;a.height=a.y2-a.y1}this.axisY2&&0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2,a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2,a.width=a.x2-a.x1,a.height=a.y2-a.y1)}else d= +this.layoutManager.getFreeSpace(),a.x1=d.x1,a.x2=d.x2,a.y1=d.y1,a.y2=d.y2,a.width=d.width,a.height=d.height;r||(a.canvas.width=a.width,a.canvas.height=a.height,a.canvas.style.left=a.x1+"px",a.canvas.style.top=a.y1+"px",(0b.x2||h.point.yb.y2+1)continue}else if("rangearea"===s||"rangesplinearea"===s){if(h.dataPoint.xy.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("bubble")||0<=s.indexOf("scatter")){if(h.dataPoint.xy.viewportMaximum|| +h.dataPoint.yA.viewportMaximum)continue}else if(0<=s.indexOf("column")||"waterfall"===s||"error"===s&&!h.axisSwapped){if(h.dataPoint.xy.viewportMaximum||h.bounds.y1>b.y2||h.bounds.y2y.viewportMaximum||h.bounds.x1>b.x2||h.bounds.x2 +y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(h.dataPoint.xy.viewportMaximum)continue;e=m=2;"horizontal"===C?(l=f.width,w=f.height):(w=f.width,l=f.height);if("normal"===this.plotInfo.axisPlacement){if(0<=s.indexOf("line")||0<=s.indexOf("area"))t="auto",m=4;else if(0<=s.indexOf("stacked"))"auto"===t&&(t="inside");else if("bubble"===s||"scatter"===s)t="inside";q=h.point.x- +l/2;"inside"!==t?(e=b.y1,g=b.y2,0h.point.y)):(n=h.point.y+m+c,n>g-w-m-c&&(n="auto"===t?Math.min(h.point.y,g)-w-m-c:g-w-m-c,v=ng-w-m&&("bubble"===s||"scatter"===s)&&(n=Math.min(h.point.y+m,b.y2-w-m))),n=Math.min(n,g-w))}else 0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("scatter")?(t="auto",e=4):0<=s.indexOf("stacked")?"auto"===t&&(t="inside"):"bubble"===s&&(t="inside"),n=h.point.y-w/2,"inside"!==t?(m=b.x1,g=b.x2,0>ma?(q=h.point.x-l-e-c,qh.point.x)):(q=h.point.x+e+c,q>g-l-e-c&&(q="auto"=== +t?Math.min(h.point.x,g)-l-e-c:g-l-e-c,v=qma?Math.max(h.bounds.x1,b.x1)+l/2+e:Math.min(h.bounds.x2,b.x2)-l/2-e:(Math.max(h.bounds.x1,b.x1)+Math.min(h.bounds.x2,b.x2))/2,q=0>ma?Math.max(h.point.x,c)-l/2:Math.min(h.point.x,c)-l/2,q=Math.max(q,m));"vertical"===C&&(n+=w);f.x=q;f.y=n;f.render(!0);p&&("inside"!==t&&(0>s.indexOf("bar")&&("error"!==s||!h.axisSwapped)&&h.point.x>b.x1&&h.point.xs.indexOf("column")&&("error"!==s||h.axisSwapped)&&h.point.y>b.y1&&h.point.y=a.dataSeriesIndexes.length)){var c= +this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepLine=function(a){var d=a.targetCanvasCtx|| +this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&& +(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation, +easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderSpline=function(a){function d(a){a=v(a,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx;c.save();var g=this.plotArea;c.beginPath(); +c.rect(g.x1,g.y1,g.width,g.height);c.clip();for(var m=[],l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[p].y)0s[p].y===a.axisY.reversed?1:-1,color:B});u=!1}d(x)}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(g.x1,g.y1,g.width,g.height),e.beginPath());c.restore();c.beginPath();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width, +0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.dataPointWidth=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){m=a.axisX.convertValueToPixel(w);l=a.axisY.convertValueToPixel(B[g].y);m=a.axisX.reversed?m+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:m-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var k=a.axisX.reversed?m-q<<0:m+q<<0,t;0<=B[g].y?t=h:(t=l,l=h);l>t&&(c=l,l=t,t=c);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,l,k,t,c,0,null,p&&0<=B[g].y, +0>B[g].y&&p,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:m,y1:l,x2:k,y2:t};c=N(c);r&&ea(this._eventManager.ghostCtx,m,l,k,t,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"column",dataPoint:B[g],dataSeries:f,point:{x:m+(k-m)/2,y:0>B[g].y===a.axisY.reversed?l:t},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:m, +y1:Math.min(l,t),x2:k,y2:Math.max(l,t)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore(); +return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.y2?a.axisY.bounds.y2:h}}};p.prototype.renderStackedColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth? +this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q="undefined"!==typeof m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;g[c]=A+(y-q)}else A=m[c]?m[c]:0,y=q+A,q=n+A,m[c]=A+(y-q);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1, +!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedColumn",dataPoint:t[h],dataSeries:p,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q, +y)},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx, +animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderStackedColumn100=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth: +this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);q=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;q=a.axisY.convertValueToPixel(l[c]);y=g[c]?g[c]:n;g[c]=q}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=q+("undefined"!==typeof w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q=m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(q),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y1-q)&&(q=e.y1);g[c]=A+(y-q)}else A="undefined"!==typeof m[c]? +m[c]:0,y=q+A,q=n+A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y2-y)&&(y=e.y2),m[c]=A+(y-q);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&& +this._indexLabels.push({chartType:"stackedColumn100",dataPoint:t[h],dataSeries:k,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q,y)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&& +this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= +null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.options.dataPointWidth? +this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height); +b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){l=a.axisX.convertValueToPixel(w); +m=a.axisY.convertValueToPixel(B[g].y);l=a.axisX.reversed?l+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:l-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var p=a.axisX.reversed?l-q<<0:l+q<<0,t;0<=B[g].y?t=h:(t=m,m=h);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,t,l,m,p,c,0,null,k,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:t,y1:l,x2:m,y2:p};c= +N(c);r&&ea(this._eventManager.ghostCtx,t,l,m,p,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"bar",dataPoint:B[g],dataSeries:f,point:{x:0<=B[g].y?m:t,y:l+(p-l)/2},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(t,m),y1:l,x2:Math.max(t,m),y2:p},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas, +0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.x2?a.axisY.bounds.x2: +h}}};p.prototype.renderStackedBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<< +0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),s=m[c]? +m[c]:n,m[c]=y=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A=g[c]?g[c]:0;y=n+A;s+=A;g[c]=A+(s-y)}else A=m[c]?m[c]:0,y=s-A,s=n-A,m[c]=A+(s-y);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,y,x,s,v,c,0,null,u,!1,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:y,y1:x,x2:s,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,y,x,s,v,c,0,null,!1,!1,!1, +!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar",dataPoint:t[h],dataSeries:k,point:{x:0<=t[h].y?s:y,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(y,s),y1:x,x2:Math.max(y,s),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderStackedBar100=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)|| +(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save(); +b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&& +"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x;x=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var v=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,y=v+f<<0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;x=g[c]?g[c]:n;g[c]=s=a.axisY.convertValueToPixel(l[c])}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=x+(w[c]?w[c]:0),s=m[c]?m[c]: +n,m[c]=x=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(x),0<=t[h].y){var A=g[c]?g[c]:0;x=n+A;s+=A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x2-s)&&(s=e.x2);g[c]=A+(s-x)}else A=m[c]?m[c]:0,x=s-A,s=n-A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x1-x)&&(x=e.x1),m[c]=A+(s-x);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,v,s,y,c,0,null,u,!1,!1,!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k, +dataPointIndex:h,x1:x,y1:v,x2:s,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,v,s,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar100",dataPoint:t[h],dataSeries:p,point:{x:0<=t[h].y?s:x,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(x,s),y1:v,x2:Math.max(x,s),y2:y},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop", +a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!da)))if("number"!==typeof p[k].y)B.connectNullData||(da||d)||c(),da=!0;else{t=a.axisX.convertValueToPixel(x);u=a.axisY.convertValueToPixel(p[k].y);d||da?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||b===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d=t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,b=B.nullDataLineDashType,g.setLineDash(Y)),g.lineTo(t,u),r&&m.lineTo(t, +u)):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),da=d=!1):(g.lineTo(t,u),r&&m.lineTo(t,u),0==k%250&&c());q={x:t,y:u};kp[k].y===a.axisY.reversed?1:-1,color:z})}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderSplineArea=function(a){function d(){var b=v(x,2);if(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum? +t=p:0>a.axisY.viewportMaximum?t=m.y1:0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=a.axisX.lineCoordinates,m=a.axisY.lineCoordinates,l=[],w=this.plotArea;c.save();r&& +e.save();c.beginPath();c.rect(w.x1,w.y1,w.width,w.height);c.clip();r&&(e.beginPath(),e.rect(w.x1,w.y1,w.width,w.height),e.clip());for(var h=0;ha.axisX.dataInfo.viewPortMax&&(!q.connectNullData||!k)))if("number"!==typeof n[f].y)0n[f].y===a.axisY.reversed?1:-1,color:ma});k=!1}d();ia.drawMarkers(l)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(w.x1,w.y1,w.width,w.height), +this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!b))){var Z=u;"number"!==typeof k[p].y?(B.connectNullData||(b||d)||c(),b=!0):(t=a.axisX.convertValueToPixel(x),u=a.axisY.convertValueToPixel(k[p].y),d||b?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||Y===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d= +t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,Y=B.nullDataLineDashType,g.setLineDash(ca)),g.lineTo(t,Z),g.lineTo(t,u),r&&(m.lineTo(t,Z),m.lineTo(t,u))):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),b=d=!1):(g.lineTo(t,Z),r&&m.lineTo(t,Z),g.lineTo(t,u),r&&m.lineTo(t,u),0==p%250&&c()),q={x:t,y:u},pk[p].y===a.axisY.reversed?1:-1,color:z}))}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea=function(a){function d(){if(!(1>h.length)){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=[],l=this.plotArea,w=[],h=[],s=[],q=[],n=0,f,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),u=this._eventManager.ghostCtx,t,C,x;r&&u.beginPath();c.save();r&&u.save();c.beginPath();c.rect(l.x1,l.y1,l.width,l.height);c.clip();r&&(u.beginPath(),u.rect(l.x1,l.y1,l.width,l.height),u.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData||!da)))if("number"!==typeof Z.y)A.connectNullData||(da||C)||d(),da=!0;else{f=a.axisX.convertValueToPixel(g);var oa= +w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(Z.y),k-=oa;h.push({x:f,y:p-oa});w[g]=p-k;C||da?(!C&&A.connectNullData?(c.setLineDash&&(A.options.nullDataLineDashType||x===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(C=h.pop(),x=h[h.length-1],d(),c.moveTo(t.x,t.y),h.push(x),h.push(C),x=A.nullDataLineDashType, +c.setLineDash(Y)),c.lineTo(f,k),r&&u.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(u.beginPath(),u.moveTo(f,k))),da=C=!1):(c.lineTo(f,k),r&&u.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&u.moveTo(f,k),h.push({x:f,y:p-oa})));t={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&u.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(l.x1,l.y1,l.width,l.height),u.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea100=function(a){function d(){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=[],w=[],h=[],s=[],q=[],n=0,f,k,p,u,t,C=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),x=this._eventManager.ghostCtx;c.save();r&&x.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(x.beginPath(), +x.rect(m.x1,m.y1,m.width,m.height),x.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData|| +!da)))if("number"!==typeof Z.y)A.connectNullData||(da||u)||d(),da=!0;else{var oa;oa=0!==a.dataPointYSums[g]?100*(Z.y/a.dataPointYSums[g]):0;f=a.axisX.convertValueToPixel(g);var la=w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(oa),k-=la;h.push({x:f,y:C-la});w[g]=C-k;u||da?(!u&&A.connectNullData?(c.setLineDash&& +(A.options.nullDataLineDashType||t===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(u=h.pop(),t=h[h.length-1],d(),c.moveTo(p.x,p.y),h.push(t),h.push(u),t=A.nullDataLineDashType,c.setLineDash(Y)),c.lineTo(f,k),r&&x.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(x.beginPath(),x.moveTo(f,k))),da=u=!1):(c.lineTo(f,k),r&&x.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&x.moveTo(f,k),h.push({x:f,y:C-la})));p={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&x.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(l);r&&(b.drawImage(this._preRenderCanvas,0, +0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),x.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}}; +p.prototype.renderBubble=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=-Infinity,w=Infinity,h=0;ha.axisX.dataInfo.viewPortMax||"undefined"===typeof n[e].z||(f=n[e].z,f>l&&(l=f),fa.axisX.dataInfo.viewPortMax)&&"number"===typeof n[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(n[e].y);var f=n[e].z,u=2*Math.max(Math.sqrt((l===w?p/2:k+(p-k)/(l-w)*(f-w))/Math.PI)<<0,1),f=q.getMarkerProperties(e,b);f.size=u;b.globalAlpha=q.fillOpacity;ia.drawMarker(g,m,b,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;var t=q.dataPointIds[e];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:s, +dataPointIndex:e,x1:g,y1:m,size:u};u=N(t);r&&ia.drawMarker(g,m,this._eventManager.ghostCtx,f.type,f.size,u,u,f.borderThickness);(n[e].indexLabel||q.indexLabel||n[e].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"bubble",dataPoint:n[e],dataSeries:q,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/2,x2:g+f.size/2,y2:m+f.size/2},color:null})}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderScatter=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=0;la.axisX.dataInfo.viewPortMax)&&"number"===typeof s[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(s[e].y);var f=h.getMarkerProperties(e,g,m,b);b.globalAlpha=h.fillOpacity;ia.drawMarker(f.x,f.y,f.ctx,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;Math.sqrt((q-g)*(q-g)+(n-m)*(n-m))Math.min(this.plotArea.width,this.plotArea.height)||(q=h.dataPointIds[e],this._eventManager.objectMap[q]={id:q,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:e,x1:g,y1:m},q=N(q),r&&ia.drawMarker(f.x,f.y,this._eventManager.ghostCtx,f.type,f.size,q,q,f.borderThickness),(s[e].indexLabel||h.indexLabel||s[e].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"scatter",dataPoint:s[e],dataSeries:h,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/ +2,x2:g+f.size/2,y2:m+f.size/2},color:null}),q=g,n=m)}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore()); +b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderCandlestick=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=0,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,g=this.options.dataPointMaxWidth? +this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*m.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&&e>g&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,g));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&gg&&(k=g);b.save();r&&c.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(c.beginPath(),c.rect(m.x1,m.y1,m.width,m.height),c.clip());for(var p=0;pa.axisX.dataInfo.viewPortMax)&&!u(C[l].y)&&C[l].y.length&& +"number"===typeof C[l].y[0]&&"number"===typeof C[l].y[1]&&"number"===typeof C[l].y[2]&&"number"===typeof C[l].y[3]){w=a.axisX.convertValueToPixel(f);h=a.axisY.convertValueToPixel(C[l].y[0]);s=a.axisY.convertValueToPixel(C[l].y[1]);q=a.axisY.convertValueToPixel(C[l].y[2]);n=a.axisY.convertValueToPixel(C[l].y[3]);var z=w-k/2<<0,y=z+k<<0,g=t.options.fallingColor?t.fallingColor:t._colorSet[0],e=C[l].color?C[l].color:t._colorSet[0],A=Math.round(Math.max(1,0.15*k)),D=0===A%2?0:0.5,aa=t.dataPointIds[l]; +this._eventManager.objectMap[aa]={id:aa,objectType:"dataPoint",dataSeriesIndex:v,dataPointIndex:l,x1:z,y1:h,x2:y,y2:s,x3:w,y3:q,x4:w,y4:n,borderThickness:A,color:e};b.strokeStyle=e;b.beginPath();b.lineWidth=A;c.lineWidth=Math.max(A,4);"candlestick"===t.type?(b.moveTo(w-D,s),b.lineTo(w-D,Math.min(h,n)),b.stroke(),b.moveTo(w-D,Math.max(h,n)),b.lineTo(w-D,q),b.stroke(),ea(b,z,Math.min(h,n),y,Math.max(h,n),C[l].y[0]<=C[l].y[3]?t.risingColor:g,A,e,x,x,!1,!1,t.fillOpacity),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w- +D,s),c.lineTo(w-D,Math.min(h,n)),c.stroke(),c.moveTo(w-D,Math.max(h,n)),c.lineTo(w-D,q),c.stroke(),ea(c,z,Math.min(h,n),y,Math.max(h,n),e,0,null,!1,!1,!1,!1))):"ohlc"===t.type&&(b.moveTo(w-D,s),b.lineTo(w-D,q),b.stroke(),b.beginPath(),b.moveTo(w,h),b.lineTo(z,h),b.stroke(),b.beginPath(),b.moveTo(w,n),b.lineTo(y,n),b.stroke(),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w-D,s),c.lineTo(w-D,q),c.stroke(),c.beginPath(),c.moveTo(w,h),c.lineTo(z,h),c.stroke(),c.beginPath(),c.moveTo(w,n),c.lineTo(y,n),c.stroke())); +(C[l].indexLabel||t.indexLabel||C[l].indexLabelFormatter||t.indexLabelFormatter)&&this._indexLabels.push({chartType:t.type,dataPoint:C[l],dataSeries:t,point:{x:z+(y-z)/2,y:a.axisY.reversed?q:s},direction:1,bounds:{x1:z,y1:Math.min(s,q),x2:y,y2:Math.max(s,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas, +0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderBoxAndWhisker=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e= +null,g=this.plotArea,m=0,l,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*g.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&& +e>m&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(k=m);b.save();r&&c.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(c.beginPath(),c.rect(g.x1,g.y1,g.width,g.height),c.clip());for(var p=!1,p=!!a.axisY.reversed,v=0;va.axisX.dataInfo.viewPortMax)&&!u(x[m].y)&&x[m].y.length&&"number"===typeof x[m].y[0]&&"number"===typeof x[m].y[1]&&"number"===typeof x[m].y[2]&&"number"===typeof x[m].y[3]&&"number"===typeof x[m].y[4]&&5===x[m].y.length){l=a.axisX.convertValueToPixel(f);w=a.axisY.convertValueToPixel(x[m].y[0]);h=a.axisY.convertValueToPixel(x[m].y[1]);s=a.axisY.convertValueToPixel(x[m].y[2]); +q=a.axisY.convertValueToPixel(x[m].y[3]);n=a.axisY.convertValueToPixel(x[m].y[4]);var y=l-k/2<<0,A=l+k/2<<0,e=x[m].color?x[m].color:C._colorSet[0],D=Math.round(Math.max(1,0.15*k)),aa=0===D%2?0:0.5,T=x[m].whiskerColor?x[m].whiskerColor:x[m].color?C.whiskerColor?C.whiskerColor:x[m].color:C.whiskerColor?C.whiskerColor:e,Y="number"===typeof x[m].whiskerThickness?x[m].whiskerThickness:"number"===typeof C.options.whiskerThickness?C.whiskerThickness:D,ca=x[m].whiskerDashType?x[m].whiskerDashType:C.whiskerDashType, +da=u(x[m].whiskerLength)?u(C.options.whiskerLength)?k:C.whiskerLength:x[m].whiskerLength,da="number"===typeof da?0>=da?0:da>=k?k:da:"string"===typeof da?parseInt(da)*k/100>k?k:parseInt(da)*k/100:k,Z=1===Math.round(Y)%2?0.5:0,oa=x[m].stemColor?x[m].stemColor:x[m].color?C.stemColor?C.stemColor:x[m].color:C.stemColor?C.stemColor:e,la="number"===typeof x[m].stemThickness?x[m].stemThickness:"number"===typeof C.options.stemThickness?C.stemThickness:D,G=1===Math.round(la)%2?0.5:0,F=x[m].stemDashType?x[m].stemDashType: +C.stemDashType,E=x[m].lineColor?x[m].lineColor:x[m].color?C.lineColor?C.lineColor:x[m].color:C.lineColor?C.lineColor:e,H="number"===typeof x[m].lineThickness?x[m].lineThickness:"number"===typeof C.options.lineThickness?C.lineThickness:D,I=x[m].lineDashType?x[m].lineDashType:C.lineDashType,K=1===Math.round(H)%2?0.5:0,L=C.upperBoxColor,O=C.lowerBoxColor,Q=u(C.options.fillOpacity)?1:C.fillOpacity,P=C.dataPointIds[m];this._eventManager.objectMap[P]={id:P,objectType:"dataPoint",dataSeriesIndex:t,dataPointIndex:m, +x1:y,y1:w,x2:A,y2:h,x3:l,y3:s,x4:l,y4:q,y5:n,borderThickness:D,color:e,stemThickness:la,stemColor:oa,whiskerThickness:Y,whiskerLength:da,whiskerColor:T,lineThickness:H,lineColor:E};b.save();0=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth: +1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.03*this.width;var h=a.axisX.dataInfo.minDiff;isFinite(h)||(h=0.3*Math.abs(a.axisX.range));h=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(h)/Math.log(a.axisX.range):Math.abs(h)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&& +(this.dataPointMinWidth&&mm&&(h=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var s=0;sa.axisX.dataInfo.viewPortMax)&&!u(f[g].y)&&f[g].y.length&&"number"===typeof f[g].y[0]&&"number"===typeof f[g].y[1]){c=a.axisX.convertValueToPixel(w);m=a.axisY.convertValueToPixel(f[g].y[0]);l=a.axisY.convertValueToPixel(f[g].y[1]);var p=a.axisX.reversed?c+a.plotType.totalDataSeries*h/2-(a.previousDataSeriesCount+s)*h<<0:c-a.plotType.totalDataSeries*h/2+(a.previousDataSeriesCount+ +s)*h<<0,v=a.axisX.reversed?p-h<<0:p+h<<0,c=f[g].color?f[g].color:n._colorSet[g%n._colorSet.length];if(m>l){var t=m;m=l;l=t}t=n.dataPointIds[g];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:q,dataPointIndex:g,x1:p,y1:m,x2:v,y2:l};ea(b,p,m,v,l,c,0,c,k,k,!1,!1,n.fillOpacity);c=N(t);r&&ea(this._eventManager.ghostCtx,p,m,v,l,c,0,null,!1,!1,!1,!1);if(f[g].indexLabel||n.indexLabel||f[g].indexLabelFormatter||n.indexLabelFormatter)this._indexLabels.push({chartType:"rangeColumn", +dataPoint:f[g],dataSeries:n,indexKeyword:0,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?l:m},direction:f[g].y[1]>=f[g].y[0]?-1:1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c}),this._indexLabels.push({chartType:"rangeColumn",dataPoint:f[g],dataSeries:n,indexKeyword:1,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?m:l},direction:f[g].y[1]>=f[g].y[0]?1:-1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation= +"source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderError= +function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=a.axisY._position?"left"===a.axisY._position||"right"===a.axisY._position?!1:!0:!1;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=!1,m=this.plotArea,l=0,w,h,s,q,n,f,k,p=a.axisX.dataInfo.minDiff;isFinite(p)||(p=0.3*Math.abs(a.axisX.range));b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(m.x1, +m.y1,m.width,m.height),this._eventManager.ghostCtx.clip());for(var v=0,t=0;tl&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,l));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ll&&(t=l);if(0=T.length?0:T.length>=t?t:T.length:"string"===typeof T.length?parseInt(T.length)*t/100>t?t:parseInt(T.length)*t/100>t:t;T.thickness="number"===typeof T.thickness?0>T.thickness?0:Math.round(T.thickness):2;var Y={color:y[l].stemColor?y[l].stemColor:y[l].color?z.stemColor?z.stemColor:y[l].color:z.stemColor?z.stemColor:e,thickness:y[l].stemThickness?y[l].stemThickness:z.stemThickness,dashType:y[l].stemDashType? +y[l].stemDashType:z.stemDashType};Y.thickness="number"===typeof Y.thickness?0>Y.thickness?0:Math.round(Y.thickness):2;y[l].getTime?k=y[l].x.getTime():k=y[l].x;if(!(ka.axisX.dataInfo.viewPortMax)&&!u(y[l].y)&&y[l].y.length&&"number"===typeof y[l].y[0]&&"number"===typeof y[l].y[1]){var ca=a.axisX.convertValueToPixel(k);c?h=ca:w=ca;ca=a.axisY.convertValueToPixel(y[l].y[0]);c?s=ca:n=ca;ca=a.axisY.convertValueToPixel(y[l].y[1]);c?q=ca:f=ca;c?(n=a.axisX.reversed?h+(A?v: +1)*t/2-(A?D-1:0)*t<<0:h-(A?v:1)*t/2+(A?D-1:0)*t<<0,f=a.axisX.reversed?n-t<<0:n+t<<0):(s=a.axisX.reversed?w+(A?v:1)*t/2-(A?D-1:0)*t<<0:w-(A?v:1)*t/2+(A?D-1:0)*t<<0,q=a.axisX.reversed?s-t<<0:s+t<<0);!c&&n>f&&(ca=n,n=f,f=ca);c&&s>q&&(ca=s,s=q,q=ca);ca=z.dataPointIds[l];this._eventManager.objectMap[ca]={id:ca,objectType:"dataPoint",dataSeriesIndex:x,dataPointIndex:l,x1:Math.min(s,q),y1:Math.min(n,f),x2:Math.max(q,s),y2:Math.max(f,n),isXYSwapped:c,stemProperties:Y,whiskerProperties:T};E(b,Math.min(s,q), +Math.min(n,f),Math.max(q,s),Math.max(f,n),e,T,Y,c);r&&E(this._eventManager.ghostCtx,s,n,q,f,e,T,Y,c);if(y[l].indexLabel||z.indexLabel||y[l].indexLabelFormatter||z.indexLabelFormatter)this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:0,point:{x:c?y[l].y[1]>=y[l].y[0]?s:q:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?f:n},direction:y[l].y[1]>=y[l].y[0]?-1:1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c}), +this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:1,point:{x:c?y[l].y[1]>=y[l].y[0]?q:s:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?n:f},direction:y[l].y[1]>=y[l].y[0]?1:-1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height), +a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx: +d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0;var s=a.axisX.dataInfo.minDiff;isFinite(s)||(s=0.3*Math.abs(a.axisX.range));s=this.options.dataPointWidth?this.dataPointWidth:0.9* +(e.height*(a.axisX.logarithmic?Math.log(s)/Math.log(a.axisX.range):Math.abs(s)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(s=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(), +this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var q=0;qa.axisX.dataInfo.viewPortMax)&&!u(k[g].y)&&k[g].y.length&&"number"===typeof k[g].y[0]&&"number"===typeof k[g].y[1]){m=a.axisY.convertValueToPixel(k[g].y[0]); +l=a.axisY.convertValueToPixel(k[g].y[1]);w=a.axisX.convertValueToPixel(h);w=a.axisX.reversed?w+a.plotType.totalDataSeries*s/2-(a.previousDataSeriesCount+q)*s<<0:w-a.plotType.totalDataSeries*s/2+(a.previousDataSeriesCount+q)*s<<0;var v=a.axisX.reversed?w-s<<0:w+s<<0;m>l&&(c=m,m=l,l=c);c=k[g].color?k[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,w,l,v,c,0,null,p,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g, +x1:m,y1:w,x2:l,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,m,w,l,v,c,0,null,!1,!1,!1,!1);if(k[g].indexLabel||f.indexLabel||k[g].indexLabelFormatter||f.indexLabelFormatter)this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:0,point:{x:k[g].y[1]>=k[g].y[0]?m:l,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?-1:1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c}),this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:1,point:{x:k[g].y[1]>= +k[g].y[0]?l:m,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?1:-1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1, +e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeArea=function(a){function d(){if(C){var a=null;0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width,m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!s.connectNullData||!T)))if(null!==q[f].y&&q[f].y.length&&"number"===typeof q[f].y[0]&&"number"===typeof q[f].y[1]){k=a.axisX.convertValueToPixel(t);p=a.axisY.convertValueToPixel(q[f].y[0]);u=a.axisY.convertValueToPixel(q[f].y[1]);n||T?(s.connectNullData&&!n?(c.setLineDash&&(s.options.nullDataLineDashType||A===s.lineDashType&&s.lineDashType!==s.nullDataLineDashType)&&(w[w.length- +1].newLineDashArray=D,A=s.nullDataLineDashType,c.setLineDash(z)),c.lineTo(k,p),r&&e.lineTo(k,p),w.push({x:k,y:u})):(c.beginPath(),c.moveTo(k,p),C={x:k,y:p},w=[],w.push({x:k,y:u}),r&&(e.beginPath(),e.moveTo(k,p))),T=n=!1):(c.lineTo(k,p),w.push({x:k,y:u}),r&&e.lineTo(k,p),0==f%250&&d());t=s.dataPointIds[f];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:h,dataPointIndex:f,x1:k,y1:p,y2:u};fq[f].y[1]===a.axisY.reversed?-1:1,color:x}),this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:1,point:{x:k, +y:u},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?1:-1,color:x})}else T||n||d(),T=!0;d();ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1, +m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderRangeSplineArea=function(a){function d(a,b){var d=v(u,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width, +m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!f)))if(null!==k[q].y&&k[q].y.length&&"number"===typeof k[q].y[0]&&"number"===typeof k[q].y[1]){n=a.axisX.convertValueToPixel(n);f=a.axisY.convertValueToPixel(k[q].y[0]);p=a.axisY.convertValueToPixel(k[q].y[1]);var E=h.dataPointIds[q];this._eventManager.objectMap[E]={id:E,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:q, +x1:n,y1:f,y2:p};u[u.length]={x:n,y:f};z[z.length]={x:n,y:p};q=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx,e=null,g=this.plotArea,m=0,l,k,h,s,q=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),m=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;k=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width,0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0;var n= +a.axisX.dataInfo.minDiff;isFinite(n)||(n=0.3*Math.abs(a.axisX.range));n=this.options.dataPointWidth?this.dataPointWidth:0.6*(g.width*(a.axisX.logarithmic?Math.log(n)/Math.log(a.axisX.range):Math.abs(n)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&m>k&&(m=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,k));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&kk&&(n=k);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.clip());for(var f=0;fh&&(e=k,k=h,h=e);a.axisY.reversed&&(e=k,k=h,h=e);e=u.dataPointIds[m];this._eventManager.objectMap[e]={id:e,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:m,x1:l,y1:k,x2:F,y2:h}; +var T=v[m].color?v[m].color:0v[m].y===a.axisY.reversed?1:-1,bounds:{x1:l,y1:Math.min(k,h),x2:F,y2:Math.max(k,h)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height), +b.clearRect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};var ja=function(a,d,b,c,e,g,m,l,k){if(!(0>b)){"undefined"===typeof l&&(l=1);if(!r){var h=Number((m%(2*Math.PI)).toFixed(8));Number((g%(2*Math.PI)).toFixed(8))===h&&(m-=1E-4)}a.save();a.globalAlpha=l;"pie"===e?(a.beginPath(),a.moveTo(d.x,d.y),a.arc(d.x,d.y,b,g,m,!1),a.fillStyle=c,a.strokeStyle= +"white",a.lineWidth=2,a.closePath(),a.fill()):"doughnut"===e&&(a.beginPath(),a.arc(d.x,d.y,b,g,m,!1),0<=k&&a.arc(d.x,d.y,k*b,m,g,!0),a.closePath(),a.fillStyle=c,a.strokeStyle="white",a.lineWidth=2,a.fill());a.globalAlpha=1;a.restore()}};p.prototype.renderPie=function(a){function d(){if(h&&s){for(var a=0,b=0,c=0,e=0,d=0;dMath.PI/2-t&&m.midAngle +m.midAngle)c=d;a++}else if(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t){if(0===b||f[e].midAngle>m.midAngle)e=d;b++}m.hemisphere=g>Math.PI/2&&g<=3*Math.PI/2?"left":"right";m.indexLabelTextBlock=new ka(k.plotArea.ctx,{fontSize:m.indexLabelFontSize,fontFamily:m.indexLabelFontFamily,fontColor:m.indexLabelFontColor,fontStyle:m.indexLabelFontStyle,fontWeight:m.indexLabelFontWeight,horizontalAlign:"left",backgroundColor:m.indexLabelBackgroundColor,maxWidth:m.indexLabelMaxWidth,maxHeight:m.indexLabelWrap? +5*m.indexLabelFontSize:1.5*m.indexLabelFontSize,text:m.indexLabelText,padding:0,textBaseline:"top"});m.indexLabelTextBlock.measureText()}l=g=0;q=!1;for(d=0;dMath.PI/2-t&&m.midAngle3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t)&&(l<=b/2&&!q?(m.hemisphere="left",l++):(m.hemisphere="right",q=!0))}}function b(a){var b= +k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);for(b=0;bc){var d=0.07*A*Math.cos(f[b].midAngle),g=0.07*A*Math.sin(f[b].midAngle),m=!1;if(s[b].exploded){if(1E-9a.indexLabelTextBlock.y?d-e:c-f}function e(a){for(var b=null,e=1;ec(f[b],f[a])||("right"===f[a].hemisphere?f[b].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y:f[b].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y)))break;else b=null;return b}function g(a,b,d){d=(d||0)+1;if(1E3< +d)return 0;b=b||0;var m=0,h=x.y-1*r,l=x.y+1*r;if(0<=a&&ab&&n.indexLabelTextBlock.yl)return 0;var k=0,q=0,q=k=k=0;0>b?n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2>h&&n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+bl&&(b=n.indexLabelTextBlock.y+ +n.indexLabelTextBlock.height/2+b-l);b=n.indexLabelTextBlock.y+b;h=0;h="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2));q=x.x+A*Math.cos(n.midAngle);k=x.y+A*Math.sin(n.midAngle);k=Math.sqrt(Math.pow(h-q,2)+Math.pow(b-k,2));q=Math.acos(A/r);k=Math.acos((r*r+A*A-k*k)/(2*A*r));b=kc(f[h],f[a])||("right"===f[a].hemisphere?f[h].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y:f[h].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y)))break;else h=null;q=h;k=e(a);l=h=0;0>b?(l="right"===n.hemisphere?q:k,m=b,null!==l&&(q=-b,b=n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2-(f[l].indexLabelTextBlock.y+f[l].indexLabelTextBlock.height/2),b-q+h.toFixed(C)&&(m=b>p?-(b-p):-(q-(l-h)))))):0p?b-p:q-(h-l)))));m&&(d=n.indexLabelTextBlock.y+m,b=0,b="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)),n.midAngle>Math.PI/2-t&&n.midAngleh.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x-15:"right"===n.hemisphere&&("left"===a.hemisphere&&b3*Math.PI/2-t&&n.midAngle<3*Math.PI/2+t&&(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"right"===n.hemisphere&&"left"===h.hemisphere&&ba.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x- +15)),n.indexLabelTextBlock.y=d,n.indexLabelTextBlock.x=b,n.indexLabelAngle=Math.atan2(n.indexLabelTextBlock.y-x.y,n.indexLabelTextBlock.x-x.x))}return m}function m(){var a=k.plotArea.ctx;a.fillStyle="grey";a.strokeStyle="grey";a.font="16px Arial";a.textBaseline="middle";for(var b=a=0,d=0,m=!0,b=0;10>b&&(1>b||0z){for(var E=u=0,H=0;Hu?l.indexLabelText="":l.indexLabelTextBlock.maxWidth=0.85*u,0.3*l.indexLabelTextBlock.maxWidthd&&(d=y)),y=y=0,0d&&(d=y)));var K=function(a, +b,c){for(var e=[],d=0;e.push(f[b]),b!==c;b=(b+1+s.length)%s.length);e.sort(function(a,b){return a.y-b.y});for(b=0;bz){n=t.indexLabelTextBlock.x;var k=t.indexLabelTextBlock.y-t.indexLabelTextBlock.height/ +2,w=t.indexLabelTextBlock.y+t.indexLabelTextBlock.height/2,p=h.indexLabelTextBlock.y-h.indexLabelTextBlock.height/2,u=h.indexLabelTextBlock.x+h.indexLabelTextBlock.width,r=h.indexLabelTextBlock.y+h.indexLabelTextBlock.height/2;n=t.indexLabelTextBlock.x+t.indexLabelTextBlock.widthu+q||k>r+q||wa&&(a=l),m!==a&&(b=m,d+=-z),0===l%Math.max(s.length/10,3)&&(g=!0)):g=!0;g&&(0=a.dataSeriesIndexes.length)){var h= +this.data[a.dataSeriesIndexes[0]],s=h.dataPoints,q=10,n=this.plotArea,f=h.dataPointEOs,p=2,r,v=1.3,t=20/180*Math.PI,C=6,x={x:(n.x2+n.x1)/2,y:(n.y2+n.y1)/2},z=0;a=!1;for(var y=0;ya&&(e=a,d=!0);var g=s[b].color?s[b].color:h._colorSet[b%h._colorSet.length];e>c&&ja(k.plotArea.ctx, +f[b].center,f[b].radius,g,h.type,c,e,h.fillOpacity,f[b].percentInnerRadius);if(d)break}l()},function(){k.disableToolTip=!1;k._animator.animate(0,k.animatedRender?500:0,function(a){b(a);l()})})}}};var ra=function(a,d,b,c){"undefined"===typeof b&&(b=1);0>=Math.round(d.y4-d.y1)||(a.save(),a.globalAlpha=b,a.beginPath(),a.moveTo(Math.round(d.x1),Math.round(d.y1)),a.lineTo(Math.round(d.x2),Math.round(d.y2)),a.lineTo(Math.round(d.x3),Math.round(d.y3)),a.lineTo(Math.round(d.x4),Math.round(d.y4)),"undefined"!== +d.x5&&(a.lineTo(Math.round(d.x5),Math.round(d.y5)),a.lineTo(Math.round(d.x6),Math.round(d.y6))),a.closePath(),a.fillStyle=c?c:d.color,a.fill(),a.globalAplha=1,a.restore())};p.prototype.renderFunnel=function(a){function d(){for(var a=0,b=[],c=0;ck?(k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=0==k?0:a/k,h+=a/k,m=!0):(n=(Math.abs(ba)*b-Math.sqrt(k))/2,k=b-2*n/Math.abs(ba),h+=n,h>d&&(h-=n, +k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=a/k,h+=a/k,m=!0),b=k)),e.push(n);return e}function c(){if(t&&C){for(var a,b,c,e,d,g,l,h,m,n,k,q,s,w,p=[],B=[],x={percent:null,total:null},v=null,y=0;yp[y]&&(p[y]=y!==fa?t.reversed?P[y].x3-P[y].x4:P[y].x2-P[y].x1:P[y].x2-P[y].x1,p[y]/=2));s=b.indexLabelMaxWidth?b.indexLabelMaxWidth:t.options.indexLabelMaxWidth?t.indexLabelMaxWidth:p[y];if(s>p[y]||0>s)s=p[y];B[y]="inside"===t.indexLabelPlacement?P[y].height:!1;x=z.getPercentAndTotal(t,b);if(t.indexLabelFormatter||b.indexLabelFormatter)v={chart:z.options,dataSeries:t,dataPoint:b,total:x.total,percent:x.percent};b=b.indexLabelFormatter?b.indexLabelFormatter(v):b.indexLabel? +z.replaceKeywordsWithValue(b.indexLabel,b,t,y):t.indexLabelFormatter?t.indexLabelFormatter(v):t.indexLabel?z.replaceKeywordsWithValue(t.indexLabel,b,t,y):b.label?b.label:"";0>=n&&(n=0);1E3>s&&1E3-sl?l:t.indexLabelMaxWidth:l,h=J.length-1;0<=h;h--){g=C[J[h].id];c=J[h];e=c.textBlock;b=(a=n(h)b.y&&(d=!0);c=g.indexLabelMaxWidth||l;if(c>l||0>c)c=l;f.push(c)}if(d)for(h=J.length-1;0<=h;h--)a=P[h],J[h].textBlock.maxWidth= +f[f.length-(h+1)],J[h].textBlock.measureText(),J[h].textBlock.x=L-l,c=J[h].textBlock.heightpa+D&&(J[h].textBlock.y=pa+D-J[h].height),J[h].textBlock.ywa+D&&(J[h].textBlock.y=wa+D-J[h].height))}function g(){var a,b,c,e;if("inside"!==t.indexLabelPlacement)for(var d=0;dDa?f(c).x2+1:(a.x2+a.x3)/2+1:(a.x2+a.x3)/2+1:"undefined"!==typeof a.x5?cpa+D&&(J[d].textBlock.y=pa+D-J[d].height),J[d].textBlock.ywa+D&&(J[d].textBlock.y=wa+D-J[d].height)));else for(d=0;d=c?(b=d!=fa?(a.x4+a.x3)/2-e/2:(a.x5+a.x4)/2-e/2,c=d!=fa?(a.y1+a.y3)/2-c/2:(a.y1+a.y4)/2-c/2,J[d].textBlock.x=b, +J[d].textBlock.y=c):J[d].isDirty=!0)}function m(){function a(b,c){var d;if(0>b||b>=J.length)return 0;var e,f=J[b].textBlock;if(0>c){c*=-1;e=q(b);d=l(e,b);if(d>=c)return f.y-=c,c;if(0==b)return 0=c)return f.y+=c,c;if(b==P.length-1)return 0e)&&(l=n(s),!(l>=J.length-1)&&J[s].textBlock.y+J[s].height+ga>J[l].textBlock.y&&(J[s].textBlock.y=J[s].textBlock.y+J[s].height-e>e-J[s].textBlock.y?e+1:e-J[s].height-1))}for(l=P.length-1;0e&&(e=0,J[e].isDirty))break;if(J[l].textBlock.y=f){f=0;h+=J[f].height;break}e=q(f); +if(0>e){f=0;h+=J[f].height;break}}if(f!=l){g=J[f].textBlock.y;a-=g;a=h-a;g=c(a,d,f);break}}}return g}function c(a,b,d){var e=[],f=0,g=0;for(a=Math.abs(a);d<=b;d++)e.push(P[d]);e.sort(function(a,b){return a.height-b.height});for(d=0;d+m.y.toFixed(6))&&(d=g.y+d+ga-m.y,e=a(w,-d),ea?t.reversed?wa-D:pa-D:J[a].textBlock.y+J[a].height+ga)}function k(a,b,c){var d,e,f,l=[],m=D,n=[];-1!==b&&(0<=W.indexOf(b)?(e=W.indexOf(b),W.splice(e,1)):(W.push(b),W=W.sort(function(a,b){return a-b})));if(0===W.length)l= +ia;else{e=D*(1!=W.length||0!=W[0]&&W[0]!=P.length-1?2:1)/h();for(var q=0;qn&&(n*=-1),c.y1+=b-n[d],c.y2+=b-n[d],c.y3+=b-n[d],c.y4+=b-n[d],c.y5&&(c.y5+=b-n[d],c.y6+=b-n[d]),n[d]=b}};a._animator.animate(0,c,function(c){var d=a.plotArea.ctx||a.ctx;ja=!0;d.clearRect(x.x1,x.y1,x.x2-x.x1,x.y2-x.y1);d.fillStyle=a.backgroundColor;d.fillRect(x.x1,x.y1,x.width,x.height);w.changeSection(c,b);var e={};e.dataSeries=t;e.dataPoint=t.reversed?t.dataPoints[C.length-1-b]:t.dataPoints[b];e.index=t.reversed?C.length-1-b:b;a.toolTip.highlightObjects([e]); +for(e=0;ea){b=P[c];break}return b?(a=b.y6?a>b.y6?b.x3+(b.x4-b.x3)/(b.y4-b.y3)*(a-b.y3):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2), +{x1:a,x2:a}):-1}function p(a){for(var b=0;b=a.dataSeriesIndexes.length)){for(var t=this.data[a.dataSeriesIndexes[0]],C=t.dataPoints,x=this.plotArea,D=0.025*x.width,y=0.01*x.width,A=0,F=x.height-2*D,E=Math.min(x.width-2*y,2.8*x.height),H=!1,I=0;IF?N=F:0>=N&&(N=0),G>a?G=a-0.5:0>=G&&(G=0)):"pyramid"===t.type&&(G=N=0,t.reversed=t.reversed?!1:!0);var y=I+a/2,$=I,V=I+a,pa=t.reversed?Z:O,K=y-G/2,ea=y+G/2,Da=t.reversed?O+N:Z- +N,wa=t.reversed?O:Z;a=[];var y=[],P=[],E=[],X=O,fa,ba=(Da-pa)/(K-$),ha=-ba,I="area"===(t.valueRepresents?t.valueRepresents:"height")?b():d();if(-1!==I){if(t.reversed)for(E.push(X),G=I.length-1;0a&&(A=a));for(G=0;G\n');c.document.close();setTimeout(function(){c.focus();c.print();setTimeout(function(){b._canvasJSContainer.removeChild(d)},1E3)},500)};p.prototype.getPercentAndTotal=function(a,d){var b=null,c=null, +e=null;if(0<=a.type.indexOf("stacked"))c=0,b=d.x.getTime?d.x.getTime():d.x,b in a.plotUnit.yTotals&&(c=a.plotUnit.yTotals[b],e=isNaN(d.y)?0:100*(d.y/c));else if("pie"===a.type||"doughnut"===a.type||"funnel"===a.type||"pyramid"===a.type){for(b=c=0;b=m||"undefined"=== +typeof m||0>=v||"undefined"===typeof v)){if("horizontal"===this.orientation){n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:v,maxHeight:this.itemWrap?m:this.lineHeight,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"});n.textBlock.measureText();null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"=== +n.chartType?2*0.1*this.lineHeight:0)));if(!q||q.width+Math.round(n.textBlock.width+r+l+(0===q.width?0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))>g)q={items:[],width:0},h.push(q),this.height+=f,f=0;f=Math.max(f,n.textBlock.height)}else n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:x,maxHeight:!0===this.itemWrap?m:1.5*this.fontSize,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily, +fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"}),n.textBlock.measureText(),null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))),this.height>0,0),this.dataPoints.length):0):(s=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,s=0>0,0),this.dataPoints.length):0));for(;;){g=0a?c.x/a:a/c.x: +Math.abs(c.x-a);qs-e&&s+e>=this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}return d||b.dataPoint.x!==a?d&&null!==b.dataPoint?b:null:b};F.prototype.getDataPointAtXY=function(a,d,b){if(!this.dataPoints||0===this.dataPoints.length||athis.chart.plotArea.x2||dthis.chart.plotArea.y2)return null;b=b||!1;var c=[],e=0,g=0,m=1,l=!1,k=Infinity, +h=0,s=0,q=0;if("none"!==this.chart.plotInfo.axisPlacement)if(q=(this.chart.axisX[0]?this.chart.axisX[0]:this.chart.axisX2[0]).getXValueAt({x:a,y:d}),this.axisX.logarithmic)var n=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),q=1>0,0),this.dataPoints.length):0;else n=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,q=0> +0,0),this.dataPoints.length):0;for(;;){g=0=n.x1&&(a<=n.x2&&d>=n.y1&&d<=n.y2)&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1- +a),Math.abs(n.x2-a),Math.abs(n.y1-d),Math.abs(n.y2-d))}),l=!0);break;case "line":case "stepLine":case "spline":case "area":case "stepArea":case "stackedArea":case "stackedArea100":case "splineArea":case "scatter":var u=na("markerSize",f,this)||4,r=b?20:u,p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0r&&(p=Math.atan2(d-u.y,a-u.x),0>p&&(p+=2*Math.PI),p=Number(((180*(p/Math.PI)%360+360)%360).toFixed(12)),u=Number(((180*(n.startAngle/Math.PI)%360+360)%360).toFixed(12)),r=Number(((180*(n.endAngle/Math.PI)%360+360)%360).toFixed(12)),0===r&&1=r&&0!==f.y&&(r+=360,pu&&pp.y1&&dp.y6?(g=p.x6+(p.x5-p.x6)/(p.y5-p.y6)*(d-p.y6),p=p.x3+(p.x4-p.x3)/(p.y4-p.y3)*(d-p.y3)):(g=p.x1+(p.x6-p.x1)/(p.y6-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)):(g=p.x1+(p.x4-p.x1)/(p.y4-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)),a>g&&a=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y4-n.borderThickness/2&&d<=n.y1+n.borderThickness/ +2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "candlestick":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y2-n.borderThickness/2&&d<=n.y3+n.borderThickness/2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a), +Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "ohlc":if(Math.abs(n.x2-a+n.x1-a)=n.y2&&d<=n.y3||a>=n.x1&&a<=(n.x2+n.x1)/2&&d>=n.y1-n.borderThickness/2&&d<=n.y1+n.borderThickness/2||a>=(n.x1+n.x2)/2&&a<=n.x2&&d>=n.y4-n.borderThickness/2&&d<=n.y4+n.borderThickness/2)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0}if(l||1E3q-e&&q+e>= +this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}a=null;for(d=0;dq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius, +horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle",borderThickness:0}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}f=n;for(b=this.intervalStartPosition;b<=e;b=parseFloat(1E-12>this.interval?this.logarithmic&&this.equidistantInterval?b*Math.pow(this.logarithmBase,this.interval):b+this.interval:(this.logarithmic&&this.equidistantInterval? +b*Math.pow(this.logarithmBase,this.interval):b+this.interval).toFixed(12))){for(;fq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix, +horizontalAlign:"left",backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}}else for(this.intervalStartPosition=this.getLabelStartPoint(new Date(this.viewportMinimum), +this.intervalType,this.interval),e=Ya(new Date(this.viewportMaximum),this.interval,this.intervalType),f=n,b=this.intervalStartPosition;bq[f].endValue;f++);p=a;a=f=q[f].startValue&&a<=q[f].endValue;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:new Date(p),label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:Ca(p,this.valueFormatString,this.chart._cultureInfo), +a=new ka(this.ctx,{x:0,y:0,maxWidth:g,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null, +breaksLabelType:void 0}))}if("bottom"===this._position||"top"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.width*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length-2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.width/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+ +"Duration"]*this.interval,g="undefined"===typeof this.options.labelMaxWidth?0.5*this.chart.width>>0:this.options.labelMaxWidth,this.chart.panEnabled||(m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize);else if("left"===this._position||"right"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.height*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length- +2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.height/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+"Duration"]*this.interval,this.chart.panEnabled||(g="undefined"===typeof this.options.labelMaxWidth?0.3*this.chart.width>>0:this.options.labelMaxWidth),m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize; +for(c=0;cthis.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360)),"bottom"===this._position||"top"===this._position)if(g=0.9*l>>0,n=0,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize= +this.labelFontSize;this.sessionVariables.labelMaxWidth=g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=this.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;bn&&(v=b,n=p.width)}b=0;for(b=this.intervalStartPosition< +this.viewportMinimum?1:0;b>0>2*g&&(this.sessionVariables.labelAngle=-25)):(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle):u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth= +g,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p)):(this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=this.labelWrap);else{if(u(this.options.labelWrap))if(!u(this.options.labelMaxWidth))this.options.labelMaxWidth>0,f=this.labelFontSize,nq&&(q=c-2*g,c>=2*g&&c<2.2*g?(this.sessionVariables.labelMaxWidth=g,u(this.options.labelFontSize)&&12=2.2*g&&c<2.8*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=f):c>=2.8*g&&c<3.2*g?(this.sessionVariables.labelMaxWidth=Math.max(g,n),this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12=3.2*g&&c<3.6*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=this.labelFontSize):c>3.6*g&&c<5*g?(u(this.options.labelFontSize)&&125*g&&(this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelFontSize=f,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=this.labelAngle));else if(v===b&&(0===v&&n+this._labels[v+1].textBlock.measureText().width-2*g>q||v===this._labels.length-1&&n+this._labels[v-1].textBlock.measureText().width-2*g>q||0q&&n+this._labels[v-1].textBlock.measureText().width- +2*g>q))q=0===v?n+this._labels[v+1].textBlock.measureText().width-2*g:n+this._labels[v-1].textBlock.measureText().width-2*g,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p;else if(0===q)for(this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,c=0;c>0>2*g&&(this.sessionVariables.labelAngle=-25))}else(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/ +Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=0!=this.labelAngle?(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)):g,this.sessionVariables.labelMaxHeight=m=this.labelWrap?(h-p*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)):1.5*this.labelFontSize,u(this.options.labelWrap))?u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap= +this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelMaxHeight=c<0.9*l?0.9*l:c,this.sessionVariables.labelWrap=this.labelWrap)):(this.options.labelWrap?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p): +(u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelWrap=this.labelWrap),this.sessionVariables.labelMaxHeight=m)}for(c=0;c>0:this.options.labelMaxWidth,m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize=this.labelFontSize;this.sessionVariables.labelMaxWidth= +g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b>0,l-2*m>n&&(n=l-2*m,l>=2*m&&l<2.4*m?(u(this.options.labelFontSize)&&12=2.4*m&&l<2.8*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelFontSize=this.labelFontSize,this.sessionVariables.labelWrap=!0):l>=2.8*m&&l<3.2*m?(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12< +this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>=3.2*m&&l<3.6*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelFontSize=this.labelFontSize):l>3.6*m&&l<10*m?(u(this.options.labelFontSize)&& +1210*m&&l<50*m&&(u(this.options.labelFontSize)&&12this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,u(this.options.labelMaxWidth)&& +(this.sessionVariables.labelAngle=this.labelAngle))):this.options.labelWrap?(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=g):(this.sessionVariables.labelMaxHeight=m,u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap)}for(c=0;c>0:1.5*this.labelFontSize;if("left"===this._position||"right"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.width>>0:1.5*this.labelFontSize;u(g.labelBackgroundColor)&&(g.labelBackgroundColor="#EEEEEE")}else m="bottom"===this._position||"top"===this._position?0.9*this.chart.width>>0:0.9*this.chart.height>> +0,z=u(g.options.labelWrap)||g.labelWrap?"bottom"===this._position||"top"===this._position?0.8*this.chart.width>>0:0.8*this.chart.height>>0:1.5*this.labelFontSize,u(g.labelBackgroundColor)&&(u(g.startValue)&&0!==g.startValue?g.labelBackgroundColor=r?"transparent":null:g.labelBackgroundColor="#EEEEEE");a=new ka(this.ctx,{x:0,y:0,backgroundColor:g.labelBackgroundColor,borderColor:g.labelBorderColor,borderThickness:g.labelBorderThickness,cornerRadius:g.labelCornerRadius,maxWidth:g.options.labelMaxWidth? +g.options.labelMaxWidth:m,maxHeight:z,angle:this.labelAngle,text:g.labelFormatter?g.labelFormatter({chart:this.chart,axis:this,stripLine:g}):g.label,horizontalAlign:"left",fontSize:"outside"===g.labelPlacement?g.options.labelFontSize?g.labelFontSize:this.labelFontSize:g.labelFontSize,fontFamily:"outside"===g.labelPlacement?g.options.labelFontFamily?g.labelFontFamily:this.labelFontFamily:g.labelFontFamily,fontWeight:"outside"===g.labelPlacement?g.options.labelFontWeight?g.labelFontWeight:this.labelFontWeight: +g.labelFontWeight,fontColor:g.labelFontColor||g.color,fontStyle:"outside"===g.labelPlacement?g.options.labelFontStyle?g.labelFontStyle:this.fontWeight:g.labelFontStyle,textBaseline:"middle"});this._stripLineLabels.push({position:g.value,textBlock:a,effectiveHeight:null,stripLine:g})}};z.prototype.createLabelsAndCalculateWidth=function(){var a=0,d=0;this._labels=[];this._stripLineLabels=[];var b=this.chart.isNavigator?0:5;if("left"===this._position||"right"===this._position){this.createLabels();for(d= +0;d=this.viewportMinimum&&this._stripLineLabels[d].stripLine.value<=this.viewportMaximum)&& +(c=this._stripLineLabels[d].textBlock,e=c.measureText(),g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle)),a=this.viewportMinimum&&this._stripLineLabels[b].stripLine.value<=this.viewportMaximum)&&(d=this._stripLineLabels[b].textBlock,e=d.measureText(),g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)),an[f].viewportMaximum);v++)r[v].endValue=n[f].viewPortMinimum&&(n[f].scaleBreaks.lastBreakIndex=v));for(var z=v=0,t=0,C=0,x=0,D=0,y=0,A,E,F=l=0,H,I,L,r=H=I=L=!1,f=0;fv;){var G=0,R=0,S=0,U=0,W=e=0,K=0,$=0,V=0,X=0,P=0,ba=0;if(b&& +0p.width- +q?p.width-q:g.x2-ba-$);if(a&&0p.width-q?p.width-q:g.x2-ba-$),a[f]._labels&&1k&&(l+=0a[f].labelAngle?A-zk&&(l=E+t/2-k-ba),A-za[f].labelAngle&&0p.width-q?p.width-q:g.x2-ba-$),d[f].lineCoordinates.width=Math.abs(k-m),d[f]._labels&&1v;){V=U=R=S=$=K=W=e=Q=O=G=X=0;if(a&&0p.width-10?p.width-10:g.x2-V-W),b[f].labelAutoFit&&!u(C)&&(0b[f].labelAngle?Math.max(m,C):0===b[f].labelAngle? +Math.max(m,C/2):m),0c[f].chart.width-10?c[f].chart.width-10:g.x2-V-W),c[f]&& +c[f].labelAutoFit&&!u(D)&&(0b[f].chart.height-10?b[f].chart.height-10:g.y2),b[f].lineCoordinates.y1=l-(q[f]+b[f].margin+ +X),b[f].lineCoordinates.y2=l-(q[f]+b[f].margin+X),b[f].bounds={x1:m,y1:l-(q[f]+X+b[f].margin),x2:k,y2:h-(X+b[f].margin),width:k-m,height:q[f]},b[f].title&&(b[f]._titleTextBlock.maxWidth=0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0===b[K].labelAngle?k-U:m);if(c&&0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0=== +b[K].labelAngle?k-V:m);if(c&&0d[g].spacing?0:Math.abs(d[g].spacing/b),this.logarithmic&&(d[g].size=Math.pow(this.logarithmBase,d[g].size))};z.prototype.calculateBreaksInPixels=function(){if(!(this.scaleBreaks&&0>=this.scaleBreaks._appliedBreaks.length)){var a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];a.length&&(this.scaleBreaks.firstBreakIndex=this.scaleBreaks.lastBreakIndex=null);for(var d=0;dthis.conversionParameters.maximum);d++)a[d].endValue< +this.conversionParameters.minimum||(u(this.scaleBreaks.firstBreakIndex)&&(this.scaleBreaks.firstBreakIndex=d),a[d].startValue>=this.conversionParameters.minimum&&(a[d].startPixel=this.convertValueToPixel(a[d].startValue),this.scaleBreaks.lastBreakIndex=d),a[d].endValue<=this.conversionParameters.maximum&&(a[d].endPixel=this.convertValueToPixel(a[d].endValue)))}};z.prototype.renderLabelsTicksAndTitle=function(){var a=this,d=!1,b=0,c=0,e=1,g=0;0!==this.labelAngle&&360!==this.labelAngle&&(e=1.2);if("undefined"=== +typeof this.options.interval){if("bottom"===this._position||"top"===this._position)if(this.logarithmic&&!this.equidistantInterval&&this.labelAutoFit){for(var b=[],e=0!==this.labelAngle&&360!==this.labelAngle?1:1.2,m,l=this.viewportMaximum,k=this.lineCoordinates.width/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||mthis.lineCoordinates.width*e&&this.labelAutoFit&&(d=!0)}if("left"===this._position||"right"===this._position)if(this.logarithmic&& +!this.equidistantInterval&&this.labelAutoFit){for(var b=[],p,l=this.viewportMaximum,k=this.lineCoordinates.height/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||pthis.lineCoordinates.height*e&&this.labelAutoFit&&(d=!0)}}this.logarithmic&&(!this.equidistantInterval&&this.labelAutoFit)&&this._labels.sort(function(a,b){return a.position-b.position});var h=0,q,n;if("bottom"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y+this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y-(this.tickLength+q.textBlock.fontSize/2):n.y+this.tickLength+q.textBlock.fontSize/2):(n.x="inside"===this.labelPlacement?0>this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x-(0>this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0>this.labelAngle?n.y-this.tickLength-5:n.y-this.tickLength-Math.abs(q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle)+5):n.y+this.tickLength+Math.abs(0>this.labelAngle?q.textBlock.width* +Math.sin(Math.PI/180*this.labelAngle)-5:5)),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save(); +a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y-a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y2-this._titleTextBlock.height-3,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("top"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y-this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y+this.labelFontSize/2+this.tickLength+5:n.y-(this.tickLength+q.textBlock.height-q.textBlock.fontSize/2)):(n.x="inside"===this.labelPlacement?0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&& +(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y+a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y1+1,this.titleMaxWidth= +this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("left"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<< +0,c),this.ctx.lineTo(n.x-this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle?(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5):(q.textBlock.y="inside"===this.labelPlacement?n.y:n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness; +a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x+a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x1+1,this._titleTextBlock.y=this.lineCoordinates.height/2+this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("right"=== +this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<<0,c),this.ctx.lineTo(n.x+this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle? +(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width-this.tickLength-5:n.x+this.tickLength+5):(q.textBlock.y="inside"===this.labelPlacement?n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0>this.labelAngle?n.y:n.y-(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.cos(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<< +0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x-a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x2-1,this._titleTextBlock.y=this.lineCoordinates.height/2-this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}g=0;if("inside"===this.labelPlacement)this.chart.addEventListener("dataAnimationIterationEnd", +function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)||(a.ctx.save(),a.ctx.beginPath(),q.textBlock.render(!0),a.ctx.restore())},this);else for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||q.textBlock.render(!0)};z.prototype.renderInterlacedColors=function(){var a=this.chart.plotArea.ctx,d,b,c=this.chart.plotArea, +e=0;d=!0;if(("bottom"===this._position||"top"===this._position)&&this.interlacedColor)for(a.fillStyle=this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(Math.min(b.x,d.x),c.y1,Math.abs(b.x-d.x),Math.abs(c.y1-c.y2)),d=!1):d=!0;else if(("left"===this._position||"right"===this._position)&&this.interlacedColor)for(a.fillStyle= +this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(c.x1,Math.min(b.y,d.y),Math.abs(c.x1-c.x2),Math.abs(d.y-b.y)),d=!1):d=!0;a.beginPath()};z.prototype.renderStripLinesOfThicknessType=function(a){if(this.stripLines&&0this.viewportMaximum||u(h.value)||isNaN(this.range))||l.push(h))}for(c=0;cthis.viewportMaximum||isNaN(this.range))){a=this.getPixelCoordinatesOnAxis(b.position);if("outside"===b.stripLine.labelPlacement)if(h&&(this.ctx.strokeStyle= +h.color,"pixel"===h._thicknessType&&(this.ctx.lineWidth=h.thickness)),"bottom"===this._position){var p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0;this.ctx.beginPath();this.ctx.moveTo(p,a.y<<0);this.ctx.lineTo(p,a.y+this.tickLength<<0);this.ctx.stroke();0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y+=this.tickLength+b.textBlock.fontSize/2):(a.x-=0>this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0,a.y+=this.tickLength+Math.abs(0>this.labelAngle?b.textBlock.width*Math.sin(Math.PI/ +180*this.labelAngle)-5:5))}else"top"===this._position?(p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,this.ctx.beginPath(),this.ctx.moveTo(p,a.y<<0),this.ctx.lineTo(p,a.y-this.tickLength<<0),this.ctx.stroke(),0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y-=this.tickLength+b.textBlock.height):(a.x+=(b.textBlock.height-this.tickLength-this.labelFontSize/2)*Math.sin(Math.PI/180*this.labelAngle)-(0this.labelAngle?a.y:a.y-(b.textBlock.height-b.textBlock.fontSize/ +2-5)*Math.cos(Math.PI/180*this.labelAngle),a.x=0this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/ +2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+=b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y1+b.textBlock.width+3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-b.textBlock.width-3:"center"=== +b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y1+3):"top"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+= +b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+b.textBlock.width+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y2-3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y2- +b.textBlock.width-3):"left"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-b.textBlock.height>this.chart.plotArea.y1?u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3:a.y-b.textBlock.heightthis.chart.plotArea.y1? +u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2-3:a.y-b.textBlock.heightthis.viewportMaximum|| +isNaN(this.range))||a[d].render(this.maskCtx);this.maskCtx.restore()}};z.prototype.renderCrosshair=function(a,d){this.crosshair.render(a,d)};z.prototype.renderGrid=function(){if(this.gridThickness&&0this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(),d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.x<<0)+0.5:d.x<<0,a.moveTo(d,b.y1<<0),a.lineTo(d,b.y2<<0),a.stroke());else if("left"===this._position||"right"===this._position)for(var c=0;cthis.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(), +d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.y<<0)+0.5:d.y<<0,a.moveTo(b.x1<<0,d),a.lineTo(b.x2<<0,d),a.stroke());a.restore()}};z.prototype.renderAxisLine=function(){var a=this.chart.ctx,d=r?this.chart._preRenderCtx:a,b=Math.ceil(this.tickThickness/(this.reversed?-2:2)),c=Math.ceil(this.tickThickness/(this.reversed?2:-2)),e,g;d.save();if("bottom"===this._position||"top"===this._position){if(this.lineThickness){this.reversed?(e=this.lineCoordinates.x2,g=this.lineCoordinates.x1): +(e=this.lineCoordinates.x1,g=this.lineCoordinates.x2);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor?this.lineColor:"black";d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));var m=1===this.lineThickness%2?(this.lineCoordinates.y1<<0)+0.5:this.lineCoordinates.y1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+c;else for(var l= +this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(e,m),d.lineTo(this.scaleBreaks._appliedBreaks[l].startPixel+b,m),e=this.scaleBreaks._appliedBreaks[l].endPixel+c;e&&(d.moveTo(e,m),d.lineTo(g,m));d.stroke()}}else if(("left"===this._position||"right"===this._position)&&this.lineThickness){this.reversed?(e=this.lineCoordinates.y1,g=this.lineCoordinates.y2):(e=this.lineCoordinates.y2,g=this.lineCoordinates.y1);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor; +d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));m=1===this.lineThickness%2?(this.lineCoordinates.x1<<0)+0.5:this.lineCoordinates.x1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+b;else for(l=this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(m,e),d.lineTo(m,this.scaleBreaks._appliedBreaks[l].startPixel+c), +e=this.scaleBreaks._appliedBreaks[l].endPixel+b;e&&(d.moveTo(m,e),d.lineTo(m,g));d.stroke()}r&&(a.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx&&this.chart._breaksCanvasCtx.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),d.clearRect(0,0,this.chart.width,this.chart.height));d.restore()};z.prototype.getPixelCoordinatesOnAxis=function(a){var d={};if("bottom"===this._position||"top"===this._position)d.x=this.convertValueToPixel(a), +d.y=this.lineCoordinates.y1;if("left"===this._position||"right"===this._position)d.y=this.convertValueToPixel(a),d.x=this.lineCoordinates.x2;return d};z.prototype.convertPixelToValue=function(a){if("undefined"===typeof a)return null;var d=0,b=0,c,d=!0,e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b="number"===typeof a?a:"left"===this._position||"right"===this._position?a.y:a.x;if(this.logarithmic){a=c=Math.pow(this.logarithmBase,(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit); +if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;be[b].startValue/this.conversionParameters.minimum){c/=e[b].startValue/this.conversionParameters.minimum;if(ce[b].startValue/e[b-1].endValue){c/=e[b].startValue/e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum){if(1e[b].startValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].startValue/this.conversionParameters.minimum*Math.pow(e[b].size,Math.log(e[b].startValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue))*c,c*=Math.pow(e[b].size,Math.log(this.conversionParameters.minimum/e[b].startValue)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size;d=!1}else break;else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size}else break; +d=a*this.viewportMinimum}else{a=c=(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit;if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b=e[b].size?0:c*(e[b].endValue- +e[b].startValue)/e[b].size;break}else a+=e[b].endValue-this.conversionParameters.minimum-e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue),c-=e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue);d=!1}else if(c>e[b].startValue-this.conversionParameters.minimum){c-=e[b].startValue-this.conversionParameters.minimum;if(ce[b].startValue-e[b-1].endValue){c-=e[b].startValue-e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum)if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue- +e[b].startValue)/e[b].size>e[b].startValue){a=0>=e[b].size?0:c*(e[b].endValue-e[b].startValue)/e[b].size;break}else a+=e[b].startValue-this.conversionParameters.minimum+e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),c+=e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),d=!1;else if(c-1*e[b].size){a+=(e[b].endValue- +e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size;d=!1}else break;else if(c-1*e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size}else break;d=this.conversionParameters.minimum+a}return d};z.prototype.convertValueToPixel=function(a){a=this.getApparentDifference(this.conversionParameters.minimum, +a,a);return this.logarithmic?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*Math.log(a/this.conversionParameters.minimum)/this.conversionParameters.lnLogarithmBase+0.5<<0:"axisX"===this.type?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5<<0:this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5};z.prototype.getApparentDifference=function(a, +d,b,c){var e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];if(this.logarithmic){b=u(b)?d/a:b;for(var g=0;ge[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*e[g].startValue*e[g].size:a>=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*a*Math.pow(e[g].size,Math.log(e[g].endValue/a)/Math.log(e[g].endValue/e[g].startValue)):a<=e[g].startValue&&d<=e[g].endValue?b=b/d*e[g].startValue*Math.pow(e[g].size,Math.log(d/e[g].startValue)/Math.log(e[g].endValue/ +e[g].startValue)):!c&&(a>e[g].startValue&&de[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+e[g].startValue+e[g].size:a>e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+a+e[g].size*(e[g].endValue-a)/(e[g].endValue-e[g].startValue):a<=e[g].startValue&&de[g].startValue&&da[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<= +a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*this.viewportMinimum,b=0a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<=a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+this.viewportMinimum, +b=0this.maxWidth?8:6);var a=Math.max(c,Math.floor(this.maxWidth/a)),e,g,m,c=0;!u(this.options.viewportMinimum)&&(!u(this.options.viewportMaximum)&&this.options.viewportMinimum>=this.options.viewportMaximum)&& +(this.viewportMinimum=this.viewportMaximum=null);if(u(this.options.viewportMinimum)&&!u(this.sessionVariables.newViewportMinimum)&&!isNaN(this.sessionVariables.newViewportMinimum))this.viewportMinimum=this.sessionVariables.newViewportMinimum;else if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(u(this.options.viewportMaximum)&&!u(this.sessionVariables.newViewportMaximum)&&!isNaN(this.sessionVariables.newViewportMaximum))this.viewportMaximum=this.sessionVariables.newViewportMaximum; +else if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(c=0;c=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue)&& +(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue)){this.scaleBreaks._appliedBreaks.splice(c,1);break}if("axisX"===this.type){if(this.dataSeries&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g, +null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0));c=this.getApparentDifference(isNaN(this.viewportMinimum)||null===this.viewportMinimum?e:this.viewportMinimum,isNaN(this.viewportMaximum)||null===this.viewportMaximum?g:this.viewportMaximum,null, +!0);if("axisX"===this.type&&b){this.intervalType||(c/1<=a?(this.interval=1,this.intervalType="millisecond"):c/2<=a?(this.interval=2,this.intervalType="millisecond"):c/5<=a?(this.interval=5,this.intervalType="millisecond"):c/10<=a?(this.interval=10,this.intervalType="millisecond"):c/20<=a?(this.interval=20,this.intervalType="millisecond"):c/50<=a?(this.interval=50,this.intervalType="millisecond"):c/100<=a?(this.interval=100,this.intervalType="millisecond"):c/200<=a?(this.interval=200,this.intervalType= +"millisecond"):c/250<=a?(this.interval=250,this.intervalType="millisecond"):c/300<=a?(this.interval=300,this.intervalType="millisecond"):c/400<=a?(this.interval=400,this.intervalType="millisecond"):c/500<=a?(this.interval=500,this.intervalType="millisecond"):c/(1*S.secondDuration)<=a?(this.interval=1,this.intervalType="second"):c/(2*S.secondDuration)<=a?(this.interval=2,this.intervalType="second"):c/(5*S.secondDuration)<=a?(this.interval=5,this.intervalType="second"):c/(10*S.secondDuration)<=a?(this.interval= +10,this.intervalType="second"):c/(15*S.secondDuration)<=a?(this.interval=15,this.intervalType="second"):c/(20*S.secondDuration)<=a?(this.interval=20,this.intervalType="second"):c/(30*S.secondDuration)<=a?(this.interval=30,this.intervalType="second"):c/(1*S.minuteDuration)<=a?(this.interval=1,this.intervalType="minute"):c/(2*S.minuteDuration)<=a?(this.interval=2,this.intervalType="minute"):c/(5*S.minuteDuration)<=a?(this.interval=5,this.intervalType="minute"):c/(10*S.minuteDuration)<=a?(this.interval= +10,this.intervalType="minute"):c/(15*S.minuteDuration)<=a?(this.interval=15,this.intervalType="minute"):c/(20*S.minuteDuration)<=a?(this.interval=20,this.intervalType="minute"):c/(30*S.minuteDuration)<=a?(this.interval=30,this.intervalType="minute"):c/(1*S.hourDuration)<=a?(this.interval=1,this.intervalType="hour"):c/(2*S.hourDuration)<=a?(this.interval=2,this.intervalType="hour"):c/(3*S.hourDuration)<=a?(this.interval=3,this.intervalType="hour"):c/(6*S.hourDuration)<=a?(this.interval=6,this.intervalType= +"hour"):c/(1*S.dayDuration)<=a?(this.interval=1,this.intervalType="day"):c/(2*S.dayDuration)<=a?(this.interval=2,this.intervalType="day"):c/(4*S.dayDuration)<=a?(this.interval=4,this.intervalType="day"):c/(1*S.weekDuration)<=a?(this.interval=1,this.intervalType="week"):c/(2*S.weekDuration)<=a?(this.interval=2,this.intervalType="week"):c/(3*S.weekDuration)<=a?(this.interval=3,this.intervalType="week"):c/(1*S.monthDuration)<=a?(this.interval=1,this.intervalType="month"):c/(2*S.monthDuration)<=a?(this.interval= +2,this.intervalType="month"):c/(3*S.monthDuration)<=a?(this.interval=3,this.intervalType="month"):c/(6*S.monthDuration)<=a?(this.interval=6,this.intervalType="month"):(this.interval=c/(1*S.yearDuration)<=a?1:c/(2*S.yearDuration)<=a?2:c/(4*S.yearDuration)<=a?4:Math.floor(z.getNiceNumber(c/(a-1),!0)/S.yearDuration),this.intervalType="year"));if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=e-m/2;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum= +g+m/2;d?this.autoValueFormatString="MMM DD YYYY HH:mm":"year"===this.intervalType?this.autoValueFormatString="YYYY":"month"===this.intervalType?this.autoValueFormatString="MMM YYYY":"week"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"day"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"hour"===this.intervalType?this.autoValueFormatString="hh:mm TT":"minute"===this.intervalType?this.autoValueFormatString="hh:mm TT":"second"===this.intervalType?this.autoValueFormatString= +"hh:mm:ss TT":"millisecond"===this.intervalType&&(this.autoValueFormatString="fff'ms'");this.valueFormatString||(this.valueFormatString=this.autoValueFormatString)}else{this.intervalType="number";c=z.getNiceNumber(c,!1);this.interval=this.options&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g,null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)):(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0)),Math.abs(this.getApparentDifference(e,g,null,!0)),"axisX"===this.type&&b){this.valueType="dateTime";if(null===this.minimum||isNaN(this.minimum))this.minimum=e-m/2;if(null===this.maximum||isNaN(this.maximum))this.maximum=g+m/2}else this.intervalType=this.valueType="number",null===this.minimum&&(this.minimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval,this.minimum=Math.min(this.minimum, +null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?Infinity:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval,this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?-Infinity:this.sessionVariables.viewportMaximum)),0===this.maximum&&0===this.minimum&&(0===this.options.minimum?this.maximum+=10:0=== +this.options.maximum&&(this.minimum-=10));u(this.sessionVariables.newViewportMinimum)&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));u(this.sessionVariables.newViewportMaximum)&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.range=this.viewportMaximum-this.viewportMinimum;this.intervalStartPosition="axisX"===this.type&&b?this.getLabelStartPoint(new Date(this.viewportMinimum),this.intervalType,this.interval):Math.floor((this.viewportMinimum+0.2*this.interval)/ +this.interval)*this.interval;this.valueFormatString||(this.valueFormatString=z.generateValueFormatString(this.range,2))}};z.prototype.calculateLogarithmicAxisParameters=function(){var a=this.chart.layoutManager.getFreeSpace(),d=Math.log(this.logarithmBase),b;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?500>this.maxWidth?7:Math.max(7,Math.floor(this.maxWidth/100)):Math.max(Math.floor(this.maxWidth/ +50),3),c,e,g,m;m=1;if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(m=0;m=this.scaleBreaks._appliedBreaks[m].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[m].startValue|| +!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue)&&(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue)){this.scaleBreaks._appliedBreaks.splice(m,1);break}"axisX"===this.type? +(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,1===e/c&&(m=Math.pow(this.logarithmBase,"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin, +e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,0>=c&&!isFinite(e)?(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1):0>=c?c=e:isFinite(e)||(e=c),1===c&&1===e?(e*=this.logarithmBase-1/this.logarithmBase,c=1):1===e/c?(m=Math.min(e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),e*=m,c/=m):c>e?(m=Math.min(c/e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase, +0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&1e&&(e=1));m=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)/(isNaN(this.viewportMinimum)||null=== +this.viewportMinimum?c:this.viewportMinimum);var l=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)-(isNaN(this.viewportMinimum)||null===this.viewportMinimum?c:this.viewportMinimum);this.intervalType="number";m=Math.pow(this.logarithmBase,z.getNiceNumber(Math.abs(Math.log(m)/d),!1));this.options&&0this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(c)||isFinite(e)?1===c&&1===e?(e*=this.logarithmBase,c/=this.logarithmBase):1===e/c?(m=Math.pow(this.logarithmBase,this.interval),e*=m,c/=m):c>e?(m= +Math.min(0.01*(c/e),5),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)):(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.minimum||isNaN(this.minimum))&&1e&&(e=1)),this.intervalType="number",null===this.minimum&&(this.minimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval)),this.minimum=Math.min(this.minimum,null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?"undefined"===typeof this.sessionVariables.newViewportMinimum?Infinity:this.sessionVariables.newViewportMinimum:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum= +"axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval)),this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?"undefined"===typeof this.sessionVariables.newViewportMaximum?0:this.sessionVariables.newViewportMaximum:this.sessionVariables.viewportMaximum)),1===this.maximum&&1===this.minimum&&(1===this.options.minimum?this.maximum*=this.logarithmBase-1/this.logarithmBase: +1===this.options.maximum&&(this.minimum/=this.logarithmBase-1/this.logarithmBase));this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum);this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum);this.viewportMinimum>this.viewportMaximum&&(!this.options.viewportMinimum&&!this.options.minimum||this.options.viewportMaximum||this.options.maximum?this.options.viewportMinimum||this.options.minimum||!this.options.viewportMaximum&&!this.options.maximum||(this.viewportMinimum=this.minimum= +(this.options.viewportMaximum||this.options.maximum)/Math.pow(this.logarithmBase,2*Math.ceil(this.interval))):this.viewportMaximum=this.maximum=this.options.viewportMinimum||this.options.minimum);c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval);this.range=this.viewportMaximum/this.viewportMinimum;this.noTicks=a;if(!this.options.interval&&this.rangethis.viewportMaximum||3>a?2:3)){for(d=Math.floor(this.viewportMinimum/ +b+0.5)*b;dthis.interval&&(this.interval=b,c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval))),this.equidistantInterval=!0,this.intervalStartPosition=c;if(!this.valueFormatString&&(this.valueFormatString="#,##0.##",1>this.viewportMinimum)){d=Math.floor(Math.abs(Math.log(this.viewportMinimum)/ +Math.LN10))+2;if(isNaN(d)||!isFinite(d))d=2;if(2a&&(c+=Math.floor(Math.abs(Math.log(a)/Math.LN10)),isNaN(c)||!isFinite(c))&&(c=d);for(var e=0;eb?1>=c?1:5>=c?5:10:Math.max(Math.floor(c),1);return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.getNiceNumber= +function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=d?1.5>c?1:3>c?2:7>c?5:10:1>=c?1:2>=c?2:5>=c?5:10;return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.prototype.getLabelStartPoint=function(){var a=S[this.intervalType+"Duration"]*this.interval,a=new Date(Math.floor(this.viewportMinimum/a)*a);if("millisecond"!==this.intervalType)if("second"===this.intervalType)0=a||"bottom"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(c,l),this.ctx.lineTo(m,l),this.ctx.lineTo(m,e);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(l-h)/a/3;for(var n=0;n=a||"right"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(m,e),this.ctx.lineTo(m,l), +this.ctx.lineTo(c,l);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(m-k)/a/3;for(n=0;nthis.parent.range?2:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range? +1:0):50this.parent.range?2:10>this.parent.range?1:0);this.valueFormatString=z.generateValueFormatString(this.parent.range,h)}var l=null===this.opacity?1:this.opacity,h=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness),p=this.chart.overlaidCanvasCtx,q=p.globalAlpha;p.globalAlpha=l;p.beginPath();p.strokeStyle=this.color;p.lineWidth=h;p.save();this.labelFontSize= +u(this.options.labelFontSize)?this.parent.labelFontSize:this.labelFontSize;if("left"===this.parent._position||"right"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?this.parent.bounds.x2-this.parent.bounds.x1:this.labelMaxWidth,this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?3*this.chart.height:2*this.labelFontSize;else if("top"===this.parent._position||"bottom"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?3*this.chart.width:this.labelMaxWidth, +this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?this.parent.bounds.height:2*this.labelFontSize;0this.chart.bounds.x2?l.x=this.chart.bounds.x2-l.width:l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}}else if("bottom"===this.parent._position||"top"===this.parent._position){n=this.parent.convertPixelToValue({x:a});for(r=0;rthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"=== +this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}m=null;("bottom"===this.parent._position||"top"===this.parent._position)&&(b>=this.parent.convertValueToPixel(this.parent.viewportMinimum)&&c<=this.parent.convertValueToPixel(this.parent.viewportMaximum))&&(0=this.parent.convertValueToPixel(this.parent.viewportMaximum)&& +e<=this.parent.convertValueToPixel(this.parent.viewportMinimum))&&(0this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x1-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}else{if("bottom"===this.parent._position||"top"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)? +ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label,l.x=b-l.measureText().width/2,l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width),l.xthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2),"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2);0(new Date).getTime()-this._lastUpdated||(this._lastUpdated=(new Date).getTime(), +this.chart.resetOverlayedCanvas(),this._updateToolTip(a,d))};$.prototype._updateToolTip=function(a,d,b){b="undefined"===typeof b?!0:b;this.container||this._initialize();this.enabled||this.hide();if(!this.chart.disableToolTip){if("undefined"===typeof a||"undefined"===typeof d){if(isNaN(this._prevX)||isNaN(this._prevY))return;a=this._prevX;d=this._prevY}else this._prevX=a,this._prevY=d;var c=null,e=null,g=[],k=0;if(this.shared&&this.enabled&&"none"!==this.chart.plotInfo.axisPlacement){if("xySwapped"=== +this.chart.plotInfo.axisPlacement){var l=[];if(this.chart.axisX)for(var p=0;ph.dataSeries.axisY.viewportMaximum&&b++;b-h.dataPoint.y.length&&g.push(h)}else"column"===e.type||"bar"===e.type?0>h.dataPoint.y?0>h.dataSeries.axisY.viewportMinimum&&h.dataSeries.axisY.viewportMaximum>=h.dataPoint.y&&g.push(h):h.dataSeries.axisY.viewportMinimum<=h.dataPoint.y&&0<=h.dataSeries.axisY.viewportMaximum&&g.push(h):"bubble"===e.type?(b=this.chart._eventManager.objectMap[e.dataPointIds[h.index]].size/2,h.dataPoint.y>= +h.dataSeries.axisY.viewportMinimum-b&&h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum+b&&g.push(h)):"waterfall"===e.type?(b=0,h.cumulativeSumYStartValueh.dataSeries.axisY.viewportMaximum&&b++,h.cumulativeSumh.dataSeries.axisY.viewportMaximum&&b++,2>b&&-2=h.dataSeries.axisY.viewportMinimum&& +h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum)&&g.push(h);else g.push(h)}}if(0a&&(a+=this.container.clientWidth+20);a+this.container.clientWidth> +Math.max(this.chart.container.clientWidth,this.chart.width)&&(a=Math.max(0,Math.max(this.chart.container.clientWidth,this.chart.width)-this.container.clientWidth));d=1!==g.length||this.shared||"line"!==g[0].dataSeries.type&&"stepLine"!==g[0].dataSeries.type&&"spline"!==g[0].dataSeries.type&&"area"!==g[0].dataSeries.type&&"stepArea"!==g[0].dataSeries.type&&"splineArea"!==g[0].dataSeries.type?"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"=== +g[0].dataSeries.type?g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x):d:g[0].dataSeries.axisY.convertValueToPixel(g[0].dataPoint.y);d=-d+10;0":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content? +this.content:"{name}:  {y}",p=b.axisXIndex):"bubble"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y},   {z}"): +"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y[0]}, {y[1]}"):"candlestick"=== +b.type||"ohlc"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Open:   {y[0]}
High:    {y[1]}
Low:   {y[2]}
Close:   {y[3]}"):"boxAndWhisker"=== +b.type&&(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"), +null===d&&(d=""),!0===this.reversed?(d=this.chart.replaceKeywordsWithValue(g,c,b,e)+d,l"+d)):(d+=this.chart.replaceKeywordsWithValue(g,c,b,e),l")));null!==d&&(d=h+d)}else{b=a[0].dataSeries;c=a[0].dataPoint;e=a[0].index;if(null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent)return null;"line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"===b.type||"splineArea"===b.type||"column"=== +b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y}":"bubble"===b.type?g=c.toolTipContent? +c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y},   {z}":"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.name?"{name}:  ":c.label?"{label}:  ":"")+"{y}":"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+" :  {y[0]},  {y[1]}": +"candlestick"===b.type||"ohlc"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Open:   {y[0]}
High:    {y[1]}
Low:     {y[2]}
Close:   {y[3]}":"boxAndWhisker"===b.type&&(g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent: +this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"); +null===d&&(d="");d+=this.chart.replaceKeywordsWithValue(g,c,b,e)}return d};$.prototype.enableAnimation=function(){if(!this.container.style.WebkitTransition){var a=this.getContainerTransition(this.containerTransitionDuration);this.container.style.WebkitTransition=a;this.container.style.MsTransition=a;this.container.style.transition=a;this.container.style.MozTransition=this.mozContainerTransition}};$.prototype.disableAnimation=function(){this.container.style.WebkitTransition&&(this.container.style.WebkitTransition= +"",this.container.style.MozTransition="",this.container.style.MsTransition="",this.container.style.transition="")};$.prototype.hide=function(a){this.container&&(this.container.style.display="none",this.currentSeriesIndex=-1,this._prevY=this._prevX=NaN,("undefined"===typeof a||a)&&this.chart.resetOverlayedCanvas())};$.prototype.show=function(a,d,b){this._updateToolTip(a,d,"undefined"===typeof b?!1:b)};$.prototype.fixMozTransitionDelay=function(a,d){if(20c&&a.push(d),d.animationCallback(c),1<=c&&d.onComplete)d.onComplete();this.animations=a;0g;g++)for(var e=0;3>e;e++){for(var f=0,d=0;3>d;d++)f+=a[g][d]*b[d][e];c[g][e]=f}return c}function P(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX= +a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha;b.font=a.font;b.textAlign=a.textAlign;b.textBaseline=a.textBaseline;b.arcScaleX_=a.arcScaleX_;b.arcScaleY_=a.arcScaleY_;b.lineScale_=a.lineScale_}function Q(a){var b=a.indexOf("(",3),c=a.indexOf(")",b+1),b=a.substring(b+1,c).split(",");if(4!=b.length||"a"!=a.charAt(3))b[3]=1;return b}function E(a,b,c){return Math.min(c,Math.max(b,a))}function F(a,b,c){0>c&&c++;16*c?a+6*(b-a)*c: +1>2*c?b:2>3*c?a+6*(b-a)*(2/3-c):a}function G(a){if(a in H)return H[a];var b,c=1;a=String(a);if("#"==a.charAt(0))b=a;else if(/^rgb/.test(a)){c=Q(a);b="#";for(var g,e=0;3>e;e++)g=-1!=c[e].indexOf("%")?Math.floor(255*(parseFloat(c[e])/100)):+c[e],b+=v[E(g,0,255)];c=+c[3]}else if(/^hsl/.test(a)){e=c=Q(a);b=parseFloat(e[0])/360%360;0>b&&b++;g=E(parseFloat(e[1])/100,0,1);e=E(parseFloat(e[2])/100,0,1);if(0==g)g=e=b=e;else{var f=0.5>e?e*(1+g):e+g-e*g,d=2*e-f;g=F(d,f,b+1/3);e=F(d,f,b);b=F(d,f,b-1/3)}b="#"+ +v[Math.floor(255*g)]+v[Math.floor(255*e)]+v[Math.floor(255*b)];c=c[3]}else b=Z[a]||a;return H[a]={color:b,alpha:c}}function C(a){this.m_=D();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=1*q;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=a;var b="width:"+a.clientWidth+"px;height:"+a.clientHeight+"px;overflow:hidden;position:absolute", +c=a.ownerDocument.createElement("div");c.style.cssText=b;a.appendChild(c);b=c.cloneNode(!1);b.style.backgroundColor="red";b.style.filter="alpha(opacity=0)";a.appendChild(b);this.element_=c;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}function R(a,b,c,g){a.currentPath_.push({type:"bezierCurveTo",cp1x:b.x,cp1y:b.y,cp2x:c.x,cp2y:c.y,x:g.x,y:g.y});a.currentX_=g.x;a.currentY_=g.y}function S(a,b){var c=G(a.strokeStyle),g=c.color,c=c.alpha*a.globalAlpha,e=a.lineScale_*a.lineWidth;1>e&&(c*=e);b.push("')}function T(a,b,c,g){var e=a.fillStyle,f=a.arcScaleX_,d=a.arcScaleY_,k=g.x-c.x,n=g.y-c.y;if(e instanceof w){var h=0,l=g=0,u=0,m=1;if("gradient"==e.type_){h=e.x1_/f;c=e.y1_/d;var p=s(a,e.x0_/f,e.y0_/d),h=s(a,h,c),h=180*Math.atan2(h.x-p.x,h.y-p.y)/Math.PI;0>h&&(h+=360);1E-6>h&&(h=0)}else p=s(a,e.x0_,e.y0_),g=(p.x-c.x)/k,l=(p.y-c.y)/n,k/=f*q, +n/=d*q,m=x.max(k,n),u=2*e.r0_/m,m=2*e.r1_/m-u;f=e.colors_;f.sort(function(a,b){return a.offset-b.offset});d=f.length;p=f[0].color;c=f[d-1].color;k=f[0].alpha*a.globalAlpha;a=f[d-1].alpha*a.globalAlpha;for(var n=[],r=0;r')}else e instanceof +I?k&&n&&b.push("'):(e=G(a.fillStyle),b.push(''))}function s(a,b,c){a=a.m_;return{x:q*(b*a[0][0]+c*a[1][0]+a[2][0])-r,y:q*(b*a[0][1]+c*a[1][1]+a[2][1])-r}}function z(a,b,c){isFinite(b[0][0])&&(isFinite(b[0][1])&&isFinite(b[1][0])&&isFinite(b[1][1])&&isFinite(b[2][0])&&isFinite(b[2][1]))&&(a.m_=b,c&&(a.lineScale_=aa(ba(b[0][0]*b[1][1]-b[0][1]* +b[1][0]))))}function w(a){this.type_=a;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}function I(a,b){if(!a||1!=a.nodeType||"IMG"!=a.tagName)throw new A("TYPE_MISMATCH_ERR");if("complete"!=a.readyState)throw new A("INVALID_STATE_ERR");switch(b){case "repeat":case null:case "":this.repetition_="repeat";break;case "repeat-x":case "repeat-y":case "no-repeat":this.repetition_=b;break;default:throw new A("SYNTAX_ERR");}this.src_=a.src;this.width_=a.width;this.height_=a.height} +function A(a){this.code=this[a];this.message=a+": DOM Exception "+this.code}var x=Math,k=x.round,J=x.sin,K=x.cos,ba=x.abs,aa=x.sqrt,q=10,r=q/2;navigator.userAgent.match(/MSIE ([\d.]+)?/);var M=Array.prototype.slice;O(document);var U={init:function(a){a=a||document;a.createElement("canvas");a.attachEvent("onreadystatechange",W(this.init_,this,a))},init_:function(a){a=a.getElementsByTagName("canvas");for(var b=0;bd;d++)for(var B=0;16>B;B++)v[16*d+B]=d.toString(16)+B.toString(16);var Z={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC", +bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000", +darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082", +ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA", +mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5", +peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"}, +H={},L={},$={butt:"flat",round:"round"},d=C.prototype;d.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null);this.element_.innerHTML=""};d.beginPath=function(){this.currentPath_=[]};d.moveTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.lineTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.bezierCurveTo= +function(a,b,c,g,e,f){e=s(this,e,f);a=s(this,a,b);c=s(this,c,g);R(this,a,c,e)};d.quadraticCurveTo=function(a,b,c,g){a=s(this,a,b);c=s(this,c,g);g={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)};R(this,g,{x:g.x+(c.x-this.currentX_)/3,y:g.y+(c.y-this.currentY_)/3},c)};d.arc=function(a,b,c,g,e,f){c*=q;var d=f?"at":"wa",k=a+K(g)*c-r,n=b+J(g)*c-r;g=a+K(e)*c-r;e=b+J(e)*c-r;k!=g||f||(k+=0.125);a=s(this,a,b);k=s(this,k,n);g=s(this,g,e);this.currentPath_.push({type:d, +x:a.x,y:a.y,radius:c,xStart:k.x,yStart:k.y,xEnd:g.x,yEnd:g.y})};d.rect=function(a,b,c,g){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath()};d.strokeRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath();this.stroke();this.currentPath_=e};d.fillRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+ +c,b+g);this.lineTo(a,b+g);this.closePath();this.fill();this.currentPath_=e};d.createLinearGradient=function(a,b,c,g){var e=new w("gradient");e.x0_=a;e.y0_=b;e.x1_=c;e.y1_=g;return e};d.createRadialGradient=function(a,b,c,g,e,f){var d=new w("gradientradial");d.x0_=a;d.y0_=b;d.r0_=c;d.x1_=g;d.y1_=e;d.r1_=f;return d};d.drawImage=function(a,b){var c,g,e,d,r,y,n,h;e=a.runtimeStyle.width;d=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var l=a.width,u=a.height;a.runtimeStyle.width= +e;a.runtimeStyle.height=d;if(3==arguments.length)c=arguments[1],g=arguments[2],r=y=0,n=e=l,h=d=u;else if(5==arguments.length)c=arguments[1],g=arguments[2],e=arguments[3],d=arguments[4],r=y=0,n=l,h=u;else if(9==arguments.length)r=arguments[1],y=arguments[2],n=arguments[3],h=arguments[4],c=arguments[5],g=arguments[6],e=arguments[7],d=arguments[8];else throw Error("Invalid number of arguments");var m=s(this,c,g),p=[];p.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))};d.stroke=function(a){var b=[];b.push("d.x)d.x=f.x;if(null==c.y||f.yd.y)d.y=f.y}}b.push(' ">');a?T(this,b,c,d):S(this,b);b.push("");this.element_.insertAdjacentHTML("beforeEnd",b.join(""))};d.fill=function(){this.stroke(!0)};d.closePath=function(){this.currentPath_.push({type:"close"})};d.save=function(){var a= +{};P(this,a);this.aStack_.push(a);this.mStack_.push(this.m_);this.m_=t(D(),this.m_)};d.restore=function(){this.aStack_.length&&(P(this.aStack_.pop(),this),this.m_=this.mStack_.pop())};d.translate=function(a,b){z(this,t([[1,0,0],[0,1,0],[a,b,1]],this.m_),!1)};d.rotate=function(a){var b=K(a);a=J(a);z(this,t([[b,a,0],[-a,b,0],[0,0,1]],this.m_),!1)};d.scale=function(a,b){this.arcScaleX_*=a;this.arcScaleY_*=b;z(this,t([[a,0,0],[0,b,0],[0,0,1]],this.m_),!0)};d.transform=function(a,b,c,d,e,f){z(this,t([[a, +b,0],[c,d,0],[e,f,1]],this.m_),!0)};d.setTransform=function(a,b,c,d,e,f){z(this,[[a,b,0],[c,d,0],[e,f,1]],!0)};d.drawText_=function(a,b,c,d,e){var f=this.m_;d=0;var r=1E3,t=0,n=[],h;h=this.font;if(L[h])h=L[h];else{var l=document.createElement("div").style;try{l.font=h}catch(u){}h=L[h]={style:l.fontStyle||"normal",variant:l.fontVariant||"normal",weight:l.fontWeight||"normal",size:l.fontSize||10,family:l.fontFamily||"sans-serif"}}var l=h,m=this.element_;h={};for(var p in l)h[p]=l[p];p=parseFloat(m.currentStyle.fontSize); +m=parseFloat(l.size);"number"==typeof l.size?h.size=l.size:-1!=l.size.indexOf("px")?h.size=m:-1!=l.size.indexOf("em")?h.size=p*m:-1!=l.size.indexOf("%")?h.size=p/100*m:-1!=l.size.indexOf("pt")?h.size=m/0.75:h.size=p;h.size*=0.981;p=h.style+" "+h.variant+" "+h.weight+" "+h.size+"px "+h.family;m=this.element_.currentStyle;l=this.textAlign.toLowerCase();switch(l){case "left":case "center":case "right":break;case "end":l="ltr"==m.direction?"right":"left";break;case "start":l="rtl"==m.direction?"right": +"left";break;default:l="left"}switch(this.textBaseline){case "hanging":case "top":t=h.size/1.75;break;case "middle":break;default:case null:case "alphabetic":case "ideographic":case "bottom":t=-h.size/2.25}switch(l){case "right":d=1E3;r=0.05;break;case "center":d=r=500}b=s(this,b+0,c+t);n.push('');e?S(this,n):T(this,n,{x:-d,y:0}, +{x:r,y:h.size});e=f[0][0].toFixed(3)+","+f[1][0].toFixed(3)+","+f[0][1].toFixed(3)+","+f[1][1].toFixed(3)+",0,0";b=k(b.x/q)+","+k(b.y/q);n.push('','','');this.element_.insertAdjacentHTML("beforeEnd",n.join(""))};d.fillText=function(a,b,c,d){this.drawText_(a,b,c,d,!1)};d.strokeText=function(a, +b,c,d){this.drawText_(a,b,c,d,!0)};d.measureText=function(a){this.textMeasureEl_||(this.element_.insertAdjacentHTML("beforeEnd",''),this.textMeasureEl_=this.element_.lastChild);var b=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(b.createTextNode(a));return{width:this.textMeasureEl_.offsetWidth}};d.clip=function(){}; +d.arcTo=function(){};d.createPattern=function(a,b){return new I(a,b)};w.prototype.addColorStop=function(a,b){b=G(b);this.colors_.push({offset:a,color:b.color,alpha:b.alpha})};d=A.prototype=Error();d.INDEX_SIZE_ERR=1;d.DOMSTRING_SIZE_ERR=2;d.HIERARCHY_REQUEST_ERR=3;d.WRONG_DOCUMENT_ERR=4;d.INVALID_CHARACTER_ERR=5;d.NO_DATA_ALLOWED_ERR=6;d.NO_MODIFICATION_ALLOWED_ERR=7;d.NOT_FOUND_ERR=8;d.NOT_SUPPORTED_ERR=9;d.INUSE_ATTRIBUTE_ERR=10;d.INVALID_STATE_ERR=11;d.SYNTAX_ERR=12;d.INVALID_MODIFICATION_ERR= +13;d.NAMESPACE_ERR=14;d.INVALID_ACCESS_ERR=15;d.VALIDATION_ERR=16;d.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=U;CanvasRenderingContext2D=C;CanvasGradient=w;CanvasPattern=I;DOMException=A}(); +/*eslint-enable*/ +/*jshint ignore:end*/ \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.react.js b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.react.js new file mode 100644 index 00000000..69c7951e --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.react.js @@ -0,0 +1,48 @@ +var React = require('react'); +var CanvasJS = require('./canvasjs.min'); +CanvasJS = CanvasJS.Chart ? CanvasJS : window.CanvasJS; + +class CanvasJSChart extends React.Component { + static _cjsContainerId = 0 + constructor(props) { + super(props); + this.options = props.options ? props.options : {}; + this.containerProps = props.containerProps ? props.containerProps : {width: "100%", position: "relative"}; + this.containerProps.height = props.containerProps && props.containerProps.height ? props.containerProps.height : this.options.height ? this.options.height + "px" : "400px"; + this.chartContainerId = "canvasjs-react-chart-container-" + CanvasJSChart._cjsContainerId++; + } + componentDidMount() { + //Create Chart and Render + this.chart = new CanvasJS.Chart(this.chartContainerId, this.options); + this.chart.render(); + + if(this.props.onRef) + this.props.onRef(this.chart); + } + shouldComponentUpdate(nextProps, nextState){ + //Check if Chart-options has changed and determine if component has to be updated + return !(nextProps.options === this.options); + } + componentDidUpdate() { + //Update Chart Options & Render + this.chart.options = this.props.options; + this.chart.render(); + } + componentWillUnmount() { + //Destroy chart and remove reference + this.chart.destroy(); + if(this.props.onRef) + this.props.onRef(undefined); + } + render() { + //return React.createElement('div', { id: this.chartContainerId, style: this.containerProps }); + return
+ } +} + +var CanvasJSReact = { + CanvasJSChart: CanvasJSChart, + CanvasJS: CanvasJS +}; + +export default CanvasJSReact; \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html new file mode 100644 index 00000000..ef650afe --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html new file mode 100644 index 00000000..57e08a55 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html @@ -0,0 +1,50 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html new file mode 100644 index 00000000..3cb8789c --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html @@ -0,0 +1,51 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html new file mode 100644 index 00000000..34e46259 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html @@ -0,0 +1,72 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html new file mode 100644 index 00000000..4f6e15c6 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html @@ -0,0 +1,233 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html new file mode 100644 index 00000000..50b7d737 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html @@ -0,0 +1,108 @@ + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html new file mode 100644 index 00000000..cd5dd33e --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html @@ -0,0 +1,46 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html new file mode 100644 index 00000000..0b69ea91 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html @@ -0,0 +1,46 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html new file mode 100644 index 00000000..895c4e28 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html @@ -0,0 +1,128 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html new file mode 100644 index 00000000..4e292db0 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html @@ -0,0 +1,87 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html new file mode 100644 index 00000000..79a3d417 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html @@ -0,0 +1,40 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html new file mode 100644 index 00000000..a42de04d --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html @@ -0,0 +1,57 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html new file mode 100644 index 00000000..17505925 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html @@ -0,0 +1,115 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html new file mode 100644 index 00000000..f156e2f8 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html @@ -0,0 +1,94 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html new file mode 100644 index 00000000..2b0a5ed9 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html @@ -0,0 +1,62 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html new file mode 100644 index 00000000..7be550ab --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html new file mode 100644 index 00000000..b5b8e010 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html @@ -0,0 +1,102 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html new file mode 100644 index 00000000..9bfb56e5 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html @@ -0,0 +1,56 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html new file mode 100644 index 00000000..9a6a355b --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html @@ -0,0 +1,71 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html new file mode 100644 index 00000000..8b620e23 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html @@ -0,0 +1,53 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html new file mode 100644 index 00000000..4a3430ac --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html @@ -0,0 +1,107 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html new file mode 100644 index 00000000..e4626cc0 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html @@ -0,0 +1,125 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html new file mode 100644 index 00000000..24a15c69 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html @@ -0,0 +1,46 @@ + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html new file mode 100644 index 00000000..d21bd730 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html @@ -0,0 +1,44 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html new file mode 100644 index 00000000..c25f9ae8 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html @@ -0,0 +1,257 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html new file mode 100644 index 00000000..7c4d43d0 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html @@ -0,0 +1,171 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html new file mode 100644 index 00000000..d6d67a13 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html @@ -0,0 +1,67 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html new file mode 100644 index 00000000..34c7c5bf --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html @@ -0,0 +1,123 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html new file mode 100644 index 00000000..3cdb8259 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html @@ -0,0 +1,100 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html new file mode 100644 index 00000000..7c1afce1 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html @@ -0,0 +1,55 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html new file mode 100644 index 00000000..dc1a4b7a --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html @@ -0,0 +1,57 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html new file mode 100644 index 00000000..f721ee43 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html @@ -0,0 +1,50 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html new file mode 100644 index 00000000..5e0ce683 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html @@ -0,0 +1,73 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html new file mode 100644 index 00000000..1bd75401 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html @@ -0,0 +1,127 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html new file mode 100644 index 00000000..54e2bece --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html @@ -0,0 +1,113 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html new file mode 100644 index 00000000..e5408a62 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html @@ -0,0 +1,72 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html new file mode 100644 index 00000000..280a052a --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html @@ -0,0 +1,51 @@ + + + + + + + +
+ + + diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html new file mode 100644 index 00000000..450b4a57 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html @@ -0,0 +1,55 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html new file mode 100644 index 00000000..76483f3a --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html @@ -0,0 +1,120 @@ + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html new file mode 100644 index 00000000..7af19276 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html @@ -0,0 +1,78 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html new file mode 100644 index 00000000..90e29ed7 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html @@ -0,0 +1,68 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html new file mode 100644 index 00000000..7fb51f0a --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html @@ -0,0 +1,42 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html new file mode 100644 index 00000000..5e7f2a0b --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html new file mode 100644 index 00000000..d12b9cf5 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html new file mode 100644 index 00000000..982c84d7 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html @@ -0,0 +1,83 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html new file mode 100644 index 00000000..db126063 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html new file mode 100644 index 00000000..69e6bb35 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html @@ -0,0 +1,104 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html new file mode 100644 index 00000000..a90e357d --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html @@ -0,0 +1,89 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html new file mode 100644 index 00000000..3e473fbf --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html @@ -0,0 +1,98 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html new file mode 100644 index 00000000..4a8b95f7 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html @@ -0,0 +1,49 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html new file mode 100644 index 00000000..2482015d --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html @@ -0,0 +1,49 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html new file mode 100644 index 00000000..a0fe8f0f --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html @@ -0,0 +1,76 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html new file mode 100644 index 00000000..e53506c7 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html @@ -0,0 +1,126 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html new file mode 100644 index 00000000..39e9e1b9 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html @@ -0,0 +1,103 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html new file mode 100644 index 00000000..f377f681 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html @@ -0,0 +1,113 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html new file mode 100644 index 00000000..bed3a0ab --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html @@ -0,0 +1,51 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html new file mode 100644 index 00000000..cf00ff2b --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html @@ -0,0 +1,48 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html new file mode 100644 index 00000000..7ad45521 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html @@ -0,0 +1,40 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html new file mode 100644 index 00000000..7e9b4297 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html @@ -0,0 +1,55 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html new file mode 100644 index 00000000..b5d9fb7b --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html @@ -0,0 +1,52 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html new file mode 100644 index 00000000..8aa524e4 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html @@ -0,0 +1,52 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html new file mode 100644 index 00000000..3b475ef7 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html @@ -0,0 +1,54 @@ + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html new file mode 100644 index 00000000..770bc9dc --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html @@ -0,0 +1,51 @@ + + + + + + + +
+ +
+ + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html new file mode 100644 index 00000000..e1bd01bb --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html @@ -0,0 +1,52 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html new file mode 100644 index 00000000..7dd8a3e7 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html @@ -0,0 +1,36 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html new file mode 100644 index 00000000..c84b2a9a --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html @@ -0,0 +1,39 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html new file mode 100644 index 00000000..e39048c9 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html @@ -0,0 +1,40 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html new file mode 100644 index 00000000..b9053b27 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html @@ -0,0 +1,40 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html new file mode 100644 index 00000000..72db3b31 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html @@ -0,0 +1,108 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html new file mode 100644 index 00000000..35871f64 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html @@ -0,0 +1,90 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html new file mode 100644 index 00000000..3cca87c6 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html new file mode 100644 index 00000000..ee555661 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html @@ -0,0 +1,54 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html new file mode 100644 index 00000000..580047d0 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html @@ -0,0 +1,59 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html new file mode 100644 index 00000000..2670b874 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html @@ -0,0 +1,60 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html new file mode 100644 index 00000000..a0980da9 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html @@ -0,0 +1,69 @@ + + + + + + + +
+ + + diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html new file mode 100644 index 00000000..7a3212ee --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html @@ -0,0 +1,73 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html new file mode 100644 index 00000000..eb0a7abd --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html @@ -0,0 +1,129 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html new file mode 100644 index 00000000..39a28571 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html @@ -0,0 +1,63 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html new file mode 100644 index 00000000..c38a46af --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html new file mode 100644 index 00000000..c7a16883 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html @@ -0,0 +1,81 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html new file mode 100644 index 00000000..327b5f6e --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html new file mode 100644 index 00000000..1d9c8738 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html @@ -0,0 +1,122 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html new file mode 100644 index 00000000..01b9a6aa --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html @@ -0,0 +1,54 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html new file mode 100644 index 00000000..ddb9026b --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html new file mode 100644 index 00000000..b6f1cc72 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html @@ -0,0 +1,73 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html new file mode 100644 index 00000000..24674cea --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html @@ -0,0 +1,106 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html new file mode 100644 index 00000000..fd35f556 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html @@ -0,0 +1,68 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html new file mode 100644 index 00000000..393d6af1 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html @@ -0,0 +1,66 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html new file mode 100644 index 00000000..be32272f --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html @@ -0,0 +1,108 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html new file mode 100644 index 00000000..392bb3c1 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html @@ -0,0 +1,54 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html new file mode 100644 index 00000000..988c2219 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html new file mode 100644 index 00000000..2dbd00d6 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html @@ -0,0 +1,113 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html new file mode 100644 index 00000000..d6d42070 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html @@ -0,0 +1,42 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html new file mode 100644 index 00000000..c139f406 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html @@ -0,0 +1,49 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html new file mode 100644 index 00000000..31523b13 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html @@ -0,0 +1,55 @@ + + + + + + + + +
+
+
+ + + + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html new file mode 100644 index 00000000..b35ebf4b --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html @@ -0,0 +1,98 @@ + + + + + + + + + +
+ +
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html new file mode 100644 index 00000000..a3e82d02 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html @@ -0,0 +1,41 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/instruction.txt b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/instruction.txt new file mode 100644 index 00000000..93eb448f --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/instruction.txt @@ -0,0 +1,4 @@ +For standalone version include canvasjs.min.js +For jQuery version include jquery.canvasjs.min.js + +** DO NOT include both the files ** \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js new file mode 100644 index 00000000..8785b495 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js @@ -0,0 +1,922 @@ +/* + CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ + Copyright 2018 fenopix + + --------------------- License Information -------------------- + CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. + https://canvasjs.com/license/ + +*/ +/*eslint-disable*/ +/*jshint ignore:start*/ +(function(){function qa(k,p){k.prototype=eb(p.prototype);k.prototype.constructor=k;k.base=p.prototype}function eb(k){function p(){}p.prototype=k;return new p}function Ya(k,p,D){"millisecond"===D?k.setMilliseconds(k.getMilliseconds()+1*p):"second"===D?k.setSeconds(k.getSeconds()+1*p):"minute"===D?k.setMinutes(k.getMinutes()+1*p):"hour"===D?k.setHours(k.getHours()+1*p):"day"===D?k.setDate(k.getDate()+1*p):"week"===D?k.setDate(k.getDate()+7*p):"month"===D?k.setMonth(k.getMonth()+1*p):"year"===D&&k.setFullYear(k.getFullYear()+ +1*p);return k}function $(k,p){var D=!1;0>k&&(D=!0,k*=-1);k=""+k;for(p=p?p:1;k.length
Please right click on the image and save it to your device
"), +p.document.close()}}}function N(k){var p=((k&16711680)>>16).toString(16),D=((k&65280)>>8).toString(16);k=((k&255)>>0).toString(16);p=2>p.length?"0"+p:p;D=2>D.length?"0"+D:D;k=2>k.length?"0"+k:k;return"#"+p+D+k}function fb(k,p){var D=this.length>>>0,r=Number(p)||0,r=0>r?Math.ceil(r):Math.floor(r);for(0>r&&(r+=D);rD;D++)if(k[D]!==k[D+4]|k[D]!==k[D+8]|k[D]!==k[D+12]){p=!1;break}return p?k[0]<<16|k[1]<<8|k[2]:0}function na(k,p,D){return k in p?p[k]:D[k]}function Oa(k,p,D){if(r&&bb){var u=k.getContext("2d");Pa=u.webkitBackingStorePixelRatio|| +u.mozBackingStorePixelRatio||u.msBackingStorePixelRatio||u.oBackingStorePixelRatio||u.backingStorePixelRatio||1;W=Ua/Pa;k.width=p*W;k.height=D*W;Ua!==Pa&&(k.style.width=p+"px",k.style.height=D+"px",u.scale(W,W))}else k.width=p,k.height=D}function hb(k){if(!ib){var p=!1,D=!1;"undefined"===typeof ra.Chart.creditHref?(k.creditHref=ja("iuuqr;..b`ow`rkr/bnl."),k.creditText=ja("B`ow`rKR/bnl")):(p=k.updateOption("creditText"),D=k.updateOption("creditHref"));if(k.creditHref&&k.creditText){k._creditLink|| +(k._creditLink=document.createElement("a"),k._creditLink.setAttribute("class","canvasjs-chart-credit"),k._creditLink.setAttribute("title","JavaScript Charts"),k._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:2px;top:"+(k.height-14)+"px;color:dimgrey;text-decoration:none;font-size:11px;font-family: Calibri, Lucida Grande, Lucida Sans Unicode, Arial, sans-serif"),k._creditLink.setAttribute("tabIndex",-1),k._creditLink.setAttribute("target","_blank"));if(0===k.renderCount|| +p||D)k._creditLink.setAttribute("href",k.creditHref),k._creditLink.innerHTML=k.creditText;k._creditLink&&k.creditHref&&k.creditText?(k._creditLink.parentElement||k._canvasJSContainer.appendChild(k._creditLink),k._creditLink.style.top=k.height-14+"px"):k._creditLink.parentElement&&k._canvasJSContainer.removeChild(k._creditLink)}}}function ta(k,p){Ja&&(this.canvasCount|=0,window.console.log(++this.canvasCount));var D=document.createElement("canvas");D.setAttribute("class","canvasjs-chart-canvas");Oa(D, +k,p);r||"undefined"===typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(D);return D}function sa(k,p,D){for(var r in D)p.style[r]=D[r]}function ua(k,p,D){p.getAttribute("state")||(p.style.backgroundColor=k.toolbar.backgroundColor,p.style.color=k.toolbar.fontColor,p.style.border="none",sa(k,p,{WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",userSelect:"none"}));p.getAttribute("state")!==D&&(p.setAttribute("state",D),p.setAttribute("type","button"),sa(k,p,{padding:"5px 12px", +cursor:"pointer","float":"left",width:"40px",height:"25px",outline:"0px",verticalAlign:"baseline",lineHeight:"0"}),p.setAttribute("title",k._cultureInfo[D+"Text"]),p.innerHTML=""+k._cultureInfo[D+"Text"]+"")}function Qa(){for(var k=null,p=0;pa?"a":"p";case "tt":return 12>a?"am":"pm";case "T":return 12>a?"A": +"P";case "TT":return 12>a?"AM":"PM";case "K":return S?"UTC":(String(z).match(H)||[""]).pop().replace(F,"");case "z":return(0k?!0:!1;u&&(k*=-1);var v=r?r.decimalSeparator:".",H=r?r.digitGroupSeparator: +",",F="";p=String(p);var F=1,z=r="",E=-1,L=[],R=[],I=0,N=0,S=0,O=!1,U=0,z=p.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|\u2030|./g);p=null;for(var Q=0;z&&QE)E=Q;else{if("%"===p)F*=100;else if("\u2030"===p){F*=1E3;continue}else if(","===p[0]&&"."===p[p.length-1]){F/=Math.pow(1E3,p.length-1);E=Q+p.length-1;continue}else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||(O=!0);0>E?(L.push(p),"#"===p||"0"===p?I++:","===p&&S++):(R.push(p),"#"!==p&&"0"!==p||N++)}O&&(p=Math.floor(k), +z=-Math.floor(Math.log(k)/Math.LN10+1),U=0===k?0:0===p?-(I+z):String(p).length-I,F/=Math.pow(10,U));0>E&&(E=Q);F=(k*F).toFixed(N);p=F.split(".");F=(p[0]+"").split("");k=(p[1]+"").split("");F&&"0"===F[0]&&F.shift();for(O=z=Q=N=E=0;0U?p.replace("+","").replace("-",""):p.replace("-",""),r+=p.replace(/[0]+/,function(k){return $(U,k.length)}));H="";for(L=!1;0U?p.replace("+","").replace("-",""):p.replace("-",""),H+=p.replace(/[0]+/,function(k){return $(U,k.length)}));r+=(L?v:"")+H;return u?"-"+r:r},Ra=function(k){var p=0,r=0;k=k||window.event;k.offsetX||0===k.offsetX?(p=k.offsetX,r=k.offsetY):k.layerX||0==k.layerX?(p=k.layerX,r=k.layerY):(p=k.pageX-k.target.offsetLeft, +r=k.pageY-k.target.offsetTop);return{x:p,y:r}},bb=!0,Ua=window.devicePixelRatio||1,Pa=1,W=bb?Ua/Pa:1,ea=function(k,p,r,u,v,H,F,z,E,L,R,N,O){"undefined"===typeof O&&(O=1);F=F||0;z=z||"black";var I=15p)v=H-1;else break}r>p&&1H&&(F=p.pop(),u-=F.height,v=z)}this._wrappedText={lines:p,width:v,height:u};this.width=v+(this.leftPadding+this.rightPadding);this.height=u+(this.topPadding+this.bottomPadding);this.ctx.font=r};ka.prototype._getFontString=function(){var k;k=""+(this.fontStyle?this.fontStyle+" ":"");k+=this.fontWeight?this.fontWeight+" ":"";k+=this.fontSize?this.fontSize+"px ":"";var p=this.fontFamily?this.fontFamily+"":"";!r&&p&&(p=p.split(",")[0],"'"!==p[0]&&'"'!==p[0]&&(p="'"+p+"'"));return k+=p}; +qa(Va,V);qa(Aa,V);Aa.prototype.setLayout=function(){if(this.text){var k=this.dockInsidePlotArea?this.chart.plotArea:this.chart,p=k.layoutManager.getFreeSpace(),r=p.x1,v=p.y1,E=0,H=0,F=this.chart._menuButton&&this.chart.exportEnabled&&"top"===this.verticalAlign?22:0,z,I;"top"===this.verticalAlign||"bottom"===this.verticalAlign?(null===this.maxWidth&&(this.maxWidth=p.width-4-F*("center"===this.horizontalAlign?2:1)),H=0.5*p.height-this.margin-2,E=0):"center"===this.verticalAlign&&("left"===this.horizontalAlign|| +"right"===this.horizontalAlign?(null===this.maxWidth&&(this.maxWidth=p.height-4),H=0.5*p.width-this.margin-2):"center"===this.horizontalAlign&&(null===this.maxWidth&&(this.maxWidth=p.width-4),H=0.5*p.height-4));var L;u(this.padding)||"number"!==typeof this.padding?u(this.padding)||"object"!==typeof this.padding||(L=this.padding.top?this.padding.top:this.padding.bottom?this.padding.bottom:0,L+=this.padding.bottom?this.padding.bottom:this.padding.top?this.padding.top:0,L*=1.25):L=2.5*this.padding;this.wrap|| +(H=Math.min(H,Math.max(1.5*this.fontSize,this.fontSize+L)));H=new ka(this.ctx,{fontSize:this.fontSize,fontFamily:this.fontFamily,fontColor:this.fontColor,fontStyle:this.fontStyle,fontWeight:this.fontWeight,horizontalAlign:this.horizontalAlign,verticalAlign:this.verticalAlign,borderColor:this.borderColor,borderThickness:this.borderThickness,backgroundColor:this.backgroundColor,maxWidth:this.maxWidth,maxHeight:H,cornerRadius:this.cornerRadius,text:this.text,padding:this.padding,textBaseline:"top"}); +L=H.measureText();"top"===this.verticalAlign||"bottom"===this.verticalAlign?("top"===this.verticalAlign?(v=p.y1+2,I="top"):"bottom"===this.verticalAlign&&(v=p.y2-2-L.height,I="bottom"),"left"===this.horizontalAlign?r=p.x1+2:"center"===this.horizontalAlign?r=p.x1+p.width/2-L.width/2:"right"===this.horizontalAlign&&(r=p.x2-2-L.width-F),z=this.horizontalAlign,this.width=L.width,this.height=L.height):"center"===this.verticalAlign&&("left"===this.horizontalAlign?(r=p.x1+2,v=p.y2-2-(this.maxWidth/2-L.width/ +2),E=-90,I="left",this.width=L.height,this.height=L.width):"right"===this.horizontalAlign?(r=p.x2-2,v=p.y1+2+(this.maxWidth/2-L.width/2),E=90,I="right",this.width=L.height,this.height=L.width):"center"===this.horizontalAlign&&(v=k.y1+(k.height/2-L.height/2),r=k.x1+(k.width/2-L.width/2),I="center",this.width=L.width,this.height=L.height),z="center");H.x=r;H.y=v;H.angle=E;H.horizontalAlign=z;this._textBlock=H;k.layoutManager.registerSpace(I,{width:this.width+("left"===I||"right"===I?this.margin+2:0), +height:this.height+("top"===I||"bottom"===I?this.margin+2:0)});this.bounds={x1:r,y1:v,x2:r+this.width,y2:v+this.height};this.ctx.textBaseline="top"}};Aa.prototype.render=function(){this._textBlock&&this._textBlock.render(!0)};qa(Ka,V);Ka.prototype.setLayout=Aa.prototype.setLayout;Ka.prototype.render=Aa.prototype.render;Wa.prototype.get=function(k,p){var r=null;0a[g].x&&0w?{x:a[l].x+w/3,y:a[l].y+c/3}:{x:a[l].x,y:a[l].y+c/9};l=e;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[l].x-a[g].x?0.01:a[l].x-a[g].x))*(d- +1)/2+1;w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0w?{x:a[l].x-w/3,y:a[l].y-c/3}:{x:a[l].x,y:a[l].y-c/9};b[b.length]=a[e]}return b}function E(a,d,b,c,e,g,m,l,w,h){var s=0;h?(m.color=g,l.color=g):h=1;s=w?Math.abs(e-b):Math.abs(c-d);s=0this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360);this.options.scaleBreaks&&(this.scaleBreaks=new Q(this.chart, +this.options.scaleBreaks,++this.chart._eventManager.lastObjectId,this));this.stripLines=[];if(this.options.stripLines&&0=this._appliedBreaks[a+1].startValue&&(this._appliedBreaks[a].endValue=Math.max(this._appliedBreaks[a].endValue,this._appliedBreaks[a+1].endValue),window.console&&window.console.log("CanvasJS Error: Breaks "+a+" and "+(a+1)+" are overlapping."),this._appliedBreaks.splice(a,2),a--)}}function L(a,d,b,c,e,g){L.base.constructor.call(this,"Break",d,b,c,g);this.id=e;this.chart=a;this.ctx=this.chart.ctx;this.scaleBreaks=g;this.optionsName= +d;this.isOptionsInArray=!0;this.type=b.type?this.type:g.type;this.fillOpacity=u(b.fillOpacity)?g.fillOpacity:this.fillOpacity;this.lineThickness=u(b.lineThickness)?g.lineThickness:this.lineThickness;this.color=b.color?this.color:g.color;this.lineColor=b.lineColor?this.lineColor:g.lineColor;this.lineDashType=b.lineDashType?this.lineDashType:g.lineDashType;!u(this.startValue)&&this.startValue.getTime&&(this.startValue=this.startValue.getTime());!u(this.endValue)&&this.endValue.getTime&&(this.endValue= +this.endValue.getTime());"number"===typeof this.startValue&&("number"===typeof this.endValue&&this.endValue=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers);O(this._zoomButton,"mouseout",function(){d||(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(0%)", +filter:"invert(0%)"}))},this.allDOMEventHandlers)}this._resetButton||(d=!1,va(this._resetButton=document.createElement("button")),ua(this,this._resetButton,"reset"),this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor,this._toolBar.appendChild(this._resetButton),O(this._resetButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._resetButton,"click",function(){a.toolTip.hide();a.zoomEnabled||a.panEnabled?(a.zoomEnabled= +!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"),a._defaultCursor="default",a.overlaidCanvas.style.cursor=a._defaultCursor):(a.zoomEnabled=!1,a.panEnabled=!1);if(a.sessionVariables.axisX)for(var c=0;c=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers),O(this._resetButton,"mouseout",function(){d||(sa(a,a._resetButton, +{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers),this.overlaidCanvas.style.cursor=a._defaultCursor);this.zoomEnabled||this.panEnabled||(this._zoomButton?(a._zoomButton.getAttribute("state")===a._cultureInfo.zoomText?(this.panEnabled=!0,this.zoomEnabled=!1):(this.zoomEnabled=!0,this.panEnabled= +!1),Qa(a._zoomButton,a._resetButton)):(this.zoomEnabled=!0,this.panEnabled=!1))}else this.panEnabled=this.zoomEnabled=!1;this._menuButton?this.exportEnabled?Qa(this._menuButton):va(this._menuButton):this.exportEnabled&&r&&(d=!1,this._menuButton=document.createElement("button"),ua(this,this._menuButton,"menu"),this._toolBar.appendChild(this._menuButton),O(this._menuButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._menuButton,"click",function(){"none"!==a._dropdownMenu.style.display|| +a._dropDownCloseTime&&500>=(new Date).getTime()-a._dropDownCloseTime.getTime()||(a._dropdownMenu.style.display="block",a._menuButton.blur(),a._dropdownMenu.focus())},this.allDOMEventHandlers,!0),O(this._menuButton,"mouseover",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.fontColorOnHover}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers,!0), +O(this._menuButton,"mouseout",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers,!0));if(!this._dropdownMenu&&this.exportEnabled&&r){d=!1;this._dropdownMenu=document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);var b=-1!==this.theme.indexOf("dark")?"black":"#888888";this._dropdownMenu.style.cssText= +"position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 0px;top: 25px;min-width: 120px;outline: 0;font-size: 14px; font-family: Arial, Helvetica, sans-serif;padding: 5px 0px 5px 0px;text-align: left;line-height: 10px;background-color:"+this.toolbar.backgroundColor+";box-shadow: 2px 2px 10px "+b;a._dropdownMenu.style.display="none";this._toolBar.appendChild(this._dropdownMenu);O(this._dropdownMenu,"blur",function(){va(a._dropdownMenu); +a._dropDownCloseTime=new Date},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.printText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers, +!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){a.print();va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.saveJPGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d= +!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"jpeg",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText= +"padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.savePNGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor, +this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"png",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0)}"none"!==this._toolBar.style.display&&this._zoomButton&&(this.panEnabled?ua(a,a._zoomButton,"zoom"):ua(a,a._zoomButton,"pan"),a._resetButton.getAttribute("state")!==a._cultureInfo.resetText&&ua(a,a._resetButton,"reset"));this.options.toolTip&&this.toolTip.options!==this.options.toolTip&&(this.toolTip.options=this.options.toolTip); +for(var c in this.toolTip.options)this.toolTip.options.hasOwnProperty(c)&&this.toolTip.updateOption(c)};p.prototype._updateSize=function(){var a;a=[this.canvas,this._preRenderCanvas,this.overlaidCanvas,this._eventManager.ghostCanvas];var d=0,b=0;this.options.width?d=this.width:this.width=d=0c.linkedDataSeriesIndex||c.linkedDataSeriesIndex>=this.options.data.length||"number"!==typeof c.linkedDataSeriesIndex|| +"error"===this.options.data[c.linkedDataSeriesIndex].type)&&(c.linkedDataSeriesIndex=null);null===c.name&&(c.name="DataSeries "+a);null===c.color?1a&&"undefined"!==typeof w.startTimePercent?a>=w.startTimePercent&&w.animationCallback(w.easingFunction(a-w.startTimePercent,0,1,1-w.startTimePercent),w):w.animationCallback(w.easingFunction(a,0,1,1),w);s.dispatchEvent("dataAnimationIterationEnd",{chart:s})},function(){b=[];for(var a=0;aa.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c);ed.max&&"number"===typeof e&&(d.max=e);if(0B&&(B=1/B);b.minDiff>B&&1!==B&&(b.minDiff=B)}else B=c-l.dataPoints[w-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B);null!==e&&null!==l.dataPoints[w-1].y&&(a.axisY.logarithmic?(B=e/l.dataPoints[w-1].y,1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e-l.dataPoints[w-1].y,0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B)))}if(cf&& +!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&qd.viewPortMax&&"number"===typeof e&&(d.viewPortMax=e))}}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype._processStackedPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d= +a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=[],l=[],w=Infinity,h=-Infinity,s=0;sb.max&&(b.max=c);if(0r&&(r=1/r);b.minDiff>r&&1!==r&&(b.minDiff=r)}else r=c-q.dataPoints[n-1].x,0>r&&(r*=-1),b.minDiff>r&&0!==r&&(b.minDiff=r);null!==e&&null!==q.dataPoints[n-1].y&&(a.axisY.logarithmic?0r&&(r=1/r),d.minDiff>r&&1!==r&&(d.minDiff=r)):(r=e-q.dataPoints[n-1].y,0>r&&(r*=-1),d.minDiff>r&&0!==r&&(d.minDiff=r)))}if(ct&&!B)B=!0;else if(c>t&&B)continue;q.dataPoints[n].label&&(a.axisX.labels[c]=q.dataPoints[n].label);cb.viewPortMax&&(b.viewPortMax=c);null===q.dataPoints[n].y?b.viewPortMin===c&&kd.max&&(d.max=a),nb.viewPortMax||(ad.viewPortMax&& +(d.viewPortMax=a)));for(n in l)l.hasOwnProperty(n)&&!isNaN(n)&&(a=l[n],ad.max&&(d.max=Math.max(a,h)),nb.viewPortMax||(ad.viewPortMax&&(d.viewPortMax=Math.max(a,h))))}};p.prototype._processStacked100PlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=!1,l=!1,w=[],h=0;hb.max&&(b.max=c);if(0t&&(t=1/t);b.minDiff>t&&1!==t&&(b.minDiff=t)}else t=c-s.dataPoints[q-1].x,0>t&&(t*=-1),b.minDiff>t&&0!==t&&(b.minDiff=t);u(e)||null===s.dataPoints[q-1].y||(a.axisY.logarithmic?0t&&(t=1/t),d.minDiff>t&&1!==t&&(d.minDiff=t)):(t=e-s.dataPoints[q-1].y,0>t&&(t*=-1),d.minDiff>t&&0!==t&&(d.minDiff=t)))}if(cr&&!f)f=!0;else if(c>r&&f)continue;s.dataPoints[q].label&&(a.axisX.labels[c]=s.dataPoints[q].label); +cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&Be&&(l=!0),w[c]=w[c]?w[c]+Math.abs(e):Math.abs(e))}}s.axisX.valueType=s.xValueType=g?"dateTime":"number"}a.axisY.logarithmic?(d.max=u(d.viewPortMax)?99*Math.pow(a.axisY.logarithmBase,-0.05):Math.max(d.viewPortMax,99*Math.pow(a.axisY.logarithmBase,-0.05)),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&!l?(d.max=u(d.viewPortMax)? +99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&l?(d.max=u(d.viewPortMax)?99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99)):!m&&l&&(d.max=u(d.viewPortMax)?-1:Math.max(d.viewPortMax,-1),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99));d.viewPortMin=d.min;d.viewPortMax=d.max;a.dataPointYSums=w}};p.prototype._processMultiYPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo, +b=a.axisX.dataInfo,c,e,g,m,l=!1,w=0;wb.max&&(b.max=c);gd.max&&(d.max=m);0B&&(B=1/B),b.minDiff>B&&1!==B&&(b.minDiff=B)):(B=c-h.dataPoints[s-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B)),e&&(null!==e[0]&&h.dataPoints[s-1].y&&null!==h.dataPoints[s-1].y[0])&&(a.axisY.logarithmic?(B=e[0]/ +h.dataPoints[s-1].y[0],1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e[0]-h.dataPoints[s-1].y[0],0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B))));if(!(ct&&!n)n=!0;else if(c>t&&n)continue;h.dataPoints[s].label&&(a.axisX.labels[c]=h.dataPoints[s].label);cb.viewPortMax&&(b.viewPortMax=c);if(b.viewPortMin===c&&e)for(p=0;pd.viewPortMax&&(d.viewPortMax=m))}}h.axisX.valueType=h.xValueType=l?"dateTime":"number"}};p.prototype._processSpecificPlotUnit=function(a){if("waterfall"===a.type&&a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c),l.dataPointEOs[w].cumulativeSumd.max&&(d.max=l.dataPointEOs[w].cumulativeSum),0q&&(q=1/q),b.minDiff>q&&1!==q&&(b.minDiff=q)):(q=c-l.dataPoints[w-1].x,0>q&&(q*=-1),b.minDiff>q&&0!==q&&(b.minDiff=q)),null!==e&&null!==l.dataPoints[w- +1].y&&(a.axisY.logarithmic?(e=l.dataPointEOs[w].cumulativeSum/l.dataPointEOs[w-1].cumulativeSum,1>e&&(e=1/e),d.minDiff>e&&1!==e&&(d.minDiff=e)):(e=l.dataPointEOs[w].cumulativeSum-l.dataPointEOs[w-1].cumulativeSum,0>e&&(e*=-1),d.minDiff>e&&0!==e&&(d.minDiff=e)))),!(cf&&!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);0d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w-1].cumulativeSum));l.dataPointEOs[w].cumulativeSumd.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w].cumulativeSum)}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype.calculateAutoBreaks=function(){function a(a,c,b,e){if(e)return b= +Math.pow(Math.min(b*a/c,c/a),0.2),1>=b&&(b=Math.pow(1>a?1/a:Math.min(c/a,a),0.25)),{startValue:a*b,endValue:c/b};b=0.2*Math.min(b-c+a,c-a);0>=b&&(b=0.25*Math.min(c-a,Math.abs(a)));return{startValue:a+b,endValue:c-b}}function d(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){var c=a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<=a.axisX.scaleBreaks.maxNumberOfAutoBreaks,b=a.axisY.scaleBreaks&&a.axisY.scaleBreaks.autoCalculate&&1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks;if(c|| +b)for(var d=a.axisY.dataInfo,f=a.axisX.dataInfo,g,h=f.min,l=f.max,m=d.min,n=d.max,f=f._dataRanges,d=d._dataRanges,q,w=0,s=0;sk.dataPoints.length))for(w=0;wf[q].max&&(f[q].max=g)),b){var r= +(n+1-m)*Math.max(parseFloat(a.axisY.scaleBreaks.collapsibleThreshold)||10,10)/100;if((g="waterfall"===a.type?k.dataPointEOs[w].cumulativeSum:k.dataPoints[w].y)&&g.length)for(var p=0;pd[q].max&&(d[q].max=g[p]);else u(g)||(q=Math.floor((g-m)/r),gd[q].max&&(d[q].max=g))}}}}function b(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)&&a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<= +a.axisX.scaleBreaks.maxNumberOfAutoBreaks)for(var c=a.axisX.dataInfo,b=c.min,d=c.max,f=c._dataRanges,g,h=0,l=0;lm.dataPoints.length))for(h=0;hf[g].max&&(f[g].max=c)}}for(var c,e=this,g=!1,m=0;m< +this._axes.length;m++)if(this._axes[m].scaleBreaks&&this._axes[m].scaleBreaks.autoCalculate&&1<=this._axes[m].scaleBreaks.maxNumberOfAutoBreaks){g=!0;this._axes[m].dataInfo._dataRanges=[];for(var l=0;l<100/Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10);l++)this._axes[m].dataInfo._dataRanges.push({min:Infinity,max:-Infinity})}if(g){for(m=0;ms[f].max&&(s[f].max=q)}delete this._axes[m].dataInfo.dataPointYPositiveSums}if(this._axes[m].dataInfo.dataPointYNegativeSums){n= +this._axes[m].dataInfo.dataPointYNegativeSums;s=h;for(l in n)n.hasOwnProperty(l)&&!isNaN(l)&&(q=-1*n[l],u(q)||(f=Math.floor((q-w)/c),qs[f].max&&(s[f].max=q)));delete this._axes[m].dataInfo.dataPointYNegativeSums}for(l=0;lc&&g.push({diff:q,start:s,end:w});break}else l++;if(this._axes[m].scaleBreaks.customBreaks)for(l=0;l=e.x1&&(a<=e.x2&&d>=e.y1&&d<=e.y2)&&(c=e.id)}return c};p.prototype.getAutoFontSize=lb;p.prototype.resetOverlayedCanvas=function(){this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height)};p.prototype.clearCanvas=kb;p.prototype.attachEvent=function(a){this._events.push(a)};p.prototype._touchEventHandler=function(a){if(a.changedTouches&&this.interactivityEnabled){var d=[],b=a.changedTouches,c=b?b[0]:a,e=null;switch(a.type){case "touchstart":case "MSPointerDown":d=["mousemove","mousedown"];this._lastTouchData= +Ra(c);this._lastTouchData.time=new Date;break;case "touchmove":case "MSPointerMove":d=["mousemove"];break;case "touchend":case "MSPointerUp":var g=this._lastTouchData&&this._lastTouchData.time?new Date-this._lastTouchData.time:0,d="touchstart"===this._lastTouchEventType||"MSPointerDown"===this._lastTouchEventType||300>g?["mouseup","click"]:["mouseup"];break;default:return}if(!(b&&1g)this._lastTouchData.scroll=!0}catch(l){}this._lastTouchEventType=a.type;if(this._lastTouchData.scroll&&this.zoomEnabled)this.isDrag&&this.resetOverlayedCanvas(),this.isDrag=!1;else for(b=0;b=e.x1&&d.x<=e.x2&&d.y>=e.y1&&d.y<=e.y2){c[b].call(c.context,d.x,d.y);"mousedown"===b&&!0===c.capture?(p.capturedEventParam=c,this.overlaidCanvas.setCapture?this.overlaidCanvas.setCapture():document.documentElement.addEventListener("mouseup", +this._mouseEventHandler,!1)):"mouseup"===b&&(c.chart.overlaidCanvas.releaseCapture?c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",this._mouseEventHandler,!1));break}else c=null;a.target.style.cursor=c&&c.cursor?c.cursor:this._defaultCursor}b=this.plotArea;if(d.xb.x2||d.yb.y2)this.toolTip&&this.toolTip.enabled?this.toolTip.hide():this.resetOverlayedCanvas();this.isDrag&&this.zoomEnabled||!this._eventManager||this._eventManager.mouseEventHandler(a)}}; +p.prototype._plotAreaMouseDown=function(a,d){this.isDrag=!0;this.dragStartPoint={x:a,y:d}};p.prototype._plotAreaMouseUp=function(a,d){if(("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)&&this.isDrag){var b=d-this.dragStartPoint.y,c=a-this.dragStartPoint.x,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=!1;this.resetOverlayedCanvas();if("xySwapped"===this.plotInfo.axisPlacement)var l=g,g=e,e=l;if(this.panEnabled||this.zoomEnabled){if(this.panEnabled)for(e= +g=0;eb.maximum&&(g=b.viewportMaximum/b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum/g,b.sessionVariables.newViewportMaximum=b.viewportMaximum/g,m=!0):b.viewportMinimumb.maximum&&(g=b.viewportMaximum-b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum-g,b.sessionVariables.newViewportMaximum=b.viewportMaximum-g,m=!0);else if((!e||2Math.abs(b)&&(this.panEnabled||this.zoomEnabled)?this.toolTip.hide():this.panEnabled||this.zoomEnabled||this.toolTip.mouseMoveHandler(a, +d);if((!e||2f)var B=f,f=n,n=B;if(q.scaleBreaks)for(B=0;!g&&B=f;if(isFinite(q.dataInfo.minDiff))if(B=q.getApparentDifference(n,f,null,!0),!(g||!(this.panEnabled&&q.scaleBreaks&&q.scaleBreaks._appliedBreaks.length)&&(q.logarithmic&&Bq.maximum))w.push(q),s.push({val1:n,val2:f}),l=!0;else if(!e){l=!1;break}}return{isValid:l,axesWithValidRange:w,axesRanges:s}};p.prototype.preparePlotArea=function(){var a=this.plotArea;!r&&(0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2;a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2;a.width=a.x2-a.x1;a.height=a.y2-a.y1}this.axisY2&&0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2,a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2,a.width=a.x2-a.x1,a.height=a.y2-a.y1)}else d= +this.layoutManager.getFreeSpace(),a.x1=d.x1,a.x2=d.x2,a.y1=d.y1,a.y2=d.y2,a.width=d.width,a.height=d.height;r||(a.canvas.width=a.width,a.canvas.height=a.height,a.canvas.style.left=a.x1+"px",a.canvas.style.top=a.y1+"px",(0b.x2||h.point.yb.y2+1)continue}else if("rangearea"===s||"rangesplinearea"===s){if(h.dataPoint.xy.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("bubble")||0<=s.indexOf("scatter")){if(h.dataPoint.xy.viewportMaximum|| +h.dataPoint.yA.viewportMaximum)continue}else if(0<=s.indexOf("column")||"waterfall"===s||"error"===s&&!h.axisSwapped){if(h.dataPoint.xy.viewportMaximum||h.bounds.y1>b.y2||h.bounds.y2y.viewportMaximum||h.bounds.x1>b.x2||h.bounds.x2 +y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(h.dataPoint.xy.viewportMaximum)continue;e=m=2;"horizontal"===C?(l=f.width,w=f.height):(w=f.width,l=f.height);if("normal"===this.plotInfo.axisPlacement){if(0<=s.indexOf("line")||0<=s.indexOf("area"))t="auto",m=4;else if(0<=s.indexOf("stacked"))"auto"===t&&(t="inside");else if("bubble"===s||"scatter"===s)t="inside";q=h.point.x- +l/2;"inside"!==t?(e=b.y1,g=b.y2,0h.point.y)):(n=h.point.y+m+c,n>g-w-m-c&&(n="auto"===t?Math.min(h.point.y,g)-w-m-c:g-w-m-c,v=ng-w-m&&("bubble"===s||"scatter"===s)&&(n=Math.min(h.point.y+m,b.y2-w-m))),n=Math.min(n,g-w))}else 0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("scatter")?(t="auto",e=4):0<=s.indexOf("stacked")?"auto"===t&&(t="inside"):"bubble"===s&&(t="inside"),n=h.point.y-w/2,"inside"!==t?(m=b.x1,g=b.x2,0>ma?(q=h.point.x-l-e-c,qh.point.x)):(q=h.point.x+e+c,q>g-l-e-c&&(q="auto"=== +t?Math.min(h.point.x,g)-l-e-c:g-l-e-c,v=qma?Math.max(h.bounds.x1,b.x1)+l/2+e:Math.min(h.bounds.x2,b.x2)-l/2-e:(Math.max(h.bounds.x1,b.x1)+Math.min(h.bounds.x2,b.x2))/2,q=0>ma?Math.max(h.point.x,c)-l/2:Math.min(h.point.x,c)-l/2,q=Math.max(q,m));"vertical"===C&&(n+=w);f.x=q;f.y=n;f.render(!0);p&&("inside"!==t&&(0>s.indexOf("bar")&&("error"!==s||!h.axisSwapped)&&h.point.x>b.x1&&h.point.xs.indexOf("column")&&("error"!==s||h.axisSwapped)&&h.point.y>b.y1&&h.point.y=a.dataSeriesIndexes.length)){var c= +this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepLine=function(a){var d=a.targetCanvasCtx|| +this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&& +(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation, +easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderSpline=function(a){function d(a){a=v(a,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx;c.save();var g=this.plotArea;c.beginPath(); +c.rect(g.x1,g.y1,g.width,g.height);c.clip();for(var m=[],l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[p].y)0s[p].y===a.axisY.reversed?1:-1,color:B});u=!1}d(x)}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(g.x1,g.y1,g.width,g.height),e.beginPath());c.restore();c.beginPath();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width, +0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.dataPointWidth=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){m=a.axisX.convertValueToPixel(w);l=a.axisY.convertValueToPixel(B[g].y);m=a.axisX.reversed?m+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:m-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var k=a.axisX.reversed?m-q<<0:m+q<<0,t;0<=B[g].y?t=h:(t=l,l=h);l>t&&(c=l,l=t,t=c);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,l,k,t,c,0,null,p&&0<=B[g].y, +0>B[g].y&&p,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:m,y1:l,x2:k,y2:t};c=N(c);r&&ea(this._eventManager.ghostCtx,m,l,k,t,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"column",dataPoint:B[g],dataSeries:f,point:{x:m+(k-m)/2,y:0>B[g].y===a.axisY.reversed?l:t},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:m, +y1:Math.min(l,t),x2:k,y2:Math.max(l,t)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore(); +return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.y2?a.axisY.bounds.y2:h}}};p.prototype.renderStackedColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth? +this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q="undefined"!==typeof m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;g[c]=A+(y-q)}else A=m[c]?m[c]:0,y=q+A,q=n+A,m[c]=A+(y-q);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1, +!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedColumn",dataPoint:t[h],dataSeries:p,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q, +y)},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx, +animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderStackedColumn100=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth: +this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);q=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;q=a.axisY.convertValueToPixel(l[c]);y=g[c]?g[c]:n;g[c]=q}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=q+("undefined"!==typeof w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q=m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(q),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y1-q)&&(q=e.y1);g[c]=A+(y-q)}else A="undefined"!==typeof m[c]? +m[c]:0,y=q+A,q=n+A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y2-y)&&(y=e.y2),m[c]=A+(y-q);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&& +this._indexLabels.push({chartType:"stackedColumn100",dataPoint:t[h],dataSeries:k,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q,y)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&& +this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= +null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.options.dataPointWidth? +this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height); +b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){l=a.axisX.convertValueToPixel(w); +m=a.axisY.convertValueToPixel(B[g].y);l=a.axisX.reversed?l+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:l-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var p=a.axisX.reversed?l-q<<0:l+q<<0,t;0<=B[g].y?t=h:(t=m,m=h);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,t,l,m,p,c,0,null,k,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:t,y1:l,x2:m,y2:p};c= +N(c);r&&ea(this._eventManager.ghostCtx,t,l,m,p,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"bar",dataPoint:B[g],dataSeries:f,point:{x:0<=B[g].y?m:t,y:l+(p-l)/2},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(t,m),y1:l,x2:Math.max(t,m),y2:p},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas, +0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.x2?a.axisY.bounds.x2: +h}}};p.prototype.renderStackedBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<< +0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),s=m[c]? +m[c]:n,m[c]=y=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A=g[c]?g[c]:0;y=n+A;s+=A;g[c]=A+(s-y)}else A=m[c]?m[c]:0,y=s-A,s=n-A,m[c]=A+(s-y);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,y,x,s,v,c,0,null,u,!1,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:y,y1:x,x2:s,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,y,x,s,v,c,0,null,!1,!1,!1, +!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar",dataPoint:t[h],dataSeries:k,point:{x:0<=t[h].y?s:y,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(y,s),y1:x,x2:Math.max(y,s),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderStackedBar100=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)|| +(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save(); +b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&& +"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x;x=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var v=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,y=v+f<<0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;x=g[c]?g[c]:n;g[c]=s=a.axisY.convertValueToPixel(l[c])}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=x+(w[c]?w[c]:0),s=m[c]?m[c]: +n,m[c]=x=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(x),0<=t[h].y){var A=g[c]?g[c]:0;x=n+A;s+=A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x2-s)&&(s=e.x2);g[c]=A+(s-x)}else A=m[c]?m[c]:0,x=s-A,s=n-A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x1-x)&&(x=e.x1),m[c]=A+(s-x);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,v,s,y,c,0,null,u,!1,!1,!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k, +dataPointIndex:h,x1:x,y1:v,x2:s,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,v,s,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar100",dataPoint:t[h],dataSeries:p,point:{x:0<=t[h].y?s:x,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(x,s),y1:v,x2:Math.max(x,s),y2:y},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop", +a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!da)))if("number"!==typeof p[k].y)B.connectNullData||(da||d)||c(),da=!0;else{t=a.axisX.convertValueToPixel(x);u=a.axisY.convertValueToPixel(p[k].y);d||da?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||b===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d=t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,b=B.nullDataLineDashType,g.setLineDash(Y)),g.lineTo(t,u),r&&m.lineTo(t, +u)):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),da=d=!1):(g.lineTo(t,u),r&&m.lineTo(t,u),0==k%250&&c());q={x:t,y:u};kp[k].y===a.axisY.reversed?1:-1,color:z})}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderSplineArea=function(a){function d(){var b=v(x,2);if(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum? +t=p:0>a.axisY.viewportMaximum?t=m.y1:0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=a.axisX.lineCoordinates,m=a.axisY.lineCoordinates,l=[],w=this.plotArea;c.save();r&& +e.save();c.beginPath();c.rect(w.x1,w.y1,w.width,w.height);c.clip();r&&(e.beginPath(),e.rect(w.x1,w.y1,w.width,w.height),e.clip());for(var h=0;ha.axisX.dataInfo.viewPortMax&&(!q.connectNullData||!k)))if("number"!==typeof n[f].y)0n[f].y===a.axisY.reversed?1:-1,color:ma});k=!1}d();ia.drawMarkers(l)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(w.x1,w.y1,w.width,w.height), +this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!b))){var Z=u;"number"!==typeof k[p].y?(B.connectNullData||(b||d)||c(),b=!0):(t=a.axisX.convertValueToPixel(x),u=a.axisY.convertValueToPixel(k[p].y),d||b?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||Y===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d= +t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,Y=B.nullDataLineDashType,g.setLineDash(ca)),g.lineTo(t,Z),g.lineTo(t,u),r&&(m.lineTo(t,Z),m.lineTo(t,u))):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),b=d=!1):(g.lineTo(t,Z),r&&m.lineTo(t,Z),g.lineTo(t,u),r&&m.lineTo(t,u),0==p%250&&c()),q={x:t,y:u},pk[p].y===a.axisY.reversed?1:-1,color:z}))}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea=function(a){function d(){if(!(1>h.length)){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=[],l=this.plotArea,w=[],h=[],s=[],q=[],n=0,f,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),u=this._eventManager.ghostCtx,t,C,x;r&&u.beginPath();c.save();r&&u.save();c.beginPath();c.rect(l.x1,l.y1,l.width,l.height);c.clip();r&&(u.beginPath(),u.rect(l.x1,l.y1,l.width,l.height),u.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData||!da)))if("number"!==typeof Z.y)A.connectNullData||(da||C)||d(),da=!0;else{f=a.axisX.convertValueToPixel(g);var oa= +w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(Z.y),k-=oa;h.push({x:f,y:p-oa});w[g]=p-k;C||da?(!C&&A.connectNullData?(c.setLineDash&&(A.options.nullDataLineDashType||x===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(C=h.pop(),x=h[h.length-1],d(),c.moveTo(t.x,t.y),h.push(x),h.push(C),x=A.nullDataLineDashType, +c.setLineDash(Y)),c.lineTo(f,k),r&&u.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(u.beginPath(),u.moveTo(f,k))),da=C=!1):(c.lineTo(f,k),r&&u.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&u.moveTo(f,k),h.push({x:f,y:p-oa})));t={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&u.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(l.x1,l.y1,l.width,l.height),u.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea100=function(a){function d(){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=[],w=[],h=[],s=[],q=[],n=0,f,k,p,u,t,C=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),x=this._eventManager.ghostCtx;c.save();r&&x.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(x.beginPath(), +x.rect(m.x1,m.y1,m.width,m.height),x.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData|| +!da)))if("number"!==typeof Z.y)A.connectNullData||(da||u)||d(),da=!0;else{var oa;oa=0!==a.dataPointYSums[g]?100*(Z.y/a.dataPointYSums[g]):0;f=a.axisX.convertValueToPixel(g);var la=w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(oa),k-=la;h.push({x:f,y:C-la});w[g]=C-k;u||da?(!u&&A.connectNullData?(c.setLineDash&& +(A.options.nullDataLineDashType||t===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(u=h.pop(),t=h[h.length-1],d(),c.moveTo(p.x,p.y),h.push(t),h.push(u),t=A.nullDataLineDashType,c.setLineDash(Y)),c.lineTo(f,k),r&&x.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(x.beginPath(),x.moveTo(f,k))),da=u=!1):(c.lineTo(f,k),r&&x.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&x.moveTo(f,k),h.push({x:f,y:C-la})));p={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&x.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(l);r&&(b.drawImage(this._preRenderCanvas,0, +0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),x.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}}; +p.prototype.renderBubble=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=-Infinity,w=Infinity,h=0;ha.axisX.dataInfo.viewPortMax||"undefined"===typeof n[e].z||(f=n[e].z,f>l&&(l=f),fa.axisX.dataInfo.viewPortMax)&&"number"===typeof n[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(n[e].y);var f=n[e].z,u=2*Math.max(Math.sqrt((l===w?p/2:k+(p-k)/(l-w)*(f-w))/Math.PI)<<0,1),f=q.getMarkerProperties(e,b);f.size=u;b.globalAlpha=q.fillOpacity;ia.drawMarker(g,m,b,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;var t=q.dataPointIds[e];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:s, +dataPointIndex:e,x1:g,y1:m,size:u};u=N(t);r&&ia.drawMarker(g,m,this._eventManager.ghostCtx,f.type,f.size,u,u,f.borderThickness);(n[e].indexLabel||q.indexLabel||n[e].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"bubble",dataPoint:n[e],dataSeries:q,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/2,x2:g+f.size/2,y2:m+f.size/2},color:null})}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderScatter=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=0;la.axisX.dataInfo.viewPortMax)&&"number"===typeof s[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(s[e].y);var f=h.getMarkerProperties(e,g,m,b);b.globalAlpha=h.fillOpacity;ia.drawMarker(f.x,f.y,f.ctx,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;Math.sqrt((q-g)*(q-g)+(n-m)*(n-m))Math.min(this.plotArea.width,this.plotArea.height)||(q=h.dataPointIds[e],this._eventManager.objectMap[q]={id:q,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:e,x1:g,y1:m},q=N(q),r&&ia.drawMarker(f.x,f.y,this._eventManager.ghostCtx,f.type,f.size,q,q,f.borderThickness),(s[e].indexLabel||h.indexLabel||s[e].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"scatter",dataPoint:s[e],dataSeries:h,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/ +2,x2:g+f.size/2,y2:m+f.size/2},color:null}),q=g,n=m)}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore()); +b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderCandlestick=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=0,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,g=this.options.dataPointMaxWidth? +this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*m.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&&e>g&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,g));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&gg&&(k=g);b.save();r&&c.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(c.beginPath(),c.rect(m.x1,m.y1,m.width,m.height),c.clip());for(var p=0;pa.axisX.dataInfo.viewPortMax)&&!u(C[l].y)&&C[l].y.length&& +"number"===typeof C[l].y[0]&&"number"===typeof C[l].y[1]&&"number"===typeof C[l].y[2]&&"number"===typeof C[l].y[3]){w=a.axisX.convertValueToPixel(f);h=a.axisY.convertValueToPixel(C[l].y[0]);s=a.axisY.convertValueToPixel(C[l].y[1]);q=a.axisY.convertValueToPixel(C[l].y[2]);n=a.axisY.convertValueToPixel(C[l].y[3]);var z=w-k/2<<0,y=z+k<<0,g=t.options.fallingColor?t.fallingColor:t._colorSet[0],e=C[l].color?C[l].color:t._colorSet[0],A=Math.round(Math.max(1,0.15*k)),D=0===A%2?0:0.5,aa=t.dataPointIds[l]; +this._eventManager.objectMap[aa]={id:aa,objectType:"dataPoint",dataSeriesIndex:v,dataPointIndex:l,x1:z,y1:h,x2:y,y2:s,x3:w,y3:q,x4:w,y4:n,borderThickness:A,color:e};b.strokeStyle=e;b.beginPath();b.lineWidth=A;c.lineWidth=Math.max(A,4);"candlestick"===t.type?(b.moveTo(w-D,s),b.lineTo(w-D,Math.min(h,n)),b.stroke(),b.moveTo(w-D,Math.max(h,n)),b.lineTo(w-D,q),b.stroke(),ea(b,z,Math.min(h,n),y,Math.max(h,n),C[l].y[0]<=C[l].y[3]?t.risingColor:g,A,e,x,x,!1,!1,t.fillOpacity),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w- +D,s),c.lineTo(w-D,Math.min(h,n)),c.stroke(),c.moveTo(w-D,Math.max(h,n)),c.lineTo(w-D,q),c.stroke(),ea(c,z,Math.min(h,n),y,Math.max(h,n),e,0,null,!1,!1,!1,!1))):"ohlc"===t.type&&(b.moveTo(w-D,s),b.lineTo(w-D,q),b.stroke(),b.beginPath(),b.moveTo(w,h),b.lineTo(z,h),b.stroke(),b.beginPath(),b.moveTo(w,n),b.lineTo(y,n),b.stroke(),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w-D,s),c.lineTo(w-D,q),c.stroke(),c.beginPath(),c.moveTo(w,h),c.lineTo(z,h),c.stroke(),c.beginPath(),c.moveTo(w,n),c.lineTo(y,n),c.stroke())); +(C[l].indexLabel||t.indexLabel||C[l].indexLabelFormatter||t.indexLabelFormatter)&&this._indexLabels.push({chartType:t.type,dataPoint:C[l],dataSeries:t,point:{x:z+(y-z)/2,y:a.axisY.reversed?q:s},direction:1,bounds:{x1:z,y1:Math.min(s,q),x2:y,y2:Math.max(s,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas, +0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderBoxAndWhisker=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e= +null,g=this.plotArea,m=0,l,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*g.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&& +e>m&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(k=m);b.save();r&&c.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(c.beginPath(),c.rect(g.x1,g.y1,g.width,g.height),c.clip());for(var p=!1,p=!!a.axisY.reversed,v=0;va.axisX.dataInfo.viewPortMax)&&!u(x[m].y)&&x[m].y.length&&"number"===typeof x[m].y[0]&&"number"===typeof x[m].y[1]&&"number"===typeof x[m].y[2]&&"number"===typeof x[m].y[3]&&"number"===typeof x[m].y[4]&&5===x[m].y.length){l=a.axisX.convertValueToPixel(f);w=a.axisY.convertValueToPixel(x[m].y[0]);h=a.axisY.convertValueToPixel(x[m].y[1]);s=a.axisY.convertValueToPixel(x[m].y[2]); +q=a.axisY.convertValueToPixel(x[m].y[3]);n=a.axisY.convertValueToPixel(x[m].y[4]);var y=l-k/2<<0,A=l+k/2<<0,e=x[m].color?x[m].color:C._colorSet[0],D=Math.round(Math.max(1,0.15*k)),aa=0===D%2?0:0.5,T=x[m].whiskerColor?x[m].whiskerColor:x[m].color?C.whiskerColor?C.whiskerColor:x[m].color:C.whiskerColor?C.whiskerColor:e,Y="number"===typeof x[m].whiskerThickness?x[m].whiskerThickness:"number"===typeof C.options.whiskerThickness?C.whiskerThickness:D,ca=x[m].whiskerDashType?x[m].whiskerDashType:C.whiskerDashType, +da=u(x[m].whiskerLength)?u(C.options.whiskerLength)?k:C.whiskerLength:x[m].whiskerLength,da="number"===typeof da?0>=da?0:da>=k?k:da:"string"===typeof da?parseInt(da)*k/100>k?k:parseInt(da)*k/100:k,Z=1===Math.round(Y)%2?0.5:0,oa=x[m].stemColor?x[m].stemColor:x[m].color?C.stemColor?C.stemColor:x[m].color:C.stemColor?C.stemColor:e,la="number"===typeof x[m].stemThickness?x[m].stemThickness:"number"===typeof C.options.stemThickness?C.stemThickness:D,G=1===Math.round(la)%2?0.5:0,F=x[m].stemDashType?x[m].stemDashType: +C.stemDashType,E=x[m].lineColor?x[m].lineColor:x[m].color?C.lineColor?C.lineColor:x[m].color:C.lineColor?C.lineColor:e,H="number"===typeof x[m].lineThickness?x[m].lineThickness:"number"===typeof C.options.lineThickness?C.lineThickness:D,I=x[m].lineDashType?x[m].lineDashType:C.lineDashType,K=1===Math.round(H)%2?0.5:0,L=C.upperBoxColor,O=C.lowerBoxColor,Q=u(C.options.fillOpacity)?1:C.fillOpacity,P=C.dataPointIds[m];this._eventManager.objectMap[P]={id:P,objectType:"dataPoint",dataSeriesIndex:t,dataPointIndex:m, +x1:y,y1:w,x2:A,y2:h,x3:l,y3:s,x4:l,y4:q,y5:n,borderThickness:D,color:e,stemThickness:la,stemColor:oa,whiskerThickness:Y,whiskerLength:da,whiskerColor:T,lineThickness:H,lineColor:E};b.save();0=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth: +1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.03*this.width;var h=a.axisX.dataInfo.minDiff;isFinite(h)||(h=0.3*Math.abs(a.axisX.range));h=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(h)/Math.log(a.axisX.range):Math.abs(h)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&& +(this.dataPointMinWidth&&mm&&(h=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var s=0;sa.axisX.dataInfo.viewPortMax)&&!u(f[g].y)&&f[g].y.length&&"number"===typeof f[g].y[0]&&"number"===typeof f[g].y[1]){c=a.axisX.convertValueToPixel(w);m=a.axisY.convertValueToPixel(f[g].y[0]);l=a.axisY.convertValueToPixel(f[g].y[1]);var p=a.axisX.reversed?c+a.plotType.totalDataSeries*h/2-(a.previousDataSeriesCount+s)*h<<0:c-a.plotType.totalDataSeries*h/2+(a.previousDataSeriesCount+ +s)*h<<0,v=a.axisX.reversed?p-h<<0:p+h<<0,c=f[g].color?f[g].color:n._colorSet[g%n._colorSet.length];if(m>l){var t=m;m=l;l=t}t=n.dataPointIds[g];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:q,dataPointIndex:g,x1:p,y1:m,x2:v,y2:l};ea(b,p,m,v,l,c,0,c,k,k,!1,!1,n.fillOpacity);c=N(t);r&&ea(this._eventManager.ghostCtx,p,m,v,l,c,0,null,!1,!1,!1,!1);if(f[g].indexLabel||n.indexLabel||f[g].indexLabelFormatter||n.indexLabelFormatter)this._indexLabels.push({chartType:"rangeColumn", +dataPoint:f[g],dataSeries:n,indexKeyword:0,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?l:m},direction:f[g].y[1]>=f[g].y[0]?-1:1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c}),this._indexLabels.push({chartType:"rangeColumn",dataPoint:f[g],dataSeries:n,indexKeyword:1,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?m:l},direction:f[g].y[1]>=f[g].y[0]?1:-1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation= +"source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderError= +function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=a.axisY._position?"left"===a.axisY._position||"right"===a.axisY._position?!1:!0:!1;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=!1,m=this.plotArea,l=0,w,h,s,q,n,f,k,p=a.axisX.dataInfo.minDiff;isFinite(p)||(p=0.3*Math.abs(a.axisX.range));b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(m.x1, +m.y1,m.width,m.height),this._eventManager.ghostCtx.clip());for(var v=0,t=0;tl&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,l));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ll&&(t=l);if(0=T.length?0:T.length>=t?t:T.length:"string"===typeof T.length?parseInt(T.length)*t/100>t?t:parseInt(T.length)*t/100>t:t;T.thickness="number"===typeof T.thickness?0>T.thickness?0:Math.round(T.thickness):2;var Y={color:y[l].stemColor?y[l].stemColor:y[l].color?z.stemColor?z.stemColor:y[l].color:z.stemColor?z.stemColor:e,thickness:y[l].stemThickness?y[l].stemThickness:z.stemThickness,dashType:y[l].stemDashType? +y[l].stemDashType:z.stemDashType};Y.thickness="number"===typeof Y.thickness?0>Y.thickness?0:Math.round(Y.thickness):2;y[l].getTime?k=y[l].x.getTime():k=y[l].x;if(!(ka.axisX.dataInfo.viewPortMax)&&!u(y[l].y)&&y[l].y.length&&"number"===typeof y[l].y[0]&&"number"===typeof y[l].y[1]){var ca=a.axisX.convertValueToPixel(k);c?h=ca:w=ca;ca=a.axisY.convertValueToPixel(y[l].y[0]);c?s=ca:n=ca;ca=a.axisY.convertValueToPixel(y[l].y[1]);c?q=ca:f=ca;c?(n=a.axisX.reversed?h+(A?v: +1)*t/2-(A?D-1:0)*t<<0:h-(A?v:1)*t/2+(A?D-1:0)*t<<0,f=a.axisX.reversed?n-t<<0:n+t<<0):(s=a.axisX.reversed?w+(A?v:1)*t/2-(A?D-1:0)*t<<0:w-(A?v:1)*t/2+(A?D-1:0)*t<<0,q=a.axisX.reversed?s-t<<0:s+t<<0);!c&&n>f&&(ca=n,n=f,f=ca);c&&s>q&&(ca=s,s=q,q=ca);ca=z.dataPointIds[l];this._eventManager.objectMap[ca]={id:ca,objectType:"dataPoint",dataSeriesIndex:x,dataPointIndex:l,x1:Math.min(s,q),y1:Math.min(n,f),x2:Math.max(q,s),y2:Math.max(f,n),isXYSwapped:c,stemProperties:Y,whiskerProperties:T};E(b,Math.min(s,q), +Math.min(n,f),Math.max(q,s),Math.max(f,n),e,T,Y,c);r&&E(this._eventManager.ghostCtx,s,n,q,f,e,T,Y,c);if(y[l].indexLabel||z.indexLabel||y[l].indexLabelFormatter||z.indexLabelFormatter)this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:0,point:{x:c?y[l].y[1]>=y[l].y[0]?s:q:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?f:n},direction:y[l].y[1]>=y[l].y[0]?-1:1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c}), +this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:1,point:{x:c?y[l].y[1]>=y[l].y[0]?q:s:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?n:f},direction:y[l].y[1]>=y[l].y[0]?1:-1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height), +a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx: +d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0;var s=a.axisX.dataInfo.minDiff;isFinite(s)||(s=0.3*Math.abs(a.axisX.range));s=this.options.dataPointWidth?this.dataPointWidth:0.9* +(e.height*(a.axisX.logarithmic?Math.log(s)/Math.log(a.axisX.range):Math.abs(s)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(s=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(), +this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var q=0;qa.axisX.dataInfo.viewPortMax)&&!u(k[g].y)&&k[g].y.length&&"number"===typeof k[g].y[0]&&"number"===typeof k[g].y[1]){m=a.axisY.convertValueToPixel(k[g].y[0]); +l=a.axisY.convertValueToPixel(k[g].y[1]);w=a.axisX.convertValueToPixel(h);w=a.axisX.reversed?w+a.plotType.totalDataSeries*s/2-(a.previousDataSeriesCount+q)*s<<0:w-a.plotType.totalDataSeries*s/2+(a.previousDataSeriesCount+q)*s<<0;var v=a.axisX.reversed?w-s<<0:w+s<<0;m>l&&(c=m,m=l,l=c);c=k[g].color?k[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,w,l,v,c,0,null,p,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g, +x1:m,y1:w,x2:l,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,m,w,l,v,c,0,null,!1,!1,!1,!1);if(k[g].indexLabel||f.indexLabel||k[g].indexLabelFormatter||f.indexLabelFormatter)this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:0,point:{x:k[g].y[1]>=k[g].y[0]?m:l,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?-1:1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c}),this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:1,point:{x:k[g].y[1]>= +k[g].y[0]?l:m,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?1:-1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1, +e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeArea=function(a){function d(){if(C){var a=null;0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width,m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!s.connectNullData||!T)))if(null!==q[f].y&&q[f].y.length&&"number"===typeof q[f].y[0]&&"number"===typeof q[f].y[1]){k=a.axisX.convertValueToPixel(t);p=a.axisY.convertValueToPixel(q[f].y[0]);u=a.axisY.convertValueToPixel(q[f].y[1]);n||T?(s.connectNullData&&!n?(c.setLineDash&&(s.options.nullDataLineDashType||A===s.lineDashType&&s.lineDashType!==s.nullDataLineDashType)&&(w[w.length- +1].newLineDashArray=D,A=s.nullDataLineDashType,c.setLineDash(z)),c.lineTo(k,p),r&&e.lineTo(k,p),w.push({x:k,y:u})):(c.beginPath(),c.moveTo(k,p),C={x:k,y:p},w=[],w.push({x:k,y:u}),r&&(e.beginPath(),e.moveTo(k,p))),T=n=!1):(c.lineTo(k,p),w.push({x:k,y:u}),r&&e.lineTo(k,p),0==f%250&&d());t=s.dataPointIds[f];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:h,dataPointIndex:f,x1:k,y1:p,y2:u};fq[f].y[1]===a.axisY.reversed?-1:1,color:x}),this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:1,point:{x:k, +y:u},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?1:-1,color:x})}else T||n||d(),T=!0;d();ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1, +m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderRangeSplineArea=function(a){function d(a,b){var d=v(u,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width, +m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!f)))if(null!==k[q].y&&k[q].y.length&&"number"===typeof k[q].y[0]&&"number"===typeof k[q].y[1]){n=a.axisX.convertValueToPixel(n);f=a.axisY.convertValueToPixel(k[q].y[0]);p=a.axisY.convertValueToPixel(k[q].y[1]);var E=h.dataPointIds[q];this._eventManager.objectMap[E]={id:E,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:q, +x1:n,y1:f,y2:p};u[u.length]={x:n,y:f};z[z.length]={x:n,y:p};q=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx,e=null,g=this.plotArea,m=0,l,k,h,s,q=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),m=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;k=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width,0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0;var n= +a.axisX.dataInfo.minDiff;isFinite(n)||(n=0.3*Math.abs(a.axisX.range));n=this.options.dataPointWidth?this.dataPointWidth:0.6*(g.width*(a.axisX.logarithmic?Math.log(n)/Math.log(a.axisX.range):Math.abs(n)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&m>k&&(m=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,k));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&kk&&(n=k);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.clip());for(var f=0;fh&&(e=k,k=h,h=e);a.axisY.reversed&&(e=k,k=h,h=e);e=u.dataPointIds[m];this._eventManager.objectMap[e]={id:e,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:m,x1:l,y1:k,x2:F,y2:h}; +var T=v[m].color?v[m].color:0v[m].y===a.axisY.reversed?1:-1,bounds:{x1:l,y1:Math.min(k,h),x2:F,y2:Math.max(k,h)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height), +b.clearRect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};var ja=function(a,d,b,c,e,g,m,l,k){if(!(0>b)){"undefined"===typeof l&&(l=1);if(!r){var h=Number((m%(2*Math.PI)).toFixed(8));Number((g%(2*Math.PI)).toFixed(8))===h&&(m-=1E-4)}a.save();a.globalAlpha=l;"pie"===e?(a.beginPath(),a.moveTo(d.x,d.y),a.arc(d.x,d.y,b,g,m,!1),a.fillStyle=c,a.strokeStyle= +"white",a.lineWidth=2,a.closePath(),a.fill()):"doughnut"===e&&(a.beginPath(),a.arc(d.x,d.y,b,g,m,!1),0<=k&&a.arc(d.x,d.y,k*b,m,g,!0),a.closePath(),a.fillStyle=c,a.strokeStyle="white",a.lineWidth=2,a.fill());a.globalAlpha=1;a.restore()}};p.prototype.renderPie=function(a){function d(){if(h&&s){for(var a=0,b=0,c=0,e=0,d=0;dMath.PI/2-t&&m.midAngle +m.midAngle)c=d;a++}else if(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t){if(0===b||f[e].midAngle>m.midAngle)e=d;b++}m.hemisphere=g>Math.PI/2&&g<=3*Math.PI/2?"left":"right";m.indexLabelTextBlock=new ka(k.plotArea.ctx,{fontSize:m.indexLabelFontSize,fontFamily:m.indexLabelFontFamily,fontColor:m.indexLabelFontColor,fontStyle:m.indexLabelFontStyle,fontWeight:m.indexLabelFontWeight,horizontalAlign:"left",backgroundColor:m.indexLabelBackgroundColor,maxWidth:m.indexLabelMaxWidth,maxHeight:m.indexLabelWrap? +5*m.indexLabelFontSize:1.5*m.indexLabelFontSize,text:m.indexLabelText,padding:0,textBaseline:"top"});m.indexLabelTextBlock.measureText()}l=g=0;q=!1;for(d=0;dMath.PI/2-t&&m.midAngle3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t)&&(l<=b/2&&!q?(m.hemisphere="left",l++):(m.hemisphere="right",q=!0))}}function b(a){var b= +k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);for(b=0;bc){var d=0.07*A*Math.cos(f[b].midAngle),g=0.07*A*Math.sin(f[b].midAngle),m=!1;if(s[b].exploded){if(1E-9a.indexLabelTextBlock.y?d-e:c-f}function e(a){for(var b=null,e=1;ec(f[b],f[a])||("right"===f[a].hemisphere?f[b].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y:f[b].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y)))break;else b=null;return b}function g(a,b,d){d=(d||0)+1;if(1E3< +d)return 0;b=b||0;var m=0,h=x.y-1*r,l=x.y+1*r;if(0<=a&&ab&&n.indexLabelTextBlock.yl)return 0;var k=0,q=0,q=k=k=0;0>b?n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2>h&&n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+bl&&(b=n.indexLabelTextBlock.y+ +n.indexLabelTextBlock.height/2+b-l);b=n.indexLabelTextBlock.y+b;h=0;h="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2));q=x.x+A*Math.cos(n.midAngle);k=x.y+A*Math.sin(n.midAngle);k=Math.sqrt(Math.pow(h-q,2)+Math.pow(b-k,2));q=Math.acos(A/r);k=Math.acos((r*r+A*A-k*k)/(2*A*r));b=kc(f[h],f[a])||("right"===f[a].hemisphere?f[h].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y:f[h].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y)))break;else h=null;q=h;k=e(a);l=h=0;0>b?(l="right"===n.hemisphere?q:k,m=b,null!==l&&(q=-b,b=n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2-(f[l].indexLabelTextBlock.y+f[l].indexLabelTextBlock.height/2),b-q+h.toFixed(C)&&(m=b>p?-(b-p):-(q-(l-h)))))):0p?b-p:q-(h-l)))));m&&(d=n.indexLabelTextBlock.y+m,b=0,b="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)),n.midAngle>Math.PI/2-t&&n.midAngleh.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x-15:"right"===n.hemisphere&&("left"===a.hemisphere&&b3*Math.PI/2-t&&n.midAngle<3*Math.PI/2+t&&(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"right"===n.hemisphere&&"left"===h.hemisphere&&ba.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x- +15)),n.indexLabelTextBlock.y=d,n.indexLabelTextBlock.x=b,n.indexLabelAngle=Math.atan2(n.indexLabelTextBlock.y-x.y,n.indexLabelTextBlock.x-x.x))}return m}function m(){var a=k.plotArea.ctx;a.fillStyle="grey";a.strokeStyle="grey";a.font="16px Arial";a.textBaseline="middle";for(var b=a=0,d=0,m=!0,b=0;10>b&&(1>b||0z){for(var E=u=0,H=0;Hu?l.indexLabelText="":l.indexLabelTextBlock.maxWidth=0.85*u,0.3*l.indexLabelTextBlock.maxWidthd&&(d=y)),y=y=0,0d&&(d=y)));var K=function(a, +b,c){for(var e=[],d=0;e.push(f[b]),b!==c;b=(b+1+s.length)%s.length);e.sort(function(a,b){return a.y-b.y});for(b=0;bz){n=t.indexLabelTextBlock.x;var k=t.indexLabelTextBlock.y-t.indexLabelTextBlock.height/ +2,w=t.indexLabelTextBlock.y+t.indexLabelTextBlock.height/2,p=h.indexLabelTextBlock.y-h.indexLabelTextBlock.height/2,u=h.indexLabelTextBlock.x+h.indexLabelTextBlock.width,r=h.indexLabelTextBlock.y+h.indexLabelTextBlock.height/2;n=t.indexLabelTextBlock.x+t.indexLabelTextBlock.widthu+q||k>r+q||wa&&(a=l),m!==a&&(b=m,d+=-z),0===l%Math.max(s.length/10,3)&&(g=!0)):g=!0;g&&(0=a.dataSeriesIndexes.length)){var h= +this.data[a.dataSeriesIndexes[0]],s=h.dataPoints,q=10,n=this.plotArea,f=h.dataPointEOs,p=2,r,v=1.3,t=20/180*Math.PI,C=6,x={x:(n.x2+n.x1)/2,y:(n.y2+n.y1)/2},z=0;a=!1;for(var y=0;ya&&(e=a,d=!0);var g=s[b].color?s[b].color:h._colorSet[b%h._colorSet.length];e>c&&ja(k.plotArea.ctx, +f[b].center,f[b].radius,g,h.type,c,e,h.fillOpacity,f[b].percentInnerRadius);if(d)break}l()},function(){k.disableToolTip=!1;k._animator.animate(0,k.animatedRender?500:0,function(a){b(a);l()})})}}};var ra=function(a,d,b,c){"undefined"===typeof b&&(b=1);0>=Math.round(d.y4-d.y1)||(a.save(),a.globalAlpha=b,a.beginPath(),a.moveTo(Math.round(d.x1),Math.round(d.y1)),a.lineTo(Math.round(d.x2),Math.round(d.y2)),a.lineTo(Math.round(d.x3),Math.round(d.y3)),a.lineTo(Math.round(d.x4),Math.round(d.y4)),"undefined"!== +d.x5&&(a.lineTo(Math.round(d.x5),Math.round(d.y5)),a.lineTo(Math.round(d.x6),Math.round(d.y6))),a.closePath(),a.fillStyle=c?c:d.color,a.fill(),a.globalAplha=1,a.restore())};p.prototype.renderFunnel=function(a){function d(){for(var a=0,b=[],c=0;ck?(k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=0==k?0:a/k,h+=a/k,m=!0):(n=(Math.abs(ba)*b-Math.sqrt(k))/2,k=b-2*n/Math.abs(ba),h+=n,h>d&&(h-=n, +k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=a/k,h+=a/k,m=!0),b=k)),e.push(n);return e}function c(){if(t&&C){for(var a,b,c,e,d,g,l,h,m,n,k,q,s,w,p=[],B=[],x={percent:null,total:null},v=null,y=0;yp[y]&&(p[y]=y!==fa?t.reversed?P[y].x3-P[y].x4:P[y].x2-P[y].x1:P[y].x2-P[y].x1,p[y]/=2));s=b.indexLabelMaxWidth?b.indexLabelMaxWidth:t.options.indexLabelMaxWidth?t.indexLabelMaxWidth:p[y];if(s>p[y]||0>s)s=p[y];B[y]="inside"===t.indexLabelPlacement?P[y].height:!1;x=z.getPercentAndTotal(t,b);if(t.indexLabelFormatter||b.indexLabelFormatter)v={chart:z.options,dataSeries:t,dataPoint:b,total:x.total,percent:x.percent};b=b.indexLabelFormatter?b.indexLabelFormatter(v):b.indexLabel? +z.replaceKeywordsWithValue(b.indexLabel,b,t,y):t.indexLabelFormatter?t.indexLabelFormatter(v):t.indexLabel?z.replaceKeywordsWithValue(t.indexLabel,b,t,y):b.label?b.label:"";0>=n&&(n=0);1E3>s&&1E3-sl?l:t.indexLabelMaxWidth:l,h=J.length-1;0<=h;h--){g=C[J[h].id];c=J[h];e=c.textBlock;b=(a=n(h)b.y&&(d=!0);c=g.indexLabelMaxWidth||l;if(c>l||0>c)c=l;f.push(c)}if(d)for(h=J.length-1;0<=h;h--)a=P[h],J[h].textBlock.maxWidth= +f[f.length-(h+1)],J[h].textBlock.measureText(),J[h].textBlock.x=L-l,c=J[h].textBlock.heightpa+D&&(J[h].textBlock.y=pa+D-J[h].height),J[h].textBlock.ywa+D&&(J[h].textBlock.y=wa+D-J[h].height))}function g(){var a,b,c,e;if("inside"!==t.indexLabelPlacement)for(var d=0;dDa?f(c).x2+1:(a.x2+a.x3)/2+1:(a.x2+a.x3)/2+1:"undefined"!==typeof a.x5?cpa+D&&(J[d].textBlock.y=pa+D-J[d].height),J[d].textBlock.ywa+D&&(J[d].textBlock.y=wa+D-J[d].height)));else for(d=0;d=c?(b=d!=fa?(a.x4+a.x3)/2-e/2:(a.x5+a.x4)/2-e/2,c=d!=fa?(a.y1+a.y3)/2-c/2:(a.y1+a.y4)/2-c/2,J[d].textBlock.x=b, +J[d].textBlock.y=c):J[d].isDirty=!0)}function m(){function a(b,c){var d;if(0>b||b>=J.length)return 0;var e,f=J[b].textBlock;if(0>c){c*=-1;e=q(b);d=l(e,b);if(d>=c)return f.y-=c,c;if(0==b)return 0=c)return f.y+=c,c;if(b==P.length-1)return 0e)&&(l=n(s),!(l>=J.length-1)&&J[s].textBlock.y+J[s].height+ga>J[l].textBlock.y&&(J[s].textBlock.y=J[s].textBlock.y+J[s].height-e>e-J[s].textBlock.y?e+1:e-J[s].height-1))}for(l=P.length-1;0e&&(e=0,J[e].isDirty))break;if(J[l].textBlock.y=f){f=0;h+=J[f].height;break}e=q(f); +if(0>e){f=0;h+=J[f].height;break}}if(f!=l){g=J[f].textBlock.y;a-=g;a=h-a;g=c(a,d,f);break}}}return g}function c(a,b,d){var e=[],f=0,g=0;for(a=Math.abs(a);d<=b;d++)e.push(P[d]);e.sort(function(a,b){return a.height-b.height});for(d=0;d+m.y.toFixed(6))&&(d=g.y+d+ga-m.y,e=a(w,-d),ea?t.reversed?wa-D:pa-D:J[a].textBlock.y+J[a].height+ga)}function k(a,b,c){var d,e,f,l=[],m=D,n=[];-1!==b&&(0<=W.indexOf(b)?(e=W.indexOf(b),W.splice(e,1)):(W.push(b),W=W.sort(function(a,b){return a-b})));if(0===W.length)l= +ia;else{e=D*(1!=W.length||0!=W[0]&&W[0]!=P.length-1?2:1)/h();for(var q=0;qn&&(n*=-1),c.y1+=b-n[d],c.y2+=b-n[d],c.y3+=b-n[d],c.y4+=b-n[d],c.y5&&(c.y5+=b-n[d],c.y6+=b-n[d]),n[d]=b}};a._animator.animate(0,c,function(c){var d=a.plotArea.ctx||a.ctx;ja=!0;d.clearRect(x.x1,x.y1,x.x2-x.x1,x.y2-x.y1);d.fillStyle=a.backgroundColor;d.fillRect(x.x1,x.y1,x.width,x.height);w.changeSection(c,b);var e={};e.dataSeries=t;e.dataPoint=t.reversed?t.dataPoints[C.length-1-b]:t.dataPoints[b];e.index=t.reversed?C.length-1-b:b;a.toolTip.highlightObjects([e]); +for(e=0;ea){b=P[c];break}return b?(a=b.y6?a>b.y6?b.x3+(b.x4-b.x3)/(b.y4-b.y3)*(a-b.y3):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2), +{x1:a,x2:a}):-1}function p(a){for(var b=0;b=a.dataSeriesIndexes.length)){for(var t=this.data[a.dataSeriesIndexes[0]],C=t.dataPoints,x=this.plotArea,D=0.025*x.width,y=0.01*x.width,A=0,F=x.height-2*D,E=Math.min(x.width-2*y,2.8*x.height),H=!1,I=0;IF?N=F:0>=N&&(N=0),G>a?G=a-0.5:0>=G&&(G=0)):"pyramid"===t.type&&(G=N=0,t.reversed=t.reversed?!1:!0);var y=I+a/2,$=I,V=I+a,pa=t.reversed?Z:O,K=y-G/2,ea=y+G/2,Da=t.reversed?O+N:Z- +N,wa=t.reversed?O:Z;a=[];var y=[],P=[],E=[],X=O,fa,ba=(Da-pa)/(K-$),ha=-ba,I="area"===(t.valueRepresents?t.valueRepresents:"height")?b():d();if(-1!==I){if(t.reversed)for(E.push(X),G=I.length-1;0a&&(A=a));for(G=0;G\n');c.document.close();setTimeout(function(){c.focus();c.print();setTimeout(function(){b._canvasJSContainer.removeChild(d)},1E3)},500)};p.prototype.getPercentAndTotal=function(a,d){var b=null,c=null, +e=null;if(0<=a.type.indexOf("stacked"))c=0,b=d.x.getTime?d.x.getTime():d.x,b in a.plotUnit.yTotals&&(c=a.plotUnit.yTotals[b],e=isNaN(d.y)?0:100*(d.y/c));else if("pie"===a.type||"doughnut"===a.type||"funnel"===a.type||"pyramid"===a.type){for(b=c=0;b=m||"undefined"=== +typeof m||0>=v||"undefined"===typeof v)){if("horizontal"===this.orientation){n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:v,maxHeight:this.itemWrap?m:this.lineHeight,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"});n.textBlock.measureText();null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"=== +n.chartType?2*0.1*this.lineHeight:0)));if(!q||q.width+Math.round(n.textBlock.width+r+l+(0===q.width?0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))>g)q={items:[],width:0},h.push(q),this.height+=f,f=0;f=Math.max(f,n.textBlock.height)}else n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:x,maxHeight:!0===this.itemWrap?m:1.5*this.fontSize,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily, +fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"}),n.textBlock.measureText(),null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))),this.height>0,0),this.dataPoints.length):0):(s=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,s=0>0,0),this.dataPoints.length):0));for(;;){g=0a?c.x/a:a/c.x: +Math.abs(c.x-a);qs-e&&s+e>=this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}return d||b.dataPoint.x!==a?d&&null!==b.dataPoint?b:null:b};F.prototype.getDataPointAtXY=function(a,d,b){if(!this.dataPoints||0===this.dataPoints.length||athis.chart.plotArea.x2||dthis.chart.plotArea.y2)return null;b=b||!1;var c=[],e=0,g=0,m=1,l=!1,k=Infinity, +h=0,s=0,q=0;if("none"!==this.chart.plotInfo.axisPlacement)if(q=(this.chart.axisX[0]?this.chart.axisX[0]:this.chart.axisX2[0]).getXValueAt({x:a,y:d}),this.axisX.logarithmic)var n=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),q=1>0,0),this.dataPoints.length):0;else n=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,q=0> +0,0),this.dataPoints.length):0;for(;;){g=0=n.x1&&(a<=n.x2&&d>=n.y1&&d<=n.y2)&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1- +a),Math.abs(n.x2-a),Math.abs(n.y1-d),Math.abs(n.y2-d))}),l=!0);break;case "line":case "stepLine":case "spline":case "area":case "stepArea":case "stackedArea":case "stackedArea100":case "splineArea":case "scatter":var u=na("markerSize",f,this)||4,r=b?20:u,p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0r&&(p=Math.atan2(d-u.y,a-u.x),0>p&&(p+=2*Math.PI),p=Number(((180*(p/Math.PI)%360+360)%360).toFixed(12)),u=Number(((180*(n.startAngle/Math.PI)%360+360)%360).toFixed(12)),r=Number(((180*(n.endAngle/Math.PI)%360+360)%360).toFixed(12)),0===r&&1=r&&0!==f.y&&(r+=360,pu&&pp.y1&&dp.y6?(g=p.x6+(p.x5-p.x6)/(p.y5-p.y6)*(d-p.y6),p=p.x3+(p.x4-p.x3)/(p.y4-p.y3)*(d-p.y3)):(g=p.x1+(p.x6-p.x1)/(p.y6-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)):(g=p.x1+(p.x4-p.x1)/(p.y4-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)),a>g&&a=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y4-n.borderThickness/2&&d<=n.y1+n.borderThickness/ +2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "candlestick":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y2-n.borderThickness/2&&d<=n.y3+n.borderThickness/2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a), +Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "ohlc":if(Math.abs(n.x2-a+n.x1-a)=n.y2&&d<=n.y3||a>=n.x1&&a<=(n.x2+n.x1)/2&&d>=n.y1-n.borderThickness/2&&d<=n.y1+n.borderThickness/2||a>=(n.x1+n.x2)/2&&a<=n.x2&&d>=n.y4-n.borderThickness/2&&d<=n.y4+n.borderThickness/2)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0}if(l||1E3q-e&&q+e>= +this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}a=null;for(d=0;dq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius, +horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle",borderThickness:0}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}f=n;for(b=this.intervalStartPosition;b<=e;b=parseFloat(1E-12>this.interval?this.logarithmic&&this.equidistantInterval?b*Math.pow(this.logarithmBase,this.interval):b+this.interval:(this.logarithmic&&this.equidistantInterval? +b*Math.pow(this.logarithmBase,this.interval):b+this.interval).toFixed(12))){for(;fq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix, +horizontalAlign:"left",backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}}else for(this.intervalStartPosition=this.getLabelStartPoint(new Date(this.viewportMinimum), +this.intervalType,this.interval),e=Ya(new Date(this.viewportMaximum),this.interval,this.intervalType),f=n,b=this.intervalStartPosition;bq[f].endValue;f++);p=a;a=f=q[f].startValue&&a<=q[f].endValue;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:new Date(p),label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:Ca(p,this.valueFormatString,this.chart._cultureInfo), +a=new ka(this.ctx,{x:0,y:0,maxWidth:g,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null, +breaksLabelType:void 0}))}if("bottom"===this._position||"top"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.width*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length-2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.width/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+ +"Duration"]*this.interval,g="undefined"===typeof this.options.labelMaxWidth?0.5*this.chart.width>>0:this.options.labelMaxWidth,this.chart.panEnabled||(m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize);else if("left"===this._position||"right"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.height*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length- +2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.height/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+"Duration"]*this.interval,this.chart.panEnabled||(g="undefined"===typeof this.options.labelMaxWidth?0.3*this.chart.width>>0:this.options.labelMaxWidth),m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize; +for(c=0;cthis.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360)),"bottom"===this._position||"top"===this._position)if(g=0.9*l>>0,n=0,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize= +this.labelFontSize;this.sessionVariables.labelMaxWidth=g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=this.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;bn&&(v=b,n=p.width)}b=0;for(b=this.intervalStartPosition< +this.viewportMinimum?1:0;b>0>2*g&&(this.sessionVariables.labelAngle=-25)):(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle):u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth= +g,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p)):(this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=this.labelWrap);else{if(u(this.options.labelWrap))if(!u(this.options.labelMaxWidth))this.options.labelMaxWidth>0,f=this.labelFontSize,nq&&(q=c-2*g,c>=2*g&&c<2.2*g?(this.sessionVariables.labelMaxWidth=g,u(this.options.labelFontSize)&&12=2.2*g&&c<2.8*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=f):c>=2.8*g&&c<3.2*g?(this.sessionVariables.labelMaxWidth=Math.max(g,n),this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12=3.2*g&&c<3.6*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=this.labelFontSize):c>3.6*g&&c<5*g?(u(this.options.labelFontSize)&&125*g&&(this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelFontSize=f,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=this.labelAngle));else if(v===b&&(0===v&&n+this._labels[v+1].textBlock.measureText().width-2*g>q||v===this._labels.length-1&&n+this._labels[v-1].textBlock.measureText().width-2*g>q||0q&&n+this._labels[v-1].textBlock.measureText().width- +2*g>q))q=0===v?n+this._labels[v+1].textBlock.measureText().width-2*g:n+this._labels[v-1].textBlock.measureText().width-2*g,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p;else if(0===q)for(this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,c=0;c>0>2*g&&(this.sessionVariables.labelAngle=-25))}else(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/ +Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=0!=this.labelAngle?(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)):g,this.sessionVariables.labelMaxHeight=m=this.labelWrap?(h-p*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)):1.5*this.labelFontSize,u(this.options.labelWrap))?u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap= +this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelMaxHeight=c<0.9*l?0.9*l:c,this.sessionVariables.labelWrap=this.labelWrap)):(this.options.labelWrap?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p): +(u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelWrap=this.labelWrap),this.sessionVariables.labelMaxHeight=m)}for(c=0;c>0:this.options.labelMaxWidth,m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize=this.labelFontSize;this.sessionVariables.labelMaxWidth= +g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b>0,l-2*m>n&&(n=l-2*m,l>=2*m&&l<2.4*m?(u(this.options.labelFontSize)&&12=2.4*m&&l<2.8*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelFontSize=this.labelFontSize,this.sessionVariables.labelWrap=!0):l>=2.8*m&&l<3.2*m?(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12< +this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>=3.2*m&&l<3.6*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelFontSize=this.labelFontSize):l>3.6*m&&l<10*m?(u(this.options.labelFontSize)&& +1210*m&&l<50*m&&(u(this.options.labelFontSize)&&12this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,u(this.options.labelMaxWidth)&& +(this.sessionVariables.labelAngle=this.labelAngle))):this.options.labelWrap?(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=g):(this.sessionVariables.labelMaxHeight=m,u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap)}for(c=0;c>0:1.5*this.labelFontSize;if("left"===this._position||"right"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.width>>0:1.5*this.labelFontSize;u(g.labelBackgroundColor)&&(g.labelBackgroundColor="#EEEEEE")}else m="bottom"===this._position||"top"===this._position?0.9*this.chart.width>>0:0.9*this.chart.height>> +0,z=u(g.options.labelWrap)||g.labelWrap?"bottom"===this._position||"top"===this._position?0.8*this.chart.width>>0:0.8*this.chart.height>>0:1.5*this.labelFontSize,u(g.labelBackgroundColor)&&(u(g.startValue)&&0!==g.startValue?g.labelBackgroundColor=r?"transparent":null:g.labelBackgroundColor="#EEEEEE");a=new ka(this.ctx,{x:0,y:0,backgroundColor:g.labelBackgroundColor,borderColor:g.labelBorderColor,borderThickness:g.labelBorderThickness,cornerRadius:g.labelCornerRadius,maxWidth:g.options.labelMaxWidth? +g.options.labelMaxWidth:m,maxHeight:z,angle:this.labelAngle,text:g.labelFormatter?g.labelFormatter({chart:this.chart,axis:this,stripLine:g}):g.label,horizontalAlign:"left",fontSize:"outside"===g.labelPlacement?g.options.labelFontSize?g.labelFontSize:this.labelFontSize:g.labelFontSize,fontFamily:"outside"===g.labelPlacement?g.options.labelFontFamily?g.labelFontFamily:this.labelFontFamily:g.labelFontFamily,fontWeight:"outside"===g.labelPlacement?g.options.labelFontWeight?g.labelFontWeight:this.labelFontWeight: +g.labelFontWeight,fontColor:g.labelFontColor||g.color,fontStyle:"outside"===g.labelPlacement?g.options.labelFontStyle?g.labelFontStyle:this.fontWeight:g.labelFontStyle,textBaseline:"middle"});this._stripLineLabels.push({position:g.value,textBlock:a,effectiveHeight:null,stripLine:g})}};z.prototype.createLabelsAndCalculateWidth=function(){var a=0,d=0;this._labels=[];this._stripLineLabels=[];var b=this.chart.isNavigator?0:5;if("left"===this._position||"right"===this._position){this.createLabels();for(d= +0;d=this.viewportMinimum&&this._stripLineLabels[d].stripLine.value<=this.viewportMaximum)&& +(c=this._stripLineLabels[d].textBlock,e=c.measureText(),g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle)),a=this.viewportMinimum&&this._stripLineLabels[b].stripLine.value<=this.viewportMaximum)&&(d=this._stripLineLabels[b].textBlock,e=d.measureText(),g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)),an[f].viewportMaximum);v++)r[v].endValue=n[f].viewPortMinimum&&(n[f].scaleBreaks.lastBreakIndex=v));for(var z=v=0,t=0,C=0,x=0,D=0,y=0,A,E,F=l=0,H,I,L,r=H=I=L=!1,f=0;fv;){var G=0,R=0,S=0,U=0,W=e=0,K=0,$=0,V=0,X=0,P=0,ba=0;if(b&& +0p.width- +q?p.width-q:g.x2-ba-$);if(a&&0p.width-q?p.width-q:g.x2-ba-$),a[f]._labels&&1k&&(l+=0a[f].labelAngle?A-zk&&(l=E+t/2-k-ba),A-za[f].labelAngle&&0p.width-q?p.width-q:g.x2-ba-$),d[f].lineCoordinates.width=Math.abs(k-m),d[f]._labels&&1v;){V=U=R=S=$=K=W=e=Q=O=G=X=0;if(a&&0p.width-10?p.width-10:g.x2-V-W),b[f].labelAutoFit&&!u(C)&&(0b[f].labelAngle?Math.max(m,C):0===b[f].labelAngle? +Math.max(m,C/2):m),0c[f].chart.width-10?c[f].chart.width-10:g.x2-V-W),c[f]&& +c[f].labelAutoFit&&!u(D)&&(0b[f].chart.height-10?b[f].chart.height-10:g.y2),b[f].lineCoordinates.y1=l-(q[f]+b[f].margin+ +X),b[f].lineCoordinates.y2=l-(q[f]+b[f].margin+X),b[f].bounds={x1:m,y1:l-(q[f]+X+b[f].margin),x2:k,y2:h-(X+b[f].margin),width:k-m,height:q[f]},b[f].title&&(b[f]._titleTextBlock.maxWidth=0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0===b[K].labelAngle?k-U:m);if(c&&0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0=== +b[K].labelAngle?k-V:m);if(c&&0d[g].spacing?0:Math.abs(d[g].spacing/b),this.logarithmic&&(d[g].size=Math.pow(this.logarithmBase,d[g].size))};z.prototype.calculateBreaksInPixels=function(){if(!(this.scaleBreaks&&0>=this.scaleBreaks._appliedBreaks.length)){var a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];a.length&&(this.scaleBreaks.firstBreakIndex=this.scaleBreaks.lastBreakIndex=null);for(var d=0;dthis.conversionParameters.maximum);d++)a[d].endValue< +this.conversionParameters.minimum||(u(this.scaleBreaks.firstBreakIndex)&&(this.scaleBreaks.firstBreakIndex=d),a[d].startValue>=this.conversionParameters.minimum&&(a[d].startPixel=this.convertValueToPixel(a[d].startValue),this.scaleBreaks.lastBreakIndex=d),a[d].endValue<=this.conversionParameters.maximum&&(a[d].endPixel=this.convertValueToPixel(a[d].endValue)))}};z.prototype.renderLabelsTicksAndTitle=function(){var a=this,d=!1,b=0,c=0,e=1,g=0;0!==this.labelAngle&&360!==this.labelAngle&&(e=1.2);if("undefined"=== +typeof this.options.interval){if("bottom"===this._position||"top"===this._position)if(this.logarithmic&&!this.equidistantInterval&&this.labelAutoFit){for(var b=[],e=0!==this.labelAngle&&360!==this.labelAngle?1:1.2,m,l=this.viewportMaximum,k=this.lineCoordinates.width/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||mthis.lineCoordinates.width*e&&this.labelAutoFit&&(d=!0)}if("left"===this._position||"right"===this._position)if(this.logarithmic&& +!this.equidistantInterval&&this.labelAutoFit){for(var b=[],p,l=this.viewportMaximum,k=this.lineCoordinates.height/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||pthis.lineCoordinates.height*e&&this.labelAutoFit&&(d=!0)}}this.logarithmic&&(!this.equidistantInterval&&this.labelAutoFit)&&this._labels.sort(function(a,b){return a.position-b.position});var h=0,q,n;if("bottom"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y+this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y-(this.tickLength+q.textBlock.fontSize/2):n.y+this.tickLength+q.textBlock.fontSize/2):(n.x="inside"===this.labelPlacement?0>this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x-(0>this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0>this.labelAngle?n.y-this.tickLength-5:n.y-this.tickLength-Math.abs(q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle)+5):n.y+this.tickLength+Math.abs(0>this.labelAngle?q.textBlock.width* +Math.sin(Math.PI/180*this.labelAngle)-5:5)),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save(); +a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y-a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y2-this._titleTextBlock.height-3,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("top"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y-this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y+this.labelFontSize/2+this.tickLength+5:n.y-(this.tickLength+q.textBlock.height-q.textBlock.fontSize/2)):(n.x="inside"===this.labelPlacement?0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&& +(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y+a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y1+1,this.titleMaxWidth= +this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("left"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<< +0,c),this.ctx.lineTo(n.x-this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle?(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5):(q.textBlock.y="inside"===this.labelPlacement?n.y:n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness; +a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x+a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x1+1,this._titleTextBlock.y=this.lineCoordinates.height/2+this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("right"=== +this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<<0,c),this.ctx.lineTo(n.x+this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle? +(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width-this.tickLength-5:n.x+this.tickLength+5):(q.textBlock.y="inside"===this.labelPlacement?n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0>this.labelAngle?n.y:n.y-(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.cos(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<< +0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x-a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x2-1,this._titleTextBlock.y=this.lineCoordinates.height/2-this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}g=0;if("inside"===this.labelPlacement)this.chart.addEventListener("dataAnimationIterationEnd", +function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)||(a.ctx.save(),a.ctx.beginPath(),q.textBlock.render(!0),a.ctx.restore())},this);else for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||q.textBlock.render(!0)};z.prototype.renderInterlacedColors=function(){var a=this.chart.plotArea.ctx,d,b,c=this.chart.plotArea, +e=0;d=!0;if(("bottom"===this._position||"top"===this._position)&&this.interlacedColor)for(a.fillStyle=this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(Math.min(b.x,d.x),c.y1,Math.abs(b.x-d.x),Math.abs(c.y1-c.y2)),d=!1):d=!0;else if(("left"===this._position||"right"===this._position)&&this.interlacedColor)for(a.fillStyle= +this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(c.x1,Math.min(b.y,d.y),Math.abs(c.x1-c.x2),Math.abs(d.y-b.y)),d=!1):d=!0;a.beginPath()};z.prototype.renderStripLinesOfThicknessType=function(a){if(this.stripLines&&0this.viewportMaximum||u(h.value)||isNaN(this.range))||l.push(h))}for(c=0;cthis.viewportMaximum||isNaN(this.range))){a=this.getPixelCoordinatesOnAxis(b.position);if("outside"===b.stripLine.labelPlacement)if(h&&(this.ctx.strokeStyle= +h.color,"pixel"===h._thicknessType&&(this.ctx.lineWidth=h.thickness)),"bottom"===this._position){var p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0;this.ctx.beginPath();this.ctx.moveTo(p,a.y<<0);this.ctx.lineTo(p,a.y+this.tickLength<<0);this.ctx.stroke();0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y+=this.tickLength+b.textBlock.fontSize/2):(a.x-=0>this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0,a.y+=this.tickLength+Math.abs(0>this.labelAngle?b.textBlock.width*Math.sin(Math.PI/ +180*this.labelAngle)-5:5))}else"top"===this._position?(p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,this.ctx.beginPath(),this.ctx.moveTo(p,a.y<<0),this.ctx.lineTo(p,a.y-this.tickLength<<0),this.ctx.stroke(),0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y-=this.tickLength+b.textBlock.height):(a.x+=(b.textBlock.height-this.tickLength-this.labelFontSize/2)*Math.sin(Math.PI/180*this.labelAngle)-(0this.labelAngle?a.y:a.y-(b.textBlock.height-b.textBlock.fontSize/ +2-5)*Math.cos(Math.PI/180*this.labelAngle),a.x=0this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/ +2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+=b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y1+b.textBlock.width+3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-b.textBlock.width-3:"center"=== +b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y1+3):"top"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+= +b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+b.textBlock.width+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y2-3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y2- +b.textBlock.width-3):"left"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-b.textBlock.height>this.chart.plotArea.y1?u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3:a.y-b.textBlock.heightthis.chart.plotArea.y1? +u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2-3:a.y-b.textBlock.heightthis.viewportMaximum|| +isNaN(this.range))||a[d].render(this.maskCtx);this.maskCtx.restore()}};z.prototype.renderCrosshair=function(a,d){this.crosshair.render(a,d)};z.prototype.renderGrid=function(){if(this.gridThickness&&0this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(),d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.x<<0)+0.5:d.x<<0,a.moveTo(d,b.y1<<0),a.lineTo(d,b.y2<<0),a.stroke());else if("left"===this._position||"right"===this._position)for(var c=0;cthis.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(), +d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.y<<0)+0.5:d.y<<0,a.moveTo(b.x1<<0,d),a.lineTo(b.x2<<0,d),a.stroke());a.restore()}};z.prototype.renderAxisLine=function(){var a=this.chart.ctx,d=r?this.chart._preRenderCtx:a,b=Math.ceil(this.tickThickness/(this.reversed?-2:2)),c=Math.ceil(this.tickThickness/(this.reversed?2:-2)),e,g;d.save();if("bottom"===this._position||"top"===this._position){if(this.lineThickness){this.reversed?(e=this.lineCoordinates.x2,g=this.lineCoordinates.x1): +(e=this.lineCoordinates.x1,g=this.lineCoordinates.x2);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor?this.lineColor:"black";d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));var m=1===this.lineThickness%2?(this.lineCoordinates.y1<<0)+0.5:this.lineCoordinates.y1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+c;else for(var l= +this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(e,m),d.lineTo(this.scaleBreaks._appliedBreaks[l].startPixel+b,m),e=this.scaleBreaks._appliedBreaks[l].endPixel+c;e&&(d.moveTo(e,m),d.lineTo(g,m));d.stroke()}}else if(("left"===this._position||"right"===this._position)&&this.lineThickness){this.reversed?(e=this.lineCoordinates.y1,g=this.lineCoordinates.y2):(e=this.lineCoordinates.y2,g=this.lineCoordinates.y1);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor; +d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));m=1===this.lineThickness%2?(this.lineCoordinates.x1<<0)+0.5:this.lineCoordinates.x1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+b;else for(l=this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(m,e),d.lineTo(m,this.scaleBreaks._appliedBreaks[l].startPixel+c), +e=this.scaleBreaks._appliedBreaks[l].endPixel+b;e&&(d.moveTo(m,e),d.lineTo(m,g));d.stroke()}r&&(a.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx&&this.chart._breaksCanvasCtx.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),d.clearRect(0,0,this.chart.width,this.chart.height));d.restore()};z.prototype.getPixelCoordinatesOnAxis=function(a){var d={};if("bottom"===this._position||"top"===this._position)d.x=this.convertValueToPixel(a), +d.y=this.lineCoordinates.y1;if("left"===this._position||"right"===this._position)d.y=this.convertValueToPixel(a),d.x=this.lineCoordinates.x2;return d};z.prototype.convertPixelToValue=function(a){if("undefined"===typeof a)return null;var d=0,b=0,c,d=!0,e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b="number"===typeof a?a:"left"===this._position||"right"===this._position?a.y:a.x;if(this.logarithmic){a=c=Math.pow(this.logarithmBase,(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit); +if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;be[b].startValue/this.conversionParameters.minimum){c/=e[b].startValue/this.conversionParameters.minimum;if(ce[b].startValue/e[b-1].endValue){c/=e[b].startValue/e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum){if(1e[b].startValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].startValue/this.conversionParameters.minimum*Math.pow(e[b].size,Math.log(e[b].startValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue))*c,c*=Math.pow(e[b].size,Math.log(this.conversionParameters.minimum/e[b].startValue)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size;d=!1}else break;else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size}else break; +d=a*this.viewportMinimum}else{a=c=(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit;if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b=e[b].size?0:c*(e[b].endValue- +e[b].startValue)/e[b].size;break}else a+=e[b].endValue-this.conversionParameters.minimum-e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue),c-=e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue);d=!1}else if(c>e[b].startValue-this.conversionParameters.minimum){c-=e[b].startValue-this.conversionParameters.minimum;if(ce[b].startValue-e[b-1].endValue){c-=e[b].startValue-e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum)if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue- +e[b].startValue)/e[b].size>e[b].startValue){a=0>=e[b].size?0:c*(e[b].endValue-e[b].startValue)/e[b].size;break}else a+=e[b].startValue-this.conversionParameters.minimum+e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),c+=e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),d=!1;else if(c-1*e[b].size){a+=(e[b].endValue- +e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size;d=!1}else break;else if(c-1*e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size}else break;d=this.conversionParameters.minimum+a}return d};z.prototype.convertValueToPixel=function(a){a=this.getApparentDifference(this.conversionParameters.minimum, +a,a);return this.logarithmic?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*Math.log(a/this.conversionParameters.minimum)/this.conversionParameters.lnLogarithmBase+0.5<<0:"axisX"===this.type?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5<<0:this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5};z.prototype.getApparentDifference=function(a, +d,b,c){var e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];if(this.logarithmic){b=u(b)?d/a:b;for(var g=0;ge[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*e[g].startValue*e[g].size:a>=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*a*Math.pow(e[g].size,Math.log(e[g].endValue/a)/Math.log(e[g].endValue/e[g].startValue)):a<=e[g].startValue&&d<=e[g].endValue?b=b/d*e[g].startValue*Math.pow(e[g].size,Math.log(d/e[g].startValue)/Math.log(e[g].endValue/ +e[g].startValue)):!c&&(a>e[g].startValue&&de[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+e[g].startValue+e[g].size:a>e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+a+e[g].size*(e[g].endValue-a)/(e[g].endValue-e[g].startValue):a<=e[g].startValue&&de[g].startValue&&da[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<= +a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*this.viewportMinimum,b=0a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<=a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+this.viewportMinimum, +b=0this.maxWidth?8:6);var a=Math.max(c,Math.floor(this.maxWidth/a)),e,g,m,c=0;!u(this.options.viewportMinimum)&&(!u(this.options.viewportMaximum)&&this.options.viewportMinimum>=this.options.viewportMaximum)&& +(this.viewportMinimum=this.viewportMaximum=null);if(u(this.options.viewportMinimum)&&!u(this.sessionVariables.newViewportMinimum)&&!isNaN(this.sessionVariables.newViewportMinimum))this.viewportMinimum=this.sessionVariables.newViewportMinimum;else if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(u(this.options.viewportMaximum)&&!u(this.sessionVariables.newViewportMaximum)&&!isNaN(this.sessionVariables.newViewportMaximum))this.viewportMaximum=this.sessionVariables.newViewportMaximum; +else if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(c=0;c=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue)&& +(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue)){this.scaleBreaks._appliedBreaks.splice(c,1);break}if("axisX"===this.type){if(this.dataSeries&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g, +null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0));c=this.getApparentDifference(isNaN(this.viewportMinimum)||null===this.viewportMinimum?e:this.viewportMinimum,isNaN(this.viewportMaximum)||null===this.viewportMaximum?g:this.viewportMaximum,null, +!0);if("axisX"===this.type&&b){this.intervalType||(c/1<=a?(this.interval=1,this.intervalType="millisecond"):c/2<=a?(this.interval=2,this.intervalType="millisecond"):c/5<=a?(this.interval=5,this.intervalType="millisecond"):c/10<=a?(this.interval=10,this.intervalType="millisecond"):c/20<=a?(this.interval=20,this.intervalType="millisecond"):c/50<=a?(this.interval=50,this.intervalType="millisecond"):c/100<=a?(this.interval=100,this.intervalType="millisecond"):c/200<=a?(this.interval=200,this.intervalType= +"millisecond"):c/250<=a?(this.interval=250,this.intervalType="millisecond"):c/300<=a?(this.interval=300,this.intervalType="millisecond"):c/400<=a?(this.interval=400,this.intervalType="millisecond"):c/500<=a?(this.interval=500,this.intervalType="millisecond"):c/(1*S.secondDuration)<=a?(this.interval=1,this.intervalType="second"):c/(2*S.secondDuration)<=a?(this.interval=2,this.intervalType="second"):c/(5*S.secondDuration)<=a?(this.interval=5,this.intervalType="second"):c/(10*S.secondDuration)<=a?(this.interval= +10,this.intervalType="second"):c/(15*S.secondDuration)<=a?(this.interval=15,this.intervalType="second"):c/(20*S.secondDuration)<=a?(this.interval=20,this.intervalType="second"):c/(30*S.secondDuration)<=a?(this.interval=30,this.intervalType="second"):c/(1*S.minuteDuration)<=a?(this.interval=1,this.intervalType="minute"):c/(2*S.minuteDuration)<=a?(this.interval=2,this.intervalType="minute"):c/(5*S.minuteDuration)<=a?(this.interval=5,this.intervalType="minute"):c/(10*S.minuteDuration)<=a?(this.interval= +10,this.intervalType="minute"):c/(15*S.minuteDuration)<=a?(this.interval=15,this.intervalType="minute"):c/(20*S.minuteDuration)<=a?(this.interval=20,this.intervalType="minute"):c/(30*S.minuteDuration)<=a?(this.interval=30,this.intervalType="minute"):c/(1*S.hourDuration)<=a?(this.interval=1,this.intervalType="hour"):c/(2*S.hourDuration)<=a?(this.interval=2,this.intervalType="hour"):c/(3*S.hourDuration)<=a?(this.interval=3,this.intervalType="hour"):c/(6*S.hourDuration)<=a?(this.interval=6,this.intervalType= +"hour"):c/(1*S.dayDuration)<=a?(this.interval=1,this.intervalType="day"):c/(2*S.dayDuration)<=a?(this.interval=2,this.intervalType="day"):c/(4*S.dayDuration)<=a?(this.interval=4,this.intervalType="day"):c/(1*S.weekDuration)<=a?(this.interval=1,this.intervalType="week"):c/(2*S.weekDuration)<=a?(this.interval=2,this.intervalType="week"):c/(3*S.weekDuration)<=a?(this.interval=3,this.intervalType="week"):c/(1*S.monthDuration)<=a?(this.interval=1,this.intervalType="month"):c/(2*S.monthDuration)<=a?(this.interval= +2,this.intervalType="month"):c/(3*S.monthDuration)<=a?(this.interval=3,this.intervalType="month"):c/(6*S.monthDuration)<=a?(this.interval=6,this.intervalType="month"):(this.interval=c/(1*S.yearDuration)<=a?1:c/(2*S.yearDuration)<=a?2:c/(4*S.yearDuration)<=a?4:Math.floor(z.getNiceNumber(c/(a-1),!0)/S.yearDuration),this.intervalType="year"));if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=e-m/2;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum= +g+m/2;d?this.autoValueFormatString="MMM DD YYYY HH:mm":"year"===this.intervalType?this.autoValueFormatString="YYYY":"month"===this.intervalType?this.autoValueFormatString="MMM YYYY":"week"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"day"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"hour"===this.intervalType?this.autoValueFormatString="hh:mm TT":"minute"===this.intervalType?this.autoValueFormatString="hh:mm TT":"second"===this.intervalType?this.autoValueFormatString= +"hh:mm:ss TT":"millisecond"===this.intervalType&&(this.autoValueFormatString="fff'ms'");this.valueFormatString||(this.valueFormatString=this.autoValueFormatString)}else{this.intervalType="number";c=z.getNiceNumber(c,!1);this.interval=this.options&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g,null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)):(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0)),Math.abs(this.getApparentDifference(e,g,null,!0)),"axisX"===this.type&&b){this.valueType="dateTime";if(null===this.minimum||isNaN(this.minimum))this.minimum=e-m/2;if(null===this.maximum||isNaN(this.maximum))this.maximum=g+m/2}else this.intervalType=this.valueType="number",null===this.minimum&&(this.minimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval,this.minimum=Math.min(this.minimum, +null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?Infinity:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval,this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?-Infinity:this.sessionVariables.viewportMaximum)),0===this.maximum&&0===this.minimum&&(0===this.options.minimum?this.maximum+=10:0=== +this.options.maximum&&(this.minimum-=10));u(this.sessionVariables.newViewportMinimum)&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));u(this.sessionVariables.newViewportMaximum)&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.range=this.viewportMaximum-this.viewportMinimum;this.intervalStartPosition="axisX"===this.type&&b?this.getLabelStartPoint(new Date(this.viewportMinimum),this.intervalType,this.interval):Math.floor((this.viewportMinimum+0.2*this.interval)/ +this.interval)*this.interval;this.valueFormatString||(this.valueFormatString=z.generateValueFormatString(this.range,2))}};z.prototype.calculateLogarithmicAxisParameters=function(){var a=this.chart.layoutManager.getFreeSpace(),d=Math.log(this.logarithmBase),b;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?500>this.maxWidth?7:Math.max(7,Math.floor(this.maxWidth/100)):Math.max(Math.floor(this.maxWidth/ +50),3),c,e,g,m;m=1;if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(m=0;m=this.scaleBreaks._appliedBreaks[m].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[m].startValue|| +!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue)&&(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue)){this.scaleBreaks._appliedBreaks.splice(m,1);break}"axisX"===this.type? +(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,1===e/c&&(m=Math.pow(this.logarithmBase,"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin, +e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,0>=c&&!isFinite(e)?(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1):0>=c?c=e:isFinite(e)||(e=c),1===c&&1===e?(e*=this.logarithmBase-1/this.logarithmBase,c=1):1===e/c?(m=Math.min(e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),e*=m,c/=m):c>e?(m=Math.min(c/e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase, +0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&1e&&(e=1));m=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)/(isNaN(this.viewportMinimum)||null=== +this.viewportMinimum?c:this.viewportMinimum);var l=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)-(isNaN(this.viewportMinimum)||null===this.viewportMinimum?c:this.viewportMinimum);this.intervalType="number";m=Math.pow(this.logarithmBase,z.getNiceNumber(Math.abs(Math.log(m)/d),!1));this.options&&0this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(c)||isFinite(e)?1===c&&1===e?(e*=this.logarithmBase,c/=this.logarithmBase):1===e/c?(m=Math.pow(this.logarithmBase,this.interval),e*=m,c/=m):c>e?(m= +Math.min(0.01*(c/e),5),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)):(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.minimum||isNaN(this.minimum))&&1e&&(e=1)),this.intervalType="number",null===this.minimum&&(this.minimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval)),this.minimum=Math.min(this.minimum,null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?"undefined"===typeof this.sessionVariables.newViewportMinimum?Infinity:this.sessionVariables.newViewportMinimum:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum= +"axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval)),this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?"undefined"===typeof this.sessionVariables.newViewportMaximum?0:this.sessionVariables.newViewportMaximum:this.sessionVariables.viewportMaximum)),1===this.maximum&&1===this.minimum&&(1===this.options.minimum?this.maximum*=this.logarithmBase-1/this.logarithmBase: +1===this.options.maximum&&(this.minimum/=this.logarithmBase-1/this.logarithmBase));this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum);this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum);this.viewportMinimum>this.viewportMaximum&&(!this.options.viewportMinimum&&!this.options.minimum||this.options.viewportMaximum||this.options.maximum?this.options.viewportMinimum||this.options.minimum||!this.options.viewportMaximum&&!this.options.maximum||(this.viewportMinimum=this.minimum= +(this.options.viewportMaximum||this.options.maximum)/Math.pow(this.logarithmBase,2*Math.ceil(this.interval))):this.viewportMaximum=this.maximum=this.options.viewportMinimum||this.options.minimum);c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval);this.range=this.viewportMaximum/this.viewportMinimum;this.noTicks=a;if(!this.options.interval&&this.rangethis.viewportMaximum||3>a?2:3)){for(d=Math.floor(this.viewportMinimum/ +b+0.5)*b;dthis.interval&&(this.interval=b,c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval))),this.equidistantInterval=!0,this.intervalStartPosition=c;if(!this.valueFormatString&&(this.valueFormatString="#,##0.##",1>this.viewportMinimum)){d=Math.floor(Math.abs(Math.log(this.viewportMinimum)/ +Math.LN10))+2;if(isNaN(d)||!isFinite(d))d=2;if(2a&&(c+=Math.floor(Math.abs(Math.log(a)/Math.LN10)),isNaN(c)||!isFinite(c))&&(c=d);for(var e=0;eb?1>=c?1:5>=c?5:10:Math.max(Math.floor(c),1);return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.getNiceNumber= +function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=d?1.5>c?1:3>c?2:7>c?5:10:1>=c?1:2>=c?2:5>=c?5:10;return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.prototype.getLabelStartPoint=function(){var a=S[this.intervalType+"Duration"]*this.interval,a=new Date(Math.floor(this.viewportMinimum/a)*a);if("millisecond"!==this.intervalType)if("second"===this.intervalType)0=a||"bottom"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(c,l),this.ctx.lineTo(m,l),this.ctx.lineTo(m,e);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(l-h)/a/3;for(var n=0;n=a||"right"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(m,e),this.ctx.lineTo(m,l), +this.ctx.lineTo(c,l);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(m-k)/a/3;for(n=0;nthis.parent.range?2:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range? +1:0):50this.parent.range?2:10>this.parent.range?1:0);this.valueFormatString=z.generateValueFormatString(this.parent.range,h)}var l=null===this.opacity?1:this.opacity,h=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness),p=this.chart.overlaidCanvasCtx,q=p.globalAlpha;p.globalAlpha=l;p.beginPath();p.strokeStyle=this.color;p.lineWidth=h;p.save();this.labelFontSize= +u(this.options.labelFontSize)?this.parent.labelFontSize:this.labelFontSize;if("left"===this.parent._position||"right"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?this.parent.bounds.x2-this.parent.bounds.x1:this.labelMaxWidth,this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?3*this.chart.height:2*this.labelFontSize;else if("top"===this.parent._position||"bottom"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?3*this.chart.width:this.labelMaxWidth, +this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?this.parent.bounds.height:2*this.labelFontSize;0this.chart.bounds.x2?l.x=this.chart.bounds.x2-l.width:l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}}else if("bottom"===this.parent._position||"top"===this.parent._position){n=this.parent.convertPixelToValue({x:a});for(r=0;rthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"=== +this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}m=null;("bottom"===this.parent._position||"top"===this.parent._position)&&(b>=this.parent.convertValueToPixel(this.parent.viewportMinimum)&&c<=this.parent.convertValueToPixel(this.parent.viewportMaximum))&&(0=this.parent.convertValueToPixel(this.parent.viewportMaximum)&& +e<=this.parent.convertValueToPixel(this.parent.viewportMinimum))&&(0this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x1-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}else{if("bottom"===this.parent._position||"top"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)? +ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label,l.x=b-l.measureText().width/2,l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width),l.xthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2),"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2);0(new Date).getTime()-this._lastUpdated||(this._lastUpdated=(new Date).getTime(), +this.chart.resetOverlayedCanvas(),this._updateToolTip(a,d))};$.prototype._updateToolTip=function(a,d,b){b="undefined"===typeof b?!0:b;this.container||this._initialize();this.enabled||this.hide();if(!this.chart.disableToolTip){if("undefined"===typeof a||"undefined"===typeof d){if(isNaN(this._prevX)||isNaN(this._prevY))return;a=this._prevX;d=this._prevY}else this._prevX=a,this._prevY=d;var c=null,e=null,g=[],k=0;if(this.shared&&this.enabled&&"none"!==this.chart.plotInfo.axisPlacement){if("xySwapped"=== +this.chart.plotInfo.axisPlacement){var l=[];if(this.chart.axisX)for(var p=0;ph.dataSeries.axisY.viewportMaximum&&b++;b-h.dataPoint.y.length&&g.push(h)}else"column"===e.type||"bar"===e.type?0>h.dataPoint.y?0>h.dataSeries.axisY.viewportMinimum&&h.dataSeries.axisY.viewportMaximum>=h.dataPoint.y&&g.push(h):h.dataSeries.axisY.viewportMinimum<=h.dataPoint.y&&0<=h.dataSeries.axisY.viewportMaximum&&g.push(h):"bubble"===e.type?(b=this.chart._eventManager.objectMap[e.dataPointIds[h.index]].size/2,h.dataPoint.y>= +h.dataSeries.axisY.viewportMinimum-b&&h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum+b&&g.push(h)):"waterfall"===e.type?(b=0,h.cumulativeSumYStartValueh.dataSeries.axisY.viewportMaximum&&b++,h.cumulativeSumh.dataSeries.axisY.viewportMaximum&&b++,2>b&&-2=h.dataSeries.axisY.viewportMinimum&& +h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum)&&g.push(h);else g.push(h)}}if(0a&&(a+=this.container.clientWidth+20);a+this.container.clientWidth> +Math.max(this.chart.container.clientWidth,this.chart.width)&&(a=Math.max(0,Math.max(this.chart.container.clientWidth,this.chart.width)-this.container.clientWidth));d=1!==g.length||this.shared||"line"!==g[0].dataSeries.type&&"stepLine"!==g[0].dataSeries.type&&"spline"!==g[0].dataSeries.type&&"area"!==g[0].dataSeries.type&&"stepArea"!==g[0].dataSeries.type&&"splineArea"!==g[0].dataSeries.type?"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"=== +g[0].dataSeries.type?g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x):d:g[0].dataSeries.axisY.convertValueToPixel(g[0].dataPoint.y);d=-d+10;0":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content? +this.content:"{name}:  {y}",p=b.axisXIndex):"bubble"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y},   {z}"): +"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y[0]}, {y[1]}"):"candlestick"=== +b.type||"ohlc"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Open:   {y[0]}
High:    {y[1]}
Low:   {y[2]}
Close:   {y[3]}"):"boxAndWhisker"=== +b.type&&(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"), +null===d&&(d=""),!0===this.reversed?(d=this.chart.replaceKeywordsWithValue(g,c,b,e)+d,l"+d)):(d+=this.chart.replaceKeywordsWithValue(g,c,b,e),l")));null!==d&&(d=h+d)}else{b=a[0].dataSeries;c=a[0].dataPoint;e=a[0].index;if(null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent)return null;"line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"===b.type||"splineArea"===b.type||"column"=== +b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y}":"bubble"===b.type?g=c.toolTipContent? +c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y},   {z}":"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.name?"{name}:  ":c.label?"{label}:  ":"")+"{y}":"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+" :  {y[0]},  {y[1]}": +"candlestick"===b.type||"ohlc"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Open:   {y[0]}
High:    {y[1]}
Low:     {y[2]}
Close:   {y[3]}":"boxAndWhisker"===b.type&&(g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent: +this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"); +null===d&&(d="");d+=this.chart.replaceKeywordsWithValue(g,c,b,e)}return d};$.prototype.enableAnimation=function(){if(!this.container.style.WebkitTransition){var a=this.getContainerTransition(this.containerTransitionDuration);this.container.style.WebkitTransition=a;this.container.style.MsTransition=a;this.container.style.transition=a;this.container.style.MozTransition=this.mozContainerTransition}};$.prototype.disableAnimation=function(){this.container.style.WebkitTransition&&(this.container.style.WebkitTransition= +"",this.container.style.MozTransition="",this.container.style.MsTransition="",this.container.style.transition="")};$.prototype.hide=function(a){this.container&&(this.container.style.display="none",this.currentSeriesIndex=-1,this._prevY=this._prevX=NaN,("undefined"===typeof a||a)&&this.chart.resetOverlayedCanvas())};$.prototype.show=function(a,d,b){this._updateToolTip(a,d,"undefined"===typeof b?!1:b)};$.prototype.fixMozTransitionDelay=function(a,d){if(20c&&a.push(d),d.animationCallback(c),1<=c&&d.onComplete)d.onComplete();this.animations=a;0g;g++)for(var e=0;3>e;e++){for(var f=0,d=0;3>d;d++)f+=a[g][d]*b[d][e];c[g][e]=f}return c}function P(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX= +a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha;b.font=a.font;b.textAlign=a.textAlign;b.textBaseline=a.textBaseline;b.arcScaleX_=a.arcScaleX_;b.arcScaleY_=a.arcScaleY_;b.lineScale_=a.lineScale_}function Q(a){var b=a.indexOf("(",3),c=a.indexOf(")",b+1),b=a.substring(b+1,c).split(",");if(4!=b.length||"a"!=a.charAt(3))b[3]=1;return b}function E(a,b,c){return Math.min(c,Math.max(b,a))}function F(a,b,c){0>c&&c++;16*c?a+6*(b-a)*c: +1>2*c?b:2>3*c?a+6*(b-a)*(2/3-c):a}function G(a){if(a in H)return H[a];var b,c=1;a=String(a);if("#"==a.charAt(0))b=a;else if(/^rgb/.test(a)){c=Q(a);b="#";for(var g,e=0;3>e;e++)g=-1!=c[e].indexOf("%")?Math.floor(255*(parseFloat(c[e])/100)):+c[e],b+=v[E(g,0,255)];c=+c[3]}else if(/^hsl/.test(a)){e=c=Q(a);b=parseFloat(e[0])/360%360;0>b&&b++;g=E(parseFloat(e[1])/100,0,1);e=E(parseFloat(e[2])/100,0,1);if(0==g)g=e=b=e;else{var f=0.5>e?e*(1+g):e+g-e*g,d=2*e-f;g=F(d,f,b+1/3);e=F(d,f,b);b=F(d,f,b-1/3)}b="#"+ +v[Math.floor(255*g)]+v[Math.floor(255*e)]+v[Math.floor(255*b)];c=c[3]}else b=Z[a]||a;return H[a]={color:b,alpha:c}}function C(a){this.m_=D();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=1*q;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=a;var b="width:"+a.clientWidth+"px;height:"+a.clientHeight+"px;overflow:hidden;position:absolute", +c=a.ownerDocument.createElement("div");c.style.cssText=b;a.appendChild(c);b=c.cloneNode(!1);b.style.backgroundColor="red";b.style.filter="alpha(opacity=0)";a.appendChild(b);this.element_=c;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}function R(a,b,c,g){a.currentPath_.push({type:"bezierCurveTo",cp1x:b.x,cp1y:b.y,cp2x:c.x,cp2y:c.y,x:g.x,y:g.y});a.currentX_=g.x;a.currentY_=g.y}function S(a,b){var c=G(a.strokeStyle),g=c.color,c=c.alpha*a.globalAlpha,e=a.lineScale_*a.lineWidth;1>e&&(c*=e);b.push("')}function T(a,b,c,g){var e=a.fillStyle,f=a.arcScaleX_,d=a.arcScaleY_,k=g.x-c.x,n=g.y-c.y;if(e instanceof w){var h=0,l=g=0,u=0,m=1;if("gradient"==e.type_){h=e.x1_/f;c=e.y1_/d;var p=s(a,e.x0_/f,e.y0_/d),h=s(a,h,c),h=180*Math.atan2(h.x-p.x,h.y-p.y)/Math.PI;0>h&&(h+=360);1E-6>h&&(h=0)}else p=s(a,e.x0_,e.y0_),g=(p.x-c.x)/k,l=(p.y-c.y)/n,k/=f*q, +n/=d*q,m=x.max(k,n),u=2*e.r0_/m,m=2*e.r1_/m-u;f=e.colors_;f.sort(function(a,b){return a.offset-b.offset});d=f.length;p=f[0].color;c=f[d-1].color;k=f[0].alpha*a.globalAlpha;a=f[d-1].alpha*a.globalAlpha;for(var n=[],r=0;r')}else e instanceof +I?k&&n&&b.push("'):(e=G(a.fillStyle),b.push(''))}function s(a,b,c){a=a.m_;return{x:q*(b*a[0][0]+c*a[1][0]+a[2][0])-r,y:q*(b*a[0][1]+c*a[1][1]+a[2][1])-r}}function z(a,b,c){isFinite(b[0][0])&&(isFinite(b[0][1])&&isFinite(b[1][0])&&isFinite(b[1][1])&&isFinite(b[2][0])&&isFinite(b[2][1]))&&(a.m_=b,c&&(a.lineScale_=aa(ba(b[0][0]*b[1][1]-b[0][1]* +b[1][0]))))}function w(a){this.type_=a;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}function I(a,b){if(!a||1!=a.nodeType||"IMG"!=a.tagName)throw new A("TYPE_MISMATCH_ERR");if("complete"!=a.readyState)throw new A("INVALID_STATE_ERR");switch(b){case "repeat":case null:case "":this.repetition_="repeat";break;case "repeat-x":case "repeat-y":case "no-repeat":this.repetition_=b;break;default:throw new A("SYNTAX_ERR");}this.src_=a.src;this.width_=a.width;this.height_=a.height} +function A(a){this.code=this[a];this.message=a+": DOM Exception "+this.code}var x=Math,k=x.round,J=x.sin,K=x.cos,ba=x.abs,aa=x.sqrt,q=10,r=q/2;navigator.userAgent.match(/MSIE ([\d.]+)?/);var M=Array.prototype.slice;O(document);var U={init:function(a){a=a||document;a.createElement("canvas");a.attachEvent("onreadystatechange",W(this.init_,this,a))},init_:function(a){a=a.getElementsByTagName("canvas");for(var b=0;bd;d++)for(var B=0;16>B;B++)v[16*d+B]=d.toString(16)+B.toString(16);var Z={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC", +bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000", +darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082", +ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA", +mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5", +peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"}, +H={},L={},$={butt:"flat",round:"round"},d=C.prototype;d.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null);this.element_.innerHTML=""};d.beginPath=function(){this.currentPath_=[]};d.moveTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.lineTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.bezierCurveTo= +function(a,b,c,g,e,f){e=s(this,e,f);a=s(this,a,b);c=s(this,c,g);R(this,a,c,e)};d.quadraticCurveTo=function(a,b,c,g){a=s(this,a,b);c=s(this,c,g);g={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)};R(this,g,{x:g.x+(c.x-this.currentX_)/3,y:g.y+(c.y-this.currentY_)/3},c)};d.arc=function(a,b,c,g,e,f){c*=q;var d=f?"at":"wa",k=a+K(g)*c-r,n=b+J(g)*c-r;g=a+K(e)*c-r;e=b+J(e)*c-r;k!=g||f||(k+=0.125);a=s(this,a,b);k=s(this,k,n);g=s(this,g,e);this.currentPath_.push({type:d, +x:a.x,y:a.y,radius:c,xStart:k.x,yStart:k.y,xEnd:g.x,yEnd:g.y})};d.rect=function(a,b,c,g){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath()};d.strokeRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath();this.stroke();this.currentPath_=e};d.fillRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+ +c,b+g);this.lineTo(a,b+g);this.closePath();this.fill();this.currentPath_=e};d.createLinearGradient=function(a,b,c,g){var e=new w("gradient");e.x0_=a;e.y0_=b;e.x1_=c;e.y1_=g;return e};d.createRadialGradient=function(a,b,c,g,e,f){var d=new w("gradientradial");d.x0_=a;d.y0_=b;d.r0_=c;d.x1_=g;d.y1_=e;d.r1_=f;return d};d.drawImage=function(a,b){var c,g,e,d,r,y,n,h;e=a.runtimeStyle.width;d=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var l=a.width,u=a.height;a.runtimeStyle.width= +e;a.runtimeStyle.height=d;if(3==arguments.length)c=arguments[1],g=arguments[2],r=y=0,n=e=l,h=d=u;else if(5==arguments.length)c=arguments[1],g=arguments[2],e=arguments[3],d=arguments[4],r=y=0,n=l,h=u;else if(9==arguments.length)r=arguments[1],y=arguments[2],n=arguments[3],h=arguments[4],c=arguments[5],g=arguments[6],e=arguments[7],d=arguments[8];else throw Error("Invalid number of arguments");var m=s(this,c,g),p=[];p.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))};d.stroke=function(a){var b=[];b.push("d.x)d.x=f.x;if(null==c.y||f.yd.y)d.y=f.y}}b.push(' ">');a?T(this,b,c,d):S(this,b);b.push("");this.element_.insertAdjacentHTML("beforeEnd",b.join(""))};d.fill=function(){this.stroke(!0)};d.closePath=function(){this.currentPath_.push({type:"close"})};d.save=function(){var a= +{};P(this,a);this.aStack_.push(a);this.mStack_.push(this.m_);this.m_=t(D(),this.m_)};d.restore=function(){this.aStack_.length&&(P(this.aStack_.pop(),this),this.m_=this.mStack_.pop())};d.translate=function(a,b){z(this,t([[1,0,0],[0,1,0],[a,b,1]],this.m_),!1)};d.rotate=function(a){var b=K(a);a=J(a);z(this,t([[b,a,0],[-a,b,0],[0,0,1]],this.m_),!1)};d.scale=function(a,b){this.arcScaleX_*=a;this.arcScaleY_*=b;z(this,t([[a,0,0],[0,b,0],[0,0,1]],this.m_),!0)};d.transform=function(a,b,c,d,e,f){z(this,t([[a, +b,0],[c,d,0],[e,f,1]],this.m_),!0)};d.setTransform=function(a,b,c,d,e,f){z(this,[[a,b,0],[c,d,0],[e,f,1]],!0)};d.drawText_=function(a,b,c,d,e){var f=this.m_;d=0;var r=1E3,t=0,n=[],h;h=this.font;if(L[h])h=L[h];else{var l=document.createElement("div").style;try{l.font=h}catch(u){}h=L[h]={style:l.fontStyle||"normal",variant:l.fontVariant||"normal",weight:l.fontWeight||"normal",size:l.fontSize||10,family:l.fontFamily||"sans-serif"}}var l=h,m=this.element_;h={};for(var p in l)h[p]=l[p];p=parseFloat(m.currentStyle.fontSize); +m=parseFloat(l.size);"number"==typeof l.size?h.size=l.size:-1!=l.size.indexOf("px")?h.size=m:-1!=l.size.indexOf("em")?h.size=p*m:-1!=l.size.indexOf("%")?h.size=p/100*m:-1!=l.size.indexOf("pt")?h.size=m/0.75:h.size=p;h.size*=0.981;p=h.style+" "+h.variant+" "+h.weight+" "+h.size+"px "+h.family;m=this.element_.currentStyle;l=this.textAlign.toLowerCase();switch(l){case "left":case "center":case "right":break;case "end":l="ltr"==m.direction?"right":"left";break;case "start":l="rtl"==m.direction?"right": +"left";break;default:l="left"}switch(this.textBaseline){case "hanging":case "top":t=h.size/1.75;break;case "middle":break;default:case null:case "alphabetic":case "ideographic":case "bottom":t=-h.size/2.25}switch(l){case "right":d=1E3;r=0.05;break;case "center":d=r=500}b=s(this,b+0,c+t);n.push('');e?S(this,n):T(this,n,{x:-d,y:0}, +{x:r,y:h.size});e=f[0][0].toFixed(3)+","+f[1][0].toFixed(3)+","+f[0][1].toFixed(3)+","+f[1][1].toFixed(3)+",0,0";b=k(b.x/q)+","+k(b.y/q);n.push('','','');this.element_.insertAdjacentHTML("beforeEnd",n.join(""))};d.fillText=function(a,b,c,d){this.drawText_(a,b,c,d,!1)};d.strokeText=function(a, +b,c,d){this.drawText_(a,b,c,d,!0)};d.measureText=function(a){this.textMeasureEl_||(this.element_.insertAdjacentHTML("beforeEnd",''),this.textMeasureEl_=this.element_.lastChild);var b=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(b.createTextNode(a));return{width:this.textMeasureEl_.offsetWidth}};d.clip=function(){}; +d.arcTo=function(){};d.createPattern=function(a,b){return new I(a,b)};w.prototype.addColorStop=function(a,b){b=G(b);this.colors_.push({offset:a,color:b.color,alpha:b.alpha})};d=A.prototype=Error();d.INDEX_SIZE_ERR=1;d.DOMSTRING_SIZE_ERR=2;d.HIERARCHY_REQUEST_ERR=3;d.WRONG_DOCUMENT_ERR=4;d.INVALID_CHARACTER_ERR=5;d.NO_DATA_ALLOWED_ERR=6;d.NO_MODIFICATION_ALLOWED_ERR=7;d.NOT_FOUND_ERR=8;d.NOT_SUPPORTED_ERR=9;d.INUSE_ATTRIBUTE_ERR=10;d.INVALID_STATE_ERR=11;d.SYNTAX_ERR=12;d.INVALID_MODIFICATION_ERR= +13;d.NAMESPACE_ERR=14;d.INVALID_ACCESS_ERR=15;d.VALIDATION_ERR=16;d.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=U;CanvasRenderingContext2D=C;CanvasGradient=w;CanvasPattern=I;DOMException=A}(); + +/* + CanvasJS jQuery Charting Plugin - https://canvasjs.com/ + Copyright 2017 fenopix + + --------------------- License Information -------------------- + CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. + https://canvasjs.com/license/ + +*/ +(function(b,c,d,e){b.fn.CanvasJSChart=function(a){if(a){var b=this.first();a=new CanvasJS.Chart(this[0],a);b.children(".canvasjs-chart-container").data("canvasjsChartRef",a);a.render();return this}return this.first().children(".canvasjs-chart-container").data("canvasjsChartRef")}})(jQuery,window,document); +/*eslint-enable*/ +/*jshint ignore:end*/ \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/license.txt b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/license.txt new file mode 100644 index 00000000..f9882a14 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/license.txt @@ -0,0 +1,9 @@ +* +* @preserve CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ +* Copyright 2018 fenopix +* +* --------------------- License Information -------------------- +* CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. +* https://canvasjs.com/license/ +* +* \ No newline at end of file From 51267177a5176eeadc5b11a1cc5c026175c3d5ef Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 15 Jun 2019 17:02:06 +0530 Subject: [PATCH 099/166] test cases added --- .../SRIP Project 1 Documentation.pdf | Bin 235622 -> 235748 bytes SRIP/Project-2 Issue Number 243/Codes/exp6.js | 71 ++++++++++-------- .../SRIP Project 2 Documentation.pdf | Bin 0 -> 395373 bytes .../Test Cases for Project 2.pdf | Bin 0 -> 49652 bytes 4 files changed, 39 insertions(+), 32 deletions(-) create mode 100644 SRIP/Project-2 Issue Number 243/SRIP Project 2 Documentation.pdf create mode 100644 SRIP/Project-2 Issue Number 243/Test Cases for Project 2.pdf diff --git a/SRIP/Project-1 Issue Number 240/SRIP Project 1 Documentation.pdf b/SRIP/Project-1 Issue Number 240/SRIP Project 1 Documentation.pdf index a3fde9f332c318eb9fa1ac7b4da5be2397bcb44d..a67da9c1ecf22be06aa167e7534e6fb31a089e19 100644 GIT binary patch delta 4354 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 HAoG6!pTgbZ diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Project-2 Issue Number 243/Codes/exp6.js index cf721c84..e6dac4d1 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.js +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.js @@ -24,11 +24,12 @@ window.onload = function() { var s2Size = 0; var chart = new CanvasJS.Chart("chartContainer", { + title: {text: "Chart"}, axisX:{ - title: "X-axis" + title: "X-axis", }, axisY: { - title: "Y-axis" + title: "Y-axis", }, data: [{ showInLegend: true, @@ -57,8 +58,8 @@ window.onload = function() { } function addDataPointsAndRender2() { - xValue = Number(document.getElementById("xValue").value); - yValue = Number(document.getElementById("yValue").value); + var xValue = Number(document.getElementById("xValue").value); + var yValue = Number(document.getElementById("yValue").value); series2.push({ x: xValue, y: yValue @@ -100,7 +101,7 @@ window.onload = function() { xmeanClass1 += series1[i1].x; ymeanClass1 += series1[i1].y; - if (distributionFunction === 1) { + if (distributionFunction == 1) { l1gammax += series1[i1].x; l1gammay += series1[i1].y; } @@ -119,14 +120,14 @@ window.onload = function() { ymax1 = series1[i1].y; } - if (distributionFunction === 1) { + if (distributionFunction == 1) { l1gammax /= series1.length; l1gammay /= series1.length; } xmeanClass1 = xmeanClass1 / series1.length; ymeanClass1 = ymeanClass1 / series1.length; - if (distributionFunction === 0) { + if (distributionFunction == 0) { document.getElementById("mean1x").innerHTML = xmeanClass1; document.getElementById("mean1y").innerHTML = ymeanClass1; } @@ -145,14 +146,14 @@ window.onload = function() { covariance22Val1 = covariance22Val1 / series1.length - ymeanClass1 * ymeanClass1; covariance12Val1 = covariance12Val1 / series1.length - xmeanClass1 * ymeanClass1; - if (distributionFunction === 0) { + if (distributionFunction == 0) { document.getElementById("c11-1").innerHTML = covariance11Val1; document.getElementById("c12-1").innerHTML = covariance12Val1; document.getElementById("c21-1").innerHTML = covariance12Val1; document.getElementById("c22-1").innerHTML = covariance22Val1; } - if (distributionFunction === 1) { + if (distributionFunction == 1) { document.getElementById("c11-1").innerHTML = ""; document.getElementById("c12-1").innerHTML = ""; document.getElementById("c21-1").innerHTML = ""; @@ -168,7 +169,7 @@ window.onload = function() { xmeanClass2 += series2[i2].x; ymeanClass2 += series2[i2].y; - if (distributionFunction === 1) { + if (distributionFunction == 1) { l2gammax += series2[i2].x; l2gammay += series2[i2].y; } @@ -187,14 +188,14 @@ window.onload = function() { ymax2 = series2[i2].y; } - if (distributionFunction === 1) { + if (distributionFunction == 1) { l2gammax /= series2.length; l2gammay /= series2.length; } xmeanClass2 = xmeanClass2 / series2.length; ymeanClass2 = ymeanClass2 / series2.length; - if (distributionFunction === 0) { + if (distributionFunction == 0) { document.getElementById("mean2x").innerHTML = xmeanClass2; document.getElementById("mean2y").innerHTML = ymeanClass2; } @@ -213,14 +214,14 @@ window.onload = function() { covariance22Val2 = covariance22Val2 / series2.length - ymeanClass2 * ymeanClass2; covariance12Val2 = covariance12Val2 / series2.length - xmeanClass2 * ymeanClass2; - if (distributionFunction === 0) { + if (distributionFunction == 0) { document.getElementById("c11-2").innerHTML = covariance11Val2; document.getElementById("c12-2").innerHTML = covariance12Val2; document.getElementById("c21-2").innerHTML = covariance12Val2; document.getElementById("c22-2").innerHTML = covariance22Val2; } - if (distributionFunction === 1) { + if (distributionFunction == 1) { document.getElementById("c11-1").innerHTML = ""; document.getElementById("c12-1").innerHTML = ""; document.getElementById("c21-1").innerHTML = ""; @@ -231,7 +232,9 @@ window.onload = function() { document.getElementById("c22-2").innerHTML = ""; } s2Size = series2.length; - + console.log(xmeanClass1); + console.log(series1); + console.log(series2); } function addmarkAll() { @@ -239,11 +242,11 @@ window.onload = function() { var p1; var p2; var i; - var series1=[]; + var series1 = []; var series2 = []; - var l = -1; - var r = 1; - if(distributionFunction === 0){ + var l = -5; + var r = 5; + if(distributionFunction == 0){ for(i = l; i < r; i += (r - l) / 100.0){ for (j = l; j < r; j += (r - l) / 100.0) { p1 = prob1(j, i); @@ -252,20 +255,17 @@ window.onload = function() { x: i, y: j }); - chart.render(); continue; } series2.push({ x: i, y: j }); - chart.render(); } } - //chart.render(); } - if (distributionFunction === 1) { + if (distributionFunction == 1) { for (i = l; i < r; i += (r - l) / 100.0) { for (j = l; j < r; j += (r - l) / 100.0) { p1 = prob1(j, i); @@ -274,41 +274,39 @@ window.onload = function() { x: i, y: j }); - chart.render(); } if (p2 > p1) { series2.push({ x: i, y: j }); - chart.render(); } - if (p1 !== p2 || p1 === 0.0) { + if (p1 != p2 || p1 == 0.0) { continue; } series2.push({ x: i, y: j }); - chart.render(); } } - //chart.render(); } console.log(series1); console.log(series2); + console.log(distributionFunction); + chart1up(series1, series2); } function prob1(x, y){ var r = 0.0; - if(distributionFunction === 0){ + if(distributionFunction == 0){ var sigmax = Math.sqrt(covariance22Val1); var sigmay = Math.sqrt(covariance11Val1); var rho = covariance12Val1 / (sigmax * sigmay); rho = 0.0; r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass1, 2.0) / covariance11Val1 + Math.pow(x - ymeanClass1, 2.0) / covariance22Val1 - 2.0 * rho * (y - xmeanClass1) * (x - ymeanClass1) / (sigmax * sigmay))); - if (distributionFunction === 1 && x <= xmax1 && x >= xmin1 && y <= ymax1 && y >= ymin1) { + if (distributionFunction == 1 && x <= xmax1 && x >= xmin1 && y <= ymax1 && y >= ymin1) { r = s1Size; } console.log(r); @@ -319,20 +317,29 @@ window.onload = function() { function prob2(x, y) { var r = 0.0; - if (distributionFunction === 0) { + if (distributionFunction == 0) { var sigmax = Math.sqrt(covariance22Val2); var sigmay = Math.sqrt(covariance11Val2); var rho = covariance12Val2 / (sigmax * sigmay); rho = 0.0; r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass2, 2.0) / covariance11Val2 + Math.pow(x - ymeanClass2, 2.0) / covariance22Val2 - 2.0 * rho * (y - xmeanClass2) * (x - ymeanClass2) / (sigmax * sigmay))); } - if (distributionFunction === 1 && x <= xmax2 && x >= xmin2 && y <= ymax2 && y >= ymin2) { + if (distributionFunction == 1 && x <= xmax2 && x >= xmin2 && y <= ymax2 && y >= ymin2) { r = s2Size; } console.log(r); return r; } + function chart1up(series1, series2){ + chart.options.title.text = "Updated Chart"; + chart.options.data[0].type = "area"; + chart.options.data[0].dataPoints = series1; + chart.options.data[1].type = "area"; + chart.options.data[1].dataPoints = series2; + chart.render(); + console.log('heloooocjdijfos'); + } var addClass1 = document.getElementById("add-class-1"); addClass1.addEventListener("click", addDataPointsAndRender1); diff --git a/SRIP/Project-2 Issue Number 243/SRIP Project 2 Documentation.pdf b/SRIP/Project-2 Issue Number 243/SRIP Project 2 Documentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..33222670a6b9b6ca0e76ffd6f8c504d4d652b9a9 GIT binary patch literal 395373 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

O(QSCziQ+7?FgRe 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%0DGZ1 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


k|5#xr*$ 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

949TWq#F(^opzbtP>DJ*d_9 zZtkMdFgeJS>P*AbN~-3f&bjOx%pA;gAFt-$*fZHbo4-*nujV+VuE=x`nyQyP2m%7B z`b{$xQI^A!Ir~03)C$HUtd$9R~fKe@d7gC(-oPUbv@ks+~trpz`OA9U19p7CPjfm>HcKL=B_E-pOod{K_2W8eAi>joZ3mq#}i4ZmHjfjq*3g6Q2WVs1xe?4HHWiN_Y zBv<{L+uwsM+Mv_2l$t2CY!lWu*1_~fL(dBNs#v%UWPza}8jFY!9k#2X6_(|x4~uJHtzY!8U&?r%~lwNW}l zR058uE7iBDmON_t?@ckVRhr}P@S_i?E@0@xCmF6Vm=51Y-lIWV5Hq4lOl*@4ioCTPjNwAy4Nmu(#S=~zP+rtI%GQ*d2hG^un*exX{zbOym zMFt`>MJ2+BZDy~V5v^6IYhSOp*J_Izy?9%0+=3iY?xy5|90B7DGnc>@6iVy)8~m_w z-)n`W;w4dqE>eLc2qTvyafptu9_EUZdlwi=r)G!LkPA|V|dGXMR@kb09~@k^~a;Th3|NSHyFx|4r3~X9u=0ogL?YrTG5g^JBz()nU{v0hyP;6WY~#q%-}cW0X|_ zPufwifVf&*qpShw8m(Q_bQee}UE~a3qgArtY0hA+Y7XEXGc$FDpJpkmYDTD>ZmVpT zXwq?#E}5}Ucz6HJ8_>bz2K)HQt5m$3qon!M^7756A|l=zt6%{MY85LfrQe)ewTM}K z`j5GEqIs#J306>mKv@&^6)v2@3VuBBslo{^D#~2mj36q~T-7Ym-QOu!GDA;zp!4F# zmrr^jQD?drY(TpRQZ)N zKdJzg1=atx)GAv<4qaDu*!+iHs92mPgLBxN{<(|0wn-_4H}XnYLgke$lWcN8{*k|V zB%+-0{-G!vYUc$=G5z=&KDW1qYZ9wu2HB_`W(&OEYEs60zoy8JJ^Er&$-K`SIyX-R zdNEBI#jc+_bf#W2%ammDNml1#|D{YZ{Ze!EB%cEKB>j(jcko>J1n*OcGUlg&Z}1$M zclMHUX4E5ep%dU|4d$-T)?cR+z!d}R4(mTQJhG0KrcsZMIRK?14~r6R;*M^Bs_f(m z$;{6q7&S>UBaYGsxonh&cJaYtG3a4(M5$(` z_+~XP#3)Jc!D`4u{HUQW$B|bdh!gdVr6$rC8#hi}E_!|W7S6K1G}uw~u04H8a{)cG zJqSs=HTZe?P7ckKgV_$tQb`lzZC$DWvR0WfH|mM*M=}=qQ{&B=F-I?7g~{s+^|JQ( zD&l=*>Ec>9xz#_WcyeP^cWl&Fj$6^sHo{c)*s_DB{itFyrShwGmz}!Oefy|ElIMkMr*ed5AQyuv zG^!NUpypT%koQ<`S8!ot60Bs^kv%3k0h{qzFWAx-Dpr&F$o$|^YHY-lrc8~I{+H!D zgT(09#M1bpot2s`rJbdUs-smej`PQr(o0LWifyKBL#<$zAuVoxl1GPwoUNz+&(=7v)m&231EJ<~yavww=iCwzMz8E!}CZx#Fq5mH53ORNC!QyWNv$u8>Q2=*v0l z0i27=c7D0cUP=?9)@eD@vxt})o+~TY*Lr+1-Ks6+Ek%+u-+Yg1yOCzNkFe;+$|G-w-YJ&84cfU=RrQ6>+ANIE z7vp}Y1qR!d1G$Qozj#dtaZIl(3aSiK?-ixkW;H53f2&uk`ZB$M=e|DxSbXmB4EI&! zn1R${8`VXH}fTHcV&fF3AaN>jYDWAy&o#TBmgU)3sAwH^4G zsIXMNJ5)}>%@*`EohkcDpS1omIQpD&xAu9gEae-rDb(=MfXbA;e=d(t_k#L< zR489w2>QZm0Rzc7{&IZy98y>$LIAOPvhbxbA9z>1^@RJy?R|dkq38`z?dn}4MNb}9 zIVt$*l6UFHXxe1RGP#GSzRXu#XjBRCj5Ix0Touc7mxYSylk&=4V^LSFUq|Mk|8Vsv zaqxZisTLnJg{Xm}Rw?(sY7aIEbI3)XoqqLk4H5c+%Deacs+pc&O7YO(eU9a}v@d9> z= zc_w3Jq@<(<#yuf8+S=4`7n$n1NHuW}ZC%-Dp4DWp%kLi47zHuYq-ISifNxn<9!c6c z&2)blbF@{IcB|I%*FIogRa==qOs>?p96z(n&^U^?cqn;@KtVFMEh{rm(X1RlGrrKI zVpSetW|uTfXr0&Gv9hr-vrHX7r#N!N?rJK~td$F`EKkwYJnMQW$Vjn7dNs5ZBuX%K zwql?1zdI_I*43CKwDp#ZMs1^rH?z{<5;&zXQ$Mk$6nW6d>^!7$UKs+S)R-GGWmR_+ zK&~87Dz~hz5>B{`oL^$vCuV+3uAZRUS~^V~Xx{S6)$cJkX>`lDusmlMRT%KXYQ=u2 zH6I8+Yd1}1K6t=X`zg4o=|UiVPGnq*62_d+039HX|jsy$k4diMP;(hTzI39Gptdyv3gOV*m2^VQLPC7Wr zhnHA?gg2Z!4kl+tmV%<@?`M;QG)QNRoXev^mywgtxY|+1#1Tyt{kUx!#Hgm2u-94Owy;( z7)qRt*n4SsXLh5|q~oZZeJgo3^s`MrI-=&He>m6nu0<{i-hGCD9!;AH#WQJ9%0Y*ZC9P3df`)Pva; zIa*pv+A}8u4ajb52A)Mf=#`@*jfoGHVW4uu-wYiW$qv;gH0IB&j~4Zss_t1ADo~lq zJseI>E<#o|BqtYxn74!_YRx%Nj75SKlPz=wRD!$vbNNg^mfl?X|8!oa8w}?sUQBz>nF6KYW4hT z1oxCw`W|fu@zQ2Y@_CvcsMS9R@X*XlO1ID8;Vx^A#KizOPp#w*r>z;w5{$lr2&wXeCU7^4*qU}B4Mnv6SQG{_rgdv=97Ggbu_1A3_J8iT=N!{Qu3})=Btl8B7l!a{Gwf zv8_vO`Lz`YUUMCY_FZ6$$DibYRn9Pc6=Ju`-t<=x2vYAPJKKQNanf zuSEei_5FbO4q$e(Uf8~*q!01ucv%Y-#Ho!Iw{$g{sfu#8C{A9dTkHKsUM8(3sq^!Lj0D>Egp-)$w#-Qr+V>oP^V~j;J$jEHb*=9|M5qiZ z34br28R%2$SqRK!ZNFw%tsc?dL7~8@-P0r3-=m zXd>)?A~r{;qQ}r?<#5Z=t}q_JSeyhO5$^j0FKx;OB;Z?vHW%0*kT~(~jOYM_1=GVI zW1kB&EVsEd|iJ=ASx(q8xNP|fLUSpWS;*ljzFaroMsm)%!t z)~WZ_*j|Wtl_$t0)Iq;j2%t7+ir8*w%Sdma9ozOjXb`o!3Gv+%lR}92j)Pe+p^3fz zO6F=TBpzNO95uWtoF-f%{3RR>;hddyuRV~kj+{xG73H0O1AbQ!_h1`2Bc^5_!i3Mr z%+#ryjyG1%6PI*k|J3KmWjZaD26tjYGH>rI)sqfLnF~hRZ{bl`iK4(sV zBZyopCOMBQn~4w3>KtD^)EQ{(VVuzJUMFQ*OWlQqqSG%-Ff~5P;PSl|^b{Ya-5jKy6p;7bkheijUyckjH@Da<0 zSCV%xj2uBvp8{`P!ji<=c-f6+M|Ucv8`Q;>~Z?#z7RdLZ>`cnJH+Xm$=6j8?&xO}E$xb~^T&nHGxABhr^jhZq>uqmmStL4bPHXDp|D#%<{v zhOqBJ_dhx1(L1Pmz@}!x6R)@|YQpjw@%UZ02TsdDQ~%Ck}nW&uQg!bGh? zuG@1v%GVGCF&@mh*hd(T_K8idbu^^MXpc|D++hW^MT^4};GDb;4Af^C3&b;lsTk}^ z!aWhkdhi}m_up+o%wBn|Z(}ZP`WtSCymwmTw-~oY_fAD%gH$M$uKviM^j{-m>%F0} zLa_}nCLhXHh9$s76>#jJ0h`caEO3I7_{d>X8OlFMGe~{~LYz>&bKC*=$j%pTKX5tI zX@MiH>yM*q21R8QaCqU(UD(}~>j&>&;d4(`>VwEJQ58cWX#0_DrgHz%KOMh60ZG>d z6;%J(q6^|$w@)WXF1qpo#$-i(#oUUhl9yF%_?BC@!#<)yr-UADY5_j%6UjS$PG+Di zYO}A$o!7Q-14-^+J;>x(${laZvX^t{<@R0icBqwkw9Y=vo0iicyG7f&=e$zj&m-^z zM2KDp^>rq(7PBtQ6F@6K+m>i82=svNOlS%pJ6H$cLDq~t3v=_v%?L9ec-Rve7K}C{ z@BwLHN)_Frfr}+VHQKEs{5$du2)l`~X&>n!hrdd&V?o`8=v~b>)rV+EsGYL|V}gC8 z*qnQ~`7wUV%C3v$3iN;!(AXX-r1?kac%$9VB0VqKM>lEIp>e}D{Vnh0F^?Zsh$hq7xCFQxUQN- zU04eCKdcASbBRd zdw{Dr!DfQk0&fS(4M@3|j^Y~PJ@Z9DfH>bMcXtm~CczUro6!z?aU9U{PxSqHx*u~W zxk*Glg{@jAy`5Zl4du?RzxwB9AHY{E;`8V1zw0SH62p(%uy?dy?2}6IW&Mxax-G)u zn&I*D5CacZ1KiTC(TD3Wd~}^arav>3frxtjwpoix> z6J7CR?K8oT)nn?LVTn)$0p?UT<>PTZ2X10Pl`Fcxx+ zSeD}0wYlw-wy#Jh#yO*e@(EM;=exIVzBUCU z_hi5y7e8qOX(r(GP8dJXDZC&-uJ$l${Hlo{W2T6BBx1>^bFC+vj}Crd0eL8ZeO!Z% zdck$-?lI?TIIPjorm%IQD~A{2tr1S4swB;&!EOiWx;lCC}n$aSWt<0HuDsV0@U1 zz|wr0GicAiih*i<+j@L=uX^fs@^TBh#mR30%hwHD+Pb<9InAMnSy6WGG z0$NS9mL7C4baw*p8m>p zva4)#1U;*S3?6~q z5hMfQ2=Dl5f~4`MPMP%Fev?*$CW4{@4Ixg^(*YfNEZeYqd!~P7Z1;`u--J%L3)wXv zdAIbnYAwCC+MD;znKzGeTYD}mB4#bNDXBlWoSgWKL@KzQL?`;BdtqL z^v{HV&ll&%Wv6}&m&?OSZn?ETl$TGHN?WouJRL7bsY$Ou+1{CLJjd)D*Tj}5Nj0*e zawpl+JPX&t3lV`x?_`_V;~WbY!c9mNWQcO>vhjy}xW7Md9fxLdeiK?aevfZIhjrLv z3bB0-UloU3acDTV-rY<0%ZC(W-(yLCS#Ea!>ZR)nNZq2mTf95GGrTK!1a<4`lJ(Kt z#3UXT~MQAQt_r8Rea@PK@ChE^@2fp{5dqQm^2h@Hh`p3F(966Eqnm9t&W zNhZX0HzxlLMaLTI`!Mj~Q2%wWeC^8`W1$hE?xD#2u(PuKF`1ZABLQ(oL>(~PXH|#N z8$whEc^x{uqqY`7GT>-@)^!J`9o#h_;Rc-AV_^qC+kGk(npjQ zJ?{Zx9Y9V8RWjh5_Sc|CGVz4X4(cHP>o)k89`E=|WE~o650^YBeHM-~sz z8=|=+a|zc+9*sfW{+v{TlM)~sAbo=hjoI6BloPg%Vcp`D;koGJy8ncQ!@|?UfMxqo zh9s;Hh#O*v;W^d#bV+LCzKTM+By|X24ui7c@MsQ6YZCy8;@rd$#7S)9S$9}puzG`P z!&2VEa*E?xM|MXxj`9CEL?SuwxDfHmh{Obr>DUCfNpRy~M?}r=i{hLXqKyBBM@Yo> z(X#{P_Lwu(kp40_v62Gx9UKV+yvxb*1AP-ZKW< zM0Dlz0`M8{GaTD!bY;|C!fTS(aCim$nVn-?wr=qP@|ox}GF#ttW%UBXHP&mg+i<%9 zcg6jgprenrvAZF6g?EMcnc*!mTR(M$_Coa;^F3=>fK7Skmx94*Y zp8=#|jLRYCYrM4X+!{Xv9~n|GSTjgp5KLp(w2s}HK4U7io?}g+HF{$-wef8Yk~Q@+ zsoJPw&9XBNNAC7ebj8qYk;^}2ila4m(iCHjv=z-lD>P45=~2n?pzMErhUD=cN3wc8mu8k@y) zdfnlWOgh{7^N6eTUt`&4bXue7bh_uUw(E4J&rD!ruy4D|{64W{>PE}=H!`J4wa#O2 zAnfPkZc}WvX7}#QD2}heVd;cM&erGR+^m)7bK7@-M>#Lt=WuSwjR1{-FIHQ z|8?!Q<YyV5A~SUnwWdTvpmZ;3y0 z`$$UWf%uoUY$#X1NpqUCNT6=Xa+y*CF@qn%7zLy=<%6(b5gZD{^T~X6DF7jz;UF@4 zF&wU`Q%8sFfJ&wEy|xx(G}EZA0wZ<>nr(%cR1W}|dF}xP#5+Mq2dI~lv3d7j4RwV{ z{vt9Vs5BK(M5I8ttgzgh9Vi)>6xj}>6Gd3duf`h`4o{8Az`5AA8(&x(;p^w{SPg#8 zNJ-BK7%+=qRH_KlNj@Z8OpBm_G0GND2YU0GVzxr9r(hD8P?FKP5U@ZL3KIcN6#0&R zB8}ZTTcVyN~N;{ z6Q&y=eZ|oqR0ed~8htG0gH*;(wN+A)D`WZf}<9(VSnCOXQT zLcvhN8TWj(JFGEihTM(-LU@36Jd^bhHn9sz zc}U0@NetraDz2(8E_XBgCu&!?`#>P5l%KDeH)=(Vw#C7J_EF#>QQdOj&o}MP6Z94y zmpJUaV7seOs_xWQP~%3acR?c{T5yXZfs`PJII1g|i; zuLkZq5W_=(bJb#T2Q=_pLi zQ7tTS(^h&D8P|G%2*%GH>m4h{9yTBp3)M&VjI8A$~Tr^jEZY;L+4IVhC3=P5a zM^vyMDk~T`9KRfY#Az_lM9q@i>(Dm&FTQUe~rJl*{x$TuMB{E|ChG&(9FE8z9*_~5j?yzQ_ zkd!ciA-f@wA>RR@U}>I_c_G=GhoT@Zov^$opb!#I>=b8gL4t2+!`zt}dkY-Z=84&@ z3SkD#A%Yz}t^@HX5vrFf%6I-jo9Pba#|o`pshd)n>Jw2oJ~`|Qg6j{$8@vxfNq7Y~ zgwfbP?8qd%6?_&vLU6E6tU;F1`U(Dl&M<>{2sqIPq4JYB2&|F_oLVra7uUwQ*AtCB zz7pI*AH_fJ-aoKHfgSmiP4R>{+#(xQV$Zxp)Um&fw7878mSKmu-rp3;>9W@`lj_d+)8i$KPcLxJ*d81y0i zB0Hn-P$8=|qeQR*6*$9aumTY(`q7|y9Vmu>=XKM6&a(*gLjm(M`{;Z8Wi$Ly`tm}# z?)1zPn=LcMdl$w~zP0f?^9)M;4ko`LyHO%pVdOdE8TV?@tHqZClvu`t}JdUf}C%)0kID=S3jK6W2{ zud9uShrE)XSnnQwk2~ePUZ<*1PH&)95{g&)NUrqcy6)hBrBp&S=nI9s;>y0bpL%tA zk$EHsGBgBknd(zoKfS=gJiqk+bb5+<4l&iw@$3lB+3WA)WK+O>FdNaXLqG}1!Z$?mT+9XHOv+8jRG4=vrgQY*&yO^} z14IGJkr-Y?@`Sy@wn*D(l8k+cYo58nNci00EY6Ns8A-<~n5qQd@l_$7Y(gb-RC1w% zH`MKBOjvpvp^Azcu*lOnqi%L)K6ShNAQQ0Qp8h%<^HAZYXly<8CrCI=j3nCNMwFqv z!SD#*YV=z0>s4QNq3c`}j|{s);Y`en{CM;(Fj_k}$W<|}SA_FEx>biGIk}bOQDJ;@ z=ees$GehXaUM{RXuBed234=2wcQIx6R$Jvj zALbm$R~*v?1xw)syEf^TEiO_VIUJyzz%7Av2okF}Ah0c&+~cckj#lfatC;ke6bF1S ziX~GO^XqJg{b636__FgGb)KCj?&3s_!yNtgU*umv7q&S1**MHeXiVVMdoMp|4}zz} z;jrW`BN`Qs1TyLr6$R=1nB;=~Ogb>=ZWqe8;((^YWH0tscb8s^gx!Y~2|&<^a&x)O z+Ip#MxUs^dYP-#IUQKgLof^B?d6A3UdN{c8u5SG=yV<{)RL>uG-z7MvJkyRgEfaK8 zr~y50VP4SN-muNwR6y8)^*!Z@Sc&#)kc(1nhvnhq2}EPLUG7Gr8)O=Zg5KVULgTnS z-;=8*-8v8pX63JETe_XzBAMxAy)o|Dh$qQus zSfoXiC1o-YZGe}!;fOD!L`QF{tXj}MSR0Bq)ZT+mlrUv}DUil8blAJJ8J^a-SI>rH zI%Hmj%$hd;mulcz1yo2>gP`_N^8nDG0+8@OU=Fa$V2}z=-8sshxT>{L!1`I&1xWj0 z*Wv0CqWbf$u0tgEQ03Izp-%?%3@COCg&0nG&*Jb99)BgZ7bMLgvhH!Wpu_5KXzbyX zgL2r5b_W5~slCH%P=jz4^O2rHDC!fpv2#F%_K>^KHV0?y!K6t{76=wp7Ql+M_9@n> zzGyVzH0_7Tzpx{J$bAuc0A?CShU#%;6Tnuw2%?LU4Q9p+IIZC&(IaA`eqx#KhOo1N zf^_Y}m*=Ige4xFBvW;`+LA*Q|F(YvMHF3!U?&|?6C2-GWzYpro>&^)357C_()}G}7 zyzZ1h=!VRM$#kP_V|0Phj0a-cb0yv5mce13p|Bu1iV~z|@bRQd`>F0wu?YYkD02ue zhOHT>cTm2;t>-a8_pS2=QuUJb&UoH5@Vh5EMYw_h-XH#)vUUUL!LwONe8dklW8?_t z!IuU>ido0xEzkqJ_rQAbMJP6fU7Q*0OSI;!NJ_wz6@hLi!2kR38LASFqk2xjIHEg3 ze~)x67&H~#?_F-#lM^&a172a$~oib zjL?N2g<1+u(=hvj)@NGpIY7MkJ=Y$J4+Vm`W&1*$iKPwjC5MA@c!3*2YH#eZN9P@x zqj*aU7nXv4+n4hJOX#|Hg42*_C7;Wua!4jRl6s)o;pa=zj6|bKF(>q!jLiF!6AOB* zcW(4V?;AUhcV-tTB#yus!d<{mj#|1`oeF7n*QE6p*s)=ND#B|PWi=9W!0OQThUu3_ z`U_I`1w? z>YU-D3m-~zfSec{L(r{27@cSu`389v5@BCw-)UcJzfnFck9>)qPRf8Fb)vIr-x}2` z&}XO@AuQrH+>9iKSwoXhMZ!;vsI+KX?S?FEyy}?eL99~o2N}h6C`zsO0>3OIL@=Qq zOLYPJL@@4{C;4=rUh_;uLGhfmF?yCPg;^z=$|WC1+^#*m_FL~f%bBQ0nhU%~T#oS% z=|i9LF<)ZLecuIA=spgIFYzQ`6)qfpP-YJu{pOh)_gkfVnrC@{ye& zNeld%K!?JB{8a$`Tjr;*f`u{zA7||Ce^qp55wALCP8g4EP*Xi-Yr+VO+mP}THs45- zPt$q~E^3!Z*3$8l5~qJ{kEdV4mcT*q?cF1wb5QJoRDHG&G*CW$C!r^D2^S8_l_z?{ z%Q=SjaU8oKTmh&frsvXwIhz4x?JM$A6fe>UL5di;LfVcaVA7}$D=myML0+H&SACNyH^PAiqv%f8|zwb?7D8VaSdap2A&MHWfvNez zx!Z{%O+>QF?I%dK8LfQ1Gvie;s!xGEs2gZNM)L=T1|3#OAK(hO6=I65VdnA;SW0qM zh`===DJ@Cf=WL$fcnfsF&b;@HpcSVcE%zK#Ryo1U!M^p9_Nt@b`MewAla`!Xow9YDI>U~0z7vIFVpt=p#Sq3^Uv!-;`1xe}e>L{a(U}B&mxI_7+qR8~?c|BgC&m+N;)!kBwmB2q zwrwYy7yItF`<*?z{ZF0hzExe_b$)%Ty1VX`wEC(eyHK`x6J9KcT#}6*5*h1{T^u?e zK==OBhK7*e>SR8|po2+mcL^es4mk@Gz2tBj5cjPX(=a_XacF^?j-?SLFw)a-{9wj6 zR>r5BR?5aFrX!so}oq$1jMer!a(PrbcbA>SAhtu3ktg9AMW zH09*)e+sZq*(Ga5^3*3j>*c;V7vfHr%YmiLn`1?5H+Fh@8(!Z=&>r8#$$`?_dU}p! zF@@FRfslr$V}@_0O8zPLljoI)_ZPAfGhgy1VuNU8Juof_2PR*_K{Jh=Yv~>g#{tGC zMSCHU+fUx6x!U?|&BrbLwBh~vJvhmO_hvcKV2H;VM2)HHIN@7oM8S8v=y0+n-?hTD z+v25_6k#5bj*I)2x)c+aa%sS+GrMvp`b_2yFz)=r%cFQ`+qK3z#lFlh?NekO;@xuA z*$j5Qd#r<0wC`ZoYvO?{42hAa2$j%y4q*&%zR}r3&Nnq!&Ip1-iVGTB0oG)pxcmrz#bA)n)T2kt#e1wc` zn5`6BVHkOZ6fLX-LI;(Dl@4_qHGwNDubTt!UD$Q+RXGqoKaZujg9W z4Z`4uVylvilj+3B@o^UsR>s8=m93-x#?DXQ)XHq zb`(N7mWxVqFnW3n3qPx=&Aa+6F`%dNYCAu_jqX8<9qI%ghj(QV&^qQhs}GLTEXy93 zX3wS-lPTZKE-gL5f#q8*Vp%IEA!BNxJm`uN;2D6_wD9A)y48NPur@8wZ>%>kUbWL%xbMVlg2VIm zP;Pp!0fn@z?>&71-~GPKAg)XIdN(P)u~XrNx@E_|&RF5;$R*X*-A=kM5K`CT(fNs= zmq9-J7GCs-h1dr@P?(?LDEFF_EKfgKc1TQNOJq*u?4CTuGqjUl@|;nIOZ%0*T^o5p zX1HQ;Z`=-tND&}Ot@uYp#(`^1jvC0u9idAi0qvZ&W`U6}(z8W@{vARtVL<*AyN-aF z#l8aTu`W7(H~DP|p{>tGvRd&wJlNZkJzF9=%wrZ|mo_@k9 zMVLFEgU1CP{6**-v?NEA6{qKBN>GrQxbcPgOzYuFQP(>eNy^4otxJT>4c)2UiY+in z89<3K7T8~mQbh_&L9!dZn`GLS>z`ZXS$~U)u$wYVcFN|Rn%No^U%x3e9#5x?7B=L` zQ8C)1Z|}8s0?)^&a5d@;u5kZponU$jnZ%r00wpH^`)t`=hwQ zIb|j)H8lc3vcU!m;ocAoJ&WCB3z6-zkL~BQ5wj0_d5s&20_Yye;b!^_nZAUc$n;Y6 zWaN|6tPW|zQnW%A)Q@xs*kHIB5|PIKoAQaX0Rhu~CH%8^vq=CcaPAJ;he`W%98x1}_AEVlN^Bhs!l|A6W?sL1*c3l#B3lVGg-rD+FQ2<3+1ud0q4YCQMRPJJ(F@DgM7;9UF-uJHdHx? ztBy4!be@^BS(*Gs3@vAIM#f@$&81z9shaa;8@c==?D*!74OSvrhWk7%=q}9PU6caS zt0NW2NyDp1pmB_;`@OOxuUF1z^__Sg2O1npRRwsIoOW6!w78*{d#1 z>Z}v2i>$<$AGTCo2{1Dr5{iHjriuB~IV}abd(kKcDkfBR)d)cEfM;)iH2o}Fz=0!I zC;^rfj0(}sfpB!kDriKqN<-@rEI}3#4CPwcWXl%Zn6}h(iIddr?6YFu_;*xL1pCY` z!}x1dXi>mxLTy$|&J|8aK{?6UtK9ZS!(+efU6i+Fpx03X!NCh@_-)$x9=&Qnoep}0 zf+zb?VOu7XqLx!|JV6`>OnbVASW^ZX+=*x4UbhPl{y_)SdSx@>0?RuS9L7&KcdD4y zX|{tlWg;#d1FQR=AF8STrhykGP?iQS;#n^vcX8>He>KzqUf^PL|F%3GGZg#*% zcDZP{V1Q3VwG!HSV$?ifEYs$x)XteUHG`q38TG~|3N~-4hH?VFKmD6Ep&t7p5+Jj) zejs!zU!4^?51RMc(oN{osqT_$gIxtPm{>+3G)6h9gKYA+=@>hj4|eIBv8;wQR;516 zaR%ycD12cc8_^CDyU1N*=+YDMS@WRwyx?5KT7IgvrzWpiywlIIRlvQ3h1T!H$J2hZ z3(KN{`;vR+HvI*f<=`e&BQ06UZwCmaIitvxK~jY}=LOoC;Gt=LFhm1ZpBhKM9P6nH zGg1;d*;{k&^B%Chvz|2{@NS~cew3XI3)mKWIG|1W(A<`kEp~bAT88TNcQF#L|8{Je z*6JM-LfXh;{xEvj*@2e+O?_E2L^_5HAItQYlWl~bp^DM*`7<20NIY4}3F zZ*#sh(1?hXrX&mR5lOxd=MCDGI!|C^8=EqtO?G9pOdHrF<<#yr@`jz%WK0AuMTNb6 zY(lb&Cqqp^d{5tmY^!--%F)|)AQG^RzUh*2m_KO%eK|Bk$@I#kuQz@Y4(VmjU1IJr zWz6}y0U-CUF#jyh=~a`d^@l;bzs^iXjfYU-hJ!MXu(Ef#Y)l%VTmK%WA0VZ@CyA6-Av*(+NS3q12$m1+VqWnTJqNAPj zcGY0j^%PaXID>F^@%r=CD~x+Xj8|{IOM(Kn1G{xBjl&3jNu#Oko#>t5mrZD<5&ry- z=^Q#qm@1`{IV}1Pp1c%(lJB-V0gWMNEH@EmqQk|oJ>tkcK7RE%W*WK%6m$;M{7!j7A=UYG zY5}m8&#!R_Y6c4GS-I@6!a!LwnP<9Fp=@$I8q*@9YS4$-eesFy38c(Fr@O!Q^YiZ=0IaDz^s!yI;I8<{?!e*GyCe7(ePZ}W* zzm(Ut(Ht!~muOKwtEM1bJdOM*5pDdvl~r5Th%86{c0GjW!6|Es#CFu0i!2^=k!`br@u0i7VmjHT?4Qb$x}m^3#&!0d zx%GpiA=#tG`3nAQ@Zbnv*}W=}Ps;Ypu@85(hpgHE^)GwQfg|lJ?+>THDopaU$bW=v z`=vW{K@@x$e99e`?Mfb&z8&3Ob#JCFA*CV${pyBYV|WeuEm^HK?u7M%6bXt?k7Awjq4Kn#A%N0aBKhcnKtwIfYN(2}DThOD+I zI*%@|OziJ{HzADk)pX9I`vn2s`(-_a+E$_@xg6sZw4vq792tVygX6a2KfGF*2k6`i zGaKyPERm7u1I6M?QhaRdQT=)I6FO!UX4V+E8*Ss%$i@%uENj}Q?yW6wxh!#|wg$HH zH@AGin9j5_u?f1=o@e{#x@nI4jUh7s5K<_JilN`J1qoxna>>jyxWN2OjV6t`4avzJ z7qusIysy(G5hr@3wqi6>!cUL>@dybv(MPXz?Du2vS!$Nlur?!Kavjz~^ zKD{IQ6h?oaAxo zso!ndP7}4XmfJKvxHa5cc-)>ff?A$E#MH^##9jBL98u_JM&wWyLliIUZW|m?l&U?# zEoIVVW{nL)@FU=~FK2fRXkd~^$``*J*N3nE&OBVxl{te6a^Qleupc`l)Afj?Qbi~- z-PP@>ebg8|RrM)s0%ETl%rK+T)W3%ln;%}w(kNuQXlzH74b>k-^qTsmTQRN}cNwN4 z`$$ZM^;*wq2%Nt)ZhfoC;FN;PKTj_-yedY!%bN0Tb@snVd!WTSb*+tcRm3=yaPJ!m z+K}nYnA;iZlWq<7N!9uWXwMv;TyW{Gw5yes4X;eB1XNaAmYyiC89kfbQ8)4H5ZKQ( zCx=zhubqv_Djk7mOyvUjK*pvs<;*;&nAj6O8*t{ zD^&d38%T-*ZprPA;>P9HV*P}o#vA;KNxn-8Hj0MBp}F=j-sz@p*mnA^gGhkRUY^WO z)wDvFIKZ|hC0<#K6UIE-l9P3bH>|*H-2KO{1VFP~TQ9gWwoIIsFXupJ0u*j6|Jm6X zaYk;Z>?bkzg|B+tpNjOoo1 zd;O`qJyCuoGoRHGj=%ZDGTin>4$amK+ky$w$GmVg14yaE>dcJicKAg3P<0o&!{uDW z-ZnD&G?EU%%;WI7jdxMC>as9n6lv?e*LEjAk=0~9pySvCZ~p*m8il{i?jS(*=!r)} zGoLUg`+9e|dM5Puh3#d->uqeo{vqib)B);6r6F$jwO=&;*6ydI?S73 zlg zqULdKKWi*5s^C+w;158b97{=%jxlO-6kZRiQHN>-O}cJ&`&DnkpUgCp$3*!o)3Fgr zBs;VbY8slQhhW47@@j=MGwtu2xPf|4b#m7>i*(Zd1vwTy#UH`08psgPj;yo9PvxOk zKK4mu5j@{9Xks))$b_#n7=kbiBKs%5MlYAPu`p4xEx=8U{xAjdqjbjZ7Lg%G3ppqx zFf=G*9KRffY1FWa&;usSTtZLgY^4aQji#}Vw4N}II8^;a^L~K)DoV!AS)h^6QmZN? zTGi4*hl7ho$f8a;b_awKB0l;|s{k9a4PK*${-C18+I1JLUY)ZQXEq3C3)V;cLKPxd zMM;wT2<&=Ud^8X&gGxZO*!g>KWdDF%#VF42Q`_HsLzs)vqn9;AuIgL*Q$c8##s!u2 zxIEvpftsr1=Qh5P5`SzIwI>YK!vKB&Dvf-2q2TIP{AAQE4Wc&nX?l7&KixXDJ=o%m z5dH>2uvk7NKk+irIt`d+9rCdl!mSTrECe1x6H&96+n#3a3YK=91Tqu4^VczGu%RD> ztA+Wxo72RLTo5C-F z_C*Y*C|FBT_e5DM=>^>s4;9uMsNF?dx+`ZH)9SJ^IbVKU@Ihv|+NkNP50v;+;4(k& z2cBshZmsu;Bb2PS6!Ay!d%s-XBidH@1OP@eR$ThN-(~&%T--cJ$J36}80u$Sup*;c zSQTJfjuAKl2)SZe!Nzhe3Mps7v(I!E%NQ-H#jR9jgo zu_9e)9}kn`o@*JxvY+QnQO@RqzHh#6c#XSuVx?Y}24}KGQf0_wtn`AN_{i}%i`A%5 z1R6&WrU;o1MN5QZOQ##W#_-|eix#3R_pf!+U^aqA$|s~b9@v1?EaZ2|S8%X=wRPqe zRi{sPEQhf?LS?82Hb@B1} zC<(gpph=`JS!{3xf;Yt0tJdLk77N_I=}9n8b-jEVeRf@q3*x#1`@r_aJJlzVxpBRv z%q(nLduC_)VZ442+&!lreUn^*UXsj+D}0`RR5`;tL$P&OjaM&kRpl6EqP5Sph_&$p z)*2}pMqCK59E?w_5s+uqWJvO#g*~5sO#}|h3>uxut}V(I<`mW~U&LX{Xx4qLusolX zat4|AY)bLv5|PWQE0j^%JA5_V^`*6V_RLs?Jtp~{xyUDE{(?D)(cei06R z@)BW)4An5Ipk(WEIA36`l!e?(BO;uHB zjriP`<5MmO-r>0&m~{IbF?y!W9IH763CWny)t{b5@cKqeGUO#=)D2P*Hf(pYU@9ZIfVAjnv=>0sBA*}1W+Bt}^qhmI^{eUuMd_$-o zfLZ5l!V4eP1WH$MJ+b~YSv|K)qe}^7mp_?$PpLl-ESNbF*naRLdQRKp`~d9ET&~gn zNu1X8ifgqz-i&9Wx|uDT4O7Z$w3%?1oh-w%DauowC^tf2ib2SojhAH||CE_KHb^yC zHfS|?4k-;e4oMAJ4rvW}9#$|(Wul8uO`id#v>!LT>V;*fH#31&2s;SM9Scg`tQF(6yAxwlEyO2+7;y4lO3UfOteS$ zq^Y}-(J4iN^C#rzDr$?zqfV+*S~R<}aOF?A6dw{0Lw0620HWI?sXEJApn7(N=x=8%PoX@xOG7ED9w_kAM~t@k7WxmQvdm zO!rF4(DCAbuu@<#9JHLUIqs!WJJVv(r7V5tz0w+MlqYY?{n9=njj@#pa(ZEQyj&*I z(l9&^$L_qi8%A99yI+%nQ%PE}Q1)f(SG36Kmp=wKp>4+nUa4AoSb)#Tl^kH{J*PMr z_vhYbtsHd&Ydh(0!FRSem!ukOC0rT%@Hnkki3ctD1!6wASljNmbR+kE5D(-?+xv#H z%_w5S+U5txx7ftL*7C<$EflbzH1nvyKSe{4XJd-Xsg*DihL!i2-6BT6G#rw15ibmi z8%tIeqVz~E$45orq0fFjXtDO$SMt4v%I*Ah^3_o;^5|@FVbU*h5e4d;A$29SC91f6 zCx`rD44lMvLbKj{;e2g=^mca)M;33uDkl$s^mHGTKyyrRoUpfV*@7WI2Hf+}Zg0m} zU40S9`TbmeuT9b=lcr(Sk^+b=tzCBNw^-Qr<=Al`9KZ*0$4k!&THy9ityJK8c!#ty zv>vHEkh}EbIk9lKbIHPd<@?eg?*;buwebAR!a;YOV?C=FE1tp?oGBvvcYIn3oO@oT zRE@35CfzV7BwH;7#djkI3k%k$if=p0a9U{Cl0KN2+}c%}GTr62k>Vw}K0)&a@9nwb zSm84CMZgcj-g3;DtlGk_V$NoR~cbdO3*F=YvV8xe(ynvywe zBuaNUeG)Jna|Nd|mDjz%az)sm{fXSU(u#q72Dhult)Zmn2zgu5qTzva{Mh7F%NP8c zTF&cdr3@tu_B<0=R3Ut`L$(eKqfZ~V^VqTvKr*$?Z+^%ELp9e6aDe(9J@e+b1Qx+6 zmYd)Xc$aF0w_JN=i1ES^Lw;PJtQ+F<-+_t2vSK(x`eUrO}n0!^MhwxQ%*`decveR>hS$BmpS9RxlCRGpV z1NU@GGneWAp6{p8HetVLkq_mm?$EkOxeT$WdK6gf;EzlwRdDNA$_0bGQi;}*O@Tm5 zNNYMr6={`|0CCVnv^6O09=K++NTQ1K9^}1IbnJMVeuXnacI479K>V9Hw3@b*4Lbo) zG?P4P%B#oc5~6>lDryTCHHQh`xiD5cOp!*HD5EH5roe6vYRz8PpE-f2uA53OQCzC# z`YqcA6+ehx$eii~(ebz3z)!Sl=IY}1(z*dN0^+;5Rg$c`Qt3fd7PuFh8+rNF-BdJH zD)?&zDjq7}fhmq^AKdhP+D$>-5?Qij`wFW0YT}eUsUm5Bdcm)3p&%BSqSWhk@0-H* z>vO3~;w#Dvppf{7DVetWoX2PxwA42r7b+YXa9rN;DVA+K#(brVnWw|fLm(lP@T~+{ zJ@YfI>eS5e3+-M8U_#>j3y52Fie!)Z83utj2hq2gm+ewV9dlp7aF!3ufT^6wAKEmJKg(X5X0)m`Xu!0pb zMT1|4zU@!nX>(6!=ZD#YPjz+%>AdOtoP<(-mC|R0QvU2lB}Ez->g;;7Tm}5)PNK{( z6<-zC><54-rR2v)7MEGnS#*42`S{Yu=EZt!NEc2wD$;oe|~=b;$qh6!kKk}M~w~}=qYb{aR0T@(ax;3{U#yfC?jd+p@Wl= zRVN+4Grdyg;DSaDV+JF%3U%hsNXd&Hw#1oX9gllW8E5y+%uG9@Ca3aXI-Pc&?cBwO zhTE5P*^P%@1aIhWNS7A1%Ni+4&d27_#vY&cIy{0P?+@h_hz*KR>%KpVUXGQW1Q7yD z-529`4|_#fC&A%1{^9SjXq6o!*9+^iWY=7tXBA20h3+o0GIzp1K35RU(zVUr;2&JI zSV|oE&Ke1O%ms&`JfZ zo|Ki5$SoAhlH2>9!7HatR!6yAZ(x zQ}vH>e;<7+?@f;Mf}$7-`VRLOU-3`7^>NS}j!gSO&s$NWwz`r}*q*VeZ;9R)3E!U&k>jWXUZniV&5O)ei#CDoX zseU*nS2Yr~!Xf{#5-jRJ8S?}Z(K1{r%{_@JYVlCO|HMU~%RZ)2=*j)ik*I%&yFf(Y z``u|(fx-s{vbU7Dwe#~~8J@aL6nSyReqqaXiKZvJnFpIVgLdb*@<}^v`~A*81sURv zf27^}t}UcSG^P97v!t5cl6lBNhVlD4mj^^7j3pA^g!X>-4|DqQ$i4(f)=cpFwEmu) zKYmwa*>VbPj{;-~MkAbBe)wVD7$R4XlkAWeQX80QehZX5#U;YC+}}xPUG)N(oT`bk z6~hQ8g8Pih>?&j75pE?-2NGSglfEZSrlNL1|JY{yHjpP091)Fv`Xhg6vKFkqIEGzP z1QA=mLl#-~5c+qUU@POX@BC(5Fhm4=@dgpqV1D4}T*`}*Y>uhk~zG-#fltxCE!{=9gNc*!^N_g6J)=98yy(Nt8_`~`Q^8UV^3pbY z(u6nLRSIvEMmEMyri}PG6ioI|1qI!2`5Z8nTFFMyhWXiE*ird zD({Uguq=h1RUei5uj}h{TrE7And6O+66H&%E$A!PhE3v&vgdaNV7aN2SUL7~@1SaB z*+y1z{{sPQw;^gnM(596HiC% zXw5QEB4^I~I!cH#WnaboiMb^=7%arbUIHvDs6|x{Vb8a5ZxPga#Pj9fi8i2H?vbW* ztw6>yLgJ4>vPIof7>|9g@Tg(vy!3VmJEOI+vkH+ja3&;_gv?c zx&3iO$a?`am3~SSR#+2wQO7FTCt|WY@9tNjraWRY=WH<~wHkj<_lB!T1Z z%imE^4_@t+{B>w*+u6?P>~iiChs}yG7jfq21EsyH-TXBx}^9J7)0f(+qSwD#TN~lIeNYqaG1+a zgL#>_HXN$vHh7(da}-~D&2szBLZ@a_U}9LHu{t$~rlFSzm9c>YFY2^A{0E*&07_Br zGQ-`-={zS8xiA;yc3GEKr}QWS@4ZG?<6l*wMpaYhGhqXe8?q?>q-T`}p`U$4t$G!y z7xCJ2at$|8Tb9*83EG{wloGynTd@CbzCEB*b>vRWs1wXVm)9@<`{!yvNqFyLtYzTh z_6-;0-w0XR2>gJV9OSGT+D`L%9N!6y0)`G%4Zd@3-+IO03;UhF1Sf6gT~(h=*RZx& zGO1{7z9cc`%sBH6;pEWa&LB2VA!Rat!`y@{+`7po!bR}1KA&%f)=bSTmlA&NJbBXQ zRHgsvZO+z7(SR!WamQLUvQ)CY@T}S%v~M%{6|;R%EX`3x*u22n!IZy=7Yu8Iv+{@ms`X zT66brwa^d(e!Yo7h2qwhTZFcTy;TH3X*gR#xF-?8+92v<+!y){u4Rn~=@TAb{D zyh(+n_ZP9FhLS0Ytn@&>#(yM9CMOUQ zwQ6!D%Jq-`>PoMcV3ciu=Vbu`Vf-(SUexMLt!*>W?uW}^UIFE@gh58&Q|;WB#_8Ua z;nks*9hQU^7TDKO$@lKntEIpK4Sq)pduL~F=bY(sxe@DiXJK3*p-@ljWC`-~7nCoQy=?luV65NUianHw-KAf7;Vhwk zMYe@2BZ@&-hWD5^Ao(H3(lPO5vVQ9pgE!o$ft@*@C#ylC-L{XG`}yjC`OBPfCQu{U z&b*2M3w$$5_y?j`z_qGDpdpq5mFG`Y2T(|sBh5{Z607H?;w$08C zauVLXD0JcAGJ=dSq;#z#jKUb%rY#Da;&!p_g$6L4q~waqyuhy%u$eUzNw5Pj)M`nGxVn0a=C1ytmg5Drw=@t%SE%RgAD_2_ow#vC=9JgYO zD|gc!qSur*kwnZomK3psH@ZF&g^RDS#P=-ve0genD*o@Po-F@=s-A=_%$)z5h^LOy zh>brZQu_@We_=3`6(J%t5%{zO?y~|=;Mbybs7km=`gb2a4-Ux!P3HMB8&>Ife|kGckRppbDJ53&^H&uhFb+ zN2YEtL%F#@$sQ|i=*Ah0-=Y0gv1k-s!%+3lE?J7RElC?0qE5$ilEkshgfT?JoVlQ2 z%84I)Y`JInUbYA?Z5t$f@(O>!pYWLy;}|wJV`4i9NfF{%$gV+2gc{03XfY~+ox;o` z=dpHHgDf88&`u2{#nzhK`^ zPV!JdakbCa_V9x3|K1<0|D``v-0VyU8RQKultI@2(NksT;v{4c16qMh96nPk1CWV` ziIJ`GCs2-%>mNrP96^NaO#fSF{ZWy%o%xB>aYM7eh+n&rrKCy)q>NC=v4G)I;cC7@ zrp4uP&<=U^FvYX5%|nF-+eR9=AN8XV=1jnWs2|tstF5kTx z;gg)^zTt6*0(3XNW(1uvtGEFgn5qMVDMvQZ(SL3LMz|SD(Iz$UOB>By@@TSeiUypU zpnqOm4qsNitDq%g{u)780{`VKG!Q5r*E*`FnB-GFuBY5poOLPq#Y=BjvCk>wjp^Z6 zniX2(#BY1rGVlr39{}n=+@*bL)Uql%^~w+wIJ1YkS9CEy$8CFVh`TiO|?Ftb|HwW8u;(tG){3*Gm_(I#kC``d&fL|D6H;jaBPgvy0A~(hYEe z>vPmZ($x-icotpY-ekf`Y&2!~wI%}QLL8&{%5niE-F~@P9#bDgnRkgfNE9N7=`L>Hh>bzc5C&Am(i7!uvCYKH26 zbyaaku@WJJtcfwuK*-jWQ0p_#NXW*;PRPm1La0N?pkUze2_$6V`WH~i#L?Et z!N|mske8Q`LDUr_t_=DNqkrbaSqPcf{|V#g{|u(jQ~Yzc7%L$Y$A5M!IM^B~n|z*G z>$7eVF+v6v6IT!+gQT^AnTgQ9Q{jK7lAjIuM^(xo2PY%Yzgpr*$n;s}pTVv0S>zv~ z`gx_ch88gYpBl@AOl+U6{4Dk#dFwr`l~7y`B(JQh!-MW&>JljoD2S@7XD$Omg6J@! z&0l99!SVT-Hj*=Je05R$nw$eFha=rK(llze}(y(pQZT*>no1u(W| z*}|sHGm1}I*uINt855MXcQ|>A}=EUD; zNO3c2$fjC=4am?UWG{gNdI&*3b7sQ(anQbiu&F6~p}Na8^I~QCSPY+VTL_|pIpoVR zR3eE#0*(fM&A;Xp?Hu@vZg#+s;dP7pL)Bokz>7Yn?fwgb}8*A3Xn zASLY}BDT;}o?~P@wT?*Ht{WbHni!H;?SV=t2CDGDS<1f}K#ME1(ZNwL?3LxEUNrrZ z6SeA&h6$waGGcKK>zv6*@z96mS#XXftl3ZF>Vg#UgU3{qJ*tHTUg|R6^d%mD4*$HI zZST)64JwurX%0YhjShgV`F4^ElkU2hi>sCru>5iXpSY06CZo(Or?QTcM5G#B3X3Z5 z&9grXj|qlyBAukD@*_9Yd7xjcN7KB{rmD6I_M#rxn(`wR0+^4e7Egco^X^<$SfCRH zJ9WF6iHSr58Ez<&NtY~l052Bti%RXL|NnV4(qxjeUF&EJPd%CvPgAkX8QX1$5taP$E#h=Uux;8 zprAq)OPGF3P2$p;*xL5}tE)K}65)G88=aA7v^@|e+A*q=_vg4yWwNg@>Xu>wQyV@;<$|4q;`Sn>karlemNNh`Ef{-I-x~|`1J7bRYH5(us3y=pl$?p7< z-9GQa@1-G5D)!+JozRFRmmqQF5?Efv5YV-|3sQODyHf{^DuNQX=2a`*{4xWXxQ(;=Nl@Cw_FDR6zi4+PFzT;tx08#i_E^z0 z*Oys^k$VQafrVu#^0h)Fu1k)Fa;>uyQH+k0>4(y=^|8@vzP@z(AeCG9Tk6%XaT%wn zC+7*y&vb)K_4;@d9WMP`5GrdB>K3sC$5J!j5_rPl?^{Dso`SBUe$*vaG-JF~`8KY! zX-v!Q|MeQ{sqe#kh`L{Va^(^|{f!1F;v}_vv7qokef`6nRxdl5dLu5hM{;#Ar@-xl zW#WEX@X_iCi=TN+#L@(QphqGT(e&Rq@xPAX|3xb5N+zcN880%k{a=QQ{~9)aGLrSb zh)~$p%E{Wsk&yM1)Eqv!)CgqjK*+@WPxey#q&lWgqGkFAohk#}P5yzB6d}~&WoBeE zF)(B_rY^=N}CDZ?^k4R}%go+h-L94j@+t6H^#wCUzJyGEsRknEwIKcz~Dy literal 0 HcmV?d00001 From f0b9b2c27b62111ecb11f184602d6b7157011d0a Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sun, 16 Jun 2019 10:44:22 +0530 Subject: [PATCH 100/166] quiz added --- SRIP/Project-2 Issue Number 243/Codes/exp6.js | 47 ++--- SRIP/Project-2 Issue Number 243/Quiz/quiz.css | 174 ++++++++++++++++++ .../Project-2 Issue Number 243/Quiz/quiz.html | 123 +++++++++++++ SRIP/Project-2 Issue Number 243/Quiz/quiz.js | 137 ++++++++++++++ 4 files changed, 458 insertions(+), 23 deletions(-) create mode 100644 SRIP/Project-2 Issue Number 243/Quiz/quiz.css create mode 100644 SRIP/Project-2 Issue Number 243/Quiz/quiz.html create mode 100644 SRIP/Project-2 Issue Number 243/Quiz/quiz.js diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Project-2 Issue Number 243/Codes/exp6.js index e6dac4d1..962e4b07 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.js +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.js @@ -232,25 +232,25 @@ window.onload = function() { document.getElementById("c22-2").innerHTML = ""; } s2Size = series2.length; - console.log(xmeanClass1); - console.log(series1); - console.log(series2); + console.log(s1Size); + console.log(s2Size); } function addmarkAll() { - var j; - var p1; - var p2; - var i; + var j=0; + var p1=0.0; + var p2=0.0; + var i=0; var series1 = []; var series2 = []; - var l = -5; - var r = 5; + var l = -1; + var r = 1; if(distributionFunction == 0){ for(i = l; i < r; i += (r - l) / 100.0){ for (j = l; j < r; j += (r - l) / 100.0) { p1 = prob1(j, i); - if (p1 > (p2 = prob2(j, i))) { + p2 = prob2(j, i); + if (p1 > p2) { series1.push({ x: i, y: j @@ -266,21 +266,26 @@ window.onload = function() { } if (distributionFunction == 1) { - for (i = l; i < r; i += (r - l) / 100.0) { + for(i = l; i < r; i += (r - l) / 100.0){ for (j = l; j < r; j += (r - l) / 100.0) { - p1 = prob1(j, i); - if (p1 > (p2 = prob2(j, i))) { + p1 = 6;//prob1(j, i); + console.log(p1); + p2 = 5;//prob2(j, i); + console.log(p2); + if (p1 > p2) { series1.push({ x: i, y: j }); } + console.log(series1); if (p2 > p1) { series2.push({ x: i, y: j }); } + console.log(series2); if (p1 != p2 || p1 == 0.0) { continue; } @@ -288,12 +293,11 @@ window.onload = function() { x: i, y: j }); + console.log(series2); } } } - console.log(series1); - console.log(series2); - console.log(distributionFunction); + chart1up(series1, series2); } @@ -306,13 +310,11 @@ window.onload = function() { var rho = covariance12Val1 / (sigmax * sigmay); rho = 0.0; r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass1, 2.0) / covariance11Val1 + Math.pow(x - ymeanClass1, 2.0) / covariance22Val1 - 2.0 * rho * (y - xmeanClass1) * (x - ymeanClass1) / (sigmax * sigmay))); - if (distributionFunction == 1 && x <= xmax1 && x >= xmin1 && y <= ymax1 && y >= ymin1) { - r = s1Size; - } - console.log(r); - return r; } - + if (distributionFunction == 1 && x <= xmax1 && x >= xmin1 && y <= ymax1 && y >= ymin1) { + r = s1Size; + } + return r; } function prob2(x, y) { @@ -327,7 +329,6 @@ window.onload = function() { if (distributionFunction == 1 && x <= xmax2 && x >= xmin2 && y <= ymax2 && y >= ymin2) { r = s2Size; } - console.log(r); return r; } diff --git a/SRIP/Project-2 Issue Number 243/Quiz/quiz.css b/SRIP/Project-2 Issue Number 243/Quiz/quiz.css new file mode 100644 index 00000000..33d3c6a0 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Quiz/quiz.css @@ -0,0 +1,174 @@ +{ + +border: 1px dotted black; + +} + +p.question { + +font-family: Arial, sans-serif; + +font-size:20px; + +color: #2E2E2E; + +margin-bottom:0px; + +} + + +h2.quizHeader { + +font-family: Arial, sans-serif; + +font-weight:normal; + +font-size:25px; + +line-height: 27px; + +margin: 24px 0 12px 0; + +padding: 0 0 4px 0; + +border-bottom: 1px solid #a2a2a2; + +} + + +h2.quizScore{ + +font-family: Arial, sans-serif; + +font-size:25px; + +} + + +div.quizAnswers{ + +font-family: Arial, sans-serif; + +font-size:16px; + +color: #424242; + +padding: 4px 0 4px 0; + +} + + +label { + +font-family: Arial, sans-serif; + +font-size:14px; + +color: #424242; + +vertical-align:top; + +} + + +input.answer[type="radio"] { + +margin-bottom: 10px; + +} + +input.quizSubmit[type="submit"] { + +-webkit-background-clip: border-box; + +-webkit-background-origin: padding-box; + +-webkit-background-size: auto; + +-webkit-transition-delay: 0s, 0s; + +-webkit-transition-duration: 0.2s, 0.2s; + +-webkit-transition-property: color, background-color; + +-webkit-transition-timing-function: ease, ease; + +box-shadow: rgba(0, 0, 0, 0.498039) 0px 0px 5px 0px; + +color: #ffffff; + +background-color: #c30b0a; + +margin: 0; + +border: 0; + +outline: 0; + +text-transform:uppercase; + +height:35px; + +width:85px; + +border: 1px solid #5E5E5E; + +border-radius:5px; + +} + + +input.quizSubmit[type="submit"]:hover { + +color: #ffffff; + +background: #680f11; + +text-decoration: none; + +} + + +table { + +background-color: #F2F2F2; + +border:1px solid #BDBDBD; + +border-radius:5px; + +padding:10px; + +padding-left:25px; + +box-shadow: rgba(0, 0, 0, 0.498039) 0px 0px 1px 0px; + +} + + +th { + +} + + +tr { + +} + + +td { + +} + +.submitter { + +width:85px; + +} + + +.hide { + +display:none; + +} \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Quiz/quiz.html b/SRIP/Project-2 Issue Number 243/Quiz/quiz.html new file mode 100644 index 00000000..e8c12e73 --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Quiz/quiz.html @@ -0,0 +1,123 @@ + + + + + Quiz on Experiment- MLE: Learning the Classifier from Data + + + + + + + + +

Take a Quiz!

+ + + + + + + + + + + + + + +
+
+

1. In order to find the maximum likelihood estimator (MLE) of a parameter, we find the likelihood function, maximize it with respect to θ, and solve for θ. What steps do we do to maximize the likelihood function, and solve for θ?

+ +
    + + +
    + + +
    + + +
    + + +
+
+
+
+

2. The main disadvantage of maximum likelihood methods is that they are

+ +
    + + +
    + + +
    + + +
    + + +
+
+
+
+

3. The maximum likelihood estimate can be estimated for

+ +
    + + +
    + + +
    + + +
    + + +
    + + +
+
+
+
+

4. What is difference between Normal distribution and Uniform distribution?

+ +
    + + +
    + + +
    + + +
    + + +
+
+
+ +
+ +
+ + +
+
+
+
+ + +
+

+
+
+ + + \ No newline at end of file diff --git a/SRIP/Project-2 Issue Number 243/Quiz/quiz.js b/SRIP/Project-2 Issue Number 243/Quiz/quiz.js new file mode 100644 index 00000000..0d4fd43f --- /dev/null +++ b/SRIP/Project-2 Issue Number 243/Quiz/quiz.js @@ -0,0 +1,137 @@ +function submitQuiz() { + + // get each answer + function answerScore (qName) { + var radiosNo = document.getElementsByName(qName); + + for (var i = 0, length = radiosNo.length; i < length; i++) { + if (radiosNo[i].checked) { + // do something with radiosNo + var answerValue = Number(radiosNo[i].value); + } + } + // change NaNs to zero + if (isNaN(answerValue)) { + answerValue = 0; + } + return answerValue; + } + + // calc score with answerScore function + var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); + //console.log("CalcScore: " + calcScore); // it works! + + // function to return correct answer string + function correctAnswer (correctStringNo, qNumber) { + //console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below + return ("The correct answer for question #" + qNumber + ":  " + + (document.getElementById(correctStringNo).innerHTML) + ""); + } + + // print correct answers only if wrong (calls correctAnswer function) + if (answerScore('q1') === 0) { + document.getElementById('correctAnswer1').innerHTML = correctAnswer('correctString1', 1); + } + if (answerScore('q2') === 0) { + document.getElementById('correctAnswer2').innerHTML = correctAnswer('correctString2', 2); + } + if (answerScore('q3') === 0) { + document.getElementById('correctAnswer3').innerHTML = correctAnswer('correctString3', 3); + } + if (answerScore('q4') === 0) { + document.getElementById('correctAnswer4').innerHTML = correctAnswer('correctString4', 4); + } + + // calculate "possible score" integer + var questionCountArray = document.getElementsByClassName('question'); + + var questionCounter = 0; + for (var i = 0, length = questionCountArray.length; i < length; i++) { + questionCounter++; + } + + // show score as "score/possible score" + var showScore = "Your Score: " + calcScore +"/" + questionCounter; + // if 4/4, "perfect score!" + if (calcScore === questionCounter) { + showScore = showScore + "  Perfect Score!" + }; + document.getElementById('userScore').innerHTML = showScore; + } + +$(document).ready(function() { + + $('#submitButton').click(function() { + $(this).addClass('hide'); + }); + +}); + + function submitQuiz() { + //console.log('submitted'); + + // get each answer score + function answerScore (qName) { + var radiosNo = document.getElementsByName(qName); + + for (var i = 0, length = radiosNo.length; i < length; i++) { + if (radiosNo[i].checked) { + // do something with radiosNo + var answerValue = Number(radiosNo[i].value); + } + } + // change NaNs to zero + if (isNaN(answerValue)) { + answerValue = 0; + } + return answerValue; + } + + // calc score with answerScore function + var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); + //console.log("CalcScore: " + calcScore); // it works! + + // function to return correct answer string + function correctAnswer (correctStringNo, qNumber) { + //console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below + return ("The correct answer for question " + qNumber + ":  " + + (document.getElementById(correctStringNo).innerHTML) + ""); + } + + // print correct answers only if wrong (calls correctAnswer function) + if (answerScore('q1') === 0) { + document.getElementById('correctAnswer1').innerHTML = correctAnswer('correctString1', 1); + } + if (answerScore('q2') === 0) { + document.getElementById('correctAnswer2').innerHTML = correctAnswer('correctString2', 2); + } + if (answerScore('q3') === 0) { + document.getElementById('correctAnswer3').innerHTML = correctAnswer('correctString3', 3); + } + if (answerScore('q4') === 0) { + document.getElementById('correctAnswer4').innerHTML = correctAnswer('correctString4', 4); + } + + // calculate "possible score" integer + var questionCountArray = document.getElementsByClassName('question'); + + var questionCounter = 0; + for (var i = 0, length = questionCountArray.length; i < length; i++) { + questionCounter++; + } + + // show score as "score/possible score" + var showScore = "Your Score: " + calcScore +"/" + questionCounter; + if (calcScore === questionCounter) { + showScore = showScore + "  Perfect Score!" + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973) + }; + document.getElementById('userScore').innerHTML = showScore; + } + +$(document).ready(function() { + + $('#submitButton').click(function() { + $(this).addClass('hide'); + }); + +}); \ No newline at end of file From 79e1e249345c84a9638246e024aa3f543a4d3937 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 17 Jun 2019 09:06:53 +0530 Subject: [PATCH 101/166] some corrections made --- SRIP/Project-2 Issue Number 243/Codes/exp6.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.html b/SRIP/Project-2 Issue Number 243/Codes/exp6.html index 059b9642..0de124c7 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.html +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.html @@ -21,7 +21,7 @@

Distribution Function

Select Distribution Function

From 0e09f433792d30629564f4d07906c6b4aefc8762 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 17 Jun 2019 11:12:39 +0530 Subject: [PATCH 102/166] some corrections made --- .../Codes/exp6.html | 2 +- SRIP/Project-2 Issue Number 243/Codes/exp6.js | 24 +++++++----------- .../SRIP Project 2 Documentation.pdf | Bin 395373 -> 414763 bytes 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.html b/SRIP/Project-2 Issue Number 243/Codes/exp6.html index 0de124c7..059b9642 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.html +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.html @@ -21,7 +21,7 @@

Distribution Function

Select Distribution Function

diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Project-2 Issue Number 243/Codes/exp6.js index 962e4b07..b14fa4fc 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.js +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.js @@ -68,13 +68,7 @@ window.onload = function() { } function clear(){ - series1 = []; - series2 = []; - xmeanClass1 = 0.0; - ymeanClass1 = 0.0; - xmeanClass2 = 0.0; - ymeanClass2 = 0.0; - chart.render(); + //helllo } function addcalculateMLE() { @@ -102,8 +96,8 @@ window.onload = function() { ymeanClass1 += series1[i1].y; if (distributionFunction == 1) { - l1gammax += series1[i1].x; - l1gammay += series1[i1].y; + l1gammax += Math.log(series1[i1].x); + l1gammay += Math.log(series1[i1].y); } if (series1[i1].x < xmin1) { xmin1 = series1[i1].x; @@ -170,8 +164,8 @@ window.onload = function() { ymeanClass2 += series2[i2].y; if (distributionFunction == 1) { - l2gammax += series2[i2].x; - l2gammay += series2[i2].y; + l2gammax += Math.log(series2[i2].x); + l2gammay += Math.log(series2[i2].y); } if (series2[i2].x < xmin2) { xmin2 = series2[i2].x; @@ -241,8 +235,8 @@ window.onload = function() { var p1=0.0; var p2=0.0; var i=0; - var series1 = []; - var series2 = []; + series1 = []; + series2 = []; var l = -1; var r = 1; if(distributionFunction == 0){ @@ -268,9 +262,9 @@ window.onload = function() { if (distributionFunction == 1) { for(i = l; i < r; i += (r - l) / 100.0){ for (j = l; j < r; j += (r - l) / 100.0) { - p1 = 6;//prob1(j, i); + p1 = prob1(j, i); console.log(p1); - p2 = 5;//prob2(j, i); + p2 = prob2(j, i); console.log(p2); if (p1 > p2) { series1.push({ diff --git a/SRIP/Project-2 Issue Number 243/SRIP Project 2 Documentation.pdf b/SRIP/Project-2 Issue Number 243/SRIP Project 2 Documentation.pdf index 33222670a6b9b6ca0e76ffd6f8c504d4d652b9a9..5b3853dc36fed9cfaf1d7d6e9d2022af8944dd75 100644 GIT binary patch delta 47581 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 bvNRb0fo31!^Q2PaU`Zwf;ibOB!6N%_z+2Wj delta 29225 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 E0^2EeFaQ7m From c1b7ca1be4f37c0d2f69493c23f089b64386a72b Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 17 Jun 2019 11:21:51 +0530 Subject: [PATCH 103/166] some corrections made --- .../Codes/exp6.html | 2 +- SRIP/Project-2 Issue Number 243/Codes/exp6.js | 84 +++++++++---------- 2 files changed, 42 insertions(+), 44 deletions(-) diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.html b/SRIP/Project-2 Issue Number 243/Codes/exp6.html index 059b9642..0de124c7 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.html +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.html @@ -21,7 +21,7 @@

Distribution Function

Select Distribution Function

diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Project-2 Issue Number 243/Codes/exp6.js index b14fa4fc..894474c6 100644 --- a/SRIP/Project-2 Issue Number 243/Codes/exp6.js +++ b/SRIP/Project-2 Issue Number 243/Codes/exp6.js @@ -226,10 +226,48 @@ window.onload = function() { document.getElementById("c22-2").innerHTML = ""; } s2Size = series2.length; - console.log(s1Size); - console.log(s2Size); } + function prob1(x, y){ + var r = 0.0; + if(distributionFunction == 0){ + var sigmax = Math.sqrt(covariance22Val1); + var sigmay = Math.sqrt(covariance11Val1); + var rho = covariance12Val1 / (sigmax * sigmay); + rho = 0.0; + r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass1, 2.0) / covariance11Val1 + Math.pow(x - ymeanClass1, 2.0) / covariance22Val1 - 2.0 * rho * (y - xmeanClass1) * (x - ymeanClass1) / (sigmax * sigmay))); + } + if (distributionFunction == 1 && x <= xmax1 && x >= xmin1 && y <= ymax1 && y >= ymin1) { + r = s1Size; + } + return r; + } + + function prob2(x, y) { + var r = 0.0; + if (distributionFunction == 0) { + var sigmax = Math.sqrt(covariance22Val2); + var sigmay = Math.sqrt(covariance11Val2); + var rho = covariance12Val2 / (sigmax * sigmay); + rho = 0.0; + r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass2, 2.0) / covariance11Val2 + Math.pow(x - ymeanClass2, 2.0) / covariance22Val2 - 2.0 * rho * (y - xmeanClass2) * (x - ymeanClass2) / (sigmax * sigmay))); + } + if (distributionFunction == 1 && x <= xmax2 && x >= xmin2 && y <= ymax2 && y >= ymin2) { + r = s2Size; + } + return r; + } + + function chart1up(series1, series2){ + chart.options.title.text = "Updated Chart"; + chart.options.data[0].type = "area"; + chart.options.data[0].dataPoints = series1; + chart.options.data[1].type = "area"; + chart.options.data[1].dataPoints = series2; + chart.render(); + //console.log('heloooocjdijfos'); + } + function addmarkAll() { var j=0; var p1=0.0; @@ -296,46 +334,6 @@ window.onload = function() { } - function prob1(x, y){ - var r = 0.0; - if(distributionFunction == 0){ - var sigmax = Math.sqrt(covariance22Val1); - var sigmay = Math.sqrt(covariance11Val1); - var rho = covariance12Val1 / (sigmax * sigmay); - rho = 0.0; - r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass1, 2.0) / covariance11Val1 + Math.pow(x - ymeanClass1, 2.0) / covariance22Val1 - 2.0 * rho * (y - xmeanClass1) * (x - ymeanClass1) / (sigmax * sigmay))); - } - if (distributionFunction == 1 && x <= xmax1 && x >= xmin1 && y <= ymax1 && y >= ymin1) { - r = s1Size; - } - return r; - } - - function prob2(x, y) { - var r = 0.0; - if (distributionFunction == 0) { - var sigmax = Math.sqrt(covariance22Val2); - var sigmay = Math.sqrt(covariance11Val2); - var rho = covariance12Val2 / (sigmax * sigmay); - rho = 0.0; - r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass2, 2.0) / covariance11Val2 + Math.pow(x - ymeanClass2, 2.0) / covariance22Val2 - 2.0 * rho * (y - xmeanClass2) * (x - ymeanClass2) / (sigmax * sigmay))); - } - if (distributionFunction == 1 && x <= xmax2 && x >= xmin2 && y <= ymax2 && y >= ymin2) { - r = s2Size; - } - return r; - } - - function chart1up(series1, series2){ - chart.options.title.text = "Updated Chart"; - chart.options.data[0].type = "area"; - chart.options.data[0].dataPoints = series1; - chart.options.data[1].type = "area"; - chart.options.data[1].dataPoints = series2; - chart.render(); - console.log('heloooocjdijfos'); - } - var addClass1 = document.getElementById("add-class-1"); addClass1.addEventListener("click", addDataPointsAndRender1); var addClass2 = document.getElementById("add-class-2"); @@ -346,4 +344,4 @@ window.onload = function() { calculateMLE.addEventListener("click", addcalculateMLE); var markAll = document.getElementById("mark-all"); markAll.addEventListener("click", addmarkAll); -} \ No newline at end of file +}; \ No newline at end of file From fb010ec96f7a1c47e61eadde1c3fd4bd9b476a5e Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 17 Jun 2019 12:02:43 +0530 Subject: [PATCH 104/166] some corrections made --- .../Codes/exp3.css | 0 .../Codes/exp3.html | 0 .../Codes/exp3.js | 0 .../Libraries/Chart.js | 0 .../Quiz/quiz.css | 0 .../Quiz/quiz.html | 0 .../Quiz/quiz.js | 0 .../README.txt | 0 .../SRIP Project 1 Documentation.pdf | Bin .../Test Cases for Project 1.pdf | Bin .../{Project-2 Issue Number 243 => }/Codes/exp6.css | 0 .../Codes/exp6.html | 0 SRIP/{Project-2 Issue Number 243 => }/Codes/exp6.js | 0 .../Libraries/Chart.js | 0 .../Libraries/canvasjs-2.3.1/canvasjs.min.js | 0 .../Libraries/canvasjs-2.3.1/canvasjs.react.js | 0 .../examples/01-overview/animated-chart.html | 0 .../examples/01-overview/chart-from-json-data.html | 0 .../01-overview/chart-with-axis-scale-breaks.html | 0 .../examples/01-overview/chart-with-crosshair.html | 0 .../01-overview/chart-with-custom-legend-chart.html | 0 .../01-overview/chart-with-image-overlay.html | 0 .../01-overview/chart-with-index-data-label.html | 0 .../chart-with-inverted-reversed-axis.html | 0 .../01-overview/chart-with-logarithmic-axis.html | 0 .../01-overview/chart-with-secondary-axis.html | 0 .../examples/01-overview/chart-with-zoom-pan.html | 0 .../examples/01-overview/dynamic-chart.html | 0 .../01-overview/interactive-draggable-chart.html | 0 .../examples/01-overview/multi-series-chart.html | 0 .../examples/01-overview/null-data-chart.html | 0 .../examples/01-overview/performance-demo.html | 0 .../dashed-line-chart.html | 0 .../dynamic-spline-chart.html | 0 .../line-chart-with-axis-scale-breaks.html | 0 .../line-chart-with-data-markers.html | 0 .../line-chart-with-logarithmic-axis.html | 0 .../line-chart-with-multiple-axis.html | 0 .../line-chart-with-zoom-pan.html | 0 .../02-line-spline-step-line-charts/line-chart.html | 0 .../multi-series-line-chart.html | 0 .../multi-series-spline-chart.html | 0 .../multi-series-step-line-chart.html | 0 .../spline-chart-with-legends.html | 0 .../spline-chart-with-secondary-axis.html | 0 .../spline-chart.html | 0 .../step-line-chart.html | 0 .../area-chart.html | 0 .../multi-series-area-chart.html | 0 .../multi-series-range-area-chart.html | 0 .../multi-series-spline-area-chart.html | 0 .../range-area-chart.html | 0 .../range-spline-area-chart.html | 0 .../spline-area-chart.html | 0 .../stacked-area-100-chart-with-date-time-axis.html | 0 .../stacked-area-100-chart.html | 0 .../stacked-area-chart.html | 0 .../step-area-chart.html | 0 .../bar-chart-with-axis-scale-break.html | 0 .../bar-chart.html | 0 .../column-chart-with-multiple-axis.html | 0 .../column-chart.html | 0 .../multi-series-bar-chart.html | 0 .../multi-series-range-column-chart.html | 0 .../multi-series-waterfall-chart.html | 0 .../range-bar-chart.html | 0 .../range-column-chart.html | 0 .../stacked-bar-100-chart.html | 0 .../stacked-bar-chart.html | 0 .../stacked-column-100-chart.html | 0 .../stacked-column-chart.html | 0 .../waterfall-chart-with-custom-color.html | 0 .../waterfall-chart.html | 0 .../doughnut-Chart.html | 0 .../doughnut-chart-with-custom-inner-radius.html | 0 .../funnel-chart-with-custom-neck.html | 0 .../funnel-chart.html | 0 .../inverted-reversed-funnel-chart.html | 0 .../pie-chart-with-custom-radius.html | 0 .../pie-chart-with-legends.html | 0 .../pie-chart.html | 0 .../pyramid-chart-where-area-represents-value.html | 0 ...yramid-chart-with-index-label-placed-Inside.html | 0 .../pyramid-chart.html | 0 .../candlestick-line-chart.html | 0 .../multi-series-candlestick-chart.html | 0 .../ohlc-chart-from-json-data.html | 0 .../ohlc-stock-chart.html | 0 .../bubble-chart-with-data-marker.html | 0 .../bubble-chart-with-zoom-pan.html | 0 .../07-scatter-bubble-charts/bubble-chart.html | 0 .../multi-series-scatter-point-chart.html | 0 .../scatter-point-chart-with-custom-marker.html | 0 .../scatter-point-chart.html | 0 .../box-and-whisker-chart-with-custom-color.html | 0 .../box-and-whisker-chart-with-outliers.html | 0 .../box-and-whisker-chart.html | 0 .../column-line-area-chart.html | 0 .../09-combination-charts/error-bar-chart.html | 0 .../examples/09-combination-charts/error-chart.html | 0 .../09-combination-charts/error-line-chart.html | 0 .../09-combination-charts/ohlc-line-chart.html | 0 .../pareto-chart-with-index-data-label.html | 0 .../09-combination-charts/pareto-chart.html | 0 .../range-area-line-chart.html | 0 .../10-dynamic-charts/dynamic-column-chart.html | 0 .../10-dynamic-charts/dynamic-line-chart.html | 0 .../dynamic-multi-series-chart.html | 0 .../examples/11-integration/jquery-charts.html | 0 .../jquery-line-chart-with-zoom-pan.html | 0 .../11-integration/jquery-resizable-chart.html | 0 .../jquery-spline-area-chart-in-tab.html | 0 .../jquery-spline-chart-with-image-export.html | 0 .../Libraries/canvasjs-2.3.1/instruction.txt | 0 .../Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js | 0 .../Libraries/canvasjs-2.3.1/license.txt | 0 SRIP/{Project-2 Issue Number 243 => }/Quiz/quiz.css | 0 .../{Project-2 Issue Number 243 => }/Quiz/quiz.html | 0 SRIP/{Project-2 Issue Number 243 => }/Quiz/quiz.js | 0 SRIP/{Project-2 Issue Number 243 => }/README.txt | 0 .../SRIP Project 2 Documentation.pdf | Bin .../Test Cases for Project 2.pdf | Bin 122 files changed, 0 insertions(+), 0 deletions(-) rename {SRIP/Project-1 Issue Number 240 => Project-1 Issue Number 240}/Codes/exp3.css (100%) rename {SRIP/Project-1 Issue Number 240 => Project-1 Issue Number 240}/Codes/exp3.html (100%) rename {SRIP/Project-1 Issue Number 240 => Project-1 Issue Number 240}/Codes/exp3.js (100%) rename {SRIP/Project-1 Issue Number 240 => Project-1 Issue Number 240}/Libraries/Chart.js (100%) rename {SRIP/Project-1 Issue Number 240 => Project-1 Issue Number 240}/Quiz/quiz.css (100%) rename {SRIP/Project-1 Issue Number 240 => Project-1 Issue Number 240}/Quiz/quiz.html (100%) rename {SRIP/Project-1 Issue Number 240 => Project-1 Issue Number 240}/Quiz/quiz.js (100%) rename {SRIP/Project-1 Issue Number 240 => Project-1 Issue Number 240}/README.txt (100%) rename {SRIP/Project-1 Issue Number 240 => Project-1 Issue Number 240}/SRIP Project 1 Documentation.pdf (100%) rename {SRIP/Project-1 Issue Number 240 => Project-1 Issue Number 240}/Test Cases for Project 1.pdf (100%) rename SRIP/{Project-2 Issue Number 243 => }/Codes/exp6.css (100%) rename SRIP/{Project-2 Issue Number 243 => }/Codes/exp6.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Codes/exp6.js (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/Chart.js (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/canvasjs.min.js (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/canvasjs.react.js (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/instruction.txt (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js (100%) rename SRIP/{Project-2 Issue Number 243 => }/Libraries/canvasjs-2.3.1/license.txt (100%) rename SRIP/{Project-2 Issue Number 243 => }/Quiz/quiz.css (100%) rename SRIP/{Project-2 Issue Number 243 => }/Quiz/quiz.html (100%) rename SRIP/{Project-2 Issue Number 243 => }/Quiz/quiz.js (100%) rename SRIP/{Project-2 Issue Number 243 => }/README.txt (100%) rename SRIP/{Project-2 Issue Number 243 => }/SRIP Project 2 Documentation.pdf (100%) rename SRIP/{Project-2 Issue Number 243 => }/Test Cases for Project 2.pdf (100%) diff --git a/SRIP/Project-1 Issue Number 240/Codes/exp3.css b/Project-1 Issue Number 240/Codes/exp3.css similarity index 100% rename from SRIP/Project-1 Issue Number 240/Codes/exp3.css rename to Project-1 Issue Number 240/Codes/exp3.css diff --git a/SRIP/Project-1 Issue Number 240/Codes/exp3.html b/Project-1 Issue Number 240/Codes/exp3.html similarity index 100% rename from SRIP/Project-1 Issue Number 240/Codes/exp3.html rename to Project-1 Issue Number 240/Codes/exp3.html diff --git a/SRIP/Project-1 Issue Number 240/Codes/exp3.js b/Project-1 Issue Number 240/Codes/exp3.js similarity index 100% rename from SRIP/Project-1 Issue Number 240/Codes/exp3.js rename to Project-1 Issue Number 240/Codes/exp3.js diff --git a/SRIP/Project-1 Issue Number 240/Libraries/Chart.js b/Project-1 Issue Number 240/Libraries/Chart.js similarity index 100% rename from SRIP/Project-1 Issue Number 240/Libraries/Chart.js rename to Project-1 Issue Number 240/Libraries/Chart.js diff --git a/SRIP/Project-1 Issue Number 240/Quiz/quiz.css b/Project-1 Issue Number 240/Quiz/quiz.css similarity index 100% rename from SRIP/Project-1 Issue Number 240/Quiz/quiz.css rename to Project-1 Issue Number 240/Quiz/quiz.css diff --git a/SRIP/Project-1 Issue Number 240/Quiz/quiz.html b/Project-1 Issue Number 240/Quiz/quiz.html similarity index 100% rename from SRIP/Project-1 Issue Number 240/Quiz/quiz.html rename to Project-1 Issue Number 240/Quiz/quiz.html diff --git a/SRIP/Project-1 Issue Number 240/Quiz/quiz.js b/Project-1 Issue Number 240/Quiz/quiz.js similarity index 100% rename from SRIP/Project-1 Issue Number 240/Quiz/quiz.js rename to Project-1 Issue Number 240/Quiz/quiz.js diff --git a/SRIP/Project-1 Issue Number 240/README.txt b/Project-1 Issue Number 240/README.txt similarity index 100% rename from SRIP/Project-1 Issue Number 240/README.txt rename to Project-1 Issue Number 240/README.txt diff --git a/SRIP/Project-1 Issue Number 240/SRIP Project 1 Documentation.pdf b/Project-1 Issue Number 240/SRIP Project 1 Documentation.pdf similarity index 100% rename from SRIP/Project-1 Issue Number 240/SRIP Project 1 Documentation.pdf rename to Project-1 Issue Number 240/SRIP Project 1 Documentation.pdf diff --git a/SRIP/Project-1 Issue Number 240/Test Cases for Project 1.pdf b/Project-1 Issue Number 240/Test Cases for Project 1.pdf similarity index 100% rename from SRIP/Project-1 Issue Number 240/Test Cases for Project 1.pdf rename to Project-1 Issue Number 240/Test Cases for Project 1.pdf diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.css b/SRIP/Codes/exp6.css similarity index 100% rename from SRIP/Project-2 Issue Number 243/Codes/exp6.css rename to SRIP/Codes/exp6.css diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.html b/SRIP/Codes/exp6.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Codes/exp6.html rename to SRIP/Codes/exp6.html diff --git a/SRIP/Project-2 Issue Number 243/Codes/exp6.js b/SRIP/Codes/exp6.js similarity index 100% rename from SRIP/Project-2 Issue Number 243/Codes/exp6.js rename to SRIP/Codes/exp6.js diff --git a/SRIP/Project-2 Issue Number 243/Libraries/Chart.js b/SRIP/Libraries/Chart.js similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/Chart.js rename to SRIP/Libraries/Chart.js diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.min.js b/SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.min.js rename to SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.react.js b/SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.react.js rename to SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html rename to SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/instruction.txt b/SRIP/Libraries/canvasjs-2.3.1/instruction.txt similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/instruction.txt rename to SRIP/Libraries/canvasjs-2.3.1/instruction.txt diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js b/SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js rename to SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js diff --git a/SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/license.txt b/SRIP/Libraries/canvasjs-2.3.1/license.txt similarity index 100% rename from SRIP/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/license.txt rename to SRIP/Libraries/canvasjs-2.3.1/license.txt diff --git a/SRIP/Project-2 Issue Number 243/Quiz/quiz.css b/SRIP/Quiz/quiz.css similarity index 100% rename from SRIP/Project-2 Issue Number 243/Quiz/quiz.css rename to SRIP/Quiz/quiz.css diff --git a/SRIP/Project-2 Issue Number 243/Quiz/quiz.html b/SRIP/Quiz/quiz.html similarity index 100% rename from SRIP/Project-2 Issue Number 243/Quiz/quiz.html rename to SRIP/Quiz/quiz.html diff --git a/SRIP/Project-2 Issue Number 243/Quiz/quiz.js b/SRIP/Quiz/quiz.js similarity index 100% rename from SRIP/Project-2 Issue Number 243/Quiz/quiz.js rename to SRIP/Quiz/quiz.js diff --git a/SRIP/Project-2 Issue Number 243/README.txt b/SRIP/README.txt similarity index 100% rename from SRIP/Project-2 Issue Number 243/README.txt rename to SRIP/README.txt diff --git a/SRIP/Project-2 Issue Number 243/SRIP Project 2 Documentation.pdf b/SRIP/SRIP Project 2 Documentation.pdf similarity index 100% rename from SRIP/Project-2 Issue Number 243/SRIP Project 2 Documentation.pdf rename to SRIP/SRIP Project 2 Documentation.pdf diff --git a/SRIP/Project-2 Issue Number 243/Test Cases for Project 2.pdf b/SRIP/Test Cases for Project 2.pdf similarity index 100% rename from SRIP/Project-2 Issue Number 243/Test Cases for Project 2.pdf rename to SRIP/Test Cases for Project 2.pdf From 6d8f7bf633d4e6b0a1a03d5af229df5f3840a9dc Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 17 Jun 2019 13:05:40 +0530 Subject: [PATCH 105/166] uniform distribution added --- SRIP/Codes/exp6.html | 2 +- SRIP/Codes/exp6.js | 51 ++++++++++++++++++++++++++++---------------- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/SRIP/Codes/exp6.html b/SRIP/Codes/exp6.html index 0de124c7..059b9642 100644 --- a/SRIP/Codes/exp6.html +++ b/SRIP/Codes/exp6.html @@ -21,7 +21,7 @@

Distribution Function

Select Distribution Function

diff --git a/SRIP/Codes/exp6.js b/SRIP/Codes/exp6.js index 894474c6..9c1be878 100644 --- a/SRIP/Codes/exp6.js +++ b/SRIP/Codes/exp6.js @@ -75,14 +75,14 @@ window.onload = function() { distributionFunction = document.getElementById("distribution-function").value; var i1 = 0; var i2 = 0; - xmin1 = 100.0; - ymin1 = 100.0; - xmin2 = 100.0; - ymin2 = 100.0; - xmax1 = -100.0; - ymax1 = -100.0; - xmax2 = -100.0; - ymax2 = -100.0; + xmin1 = -100.0; + ymin1 = -100.0; + xmin2 = -100.0; + ymin2 = -100.0; + xmax1 = 100.0; + ymax1 = 100.0; + xmax2 = 100.0; + ymax2 = 100.0; xmeanClass1 = 0.0; ymeanClass1 = 0.0; xmeanClass2 = 0.0; @@ -252,7 +252,7 @@ window.onload = function() { rho = 0.0; r = 1.0 / (6.283185307179586 * sigmax * sigmay * Math.sqrt(1.0 - rho * rho)) * Math.exp(-1.0 / (2.0 * (1.0 - rho * rho)) * (Math.pow(y - xmeanClass2, 2.0) / covariance11Val2 + Math.pow(x - ymeanClass2, 2.0) / covariance22Val2 - 2.0 * rho * (y - xmeanClass2) * (x - ymeanClass2) / (sigmax * sigmay))); } - if (distributionFunction == 1 && x <= xmax2 && x >= xmin2 && y <= ymax2 && y >= ymin2) { + if (distributionFunction == 1 && x <= xmax2 && x >= xmin2 && y <= ymax2 && y >= ymin2){ r = s2Size; } return r; @@ -268,6 +268,16 @@ window.onload = function() { //console.log('heloooocjdijfos'); } + function chart2up(series11, series21){ + chart.options.title.text = "Updated Chart"; + chart.options.data[0].type = "area"; + chart.options.data[0].dataPoints = series11; + chart.options.data[1].type = "area"; + chart.options.data[1].dataPoints = series21; + chart.render(); + //console.log('heloooocjdijfos'); + } + function addmarkAll() { var j=0; var p1=0.0; @@ -275,8 +285,10 @@ window.onload = function() { var i=0; series1 = []; series2 = []; - var l = -1; - var r = 1; + var series11 = []; + var series21 = []; + var l = -5; + var r = 5; if(distributionFunction == 0){ for(i = l; i < r; i += (r - l) / 100.0){ for (j = l; j < r; j += (r - l) / 100.0) { @@ -295,42 +307,45 @@ window.onload = function() { }); } } + chart1up(series1, series2); } if (distributionFunction == 1) { for(i = l; i < r; i += (r - l) / 100.0){ for (j = l; j < r; j += (r - l) / 100.0) { + console.log(i); + console.log(j); p1 = prob1(j, i); console.log(p1); p2 = prob2(j, i); console.log(p2); if (p1 > p2) { - series1.push({ + series11.push({ x: i, y: j }); } - console.log(series1); + console.log(series11); if (p2 > p1) { - series2.push({ + series21.push({ x: i, y: j }); } - console.log(series2); if (p1 != p2 || p1 == 0.0) { continue; } - series2.push({ + series21.push({ x: i, y: j }); - console.log(series2); + console.log(series21); } } + chart2up(series11, series21); } - chart1up(series1, series2); + } From 83fc67bd40c950fd67cd00494665014fc9f10b76 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 17 Jun 2019 15:50:46 +0530 Subject: [PATCH 106/166] some edits made --- SRIP/SRIP Project 2 Documentation.pdf | Bin 414763 -> 435606 bytes SRIP/Test Cases for Project 2.pdf | Bin 49652 -> 49762 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/SRIP/SRIP Project 2 Documentation.pdf b/SRIP/SRIP Project 2 Documentation.pdf index 5b3853dc36fed9cfaf1d7d6e9d2022af8944dd75..a9ab12a7b04de897f74f33fc446e135b73688f06 100644 GIT binary patch delta 56774 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%0D}1Y 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 LDwRYVgZO^{=npt) delta 36545 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 AY5)KL diff --git a/SRIP/Test Cases for Project 2.pdf b/SRIP/Test Cases for Project 2.pdf index cae44252aa5bd61664bd00dd732b0ec66937d349..5bf5d4a5be225a79eed5a384488504dcb64832c8 100644 GIT binary patch delta 7031 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 Mf==>piY5L(0CqKdNdN!< delta 6952 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 e!XYpWWQUQY6BARyz2U`2fg`Cy$a@_-@% Date: Mon, 17 Jun 2019 16:43:07 +0530 Subject: [PATCH 107/166] some corrections made --- SRIP/Codes/exp6.js | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/SRIP/Codes/exp6.js b/SRIP/Codes/exp6.js index 9c1be878..7ca4e23e 100644 --- a/SRIP/Codes/exp6.js +++ b/SRIP/Codes/exp6.js @@ -148,10 +148,10 @@ window.onload = function() { } if (distributionFunction == 1) { - document.getElementById("c11-1").innerHTML = ""; - document.getElementById("c12-1").innerHTML = ""; - document.getElementById("c21-1").innerHTML = ""; - document.getElementById("c22-1").innerHTML = ""; + document.getElementById("c11-1").innerHTML = covariance11Val1; + document.getElementById("c12-1").innerHTML = covariance12Val1; + document.getElementById("c21-1").innerHTML = covariance12Val1; + document.getElementById("c22-1").innerHTML = covariance22Val1; } s1Size = series1.length; @@ -216,14 +216,10 @@ window.onload = function() { } if (distributionFunction == 1) { - document.getElementById("c11-1").innerHTML = ""; - document.getElementById("c12-1").innerHTML = ""; - document.getElementById("c21-1").innerHTML = ""; - document.getElementById("c22-1").innerHTML = ""; - document.getElementById("c11-2").innerHTML = ""; - document.getElementById("c12-2").innerHTML = ""; - document.getElementById("c21-2").innerHTML = ""; - document.getElementById("c22-2").innerHTML = ""; + document.getElementById("c11-2").innerHTML = covariance11Val2; + document.getElementById("c12-2").innerHTML = covariance12Val2; + document.getElementById("c21-2").innerHTML = covariance12Val2; + document.getElementById("c22-2").innerHTML = covariance22Val2; } s2Size = series2.length; } From 571ac4cd4d0ec641892c7d69313dc8d29f2211c1 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 17 Jun 2019 16:51:28 +0530 Subject: [PATCH 108/166] some corrections made --- SRIP/Codes/exp6.html | 2 +- SRIP/Codes/exp6.js | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/SRIP/Codes/exp6.html b/SRIP/Codes/exp6.html index 059b9642..cbbdd47c 100644 --- a/SRIP/Codes/exp6.html +++ b/SRIP/Codes/exp6.html @@ -45,7 +45,7 @@

Add Data

Y Value: - +

diff --git a/SRIP/Codes/exp6.js b/SRIP/Codes/exp6.js index 7ca4e23e..b3ca5543 100644 --- a/SRIP/Codes/exp6.js +++ b/SRIP/Codes/exp6.js @@ -67,9 +67,9 @@ window.onload = function() { chart.render(); } - function clear(){ + //function clear(){ //helllo - } + //} function addcalculateMLE() { distributionFunction = document.getElementById("distribution-function").value; @@ -271,6 +271,8 @@ window.onload = function() { chart.options.data[1].type = "area"; chart.options.data[1].dataPoints = series21; chart.render(); + document.getElementById("calculate-mle").disabled = true; + document.getElementById("mark-all").disabled = true; //console.log('heloooocjdijfos'); } @@ -349,8 +351,8 @@ window.onload = function() { addClass1.addEventListener("click", addDataPointsAndRender1); var addClass2 = document.getElementById("add-class-2"); addClass2.addEventListener("click", addDataPointsAndRender2); - var clearButton = document.getElementById("clear"); - clearButton.addEventListener("click", clear) + //var clearButton = document.getElementById("clear"); + //clearButton.addEventListener("click", clear) var calculateMLE = document.getElementById("calculate-mle"); calculateMLE.addEventListener("click", addcalculateMLE); var markAll = document.getElementById("mark-all"); From 3570dc108bfe1d5d4e0717ac0444d9a52a1f0003 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Tue, 18 Jun 2019 09:34:11 +0530 Subject: [PATCH 109/166] corrections made --- SRIP/Codes/exp6.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SRIP/Codes/exp6.js b/SRIP/Codes/exp6.js index b3ca5543..3e39ffd3 100644 --- a/SRIP/Codes/exp6.js +++ b/SRIP/Codes/exp6.js @@ -121,7 +121,7 @@ window.onload = function() { xmeanClass1 = xmeanClass1 / series1.length; ymeanClass1 = ymeanClass1 / series1.length; - if (distributionFunction == 0) { + if (distributionFunction == 0 || distributionFunction == 1) { document.getElementById("mean1x").innerHTML = xmeanClass1; document.getElementById("mean1y").innerHTML = ymeanClass1; } @@ -189,7 +189,7 @@ window.onload = function() { xmeanClass2 = xmeanClass2 / series2.length; ymeanClass2 = ymeanClass2 / series2.length; - if (distributionFunction == 0) { + if (distributionFunction == 0 || distributionFunction == 1) { document.getElementById("mean2x").innerHTML = xmeanClass2; document.getElementById("mean2y").innerHTML = ymeanClass2; } From 43c4de44fd16227da3163fcba82000c47504b2e9 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 19 Jun 2019 14:13:31 +0530 Subject: [PATCH 110/166] initial commit --- .../Codes/exp6.css | 0 .../Codes/exp6.html | 0 .../Codes/exp6.js | 0 Project-2 Issue Number 243/Libraries/Chart.js | 14680 ++++++++++++++++ .../Libraries/canvasjs-2.3.1/canvasjs.min.js | 911 + .../canvasjs-2.3.1/canvasjs.react.js | 48 + .../examples/01-overview/animated-chart.html | 43 + .../01-overview/chart-from-json-data.html | 50 + .../chart-with-axis-scale-breaks.html | 51 + .../01-overview/chart-with-crosshair.html | 72 + .../chart-with-custom-legend-chart.html | 233 + .../01-overview/chart-with-image-overlay.html | 108 + .../chart-with-index-data-label.html | 46 + .../chart-with-inverted-reversed-axis.html | 46 + .../chart-with-logarithmic-axis.html | 128 + .../chart-with-secondary-axis.html | 87 + .../01-overview/chart-with-zoom-pan.html | 40 + .../examples/01-overview/dynamic-chart.html | 57 + .../interactive-draggable-chart.html | 115 + .../01-overview/multi-series-chart.html | 94 + .../examples/01-overview/null-data-chart.html | 62 + .../01-overview/performance-demo.html | 43 + .../dashed-line-chart.html | 102 + .../dynamic-spline-chart.html | 56 + .../line-chart-with-axis-scale-breaks.html | 71 + .../line-chart-with-data-markers.html | 53 + .../line-chart-with-logarithmic-axis.html | 107 + .../line-chart-with-multiple-axis.html | 125 + .../line-chart-with-zoom-pan.html | 46 + .../line-chart.html | 44 + .../multi-series-line-chart.html | 257 + .../multi-series-spline-chart.html | 171 + .../multi-series-step-line-chart.html | 67 + .../spline-chart-with-legends.html | 123 + .../spline-chart-with-secondary-axis.html | 100 + .../spline-chart.html | 55 + .../step-line-chart.html | 57 + .../area-chart.html | 50 + .../multi-series-area-chart.html | 73 + .../multi-series-range-area-chart.html | 127 + .../multi-series-spline-area-chart.html | 113 + .../range-area-chart.html | 72 + .../range-spline-area-chart.html | 51 + .../spline-area-chart.html | 55 + ...ed-area-100-chart-with-date-time-axis.html | 120 + .../stacked-area-100-chart.html | 78 + .../stacked-area-chart.html | 68 + .../step-area-chart.html | 42 + .../bar-chart-with-axis-scale-break.html | 58 + .../bar-chart.html | 58 + .../column-chart-with-multiple-axis.html | 83 + .../column-chart.html | 43 + .../multi-series-bar-chart.html | 104 + .../multi-series-range-column-chart.html | 89 + .../multi-series-waterfall-chart.html | 98 + .../range-bar-chart.html | 49 + .../range-column-chart.html | 49 + .../stacked-bar-100-chart.html | 76 + .../stacked-bar-chart.html | 126 + .../stacked-column-100-chart.html | 103 + .../stacked-column-chart.html | 113 + .../waterfall-chart-with-custom-color.html | 51 + .../waterfall-chart.html | 48 + .../doughnut-Chart.html | 40 + ...ughnut-chart-with-custom-inner-radius.html | 55 + .../funnel-chart-with-custom-neck.html | 52 + .../funnel-chart.html | 52 + .../inverted-reversed-funnel-chart.html | 54 + .../pie-chart-with-custom-radius.html | 51 + .../pie-chart-with-legends.html | 52 + .../pie-chart.html | 36 + ...mid-chart-where-area-represents-value.html | 39 + ...-chart-with-index-label-placed-Inside.html | 40 + .../pyramid-chart.html | 40 + .../candlestick-line-chart.html | 108 + .../multi-series-candlestick-chart.html | 90 + .../ohlc-chart-from-json-data.html | 58 + .../ohlc-stock-chart.html | 54 + .../bubble-chart-with-data-marker.html | 59 + .../bubble-chart-with-zoom-pan.html | 60 + .../bubble-chart.html | 69 + .../multi-series-scatter-point-chart.html | 73 + ...catter-point-chart-with-custom-marker.html | 129 + .../scatter-point-chart.html | 63 + ...x-and-whisker-chart-with-custom-color.html | 43 + .../box-and-whisker-chart-with-outliers.html | 81 + .../box-and-whisker-chart.html | 43 + .../column-line-area-chart.html | 122 + .../error-bar-chart.html | 54 + .../09-combination-charts/error-chart.html | 58 + .../error-line-chart.html | 73 + .../ohlc-line-chart.html | 106 + .../pareto-chart-with-index-data-label.html | 68 + .../09-combination-charts/pareto-chart.html | 66 + .../range-area-line-chart.html | 108 + .../dynamic-column-chart.html | 54 + .../10-dynamic-charts/dynamic-line-chart.html | 58 + .../dynamic-multi-series-chart.html | 113 + .../11-integration/jquery-charts.html | 42 + .../jquery-line-chart-with-zoom-pan.html | 49 + .../jquery-resizable-chart.html | 55 + .../jquery-spline-area-chart-in-tab.html | 98 + ...jquery-spline-chart-with-image-export.html | 41 + .../Libraries/canvasjs-2.3.1/instruction.txt | 4 + .../canvasjs-2.3.1/jquery.canvasjs.min.js | 922 + .../Libraries/canvasjs-2.3.1/license.txt | 9 + .../Quiz/quiz.css | 0 .../Quiz/quiz.html | 0 .../Quiz/quiz.js | 0 Project-2 Issue Number 243/README.txt | 15 + .../SRIP Project 2 Documentation.pdf | Bin .../Test Cases for Project 2.pdf | Bin SRIP/Codes/exp4.css | 71 + SRIP/Codes/exp4.html | 58 + SRIP/README.txt | 4 +- 115 files changed, 24032 insertions(+), 2 deletions(-) rename {SRIP => Project-2 Issue Number 243}/Codes/exp6.css (100%) rename {SRIP => Project-2 Issue Number 243}/Codes/exp6.html (100%) rename {SRIP => Project-2 Issue Number 243}/Codes/exp6.js (100%) create mode 100644 Project-2 Issue Number 243/Libraries/Chart.js create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.min.js create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.react.js create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/instruction.txt create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js create mode 100644 Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/license.txt rename {SRIP => Project-2 Issue Number 243}/Quiz/quiz.css (100%) rename {SRIP => Project-2 Issue Number 243}/Quiz/quiz.html (100%) rename {SRIP => Project-2 Issue Number 243}/Quiz/quiz.js (100%) create mode 100644 Project-2 Issue Number 243/README.txt rename {SRIP => Project-2 Issue Number 243}/SRIP Project 2 Documentation.pdf (100%) rename {SRIP => Project-2 Issue Number 243}/Test Cases for Project 2.pdf (100%) create mode 100644 SRIP/Codes/exp4.css create mode 100644 SRIP/Codes/exp4.html diff --git a/SRIP/Codes/exp6.css b/Project-2 Issue Number 243/Codes/exp6.css similarity index 100% rename from SRIP/Codes/exp6.css rename to Project-2 Issue Number 243/Codes/exp6.css diff --git a/SRIP/Codes/exp6.html b/Project-2 Issue Number 243/Codes/exp6.html similarity index 100% rename from SRIP/Codes/exp6.html rename to Project-2 Issue Number 243/Codes/exp6.html diff --git a/SRIP/Codes/exp6.js b/Project-2 Issue Number 243/Codes/exp6.js similarity index 100% rename from SRIP/Codes/exp6.js rename to Project-2 Issue Number 243/Codes/exp6.js diff --git a/Project-2 Issue Number 243/Libraries/Chart.js b/Project-2 Issue Number 243/Libraries/Chart.js new file mode 100644 index 00000000..4c50e09b --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/Chart.js @@ -0,0 +1,14680 @@ +/*! + * Chart.js v2.8.0 + * https://www.chartjs.org + * (c) 2019 Chart.js Contributors + * Released under the MIT License + */ +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(function() { try { return require('moment'); } catch(e) { } }()) : +typeof define === 'function' && define.amd ? define(['require'], function(require) { return factory(function() { try { return require('moment'); } catch(e) { } }()); }) : +(global.Chart = factory(global.moment)); +}(this, (function (moment) { 'use strict'; + +moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment; + +/* MIT license */ + +var conversions = { + rgb2hsl: rgb2hsl, + rgb2hsv: rgb2hsv, + rgb2hwb: rgb2hwb, + rgb2cmyk: rgb2cmyk, + rgb2keyword: rgb2keyword, + rgb2xyz: rgb2xyz, + rgb2lab: rgb2lab, + rgb2lch: rgb2lch, + + hsl2rgb: hsl2rgb, + hsl2hsv: hsl2hsv, + hsl2hwb: hsl2hwb, + hsl2cmyk: hsl2cmyk, + hsl2keyword: hsl2keyword, + + hsv2rgb: hsv2rgb, + hsv2hsl: hsv2hsl, + hsv2hwb: hsv2hwb, + hsv2cmyk: hsv2cmyk, + hsv2keyword: hsv2keyword, + + hwb2rgb: hwb2rgb, + hwb2hsl: hwb2hsl, + hwb2hsv: hwb2hsv, + hwb2cmyk: hwb2cmyk, + hwb2keyword: hwb2keyword, + + cmyk2rgb: cmyk2rgb, + cmyk2hsl: cmyk2hsl, + cmyk2hsv: cmyk2hsv, + cmyk2hwb: cmyk2hwb, + cmyk2keyword: cmyk2keyword, + + keyword2rgb: keyword2rgb, + keyword2hsl: keyword2hsl, + keyword2hsv: keyword2hsv, + keyword2hwb: keyword2hwb, + keyword2cmyk: keyword2cmyk, + keyword2lab: keyword2lab, + keyword2xyz: keyword2xyz, + + xyz2rgb: xyz2rgb, + xyz2lab: xyz2lab, + xyz2lch: xyz2lch, + + lab2xyz: lab2xyz, + lab2rgb: lab2rgb, + lab2lch: lab2lch, + + lch2lab: lch2lab, + lch2xyz: lch2xyz, + lch2rgb: lch2rgb +}; + + +function rgb2hsl(rgb) { + var r = rgb[0]/255, + g = rgb[1]/255, + b = rgb[2]/255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, l; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g)/ delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + l = (min + max) / 2; + + if (max == min) + s = 0; + else if (l <= 0.5) + s = delta / (max + min); + else + s = delta / (2 - max - min); + + return [h, s * 100, l * 100]; +} + +function rgb2hsv(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, v; + + if (max == 0) + s = 0; + else + s = (delta/max * 1000)/10; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g) / delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + v = ((max / 255) * 1000) / 10; + + return [h, s, v]; +} + +function rgb2hwb(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + h = rgb2hsl(rgb)[0], + w = 1/255 * Math.min(r, Math.min(g, b)), + b = 1 - 1/255 * Math.max(r, Math.max(g, b)); + + return [h, w * 100, b * 100]; +} + +function rgb2cmyk(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255, + c, m, y, k; + + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; + return [c * 100, m * 100, y * 100, k * 100]; +} + +function rgb2keyword(rgb) { + return reverseKeywords[JSON.stringify(rgb)]; +} + +function rgb2xyz(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255; + + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y *100, z * 100]; +} + +function rgb2lab(rgb) { + var xyz = rgb2xyz(rgb), + x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function rgb2lch(args) { + return lab2lch(rgb2lab(args)); +} + +function hsl2rgb(hsl) { + var h = hsl[0] / 360, + s = hsl[1] / 100, + l = hsl[2] / 100, + t1, t2, t3, rgb, val; + + if (s == 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) + t2 = l * (1 + s); + else + t2 = l + s - l * s; + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * - (i - 1); + t3 < 0 && t3++; + t3 > 1 && t3--; + + if (6 * t3 < 1) + val = t1 + (t2 - t1) * 6 * t3; + else if (2 * t3 < 1) + val = t2; + else if (3 * t3 < 2) + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + else + val = t1; + + rgb[i] = val * 255; + } + + return rgb; +} + +function hsl2hsv(hsl) { + var h = hsl[0], + s = hsl[1] / 100, + l = hsl[2] / 100, + sv, v; + + if(l === 0) { + // no need to do calc on black + // also avoids divide by 0 error + return [0, 0, 0]; + } + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + v = (l + s) / 2; + sv = (2 * s) / (l + s); + return [h, sv * 100, v * 100]; +} + +function hsl2hwb(args) { + return rgb2hwb(hsl2rgb(args)); +} + +function hsl2cmyk(args) { + return rgb2cmyk(hsl2rgb(args)); +} + +function hsl2keyword(args) { + return rgb2keyword(hsl2rgb(args)); +} + + +function hsv2rgb(hsv) { + var h = hsv[0] / 60, + s = hsv[1] / 100, + v = hsv[2] / 100, + hi = Math.floor(h) % 6; + + var f = h - Math.floor(h), + p = 255 * v * (1 - s), + q = 255 * v * (1 - (s * f)), + t = 255 * v * (1 - (s * (1 - f))), + v = 255 * v; + + switch(hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +} + +function hsv2hsl(hsv) { + var h = hsv[0], + s = hsv[1] / 100, + v = hsv[2] / 100, + sl, l; + + l = (2 - s) * v; + sl = s * v; + sl /= (l <= 1) ? l : 2 - l; + sl = sl || 0; + l /= 2; + return [h, sl * 100, l * 100]; +} + +function hsv2hwb(args) { + return rgb2hwb(hsv2rgb(args)) +} + +function hsv2cmyk(args) { + return rgb2cmyk(hsv2rgb(args)); +} + +function hsv2keyword(args) { + return rgb2keyword(hsv2rgb(args)); +} + +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +function hwb2rgb(hwb) { + var h = hwb[0] / 360, + wh = hwb[1] / 100, + bl = hwb[2] / 100, + ratio = wh + bl, + i, v, f, n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + if ((i & 0x01) != 0) { + f = 1 - f; + } + n = wh + f * (v - wh); // linear interpolation + + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + + return [r * 255, g * 255, b * 255]; +} + +function hwb2hsl(args) { + return rgb2hsl(hwb2rgb(args)); +} + +function hwb2hsv(args) { + return rgb2hsv(hwb2rgb(args)); +} + +function hwb2cmyk(args) { + return rgb2cmyk(hwb2rgb(args)); +} + +function hwb2keyword(args) { + return rgb2keyword(hwb2rgb(args)); +} + +function cmyk2rgb(cmyk) { + var c = cmyk[0] / 100, + m = cmyk[1] / 100, + y = cmyk[2] / 100, + k = cmyk[3] / 100, + r, g, b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + return [r * 255, g * 255, b * 255]; +} + +function cmyk2hsl(args) { + return rgb2hsl(cmyk2rgb(args)); +} + +function cmyk2hsv(args) { + return rgb2hsv(cmyk2rgb(args)); +} + +function cmyk2hwb(args) { + return rgb2hwb(cmyk2rgb(args)); +} + +function cmyk2keyword(args) { + return rgb2keyword(cmyk2rgb(args)); +} + + +function xyz2rgb(xyz) { + var x = xyz[0] / 100, + y = xyz[1] / 100, + z = xyz[2] / 100, + r, g, b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r = (r * 12.92); + + g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g = (g * 12.92); + + b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b = (b * 12.92); + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; +} + +function xyz2lab(xyz) { + var x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function xyz2lch(args) { + return lab2lch(xyz2lab(args)); +} + +function lab2xyz(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + x, y, z, y2; + + if (l <= 8) { + y = (l * 100) / 903.3; + y2 = (7.787 * (y / 100)) + (16 / 116); + } else { + y = 100 * Math.pow((l + 16) / 116, 3); + y2 = Math.pow(y / 100, 1/3); + } + + x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); + + z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); + + return [x, y, z]; +} + +function lab2lch(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + hr, h, c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + if (h < 0) { + h += 360; + } + c = Math.sqrt(a * a + b * b); + return [l, c, h]; +} + +function lab2rgb(args) { + return xyz2rgb(lab2xyz(args)); +} + +function lch2lab(lch) { + var l = lch[0], + c = lch[1], + h = lch[2], + a, b, hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + return [l, a, b]; +} + +function lch2xyz(args) { + return lab2xyz(lch2lab(args)); +} + +function lch2rgb(args) { + return lab2rgb(lch2lab(args)); +} + +function keyword2rgb(keyword) { + return cssKeywords[keyword]; +} + +function keyword2hsl(args) { + return rgb2hsl(keyword2rgb(args)); +} + +function keyword2hsv(args) { + return rgb2hsv(keyword2rgb(args)); +} + +function keyword2hwb(args) { + return rgb2hwb(keyword2rgb(args)); +} + +function keyword2cmyk(args) { + return rgb2cmyk(keyword2rgb(args)); +} + +function keyword2lab(args) { + return rgb2lab(keyword2rgb(args)); +} + +function keyword2xyz(args) { + return rgb2xyz(keyword2rgb(args)); +} + +var cssKeywords = { + aliceblue: [240,248,255], + antiquewhite: [250,235,215], + aqua: [0,255,255], + aquamarine: [127,255,212], + azure: [240,255,255], + beige: [245,245,220], + bisque: [255,228,196], + black: [0,0,0], + blanchedalmond: [255,235,205], + blue: [0,0,255], + blueviolet: [138,43,226], + brown: [165,42,42], + burlywood: [222,184,135], + cadetblue: [95,158,160], + chartreuse: [127,255,0], + chocolate: [210,105,30], + coral: [255,127,80], + cornflowerblue: [100,149,237], + cornsilk: [255,248,220], + crimson: [220,20,60], + cyan: [0,255,255], + darkblue: [0,0,139], + darkcyan: [0,139,139], + darkgoldenrod: [184,134,11], + darkgray: [169,169,169], + darkgreen: [0,100,0], + darkgrey: [169,169,169], + darkkhaki: [189,183,107], + darkmagenta: [139,0,139], + darkolivegreen: [85,107,47], + darkorange: [255,140,0], + darkorchid: [153,50,204], + darkred: [139,0,0], + darksalmon: [233,150,122], + darkseagreen: [143,188,143], + darkslateblue: [72,61,139], + darkslategray: [47,79,79], + darkslategrey: [47,79,79], + darkturquoise: [0,206,209], + darkviolet: [148,0,211], + deeppink: [255,20,147], + deepskyblue: [0,191,255], + dimgray: [105,105,105], + dimgrey: [105,105,105], + dodgerblue: [30,144,255], + firebrick: [178,34,34], + floralwhite: [255,250,240], + forestgreen: [34,139,34], + fuchsia: [255,0,255], + gainsboro: [220,220,220], + ghostwhite: [248,248,255], + gold: [255,215,0], + goldenrod: [218,165,32], + gray: [128,128,128], + green: [0,128,0], + greenyellow: [173,255,47], + grey: [128,128,128], + honeydew: [240,255,240], + hotpink: [255,105,180], + indianred: [205,92,92], + indigo: [75,0,130], + ivory: [255,255,240], + khaki: [240,230,140], + lavender: [230,230,250], + lavenderblush: [255,240,245], + lawngreen: [124,252,0], + lemonchiffon: [255,250,205], + lightblue: [173,216,230], + lightcoral: [240,128,128], + lightcyan: [224,255,255], + lightgoldenrodyellow: [250,250,210], + lightgray: [211,211,211], + lightgreen: [144,238,144], + lightgrey: [211,211,211], + lightpink: [255,182,193], + lightsalmon: [255,160,122], + lightseagreen: [32,178,170], + lightskyblue: [135,206,250], + lightslategray: [119,136,153], + lightslategrey: [119,136,153], + lightsteelblue: [176,196,222], + lightyellow: [255,255,224], + lime: [0,255,0], + limegreen: [50,205,50], + linen: [250,240,230], + magenta: [255,0,255], + maroon: [128,0,0], + mediumaquamarine: [102,205,170], + mediumblue: [0,0,205], + mediumorchid: [186,85,211], + mediumpurple: [147,112,219], + mediumseagreen: [60,179,113], + mediumslateblue: [123,104,238], + mediumspringgreen: [0,250,154], + mediumturquoise: [72,209,204], + mediumvioletred: [199,21,133], + midnightblue: [25,25,112], + mintcream: [245,255,250], + mistyrose: [255,228,225], + moccasin: [255,228,181], + navajowhite: [255,222,173], + navy: [0,0,128], + oldlace: [253,245,230], + olive: [128,128,0], + olivedrab: [107,142,35], + orange: [255,165,0], + orangered: [255,69,0], + orchid: [218,112,214], + palegoldenrod: [238,232,170], + palegreen: [152,251,152], + paleturquoise: [175,238,238], + palevioletred: [219,112,147], + papayawhip: [255,239,213], + peachpuff: [255,218,185], + peru: [205,133,63], + pink: [255,192,203], + plum: [221,160,221], + powderblue: [176,224,230], + purple: [128,0,128], + rebeccapurple: [102, 51, 153], + red: [255,0,0], + rosybrown: [188,143,143], + royalblue: [65,105,225], + saddlebrown: [139,69,19], + salmon: [250,128,114], + sandybrown: [244,164,96], + seagreen: [46,139,87], + seashell: [255,245,238], + sienna: [160,82,45], + silver: [192,192,192], + skyblue: [135,206,235], + slateblue: [106,90,205], + slategray: [112,128,144], + slategrey: [112,128,144], + snow: [255,250,250], + springgreen: [0,255,127], + steelblue: [70,130,180], + tan: [210,180,140], + teal: [0,128,128], + thistle: [216,191,216], + tomato: [255,99,71], + turquoise: [64,224,208], + violet: [238,130,238], + wheat: [245,222,179], + white: [255,255,255], + whitesmoke: [245,245,245], + yellow: [255,255,0], + yellowgreen: [154,205,50] +}; + +var reverseKeywords = {}; +for (var key in cssKeywords) { + reverseKeywords[JSON.stringify(cssKeywords[key])] = key; +} + +var convert = function() { + return new Converter(); +}; + +for (var func in conversions) { + // export Raw versions + convert[func + "Raw"] = (function(func) { + // accept array or plain args + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + return conversions[func](arg); + } + })(func); + + var pair = /(\w+)2(\w+)/.exec(func), + from = pair[1], + to = pair[2]; + + // export rgb2hsl and ["rgb"]["hsl"] + convert[from] = convert[from] || {}; + + convert[from][to] = convert[func] = (function(func) { + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + + var val = conversions[func](arg); + if (typeof val == "string" || val === undefined) + return val; // keyword + + for (var i = 0; i < val.length; i++) + val[i] = Math.round(val[i]); + return val; + } + })(func); +} + + +/* Converter does lazy conversion and caching */ +var Converter = function() { + this.convs = {}; +}; + +/* Either get the values for a space or + set the values for a space, depending on args */ +Converter.prototype.routeSpace = function(space, args) { + var values = args[0]; + if (values === undefined) { + // color.rgb() + return this.getValues(space); + } + // color.rgb(10, 10, 10) + if (typeof values == "number") { + values = Array.prototype.slice.call(args); + } + + return this.setValues(space, values); +}; + +/* Set the values for a space, invalidating cache */ +Converter.prototype.setValues = function(space, values) { + this.space = space; + this.convs = {}; + this.convs[space] = values; + return this; +}; + +/* Get the values for a space. If there's already + a conversion for the space, fetch it, otherwise + compute it */ +Converter.prototype.getValues = function(space) { + var vals = this.convs[space]; + if (!vals) { + var fspace = this.space, + from = this.convs[fspace]; + vals = convert[fspace][space](from); + + this.convs[space] = vals; + } + return vals; +}; + +["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { + Converter.prototype[space] = function(vals) { + return this.routeSpace(space, arguments); + }; +}); + +var colorConvert = convert; + +var colorName = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; + +/* MIT license */ + + +var colorString = { + getRgba: getRgba, + getHsla: getHsla, + getRgb: getRgb, + getHsl: getHsl, + getHwb: getHwb, + getAlpha: getAlpha, + + hexString: hexString, + rgbString: rgbString, + rgbaString: rgbaString, + percentString: percentString, + percentaString: percentaString, + hslString: hslString, + hslaString: hslaString, + hwbString: hwbString, + keyword: keyword +}; + +function getRgba(string) { + if (!string) { + return; + } + var abbr = /^#([a-fA-F0-9]{3,4})$/i, + hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i, + rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + keyword = /(\w+)/; + + var rgb = [0, 0, 0], + a = 1, + match = string.match(abbr), + hexAlpha = ""; + if (match) { + match = match[1]; + hexAlpha = match[3]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i] + match[i], 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(hex)) { + hexAlpha = match[2]; + match = match[1]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(rgba)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i + 1]); + } + a = parseFloat(match[4]); + } + else if (match = string.match(per)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); + } + a = parseFloat(match[4]); + } + else if (match = string.match(keyword)) { + if (match[1] == "transparent") { + return [0, 0, 0, 0]; + } + rgb = colorName[match[1]]; + if (!rgb) { + return; + } + } + + for (var i = 0; i < rgb.length; i++) { + rgb[i] = scale(rgb[i], 0, 255); + } + if (!a && a != 0) { + a = 1; + } + else { + a = scale(a, 0, 1); + } + rgb[3] = a; + return rgb; +} + +function getHsla(string) { + if (!string) { + return; + } + var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hsl); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + s = scale(parseFloat(match[2]), 0, 100), + l = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, s, l, a]; + } +} + +function getHwb(string) { + if (!string) { + return; + } + var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hwb); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + w = scale(parseFloat(match[2]), 0, 100), + b = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, w, b, a]; + } +} + +function getRgb(string) { + var rgba = getRgba(string); + return rgba && rgba.slice(0, 3); +} + +function getHsl(string) { + var hsla = getHsla(string); + return hsla && hsla.slice(0, 3); +} + +function getAlpha(string) { + var vals = getRgba(string); + if (vals) { + return vals[3]; + } + else if (vals = getHsla(string)) { + return vals[3]; + } + else if (vals = getHwb(string)) { + return vals[3]; + } +} + +// generators +function hexString(rgba, a) { + var a = (a !== undefined && rgba.length === 3) ? a : rgba[3]; + return "#" + hexDouble(rgba[0]) + + hexDouble(rgba[1]) + + hexDouble(rgba[2]) + + ( + (a >= 0 && a < 1) + ? hexDouble(Math.round(a * 255)) + : "" + ); +} + +function rgbString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return rgbaString(rgba, alpha); + } + return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; +} + +function rgbaString(rgba, alpha) { + if (alpha === undefined) { + alpha = (rgba[3] !== undefined ? rgba[3] : 1); + } + return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + + ", " + alpha + ")"; +} + +function percentString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return percentaString(rgba, alpha); + } + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + + return "rgb(" + r + "%, " + g + "%, " + b + "%)"; +} + +function percentaString(rgba, alpha) { + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; +} + +function hslString(hsla, alpha) { + if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { + return hslaString(hsla, alpha); + } + return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; +} + +function hslaString(hsla, alpha) { + if (alpha === undefined) { + alpha = (hsla[3] !== undefined ? hsla[3] : 1); + } + return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + + alpha + ")"; +} + +// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax +// (hwb have alpha optional & 1 is default value) +function hwbString(hwb, alpha) { + if (alpha === undefined) { + alpha = (hwb[3] !== undefined ? hwb[3] : 1); + } + return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" + + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; +} + +function keyword(rgb) { + return reverseNames[rgb.slice(0, 3)]; +} + +// helpers +function scale(num, min, max) { + return Math.min(Math.max(min, num), max); +} + +function hexDouble(num) { + var str = num.toString(16).toUpperCase(); + return (str.length < 2) ? "0" + str : str; +} + + +//create a list of reverse color names +var reverseNames = {}; +for (var name in colorName) { + reverseNames[colorName[name]] = name; +} + +/* MIT license */ + + + +var Color = function (obj) { + if (obj instanceof Color) { + return obj; + } + if (!(this instanceof Color)) { + return new Color(obj); + } + + this.valid = false; + this.values = { + rgb: [0, 0, 0], + hsl: [0, 0, 0], + hsv: [0, 0, 0], + hwb: [0, 0, 0], + cmyk: [0, 0, 0, 0], + alpha: 1 + }; + + // parse Color() argument + var vals; + if (typeof obj === 'string') { + vals = colorString.getRgba(obj); + if (vals) { + this.setValues('rgb', vals); + } else if (vals = colorString.getHsla(obj)) { + this.setValues('hsl', vals); + } else if (vals = colorString.getHwb(obj)) { + this.setValues('hwb', vals); + } + } else if (typeof obj === 'object') { + vals = obj; + if (vals.r !== undefined || vals.red !== undefined) { + this.setValues('rgb', vals); + } else if (vals.l !== undefined || vals.lightness !== undefined) { + this.setValues('hsl', vals); + } else if (vals.v !== undefined || vals.value !== undefined) { + this.setValues('hsv', vals); + } else if (vals.w !== undefined || vals.whiteness !== undefined) { + this.setValues('hwb', vals); + } else if (vals.c !== undefined || vals.cyan !== undefined) { + this.setValues('cmyk', vals); + } + } +}; + +Color.prototype = { + isValid: function () { + return this.valid; + }, + rgb: function () { + return this.setSpace('rgb', arguments); + }, + hsl: function () { + return this.setSpace('hsl', arguments); + }, + hsv: function () { + return this.setSpace('hsv', arguments); + }, + hwb: function () { + return this.setSpace('hwb', arguments); + }, + cmyk: function () { + return this.setSpace('cmyk', arguments); + }, + + rgbArray: function () { + return this.values.rgb; + }, + hslArray: function () { + return this.values.hsl; + }, + hsvArray: function () { + return this.values.hsv; + }, + hwbArray: function () { + var values = this.values; + if (values.alpha !== 1) { + return values.hwb.concat([values.alpha]); + } + return values.hwb; + }, + cmykArray: function () { + return this.values.cmyk; + }, + rgbaArray: function () { + var values = this.values; + return values.rgb.concat([values.alpha]); + }, + hslaArray: function () { + var values = this.values; + return values.hsl.concat([values.alpha]); + }, + alpha: function (val) { + if (val === undefined) { + return this.values.alpha; + } + this.setValues('alpha', val); + return this; + }, + + red: function (val) { + return this.setChannel('rgb', 0, val); + }, + green: function (val) { + return this.setChannel('rgb', 1, val); + }, + blue: function (val) { + return this.setChannel('rgb', 2, val); + }, + hue: function (val) { + if (val) { + val %= 360; + val = val < 0 ? 360 + val : val; + } + return this.setChannel('hsl', 0, val); + }, + saturation: function (val) { + return this.setChannel('hsl', 1, val); + }, + lightness: function (val) { + return this.setChannel('hsl', 2, val); + }, + saturationv: function (val) { + return this.setChannel('hsv', 1, val); + }, + whiteness: function (val) { + return this.setChannel('hwb', 1, val); + }, + blackness: function (val) { + return this.setChannel('hwb', 2, val); + }, + value: function (val) { + return this.setChannel('hsv', 2, val); + }, + cyan: function (val) { + return this.setChannel('cmyk', 0, val); + }, + magenta: function (val) { + return this.setChannel('cmyk', 1, val); + }, + yellow: function (val) { + return this.setChannel('cmyk', 2, val); + }, + black: function (val) { + return this.setChannel('cmyk', 3, val); + }, + + hexString: function () { + return colorString.hexString(this.values.rgb); + }, + rgbString: function () { + return colorString.rgbString(this.values.rgb, this.values.alpha); + }, + rgbaString: function () { + return colorString.rgbaString(this.values.rgb, this.values.alpha); + }, + percentString: function () { + return colorString.percentString(this.values.rgb, this.values.alpha); + }, + hslString: function () { + return colorString.hslString(this.values.hsl, this.values.alpha); + }, + hslaString: function () { + return colorString.hslaString(this.values.hsl, this.values.alpha); + }, + hwbString: function () { + return colorString.hwbString(this.values.hwb, this.values.alpha); + }, + keyword: function () { + return colorString.keyword(this.values.rgb, this.values.alpha); + }, + + rgbNumber: function () { + var rgb = this.values.rgb; + return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + }, + + luminosity: function () { + // http://www.w3.org/TR/WCAG20/#relativeluminancedef + var rgb = this.values.rgb; + var lum = []; + for (var i = 0; i < rgb.length; i++) { + var chan = rgb[i] / 255; + lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); + } + return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; + }, + + contrast: function (color2) { + // http://www.w3.org/TR/WCAG20/#contrast-ratiodef + var lum1 = this.luminosity(); + var lum2 = color2.luminosity(); + if (lum1 > lum2) { + return (lum1 + 0.05) / (lum2 + 0.05); + } + return (lum2 + 0.05) / (lum1 + 0.05); + }, + + level: function (color2) { + var contrastRatio = this.contrast(color2); + if (contrastRatio >= 7.1) { + return 'AAA'; + } + + return (contrastRatio >= 4.5) ? 'AA' : ''; + }, + + dark: function () { + // YIQ equation from http://24ways.org/2010/calculating-color-contrast + var rgb = this.values.rgb; + var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; + return yiq < 128; + }, + + light: function () { + return !this.dark(); + }, + + negate: function () { + var rgb = []; + for (var i = 0; i < 3; i++) { + rgb[i] = 255 - this.values.rgb[i]; + } + this.setValues('rgb', rgb); + return this; + }, + + lighten: function (ratio) { + var hsl = this.values.hsl; + hsl[2] += hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + darken: function (ratio) { + var hsl = this.values.hsl; + hsl[2] -= hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + saturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] += hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + desaturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] -= hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + whiten: function (ratio) { + var hwb = this.values.hwb; + hwb[1] += hwb[1] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + blacken: function (ratio) { + var hwb = this.values.hwb; + hwb[2] += hwb[2] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + greyscale: function () { + var rgb = this.values.rgb; + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; + this.setValues('rgb', [val, val, val]); + return this; + }, + + clearer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha - (alpha * ratio)); + return this; + }, + + opaquer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha + (alpha * ratio)); + return this; + }, + + rotate: function (degrees) { + var hsl = this.values.hsl; + var hue = (hsl[0] + degrees) % 360; + hsl[0] = hue < 0 ? 360 + hue : hue; + this.setValues('hsl', hsl); + return this; + }, + + /** + * Ported from sass implementation in C + * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 + */ + mix: function (mixinColor, weight) { + var color1 = this; + var color2 = mixinColor; + var p = weight === undefined ? 0.5 : weight; + + var w = 2 * p - 1; + var a = color1.alpha() - color2.alpha(); + + var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + return this + .rgb( + w1 * color1.red() + w2 * color2.red(), + w1 * color1.green() + w2 * color2.green(), + w1 * color1.blue() + w2 * color2.blue() + ) + .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); + }, + + toJSON: function () { + return this.rgb(); + }, + + clone: function () { + // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, + // making the final build way to big to embed in Chart.js. So let's do it manually, + // assuming that values to clone are 1 dimension arrays containing only numbers, + // except 'alpha' which is a number. + var result = new Color(); + var source = this.values; + var target = result.values; + var value, type; + + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + value = source[prop]; + type = ({}).toString.call(value); + if (type === '[object Array]') { + target[prop] = value.slice(0); + } else if (type === '[object Number]') { + target[prop] = value; + } else { + console.error('unexpected color value:', value); + } + } + } + + return result; + } +}; + +Color.prototype.spaces = { + rgb: ['red', 'green', 'blue'], + hsl: ['hue', 'saturation', 'lightness'], + hsv: ['hue', 'saturation', 'value'], + hwb: ['hue', 'whiteness', 'blackness'], + cmyk: ['cyan', 'magenta', 'yellow', 'black'] +}; + +Color.prototype.maxes = { + rgb: [255, 255, 255], + hsl: [360, 100, 100], + hsv: [360, 100, 100], + hwb: [360, 100, 100], + cmyk: [100, 100, 100, 100] +}; + +Color.prototype.getValues = function (space) { + var values = this.values; + var vals = {}; + + for (var i = 0; i < space.length; i++) { + vals[space.charAt(i)] = values[space][i]; + } + + if (values.alpha !== 1) { + vals.a = values.alpha; + } + + // {r: 255, g: 255, b: 255, a: 0.4} + return vals; +}; + +Color.prototype.setValues = function (space, vals) { + var values = this.values; + var spaces = this.spaces; + var maxes = this.maxes; + var alpha = 1; + var i; + + this.valid = true; + + if (space === 'alpha') { + alpha = vals; + } else if (vals.length) { + // [10, 10, 10] + values[space] = vals.slice(0, space.length); + alpha = vals[space.length]; + } else if (vals[space.charAt(0)] !== undefined) { + // {r: 10, g: 10, b: 10} + for (i = 0; i < space.length; i++) { + values[space][i] = vals[space.charAt(i)]; + } + + alpha = vals.a; + } else if (vals[spaces[space][0]] !== undefined) { + // {red: 10, green: 10, blue: 10} + var chans = spaces[space]; + + for (i = 0; i < space.length; i++) { + values[space][i] = vals[chans[i]]; + } + + alpha = vals.alpha; + } + + values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); + + if (space === 'alpha') { + return false; + } + + var capped; + + // cap values of the space prior converting all values + for (i = 0; i < space.length; i++) { + capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); + values[space][i] = Math.round(capped); + } + + // convert to all the other color spaces + for (var sname in spaces) { + if (sname !== space) { + values[sname] = colorConvert[space][sname](values[space]); + } + } + + return true; +}; + +Color.prototype.setSpace = function (space, args) { + var vals = args[0]; + + if (vals === undefined) { + // color.rgb() + return this.getValues(space); + } + + // color.rgb(10, 10, 10) + if (typeof vals === 'number') { + vals = Array.prototype.slice.call(args); + } + + this.setValues(space, vals); + return this; +}; + +Color.prototype.setChannel = function (space, index, val) { + var svalues = this.values[space]; + if (val === undefined) { + // color.red() + return svalues[index]; + } else if (val === svalues[index]) { + // color.red(color.red()) + return this; + } + + // color.red(100) + svalues[index] = val; + this.setValues(space, svalues); + + return this; +}; + +if (typeof window !== 'undefined') { + window.Color = Color; +} + +var chartjsColor = Color; + +/** + * @namespace Chart.helpers + */ +var helpers = { + /** + * An empty function that can be used, for example, for optional callback. + */ + noop: function() {}, + + /** + * Returns a unique id, sequentially generated from a global variable. + * @returns {number} + * @function + */ + uid: (function() { + var id = 0; + return function() { + return id++; + }; + }()), + + /** + * Returns true if `value` is neither null nor undefined, else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isNullOrUndef: function(value) { + return value === null || typeof value === 'undefined'; + }, + + /** + * Returns true if `value` is an array (including typed arrays), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @function + */ + isArray: function(value) { + if (Array.isArray && Array.isArray(value)) { + return true; + } + var type = Object.prototype.toString.call(value); + if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { + return true; + } + return false; + }, + + /** + * Returns true if `value` is an object (excluding null), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isObject: function(value) { + return value !== null && Object.prototype.toString.call(value) === '[object Object]'; + }, + + /** + * Returns true if `value` is a finite number, else returns false + * @param {*} value - The value to test. + * @returns {boolean} + */ + isFinite: function(value) { + return (typeof value === 'number' || value instanceof Number) && isFinite(value); + }, + + /** + * Returns `value` if defined, else returns `defaultValue`. + * @param {*} value - The value to return if defined. + * @param {*} defaultValue - The value to return if `value` is undefined. + * @returns {*} + */ + valueOrDefault: function(value, defaultValue) { + return typeof value === 'undefined' ? defaultValue : value; + }, + + /** + * Returns value at the given `index` in array if defined, else returns `defaultValue`. + * @param {Array} value - The array to lookup for value at `index`. + * @param {number} index - The index in `value` to lookup for value. + * @param {*} defaultValue - The value to return if `value[index]` is undefined. + * @returns {*} + */ + valueAtIndexOrDefault: function(value, index, defaultValue) { + return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); + }, + + /** + * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the + * value returned by `fn`. If `fn` is not a function, this method returns undefined. + * @param {function} fn - The function to call. + * @param {Array|undefined|null} args - The arguments with which `fn` should be called. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @returns {*} + */ + callback: function(fn, args, thisArg) { + if (fn && typeof fn.call === 'function') { + return fn.apply(thisArg, args); + } + }, + + /** + * Note(SB) for performance sake, this method should only be used when loopable type + * is unknown or in none intensive code (not called often and small loopable). Else + * it's preferable to use a regular for() loop and save extra function calls. + * @param {object|Array} loopable - The object or array to be iterated. + * @param {function} fn - The function to call for each item. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @param {boolean} [reverse] - If true, iterates backward on the loopable. + */ + each: function(loopable, fn, thisArg, reverse) { + var i, len, keys; + if (helpers.isArray(loopable)) { + len = loopable.length; + if (reverse) { + for (i = len - 1; i >= 0; i--) { + fn.call(thisArg, loopable[i], i); + } + } else { + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[i], i); + } + } + } else if (helpers.isObject(loopable)) { + keys = Object.keys(loopable); + len = keys.length; + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[keys[i]], keys[i]); + } + } + }, + + /** + * Returns true if the `a0` and `a1` arrays have the same content, else returns false. + * @see https://stackoverflow.com/a/14853974 + * @param {Array} a0 - The array to compare + * @param {Array} a1 - The array to compare + * @returns {boolean} + */ + arrayEquals: function(a0, a1) { + var i, ilen, v0, v1; + + if (!a0 || !a1 || a0.length !== a1.length) { + return false; + } + + for (i = 0, ilen = a0.length; i < ilen; ++i) { + v0 = a0[i]; + v1 = a1[i]; + + if (v0 instanceof Array && v1 instanceof Array) { + if (!helpers.arrayEquals(v0, v1)) { + return false; + } + } else if (v0 !== v1) { + // NOTE: two different object instances will never be equal: {x:20} != {x:20} + return false; + } + } + + return true; + }, + + /** + * Returns a deep copy of `source` without keeping references on objects and arrays. + * @param {*} source - The value to clone. + * @returns {*} + */ + clone: function(source) { + if (helpers.isArray(source)) { + return source.map(helpers.clone); + } + + if (helpers.isObject(source)) { + var target = {}; + var keys = Object.keys(source); + var klen = keys.length; + var k = 0; + + for (; k < klen; ++k) { + target[keys[k]] = helpers.clone(source[keys[k]]); + } + + return target; + } + + return source; + }, + + /** + * The default merger when Chart.helpers.merge is called without merger option. + * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. + * @private + */ + _merger: function(key, target, source, options) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.merge(tval, sval, options); + } else { + target[key] = helpers.clone(sval); + } + }, + + /** + * Merges source[key] in target[key] only if target[key] is undefined. + * @private + */ + _mergerIf: function(key, target, source) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.mergeIf(tval, sval); + } else if (!target.hasOwnProperty(key)) { + target[key] = helpers.clone(sval); + } + }, + + /** + * Recursively deep copies `source` properties into `target` with the given `options`. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @param {object} [options] - Merging options: + * @param {function} [options.merger] - The merge method (key, target, source, options) + * @returns {object} The `target` object. + */ + merge: function(target, source, options) { + var sources = helpers.isArray(source) ? source : [source]; + var ilen = sources.length; + var merge, i, keys, klen, k; + + if (!helpers.isObject(target)) { + return target; + } + + options = options || {}; + merge = options.merger || helpers._merger; + + for (i = 0; i < ilen; ++i) { + source = sources[i]; + if (!helpers.isObject(source)) { + continue; + } + + keys = Object.keys(source); + for (k = 0, klen = keys.length; k < klen; ++k) { + merge(keys[k], target, source, options); + } + } + + return target; + }, + + /** + * Recursively deep copies `source` properties into `target` *only* if not defined in target. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @returns {object} The `target` object. + */ + mergeIf: function(target, source) { + return helpers.merge(target, source, {merger: helpers._mergerIf}); + }, + + /** + * Applies the contents of two or more objects together into the first object. + * @param {object} target - The target object in which all objects are merged into. + * @param {object} arg1 - Object containing additional properties to merge in target. + * @param {object} argN - Additional objects containing properties to merge in target. + * @returns {object} The `target` object. + */ + extend: function(target) { + var setFn = function(value, key) { + target[key] = value; + }; + for (var i = 1, ilen = arguments.length; i < ilen; ++i) { + helpers.each(arguments[i], setFn); + } + return target; + }, + + /** + * Basic javascript inheritance based on the model created in Backbone.js + */ + inherits: function(extensions) { + var me = this; + var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { + return me.apply(this, arguments); + }; + + var Surrogate = function() { + this.constructor = ChartElement; + }; + + Surrogate.prototype = me.prototype; + ChartElement.prototype = new Surrogate(); + ChartElement.extend = helpers.inherits; + + if (extensions) { + helpers.extend(ChartElement.prototype, extensions); + } + + ChartElement.__super__ = me.prototype; + return ChartElement; + } +}; + +var helpers_core = helpers; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.callback instead. + * @function Chart.helpers.callCallback + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +helpers.callCallback = helpers.callback; + +/** + * Provided for backward compatibility, use Array.prototype.indexOf instead. + * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ + * @function Chart.helpers.indexOf + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.indexOf = function(array, item, fromIndex) { + return Array.prototype.indexOf.call(array, item, fromIndex); +}; + +/** + * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. + * @function Chart.helpers.getValueOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueOrDefault = helpers.valueOrDefault; + +/** + * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. + * @function Chart.helpers.getValueAtIndexOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + +/** + * Easing functions adapted from Robert Penner's easing equations. + * @namespace Chart.helpers.easingEffects + * @see http://www.robertpenner.com/easing/ + */ +var effects = { + linear: function(t) { + return t; + }, + + easeInQuad: function(t) { + return t * t; + }, + + easeOutQuad: function(t) { + return -t * (t - 2); + }, + + easeInOutQuad: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t; + } + return -0.5 * ((--t) * (t - 2) - 1); + }, + + easeInCubic: function(t) { + return t * t * t; + }, + + easeOutCubic: function(t) { + return (t = t - 1) * t * t + 1; + }, + + easeInOutCubic: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t; + } + return 0.5 * ((t -= 2) * t * t + 2); + }, + + easeInQuart: function(t) { + return t * t * t * t; + }, + + easeOutQuart: function(t) { + return -((t = t - 1) * t * t * t - 1); + }, + + easeInOutQuart: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t; + } + return -0.5 * ((t -= 2) * t * t * t - 2); + }, + + easeInQuint: function(t) { + return t * t * t * t * t; + }, + + easeOutQuint: function(t) { + return (t = t - 1) * t * t * t * t + 1; + }, + + easeInOutQuint: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t * t; + } + return 0.5 * ((t -= 2) * t * t * t * t + 2); + }, + + easeInSine: function(t) { + return -Math.cos(t * (Math.PI / 2)) + 1; + }, + + easeOutSine: function(t) { + return Math.sin(t * (Math.PI / 2)); + }, + + easeInOutSine: function(t) { + return -0.5 * (Math.cos(Math.PI * t) - 1); + }, + + easeInExpo: function(t) { + return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); + }, + + easeOutExpo: function(t) { + return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; + }, + + easeInOutExpo: function(t) { + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if ((t /= 0.5) < 1) { + return 0.5 * Math.pow(2, 10 * (t - 1)); + } + return 0.5 * (-Math.pow(2, -10 * --t) + 2); + }, + + easeInCirc: function(t) { + if (t >= 1) { + return t; + } + return -(Math.sqrt(1 - t * t) - 1); + }, + + easeOutCirc: function(t) { + return Math.sqrt(1 - (t = t - 1) * t); + }, + + easeInOutCirc: function(t) { + if ((t /= 0.5) < 1) { + return -0.5 * (Math.sqrt(1 - t * t) - 1); + } + return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + + easeInElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + }, + + easeOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; + }, + + easeInOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if ((t /= 0.5) === 2) { + return 1; + } + if (!p) { + p = 0.45; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + if (t < 1) { + return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function(t) { + var s = 1.70158; + return t * t * ((s + 1) * t - s); + }, + + easeOutBack: function(t) { + var s = 1.70158; + return (t = t - 1) * t * ((s + 1) * t + s) + 1; + }, + + easeInOutBack: function(t) { + var s = 1.70158; + if ((t /= 0.5) < 1) { + return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); + } + return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + + easeInBounce: function(t) { + return 1 - effects.easeOutBounce(1 - t); + }, + + easeOutBounce: function(t) { + if (t < (1 / 2.75)) { + return 7.5625 * t * t; + } + if (t < (2 / 2.75)) { + return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; + } + if (t < (2.5 / 2.75)) { + return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; + } + return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; + }, + + easeInOutBounce: function(t) { + if (t < 0.5) { + return effects.easeInBounce(t * 2) * 0.5; + } + return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; + } +}; + +var helpers_easing = { + effects: effects +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.easing.effects instead. + * @function Chart.helpers.easingEffects + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.easingEffects = effects; + +var PI = Math.PI; +var RAD_PER_DEG = PI / 180; +var DOUBLE_PI = PI * 2; +var HALF_PI = PI / 2; +var QUARTER_PI = PI / 4; +var TWO_THIRDS_PI = PI * 2 / 3; + +/** + * @namespace Chart.helpers.canvas + */ +var exports$1 = { + /** + * Clears the entire canvas associated to the given `chart`. + * @param {Chart} chart - The chart for which to clear the canvas. + */ + clear: function(chart) { + chart.ctx.clearRect(0, 0, chart.width, chart.height); + }, + + /** + * Creates a "path" for a rectangle with rounded corners at position (x, y) with a + * given size (width, height) and the same `radius` for all corners. + * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. + * @param {number} x - The x axis of the coordinate for the rectangle starting point. + * @param {number} y - The y axis of the coordinate for the rectangle starting point. + * @param {number} width - The rectangle's width. + * @param {number} height - The rectangle's height. + * @param {number} radius - The rounded amount (in pixels) for the four corners. + * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? + */ + roundedRect: function(ctx, x, y, width, height, radius) { + if (radius) { + var r = Math.min(radius, height / 2, width / 2); + var left = x + r; + var top = y + r; + var right = x + width - r; + var bottom = y + height - r; + + ctx.moveTo(x, top); + if (left < right && top < bottom) { + ctx.arc(left, top, r, -PI, -HALF_PI); + ctx.arc(right, top, r, -HALF_PI, 0); + ctx.arc(right, bottom, r, 0, HALF_PI); + ctx.arc(left, bottom, r, HALF_PI, PI); + } else if (left < right) { + ctx.moveTo(left, y); + ctx.arc(right, top, r, -HALF_PI, HALF_PI); + ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); + } else if (top < bottom) { + ctx.arc(left, top, r, -PI, 0); + ctx.arc(left, bottom, r, 0, PI); + } else { + ctx.arc(left, top, r, -PI, PI); + } + ctx.closePath(); + ctx.moveTo(x, y); + } else { + ctx.rect(x, y, width, height); + } + }, + + drawPoint: function(ctx, style, radius, x, y, rotation) { + var type, xOffset, yOffset, size, cornerRadius; + var rad = (rotation || 0) * RAD_PER_DEG; + + if (style && typeof style === 'object') { + type = style.toString(); + if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { + ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); + return; + } + } + + if (isNaN(radius) || radius <= 0) { + return; + } + + ctx.beginPath(); + + switch (style) { + // Default includes circle + default: + ctx.arc(x, y, radius, 0, DOUBLE_PI); + ctx.closePath(); + break; + case 'triangle': + ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + ctx.closePath(); + break; + case 'rectRounded': + // NOTE: the rounded rect implementation changed to use `arc` instead of + // `quadraticCurveTo` since it generates better results when rect is + // almost a circle. 0.516 (instead of 0.5) produces results with visually + // closer proportion to the previous impl and it is inscribed in the + // circle with `radius`. For more details, see the following PRs: + // https://github.com/chartjs/Chart.js/issues/5597 + // https://github.com/chartjs/Chart.js/issues/5858 + cornerRadius = radius * 0.516; + size = radius - cornerRadius; + xOffset = Math.cos(rad + QUARTER_PI) * size; + yOffset = Math.sin(rad + QUARTER_PI) * size; + ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); + ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); + ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); + ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); + ctx.closePath(); + break; + case 'rect': + if (!rotation) { + size = Math.SQRT1_2 * radius; + ctx.rect(x - size, y - size, 2 * size, 2 * size); + break; + } + rad += QUARTER_PI; + /* falls through */ + case 'rectRot': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + yOffset, y - xOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.lineTo(x - yOffset, y + xOffset); + ctx.closePath(); + break; + case 'crossRot': + rad += QUARTER_PI; + /* falls through */ + case 'cross': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'star': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + rad += QUARTER_PI; + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'line': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + break; + case 'dash': + ctx.moveTo(x, y); + ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); + break; + } + + ctx.fill(); + ctx.stroke(); + }, + + /** + * Returns true if the point is inside the rectangle + * @param {object} point - The point to test + * @param {object} area - The rectangle + * @returns {boolean} + * @private + */ + _isPointInArea: function(point, area) { + var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error. + + return point.x > area.left - epsilon && point.x < area.right + epsilon && + point.y > area.top - epsilon && point.y < area.bottom + epsilon; + }, + + clipArea: function(ctx, area) { + ctx.save(); + ctx.beginPath(); + ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); + ctx.clip(); + }, + + unclipArea: function(ctx) { + ctx.restore(); + }, + + lineTo: function(ctx, previous, target, flip) { + var stepped = target.steppedLine; + if (stepped) { + if (stepped === 'middle') { + var midpoint = (previous.x + target.x) / 2.0; + ctx.lineTo(midpoint, flip ? target.y : previous.y); + ctx.lineTo(midpoint, flip ? previous.y : target.y); + } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) { + ctx.lineTo(previous.x, target.y); + } else { + ctx.lineTo(target.x, previous.y); + } + ctx.lineTo(target.x, target.y); + return; + } + + if (!target.tension) { + ctx.lineTo(target.x, target.y); + return; + } + + ctx.bezierCurveTo( + flip ? previous.controlPointPreviousX : previous.controlPointNextX, + flip ? previous.controlPointPreviousY : previous.controlPointNextY, + flip ? target.controlPointNextX : target.controlPointPreviousX, + flip ? target.controlPointNextY : target.controlPointPreviousY, + target.x, + target.y); + } +}; + +var helpers_canvas = exports$1; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. + * @namespace Chart.helpers.clear + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.clear = exports$1.clear; + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. + * @namespace Chart.helpers.drawRoundedRectangle + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.drawRoundedRectangle = function(ctx) { + ctx.beginPath(); + exports$1.roundedRect.apply(exports$1, arguments); +}; + +var defaults = { + /** + * @private + */ + _set: function(scope, values) { + return helpers_core.merge(this[scope] || (this[scope] = {}), values); + } +}; + +defaults._set('global', { + defaultColor: 'rgba(0,0,0,0.1)', + defaultFontColor: '#666', + defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + defaultFontSize: 12, + defaultFontStyle: 'normal', + defaultLineHeight: 1.2, + showLines: true +}); + +var core_defaults = defaults; + +var valueOrDefault = helpers_core.valueOrDefault; + +/** + * Converts the given font object into a CSS font string. + * @param {object} font - A font object. + * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font + * @private + */ +function toFontString(font) { + if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) { + return null; + } + + return (font.style ? font.style + ' ' : '') + + (font.weight ? font.weight + ' ' : '') + + font.size + 'px ' + + font.family; +} + +/** + * @alias Chart.helpers.options + * @namespace + */ +var helpers_options = { + /** + * Converts the given line height `value` in pixels for a specific font `size`. + * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). + * @param {number} size - The font size (in pixels) used to resolve relative `value`. + * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid). + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height + * @since 2.7.0 + */ + toLineHeight: function(value, size) { + var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); + if (!matches || matches[1] === 'normal') { + return size * 1.2; + } + + value = +matches[2]; + + switch (matches[3]) { + case 'px': + return value; + case '%': + value /= 100; + break; + default: + break; + } + + return size * value; + }, + + /** + * Converts the given value into a padding object with pre-computed width/height. + * @param {number|object} value - If a number, set the value to all TRBL component, + * else, if and object, use defined properties and sets undefined ones to 0. + * @returns {object} The padding values (top, right, bottom, left, width, height) + * @since 2.7.0 + */ + toPadding: function(value) { + var t, r, b, l; + + if (helpers_core.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + top: t, + right: r, + bottom: b, + left: l, + height: t + b, + width: l + r + }; + }, + + /** + * Parses font options and returns the font object. + * @param {object} options - A object that contains font options to be parsed. + * @return {object} The font object. + * @todo Support font.* options and renamed to toFont(). + * @private + */ + _parseFont: function(options) { + var globalDefaults = core_defaults.global; + var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); + var font = { + family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily), + lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size), + size: size, + style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle), + weight: null, + string: '' + }; + + font.string = toFontString(font); + return font; + }, + + /** + * Evaluates the given `inputs` sequentially and returns the first defined value. + * @param {Array} inputs - An array of values, falling back to the last value. + * @param {object} [context] - If defined and the current value is a function, the value + * is called with `context` as first argument and the result becomes the new input. + * @param {number} [index] - If defined and the current value is an array, the value + * at `index` become the new input. + * @since 2.7.0 + */ + resolve: function(inputs, context, index) { + var i, ilen, value; + + for (i = 0, ilen = inputs.length; i < ilen; ++i) { + value = inputs[i]; + if (value === undefined) { + continue; + } + if (context !== undefined && typeof value === 'function') { + value = value(context); + } + if (index !== undefined && helpers_core.isArray(value)) { + value = value[index]; + } + if (value !== undefined) { + return value; + } + } + } +}; + +var helpers$1 = helpers_core; +var easing = helpers_easing; +var canvas = helpers_canvas; +var options = helpers_options; +helpers$1.easing = easing; +helpers$1.canvas = canvas; +helpers$1.options = options; + +function interpolate(start, view, model, ease) { + var keys = Object.keys(model); + var i, ilen, key, actual, origin, target, type, c0, c1; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + + target = model[key]; + + // if a value is added to the model after pivot() has been called, the view + // doesn't contain it, so let's initialize the view to the target value. + if (!view.hasOwnProperty(key)) { + view[key] = target; + } + + actual = view[key]; + + if (actual === target || key[0] === '_') { + continue; + } + + if (!start.hasOwnProperty(key)) { + start[key] = actual; + } + + origin = start[key]; + + type = typeof target; + + if (type === typeof origin) { + if (type === 'string') { + c0 = chartjsColor(origin); + if (c0.valid) { + c1 = chartjsColor(target); + if (c1.valid) { + view[key] = c1.mix(c0, ease).rgbString(); + continue; + } + } + } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) { + view[key] = origin + (target - origin) * ease; + continue; + } + } + + view[key] = target; + } +} + +var Element = function(configuration) { + helpers$1.extend(this, configuration); + this.initialize.apply(this, arguments); +}; + +helpers$1.extend(Element.prototype, { + + initialize: function() { + this.hidden = false; + }, + + pivot: function() { + var me = this; + if (!me._view) { + me._view = helpers$1.clone(me._model); + } + me._start = {}; + return me; + }, + + transition: function(ease) { + var me = this; + var model = me._model; + var start = me._start; + var view = me._view; + + // No animation -> No Transition + if (!model || ease === 1) { + me._view = model; + me._start = null; + return me; + } + + if (!view) { + view = me._view = {}; + } + + if (!start) { + start = me._start = {}; + } + + interpolate(start, view, model, ease); + + return me; + }, + + tooltipPosition: function() { + return { + x: this._model.x, + y: this._model.y + }; + }, + + hasValue: function() { + return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y); + } +}); + +Element.extend = helpers$1.inherits; + +var core_element = Element; + +var exports$2 = core_element.extend({ + chart: null, // the animation associated chart instance + currentStep: 0, // the current animation step + numSteps: 60, // default number of steps + easing: '', // the easing to use for this animation + render: null, // render function used by the animation service + + onAnimationProgress: null, // user specified callback to fire on each step of the animation + onAnimationComplete: null, // user specified callback to fire when the animation finishes +}); + +var core_animation = exports$2; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.Animation instead + * @prop Chart.Animation#animationObject + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$2.prototype, 'animationObject', { + get: function() { + return this; + } +}); + +/** + * Provided for backward compatibility, use Chart.Animation#chart instead + * @prop Chart.Animation#chartInstance + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$2.prototype, 'chartInstance', { + get: function() { + return this.chart; + }, + set: function(value) { + this.chart = value; + } +}); + +core_defaults._set('global', { + animation: { + duration: 1000, + easing: 'easeOutQuart', + onProgress: helpers$1.noop, + onComplete: helpers$1.noop + } +}); + +var core_animations = { + animations: [], + request: null, + + /** + * @param {Chart} chart - The chart to animate. + * @param {Chart.Animation} animation - The animation that we will animate. + * @param {number} duration - The animation duration in ms. + * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions + */ + addAnimation: function(chart, animation, duration, lazy) { + var animations = this.animations; + var i, ilen; + + animation.chart = chart; + animation.startTime = Date.now(); + animation.duration = duration; + + if (!lazy) { + chart.animating = true; + } + + for (i = 0, ilen = animations.length; i < ilen; ++i) { + if (animations[i].chart === chart) { + animations[i] = animation; + return; + } + } + + animations.push(animation); + + // If there are no animations queued, manually kickstart a digest, for lack of a better word + if (animations.length === 1) { + this.requestAnimationFrame(); + } + }, + + cancelAnimation: function(chart) { + var index = helpers$1.findIndex(this.animations, function(animation) { + return animation.chart === chart; + }); + + if (index !== -1) { + this.animations.splice(index, 1); + chart.animating = false; + } + }, + + requestAnimationFrame: function() { + var me = this; + if (me.request === null) { + // Skip animation frame requests until the active one is executed. + // This can happen when processing mouse events, e.g. 'mousemove' + // and 'mouseout' events will trigger multiple renders. + me.request = helpers$1.requestAnimFrame.call(window, function() { + me.request = null; + me.startDigest(); + }); + } + }, + + /** + * @private + */ + startDigest: function() { + var me = this; + + me.advance(); + + // Do we have more stuff to animate? + if (me.animations.length > 0) { + me.requestAnimationFrame(); + } + }, + + /** + * @private + */ + advance: function() { + var animations = this.animations; + var animation, chart, numSteps, nextStep; + var i = 0; + + // 1 animation per chart, so we are looping charts here + while (i < animations.length) { + animation = animations[i]; + chart = animation.chart; + numSteps = animation.numSteps; + + // Make sure that currentStep starts at 1 + // https://github.com/chartjs/Chart.js/issues/6104 + nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1; + animation.currentStep = Math.min(nextStep, numSteps); + + helpers$1.callback(animation.render, [chart, animation], chart); + helpers$1.callback(animation.onAnimationProgress, [animation], chart); + + if (animation.currentStep >= numSteps) { + helpers$1.callback(animation.onAnimationComplete, [animation], chart); + chart.animating = false; + animations.splice(i, 1); + } else { + ++i; + } + } + } +}; + +var resolve = helpers$1.options.resolve; + +var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; + +/** + * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', + * 'unshift') and notify the listener AFTER the array has been altered. Listeners are + * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. + */ +function listenArrayEvents(array, listener) { + if (array._chartjs) { + array._chartjs.listeners.push(listener); + return; + } + + Object.defineProperty(array, '_chartjs', { + configurable: true, + enumerable: false, + value: { + listeners: [listener] + } + }); + + arrayEvents.forEach(function(key) { + var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); + var base = array[key]; + + Object.defineProperty(array, key, { + configurable: true, + enumerable: false, + value: function() { + var args = Array.prototype.slice.call(arguments); + var res = base.apply(this, args); + + helpers$1.each(array._chartjs.listeners, function(object) { + if (typeof object[method] === 'function') { + object[method].apply(object, args); + } + }); + + return res; + } + }); + }); +} + +/** + * Removes the given array event listener and cleanup extra attached properties (such as + * the _chartjs stub and overridden methods) if array doesn't have any more listeners. + */ +function unlistenArrayEvents(array, listener) { + var stub = array._chartjs; + if (!stub) { + return; + } + + var listeners = stub.listeners; + var index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + + if (listeners.length > 0) { + return; + } + + arrayEvents.forEach(function(key) { + delete array[key]; + }); + + delete array._chartjs; +} + +// Base class for all dataset controllers (line, bar, etc) +var DatasetController = function(chart, datasetIndex) { + this.initialize(chart, datasetIndex); +}; + +helpers$1.extend(DatasetController.prototype, { + + /** + * Element type used to generate a meta dataset (e.g. Chart.element.Line). + * @type {Chart.core.element} + */ + datasetElementType: null, + + /** + * Element type used to generate a meta data (e.g. Chart.element.Point). + * @type {Chart.core.element} + */ + dataElementType: null, + + initialize: function(chart, datasetIndex) { + var me = this; + me.chart = chart; + me.index = datasetIndex; + me.linkScales(); + me.addElements(); + }, + + updateIndex: function(datasetIndex) { + this.index = datasetIndex; + }, + + linkScales: function() { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + + if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) { + meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; + } + if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) { + meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; + } + }, + + getDataset: function() { + return this.chart.data.datasets[this.index]; + }, + + getMeta: function() { + return this.chart.getDatasetMeta(this.index); + }, + + getScaleForId: function(scaleID) { + return this.chart.scales[scaleID]; + }, + + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().yAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getValueScale: function() { + return this.getScaleForId(this._getValueScaleId()); + }, + + /** + * @private + */ + _getIndexScale: function() { + return this.getScaleForId(this._getIndexScaleId()); + }, + + reset: function() { + this.update(true); + }, + + /** + * @private + */ + destroy: function() { + if (this._data) { + unlistenArrayEvents(this._data, this); + } + }, + + createMetaDataset: function() { + var me = this; + var type = me.datasetElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index + }); + }, + + createMetaData: function(index) { + var me = this; + var type = me.dataElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index, + _index: index + }); + }, + + addElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data || []; + var metaData = meta.data; + var i, ilen; + + for (i = 0, ilen = data.length; i < ilen; ++i) { + metaData[i] = metaData[i] || me.createMetaData(i); + } + + meta.dataset = meta.dataset || me.createMetaDataset(); + }, + + addElementAndReset: function(index) { + var element = this.createMetaData(index); + this.getMeta().data.splice(index, 0, element); + this.updateElement(element, index, true); + }, + + buildOrUpdateElements: function() { + var me = this; + var dataset = me.getDataset(); + var data = dataset.data || (dataset.data = []); + + // In order to correctly handle data addition/deletion animation (an thus simulate + // real-time charts), we need to monitor these data modifications and synchronize + // the internal meta data accordingly. + if (me._data !== data) { + if (me._data) { + // This case happens when the user replaced the data array instance. + unlistenArrayEvents(me._data, me); + } + + if (data && Object.isExtensible(data)) { + listenArrayEvents(data, me); + } + me._data = data; + } + + // Re-sync meta data in case the user replaced the data array or if we missed + // any updates and so make sure that we handle number of datapoints changing. + me.resyncElements(); + }, + + update: helpers$1.noop, + + transition: function(easingValue) { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + for (; i < ilen; ++i) { + elements[i].transition(easingValue); + } + + if (meta.dataset) { + meta.dataset.transition(easingValue); + } + }, + + draw: function() { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + if (meta.dataset) { + meta.dataset.draw(); + } + + for (; i < ilen; ++i) { + elements[i].draw(); + } + }, + + removeHoverStyle: function(element) { + helpers$1.merge(element._model, element.$previousStyle || {}); + delete element.$previousStyle; + }, + + setHoverStyle: function(element) { + var dataset = this.chart.data.datasets[element._datasetIndex]; + var index = element._index; + var custom = element.custom || {}; + var model = element._model; + var getHoverColor = helpers$1.getHoverColor; + + element.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth + }; + + model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index); + model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index); + model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index); + }, + + /** + * @private + */ + resyncElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data; + var numMeta = meta.data.length; + var numData = data.length; + + if (numData < numMeta) { + meta.data.splice(numData, numMeta - numData); + } else if (numData > numMeta) { + me.insertElements(numMeta, numData - numMeta); + } + }, + + /** + * @private + */ + insertElements: function(start, count) { + for (var i = 0; i < count; ++i) { + this.addElementAndReset(start + i); + } + }, + + /** + * @private + */ + onDataPush: function() { + var count = arguments.length; + this.insertElements(this.getDataset().data.length - count, count); + }, + + /** + * @private + */ + onDataPop: function() { + this.getMeta().data.pop(); + }, + + /** + * @private + */ + onDataShift: function() { + this.getMeta().data.shift(); + }, + + /** + * @private + */ + onDataSplice: function(start, count) { + this.getMeta().data.splice(start, count); + this.insertElements(start, arguments.length - 2); + }, + + /** + * @private + */ + onDataUnshift: function() { + this.insertElements(0, arguments.length); + } +}); + +DatasetController.extend = helpers$1.inherits; + +var core_datasetController = DatasetController; + +core_defaults._set('global', { + elements: { + arc: { + backgroundColor: core_defaults.global.defaultColor, + borderColor: '#fff', + borderWidth: 2, + borderAlign: 'center' + } + } +}); + +var element_arc = core_element.extend({ + inLabelRange: function(mouseX) { + var vm = this._view; + + if (vm) { + return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); + } + return false; + }, + + inRange: function(chartX, chartY) { + var vm = this._view; + + if (vm) { + var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY}); + var angle = pointRelativePosition.angle; + var distance = pointRelativePosition.distance; + + // Sanitise angle range + var startAngle = vm.startAngle; + var endAngle = vm.endAngle; + while (endAngle < startAngle) { + endAngle += 2.0 * Math.PI; + } + while (angle > endAngle) { + angle -= 2.0 * Math.PI; + } + while (angle < startAngle) { + angle += 2.0 * Math.PI; + } + + // Check if within the range of the open/close angle + var betweenAngles = (angle >= startAngle && angle <= endAngle); + var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); + + return (betweenAngles && withinRadius); + } + return false; + }, + + getCenterPoint: function() { + var vm = this._view; + var halfAngle = (vm.startAngle + vm.endAngle) / 2; + var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; + return { + x: vm.x + Math.cos(halfAngle) * halfRadius, + y: vm.y + Math.sin(halfAngle) * halfRadius + }; + }, + + getArea: function() { + var vm = this._view; + return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); + }, + + tooltipPosition: function() { + var vm = this._view; + var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); + var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; + + return { + x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), + y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var sA = vm.startAngle; + var eA = vm.endAngle; + var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0; + var angleMargin; + + ctx.save(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.fillStyle = vm.backgroundColor; + ctx.fill(); + + if (vm.borderWidth) { + if (vm.borderAlign === 'inner') { + // Draw an inner border by cliping the arc and drawing a double-width border + // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders + ctx.beginPath(); + angleMargin = pixelMargin / vm.outerRadius; + ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin); + if (vm.innerRadius > pixelMargin) { + angleMargin = pixelMargin / vm.innerRadius; + ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true); + } else { + ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2); + } + ctx.closePath(); + ctx.clip(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.lineWidth = vm.borderWidth * 2; + ctx.lineJoin = 'round'; + } else { + ctx.lineWidth = vm.borderWidth; + ctx.lineJoin = 'bevel'; + } + + ctx.strokeStyle = vm.borderColor; + ctx.stroke(); + } + + ctx.restore(); + } +}); + +var valueOrDefault$1 = helpers$1.valueOrDefault; + +var defaultColor = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + line: { + tension: 0.4, + backgroundColor: defaultColor, + borderWidth: 3, + borderColor: defaultColor, + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + capBezierPoints: true, + fill: true, // do we fill in the area between the line and its base axis + } + } +}); + +var element_line = core_element.extend({ + draw: function() { + var me = this; + var vm = me._view; + var ctx = me._chart.ctx; + var spanGaps = vm.spanGaps; + var points = me._children.slice(); // clone array + var globalDefaults = core_defaults.global; + var globalOptionLineElements = globalDefaults.elements.line; + var lastDrawnIndex = -1; + var index, current, previous, currentVM; + + // If we are looping, adding the first point again + if (me._loop && points.length) { + points.push(points[0]); + } + + ctx.save(); + + // Stroke Line Options + ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; + + // IE 9 and 10 do not support line dash + if (ctx.setLineDash) { + ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); + } + + ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset); + ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; + ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth); + ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; + + // Stroke Line + ctx.beginPath(); + lastDrawnIndex = -1; + + for (index = 0; index < points.length; ++index) { + current = points[index]; + previous = helpers$1.previousItem(points, index); + currentVM = current._view; + + // First point moves to it's starting position no matter what + if (index === 0) { + if (!currentVM.skip) { + ctx.moveTo(currentVM.x, currentVM.y); + lastDrawnIndex = index; + } + } else { + previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; + + if (!currentVM.skip) { + if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { + // There was a gap and this is the first point after the gap + ctx.moveTo(currentVM.x, currentVM.y); + } else { + // Line to next point + helpers$1.canvas.lineTo(ctx, previous._view, current._view); + } + lastDrawnIndex = index; + } + } + } + + ctx.stroke(); + ctx.restore(); + } +}); + +var valueOrDefault$2 = helpers$1.valueOrDefault; + +var defaultColor$1 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + point: { + radius: 3, + pointStyle: 'circle', + backgroundColor: defaultColor$1, + borderColor: defaultColor$1, + borderWidth: 1, + // Hover + hitRadius: 1, + hoverRadius: 4, + hoverBorderWidth: 1 + } + } +}); + +function xRange(mouseX) { + var vm = this._view; + return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false; +} + +function yRange(mouseY) { + var vm = this._view; + return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false; +} + +var element_point = core_element.extend({ + inRange: function(mouseX, mouseY) { + var vm = this._view; + return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; + }, + + inLabelRange: xRange, + inXRange: xRange, + inYRange: yRange, + + getCenterPoint: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + }, + + getArea: function() { + return Math.PI * Math.pow(this._view.radius, 2); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y, + padding: vm.radius + vm.borderWidth + }; + }, + + draw: function(chartArea) { + var vm = this._view; + var ctx = this._chart.ctx; + var pointStyle = vm.pointStyle; + var rotation = vm.rotation; + var radius = vm.radius; + var x = vm.x; + var y = vm.y; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow + + if (vm.skip) { + return; + } + + // Clipping for Points. + if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) { + ctx.strokeStyle = vm.borderColor || defaultColor; + ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth); + ctx.fillStyle = vm.backgroundColor || defaultColor; + helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation); + } + } +}); + +var defaultColor$2 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + rectangle: { + backgroundColor: defaultColor$2, + borderColor: defaultColor$2, + borderSkipped: 'bottom', + borderWidth: 0 + } + } +}); + +function isVertical(vm) { + return vm && vm.width !== undefined; +} + +/** + * Helper function to get the bounds of the bar regardless of the orientation + * @param bar {Chart.Element.Rectangle} the bar + * @return {Bounds} bounds of the bar + * @private + */ +function getBarBounds(vm) { + var x1, x2, y1, y2, half; + + if (isVertical(vm)) { + half = vm.width / 2; + x1 = vm.x - half; + x2 = vm.x + half; + y1 = Math.min(vm.y, vm.base); + y2 = Math.max(vm.y, vm.base); + } else { + half = vm.height / 2; + x1 = Math.min(vm.x, vm.base); + x2 = Math.max(vm.x, vm.base); + y1 = vm.y - half; + y2 = vm.y + half; + } + + return { + left: x1, + top: y1, + right: x2, + bottom: y2 + }; +} + +function swap(orig, v1, v2) { + return orig === v1 ? v2 : orig === v2 ? v1 : orig; +} + +function parseBorderSkipped(vm) { + var edge = vm.borderSkipped; + var res = {}; + + if (!edge) { + return res; + } + + if (vm.horizontal) { + if (vm.base > vm.x) { + edge = swap(edge, 'left', 'right'); + } + } else if (vm.base < vm.y) { + edge = swap(edge, 'bottom', 'top'); + } + + res[edge] = true; + return res; +} + +function parseBorderWidth(vm, maxW, maxH) { + var value = vm.borderWidth; + var skip = parseBorderSkipped(vm); + var t, r, b, l; + + if (helpers$1.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t, + r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r, + b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b, + l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l + }; +} + +function boundingRects(vm) { + var bounds = getBarBounds(vm); + var width = bounds.right - bounds.left; + var height = bounds.bottom - bounds.top; + var border = parseBorderWidth(vm, width / 2, height / 2); + + return { + outer: { + x: bounds.left, + y: bounds.top, + w: width, + h: height + }, + inner: { + x: bounds.left + border.l, + y: bounds.top + border.t, + w: width - border.l - border.r, + h: height - border.t - border.b + } + }; +} + +function inRange(vm, x, y) { + var skipX = x === null; + var skipY = y === null; + var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm); + + return bounds + && (skipX || x >= bounds.left && x <= bounds.right) + && (skipY || y >= bounds.top && y <= bounds.bottom); +} + +var element_rectangle = core_element.extend({ + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var rects = boundingRects(vm); + var outer = rects.outer; + var inner = rects.inner; + + ctx.fillStyle = vm.backgroundColor; + ctx.fillRect(outer.x, outer.y, outer.w, outer.h); + + if (outer.w === inner.w && outer.h === inner.h) { + return; + } + + ctx.save(); + ctx.beginPath(); + ctx.rect(outer.x, outer.y, outer.w, outer.h); + ctx.clip(); + ctx.fillStyle = vm.borderColor; + ctx.rect(inner.x, inner.y, inner.w, inner.h); + ctx.fill('evenodd'); + ctx.restore(); + }, + + height: function() { + var vm = this._view; + return vm.base - vm.y; + }, + + inRange: function(mouseX, mouseY) { + return inRange(this._view, mouseX, mouseY); + }, + + inLabelRange: function(mouseX, mouseY) { + var vm = this._view; + return isVertical(vm) + ? inRange(vm, mouseX, null) + : inRange(vm, null, mouseY); + }, + + inXRange: function(mouseX) { + return inRange(this._view, mouseX, null); + }, + + inYRange: function(mouseY) { + return inRange(this._view, null, mouseY); + }, + + getCenterPoint: function() { + var vm = this._view; + var x, y; + if (isVertical(vm)) { + x = vm.x; + y = (vm.y + vm.base) / 2; + } else { + x = (vm.x + vm.base) / 2; + y = vm.y; + } + + return {x: x, y: y}; + }, + + getArea: function() { + var vm = this._view; + + return isVertical(vm) + ? vm.width * Math.abs(vm.y - vm.base) + : vm.height * Math.abs(vm.x - vm.base); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + } +}); + +var elements = {}; +var Arc = element_arc; +var Line = element_line; +var Point = element_point; +var Rectangle = element_rectangle; +elements.Arc = Arc; +elements.Line = Line; +elements.Point = Point; +elements.Rectangle = Rectangle; + +var resolve$1 = helpers$1.options.resolve; + +core_defaults._set('bar', { + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }], + + yAxes: [{ + type: 'linear' + }] + } +}); + +/** + * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. + * @private + */ +function computeMinSampleSize(scale, pixels) { + var min = scale.isHorizontal() ? scale.width : scale.height; + var ticks = scale.getTicks(); + var prev, curr, i, ilen; + + for (i = 1, ilen = pixels.length; i < ilen; ++i) { + min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1])); + } + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + curr = scale.getPixelForTick(i); + min = i > 0 ? Math.min(min, curr - prev) : min; + prev = curr; + } + + return min; +} + +/** + * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, + * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This + * mode currently always generates bars equally sized (until we introduce scriptable options?). + * @private + */ +function computeFitCategoryTraits(index, ruler, options) { + var thickness = options.barThickness; + var count = ruler.stackCount; + var curr = ruler.pixels[index]; + var size, ratio; + + if (helpers$1.isNullOrUndef(thickness)) { + size = ruler.min * options.categoryPercentage; + ratio = options.barPercentage; + } else { + // When bar thickness is enforced, category and bar percentages are ignored. + // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') + // and deprecate barPercentage since this value is ignored when thickness is absolute. + size = thickness * count; + ratio = 1; + } + + return { + chunk: size / count, + ratio: ratio, + start: curr - (size / 2) + }; +} + +/** + * Computes an "optimal" category that globally arranges bars side by side (no gap when + * percentage options are 1), based on the previous and following categories. This mode + * generates bars with different widths when data are not evenly spaced. + * @private + */ +function computeFlexCategoryTraits(index, ruler, options) { + var pixels = ruler.pixels; + var curr = pixels[index]; + var prev = index > 0 ? pixels[index - 1] : null; + var next = index < pixels.length - 1 ? pixels[index + 1] : null; + var percent = options.categoryPercentage; + var start, size; + + if (prev === null) { + // first data: its size is double based on the next point or, + // if it's also the last data, we use the scale size. + prev = curr - (next === null ? ruler.end - ruler.start : next - curr); + } + + if (next === null) { + // last data: its size is also double based on the previous point. + next = curr + curr - prev; + } + + start = curr - (curr - Math.min(prev, next)) / 2 * percent; + size = Math.abs(next - prev) / 2 * percent; + + return { + chunk: size / ruler.stackCount, + ratio: options.barPercentage, + start: start + }; +} + +var controller_bar = core_datasetController.extend({ + + dataElementType: elements.Rectangle, + + initialize: function() { + var me = this; + var meta; + + core_datasetController.prototype.initialize.apply(me, arguments); + + meta = me.getMeta(); + meta.stack = me.getDataset().stack; + meta.bar = true; + }, + + update: function(reset) { + var me = this; + var rects = me.getMeta().data; + var i, ilen; + + me._ruler = me.getRuler(); + + for (i = 0, ilen = rects.length; i < ilen; ++i) { + me.updateElement(rects[i], i, reset); + } + }, + + updateElement: function(rectangle, index, reset) { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + var options = me._resolveElementOptions(rectangle, index); + + rectangle._xScale = me.getScaleForId(meta.xAxisID); + rectangle._yScale = me.getScaleForId(meta.yAxisID); + rectangle._datasetIndex = me.index; + rectangle._index = index; + rectangle._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderSkipped: options.borderSkipped, + borderWidth: options.borderWidth, + datasetLabel: dataset.label, + label: me.chart.data.labels[index] + }; + + me._updateElementGeometry(rectangle, index, reset); + + rectangle.pivot(); + }, + + /** + * @private + */ + _updateElementGeometry: function(rectangle, index, reset) { + var me = this; + var model = rectangle._model; + var vscale = me._getValueScale(); + var base = vscale.getBasePixel(); + var horizontal = vscale.isHorizontal(); + var ruler = me._ruler || me.getRuler(); + var vpixels = me.calculateBarValuePixels(me.index, index); + var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); + + model.horizontal = horizontal; + model.base = reset ? base : vpixels.base; + model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; + model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; + model.height = horizontal ? ipixels.size : undefined; + model.width = horizontal ? undefined : ipixels.size; + }, + + /** + * Returns the stacks based on groups and bar visibility. + * @param {number} [last] - The dataset index + * @returns {string[]} The list of stack IDs + * @private + */ + _getStacks: function(last) { + var me = this; + var chart = me.chart; + var scale = me._getIndexScale(); + var stacked = scale.options.stacked; + var ilen = last === undefined ? chart.data.datasets.length : last + 1; + var stacks = []; + var i, meta; + + for (i = 0; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + if (meta.bar && chart.isDatasetVisible(i) && + (stacked === false || + (stacked === true && stacks.indexOf(meta.stack) === -1) || + (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { + stacks.push(meta.stack); + } + } + + return stacks; + }, + + /** + * Returns the effective number of stacks based on groups and bar visibility. + * @private + */ + getStackCount: function() { + return this._getStacks().length; + }, + + /** + * Returns the stack index for the given dataset based on groups and bar visibility. + * @param {number} [datasetIndex] - The dataset index + * @param {string} [name] - The stack name to find + * @returns {number} The stack index + * @private + */ + getStackIndex: function(datasetIndex, name) { + var stacks = this._getStacks(datasetIndex); + var index = (name !== undefined) + ? stacks.indexOf(name) + : -1; // indexOf returns -1 if element is not present + + return (index === -1) + ? stacks.length - 1 + : index; + }, + + /** + * @private + */ + getRuler: function() { + var me = this; + var scale = me._getIndexScale(); + var stackCount = me.getStackCount(); + var datasetIndex = me.index; + var isHorizontal = scale.isHorizontal(); + var start = isHorizontal ? scale.left : scale.top; + var end = start + (isHorizontal ? scale.width : scale.height); + var pixels = []; + var i, ilen, min; + + for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { + pixels.push(scale.getPixelForValue(null, i, datasetIndex)); + } + + min = helpers$1.isNullOrUndef(scale.options.barThickness) + ? computeMinSampleSize(scale, pixels) + : -1; + + return { + min: min, + pixels: pixels, + start: start, + end: end, + stackCount: stackCount, + scale: scale + }; + }, + + /** + * Note: pixel values are not clamped to the scale area. + * @private + */ + calculateBarValuePixels: function(datasetIndex, index) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var scale = me._getValueScale(); + var isHorizontal = scale.isHorizontal(); + var datasets = chart.data.datasets; + var value = +scale.getRightValue(datasets[datasetIndex].data[index]); + var minBarLength = scale.options.minBarLength; + var stacked = scale.options.stacked; + var stack = meta.stack; + var start = 0; + var i, imeta, ivalue, base, head, size; + + if (stacked || (stacked === undefined && stack !== undefined)) { + for (i = 0; i < datasetIndex; ++i) { + imeta = chart.getDatasetMeta(i); + + if (imeta.bar && + imeta.stack === stack && + imeta.controller._getValueScaleId() === scale.id && + chart.isDatasetVisible(i)) { + + ivalue = +scale.getRightValue(datasets[i].data[index]); + if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { + start += ivalue; + } + } + } + } + + base = scale.getPixelForValue(start); + head = scale.getPixelForValue(start + value); + size = head - base; + + if (minBarLength !== undefined && Math.abs(size) < minBarLength) { + size = minBarLength; + if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) { + head = base - minBarLength; + } else { + head = base + minBarLength; + } + } + + return { + size: size, + base: base, + head: head, + center: head + size / 2 + }; + }, + + /** + * @private + */ + calculateBarIndexPixels: function(datasetIndex, index, ruler) { + var me = this; + var options = ruler.scale.options; + var range = options.barThickness === 'flex' + ? computeFlexCategoryTraits(index, ruler, options) + : computeFitCategoryTraits(index, ruler, options); + + var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); + var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); + var size = Math.min( + helpers$1.valueOrDefault(options.maxBarThickness, Infinity), + range.chunk * range.ratio); + + return { + base: center - size / 2, + head: center + size / 2, + center: center, + size: size + }; + }, + + draw: function() { + var me = this; + var chart = me.chart; + var scale = me._getValueScale(); + var rects = me.getMeta().data; + var dataset = me.getDataset(); + var ilen = rects.length; + var i = 0; + + helpers$1.canvas.clipArea(chart.ctx, chart.chartArea); + + for (; i < ilen; ++i) { + if (!isNaN(scale.getRightValue(dataset.data[i]))) { + rects[i].draw(); + } + } + + helpers$1.canvas.unclipArea(chart.ctx); + }, + + /** + * @private + */ + _resolveElementOptions: function(rectangle, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = rectangle.custom || {}; + var options = chart.options.elements.rectangle; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderSkipped', + 'borderWidth' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$1([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + } +}); + +var valueOrDefault$3 = helpers$1.valueOrDefault; +var resolve$2 = helpers$1.options.resolve; + +core_defaults._set('bubble', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + type: 'linear', // bubble should probably use a linear scale by default + position: 'bottom', + id: 'x-axis-0' // need an ID so datasets can reference the scale + }], + yAxes: [{ + type: 'linear', + position: 'left', + id: 'y-axis-0' + }] + }, + + tooltips: { + callbacks: { + title: function() { + // Title doesn't make sense for scatter since we format the data as a point + return ''; + }, + label: function(item, data) { + var datasetLabel = data.datasets[item.datasetIndex].label || ''; + var dataPoint = data.datasets[item.datasetIndex].data[item.index]; + return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; + } + } + } +}); + +var controller_bubble = core_datasetController.extend({ + /** + * @protected + */ + dataElementType: elements.Point, + + /** + * @protected + */ + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var points = meta.data; + + // Update Points + helpers$1.each(points, function(point, index) { + me.updateElement(point, index, reset); + }); + }, + + /** + * @protected + */ + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var xScale = me.getScaleForId(meta.xAxisID); + var yScale = me.getScaleForId(meta.yAxisID); + var options = me._resolveElementOptions(point, index); + var data = me.getDataset().data[index]; + var dsIndex = me.index; + + var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); + var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); + + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = dsIndex; + point._index = index; + point._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + hitRadius: options.hitRadius, + pointStyle: options.pointStyle, + rotation: options.rotation, + radius: reset ? 0 : options.radius, + skip: custom.skip || isNaN(x) || isNaN(y), + x: x, + y: y, + }; + + point.pivot(); + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth); + model.radius = options.radius + options.hoverRadius; + }, + + /** + * @private + */ + _resolveElementOptions: function(point, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = point.custom || {}; + var options = chart.options.elements.point; + var data = dataset.data[index]; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + 'hoverRadius', + 'hitRadius', + 'pointStyle', + 'rotation' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$2([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + // Custom radius resolution + values.radius = resolve$2([ + custom.radius, + data ? data.r : undefined, + dataset.radius, + options.radius + ], context, index); + + return values; + } +}); + +var resolve$3 = helpers$1.options.resolve; +var valueOrDefault$4 = helpers$1.valueOrDefault; + +core_defaults._set('doughnut', { + animation: { + // Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + // Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false + }, + hover: { + mode: 'single' + }, + legendCallback: function(chart) { + var text = []; + text.push('

    '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
  • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
  • '); + } + } + + text.push('
'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc && arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + // toggle visibility of index if exists + if (meta.data[index]) { + meta.data[index].hidden = !meta.data[index].hidden; + } + } + + chart.update(); + } + }, + + // The percentage of the chart that we cut out of the middle. + cutoutPercentage: 50, + + // The rotation of the chart, where the first data arc begins. + rotation: Math.PI * -0.5, + + // The total circumference of the chart. + circumference: Math.PI * 2.0, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(tooltipItem, data) { + var dataLabel = data.labels[tooltipItem.index]; + var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; + + if (helpers$1.isArray(dataLabel)) { + // show value on first line of multiline label + // need to clone because we are changing the value + dataLabel = dataLabel.slice(); + dataLabel[0] += value; + } else { + dataLabel += value; + } + + return dataLabel; + } + } + } +}); + +var controller_doughnut = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly + getRingIndex: function(datasetIndex) { + var ringIndex = 0; + + for (var j = 0; j < datasetIndex; ++j) { + if (this.chart.isDatasetVisible(j)) { + ++ringIndex; + } + } + + return ringIndex; + }, + + update: function(reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var availableWidth = chartArea.right - chartArea.left; + var availableHeight = chartArea.bottom - chartArea.top; + var minSize = Math.min(availableWidth, availableHeight); + var offset = {x: 0, y: 0}; + var meta = me.getMeta(); + var arcs = meta.data; + var cutoutPercentage = opts.cutoutPercentage; + var circumference = opts.circumference; + var chartWeight = me._getRingWeight(me.index); + var i, ilen; + + // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc + if (circumference < Math.PI * 2.0) { + var startAngle = opts.rotation % (Math.PI * 2.0); + startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); + var endAngle = startAngle + circumference; + var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; + var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; + var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); + var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); + var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); + var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); + var cutout = cutoutPercentage / 100.0; + var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; + var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; + var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; + minSize = Math.min(availableWidth / size.width, availableHeight / size.height); + offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + } + + chart.borderWidth = me.getMaxBorderWidth(); + chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); + chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1); + chart.offsetX = offset.x * chart.outerRadius; + chart.offsetY = offset.y * chart.outerRadius; + + meta.total = me.calculateTotal(); + + me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index); + me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0); + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + me.updateElement(arcs[i], i, reset); + } + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var animationOpts = opts.animation; + var centerX = (chartArea.left + chartArea.right) / 2; + var centerY = (chartArea.top + chartArea.bottom) / 2; + var startAngle = opts.rotation; // non reset case handled later + var endAngle = opts.rotation; // non reset case handled later + var dataset = me.getDataset(); + var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); + var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; + var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX + chart.offsetX, + y: centerY + chart.offsetY, + startAngle: startAngle, + endAngle: endAngle, + circumference: circumference, + outerRadius: outerRadius, + innerRadius: innerRadius, + label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) + } + }); + + var model = arc._model; + + // Set correct angles if not resetting + if (!reset || !animationOpts.animateRotate) { + if (index === 0) { + model.startAngle = opts.rotation; + } else { + model.startAngle = me.getMeta().data[index - 1]._model.endAngle; + } + + model.endAngle = model.startAngle + model.circumference; + } + + arc.pivot(); + }, + + calculateTotal: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var total = 0; + var value; + + helpers$1.each(meta.data, function(element, index) { + value = dataset.data[index]; + if (!isNaN(value) && !element.hidden) { + total += Math.abs(value); + } + }); + + /* if (total === 0) { + total = NaN; + }*/ + + return total; + }, + + calculateCircumference: function(value) { + var total = this.getMeta().total; + if (total > 0 && !isNaN(value)) { + return (Math.PI * 2.0) * (Math.abs(value) / total); + } + return 0; + }, + + // gets the max border or hover width to properly scale pie charts + getMaxBorderWidth: function(arcs) { + var me = this; + var max = 0; + var chart = me.chart; + var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth; + + if (!arcs) { + // Find the outmost visible dataset + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + arcs = meta.data; + if (i !== me.index) { + controller = meta.controller; + } + break; + } + } + } + + if (!arcs) { + return 0; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arc = arcs[i]; + options = controller ? controller._resolveElementOptions(arc, i) : arc._options; + if (options.borderAlign !== 'inner') { + borderWidth = options.borderWidth; + hoverWidth = options.hoverBorderWidth; + + max = borderWidth > max ? borderWidth : max; + max = hoverWidth > max ? hoverWidth : max; + } + } + return max; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function(arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$3([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly + * @private + */ + _getRingWeightOffset: function(datasetIndex) { + var ringWeightOffset = 0; + + for (var i = 0; i < datasetIndex; ++i) { + if (this.chart.isDatasetVisible(i)) { + ringWeightOffset += this._getRingWeight(i); + } + } + + return ringWeightOffset; + }, + + /** + * @private + */ + _getRingWeight: function(dataSetIndex) { + return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0); + }, + + /** + * Returns the sum of all visibile data set weights. This value can be 0. + * @private + */ + _getVisibleDatasetWeightTotal: function() { + return this._getRingWeightOffset(this.chart.data.datasets.length); + } +}); + +core_defaults._set('horizontalBar', { + hover: { + mode: 'index', + axis: 'y' + }, + + scales: { + xAxes: [{ + type: 'linear', + position: 'bottom' + }], + + yAxes: [{ + type: 'category', + position: 'left', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }] + }, + + elements: { + rectangle: { + borderSkipped: 'left' + } + }, + + tooltips: { + mode: 'index', + axis: 'y' + } +}); + +var controller_horizontalBar = controller_bar.extend({ + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().yAxisID; + } +}); + +var valueOrDefault$5 = helpers$1.valueOrDefault; +var resolve$4 = helpers$1.options.resolve; +var isPointInArea = helpers$1.canvas._isPointInArea; + +core_defaults._set('line', { + showLines: true, + spanGaps: false, + + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + id: 'x-axis-0' + }], + yAxes: [{ + type: 'linear', + id: 'y-axis-0' + }] + } +}); + +function lineEnabled(dataset, options) { + return valueOrDefault$5(dataset.showLine, options.showLines); +} + +var controller_line = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.getScaleForId(meta.yAxisID); + var dataset = me.getDataset(); + var showLine = lineEnabled(dataset, me.chart.options); + var i, ilen; + + // Update Line + if (showLine) { + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + } + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + if (showLine && line._model.tension !== 0) { + me.updateBezierControlPoints(); + } + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var dataset = me.getDataset(); + var datasetIndex = me.index; + var value = dataset.data[index]; + var yScale = me.getScaleForId(meta.yAxisID); + var xScale = me.getScaleForId(meta.xAxisID); + var lineModel = meta.dataset._model; + var x, y; + + var options = me._resolvePointOptions(point, index); + + x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); + y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); + + // Utility + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = datasetIndex; + point._index = index; + + // Desired view properties + point._model = { + x: x, + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0), + steppedLine: lineModel ? lineModel.steppedLine : false, + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function(element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function(element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options; + var elementOptions = options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill', + 'cubicInterpolationMode' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[key], + elementOptions[key] + ]); + } + + // The default behavior of lines is to break at null values, according + // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 + // This option gives lines the ability to span gaps + values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps); + values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension); + values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]); + + return values; + }, + + calculatePointY: function(value, index, datasetIndex) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var yScale = me.getScaleForId(meta.yAxisID); + var sumPos = 0; + var sumNeg = 0; + var i, ds, dsMeta; + + if (yScale.options.stacked) { + for (i = 0; i < datasetIndex; i++) { + ds = chart.data.datasets[i]; + dsMeta = chart.getDatasetMeta(i); + if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { + var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); + if (stackedRightValue < 0) { + sumNeg += stackedRightValue || 0; + } else { + sumPos += stackedRightValue || 0; + } + } + } + + var rightValue = Number(yScale.getRightValue(value)); + if (rightValue < 0) { + return yScale.getPixelForValue(sumNeg + rightValue); + } + return yScale.getPixelForValue(sumPos + rightValue); + } + + return yScale.getPixelForValue(value); + }, + + updateBezierControlPoints: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var lineModel = meta.dataset._model; + var area = chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + // Only consider points that are drawn in case the spanGaps option is used + if (lineModel.spanGaps) { + points = points.filter(function(pt) { + return !pt._model.skip; + }); + } + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + if (lineModel.cubicInterpolationMode === 'monotone') { + helpers$1.splineCurveMonotone(points); + } else { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i)._model, + model, + helpers$1.nextItem(points, i)._model, + lineModel.tension + ); + model.controlPointPreviousX = controlPoints.previous.x; + model.controlPointPreviousY = controlPoints.previous.y; + model.controlPointNextX = controlPoints.next.x; + model.controlPointNextY = controlPoints.next.y; + } + } + + if (chart.options.elements.line.capBezierPoints) { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + if (isPointInArea(model, area)) { + if (i > 0 && isPointInArea(points[i - 1]._model, area)) { + model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); + model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); + } + if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) { + model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); + model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); + } + } + } + } + }, + + draw: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var points = meta.data || []; + var area = chart.chartArea; + var ilen = points.length; + var halfBorderWidth; + var i = 0; + + if (lineEnabled(me.getDataset(), chart.options)) { + halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2; + + helpers$1.canvas.clipArea(chart.ctx, { + left: area.left, + right: area.right, + top: area.top - halfBorderWidth, + bottom: area.bottom + halfBorderWidth + }); + + meta.dataset.draw(); + + helpers$1.canvas.unclipArea(chart.ctx); + } + + // Draw the points + for (; i < ilen; ++i) { + points[i].draw(area); + } + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$5(options.hoverRadius, options.radius); + }, +}); + +var resolve$5 = helpers$1.options.resolve; + +core_defaults._set('polarArea', { + scale: { + type: 'radialLinear', + angleLines: { + display: false + }, + gridLines: { + circular: true + }, + pointLabels: { + display: false + }, + ticks: { + beginAtZero: true + } + }, + + // Boolean - Whether to animate the rotation of the chart + animation: { + animateRotate: true, + animateScale: true + }, + + startAngle: -0.5 * Math.PI, + legendCallback: function(chart) { + var text = []; + text.push('
    '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
  • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
  • '); + } + } + + text.push('
'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + meta.data[index].hidden = !meta.data[index].hidden; + } + + chart.update(); + } + }, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(item, data) { + return data.labels[item.index] + ': ' + item.yLabel; + } + } + } +}); + +var controller_polarArea = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + update: function(reset) { + var me = this; + var dataset = me.getDataset(); + var meta = me.getMeta(); + var start = me.chart.options.startAngle || 0; + var starts = me._starts = []; + var angles = me._angles = []; + var arcs = meta.data; + var i, ilen, angle; + + me._updateRadius(); + + meta.count = me.countVisibleElements(); + + for (i = 0, ilen = dataset.data.length; i < ilen; i++) { + starts[i] = start; + angle = me._computeAngle(i); + angles[i] = angle; + start += angle; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + me.updateElement(arcs[i], i, reset); + } + }, + + /** + * @private + */ + _updateRadius: function() { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); + + chart.outerRadius = Math.max(minSize / 2, 0); + chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + + me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); + me.innerRadius = me.outerRadius - chart.radiusLength; + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var opts = chart.options; + var animationOpts = opts.animation; + var scale = chart.scale; + var labels = chart.data.labels; + + var centerX = scale.xCenter; + var centerY = scale.yCenter; + + // var negHalfPI = -0.5 * Math.PI; + var datasetStartAngle = opts.startAngle; + var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var startAngle = me._starts[index]; + var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]); + + var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX, + y: centerY, + innerRadius: 0, + outerRadius: reset ? resetRadius : distance, + startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, + endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, + label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index]) + } + }); + + arc.pivot(); + }, + + countVisibleElements: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var count = 0; + + helpers$1.each(meta.data, function(element, index) { + if (!isNaN(dataset.data[index]) && !element.hidden) { + count++; + } + }); + + return count; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + var valueOrDefault = helpers$1.valueOrDefault; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function(arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$5([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _computeAngle: function(index) { + var me = this; + var count = this.getMeta().count; + var dataset = me.getDataset(); + var meta = me.getMeta(); + + if (isNaN(dataset.data[index]) || meta.data[index].hidden) { + return 0; + } + + // Scriptable options + var context = { + chart: me.chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + return resolve$5([ + me.chart.options.elements.arc.angle, + (2 * Math.PI) / count + ], context, index); + } +}); + +core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut)); +core_defaults._set('pie', { + cutoutPercentage: 0 +}); + +// Pie charts are Doughnut chart with different defaults +var controller_pie = controller_doughnut; + +var valueOrDefault$6 = helpers$1.valueOrDefault; +var resolve$6 = helpers$1.options.resolve; + +core_defaults._set('radar', { + scale: { + type: 'radialLinear' + }, + elements: { + line: { + tension: 0 // no bezier in radar + } + } +}); + +var controller_radar = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + linkScales: helpers$1.noop, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.chart.scale; + var dataset = me.getDataset(); + var i, ilen; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + line._loop = true; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + // Update bezier control points + me.updateBezierControlPoints(); + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var custom = point.custom || {}; + var dataset = me.getDataset(); + var scale = me.chart.scale; + var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); + var options = me._resolvePointOptions(point, index); + var lineModel = me.getMeta().dataset._model; + var x = reset ? scale.xCenter : pointPosition.x; + var y = reset ? scale.yCenter : pointPosition.y; + + // Utility + point._scale = scale; + point._options = options; + point._datasetIndex = me.index; + point._index = index; + + // Desired view properties + point._model = { + x: x, // value not used in dataset scale, but we want a consistent API between scales + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0), + + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function(element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function(element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[key], + options[key] + ]); + } + + values.tension = valueOrDefault$6(dataset.lineTension, options.tension); + + return values; + }, + + updateBezierControlPoints: function() { + var me = this; + var meta = me.getMeta(); + var area = me.chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i, true)._model, + model, + helpers$1.nextItem(points, i, true)._model, + model.tension + ); + + // Prevent the bezier going outside of the bounds of the graph + model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right); + model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom); + model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right); + model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom); + } + }, + + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$6(options.hoverRadius, options.radius); + } +}); + +core_defaults._set('scatter', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + id: 'x-axis-1', // need an ID so datasets can reference the scale + type: 'linear', // scatter should not use a category axis + position: 'bottom' + }], + yAxes: [{ + id: 'y-axis-1', + type: 'linear', + position: 'left' + }] + }, + + showLines: false, + + tooltips: { + callbacks: { + title: function() { + return ''; // doesn't make sense for scatter since data are formatted as a point + }, + label: function(item) { + return '(' + item.xLabel + ', ' + item.yLabel + ')'; + } + } + } +}); + +// Scatter charts use line controllers +var controller_scatter = controller_line; + +// NOTE export a map in which the key represents the controller type, not +// the class, and so must be CamelCase in order to be correctly retrieved +// by the controller in core.controller.js (`controllers[meta.type]`). + +var controllers = { + bar: controller_bar, + bubble: controller_bubble, + doughnut: controller_doughnut, + horizontalBar: controller_horizontalBar, + line: controller_line, + polarArea: controller_polarArea, + pie: controller_pie, + radar: controller_radar, + scatter: controller_scatter +}; + +/** + * Helper function to get relative position for an event + * @param {Event|IEvent} event - The event to get the position for + * @param {Chart} chart - The chart + * @returns {object} the event position + */ +function getRelativePosition(e, chart) { + if (e.native) { + return { + x: e.x, + y: e.y + }; + } + + return helpers$1.getRelativePosition(e, chart); +} + +/** + * Helper function to traverse all of the visible elements in the chart + * @param {Chart} chart - the chart + * @param {function} handler - the callback to execute for each visible item + */ +function parseVisibleItems(chart, handler) { + var datasets = chart.data.datasets; + var meta, i, j, ilen, jlen; + + for (i = 0, ilen = datasets.length; i < ilen; ++i) { + if (!chart.isDatasetVisible(i)) { + continue; + } + + meta = chart.getDatasetMeta(i); + for (j = 0, jlen = meta.data.length; j < jlen; ++j) { + var element = meta.data[j]; + if (!element._view.skip) { + handler(element); + } + } + } +} + +/** + * Helper function to get the items that intersect the event position + * @param {ChartElement[]} items - elements to filter + * @param {object} position - the point to be nearest to + * @return {ChartElement[]} the nearest items + */ +function getIntersectItems(chart, position) { + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + } + }); + + return elements; +} + +/** + * Helper function to get the items nearest to the event position considering all visible items in teh chart + * @param {Chart} chart - the chart to look at elements from + * @param {object} position - the point to be nearest to + * @param {boolean} intersect - if true, only consider items that intersect the position + * @param {function} distanceMetric - function to provide the distance between points + * @return {ChartElement[]} the nearest items + */ +function getNearestItems(chart, position, intersect, distanceMetric) { + var minDistance = Number.POSITIVE_INFINITY; + var nearestItems = []; + + parseVisibleItems(chart, function(element) { + if (intersect && !element.inRange(position.x, position.y)) { + return; + } + + var center = element.getCenterPoint(); + var distance = distanceMetric(position, center); + if (distance < minDistance) { + nearestItems = [element]; + minDistance = distance; + } else if (distance === minDistance) { + // Can have multiple items at the same distance in which case we sort by size + nearestItems.push(element); + } + }); + + return nearestItems; +} + +/** + * Get a distance metric function for two points based on the + * axis mode setting + * @param {string} axis - the axis mode. x|y|xy + */ +function getDistanceMetricForAxis(axis) { + var useX = axis.indexOf('x') !== -1; + var useY = axis.indexOf('y') !== -1; + + return function(pt1, pt2) { + var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; + var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; + return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); + }; +} + +function indexMode(chart, e, options) { + var position = getRelativePosition(e, chart); + // Default axis for index mode is 'x' to match old behaviour + options.axis = options.axis || 'x'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + var elements = []; + + if (!items.length) { + return []; + } + + chart.data.datasets.forEach(function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + var element = meta.data[items[0]._index]; + + // don't count items that are skipped (null data) + if (element && !element._view.skip) { + elements.push(element); + } + } + }); + + return elements; +} + +/** + * @interface IInteractionOptions + */ +/** + * If true, only consider items that intersect the point + * @name IInterfaceOptions#boolean + * @type Boolean + */ + +/** + * Contains interaction related functions + * @namespace Chart.Interaction + */ +var core_interaction = { + // Helper function for different modes + modes: { + single: function(chart, e) { + var position = getRelativePosition(e, chart); + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + return elements; + } + }); + + return elements.slice(0, 1); + }, + + /** + * @function Chart.Interaction.modes.label + * @deprecated since version 2.4.0 + * @todo remove at version 3 + * @private + */ + label: indexMode, + + /** + * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item + * @function Chart.Interaction.modes.index + * @since v2.4.0 + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + index: indexMode, + + /** + * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect is false, we find the nearest item and return the items in that dataset + * @function Chart.Interaction.modes.dataset + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + dataset: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + + if (items.length > 0) { + items = chart.getDatasetMeta(items[0]._datasetIndex).data; + } + + return items; + }, + + /** + * @function Chart.Interaction.modes.x-axis + * @deprecated since version 2.4.0. Use index mode and intersect == true + * @todo remove at version 3 + * @private + */ + 'x-axis': function(chart, e) { + return indexMode(chart, e, {intersect: false}); + }, + + /** + * Point mode returns all elements that hit test based on the event position + * of the event + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + point: function(chart, e) { + var position = getRelativePosition(e, chart); + return getIntersectItems(chart, position); + }, + + /** + * nearest mode returns the element closest to the point + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + nearest: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + return getNearestItems(chart, position, options.intersect, distanceMetric); + }, + + /** + * x mode returns the elements that hit-test at the current x coordinate + * @function Chart.Interaction.modes.x + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + x: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inXRange(position.x)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + }, + + /** + * y mode returns the elements that hit-test at the current y coordinate + * @function Chart.Interaction.modes.y + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + y: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inYRange(position.y)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + } + } +}; + +function filterByPosition(array, position) { + return helpers$1.where(array, function(v) { + return v.position === position; + }); +} + +function sortByWeight(array, reverse) { + array.forEach(function(v, i) { + v._tmpIndex_ = i; + return v; + }); + array.sort(function(a, b) { + var v0 = reverse ? b : a; + var v1 = reverse ? a : b; + return v0.weight === v1.weight ? + v0._tmpIndex_ - v1._tmpIndex_ : + v0.weight - v1.weight; + }); + array.forEach(function(v) { + delete v._tmpIndex_; + }); +} + +function findMaxPadding(boxes) { + var top = 0; + var left = 0; + var bottom = 0; + var right = 0; + helpers$1.each(boxes, function(box) { + if (box.getPadding) { + var boxPadding = box.getPadding(); + top = Math.max(top, boxPadding.top); + left = Math.max(left, boxPadding.left); + bottom = Math.max(bottom, boxPadding.bottom); + right = Math.max(right, boxPadding.right); + } + }); + return { + top: top, + left: left, + bottom: bottom, + right: right + }; +} + +function addSizeByPosition(boxes, size) { + helpers$1.each(boxes, function(box) { + size[box.position] += box.isHorizontal() ? box.height : box.width; + }); +} + +core_defaults._set('global', { + layout: { + padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + } +}); + +/** + * @interface ILayoutItem + * @prop {string} position - The position of the item in the chart layout. Possible values are + * 'left', 'top', 'right', 'bottom', and 'chartArea' + * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area + * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down + * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) + * @prop {function} update - Takes two parameters: width and height. Returns size of item + * @prop {function} getPadding - Returns an object with padding on the edges + * @prop {number} width - Width of item. Must be valid after update() + * @prop {number} height - Height of item. Must be valid after update() + * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update + * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update + * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update + * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update + */ + +// The layout service is very self explanatory. It's responsible for the layout within a chart. +// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need +// It is this service's responsibility of carrying out that layout. +var core_layouts = { + defaults: {}, + + /** + * Register a box to a chart. + * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. + * @param {Chart} chart - the chart to use + * @param {ILayoutItem} item - the item to add to be layed out + */ + addBox: function(chart, item) { + if (!chart.boxes) { + chart.boxes = []; + } + + // initialize item with default values + item.fullWidth = item.fullWidth || false; + item.position = item.position || 'top'; + item.weight = item.weight || 0; + + chart.boxes.push(item); + }, + + /** + * Remove a layoutItem from a chart + * @param {Chart} chart - the chart to remove the box from + * @param {ILayoutItem} layoutItem - the item to remove from the layout + */ + removeBox: function(chart, layoutItem) { + var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; + if (index !== -1) { + chart.boxes.splice(index, 1); + } + }, + + /** + * Sets (or updates) options on the given `item`. + * @param {Chart} chart - the chart in which the item lives (or will be added to) + * @param {ILayoutItem} item - the item to configure with the given options + * @param {object} options - the new item options. + */ + configure: function(chart, item, options) { + var props = ['fullWidth', 'position', 'weight']; + var ilen = props.length; + var i = 0; + var prop; + + for (; i < ilen; ++i) { + prop = props[i]; + if (options.hasOwnProperty(prop)) { + item[prop] = options[prop]; + } + } + }, + + /** + * Fits boxes of the given chart into the given size by having each box measure itself + * then running a fitting algorithm + * @param {Chart} chart - the chart + * @param {number} width - the width to fit into + * @param {number} height - the height to fit into + */ + update: function(chart, width, height) { + if (!chart) { + return; + } + + var layoutOptions = chart.options.layout || {}; + var padding = helpers$1.options.toPadding(layoutOptions.padding); + var leftPadding = padding.left; + var rightPadding = padding.right; + var topPadding = padding.top; + var bottomPadding = padding.bottom; + + var leftBoxes = filterByPosition(chart.boxes, 'left'); + var rightBoxes = filterByPosition(chart.boxes, 'right'); + var topBoxes = filterByPosition(chart.boxes, 'top'); + var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); + var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); + + // Sort boxes by weight. A higher weight is further away from the chart area + sortByWeight(leftBoxes, true); + sortByWeight(rightBoxes, false); + sortByWeight(topBoxes, true); + sortByWeight(bottomBoxes, false); + + var verticalBoxes = leftBoxes.concat(rightBoxes); + var horizontalBoxes = topBoxes.concat(bottomBoxes); + var outerBoxes = verticalBoxes.concat(horizontalBoxes); + + // Essentially we now have any number of boxes on each of the 4 sides. + // Our canvas looks like the following. + // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and + // B1 is the bottom axis + // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays + // These locations are single-box locations only, when trying to register a chartArea location that is already taken, + // an error will be thrown. + // + // |----------------------------------------------------| + // | T1 (Full Width) | + // |----------------------------------------------------| + // | | | T2 | | + // | |----|-------------------------------------|----| + // | | | C1 | | C2 | | + // | | |----| |----| | + // | | | | | + // | L1 | L2 | ChartArea (C0) | R1 | + // | | | | | + // | | |----| |----| | + // | | | C3 | | C4 | | + // | |----|-------------------------------------|----| + // | | | B1 | | + // |----------------------------------------------------| + // | B2 (Full Width) | + // |----------------------------------------------------| + // + // What we do to find the best sizing, we do the following + // 1. Determine the minimum size of the chart area. + // 2. Split the remaining width equally between each vertical axis + // 3. Split the remaining height equally between each horizontal axis + // 4. Give each layout the maximum size it can be. The layout will return it's minimum size + // 5. Adjust the sizes of each axis based on it's minimum reported size. + // 6. Refit each axis + // 7. Position each axis in the final location + // 8. Tell the chart the final location of the chart area + // 9. Tell any axes that overlay the chart area the positions of the chart area + + // Step 1 + var chartWidth = width - leftPadding - rightPadding; + var chartHeight = height - topPadding - bottomPadding; + var chartAreaWidth = chartWidth / 2; // min 50% + + // Step 2 + var verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length; + + // Step 3 + // TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837) + // var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length; + + // Step 4 + var maxChartAreaWidth = chartWidth; + var maxChartAreaHeight = chartHeight; + var outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; + var minBoxSizes = []; + var maxPadding; + + function getMinimumBoxSize(box) { + var minSize; + var isHorizontal = box.isHorizontal(); + + if (isHorizontal) { + minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2); + maxChartAreaHeight -= minSize.height; + } else { + minSize = box.update(verticalBoxWidth, maxChartAreaHeight); + maxChartAreaWidth -= minSize.width; + } + + minBoxSizes.push({ + horizontal: isHorizontal, + width: minSize.width, + box: box, + }); + } + + helpers$1.each(outerBoxes, getMinimumBoxSize); + + // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) + maxPadding = findMaxPadding(outerBoxes); + + // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could + // be if the axes are drawn at their minimum sizes. + // Steps 5 & 6 + + // Function to fit a box + function fitBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minBox) { + return minBox.box === box; + }); + + if (minBoxSize) { + if (minBoxSize.horizontal) { + var scaleMargin = { + left: Math.max(outerBoxSizes.left, maxPadding.left), + right: Math.max(outerBoxSizes.right, maxPadding.right), + top: 0, + bottom: 0 + }; + + // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends + // on the margin. Sometimes they need to increase in size slightly + box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); + } else { + box.update(minBoxSize.width, maxChartAreaHeight); + } + } + } + + // Update, and calculate the left and right margins for the horizontal boxes + helpers$1.each(verticalBoxes, fitBox); + addSizeByPosition(verticalBoxes, outerBoxSizes); + + // Set the Left and Right margins for the horizontal boxes + helpers$1.each(horizontalBoxes, fitBox); + addSizeByPosition(horizontalBoxes, outerBoxSizes); + + function finalFitVerticalBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minSize) { + return minSize.box === box; + }); + + var scaleMargin = { + left: 0, + right: 0, + top: outerBoxSizes.top, + bottom: outerBoxSizes.bottom + }; + + if (minBoxSize) { + box.update(minBoxSize.width, maxChartAreaHeight, scaleMargin); + } + } + + // Let the left layout know the final margin + helpers$1.each(verticalBoxes, finalFitVerticalBox); + + // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) + outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; + addSizeByPosition(outerBoxes, outerBoxSizes); + + // We may be adding some padding to account for rotated x axis labels + var leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0); + outerBoxSizes.left += leftPaddingAddition; + outerBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0); + + var topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0); + outerBoxSizes.top += topPaddingAddition; + outerBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 0); + + // Figure out if our chart area changed. This would occur if the dataset layout label rotation + // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do + // without calling `fit` again + var newMaxChartAreaHeight = height - outerBoxSizes.top - outerBoxSizes.bottom; + var newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right; + + if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { + helpers$1.each(verticalBoxes, function(box) { + box.height = newMaxChartAreaHeight; + }); + + helpers$1.each(horizontalBoxes, function(box) { + if (!box.fullWidth) { + box.width = newMaxChartAreaWidth; + } + }); + + maxChartAreaHeight = newMaxChartAreaHeight; + maxChartAreaWidth = newMaxChartAreaWidth; + } + + // Step 7 - Position the boxes + var left = leftPadding + leftPaddingAddition; + var top = topPadding + topPaddingAddition; + + function placeBox(box) { + if (box.isHorizontal()) { + box.left = box.fullWidth ? leftPadding : outerBoxSizes.left; + box.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + maxChartAreaWidth; + box.top = top; + box.bottom = top + box.height; + + // Move to next point + top = box.bottom; + + } else { + + box.left = left; + box.right = left + box.width; + box.top = outerBoxSizes.top; + box.bottom = outerBoxSizes.top + maxChartAreaHeight; + + // Move to next point + left = box.right; + } + } + + helpers$1.each(leftBoxes.concat(topBoxes), placeBox); + + // Account for chart width and height + left += maxChartAreaWidth; + top += maxChartAreaHeight; + + helpers$1.each(rightBoxes, placeBox); + helpers$1.each(bottomBoxes, placeBox); + + // Step 8 + chart.chartArea = { + left: outerBoxSizes.left, + top: outerBoxSizes.top, + right: outerBoxSizes.left + maxChartAreaWidth, + bottom: outerBoxSizes.top + maxChartAreaHeight + }; + + // Step 9 + helpers$1.each(chartAreaBoxes, function(box) { + box.left = chart.chartArea.left; + box.top = chart.chartArea.top; + box.right = chart.chartArea.right; + box.bottom = chart.chartArea.bottom; + + box.update(maxChartAreaWidth, maxChartAreaHeight); + }); + } +}; + +/** + * Platform fallback implementation (minimal). + * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 + */ + +var platform_basic = { + acquireContext: function(item) { + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + return item && item.getContext('2d') || null; + } +}; + +var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n"; + +var platform_dom$1 = /*#__PURE__*/Object.freeze({ +default: platform_dom +}); + +function getCjsExportFromNamespace (n) { + return n && n.default || n; +} + +var stylesheet = getCjsExportFromNamespace(platform_dom$1); + +var EXPANDO_KEY = '$chartjs'; +var CSS_PREFIX = 'chartjs-'; +var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor'; +var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; +var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; +var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; + +/** + * DOM event types -> Chart.js event types. + * Note: only events with different types are mapped. + * @see https://developer.mozilla.org/en-US/docs/Web/Events + */ +var EVENT_TYPES = { + touchstart: 'mousedown', + touchmove: 'mousemove', + touchend: 'mouseup', + pointerenter: 'mouseenter', + pointerdown: 'mousedown', + pointermove: 'mousemove', + pointerup: 'mouseup', + pointerleave: 'mouseout', + pointerout: 'mouseout' +}; + +/** + * The "used" size is the final value of a dimension property after all calculations have + * been performed. This method uses the computed style of `element` but returns undefined + * if the computed style is not expressed in pixels. That can happen in some cases where + * `element` has a size relative to its parent and this last one is not yet displayed, + * for example because of `display: none` on a parent node. + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value + * @returns {number} Size in pixels or undefined if unknown. + */ +function readUsedSize(element, property) { + var value = helpers$1.getStyle(element, property); + var matches = value && value.match(/^(\d+)(\.\d+)?px$/); + return matches ? Number(matches[1]) : undefined; +} + +/** + * Initializes the canvas style and render size without modifying the canvas display size, + * since responsiveness is handled by the controller.resize() method. The config is used + * to determine the aspect ratio to apply in case no explicit height has been specified. + */ +function initCanvas(canvas, config) { + var style = canvas.style; + + // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it + // returns null or '' if no explicit value has been set to the canvas attribute. + var renderHeight = canvas.getAttribute('height'); + var renderWidth = canvas.getAttribute('width'); + + // Chart.js modifies some canvas values that we want to restore on destroy + canvas[EXPANDO_KEY] = { + initial: { + height: renderHeight, + width: renderWidth, + style: { + display: style.display, + height: style.height, + width: style.width + } + } + }; + + // Force canvas to display as block to avoid extra space caused by inline + // elements, which would interfere with the responsive resize process. + // https://github.com/chartjs/Chart.js/issues/2538 + style.display = style.display || 'block'; + + if (renderWidth === null || renderWidth === '') { + var displayWidth = readUsedSize(canvas, 'width'); + if (displayWidth !== undefined) { + canvas.width = displayWidth; + } + } + + if (renderHeight === null || renderHeight === '') { + if (canvas.style.height === '') { + // If no explicit render height and style height, let's apply the aspect ratio, + // which one can be specified by the user but also by charts as default option + // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. + canvas.height = canvas.width / (config.options.aspectRatio || 2); + } else { + var displayHeight = readUsedSize(canvas, 'height'); + if (displayWidth !== undefined) { + canvas.height = displayHeight; + } + } + } + + return canvas; +} + +/** + * Detects support for options object argument in addEventListener. + * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + * @private + */ +var supportsEventListenerOptions = (function() { + var supports = false; + try { + var options = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line getter-return + get: function() { + supports = true; + } + }); + window.addEventListener('e', null, options); + } catch (e) { + // continue regardless of error + } + return supports; +}()); + +// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. +// https://github.com/chartjs/Chart.js/issues/4287 +var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; + +function addListener(node, type, listener) { + node.addEventListener(type, listener, eventListenerOptions); +} + +function removeListener(node, type, listener) { + node.removeEventListener(type, listener, eventListenerOptions); +} + +function createEvent(type, chart, x, y, nativeEvent) { + return { + type: type, + chart: chart, + native: nativeEvent || null, + x: x !== undefined ? x : null, + y: y !== undefined ? y : null, + }; +} + +function fromNativeEvent(event, chart) { + var type = EVENT_TYPES[event.type] || event.type; + var pos = helpers$1.getRelativePosition(event, chart); + return createEvent(type, chart, pos.x, pos.y, event); +} + +function throttled(fn, thisArg) { + var ticking = false; + var args = []; + + return function() { + args = Array.prototype.slice.call(arguments); + thisArg = thisArg || this; + + if (!ticking) { + ticking = true; + helpers$1.requestAnimFrame.call(window, function() { + ticking = false; + fn.apply(thisArg, args); + }); + } + }; +} + +function createDiv(cls) { + var el = document.createElement('div'); + el.className = cls || ''; + return el; +} + +// Implementation based on https://github.com/marcj/css-element-queries +function createResizer(handler) { + var maxSize = 1000000; + + // NOTE(SB) Don't use innerHTML because it could be considered unsafe. + // https://github.com/chartjs/Chart.js/issues/5902 + var resizer = createDiv(CSS_SIZE_MONITOR); + var expand = createDiv(CSS_SIZE_MONITOR + '-expand'); + var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink'); + + expand.appendChild(createDiv()); + shrink.appendChild(createDiv()); + + resizer.appendChild(expand); + resizer.appendChild(shrink); + resizer._reset = function() { + expand.scrollLeft = maxSize; + expand.scrollTop = maxSize; + shrink.scrollLeft = maxSize; + shrink.scrollTop = maxSize; + }; + + var onScroll = function() { + resizer._reset(); + handler(); + }; + + addListener(expand, 'scroll', onScroll.bind(expand, 'expand')); + addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); + + return resizer; +} + +// https://davidwalsh.name/detect-node-insertion +function watchForRender(node, handler) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + var proxy = expando.renderProxy = function(e) { + if (e.animationName === CSS_RENDER_ANIMATION) { + handler(); + } + }; + + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + addListener(node, type, proxy); + }); + + // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class + // is removed then added back immediately (same animation frame?). Accessing the + // `offsetParent` property will force a reflow and re-evaluate the CSS animation. + // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics + // https://github.com/chartjs/Chart.js/issues/4737 + expando.reflow = !!node.offsetParent; + + node.classList.add(CSS_RENDER_MONITOR); +} + +function unwatchForRender(node) { + var expando = node[EXPANDO_KEY] || {}; + var proxy = expando.renderProxy; + + if (proxy) { + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + removeListener(node, type, proxy); + }); + + delete expando.renderProxy; + } + + node.classList.remove(CSS_RENDER_MONITOR); +} + +function addResizeListener(node, listener, chart) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + + // Let's keep track of this added resizer and thus avoid DOM query when removing it. + var resizer = expando.resizer = createResizer(throttled(function() { + if (expando.resizer) { + var container = chart.options.maintainAspectRatio && node.parentNode; + var w = container ? container.clientWidth : 0; + listener(createEvent('resize', chart)); + if (container && container.clientWidth < w && chart.canvas) { + // If the container size shrank during chart resize, let's assume + // scrollbar appeared. So we resize again with the scrollbar visible - + // effectively making chart smaller and the scrollbar hidden again. + // Because we are inside `throttled`, and currently `ticking`, scroll + // events are ignored during this whole 2 resize process. + // If we assumed wrong and something else happened, we are resizing + // twice in a frame (potential performance issue) + listener(createEvent('resize', chart)); + } + } + })); + + // The resizer needs to be attached to the node parent, so we first need to be + // sure that `node` is attached to the DOM before injecting the resizer element. + watchForRender(node, function() { + if (expando.resizer) { + var container = node.parentNode; + if (container && container !== resizer.parentNode) { + container.insertBefore(resizer, container.firstChild); + } + + // The container size might have changed, let's reset the resizer state. + resizer._reset(); + } + }); +} + +function removeResizeListener(node) { + var expando = node[EXPANDO_KEY] || {}; + var resizer = expando.resizer; + + delete expando.resizer; + unwatchForRender(node); + + if (resizer && resizer.parentNode) { + resizer.parentNode.removeChild(resizer); + } +} + +function injectCSS(platform, css) { + // https://stackoverflow.com/q/3922139 + var style = platform._style || document.createElement('style'); + if (!platform._style) { + platform._style = style; + css = '/* Chart.js */\n' + css; + style.setAttribute('type', 'text/css'); + document.getElementsByTagName('head')[0].appendChild(style); + } + + style.appendChild(document.createTextNode(css)); +} + +var platform_dom$2 = { + /** + * When `true`, prevents the automatic injection of the stylesheet required to + * correctly detect when the chart is added to the DOM and then resized. This + * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`) + * to be manually imported to make this library compatible with any CSP. + * See https://github.com/chartjs/Chart.js/issues/5208 + */ + disableCSSInjection: false, + + /** + * This property holds whether this platform is enabled for the current environment. + * Currently used by platform.js to select the proper implementation. + * @private + */ + _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', + + /** + * @private + */ + _ensureLoaded: function() { + if (this._loaded) { + return; + } + + this._loaded = true; + + // https://github.com/chartjs/Chart.js/issues/5208 + if (!this.disableCSSInjection) { + injectCSS(this, stylesheet); + } + }, + + acquireContext: function(item, config) { + if (typeof item === 'string') { + item = document.getElementById(item); + } else if (item.length) { + // Support for array based queries (such as jQuery) + item = item[0]; + } + + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + // To prevent canvas fingerprinting, some add-ons undefine the getContext + // method, for example: https://github.com/kkapsner/CanvasBlocker + // https://github.com/chartjs/Chart.js/issues/2807 + var context = item && item.getContext && item.getContext('2d'); + + // Load platform resources on first chart creation, to make possible to change + // platform options after importing the library (e.g. `disableCSSInjection`). + this._ensureLoaded(); + + // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is + // inside an iframe or when running in a protected environment. We could guess the + // types from their toString() value but let's keep things flexible and assume it's + // a sufficient condition if the item has a context2D which has item as `canvas`. + // https://github.com/chartjs/Chart.js/issues/3887 + // https://github.com/chartjs/Chart.js/issues/4102 + // https://github.com/chartjs/Chart.js/issues/4152 + if (context && context.canvas === item) { + initCanvas(item, config); + return context; + } + + return null; + }, + + releaseContext: function(context) { + var canvas = context.canvas; + if (!canvas[EXPANDO_KEY]) { + return; + } + + var initial = canvas[EXPANDO_KEY].initial; + ['height', 'width'].forEach(function(prop) { + var value = initial[prop]; + if (helpers$1.isNullOrUndef(value)) { + canvas.removeAttribute(prop); + } else { + canvas.setAttribute(prop, value); + } + }); + + helpers$1.each(initial.style || {}, function(value, key) { + canvas.style[key] = value; + }); + + // The canvas render size might have been changed (and thus the state stack discarded), + // we can't use save() and restore() to restore the initial state. So make sure that at + // least the canvas context is reset to the default state by setting the canvas width. + // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html + // eslint-disable-next-line no-self-assign + canvas.width = canvas.width; + + delete canvas[EXPANDO_KEY]; + }, + + addEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + addResizeListener(canvas, listener, chart); + return; + } + + var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); + var proxies = expando.proxies || (expando.proxies = {}); + var proxy = proxies[chart.id + '_' + type] = function(event) { + listener(fromNativeEvent(event, chart)); + }; + + addListener(canvas, type, proxy); + }, + + removeEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + removeResizeListener(canvas); + return; + } + + var expando = listener[EXPANDO_KEY] || {}; + var proxies = expando.proxies || {}; + var proxy = proxies[chart.id + '_' + type]; + if (!proxy) { + return; + } + + removeListener(canvas, type, proxy); + } +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use EventTarget.addEventListener instead. + * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener + * @function Chart.helpers.addEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers$1.addEvent = addListener; + +/** + * Provided for backward compatibility, use EventTarget.removeEventListener instead. + * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener + * @function Chart.helpers.removeEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers$1.removeEvent = removeListener; + +// @TODO Make possible to select another platform at build time. +var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic; + +/** + * @namespace Chart.platform + * @see https://chartjs.gitbooks.io/proposals/content/Platform.html + * @since 2.4.0 + */ +var platform = helpers$1.extend({ + /** + * @since 2.7.0 + */ + initialize: function() {}, + + /** + * Called at chart construction time, returns a context2d instance implementing + * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. + * @param {*} item - The native item from which to acquire context (platform specific) + * @param {object} options - The chart options + * @returns {CanvasRenderingContext2D} context2d instance + */ + acquireContext: function() {}, + + /** + * Called at chart destruction time, releases any resources associated to the context + * previously returned by the acquireContext() method. + * @param {CanvasRenderingContext2D} context - The context2d instance + * @returns {boolean} true if the method succeeded, else false + */ + releaseContext: function() {}, + + /** + * Registers the specified listener on the given chart. + * @param {Chart} chart - Chart from which to listen for event + * @param {string} type - The ({@link IEvent}) type to listen for + * @param {function} listener - Receives a notification (an object that implements + * the {@link IEvent} interface) when an event of the specified type occurs. + */ + addEventListener: function() {}, + + /** + * Removes the specified listener previously registered with addEventListener. + * @param {Chart} chart - Chart from which to remove the listener + * @param {string} type - The ({@link IEvent}) type to remove + * @param {function} listener - The listener function to remove from the event target. + */ + removeEventListener: function() {} + +}, implementation); + +core_defaults._set('global', { + plugins: {} +}); + +/** + * The plugin service singleton + * @namespace Chart.plugins + * @since 2.1.0 + */ +var core_plugins = { + /** + * Globally registered plugins. + * @private + */ + _plugins: [], + + /** + * This identifier is used to invalidate the descriptors cache attached to each chart + * when a global plugin is registered or unregistered. In this case, the cache ID is + * incremented and descriptors are regenerated during following API calls. + * @private + */ + _cacheId: 0, + + /** + * Registers the given plugin(s) if not already registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + register: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + if (p.indexOf(plugin) === -1) { + p.push(plugin); + } + }); + + this._cacheId++; + }, + + /** + * Unregisters the given plugin(s) only if registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + unregister: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + var idx = p.indexOf(plugin); + if (idx !== -1) { + p.splice(idx, 1); + } + }); + + this._cacheId++; + }, + + /** + * Remove all registered plugins. + * @since 2.1.5 + */ + clear: function() { + this._plugins = []; + this._cacheId++; + }, + + /** + * Returns the number of registered plugins? + * @returns {number} + * @since 2.1.5 + */ + count: function() { + return this._plugins.length; + }, + + /** + * Returns all registered plugin instances. + * @returns {IPlugin[]} array of plugin objects. + * @since 2.1.5 + */ + getAll: function() { + return this._plugins; + }, + + /** + * Calls enabled plugins for `chart` on the specified hook and with the given args. + * This method immediately returns as soon as a plugin explicitly returns false. The + * returned value can be used, for instance, to interrupt the current action. + * @param {Chart} chart - The chart instance for which plugins should be called. + * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). + * @param {Array} [args] - Extra arguments to apply to the hook call. + * @returns {boolean} false if any of the plugins return false, else returns true. + */ + notify: function(chart, hook, args) { + var descriptors = this.descriptors(chart); + var ilen = descriptors.length; + var i, descriptor, plugin, params, method; + + for (i = 0; i < ilen; ++i) { + descriptor = descriptors[i]; + plugin = descriptor.plugin; + method = plugin[hook]; + if (typeof method === 'function') { + params = [chart].concat(args || []); + params.push(descriptor.options); + if (method.apply(plugin, params) === false) { + return false; + } + } + } + + return true; + }, + + /** + * Returns descriptors of enabled plugins for the given chart. + * @returns {object[]} [{ plugin, options }] + * @private + */ + descriptors: function(chart) { + var cache = chart.$plugins || (chart.$plugins = {}); + if (cache.id === this._cacheId) { + return cache.descriptors; + } + + var plugins = []; + var descriptors = []; + var config = (chart && chart.config) || {}; + var options = (config.options && config.options.plugins) || {}; + + this._plugins.concat(config.plugins || []).forEach(function(plugin) { + var idx = plugins.indexOf(plugin); + if (idx !== -1) { + return; + } + + var id = plugin.id; + var opts = options[id]; + if (opts === false) { + return; + } + + if (opts === true) { + opts = helpers$1.clone(core_defaults.global.plugins[id]); + } + + plugins.push(plugin); + descriptors.push({ + plugin: plugin, + options: opts || {} + }); + }); + + cache.descriptors = descriptors; + cache.id = this._cacheId; + return descriptors; + }, + + /** + * Invalidates cache for the given chart: descriptors hold a reference on plugin option, + * but in some cases, this reference can be changed by the user when updating options. + * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + * @private + */ + _invalidate: function(chart) { + delete chart.$plugins; + } +}; + +var core_scaleService = { + // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then + // use the new chart options to grab the correct scale + constructors: {}, + // Use a registration function so that we can move to an ES6 map when we no longer need to support + // old browsers + + // Scale config defaults + defaults: {}, + registerScaleType: function(type, scaleConstructor, scaleDefaults) { + this.constructors[type] = scaleConstructor; + this.defaults[type] = helpers$1.clone(scaleDefaults); + }, + getScaleConstructor: function(type) { + return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; + }, + getScaleDefaults: function(type) { + // Return the scale defaults merged with the global settings so that we always use the latest ones + return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {}; + }, + updateScaleDefaults: function(type, additions) { + var me = this; + if (me.defaults.hasOwnProperty(type)) { + me.defaults[type] = helpers$1.extend(me.defaults[type], additions); + } + }, + addScalesToLayout: function(chart) { + // Adds each scale to the chart.boxes array to be sized accordingly + helpers$1.each(chart.scales, function(scale) { + // Set ILayoutItem parameters for backwards compatibility + scale.fullWidth = scale.options.fullWidth; + scale.position = scale.options.position; + scale.weight = scale.options.weight; + core_layouts.addBox(chart, scale); + }); + } +}; + +var valueOrDefault$7 = helpers$1.valueOrDefault; + +core_defaults._set('global', { + tooltips: { + enabled: true, + custom: null, + mode: 'nearest', + position: 'average', + intersect: true, + backgroundColor: 'rgba(0,0,0,0.8)', + titleFontStyle: 'bold', + titleSpacing: 2, + titleMarginBottom: 6, + titleFontColor: '#fff', + titleAlign: 'left', + bodySpacing: 2, + bodyFontColor: '#fff', + bodyAlign: 'left', + footerFontStyle: 'bold', + footerSpacing: 2, + footerMarginTop: 6, + footerFontColor: '#fff', + footerAlign: 'left', + yPadding: 6, + xPadding: 6, + caretPadding: 2, + caretSize: 5, + cornerRadius: 6, + multiKeyBackground: '#fff', + displayColors: true, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 0, + callbacks: { + // Args are: (tooltipItems, data) + beforeTitle: helpers$1.noop, + title: function(tooltipItems, data) { + var title = ''; + var labels = data.labels; + var labelCount = labels ? labels.length : 0; + + if (tooltipItems.length > 0) { + var item = tooltipItems[0]; + if (item.label) { + title = item.label; + } else if (item.xLabel) { + title = item.xLabel; + } else if (labelCount > 0 && item.index < labelCount) { + title = labels[item.index]; + } + } + + return title; + }, + afterTitle: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeBody: helpers$1.noop, + + // Args are: (tooltipItem, data) + beforeLabel: helpers$1.noop, + label: function(tooltipItem, data) { + var label = data.datasets[tooltipItem.datasetIndex].label || ''; + + if (label) { + label += ': '; + } + if (!helpers$1.isNullOrUndef(tooltipItem.value)) { + label += tooltipItem.value; + } else { + label += tooltipItem.yLabel; + } + return label; + }, + labelColor: function(tooltipItem, chart) { + var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); + var activeElement = meta.data[tooltipItem.index]; + var view = activeElement._view; + return { + borderColor: view.borderColor, + backgroundColor: view.backgroundColor + }; + }, + labelTextColor: function() { + return this._options.bodyFontColor; + }, + afterLabel: helpers$1.noop, + + // Args are: (tooltipItems, data) + afterBody: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeFooter: helpers$1.noop, + footer: helpers$1.noop, + afterFooter: helpers$1.noop + } + } +}); + +var positioners = { + /** + * Average mode places the tooltip at the average position of the elements shown + * @function Chart.Tooltip.positioners.average + * @param elements {ChartElement[]} the elements being displayed in the tooltip + * @returns {object} tooltip position + */ + average: function(elements) { + if (!elements.length) { + return false; + } + + var i, len; + var x = 0; + var y = 0; + var count = 0; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var pos = el.tooltipPosition(); + x += pos.x; + y += pos.y; + ++count; + } + } + + return { + x: x / count, + y: y / count + }; + }, + + /** + * Gets the tooltip position nearest of the item nearest to the event position + * @function Chart.Tooltip.positioners.nearest + * @param elements {Chart.Element[]} the tooltip elements + * @param eventPosition {object} the position of the event in canvas coordinates + * @returns {object} the tooltip position + */ + nearest: function(elements, eventPosition) { + var x = eventPosition.x; + var y = eventPosition.y; + var minDistance = Number.POSITIVE_INFINITY; + var i, len, nearestElement; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var center = el.getCenterPoint(); + var d = helpers$1.distanceBetweenPoints(eventPosition, center); + + if (d < minDistance) { + minDistance = d; + nearestElement = el; + } + } + } + + if (nearestElement) { + var tp = nearestElement.tooltipPosition(); + x = tp.x; + y = tp.y; + } + + return { + x: x, + y: y + }; + } +}; + +// Helper to push or concat based on if the 2nd parameter is an array or not +function pushOrConcat(base, toPush) { + if (toPush) { + if (helpers$1.isArray(toPush)) { + // base = base.concat(toPush); + Array.prototype.push.apply(base, toPush); + } else { + base.push(toPush); + } + } + + return base; +} + +/** + * Returns array of strings split by newline + * @param {string} value - The value to split by newline. + * @returns {string[]} value if newline present - Returned from String split() method + * @function + */ +function splitNewlines(str) { + if ((typeof str === 'string' || str instanceof String) && str.indexOf('\n') > -1) { + return str.split('\n'); + } + return str; +} + + +/** + * Private helper to create a tooltip item model + * @param element - the chart element (point, arc, bar) to create the tooltip item for + * @return new tooltip item + */ +function createTooltipItem(element) { + var xScale = element._xScale; + var yScale = element._yScale || element._scale; // handle radar || polarArea charts + var index = element._index; + var datasetIndex = element._datasetIndex; + var controller = element._chart.getDatasetMeta(datasetIndex).controller; + var indexScale = controller._getIndexScale(); + var valueScale = controller._getValueScale(); + + return { + xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', + yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', + label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '', + value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '', + index: index, + datasetIndex: datasetIndex, + x: element._model.x, + y: element._model.y + }; +} + +/** + * Helper to get the reset model for the tooltip + * @param tooltipOpts {object} the tooltip options + */ +function getBaseModel(tooltipOpts) { + var globalDefaults = core_defaults.global; + + return { + // Positioning + xPadding: tooltipOpts.xPadding, + yPadding: tooltipOpts.yPadding, + xAlign: tooltipOpts.xAlign, + yAlign: tooltipOpts.yAlign, + + // Body + bodyFontColor: tooltipOpts.bodyFontColor, + _bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), + _bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), + _bodyAlign: tooltipOpts.bodyAlign, + bodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), + bodySpacing: tooltipOpts.bodySpacing, + + // Title + titleFontColor: tooltipOpts.titleFontColor, + _titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), + _titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), + titleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), + _titleAlign: tooltipOpts.titleAlign, + titleSpacing: tooltipOpts.titleSpacing, + titleMarginBottom: tooltipOpts.titleMarginBottom, + + // Footer + footerFontColor: tooltipOpts.footerFontColor, + _footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), + _footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), + footerFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), + _footerAlign: tooltipOpts.footerAlign, + footerSpacing: tooltipOpts.footerSpacing, + footerMarginTop: tooltipOpts.footerMarginTop, + + // Appearance + caretSize: tooltipOpts.caretSize, + cornerRadius: tooltipOpts.cornerRadius, + backgroundColor: tooltipOpts.backgroundColor, + opacity: 0, + legendColorBackground: tooltipOpts.multiKeyBackground, + displayColors: tooltipOpts.displayColors, + borderColor: tooltipOpts.borderColor, + borderWidth: tooltipOpts.borderWidth + }; +} + +/** + * Get the size of the tooltip + */ +function getTooltipSize(tooltip, model) { + var ctx = tooltip._chart.ctx; + + var height = model.yPadding * 2; // Tooltip Padding + var width = 0; + + // Count of all lines in the body + var body = model.body; + var combinedBodyLength = body.reduce(function(count, bodyItem) { + return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; + }, 0); + combinedBodyLength += model.beforeBody.length + model.afterBody.length; + + var titleLineCount = model.title.length; + var footerLineCount = model.footer.length; + var titleFontSize = model.titleFontSize; + var bodyFontSize = model.bodyFontSize; + var footerFontSize = model.footerFontSize; + + height += titleLineCount * titleFontSize; // Title Lines + height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing + height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin + height += combinedBodyLength * bodyFontSize; // Body Lines + height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing + height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin + height += footerLineCount * (footerFontSize); // Footer Lines + height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing + + // Title width + var widthPadding = 0; + var maxLineWidth = function(line) { + width = Math.max(width, ctx.measureText(line).width + widthPadding); + }; + + ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); + helpers$1.each(model.title, maxLineWidth); + + // Body width + ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); + helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth); + + // Body lines may include some extra width due to the color box + widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; + helpers$1.each(body, function(bodyItem) { + helpers$1.each(bodyItem.before, maxLineWidth); + helpers$1.each(bodyItem.lines, maxLineWidth); + helpers$1.each(bodyItem.after, maxLineWidth); + }); + + // Reset back to 0 + widthPadding = 0; + + // Footer width + ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); + helpers$1.each(model.footer, maxLineWidth); + + // Add padding + width += 2 * model.xPadding; + + return { + width: width, + height: height + }; +} + +/** + * Helper to get the alignment of a tooltip given the size + */ +function determineAlignment(tooltip, size) { + var model = tooltip._model; + var chart = tooltip._chart; + var chartArea = tooltip._chart.chartArea; + var xAlign = 'center'; + var yAlign = 'center'; + + if (model.y < size.height) { + yAlign = 'top'; + } else if (model.y > (chart.height - size.height)) { + yAlign = 'bottom'; + } + + var lf, rf; // functions to determine left, right alignment + var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart + var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges + var midX = (chartArea.left + chartArea.right) / 2; + var midY = (chartArea.top + chartArea.bottom) / 2; + + if (yAlign === 'center') { + lf = function(x) { + return x <= midX; + }; + rf = function(x) { + return x > midX; + }; + } else { + lf = function(x) { + return x <= (size.width / 2); + }; + rf = function(x) { + return x >= (chart.width - (size.width / 2)); + }; + } + + olf = function(x) { + return x + size.width + model.caretSize + model.caretPadding > chart.width; + }; + orf = function(x) { + return x - size.width - model.caretSize - model.caretPadding < 0; + }; + yf = function(y) { + return y <= midY ? 'top' : 'bottom'; + }; + + if (lf(model.x)) { + xAlign = 'left'; + + // Is tooltip too wide and goes over the right side of the chart.? + if (olf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } else if (rf(model.x)) { + xAlign = 'right'; + + // Is tooltip too wide and goes outside left edge of canvas? + if (orf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } + + var opts = tooltip._options; + return { + xAlign: opts.xAlign ? opts.xAlign : xAlign, + yAlign: opts.yAlign ? opts.yAlign : yAlign + }; +} + +/** + * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment + */ +function getBackgroundPoint(vm, size, alignment, chart) { + // Background Position + var x = vm.x; + var y = vm.y; + + var caretSize = vm.caretSize; + var caretPadding = vm.caretPadding; + var cornerRadius = vm.cornerRadius; + var xAlign = alignment.xAlign; + var yAlign = alignment.yAlign; + var paddingAndSize = caretSize + caretPadding; + var radiusAndPadding = cornerRadius + caretPadding; + + if (xAlign === 'right') { + x -= size.width; + } else if (xAlign === 'center') { + x -= (size.width / 2); + if (x + size.width > chart.width) { + x = chart.width - size.width; + } + if (x < 0) { + x = 0; + } + } + + if (yAlign === 'top') { + y += paddingAndSize; + } else if (yAlign === 'bottom') { + y -= size.height + paddingAndSize; + } else { + y -= (size.height / 2); + } + + if (yAlign === 'center') { + if (xAlign === 'left') { + x += paddingAndSize; + } else if (xAlign === 'right') { + x -= paddingAndSize; + } + } else if (xAlign === 'left') { + x -= radiusAndPadding; + } else if (xAlign === 'right') { + x += radiusAndPadding; + } + + return { + x: x, + y: y + }; +} + +function getAlignedX(vm, align) { + return align === 'center' + ? vm.x + vm.width / 2 + : align === 'right' + ? vm.x + vm.width - vm.xPadding + : vm.x + vm.xPadding; +} + +/** + * Helper to build before and after body lines + */ +function getBeforeAfterBodyLines(callback) { + return pushOrConcat([], splitNewlines(callback)); +} + +var exports$3 = core_element.extend({ + initialize: function() { + this._model = getBaseModel(this._options); + this._lastActive = []; + }, + + // Get the title + // Args are: (tooltipItem, data) + getTitle: function() { + var me = this; + var opts = me._options; + var callbacks = opts.callbacks; + + var beforeTitle = callbacks.beforeTitle.apply(me, arguments); + var title = callbacks.title.apply(me, arguments); + var afterTitle = callbacks.afterTitle.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeTitle)); + lines = pushOrConcat(lines, splitNewlines(title)); + lines = pushOrConcat(lines, splitNewlines(afterTitle)); + + return lines; + }, + + // Args are: (tooltipItem, data) + getBeforeBody: function() { + return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments)); + }, + + // Args are: (tooltipItem, data) + getBody: function(tooltipItems, data) { + var me = this; + var callbacks = me._options.callbacks; + var bodyItems = []; + + helpers$1.each(tooltipItems, function(tooltipItem) { + var bodyItem = { + before: [], + lines: [], + after: [] + }; + pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data))); + pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); + pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data))); + + bodyItems.push(bodyItem); + }); + + return bodyItems; + }, + + // Args are: (tooltipItem, data) + getAfterBody: function() { + return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments)); + }, + + // Get the footer and beforeFooter and afterFooter lines + // Args are: (tooltipItem, data) + getFooter: function() { + var me = this; + var callbacks = me._options.callbacks; + + var beforeFooter = callbacks.beforeFooter.apply(me, arguments); + var footer = callbacks.footer.apply(me, arguments); + var afterFooter = callbacks.afterFooter.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeFooter)); + lines = pushOrConcat(lines, splitNewlines(footer)); + lines = pushOrConcat(lines, splitNewlines(afterFooter)); + + return lines; + }, + + update: function(changed) { + var me = this; + var opts = me._options; + + // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition + // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time + // which breaks any animations. + var existingModel = me._model; + var model = me._model = getBaseModel(opts); + var active = me._active; + + var data = me._data; + + // In the case where active.length === 0 we need to keep these at existing values for good animations + var alignment = { + xAlign: existingModel.xAlign, + yAlign: existingModel.yAlign + }; + var backgroundPoint = { + x: existingModel.x, + y: existingModel.y + }; + var tooltipSize = { + width: existingModel.width, + height: existingModel.height + }; + var tooltipPosition = { + x: existingModel.caretX, + y: existingModel.caretY + }; + + var i, len; + + if (active.length) { + model.opacity = 1; + + var labelColors = []; + var labelTextColors = []; + tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition); + + var tooltipItems = []; + for (i = 0, len = active.length; i < len; ++i) { + tooltipItems.push(createTooltipItem(active[i])); + } + + // If the user provided a filter function, use it to modify the tooltip items + if (opts.filter) { + tooltipItems = tooltipItems.filter(function(a) { + return opts.filter(a, data); + }); + } + + // If the user provided a sorting function, use it to modify the tooltip items + if (opts.itemSort) { + tooltipItems = tooltipItems.sort(function(a, b) { + return opts.itemSort(a, b, data); + }); + } + + // Determine colors for boxes + helpers$1.each(tooltipItems, function(tooltipItem) { + labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); + labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); + }); + + + // Build the Text Lines + model.title = me.getTitle(tooltipItems, data); + model.beforeBody = me.getBeforeBody(tooltipItems, data); + model.body = me.getBody(tooltipItems, data); + model.afterBody = me.getAfterBody(tooltipItems, data); + model.footer = me.getFooter(tooltipItems, data); + + // Initial positioning and colors + model.x = tooltipPosition.x; + model.y = tooltipPosition.y; + model.caretPadding = opts.caretPadding; + model.labelColors = labelColors; + model.labelTextColors = labelTextColors; + + // data points + model.dataPoints = tooltipItems; + + // We need to determine alignment of the tooltip + tooltipSize = getTooltipSize(this, model); + alignment = determineAlignment(this, tooltipSize); + // Final Size and Position + backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart); + } else { + model.opacity = 0; + } + + model.xAlign = alignment.xAlign; + model.yAlign = alignment.yAlign; + model.x = backgroundPoint.x; + model.y = backgroundPoint.y; + model.width = tooltipSize.width; + model.height = tooltipSize.height; + + // Point where the caret on the tooltip points to + model.caretX = tooltipPosition.x; + model.caretY = tooltipPosition.y; + + me._model = model; + + if (changed && opts.custom) { + opts.custom.call(me, model); + } + + return me; + }, + + drawCaret: function(tooltipPoint, size) { + var ctx = this._chart.ctx; + var vm = this._view; + var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); + + ctx.lineTo(caretPosition.x1, caretPosition.y1); + ctx.lineTo(caretPosition.x2, caretPosition.y2); + ctx.lineTo(caretPosition.x3, caretPosition.y3); + }, + getCaretPosition: function(tooltipPoint, size, vm) { + var x1, x2, x3, y1, y2, y3; + var caretSize = vm.caretSize; + var cornerRadius = vm.cornerRadius; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var ptX = tooltipPoint.x; + var ptY = tooltipPoint.y; + var width = size.width; + var height = size.height; + + if (yAlign === 'center') { + y2 = ptY + (height / 2); + + if (xAlign === 'left') { + x1 = ptX; + x2 = x1 - caretSize; + x3 = x1; + + y1 = y2 + caretSize; + y3 = y2 - caretSize; + } else { + x1 = ptX + width; + x2 = x1 + caretSize; + x3 = x1; + + y1 = y2 - caretSize; + y3 = y2 + caretSize; + } + } else { + if (xAlign === 'left') { + x2 = ptX + cornerRadius + (caretSize); + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else if (xAlign === 'right') { + x2 = ptX + width - cornerRadius - caretSize; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else { + x2 = vm.caretX; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } + if (yAlign === 'top') { + y1 = ptY; + y2 = y1 - caretSize; + y3 = y1; + } else { + y1 = ptY + height; + y2 = y1 + caretSize; + y3 = y1; + // invert drawing order + var tmp = x3; + x3 = x1; + x1 = tmp; + } + } + return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; + }, + + drawTitle: function(pt, vm, ctx) { + var title = vm.title; + + if (title.length) { + pt.x = getAlignedX(vm, vm._titleAlign); + + ctx.textAlign = vm._titleAlign; + ctx.textBaseline = 'top'; + + var titleFontSize = vm.titleFontSize; + var titleSpacing = vm.titleSpacing; + + ctx.fillStyle = vm.titleFontColor; + ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); + + var i, len; + for (i = 0, len = title.length; i < len; ++i) { + ctx.fillText(title[i], pt.x, pt.y); + pt.y += titleFontSize + titleSpacing; // Line Height and spacing + + if (i + 1 === title.length) { + pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing + } + } + } + }, + + drawBody: function(pt, vm, ctx) { + var bodyFontSize = vm.bodyFontSize; + var bodySpacing = vm.bodySpacing; + var bodyAlign = vm._bodyAlign; + var body = vm.body; + var drawColorBoxes = vm.displayColors; + var labelColors = vm.labelColors; + var xLinePadding = 0; + var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0; + var textColor; + + ctx.textAlign = bodyAlign; + ctx.textBaseline = 'top'; + ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); + + pt.x = getAlignedX(vm, bodyAlign); + + // Before Body + var fillLineOfText = function(line) { + ctx.fillText(line, pt.x + xLinePadding, pt.y); + pt.y += bodyFontSize + bodySpacing; + }; + + // Before body lines + ctx.fillStyle = vm.bodyFontColor; + helpers$1.each(vm.beforeBody, fillLineOfText); + + xLinePadding = drawColorBoxes && bodyAlign !== 'right' + ? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2) + : 0; + + // Draw body lines now + helpers$1.each(body, function(bodyItem, i) { + textColor = vm.labelTextColors[i]; + ctx.fillStyle = textColor; + helpers$1.each(bodyItem.before, fillLineOfText); + + helpers$1.each(bodyItem.lines, function(line) { + // Draw Legend-like boxes if needed + if (drawColorBoxes) { + // Fill a white rect so that colours merge nicely if the opacity is < 1 + ctx.fillStyle = vm.legendColorBackground; + ctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Border + ctx.lineWidth = 1; + ctx.strokeStyle = labelColors[i].borderColor; + ctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Inner square + ctx.fillStyle = labelColors[i].backgroundColor; + ctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); + ctx.fillStyle = textColor; + } + + fillLineOfText(line); + }); + + helpers$1.each(bodyItem.after, fillLineOfText); + }); + + // Reset back to 0 for after body + xLinePadding = 0; + + // After body lines + helpers$1.each(vm.afterBody, fillLineOfText); + pt.y -= bodySpacing; // Remove last body spacing + }, + + drawFooter: function(pt, vm, ctx) { + var footer = vm.footer; + + if (footer.length) { + pt.x = getAlignedX(vm, vm._footerAlign); + pt.y += vm.footerMarginTop; + + ctx.textAlign = vm._footerAlign; + ctx.textBaseline = 'top'; + + ctx.fillStyle = vm.footerFontColor; + ctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); + + helpers$1.each(footer, function(line) { + ctx.fillText(line, pt.x, pt.y); + pt.y += vm.footerFontSize + vm.footerSpacing; + }); + } + }, + + drawBackground: function(pt, vm, ctx, tooltipSize) { + ctx.fillStyle = vm.backgroundColor; + ctx.strokeStyle = vm.borderColor; + ctx.lineWidth = vm.borderWidth; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var x = pt.x; + var y = pt.y; + var width = tooltipSize.width; + var height = tooltipSize.height; + var radius = vm.cornerRadius; + + ctx.beginPath(); + ctx.moveTo(x + radius, y); + if (yAlign === 'top') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + if (yAlign === 'center' && xAlign === 'right') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + if (yAlign === 'bottom') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + if (yAlign === 'center' && xAlign === 'left') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + + ctx.fill(); + + if (vm.borderWidth > 0) { + ctx.stroke(); + } + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + + if (vm.opacity === 0) { + return; + } + + var tooltipSize = { + width: vm.width, + height: vm.height + }; + var pt = { + x: vm.x, + y: vm.y + }; + + // IE11/Edge does not like very small opacities, so snap to 0 + var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; + + // Truthy/falsey value for empty tooltip + var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; + + if (this._options.enabled && hasTooltipContent) { + ctx.save(); + ctx.globalAlpha = opacity; + + // Draw Background + this.drawBackground(pt, vm, ctx, tooltipSize); + + // Draw Title, Body, and Footer + pt.y += vm.yPadding; + + // Titles + this.drawTitle(pt, vm, ctx); + + // Body + this.drawBody(pt, vm, ctx); + + // Footer + this.drawFooter(pt, vm, ctx); + + ctx.restore(); + } + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + * @returns {boolean} true if the tooltip changed + */ + handleEvent: function(e) { + var me = this; + var options = me._options; + var changed = false; + + me._lastActive = me._lastActive || []; + + // Find Active Elements for tooltips + if (e.type === 'mouseout') { + me._active = []; + } else { + me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); + } + + // Remember Last Actives + changed = !helpers$1.arrayEquals(me._active, me._lastActive); + + // Only handle target event on tooltip change + if (changed) { + me._lastActive = me._active; + + if (options.enabled || options.custom) { + me._eventPosition = { + x: e.x, + y: e.y + }; + + me.update(true); + me.pivot(); + } + } + + return changed; + } +}); + +/** + * @namespace Chart.Tooltip.positioners + */ +var positioners_1 = positioners; + +var core_tooltip = exports$3; +core_tooltip.positioners = positioners_1; + +var valueOrDefault$8 = helpers$1.valueOrDefault; + +core_defaults._set('global', { + elements: {}, + events: [ + 'mousemove', + 'mouseout', + 'click', + 'touchstart', + 'touchmove' + ], + hover: { + onHover: null, + mode: 'nearest', + intersect: true, + animationDuration: 400 + }, + onClick: null, + maintainAspectRatio: true, + responsive: true, + responsiveAnimationDuration: 0 +}); + +/** + * Recursively merge the given config objects representing the `scales` option + * by incorporating scale defaults in `xAxes` and `yAxes` array items, then + * returns a deep copy of the result, thus doesn't alter inputs. + */ +function mergeScaleConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function(key, target, source, options) { + if (key === 'xAxes' || key === 'yAxes') { + var slen = source[key].length; + var i, type, scale; + + if (!target[key]) { + target[key] = []; + } + + for (i = 0; i < slen; ++i) { + scale = source[key][i]; + type = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear'); + + if (i >= target[key].length) { + target[key].push({}); + } + + if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { + // new/untyped scale or type changed: let's apply the new defaults + // then merge source scale to correctly overwrite the defaults. + helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]); + } else { + // scales type are the same + helpers$1.merge(target[key][i], scale); + } + } + } else { + helpers$1._merger(key, target, source, options); + } + } + }); +} + +/** + * Recursively merge the given config objects as the root options by handling + * default scale options for the `scales` and `scale` properties, then returns + * a deep copy of the result, thus doesn't alter inputs. + */ +function mergeConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function(key, target, source, options) { + var tval = target[key] || {}; + var sval = source[key]; + + if (key === 'scales') { + // scale config merging is complex. Add our own function here for that + target[key] = mergeScaleConfig(tval, sval); + } else if (key === 'scale') { + // used in polar area & radar charts since there is only one scale + target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]); + } else { + helpers$1._merger(key, target, source, options); + } + } + }); +} + +function initConfig(config) { + config = config || {}; + + // Do NOT use mergeConfig for the data object because this method merges arrays + // and so would change references to labels and datasets, preventing data updates. + var data = config.data = config.data || {}; + data.datasets = data.datasets || []; + data.labels = data.labels || []; + + config.options = mergeConfig( + core_defaults.global, + core_defaults[config.type], + config.options || {}); + + return config; +} + +function updateConfig(chart) { + var newOptions = chart.options; + + helpers$1.each(chart.scales, function(scale) { + core_layouts.removeBox(chart, scale); + }); + + newOptions = mergeConfig( + core_defaults.global, + core_defaults[chart.config.type], + newOptions); + + chart.options = chart.config.options = newOptions; + chart.ensureScalesHaveIDs(); + chart.buildOrUpdateScales(); + + // Tooltip + chart.tooltip._options = newOptions.tooltips; + chart.tooltip.initialize(); +} + +function positionIsHorizontal(position) { + return position === 'top' || position === 'bottom'; +} + +var Chart = function(item, config) { + this.construct(item, config); + return this; +}; + +helpers$1.extend(Chart.prototype, /** @lends Chart */ { + /** + * @private + */ + construct: function(item, config) { + var me = this; + + config = initConfig(config); + + var context = platform.acquireContext(item, config); + var canvas = context && context.canvas; + var height = canvas && canvas.height; + var width = canvas && canvas.width; + + me.id = helpers$1.uid(); + me.ctx = context; + me.canvas = canvas; + me.config = config; + me.width = width; + me.height = height; + me.aspectRatio = height ? width / height : null; + me.options = config.options; + me._bufferedRender = false; + + /** + * Provided for backward compatibility, Chart and Chart.Controller have been merged, + * the "instance" still need to be defined since it might be called from plugins. + * @prop Chart#chart + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ + me.chart = me; + me.controller = me; // chart.chart.controller #inception + + // Add the chart instance to the global namespace + Chart.instances[me.id] = me; + + // Define alias to the config data: `chart.data === chart.config.data` + Object.defineProperty(me, 'data', { + get: function() { + return me.config.data; + }, + set: function(value) { + me.config.data = value; + } + }); + + if (!context || !canvas) { + // The given item is not a compatible context2d element, let's return before finalizing + // the chart initialization but after setting basic chart / controller properties that + // can help to figure out that the chart is not valid (e.g chart.canvas !== null); + // https://github.com/chartjs/Chart.js/issues/2807 + console.error("Failed to create chart: can't acquire context from the given item"); + return; + } + + me.initialize(); + me.update(); + }, + + /** + * @private + */ + initialize: function() { + var me = this; + + // Before init plugin notification + core_plugins.notify(me, 'beforeInit'); + + helpers$1.retinaScale(me, me.options.devicePixelRatio); + + me.bindEvents(); + + if (me.options.responsive) { + // Initial resize before chart draws (must be silent to preserve initial animations). + me.resize(true); + } + + // Make sure scales have IDs and are built before we build any controllers. + me.ensureScalesHaveIDs(); + me.buildOrUpdateScales(); + me.initToolTip(); + + // After init plugin notification + core_plugins.notify(me, 'afterInit'); + + return me; + }, + + clear: function() { + helpers$1.canvas.clear(this); + return this; + }, + + stop: function() { + // Stops any current animation loop occurring + core_animations.cancelAnimation(this); + return this; + }, + + resize: function(silent) { + var me = this; + var options = me.options; + var canvas = me.canvas; + var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; + + // the canvas render width and height will be casted to integers so make sure that + // the canvas display style uses the same integer values to avoid blurring effect. + + // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed + var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas))); + var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas))); + + if (me.width === newWidth && me.height === newHeight) { + return; + } + + canvas.width = me.width = newWidth; + canvas.height = me.height = newHeight; + canvas.style.width = newWidth + 'px'; + canvas.style.height = newHeight + 'px'; + + helpers$1.retinaScale(me, options.devicePixelRatio); + + if (!silent) { + // Notify any plugins about the resize + var newSize = {width: newWidth, height: newHeight}; + core_plugins.notify(me, 'resize', [newSize]); + + // Notify of resize + if (options.onResize) { + options.onResize(me, newSize); + } + + me.stop(); + me.update({ + duration: options.responsiveAnimationDuration + }); + } + }, + + ensureScalesHaveIDs: function() { + var options = this.options; + var scalesOptions = options.scales || {}; + var scaleOptions = options.scale; + + helpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) { + xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); + }); + + helpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) { + yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); + }); + + if (scaleOptions) { + scaleOptions.id = scaleOptions.id || 'scale'; + } + }, + + /** + * Builds a map of scale ID to scale object for future lookup. + */ + buildOrUpdateScales: function() { + var me = this; + var options = me.options; + var scales = me.scales || {}; + var items = []; + var updated = Object.keys(scales).reduce(function(obj, id) { + obj[id] = false; + return obj; + }, {}); + + if (options.scales) { + items = items.concat( + (options.scales.xAxes || []).map(function(xAxisOptions) { + return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; + }), + (options.scales.yAxes || []).map(function(yAxisOptions) { + return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; + }) + ); + } + + if (options.scale) { + items.push({ + options: options.scale, + dtype: 'radialLinear', + isDefault: true, + dposition: 'chartArea' + }); + } + + helpers$1.each(items, function(item) { + var scaleOptions = item.options; + var id = scaleOptions.id; + var scaleType = valueOrDefault$8(scaleOptions.type, item.dtype); + + if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { + scaleOptions.position = item.dposition; + } + + updated[id] = true; + var scale = null; + if (id in scales && scales[id].type === scaleType) { + scale = scales[id]; + scale.options = scaleOptions; + scale.ctx = me.ctx; + scale.chart = me; + } else { + var scaleClass = core_scaleService.getScaleConstructor(scaleType); + if (!scaleClass) { + return; + } + scale = new scaleClass({ + id: id, + type: scaleType, + options: scaleOptions, + ctx: me.ctx, + chart: me + }); + scales[scale.id] = scale; + } + + scale.mergeTicksOptions(); + + // TODO(SB): I think we should be able to remove this custom case (options.scale) + // and consider it as a regular scale part of the "scales"" map only! This would + // make the logic easier and remove some useless? custom code. + if (item.isDefault) { + me.scale = scale; + } + }); + // clear up discarded scales + helpers$1.each(updated, function(hasUpdated, id) { + if (!hasUpdated) { + delete scales[id]; + } + }); + + me.scales = scales; + + core_scaleService.addScalesToLayout(this); + }, + + buildOrUpdateControllers: function() { + var me = this; + var newControllers = []; + + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + var meta = me.getDatasetMeta(datasetIndex); + var type = dataset.type || me.config.type; + + if (meta.type && meta.type !== type) { + me.destroyDatasetMeta(datasetIndex); + meta = me.getDatasetMeta(datasetIndex); + } + meta.type = type; + + if (meta.controller) { + meta.controller.updateIndex(datasetIndex); + meta.controller.linkScales(); + } else { + var ControllerClass = controllers[meta.type]; + if (ControllerClass === undefined) { + throw new Error('"' + meta.type + '" is not a chart type.'); + } + + meta.controller = new ControllerClass(me, datasetIndex); + newControllers.push(meta.controller); + } + }, me); + + return newControllers; + }, + + /** + * Reset the elements of all datasets + * @private + */ + resetElements: function() { + var me = this; + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.reset(); + }, me); + }, + + /** + * Resets the chart back to it's state before the initial animation + */ + reset: function() { + this.resetElements(); + this.tooltip.initialize(); + }, + + update: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + updateConfig(me); + + // plugins options references might have change, let's invalidate the cache + // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + core_plugins._invalidate(me); + + if (core_plugins.notify(me, 'beforeUpdate') === false) { + return; + } + + // In case the entire data object changed + me.tooltip._data = me.data; + + // Make sure dataset controllers are updated and new controllers are reset + var newControllers = me.buildOrUpdateControllers(); + + // Make sure all dataset controllers have correct meta data counts + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); + }, me); + + me.updateLayout(); + + // Can only reset the new controllers after the scales have been updated + if (me.options.animation && me.options.animation.duration) { + helpers$1.each(newControllers, function(controller) { + controller.reset(); + }); + } + + me.updateDatasets(); + + // Need to reset tooltip in case it is displayed with elements that are removed + // after update. + me.tooltip.initialize(); + + // Last active contains items that were previously in the tooltip. + // When we reset the tooltip, we need to clear it + me.lastActive = []; + + // Do this before render so that any plugins that need final scale updates can use it + core_plugins.notify(me, 'afterUpdate'); + + if (me._bufferedRender) { + me._bufferedRequest = { + duration: config.duration, + easing: config.easing, + lazy: config.lazy + }; + } else { + me.render(config); + } + }, + + /** + * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` + * hook, in which case, plugins will not be called on `afterLayout`. + * @private + */ + updateLayout: function() { + var me = this; + + if (core_plugins.notify(me, 'beforeLayout') === false) { + return; + } + + core_layouts.update(this, this.width, this.height); + + /** + * Provided for backward compatibility, use `afterLayout` instead. + * @method IPlugin#afterScaleUpdate + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ + core_plugins.notify(me, 'afterScaleUpdate'); + core_plugins.notify(me, 'afterLayout'); + }, + + /** + * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` + * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. + * @private + */ + updateDatasets: function() { + var me = this; + + if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) { + return; + } + + for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.updateDataset(i); + } + + core_plugins.notify(me, 'afterDatasetsUpdate'); + }, + + /** + * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` + * hook, in which case, plugins will not be called on `afterDatasetUpdate`. + * @private + */ + updateDataset: function(index) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index + }; + + if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { + return; + } + + meta.controller.update(); + + core_plugins.notify(me, 'afterDatasetUpdate', [args]); + }, + + render: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + var animationOptions = me.options.animation; + var duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration); + var lazy = config.lazy; + + if (core_plugins.notify(me, 'beforeRender') === false) { + return; + } + + var onComplete = function(animation) { + core_plugins.notify(me, 'afterRender'); + helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me); + }; + + if (animationOptions && duration) { + var animation = new core_animation({ + numSteps: duration / 16.66, // 60 fps + easing: config.easing || animationOptions.easing, + + render: function(chart, animationObject) { + var easingFunction = helpers$1.easing.effects[animationObject.easing]; + var currentStep = animationObject.currentStep; + var stepDecimal = currentStep / animationObject.numSteps; + + chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); + }, + + onAnimationProgress: animationOptions.onProgress, + onAnimationComplete: onComplete + }); + + core_animations.addAnimation(me, animation, duration, lazy); + } else { + me.draw(); + + // See https://github.com/chartjs/Chart.js/issues/3781 + onComplete(new core_animation({numSteps: 0, chart: me})); + } + + return me; + }, + + draw: function(easingValue) { + var me = this; + + me.clear(); + + if (helpers$1.isNullOrUndef(easingValue)) { + easingValue = 1; + } + + me.transition(easingValue); + + if (me.width <= 0 || me.height <= 0) { + return; + } + + if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) { + return; + } + + // Draw all the scales + helpers$1.each(me.boxes, function(box) { + box.draw(me.chartArea); + }, me); + + me.drawDatasets(easingValue); + me._drawTooltip(easingValue); + + core_plugins.notify(me, 'afterDraw', [easingValue]); + }, + + /** + * @private + */ + transition: function(easingValue) { + var me = this; + + for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { + if (me.isDatasetVisible(i)) { + me.getDatasetMeta(i).controller.transition(easingValue); + } + } + + me.tooltip.transition(easingValue); + }, + + /** + * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` + * hook, in which case, plugins will not be called on `afterDatasetsDraw`. + * @private + */ + drawDatasets: function(easingValue) { + var me = this; + + if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { + return; + } + + // Draw datasets reversed to support proper line stacking + for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { + if (me.isDatasetVisible(i)) { + me.drawDataset(i, easingValue); + } + } + + core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]); + }, + + /** + * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` + * hook, in which case, plugins will not be called on `afterDatasetDraw`. + * @private + */ + drawDataset: function(index, easingValue) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index, + easingValue: easingValue + }; + + if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { + return; + } + + meta.controller.draw(easingValue); + + core_plugins.notify(me, 'afterDatasetDraw', [args]); + }, + + /** + * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` + * hook, in which case, plugins will not be called on `afterTooltipDraw`. + * @private + */ + _drawTooltip: function(easingValue) { + var me = this; + var tooltip = me.tooltip; + var args = { + tooltip: tooltip, + easingValue: easingValue + }; + + if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { + return; + } + + tooltip.draw(); + + core_plugins.notify(me, 'afterTooltipDraw', [args]); + }, + + /** + * Get the single element that was clicked on + * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw + */ + getElementAtEvent: function(e) { + return core_interaction.modes.single(this, e); + }, + + getElementsAtEvent: function(e) { + return core_interaction.modes.label(this, e, {intersect: true}); + }, + + getElementsAtXAxis: function(e) { + return core_interaction.modes['x-axis'](this, e, {intersect: true}); + }, + + getElementsAtEventForMode: function(e, mode, options) { + var method = core_interaction.modes[mode]; + if (typeof method === 'function') { + return method(this, e, options); + } + + return []; + }, + + getDatasetAtEvent: function(e) { + return core_interaction.modes.dataset(this, e, {intersect: true}); + }, + + getDatasetMeta: function(datasetIndex) { + var me = this; + var dataset = me.data.datasets[datasetIndex]; + if (!dataset._meta) { + dataset._meta = {}; + } + + var meta = dataset._meta[me.id]; + if (!meta) { + meta = dataset._meta[me.id] = { + type: null, + data: [], + dataset: null, + controller: null, + hidden: null, // See isDatasetVisible() comment + xAxisID: null, + yAxisID: null + }; + } + + return meta; + }, + + getVisibleDatasetCount: function() { + var count = 0; + for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + if (this.isDatasetVisible(i)) { + count++; + } + } + return count; + }, + + isDatasetVisible: function(datasetIndex) { + var meta = this.getDatasetMeta(datasetIndex); + + // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, + // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. + return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; + }, + + generateLegend: function() { + return this.options.legendCallback(this); + }, + + /** + * @private + */ + destroyDatasetMeta: function(datasetIndex) { + var id = this.id; + var dataset = this.data.datasets[datasetIndex]; + var meta = dataset._meta && dataset._meta[id]; + + if (meta) { + meta.controller.destroy(); + delete dataset._meta[id]; + } + }, + + destroy: function() { + var me = this; + var canvas = me.canvas; + var i, ilen; + + me.stop(); + + // dataset controllers need to cleanup associated data + for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.destroyDatasetMeta(i); + } + + if (canvas) { + me.unbindEvents(); + helpers$1.canvas.clear(me); + platform.releaseContext(me.ctx); + me.canvas = null; + me.ctx = null; + } + + core_plugins.notify(me, 'destroy'); + + delete Chart.instances[me.id]; + }, + + toBase64Image: function() { + return this.canvas.toDataURL.apply(this.canvas, arguments); + }, + + initToolTip: function() { + var me = this; + me.tooltip = new core_tooltip({ + _chart: me, + _chartInstance: me, // deprecated, backward compatibility + _data: me.data, + _options: me.options.tooltips + }, me); + }, + + /** + * @private + */ + bindEvents: function() { + var me = this; + var listeners = me._listeners = {}; + var listener = function() { + me.eventHandler.apply(me, arguments); + }; + + helpers$1.each(me.options.events, function(type) { + platform.addEventListener(me, type, listener); + listeners[type] = listener; + }); + + // Elements used to detect size change should not be injected for non responsive charts. + // See https://github.com/chartjs/Chart.js/issues/2210 + if (me.options.responsive) { + listener = function() { + me.resize(); + }; + + platform.addEventListener(me, 'resize', listener); + listeners.resize = listener; + } + }, + + /** + * @private + */ + unbindEvents: function() { + var me = this; + var listeners = me._listeners; + if (!listeners) { + return; + } + + delete me._listeners; + helpers$1.each(listeners, function(listener, type) { + platform.removeEventListener(me, type, listener); + }); + }, + + updateHoverStyle: function(elements, mode, enabled) { + var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; + var element, i, ilen; + + for (i = 0, ilen = elements.length; i < ilen; ++i) { + element = elements[i]; + if (element) { + this.getDatasetMeta(element._datasetIndex).controller[method](element); + } + } + }, + + /** + * @private + */ + eventHandler: function(e) { + var me = this; + var tooltip = me.tooltip; + + if (core_plugins.notify(me, 'beforeEvent', [e]) === false) { + return; + } + + // Buffer any update calls so that renders do not occur + me._bufferedRender = true; + me._bufferedRequest = null; + + var changed = me.handleEvent(e); + // for smooth tooltip animations issue #4989 + // the tooltip should be the source of change + // Animation check workaround: + // tooltip._start will be null when tooltip isn't animating + if (tooltip) { + changed = tooltip._start + ? tooltip.handleEvent(e) + : changed | tooltip.handleEvent(e); + } + + core_plugins.notify(me, 'afterEvent', [e]); + + var bufferedRequest = me._bufferedRequest; + if (bufferedRequest) { + // If we have an update that was triggered, we need to do a normal render + me.render(bufferedRequest); + } else if (changed && !me.animating) { + // If entering, leaving, or changing elements, animate the change via pivot + me.stop(); + + // We only need to render at this point. Updating will cause scales to be + // recomputed generating flicker & using more memory than necessary. + me.render({ + duration: me.options.hover.animationDuration, + lazy: true + }); + } + + me._bufferedRender = false; + me._bufferedRequest = null; + + return me; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event the event to handle + * @return {boolean} true if the chart needs to re-render + */ + handleEvent: function(e) { + var me = this; + var options = me.options || {}; + var hoverOptions = options.hover; + var changed = false; + + me.lastActive = me.lastActive || []; + + // Find Active Elements for hover and tooltips + if (e.type === 'mouseout') { + me.active = []; + } else { + me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); + } + + // Invoke onHover hook + // Need to call with native event here to not break backwards compatibility + helpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); + + if (e.type === 'mouseup' || e.type === 'click') { + if (options.onClick) { + // Use e.native here for backwards compatibility + options.onClick.call(me, e.native, me.active); + } + } + + // Remove styling for last active (even if it may still be active) + if (me.lastActive.length) { + me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); + } + + // Built in hover styling + if (me.active.length && hoverOptions.mode) { + me.updateHoverStyle(me.active, hoverOptions.mode, true); + } + + changed = !helpers$1.arrayEquals(me.active, me.lastActive); + + // Remember Last Actives + me.lastActive = me.active; + + return changed; + } +}); + +/** + * NOTE(SB) We actually don't use this container anymore but we need to keep it + * for backward compatibility. Though, it can still be useful for plugins that + * would need to work on multiple charts?! + */ +Chart.instances = {}; + +var core_controller = Chart; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart instead. + * @class Chart.Controller + * @deprecated since version 2.6 + * @todo remove at version 3 + * @private + */ +Chart.Controller = Chart; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ +Chart.types = {}; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.configMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +helpers$1.configMerge = mergeConfig; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.scaleMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +helpers$1.scaleMerge = mergeScaleConfig; + +var core_helpers = function() { + + // -- Basic js utility methods + + helpers$1.where = function(collection, filterCallback) { + if (helpers$1.isArray(collection) && Array.prototype.filter) { + return collection.filter(filterCallback); + } + var filtered = []; + + helpers$1.each(collection, function(item) { + if (filterCallback(item)) { + filtered.push(item); + } + }); + + return filtered; + }; + helpers$1.findIndex = Array.prototype.findIndex ? + function(array, callback, scope) { + return array.findIndex(callback, scope); + } : + function(array, callback, scope) { + scope = scope === undefined ? array : scope; + for (var i = 0, ilen = array.length; i < ilen; ++i) { + if (callback.call(scope, array[i], i, array)) { + return i; + } + } + return -1; + }; + helpers$1.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to start of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = -1; + } + for (var i = startIndex + 1; i < arrayToSearch.length; i++) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + helpers$1.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to end of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = arrayToSearch.length; + } + for (var i = startIndex - 1; i >= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + + // -- Math methods + helpers$1.isNumber = function(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }; + helpers$1.almostEquals = function(x, y, epsilon) { + return Math.abs(x - y) < epsilon; + }; + helpers$1.almostWhole = function(x, epsilon) { + var rounded = Math.round(x); + return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); + }; + helpers$1.max = function(array) { + return array.reduce(function(max, value) { + if (!isNaN(value)) { + return Math.max(max, value); + } + return max; + }, Number.NEGATIVE_INFINITY); + }; + helpers$1.min = function(array) { + return array.reduce(function(min, value) { + if (!isNaN(value)) { + return Math.min(min, value); + } + return min; + }, Number.POSITIVE_INFINITY); + }; + helpers$1.sign = Math.sign ? + function(x) { + return Math.sign(x); + } : + function(x) { + x = +x; // convert to a number + if (x === 0 || isNaN(x)) { + return x; + } + return x > 0 ? 1 : -1; + }; + helpers$1.log10 = Math.log10 ? + function(x) { + return Math.log10(x); + } : + function(x) { + var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. + // Check for whole powers of 10, + // which due to floating point rounding error should be corrected. + var powerOf10 = Math.round(exponent); + var isPowerOf10 = x === Math.pow(10, powerOf10); + + return isPowerOf10 ? powerOf10 : exponent; + }; + helpers$1.toRadians = function(degrees) { + return degrees * (Math.PI / 180); + }; + helpers$1.toDegrees = function(radians) { + return radians * (180 / Math.PI); + }; + + /** + * Returns the number of decimal places + * i.e. the number of digits after the decimal point, of the value of this Number. + * @param {number} x - A number. + * @returns {number} The number of decimal places. + * @private + */ + helpers$1._decimalPlaces = function(x) { + if (!helpers$1.isFinite(x)) { + return; + } + var e = 1; + var p = 0; + while (Math.round(x * e) / e !== x) { + e *= 10; + p++; + } + return p; + }; + + // Gets the angle from vertical upright to the point about a centre. + helpers$1.getAngleFromPoint = function(centrePoint, anglePoint) { + var distanceFromXCenter = anglePoint.x - centrePoint.x; + var distanceFromYCenter = anglePoint.y - centrePoint.y; + var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + + var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); + + if (angle < (-0.5 * Math.PI)) { + angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }; + helpers$1.distanceBetweenPoints = function(pt1, pt2) { + return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); + }; + + /** + * Provided for backward compatibility, not available anymore + * @function Chart.helpers.aliasPixel + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ + helpers$1.aliasPixel = function(pixelWidth) { + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }; + + /** + * Returns the aligned pixel value to avoid anti-aliasing blur + * @param {Chart} chart - The chart instance. + * @param {number} pixel - A pixel value. + * @param {number} width - The width of the element. + * @returns {number} The aligned pixel value. + * @private + */ + helpers$1._alignPixel = function(chart, pixel, width) { + var devicePixelRatio = chart.currentDevicePixelRatio; + var halfWidth = width / 2; + return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; + }; + + helpers$1.splineCurve = function(firstPoint, middlePoint, afterPoint, t) { + // Props to Rob Spencer at scaled innovation for his post on splining between points + // http://scaledinnovation.com/analytics/splines/aboutSplines.html + + // This function must also respect "skipped" points + + var previous = firstPoint.skip ? middlePoint : firstPoint; + var current = middlePoint; + var next = afterPoint.skip ? middlePoint : afterPoint; + + var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); + var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); + + var s01 = d01 / (d01 + d12); + var s12 = d12 / (d01 + d12); + + // If all points are the same, s01 & s02 will be inf + s01 = isNaN(s01) ? 0 : s01; + s12 = isNaN(s12) ? 0 : s12; + + var fa = t * s01; // scaling factor for triangle Ta + var fb = t * s12; + + return { + previous: { + x: current.x - fa * (next.x - previous.x), + y: current.y - fa * (next.y - previous.y) + }, + next: { + x: current.x + fb * (next.x - previous.x), + y: current.y + fb * (next.y - previous.y) + } + }; + }; + helpers$1.EPSILON = Number.EPSILON || 1e-14; + helpers$1.splineCurveMonotone = function(points) { + // This function calculates Bézier control points in a similar way than |splineCurve|, + // but preserves monotonicity of the provided data and ensures no local extremums are added + // between the dataset discrete points due to the interpolation. + // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation + + var pointsWithTangents = (points || []).map(function(point) { + return { + model: point._model, + deltaK: 0, + mK: 0 + }; + }); + + // Calculate slopes (deltaK) and initialize tangents (mK) + var pointsLen = pointsWithTangents.length; + var i, pointBefore, pointCurrent, pointAfter; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointAfter && !pointAfter.model.skip) { + var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); + + // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 + pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; + } + + if (!pointBefore || pointBefore.model.skip) { + pointCurrent.mK = pointCurrent.deltaK; + } else if (!pointAfter || pointAfter.model.skip) { + pointCurrent.mK = pointBefore.deltaK; + } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { + pointCurrent.mK = 0; + } else { + pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; + } + } + + // Adjust tangents to ensure monotonic properties + var alphaK, betaK, tauK, squaredMagnitude; + for (i = 0; i < pointsLen - 1; ++i) { + pointCurrent = pointsWithTangents[i]; + pointAfter = pointsWithTangents[i + 1]; + if (pointCurrent.model.skip || pointAfter.model.skip) { + continue; + } + + if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { + pointCurrent.mK = pointAfter.mK = 0; + continue; + } + + alphaK = pointCurrent.mK / pointCurrent.deltaK; + betaK = pointAfter.mK / pointCurrent.deltaK; + squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); + if (squaredMagnitude <= 9) { + continue; + } + + tauK = 3 / Math.sqrt(squaredMagnitude); + pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; + pointAfter.mK = betaK * tauK * pointCurrent.deltaK; + } + + // Compute control points + var deltaX; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointBefore && !pointBefore.model.skip) { + deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; + pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; + pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; + } + if (pointAfter && !pointAfter.model.skip) { + deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; + pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; + pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; + } + } + }; + helpers$1.nextItem = function(collection, index, loop) { + if (loop) { + return index >= collection.length - 1 ? collection[0] : collection[index + 1]; + } + return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; + }; + helpers$1.previousItem = function(collection, index, loop) { + if (loop) { + return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; + } + return index <= 0 ? collection[0] : collection[index - 1]; + }; + // Implementation of the nice number algorithm used in determining where axis labels will go + helpers$1.niceNum = function(range, round) { + var exponent = Math.floor(helpers$1.log10(range)); + var fraction = range / Math.pow(10, exponent); + var niceFraction; + + if (round) { + if (fraction < 1.5) { + niceFraction = 1; + } else if (fraction < 3) { + niceFraction = 2; + } else if (fraction < 7) { + niceFraction = 5; + } else { + niceFraction = 10; + } + } else if (fraction <= 1.0) { + niceFraction = 1; + } else if (fraction <= 2) { + niceFraction = 2; + } else if (fraction <= 5) { + niceFraction = 5; + } else { + niceFraction = 10; + } + + return niceFraction * Math.pow(10, exponent); + }; + // Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + helpers$1.requestAnimFrame = (function() { + if (typeof window === 'undefined') { + return function(callback) { + callback(); + }; + } + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + }()); + // -- DOM methods + helpers$1.getRelativePosition = function(evt, chart) { + var mouseX, mouseY; + var e = evt.originalEvent || evt; + var canvas = evt.target || evt.srcElement; + var boundingRect = canvas.getBoundingClientRect(); + + var touches = e.touches; + if (touches && touches.length > 0) { + mouseX = touches[0].clientX; + mouseY = touches[0].clientY; + + } else { + mouseX = e.clientX; + mouseY = e.clientY; + } + + // Scale mouse coordinates into canvas coordinates + // by following the pattern laid out by 'jerryj' in the comments of + // https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ + var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left')); + var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top')); + var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right')); + var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom')); + var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; + var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; + + // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However + // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here + mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); + mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); + + return { + x: mouseX, + y: mouseY + }; + + }; + + // Private helper function to convert max-width/max-height values that may be percentages into a number + function parseMaxStyle(styleValue, node, parentProperty) { + var valueInPixels; + if (typeof styleValue === 'string') { + valueInPixels = parseInt(styleValue, 10); + + if (styleValue.indexOf('%') !== -1) { + // percentage * size in dimension + valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; + } + } else { + valueInPixels = styleValue; + } + + return valueInPixels; + } + + /** + * Returns if the given value contains an effective constraint. + * @private + */ + function isConstrainedValue(value) { + return value !== undefined && value !== null && value !== 'none'; + } + + /** + * Returns the max width or height of the given DOM node in a cross-browser compatible fashion + * @param {HTMLElement} domNode - the node to check the constraint on + * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height') + * @param {string} percentageProperty - property of parent to use when calculating width as a percentage + * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser} + */ + function getConstraintDimension(domNode, maxStyle, percentageProperty) { + var view = document.defaultView; + var parentNode = helpers$1._getParentNode(domNode); + var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; + var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; + var hasCNode = isConstrainedValue(constrainedNode); + var hasCContainer = isConstrainedValue(constrainedContainer); + var infinity = Number.POSITIVE_INFINITY; + + if (hasCNode || hasCContainer) { + return Math.min( + hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, + hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); + } + + return 'none'; + } + // returns Number or undefined if no constraint + helpers$1.getConstraintWidth = function(domNode) { + return getConstraintDimension(domNode, 'max-width', 'clientWidth'); + }; + // returns Number or undefined if no constraint + helpers$1.getConstraintHeight = function(domNode) { + return getConstraintDimension(domNode, 'max-height', 'clientHeight'); + }; + /** + * @private + */ + helpers$1._calculatePadding = function(container, padding, parentDimension) { + padding = helpers$1.getStyle(container, padding); + + return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10); + }; + /** + * @private + */ + helpers$1._getParentNode = function(domNode) { + var parent = domNode.parentNode; + if (parent && parent.toString() === '[object ShadowRoot]') { + parent = parent.host; + } + return parent; + }; + helpers$1.getMaximumWidth = function(domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientWidth; + } + + var clientWidth = container.clientWidth; + var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth); + var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth); + + var w = clientWidth - paddingLeft - paddingRight; + var cw = helpers$1.getConstraintWidth(domNode); + return isNaN(cw) ? w : Math.min(w, cw); + }; + helpers$1.getMaximumHeight = function(domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientHeight; + } + + var clientHeight = container.clientHeight; + var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight); + var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight); + + var h = clientHeight - paddingTop - paddingBottom; + var ch = helpers$1.getConstraintHeight(domNode); + return isNaN(ch) ? h : Math.min(h, ch); + }; + helpers$1.getStyle = function(el, property) { + return el.currentStyle ? + el.currentStyle[property] : + document.defaultView.getComputedStyle(el, null).getPropertyValue(property); + }; + helpers$1.retinaScale = function(chart, forceRatio) { + var pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && window.devicePixelRatio) || 1; + if (pixelRatio === 1) { + return; + } + + var canvas = chart.canvas; + var height = chart.height; + var width = chart.width; + + canvas.height = height * pixelRatio; + canvas.width = width * pixelRatio; + chart.ctx.scale(pixelRatio, pixelRatio); + + // If no style has been set on the canvas, the render size is used as display size, + // making the chart visually bigger, so let's enforce it to the "correct" values. + // See https://github.com/chartjs/Chart.js/issues/3575 + if (!canvas.style.height && !canvas.style.width) { + canvas.style.height = height + 'px'; + canvas.style.width = width + 'px'; + } + }; + // -- Canvas methods + helpers$1.fontString = function(pixelSize, fontStyle, fontFamily) { + return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; + }; + helpers$1.longestText = function(ctx, font, arrayOfThings, cache) { + cache = cache || {}; + var data = cache.data = cache.data || {}; + var gc = cache.garbageCollect = cache.garbageCollect || []; + + if (cache.font !== font) { + data = cache.data = {}; + gc = cache.garbageCollect = []; + cache.font = font; + } + + ctx.font = font; + var longest = 0; + helpers$1.each(arrayOfThings, function(thing) { + // Undefined strings and arrays should not be measured + if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) { + longest = helpers$1.measureText(ctx, data, gc, longest, thing); + } else if (helpers$1.isArray(thing)) { + // if it is an array lets measure each element + // to do maybe simplify this function a bit so we can do this more recursively? + helpers$1.each(thing, function(nestedThing) { + // Undefined strings and arrays should not be measured + if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) { + longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing); + } + }); + } + }); + + var gcLen = gc.length / 2; + if (gcLen > arrayOfThings.length) { + for (var i = 0; i < gcLen; i++) { + delete data[gc[i]]; + } + gc.splice(0, gcLen); + } + return longest; + }; + helpers$1.measureText = function(ctx, data, gc, longest, string) { + var textWidth = data[string]; + if (!textWidth) { + textWidth = data[string] = ctx.measureText(string).width; + gc.push(string); + } + if (textWidth > longest) { + longest = textWidth; + } + return longest; + }; + helpers$1.numberOfLabelLines = function(arrayOfThings) { + var numberOfLines = 1; + helpers$1.each(arrayOfThings, function(thing) { + if (helpers$1.isArray(thing)) { + if (thing.length > numberOfLines) { + numberOfLines = thing.length; + } + } + }); + return numberOfLines; + }; + + helpers$1.color = !chartjsColor ? + function(value) { + console.error('Color.js not found!'); + return value; + } : + function(value) { + /* global CanvasGradient */ + if (value instanceof CanvasGradient) { + value = core_defaults.global.defaultColor; + } + + return chartjsColor(value); + }; + + helpers$1.getHoverColor = function(colorValue) { + /* global CanvasPattern */ + return (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ? + colorValue : + helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString(); + }; +}; + +function abstract() { + throw new Error( + 'This method is not implemented: either no adapter can ' + + 'be found or an incomplete integration was provided.' + ); +} + +/** + * Date adapter (current used by the time scale) + * @namespace Chart._adapters._date + * @memberof Chart._adapters + * @private + */ + +/** + * Currently supported unit string values. + * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')} + * @memberof Chart._adapters._date + * @name Unit + */ + +/** + * @class + */ +function DateAdapter(options) { + this.options = options || {}; +} + +helpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */ { + /** + * Returns a map of time formats for the supported formatting units defined + * in Unit as well as 'datetime' representing a detailed date/time string. + * @returns {{string: string}} + */ + formats: abstract, + + /** + * Parses the given `value` and return the associated timestamp. + * @param {any} value - the value to parse (usually comes from the data) + * @param {string} [format] - the expected data format + * @returns {(number|null)} + * @function + */ + parse: abstract, + + /** + * Returns the formatted date in the specified `format` for a given `timestamp`. + * @param {number} timestamp - the timestamp to format + * @param {string} format - the date/time token + * @return {string} + * @function + */ + format: abstract, + + /** + * Adds the specified `amount` of `unit` to the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {number} amount - the amount to add + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + add: abstract, + + /** + * Returns the number of `unit` between the given timestamps. + * @param {number} max - the input timestamp (reference) + * @param {number} min - the timestamp to substract + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + diff: abstract, + + /** + * Returns start of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @param {number} [weekday] - the ISO day of the week with 1 being Monday + * and 7 being Sunday (only needed if param *unit* is `isoWeek`). + * @function + */ + startOf: abstract, + + /** + * Returns end of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @function + */ + endOf: abstract, + + // DEPRECATIONS + + /** + * Provided for backward compatibility for scale.getValueForPixel(), + * this method should be overridden only by the moment adapter. + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function(value) { + return value; + } +}); + +DateAdapter.override = function(members) { + helpers$1.extend(DateAdapter.prototype, members); +}; + +var _date = DateAdapter; + +var core_adapters = { + _date: _date +}; + +/** + * Namespace to hold static tick generation functions + * @namespace Chart.Ticks + */ +var core_ticks = { + /** + * Namespace to hold formatters for different types of ticks + * @namespace Chart.Ticks.formatters + */ + formatters: { + /** + * Formatter for value labels + * @method Chart.Ticks.formatters.values + * @param value the value to display + * @return {string|string[]} the label to display + */ + values: function(value) { + return helpers$1.isArray(value) ? value : '' + value; + }, + + /** + * Formatter for linear numeric ticks + * @method Chart.Ticks.formatters.linear + * @param tickValue {number} the value to be formatted + * @param index {number} the position of the tickValue parameter in the ticks array + * @param ticks {number[]} the list of ticks being converted + * @return {string} string representation of the tickValue parameter + */ + linear: function(tickValue, index, ticks) { + // If we have lots of ticks, don't use the ones + var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; + + // If we have a number like 2.5 as the delta, figure out how many decimal places we need + if (Math.abs(delta) > 1) { + if (tickValue !== Math.floor(tickValue)) { + // not an integer + delta = tickValue - Math.floor(tickValue); + } + } + + var logDelta = helpers$1.log10(Math.abs(delta)); + var tickString = ''; + + if (tickValue !== 0) { + var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1])); + if (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation + var logTick = helpers$1.log10(Math.abs(tickValue)); + tickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta)); + } else { + var numDecimal = -1 * Math.floor(logDelta); + numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places + tickString = tickValue.toFixed(numDecimal); + } + } else { + tickString = '0'; // never show decimal places for 0 + } + + return tickString; + }, + + logarithmic: function(tickValue, index, ticks) { + var remain = tickValue / (Math.pow(10, Math.floor(helpers$1.log10(tickValue)))); + + if (tickValue === 0) { + return '0'; + } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { + return tickValue.toExponential(); + } + return ''; + } + } +}; + +var valueOrDefault$9 = helpers$1.valueOrDefault; +var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault; + +core_defaults._set('scale', { + display: true, + position: 'left', + offset: false, + + // grid line settings + gridLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + drawBorder: true, + drawOnChartArea: true, + drawTicks: true, + tickMarkLength: 10, + zeroLineWidth: 1, + zeroLineColor: 'rgba(0,0,0,0.25)', + zeroLineBorderDash: [], + zeroLineBorderDashOffset: 0.0, + offsetGridLines: false, + borderDash: [], + borderDashOffset: 0.0 + }, + + // scale label + scaleLabel: { + // display property + display: false, + + // actual label + labelString: '', + + // top/bottom padding + padding: { + top: 4, + bottom: 4 + } + }, + + // label settings + ticks: { + beginAtZero: false, + minRotation: 0, + maxRotation: 50, + mirror: false, + padding: 0, + reverse: false, + display: true, + autoSkip: true, + autoSkipPadding: 0, + labelOffset: 0, + // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. + callback: core_ticks.formatters.values, + minor: {}, + major: {} + } +}); + +function labelsFromTicks(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(ticks[i].label); + } + + return labels; +} + +function getPixelForGridLine(scale, index, offsetGridLines) { + var lineValue = scale.getPixelForTick(index); + + if (offsetGridLines) { + if (scale.getTicks().length === 1) { + lineValue -= scale.isHorizontal() ? + Math.max(lineValue - scale.left, scale.right - lineValue) : + Math.max(lineValue - scale.top, scale.bottom - lineValue); + } else if (index === 0) { + lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; + } else { + lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; + } + } + return lineValue; +} + +function computeTextSize(context, tick, font) { + return helpers$1.isArray(tick) ? + helpers$1.longestText(context, font, tick) : + context.measureText(tick).width; +} + +var core_scale = core_element.extend({ + /** + * Get the padding needed for the scale + * @method getPadding + * @private + * @returns {Padding} the necessary padding + */ + getPadding: function() { + var me = this; + return { + left: me.paddingLeft || 0, + top: me.paddingTop || 0, + right: me.paddingRight || 0, + bottom: me.paddingBottom || 0 + }; + }, + + /** + * Returns the scale tick objects ({label, major}) + * @since 2.7 + */ + getTicks: function() { + return this._ticks; + }, + + // These methods are ordered by lifecyle. Utilities then follow. + // Any function defined here is inherited by all scale types. + // Any function can be extended by the scale type + + mergeTicksOptions: function() { + var ticks = this.options.ticks; + if (ticks.minor === false) { + ticks.minor = { + display: false + }; + } + if (ticks.major === false) { + ticks.major = { + display: false + }; + } + for (var key in ticks) { + if (key !== 'major' && key !== 'minor') { + if (typeof ticks.minor[key] === 'undefined') { + ticks.minor[key] = ticks[key]; + } + if (typeof ticks.major[key] === 'undefined') { + ticks.major[key] = ticks[key]; + } + } + } + }, + beforeUpdate: function() { + helpers$1.callback(this.options.beforeUpdate, [this]); + }, + + update: function(maxWidth, maxHeight, margins) { + var me = this; + var i, ilen, labels, label, ticks, tick; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = helpers$1.extend({ + left: 0, + right: 0, + top: 0, + bottom: 0 + }, margins); + + me._maxLabelLines = 0; + me.longestLabelWidth = 0; + me.longestTextCache = me.longestTextCache || {}; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + + // Data min/max + me.beforeDataLimits(); + me.determineDataLimits(); + me.afterDataLimits(); + + // Ticks - `this.ticks` is now DEPRECATED! + // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member + // and must not be accessed directly from outside this class. `this.ticks` being + // around for long time and not marked as private, we can't change its structure + // without unexpected breaking changes. If you need to access the scale ticks, + // use scale.getTicks() instead. + + me.beforeBuildTicks(); + + // New implementations should return an array of objects but for BACKWARD COMPAT, + // we still support no return (`this.ticks` internally set by calling this method). + ticks = me.buildTicks() || []; + + // Allow modification of ticks in callback. + ticks = me.afterBuildTicks(ticks) || ticks; + + me.beforeTickToLabelConversion(); + + // New implementations should return the formatted tick labels but for BACKWARD + // COMPAT, we still support no return (`this.ticks` internally changed by calling + // this method and supposed to contain only string values). + labels = me.convertTicksToLabels(ticks) || me.ticks; + + me.afterTickToLabelConversion(); + + me.ticks = labels; // BACKWARD COMPATIBILITY + + // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! + + // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) + for (i = 0, ilen = labels.length; i < ilen; ++i) { + label = labels[i]; + tick = ticks[i]; + if (!tick) { + ticks.push(tick = { + label: label, + major: false + }); + } else { + tick.label = label; + } + } + + me._ticks = ticks; + + // Tick Rotation + me.beforeCalculateTickRotation(); + me.calculateTickRotation(); + me.afterCalculateTickRotation(); + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: function() { + helpers$1.callback(this.options.afterUpdate, [this]); + }, + + // + + beforeSetDimensions: function() { + helpers$1.callback(this.options.beforeSetDimensions, [this]); + }, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + }, + afterSetDimensions: function() { + helpers$1.callback(this.options.afterSetDimensions, [this]); + }, + + // Data limits + beforeDataLimits: function() { + helpers$1.callback(this.options.beforeDataLimits, [this]); + }, + determineDataLimits: helpers$1.noop, + afterDataLimits: function() { + helpers$1.callback(this.options.afterDataLimits, [this]); + }, + + // + beforeBuildTicks: function() { + helpers$1.callback(this.options.beforeBuildTicks, [this]); + }, + buildTicks: helpers$1.noop, + afterBuildTicks: function(ticks) { + var me = this; + // ticks is empty for old axis implementations here + if (helpers$1.isArray(ticks) && ticks.length) { + return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]); + } + // Support old implementations (that modified `this.ticks` directly in buildTicks) + me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks; + return ticks; + }, + + beforeTickToLabelConversion: function() { + helpers$1.callback(this.options.beforeTickToLabelConversion, [this]); + }, + convertTicksToLabels: function() { + var me = this; + // Convert ticks to strings + var tickOpts = me.options.ticks; + me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); + }, + afterTickToLabelConversion: function() { + helpers$1.callback(this.options.afterTickToLabelConversion, [this]); + }, + + // + + beforeCalculateTickRotation: function() { + helpers$1.callback(this.options.beforeCalculateTickRotation, [this]); + }, + calculateTickRotation: function() { + var me = this; + var context = me.ctx; + var tickOpts = me.options.ticks; + var labels = labelsFromTicks(me._ticks); + + // Get the width of each grid by calculating the difference + // between x offsets between 0 and 1. + var tickFont = helpers$1.options._parseFont(tickOpts); + context.font = tickFont.string; + + var labelRotation = tickOpts.minRotation || 0; + + if (labels.length && me.options.display && me.isHorizontal()) { + var originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache); + var labelWidth = originalLabelWidth; + var cosRotation, sinRotation; + + // Allow 3 pixels x2 padding either side for label readability + var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; + + // Max label rotation can be set or default to 90 - also act as a loop counter + while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { + var angleRadians = helpers$1.toRadians(labelRotation); + cosRotation = Math.cos(angleRadians); + sinRotation = Math.sin(angleRadians); + + if (sinRotation * originalLabelWidth > me.maxHeight) { + // go back one step + labelRotation--; + break; + } + + labelRotation++; + labelWidth = cosRotation * originalLabelWidth; + } + } + + me.labelRotation = labelRotation; + }, + afterCalculateTickRotation: function() { + helpers$1.callback(this.options.afterCalculateTickRotation, [this]); + }, + + // + + beforeFit: function() { + helpers$1.callback(this.options.beforeFit, [this]); + }, + fit: function() { + var me = this; + // Reset + var minSize = me.minSize = { + width: 0, + height: 0 + }; + + var labels = labelsFromTicks(me._ticks); + + var opts = me.options; + var tickOpts = opts.ticks; + var scaleLabelOpts = opts.scaleLabel; + var gridLineOpts = opts.gridLines; + var display = me._isVisible(); + var position = opts.position; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var tickFont = parseFont(tickOpts); + var tickMarkLength = opts.gridLines.tickMarkLength; + + // Width + if (isHorizontal) { + // subtract the margins to line up with the chartArea if we are a full width scale + minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; + } else { + minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } + + // height + if (isHorizontal) { + minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } else { + minSize.height = me.maxHeight; // fill all the height + } + + // Are we showing a title for the scale? + if (scaleLabelOpts.display && display) { + var scaleLabelFont = parseFont(scaleLabelOpts); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding); + var deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height; + + if (isHorizontal) { + minSize.height += deltaHeight; + } else { + minSize.width += deltaHeight; + } + } + + // Don't bother fitting the ticks if we are not showing the labels + if (tickOpts.display && display) { + var largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache); + var tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels); + var lineSpace = tickFont.size * 0.5; + var tickPadding = me.options.ticks.padding; + + // Store max number of lines and widest label for _autoSkip + me._maxLabelLines = tallestLabelHeightInLines; + me.longestLabelWidth = largestTextWidth; + + if (isHorizontal) { + var angleRadians = helpers$1.toRadians(me.labelRotation); + var cosRotation = Math.cos(angleRadians); + var sinRotation = Math.sin(angleRadians); + + // TODO - improve this calculation + var labelHeight = (sinRotation * largestTextWidth) + + (tickFont.lineHeight * tallestLabelHeightInLines) + + lineSpace; // padding + + minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); + + me.ctx.font = tickFont.string; + var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string); + var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string); + var offsetLeft = me.getPixelForTick(0) - me.left; + var offsetRight = me.right - me.getPixelForTick(labels.length - 1); + var paddingLeft, paddingRight; + + // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned + // which means that the right padding is dominated by the font height + if (me.labelRotation !== 0) { + paddingLeft = position === 'bottom' ? (cosRotation * firstLabelWidth) : (cosRotation * lineSpace); + paddingRight = position === 'bottom' ? (cosRotation * lineSpace) : (cosRotation * lastLabelWidth); + } else { + paddingLeft = firstLabelWidth / 2; + paddingRight = lastLabelWidth / 2; + } + me.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges + me.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3; + } else { + // A vertical axis is more constrained by the width. Labels are the + // dominant factor here, so get that length first and account for padding + if (tickOpts.mirror) { + largestTextWidth = 0; + } else { + // use lineSpace for consistency with horizontal axis + // tickPadding is not implemented for horizontal + largestTextWidth += tickPadding + lineSpace; + } + + minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); + + me.paddingTop = tickFont.size / 2; + me.paddingBottom = tickFont.size / 2; + } + } + + me.handleMargins(); + + me.width = minSize.width; + me.height = minSize.height; + }, + + /** + * Handle margins and padding interactions + * @private + */ + handleMargins: function() { + var me = this; + if (me.margins) { + me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); + me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); + me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); + me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); + } + }, + + afterFit: function() { + helpers$1.callback(this.options.afterFit, [this]); + }, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + isFullWidth: function() { + return (this.options.fullWidth); + }, + + // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not + getRightValue: function(rawValue) { + // Null and undefined values first + if (helpers$1.isNullOrUndef(rawValue)) { + return NaN; + } + // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values + if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) { + return NaN; + } + // If it is in fact an object, dive in one more level + if (rawValue) { + if (this.isHorizontal()) { + if (rawValue.x !== undefined) { + return this.getRightValue(rawValue.x); + } + } else if (rawValue.y !== undefined) { + return this.getRightValue(rawValue.y); + } + } + + // Value is good, return it + return rawValue; + }, + + /** + * Used to get the value to display in the tooltip for the data at the given index + * @param index + * @param datasetIndex + */ + getLabelForIndex: helpers$1.noop, + + /** + * Returns the location of the given data point. Value can either be an index or a numerical value + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param value + * @param index + * @param datasetIndex + */ + getPixelForValue: helpers$1.noop, + + /** + * Used to get the data value from a given pixel. This is the inverse of getPixelForValue + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param pixel + */ + getValueForPixel: helpers$1.noop, + + /** + * Returns the location of the tick at the given index + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForTick: function(index) { + var me = this; + var offset = me.options.offset; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var pixel = (tickWidth * index) + me.paddingLeft; + + if (offset) { + pixel += tickWidth / 2; + } + + var finalVal = me.left + pixel; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + var innerHeight = me.height - (me.paddingTop + me.paddingBottom); + return me.top + (index * (innerHeight / (me._ticks.length - 1))); + }, + + /** + * Utility for getting the pixel location of a percentage of scale + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForDecimal: function(decimal) { + var me = this; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var valueOffset = (innerWidth * decimal) + me.paddingLeft; + + var finalVal = me.left + valueOffset; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + return me.top + (decimal * me.height); + }, + + /** + * Returns the pixel for the minimum chart value + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getBasePixel: function() { + return this.getPixelForValue(this.getBaseValue()); + }, + + getBaseValue: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0; + }, + + /** + * Returns a subset of ticks to be plotted to avoid overlapping labels. + * @private + */ + _autoSkip: function(ticks) { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + var tickCount = ticks.length; + var skipRatio = false; + var maxTicks = optionTicks.maxTicksLimit; + + // Total space needed to display all ticks. First and last ticks are + // drawn as their center at end of axis, so tickCount-1 + var ticksLength = me._tickSize() * (tickCount - 1); + + // Axis length + var axisLength = isHorizontal + ? me.width - (me.paddingLeft + me.paddingRight) + : me.height - (me.paddingTop + me.PaddingBottom); + + var result = []; + var i, tick; + + if (ticksLength > axisLength) { + skipRatio = 1 + Math.floor(ticksLength / axisLength); + } + + // if they defined a max number of optionTicks, + // increase skipRatio until that number is met + if (tickCount > maxTicks) { + skipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks)); + } + + for (i = 0; i < tickCount; i++) { + tick = ticks[i]; + + if (skipRatio > 1 && i % skipRatio > 0) { + // leave tick in place but make sure it's not displayed (#4635) + delete tick.label; + } + result.push(tick); + } + return result; + }, + + /** + * @private + */ + _tickSize: function() { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + + // Calculate space needed by label in axis direction. + var rot = helpers$1.toRadians(me.labelRotation); + var cos = Math.abs(Math.cos(rot)); + var sin = Math.abs(Math.sin(rot)); + + var padding = optionTicks.autoSkipPadding || 0; + var w = (me.longestLabelWidth + padding) || 0; + + var tickFont = helpers$1.options._parseFont(optionTicks); + var h = (me._maxLabelLines * tickFont.lineHeight + padding) || 0; + + // Calculate space needed for 1 tick in axis direction. + return isHorizontal + ? h * cos > w * sin ? w / cos : h / sin + : h * sin < w * cos ? h / cos : w / sin; + }, + + /** + * @private + */ + _isVisible: function() { + var me = this; + var chart = me.chart; + var display = me.options.display; + var i, ilen, meta; + + if (display !== 'auto') { + return !!display; + } + + // When 'auto', the scale is visible if at least one associated dataset is visible. + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + if (meta.xAxisID === me.id || meta.yAxisID === me.id) { + return true; + } + } + } + + return false; + }, + + /** + * Actually draw the scale on the canvas + * @param {object} chartArea - the area of the chart to draw full grid lines on + */ + draw: function(chartArea) { + var me = this; + var options = me.options; + + if (!me._isVisible()) { + return; + } + + var chart = me.chart; + var context = me.ctx; + var globalDefaults = core_defaults.global; + var defaultFontColor = globalDefaults.defaultFontColor; + var optionTicks = options.ticks.minor; + var optionMajorTicks = options.ticks.major || optionTicks; + var gridLines = options.gridLines; + var scaleLabel = options.scaleLabel; + var position = options.position; + + var isRotated = me.labelRotation !== 0; + var isMirrored = optionTicks.mirror; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); + var tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor); + var tickFont = parseFont(optionTicks); + var lineHeight = tickFont.lineHeight; + var majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor); + var majorTickFont = parseFont(optionMajorTicks); + var tickPadding = optionTicks.padding; + var labelOffset = optionTicks.labelOffset; + + var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; + + var scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor); + var scaleLabelFont = parseFont(scaleLabel); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding); + var labelRotationRadians = helpers$1.toRadians(me.labelRotation); + + var itemsToDraw = []; + + var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0; + var alignPixel = helpers$1._alignPixel; + var borderValue, tickStart, tickEnd; + + if (position === 'top') { + borderValue = alignPixel(chart, me.bottom, axisWidth); + tickStart = me.bottom - tl; + tickEnd = borderValue - axisWidth / 2; + } else if (position === 'bottom') { + borderValue = alignPixel(chart, me.top, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.top + tl; + } else if (position === 'left') { + borderValue = alignPixel(chart, me.right, axisWidth); + tickStart = me.right - tl; + tickEnd = borderValue - axisWidth / 2; + } else { + borderValue = alignPixel(chart, me.left, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.left + tl; + } + + var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error. + + helpers$1.each(ticks, function(tick, index) { + // autoskipper skipped this tick (#4635) + if (helpers$1.isNullOrUndef(tick.label)) { + return; + } + + var label = tick.label; + var lineWidth, lineColor, borderDash, borderDashOffset; + if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { + // Draw the first index specially + lineWidth = gridLines.zeroLineWidth; + lineColor = gridLines.zeroLineColor; + borderDash = gridLines.zeroLineBorderDash || []; + borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0; + } else { + lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index); + lineColor = valueAtIndexOrDefault(gridLines.color, index); + borderDash = gridLines.borderDash || []; + borderDashOffset = gridLines.borderDashOffset || 0.0; + } + + // Common properties + var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign; + var labelCount = helpers$1.isArray(label) ? label.length : 1; + var lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines); + + if (isHorizontal) { + var labelYOffset = tl + tickPadding; + + if (lineValue < me.left - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth); + ty1 = tickStart; + ty2 = tickEnd; + labelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option) + + if (position === 'top') { + y1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2; + y2 = chartArea.bottom; + textOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight; + textAlign = !isRotated ? 'center' : 'left'; + labelY = me.bottom - labelYOffset; + } else { + y1 = chartArea.top; + y2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2; + textOffset = (!isRotated ? 0.5 : 0) * lineHeight; + textAlign = !isRotated ? 'center' : 'right'; + labelY = me.top + labelYOffset; + } + } else { + var labelXOffset = (isMirrored ? 0 : tl) + tickPadding; + + if (lineValue < me.top - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tickStart; + tx2 = tickEnd; + ty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth); + labelY = me.getPixelForTick(index) + labelOffset; + textOffset = (1 - labelCount) * lineHeight / 2; + + if (position === 'left') { + x1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2; + x2 = chartArea.right; + textAlign = isMirrored ? 'left' : 'right'; + labelX = me.right - labelXOffset; + } else { + x1 = chartArea.left; + x2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2; + textAlign = isMirrored ? 'right' : 'left'; + labelX = me.left + labelXOffset; + } + } + + itemsToDraw.push({ + tx1: tx1, + ty1: ty1, + tx2: tx2, + ty2: ty2, + x1: x1, + y1: y1, + x2: x2, + y2: y2, + labelX: labelX, + labelY: labelY, + glWidth: lineWidth, + glColor: lineColor, + glBorderDash: borderDash, + glBorderDashOffset: borderDashOffset, + rotation: -1 * labelRotationRadians, + label: label, + major: tick.major, + textOffset: textOffset, + textAlign: textAlign + }); + }); + + // Draw all of the tick labels, tick marks, and grid lines at the correct places + helpers$1.each(itemsToDraw, function(itemToDraw) { + var glWidth = itemToDraw.glWidth; + var glColor = itemToDraw.glColor; + + if (gridLines.display && glWidth && glColor) { + context.save(); + context.lineWidth = glWidth; + context.strokeStyle = glColor; + if (context.setLineDash) { + context.setLineDash(itemToDraw.glBorderDash); + context.lineDashOffset = itemToDraw.glBorderDashOffset; + } + + context.beginPath(); + + if (gridLines.drawTicks) { + context.moveTo(itemToDraw.tx1, itemToDraw.ty1); + context.lineTo(itemToDraw.tx2, itemToDraw.ty2); + } + + if (gridLines.drawOnChartArea) { + context.moveTo(itemToDraw.x1, itemToDraw.y1); + context.lineTo(itemToDraw.x2, itemToDraw.y2); + } + + context.stroke(); + context.restore(); + } + + if (optionTicks.display) { + // Make sure we draw text in the correct color and font + context.save(); + context.translate(itemToDraw.labelX, itemToDraw.labelY); + context.rotate(itemToDraw.rotation); + context.font = itemToDraw.major ? majorTickFont.string : tickFont.string; + context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; + context.textBaseline = 'middle'; + context.textAlign = itemToDraw.textAlign; + + var label = itemToDraw.label; + var y = itemToDraw.textOffset; + if (helpers$1.isArray(label)) { + for (var i = 0; i < label.length; ++i) { + // We just make sure the multiline element is a string here.. + context.fillText('' + label[i], 0, y); + y += lineHeight; + } + } else { + context.fillText(label, 0, y); + } + context.restore(); + } + }); + + if (scaleLabel.display) { + // Draw the scale label + var scaleLabelX; + var scaleLabelY; + var rotation = 0; + var halfLineHeight = scaleLabelFont.lineHeight / 2; + + if (isHorizontal) { + scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width + scaleLabelY = position === 'bottom' + ? me.bottom - halfLineHeight - scaleLabelPadding.bottom + : me.top + halfLineHeight + scaleLabelPadding.top; + } else { + var isLeft = position === 'left'; + scaleLabelX = isLeft + ? me.left + halfLineHeight + scaleLabelPadding.top + : me.right - halfLineHeight - scaleLabelPadding.top; + scaleLabelY = me.top + ((me.bottom - me.top) / 2); + rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; + } + + context.save(); + context.translate(scaleLabelX, scaleLabelY); + context.rotate(rotation); + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.fillStyle = scaleLabelFontColor; // render in correct colour + context.font = scaleLabelFont.string; + context.fillText(scaleLabel.labelString, 0, 0); + context.restore(); + } + + if (axisWidth) { + // Draw the line at the edge of the axis + var firstLineWidth = axisWidth; + var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0); + var x1, x2, y1, y2; + + if (isHorizontal) { + x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2; + x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2; + y1 = y2 = borderValue; + } else { + y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2; + y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2; + x1 = x2 = borderValue; + } + + context.lineWidth = axisWidth; + context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0); + context.beginPath(); + context.moveTo(x1, y1); + context.lineTo(x2, y2); + context.stroke(); + } + } +}); + +var defaultConfig = { + position: 'bottom' +}; + +var scale_category = core_scale.extend({ + /** + * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those + * else fall back to data.labels + * @private + */ + getLabels: function() { + var data = this.chart.data; + return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; + }, + + determineDataLimits: function() { + var me = this; + var labels = me.getLabels(); + me.minIndex = 0; + me.maxIndex = labels.length - 1; + var findIndex; + + if (me.options.ticks.min !== undefined) { + // user specified min value + findIndex = labels.indexOf(me.options.ticks.min); + me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; + } + + if (me.options.ticks.max !== undefined) { + // user specified max value + findIndex = labels.indexOf(me.options.ticks.max); + me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; + } + + me.min = labels[me.minIndex]; + me.max = labels[me.maxIndex]; + }, + + buildTicks: function() { + var me = this; + var labels = me.getLabels(); + // If we are viewing some subset of labels, slice the original array + me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var chart = me.chart; + + if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) { + return me.getRightValue(chart.data.datasets[datasetIndex].data[index]); + } + + return me.ticks[index - me.minIndex]; + }, + + // Used to get data value locations. Value can either be an index or a numerical value + getPixelForValue: function(value, index) { + var me = this; + var offset = me.options.offset; + // 1 is added because we need the length but we have the indexes + var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); + + // If value is a data object, then index is the index in the data array, + // not the index of the scale. We need to change that. + var valueCategory; + if (value !== undefined && value !== null) { + valueCategory = me.isHorizontal() ? value.x : value.y; + } + if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { + var labels = me.getLabels(); + value = valueCategory || value; + var idx = labels.indexOf(value); + index = idx !== -1 ? idx : index; + } + + if (me.isHorizontal()) { + var valueWidth = me.width / offsetAmt; + var widthOffset = (valueWidth * (index - me.minIndex)); + + if (offset) { + widthOffset += (valueWidth / 2); + } + + return me.left + widthOffset; + } + var valueHeight = me.height / offsetAmt; + var heightOffset = (valueHeight * (index - me.minIndex)); + + if (offset) { + heightOffset += (valueHeight / 2); + } + + return me.top + heightOffset; + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); + }, + + getValueForPixel: function(pixel) { + var me = this; + var offset = me.options.offset; + var value; + var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var horz = me.isHorizontal(); + var valueDimension = (horz ? me.width : me.height) / offsetAmt; + + pixel -= horz ? me.left : me.top; + + if (offset) { + pixel -= (valueDimension / 2); + } + + if (pixel <= 0) { + value = 0; + } else { + value = Math.round(pixel / valueDimension); + } + + return value + me.minIndex; + }, + + getBasePixel: function() { + return this.bottom; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults = defaultConfig; +scale_category._defaults = _defaults; + +var noop = helpers$1.noop; +var isNullOrUndef = helpers$1.isNullOrUndef; + +/** + * Generate a set of linear ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ +function generateTicks(generationOptions, dataRange) { + var ticks = []; + // To get a "nice" value for the tick spacing, we will use the appropriately named + // "nice number" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks + // for details. + + var MIN_SPACING = 1e-14; + var stepSize = generationOptions.stepSize; + var unit = stepSize || 1; + var maxNumSpaces = generationOptions.maxTicks - 1; + var min = generationOptions.min; + var max = generationOptions.max; + var precision = generationOptions.precision; + var rmin = dataRange.min; + var rmax = dataRange.max; + var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit; + var factor, niceMin, niceMax, numSpaces; + + // Beyond MIN_SPACING floating point numbers being to lose precision + // such that we can't do the math necessary to generate ticks + if (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) { + return [rmin, rmax]; + } + + numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); + if (numSpaces > maxNumSpaces) { + // If the calculated num of spaces exceeds maxNumSpaces, recalculate it + spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit; + } + + if (stepSize || isNullOrUndef(precision)) { + // If a precision is not specified, calculate factor based on spacing + factor = Math.pow(10, helpers$1._decimalPlaces(spacing)); + } else { + // If the user specified a precision, round to that number of decimal places + factor = Math.pow(10, precision); + spacing = Math.ceil(spacing * factor) / factor; + } + + niceMin = Math.floor(rmin / spacing) * spacing; + niceMax = Math.ceil(rmax / spacing) * spacing; + + // If min, max and stepSize is set and they make an evenly spaced scale use it. + if (stepSize) { + // If very close to our whole number, use it. + if (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) { + niceMin = min; + } + if (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) { + niceMax = max; + } + } + + numSpaces = (niceMax - niceMin) / spacing; + // If very close to our rounded value, use it. + if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { + numSpaces = Math.round(numSpaces); + } else { + numSpaces = Math.ceil(numSpaces); + } + + niceMin = Math.round(niceMin * factor) / factor; + niceMax = Math.round(niceMax * factor) / factor; + ticks.push(isNullOrUndef(min) ? niceMin : min); + for (var j = 1; j < numSpaces; ++j) { + ticks.push(Math.round((niceMin + j * spacing) * factor) / factor); + } + ticks.push(isNullOrUndef(max) ? niceMax : max); + + return ticks; +} + +var scale_linearbase = core_scale.extend({ + getRightValue: function(value) { + if (typeof value === 'string') { + return +value; + } + return core_scale.prototype.getRightValue.call(this, value); + }, + + handleTickRangeOptions: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, + // do nothing since that would make the chart weird. If the user really wants a weird chart + // axis, they can manually override it + if (tickOpts.beginAtZero) { + var minSign = helpers$1.sign(me.min); + var maxSign = helpers$1.sign(me.max); + + if (minSign < 0 && maxSign < 0) { + // move the top up to 0 + me.max = 0; + } else if (minSign > 0 && maxSign > 0) { + // move the bottom down to 0 + me.min = 0; + } + } + + var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; + var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; + + if (tickOpts.min !== undefined) { + me.min = tickOpts.min; + } else if (tickOpts.suggestedMin !== undefined) { + if (me.min === null) { + me.min = tickOpts.suggestedMin; + } else { + me.min = Math.min(me.min, tickOpts.suggestedMin); + } + } + + if (tickOpts.max !== undefined) { + me.max = tickOpts.max; + } else if (tickOpts.suggestedMax !== undefined) { + if (me.max === null) { + me.max = tickOpts.suggestedMax; + } else { + me.max = Math.max(me.max, tickOpts.suggestedMax); + } + } + + if (setMin !== setMax) { + // We set the min or the max but not both. + // So ensure that our range is good + // Inverted or 0 length range can happen when + // ticks.min is set, and no datasets are visible + if (me.min >= me.max) { + if (setMin) { + me.max = me.min + 1; + } else { + me.min = me.max - 1; + } + } + } + + if (me.min === me.max) { + me.max++; + + if (!tickOpts.beginAtZero) { + me.min--; + } + } + }, + + getTickLimit: function() { + var me = this; + var tickOpts = me.options.ticks; + var stepSize = tickOpts.stepSize; + var maxTicksLimit = tickOpts.maxTicksLimit; + var maxTicks; + + if (stepSize) { + maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1; + } else { + maxTicks = me._computeTickLimit(); + maxTicksLimit = maxTicksLimit || 11; + } + + if (maxTicksLimit) { + maxTicks = Math.min(maxTicksLimit, maxTicks); + } + + return maxTicks; + }, + + _computeTickLimit: function() { + return Number.POSITIVE_INFINITY; + }, + + handleDirectionalChanges: noop, + + buildTicks: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // Figure out what the max number of ticks we can support it is based on the size of + // the axis area. For now, we say that the minimum tick spacing in pixels must be 40 + // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on + // the graph. Make sure we always have at least 2 ticks + var maxTicks = me.getTickLimit(); + maxTicks = Math.max(2, maxTicks); + + var numericGeneratorOptions = { + maxTicks: maxTicks, + min: tickOpts.min, + max: tickOpts.max, + precision: tickOpts.precision, + stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) + }; + var ticks = me.ticks = generateTicks(numericGeneratorOptions, me); + + me.handleDirectionalChanges(); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + ticks.reverse(); + + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + }, + + convertTicksToLabels: function() { + var me = this; + me.ticksAsNumbers = me.ticks.slice(); + me.zeroLineIndex = me.ticks.indexOf(0); + + core_scale.prototype.convertTicksToLabels.call(me); + } +}); + +var defaultConfig$1 = { + position: 'left', + ticks: { + callback: core_ticks.formatters.linear + } +}; + +var scale_linear = scale_linearbase.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + var DEFAULT_MIN = 0; + var DEFAULT_MAX = 1; + + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // First Calculate the range + me.min = null; + me.max = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = { + positiveValues: [], + negativeValues: [] + }; + } + + // Store these per type + var positiveValues = valuesPerStack[key].positiveValues; + var negativeValues = valuesPerStack[key].negativeValues; + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + positiveValues[index] = positiveValues[index] || 0; + negativeValues[index] = negativeValues[index] || 0; + + if (opts.relativePoints) { + positiveValues[index] = 100; + } else if (value < 0) { + negativeValues[index] += value; + } else { + positiveValues[index] += value; + } + }); + } + }); + + helpers$1.each(valuesPerStack, function(valuesForType) { + var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); + var minVal = helpers$1.min(values); + var maxVal = helpers$1.max(values); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + }); + + } else { + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + }); + } + }); + } + + me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; + me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + this.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function() { + var me = this; + var tickFont; + + if (me.isHorizontal()) { + return Math.ceil(me.width / 40); + } + tickFont = helpers$1.options._parseFont(me.options.ticks); + return Math.ceil(me.height / tickFont.lineHeight); + }, + + // Called after the ticks are built. We need + handleDirectionalChanges: function() { + if (!this.isHorizontal()) { + // We are in a vertical orientation. The top value is the highest. So reverse the array + this.ticks.reverse(); + } + }, + + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + // Utils + getPixelForValue: function(value) { + // This must be called after fit has been run so that + // this.left, this.top, this.right, and this.bottom have been defined + var me = this; + var start = me.start; + + var rightValue = +me.getRightValue(value); + var pixel; + var range = me.end - start; + + if (me.isHorizontal()) { + pixel = me.left + (me.width / range * (rightValue - start)); + } else { + pixel = me.bottom - (me.height / range * (rightValue - start)); + } + return pixel; + }, + + getValueForPixel: function(pixel) { + var me = this; + var isHorizontal = me.isHorizontal(); + var innerDimension = isHorizontal ? me.width : me.height; + var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; + return me.start + ((me.end - me.start) * offset); + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticksAsNumbers[index]); + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$1 = defaultConfig$1; +scale_linear._defaults = _defaults$1; + +var valueOrDefault$a = helpers$1.valueOrDefault; + +/** + * Generate a set of logarithmic ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ +function generateTicks$1(generationOptions, dataRange) { + var ticks = []; + + var tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min)))); + + var endExp = Math.floor(helpers$1.log10(dataRange.max)); + var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); + var exp, significand; + + if (tickVal === 0) { + exp = Math.floor(helpers$1.log10(dataRange.minNotZero)); + significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); + + ticks.push(tickVal); + tickVal = significand * Math.pow(10, exp); + } else { + exp = Math.floor(helpers$1.log10(tickVal)); + significand = Math.floor(tickVal / Math.pow(10, exp)); + } + var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; + + do { + ticks.push(tickVal); + + ++significand; + if (significand === 10) { + significand = 1; + ++exp; + precision = exp >= 0 ? 1 : precision; + } + + tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision; + } while (exp < endExp || (exp === endExp && significand < endSignificand)); + + var lastTick = valueOrDefault$a(generationOptions.max, tickVal); + ticks.push(lastTick); + + return ticks; +} + +var defaultConfig$2 = { + position: 'left', + + // label settings + ticks: { + callback: core_ticks.formatters.logarithmic + } +}; + +// TODO(v3): change this to positiveOrDefault +function nonNegativeOrDefault(value, defaultValue) { + return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue; +} + +var scale_logarithmic = core_scale.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // Calculate Range + me.min = null; + me.max = null; + me.minNotZero = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = []; + } + + helpers$1.each(dataset.data, function(rawValue, index) { + var values = valuesPerStack[key]; + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + values[index] = values[index] || 0; + values[index] += value; + }); + } + }); + + helpers$1.each(valuesPerStack, function(valuesForType) { + if (valuesForType.length > 0) { + var minVal = helpers$1.min(valuesForType); + var maxVal = helpers$1.max(valuesForType); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + } + }); + + } else { + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + + if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { + me.minNotZero = value; + } + }); + } + }); + } + + // Common base implementation to handle ticks.min, ticks.max + this.handleTickRangeOptions(); + }, + + handleTickRangeOptions: function() { + var me = this; + var tickOpts = me.options.ticks; + var DEFAULT_MIN = 1; + var DEFAULT_MAX = 10; + + me.min = nonNegativeOrDefault(tickOpts.min, me.min); + me.max = nonNegativeOrDefault(tickOpts.max, me.max); + + if (me.min === me.max) { + if (me.min !== 0 && me.min !== null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1); + me.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1); + } else { + me.min = DEFAULT_MIN; + me.max = DEFAULT_MAX; + } + } + if (me.min === null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1); + } + if (me.max === null) { + me.max = me.min !== 0 + ? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1) + : DEFAULT_MAX; + } + if (me.minNotZero === null) { + if (me.min > 0) { + me.minNotZero = me.min; + } else if (me.max < 1) { + me.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max))); + } else { + me.minNotZero = DEFAULT_MIN; + } + } + }, + + buildTicks: function() { + var me = this; + var tickOpts = me.options.ticks; + var reverse = !me.isHorizontal(); + + var generationOptions = { + min: nonNegativeOrDefault(tickOpts.min), + max: nonNegativeOrDefault(tickOpts.max) + }; + var ticks = me.ticks = generateTicks$1(generationOptions, me); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + reverse = !reverse; + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + if (reverse) { + ticks.reverse(); + } + }, + + convertTicksToLabels: function() { + this.tickValues = this.ticks.slice(); + + core_scale.prototype.convertTicksToLabels.call(this); + }, + + // Get the correct tooltip label + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.tickValues[index]); + }, + + /** + * Returns the value of the first tick. + * @param {number} value - The minimum not zero value. + * @return {number} The first tick value. + * @private + */ + _getFirstTickValue: function(value) { + var exp = Math.floor(helpers$1.log10(value)); + var significand = Math.floor(value / Math.pow(10, exp)); + + return significand * Math.pow(10, exp); + }, + + getPixelForValue: function(value) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var offset = 0; + var innerDimension, pixel, start, end, sign; + + value = +me.getRightValue(value); + if (reverse) { + start = me.end; + end = me.start; + sign = -1; + } else { + start = me.start; + end = me.end; + sign = 1; + } + if (me.isHorizontal()) { + innerDimension = me.width; + pixel = reverse ? me.right : me.left; + } else { + innerDimension = me.height; + sign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0) + pixel = reverse ? me.top : me.bottom; + } + if (value !== start) { + if (start === 0) { // include zero tick + offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + innerDimension -= offset; + start = firstTickValue; + } + if (value !== 0) { + offset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start)); + } + pixel += sign * offset; + } + return pixel; + }, + + getValueForPixel: function(pixel) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var innerDimension, start, end, value; + + if (reverse) { + start = me.end; + end = me.start; + } else { + start = me.start; + end = me.end; + } + if (me.isHorizontal()) { + innerDimension = me.width; + value = reverse ? me.right - pixel : pixel - me.left; + } else { + innerDimension = me.height; + value = reverse ? pixel - me.top : me.bottom - pixel; + } + if (value !== start) { + if (start === 0) { // include zero tick + var offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + value -= offset; + innerDimension -= offset; + start = firstTickValue; + } + value *= log10(end) - log10(start); + value /= innerDimension; + value = Math.pow(10, log10(start) + value); + } + return value; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$2 = defaultConfig$2; +scale_logarithmic._defaults = _defaults$2; + +var valueOrDefault$b = helpers$1.valueOrDefault; +var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault; +var resolve$7 = helpers$1.options.resolve; + +var defaultConfig$3 = { + display: true, + + // Boolean - Whether to animate scaling the chart from the centre + animate: true, + position: 'chartArea', + + angleLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + borderDash: [], + borderDashOffset: 0.0 + }, + + gridLines: { + circular: false + }, + + // label settings + ticks: { + // Boolean - Show a backdrop to the scale label + showLabelBackdrop: true, + + // String - The colour of the label backdrop + backdropColor: 'rgba(255,255,255,0.75)', + + // Number - The backdrop padding above & below the label in pixels + backdropPaddingY: 2, + + // Number - The backdrop padding to the side of the label in pixels + backdropPaddingX: 2, + + callback: core_ticks.formatters.linear + }, + + pointLabels: { + // Boolean - if true, show point labels + display: true, + + // Number - Point label font size in pixels + fontSize: 10, + + // Function - Used to convert point labels + callback: function(label) { + return label; + } + } +}; + +function getValueCount(scale) { + var opts = scale.options; + return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; +} + +function getTickBackdropHeight(opts) { + var tickOpts = opts.ticks; + + if (tickOpts.display && opts.display) { + return valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2; + } + return 0; +} + +function measureLabelSize(ctx, lineHeight, label) { + if (helpers$1.isArray(label)) { + return { + w: helpers$1.longestText(ctx, ctx.font, label), + h: label.length * lineHeight + }; + } + + return { + w: ctx.measureText(label).width, + h: lineHeight + }; +} + +function determineLimits(angle, pos, size, min, max) { + if (angle === min || angle === max) { + return { + start: pos - (size / 2), + end: pos + (size / 2) + }; + } else if (angle < min || angle > max) { + return { + start: pos - size, + end: pos + }; + } + + return { + start: pos, + end: pos + size + }; +} + +/** + * Helper function to fit a radial linear scale with point labels + */ +function fitWithPointLabels(scale) { + + // Right, this is really confusing and there is a lot of maths going on here + // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + // + // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + // + // Solution: + // + // We assume the radius of the polygon is half the size of the canvas at first + // at each index we check if the text overlaps. + // + // Where it does, we store that angle and that index. + // + // After finding the largest index and angle we calculate how much we need to remove + // from the shape radius to move the point inwards by that x. + // + // We average the left and right distances to get the maximum shape radius that can fit in the box + // along with labels. + // + // Once we have that, we can find the centre point for the chart, by taking the x text protrusion + // on each side, removing that from the size, halving it and adding the left x protrusion width. + // + // This will mean we have a shape fitted to the canvas, as large as it can be with the labels + // and position it in the most space efficient manner + // + // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + + var plFont = helpers$1.options._parseFont(scale.options.pointLabels); + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var furthestLimits = { + l: 0, + r: scale.width, + t: 0, + b: scale.height - scale.paddingTop + }; + var furthestAngles = {}; + var i, textSize, pointPosition; + + scale.ctx.font = plFont.string; + scale._pointLabelSizes = []; + + var valueCount = getValueCount(scale); + for (i = 0; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, scale.drawingArea + 5); + textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || ''); + scale._pointLabelSizes[i] = textSize; + + // Add quarter circle to make degree 0 mean top of circle + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians) % 360; + var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); + var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); + + if (hLimits.start < furthestLimits.l) { + furthestLimits.l = hLimits.start; + furthestAngles.l = angleRadians; + } + + if (hLimits.end > furthestLimits.r) { + furthestLimits.r = hLimits.end; + furthestAngles.r = angleRadians; + } + + if (vLimits.start < furthestLimits.t) { + furthestLimits.t = vLimits.start; + furthestAngles.t = angleRadians; + } + + if (vLimits.end > furthestLimits.b) { + furthestLimits.b = vLimits.end; + furthestAngles.b = angleRadians; + } + } + + scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles); +} + +function getTextAlignForAngle(angle) { + if (angle === 0 || angle === 180) { + return 'center'; + } else if (angle < 180) { + return 'left'; + } + + return 'right'; +} + +function fillText(ctx, text, position, lineHeight) { + var y = position.y + lineHeight / 2; + var i, ilen; + + if (helpers$1.isArray(text)) { + for (i = 0, ilen = text.length; i < ilen; ++i) { + ctx.fillText(text[i], position.x, y); + y += lineHeight; + } + } else { + ctx.fillText(text, position.x, y); + } +} + +function adjustPointPositionForLabelHeight(angle, textSize, position) { + if (angle === 90 || angle === 270) { + position.y -= (textSize.h / 2); + } else if (angle > 270 || angle < 90) { + position.y -= textSize.h; + } +} + +function drawPointLabels(scale) { + var ctx = scale.ctx; + var opts = scale.options; + var angleLineOpts = opts.angleLines; + var gridLineOpts = opts.gridLines; + var pointLabelOpts = opts.pointLabels; + var lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth); + var lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color); + var tickBackdropHeight = getTickBackdropHeight(opts); + + ctx.save(); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = lineColor; + if (ctx.setLineDash) { + ctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []])); + ctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]); + } + + var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); + + // Point Label Font + var plFont = helpers$1.options._parseFont(pointLabelOpts); + + ctx.font = plFont.string; + ctx.textBaseline = 'middle'; + + for (var i = getValueCount(scale) - 1; i >= 0; i--) { + if (angleLineOpts.display && lineWidth && lineColor) { + var outerPosition = scale.getPointPosition(i, outerDistance); + ctx.beginPath(); + ctx.moveTo(scale.xCenter, scale.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + } + + if (pointLabelOpts.display) { + // Extra pixels out for some label spacing + var extra = (i === 0 ? tickBackdropHeight / 2 : 0); + var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5); + + // Keep this in loop since we may support array properties here + var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor); + ctx.fillStyle = pointLabelFontColor; + + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians); + ctx.textAlign = getTextAlignForAngle(angle); + adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); + fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight); + } + } + ctx.restore(); +} + +function drawRadiusLine(scale, gridLineOpts, radius, index) { + var ctx = scale.ctx; + var circular = gridLineOpts.circular; + var valueCount = getValueCount(scale); + var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1); + var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1); + var pointPosition; + + if ((!circular && !valueCount) || !lineColor || !lineWidth) { + return; + } + + ctx.save(); + ctx.strokeStyle = lineColor; + ctx.lineWidth = lineWidth; + if (ctx.setLineDash) { + ctx.setLineDash(gridLineOpts.borderDash || []); + ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0; + } + + ctx.beginPath(); + if (circular) { + // Draw circular arcs between the points + ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); + } else { + // Draw straight lines connecting each index + pointPosition = scale.getPointPosition(0, radius); + ctx.moveTo(pointPosition.x, pointPosition.y); + + for (var i = 1; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, radius); + ctx.lineTo(pointPosition.x, pointPosition.y); + } + } + ctx.closePath(); + ctx.stroke(); + ctx.restore(); +} + +function numberOrZero(param) { + return helpers$1.isNumber(param) ? param : 0; +} + +var scale_radialLinear = scale_linearbase.extend({ + setDimensions: function() { + var me = this; + + // Set the unconstrained dimension before label rotation + me.width = me.maxWidth; + me.height = me.maxHeight; + me.paddingTop = getTickBackdropHeight(me.options) / 2; + me.xCenter = Math.floor(me.width / 2); + me.yCenter = Math.floor((me.height - me.paddingTop) / 2); + me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2; + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var min = Number.POSITIVE_INFINITY; + var max = Number.NEGATIVE_INFINITY; + + helpers$1.each(chart.data.datasets, function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + min = Math.min(value, min); + max = Math.max(value, max); + }); + } + }); + + me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); + me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + me.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function() { + return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); + }, + + convertTicksToLabels: function() { + var me = this; + + scale_linearbase.prototype.convertTicksToLabels.call(me); + + // Point labels + me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); + }, + + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + fit: function() { + var me = this; + var opts = me.options; + + if (opts.display && opts.pointLabels.display) { + fitWithPointLabels(me); + } else { + me.setCenterPoint(0, 0, 0, 0); + } + }, + + /** + * Set radius reductions and determine new radius and center point + * @private + */ + setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) { + var me = this; + var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); + var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); + var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); + var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b); + + radiusReductionLeft = numberOrZero(radiusReductionLeft); + radiusReductionRight = numberOrZero(radiusReductionRight); + radiusReductionTop = numberOrZero(radiusReductionTop); + radiusReductionBottom = numberOrZero(radiusReductionBottom); + + me.drawingArea = Math.min( + Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), + Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); + me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); + }, + + setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) { + var me = this; + var maxRight = me.width - rightMovement - me.drawingArea; + var maxLeft = leftMovement + me.drawingArea; + var maxTop = topMovement + me.drawingArea; + var maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea; + + me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left); + me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop); + }, + + getIndexAngle: function(index) { + var angleMultiplier = (Math.PI * 2) / getValueCount(this); + var startAngle = this.chart.options && this.chart.options.startAngle ? + this.chart.options.startAngle : + 0; + + var startAngleRadians = startAngle * Math.PI * 2 / 360; + + // Start from the top instead of right, so remove a quarter of the circle + return index * angleMultiplier + startAngleRadians; + }, + + getDistanceFromCenterForValue: function(value) { + var me = this; + + if (value === null) { + return 0; // null always in center + } + + // Take into account half font size + the yPadding of the top value + var scalingFactor = me.drawingArea / (me.max - me.min); + if (me.options.ticks.reverse) { + return (me.max - value) * scalingFactor; + } + return (value - me.min) * scalingFactor; + }, + + getPointPosition: function(index, distanceFromCenter) { + var me = this; + var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); + return { + x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter, + y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter + }; + }, + + getPointPositionForValue: function(index, value) { + return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); + }, + + getBasePosition: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.getPointPositionForValue(0, + me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0); + }, + + draw: function() { + var me = this; + var opts = me.options; + var gridLineOpts = opts.gridLines; + var tickOpts = opts.ticks; + + if (opts.display) { + var ctx = me.ctx; + var startAngle = this.getIndexAngle(0); + var tickFont = helpers$1.options._parseFont(tickOpts); + + if (opts.angleLines.display || opts.pointLabels.display) { + drawPointLabels(me); + } + + helpers$1.each(me.ticks, function(label, index) { + // Don't draw a centre value (if it is minimum) + if (index > 0 || tickOpts.reverse) { + var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); + + // Draw circular lines around the scale + if (gridLineOpts.display && index !== 0) { + drawRadiusLine(me, gridLineOpts, yCenterOffset, index); + } + + if (tickOpts.display) { + var tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor); + ctx.font = tickFont.string; + + ctx.save(); + ctx.translate(me.xCenter, me.yCenter); + ctx.rotate(startAngle); + + if (tickOpts.showLabelBackdrop) { + var labelWidth = ctx.measureText(label).width; + ctx.fillStyle = tickOpts.backdropColor; + ctx.fillRect( + -labelWidth / 2 - tickOpts.backdropPaddingX, + -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY, + labelWidth + tickOpts.backdropPaddingX * 2, + tickFont.size + tickOpts.backdropPaddingY * 2 + ); + } + + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = tickFontColor; + ctx.fillText(label, 0, -yCenterOffset); + ctx.restore(); + } + } + }); + } + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$3 = defaultConfig$3; +scale_radialLinear._defaults = _defaults$3; + +var valueOrDefault$c = helpers$1.valueOrDefault; + +// Integer constants are from the ES6 spec. +var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; +var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +var INTERVALS = { + millisecond: { + common: true, + size: 1, + steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] + }, + second: { + common: true, + size: 1000, + steps: [1, 2, 5, 10, 15, 30] + }, + minute: { + common: true, + size: 60000, + steps: [1, 2, 5, 10, 15, 30] + }, + hour: { + common: true, + size: 3600000, + steps: [1, 2, 3, 6, 12] + }, + day: { + common: true, + size: 86400000, + steps: [1, 2, 5] + }, + week: { + common: false, + size: 604800000, + steps: [1, 2, 3, 4] + }, + month: { + common: true, + size: 2.628e9, + steps: [1, 2, 3] + }, + quarter: { + common: false, + size: 7.884e9, + steps: [1, 2, 3, 4] + }, + year: { + common: true, + size: 3.154e10 + } +}; + +var UNITS = Object.keys(INTERVALS); + +function sorter(a, b) { + return a - b; +} + +function arrayUnique(items) { + var hash = {}; + var out = []; + var i, ilen, item; + + for (i = 0, ilen = items.length; i < ilen; ++i) { + item = items[i]; + if (!hash[item]) { + hash[item] = true; + out.push(item); + } + } + + return out; +} + +/** + * Returns an array of {time, pos} objects used to interpolate a specific `time` or position + * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is + * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other + * extremity (left + width or top + height). Note that it would be more optimized to directly + * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need + * to create the lookup table. The table ALWAYS contains at least two items: min and max. + * + * @param {number[]} timestamps - timestamps sorted from lowest to highest. + * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min + * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. + * If 'series', timestamps will be positioned at the same distance from each other. In this + * case, only timestamps that break the time linearity are registered, meaning that in the + * best case, all timestamps are linear, the table contains only min and max. + */ +function buildLookupTable(timestamps, min, max, distribution) { + if (distribution === 'linear' || !timestamps.length) { + return [ + {time: min, pos: 0}, + {time: max, pos: 1} + ]; + } + + var table = []; + var items = [min]; + var i, ilen, prev, curr, next; + + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + curr = timestamps[i]; + if (curr > min && curr < max) { + items.push(curr); + } + } + + items.push(max); + + for (i = 0, ilen = items.length; i < ilen; ++i) { + next = items[i + 1]; + prev = items[i - 1]; + curr = items[i]; + + // only add points that breaks the scale linearity + if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { + table.push({time: curr, pos: i / (ilen - 1)}); + } + } + + return table; +} + +// @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ +function lookup(table, key, value) { + var lo = 0; + var hi = table.length - 1; + var mid, i0, i1; + + while (lo >= 0 && lo <= hi) { + mid = (lo + hi) >> 1; + i0 = table[mid - 1] || null; + i1 = table[mid]; + + if (!i0) { + // given value is outside table (before first item) + return {lo: null, hi: i1}; + } else if (i1[key] < value) { + lo = mid + 1; + } else if (i0[key] > value) { + hi = mid - 1; + } else { + return {lo: i0, hi: i1}; + } + } + + // given value is outside table (after last item) + return {lo: i1, hi: null}; +} + +/** + * Linearly interpolates the given source `value` using the table items `skey` values and + * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') + * returns the position for a timestamp equal to 42. If value is out of bounds, values at + * index [0, 1] or [n - 1, n] are used for the interpolation. + */ +function interpolate$1(table, skey, sval, tkey) { + var range = lookup(table, skey, sval); + + // Note: the lookup table ALWAYS contains at least 2 items (min and max) + var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; + var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; + + var span = next[skey] - prev[skey]; + var ratio = span ? (sval - prev[skey]) / span : 0; + var offset = (next[tkey] - prev[tkey]) * ratio; + + return prev[tkey] + offset; +} + +function toTimestamp(scale, input) { + var adapter = scale._adapter; + var options = scale.options.time; + var parser = options.parser; + var format = parser || options.format; + var value = input; + + if (typeof parser === 'function') { + value = parser(value); + } + + // Only parse if its not a timestamp already + if (!helpers$1.isFinite(value)) { + value = typeof format === 'string' + ? adapter.parse(value, format) + : adapter.parse(value); + } + + if (value !== null) { + return +value; + } + + // Labels are in an incompatible format and no `parser` has been provided. + // The user might still use the deprecated `format` option for parsing. + if (!parser && typeof format === 'function') { + value = format(input); + + // `format` could return something else than a timestamp, if so, parse it + if (!helpers$1.isFinite(value)) { + value = adapter.parse(value); + } + } + + return value; +} + +function parse(scale, input) { + if (helpers$1.isNullOrUndef(input)) { + return null; + } + + var options = scale.options.time; + var value = toTimestamp(scale, scale.getRightValue(input)); + if (value === null) { + return value; + } + + if (options.round) { + value = +scale._adapter.startOf(value, options.round); + } + + return value; +} + +/** + * Returns the number of unit to skip to be able to display up to `capacity` number of ticks + * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. + */ +function determineStepSize(min, max, unit, capacity) { + var range = max - min; + var interval = INTERVALS[unit]; + var milliseconds = interval.size; + var steps = interval.steps; + var i, ilen, factor; + + if (!steps) { + return Math.ceil(range / (capacity * milliseconds)); + } + + for (i = 0, ilen = steps.length; i < ilen; ++i) { + factor = steps[i]; + if (Math.ceil(range / (milliseconds * factor)) <= capacity) { + break; + } + } + + return factor; +} + +/** + * Figures out what unit results in an appropriate number of auto-generated ticks + */ +function determineUnitForAutoTicks(minUnit, min, max, capacity) { + var ilen = UNITS.length; + var i, interval, factor; + + for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { + interval = INTERVALS[UNITS[i]]; + factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; + + if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { + return UNITS[i]; + } + } + + return UNITS[ilen - 1]; +} + +/** + * Figures out what unit to format a set of ticks with + */ +function determineUnitForFormatting(scale, ticks, minUnit, min, max) { + var ilen = UNITS.length; + var i, unit; + + for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { + unit = UNITS[i]; + if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) { + return unit; + } + } + + return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; +} + +function determineMajorUnit(unit) { + for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { + if (INTERVALS[UNITS[i]].common) { + return UNITS[i]; + } + } +} + +/** + * Generates a maximum of `capacity` timestamps between min and max, rounded to the + * `minor` unit, aligned on the `major` unit and using the given scale time `options`. + * Important: this method can return ticks outside the min and max range, it's the + * responsibility of the calling code to clamp values if needed. + */ +function generate(scale, min, max, capacity) { + var adapter = scale._adapter; + var options = scale.options; + var timeOpts = options.time; + var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); + var major = determineMajorUnit(minor); + var stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize); + var weekday = minor === 'week' ? timeOpts.isoWeekday : false; + var majorTicksEnabled = options.ticks.major.enabled; + var interval = INTERVALS[minor]; + var first = min; + var last = max; + var ticks = []; + var time; + + if (!stepSize) { + stepSize = determineStepSize(min, max, minor, capacity); + } + + // For 'week' unit, handle the first day of week option + if (weekday) { + first = +adapter.startOf(first, 'isoWeek', weekday); + last = +adapter.startOf(last, 'isoWeek', weekday); + } + + // Align first/last ticks on unit + first = +adapter.startOf(first, weekday ? 'day' : minor); + last = +adapter.startOf(last, weekday ? 'day' : minor); + + // Make sure that the last tick include max + if (last < max) { + last = +adapter.add(last, 1, minor); + } + + time = first; + + if (majorTicksEnabled && major && !weekday && !timeOpts.round) { + // Align the first tick on the previous `minor` unit aligned on the `major` unit: + // we first aligned time on the previous `major` unit then add the number of full + // stepSize there is between first and the previous major time. + time = +adapter.startOf(time, major); + time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor); + } + + for (; time < last; time = +adapter.add(time, stepSize, minor)) { + ticks.push(+time); + } + + ticks.push(+time); + + return ticks; +} + +/** + * Returns the start and end offsets from edges in the form of {start, end} + * where each value is a relative width to the scale and ranges between 0 and 1. + * They add extra margins on the both sides by scaling down the original scale. + * Offsets are added when the `offset` option is true. + */ +function computeOffsets(table, ticks, min, max, options) { + var start = 0; + var end = 0; + var first, last; + + if (options.offset && ticks.length) { + if (!options.time.min) { + first = interpolate$1(table, 'time', ticks[0], 'pos'); + if (ticks.length === 1) { + start = 1 - first; + } else { + start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2; + } + } + if (!options.time.max) { + last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos'); + if (ticks.length === 1) { + end = last; + } else { + end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2; + } + } + } + + return {start: start, end: end}; +} + +function ticksFromTimestamps(scale, values, majorUnit) { + var ticks = []; + var i, ilen, value, major; + + for (i = 0, ilen = values.length; i < ilen; ++i) { + value = values[i]; + major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false; + + ticks.push({ + value: value, + major: major + }); + } + + return ticks; +} + +var defaultConfig$4 = { + position: 'bottom', + + /** + * Data distribution along the scale: + * - 'linear': data are spread according to their time (distances can vary), + * - 'series': data are spread at the same distance from each other. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + distribution: 'linear', + + /** + * Scale boundary strategy (bypassed by min/max time options) + * - `data`: make sure data are fully visible, ticks outside are removed + * - `ticks`: make sure ticks are fully visible, data outside are truncated + * @see https://github.com/chartjs/Chart.js/pull/4556 + * @since 2.7.0 + */ + bounds: 'data', + + adapters: {}, + time: { + parser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment + format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/ + unit: false, // false == automatic or override with week, month, year, etc. + round: false, // none, or override with week, month, year, etc. + displayFormat: false, // DEPRECATED + isoWeekday: false, // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/ + minUnit: 'millisecond', + displayFormats: {} + }, + ticks: { + autoSkip: false, + + /** + * Ticks generation input values: + * - 'auto': generates "optimal" ticks based on scale size and time options. + * - 'data': generates ticks from data (including labels from data {t|x|y} objects). + * - 'labels': generates ticks from user given `data.labels` values ONLY. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + source: 'auto', + + major: { + enabled: false + } + } +}; + +var scale_time = core_scale.extend({ + initialize: function() { + this.mergeTicksOptions(); + core_scale.prototype.initialize.call(this); + }, + + update: function() { + var me = this; + var options = me.options; + var time = options.time || (options.time = {}); + var adapter = me._adapter = new core_adapters._date(options.adapters.date); + + // DEPRECATIONS: output a message only one time per update + if (time.format) { + console.warn('options.time.format is deprecated and replaced by options.time.parser.'); + } + + // Backward compatibility: before introducing adapter, `displayFormats` was + // supposed to contain *all* unit/string pairs but this can't be resolved + // when loading the scale (adapters are loaded afterward), so let's populate + // missing formats on update + helpers$1.mergeIf(time.displayFormats, adapter.formats()); + + return core_scale.prototype.update.apply(me, arguments); + }, + + /** + * Allows data to be referenced via 't' attribute + */ + getRightValue: function(rawValue) { + if (rawValue && rawValue.t !== undefined) { + rawValue = rawValue.t; + } + return core_scale.prototype.getRightValue.call(this, rawValue); + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var adapter = me._adapter; + var timeOpts = me.options.time; + var unit = timeOpts.unit || 'day'; + var min = MAX_INTEGER; + var max = MIN_INTEGER; + var timestamps = []; + var datasets = []; + var labels = []; + var i, j, ilen, jlen, data, timestamp; + var dataLabels = chart.data.labels || []; + + // Convert labels to timestamps + for (i = 0, ilen = dataLabels.length; i < ilen; ++i) { + labels.push(parse(me, dataLabels[i])); + } + + // Convert data to timestamps + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + data = chart.data.datasets[i].data; + + // Let's consider that all data have the same format. + if (helpers$1.isObject(data[0])) { + datasets[i] = []; + + for (j = 0, jlen = data.length; j < jlen; ++j) { + timestamp = parse(me, data[j]); + timestamps.push(timestamp); + datasets[i][j] = timestamp; + } + } else { + for (j = 0, jlen = labels.length; j < jlen; ++j) { + timestamps.push(labels[j]); + } + datasets[i] = labels.slice(0); + } + } else { + datasets[i] = []; + } + } + + if (labels.length) { + // Sort labels **after** data have been converted + labels = arrayUnique(labels).sort(sorter); + min = Math.min(min, labels[0]); + max = Math.max(max, labels[labels.length - 1]); + } + + if (timestamps.length) { + timestamps = arrayUnique(timestamps).sort(sorter); + min = Math.min(min, timestamps[0]); + max = Math.max(max, timestamps[timestamps.length - 1]); + } + + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // In case there is no valid min/max, set limits based on unit time option + min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min; + max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max; + + // Make sure that max is strictly higher than min (required by the lookup table) + me.min = Math.min(min, max); + me.max = Math.max(min + 1, max); + + // PRIVATE + me._horizontal = me.isHorizontal(); + me._table = []; + me._timestamps = { + data: timestamps, + datasets: datasets, + labels: labels + }; + }, + + buildTicks: function() { + var me = this; + var min = me.min; + var max = me.max; + var options = me.options; + var timeOpts = options.time; + var timestamps = []; + var ticks = []; + var i, ilen, timestamp; + + switch (options.ticks.source) { + case 'data': + timestamps = me._timestamps.data; + break; + case 'labels': + timestamps = me._timestamps.labels; + break; + case 'auto': + default: + timestamps = generate(me, min, max, me.getLabelCapacity(min), options); + } + + if (options.bounds === 'ticks' && timestamps.length) { + min = timestamps[0]; + max = timestamps[timestamps.length - 1]; + } + + // Enforce limits with user min/max options + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // Remove ticks outside the min/max range + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + timestamp = timestamps[i]; + if (timestamp >= min && timestamp <= max) { + ticks.push(timestamp); + } + } + + me.min = min; + me.max = max; + + // PRIVATE + me._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max); + me._majorUnit = determineMajorUnit(me._unit); + me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); + me._offsets = computeOffsets(me._table, ticks, min, max, options); + + if (options.ticks.reverse) { + ticks.reverse(); + } + + return ticksFromTimestamps(me, ticks, me._majorUnit); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var adapter = me._adapter; + var data = me.chart.data; + var timeOpts = me.options.time; + var label = data.labels && index < data.labels.length ? data.labels[index] : ''; + var value = data.datasets[datasetIndex].data[index]; + + if (helpers$1.isObject(value)) { + label = me.getRightValue(value); + } + if (timeOpts.tooltipFormat) { + return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat); + } + if (typeof label === 'string') { + return label; + } + return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime); + }, + + /** + * Function to format an individual tick mark + * @private + */ + tickFormatFunction: function(time, index, ticks, format) { + var me = this; + var adapter = me._adapter; + var options = me.options; + var formats = options.time.displayFormats; + var minorFormat = formats[me._unit]; + var majorUnit = me._majorUnit; + var majorFormat = formats[majorUnit]; + var majorTime = +adapter.startOf(time, majorUnit); + var majorTickOpts = options.ticks.major; + var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; + var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat); + var tickOpts = major ? majorTickOpts : options.ticks.minor; + var formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback); + + return formatter ? formatter(label, index, ticks) : label; + }, + + convertTicksToLabels: function(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(this.tickFormatFunction(ticks[i].value, i, ticks)); + } + + return labels; + }, + + /** + * @private + */ + getPixelForOffset: function(time) { + var me = this; + var isReverse = me.options.ticks.reverse; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top; + var pos = interpolate$1(me._table, 'time', time, 'pos'); + var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end); + + return isReverse ? start - offset : start + offset; + }, + + getPixelForValue: function(value, index, datasetIndex) { + var me = this; + var time = null; + + if (index !== undefined && datasetIndex !== undefined) { + time = me._timestamps.datasets[datasetIndex][index]; + } + + if (time === null) { + time = parse(me, value); + } + + if (time !== null) { + return me.getPixelForOffset(time); + } + }, + + getPixelForTick: function(index) { + var ticks = this.getTicks(); + return index >= 0 && index < ticks.length ? + this.getPixelForOffset(ticks[index].value) : + null; + }, + + getValueForPixel: function(pixel) { + var me = this; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? me.left : me.top; + var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end; + var time = interpolate$1(me._table, 'pos', pos, 'time'); + + // DEPRECATION, we should return time directly + return me._adapter._create(time); + }, + + /** + * Crude approximation of what the label width might be + * @private + */ + getLabelWidth: function(label) { + var me = this; + var ticksOpts = me.options.ticks; + var tickLabelWidth = me.ctx.measureText(label).width; + var angle = helpers$1.toRadians(ticksOpts.maxRotation); + var cosRotation = Math.cos(angle); + var sinRotation = Math.sin(angle); + var tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize); + + return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); + }, + + /** + * @private + */ + getLabelCapacity: function(exampleTime) { + var me = this; + + // pick the longest format (milliseconds) for guestimation + var format = me.options.time.displayFormats.millisecond; + var exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format); + var tickLabelWidth = me.getLabelWidth(exampleLabel); + var innerWidth = me.isHorizontal() ? me.width : me.height; + var capacity = Math.floor(innerWidth / tickLabelWidth); + + return capacity > 0 ? capacity : 1; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$4 = defaultConfig$4; +scale_time._defaults = _defaults$4; + +var scales = { + category: scale_category, + linear: scale_linear, + logarithmic: scale_logarithmic, + radialLinear: scale_radialLinear, + time: scale_time +}; + +var FORMATS = { + datetime: 'MMM D, YYYY, h:mm:ss a', + millisecond: 'h:mm:ss.SSS a', + second: 'h:mm:ss a', + minute: 'h:mm a', + hour: 'hA', + day: 'MMM D', + week: 'll', + month: 'MMM YYYY', + quarter: '[Q]Q - YYYY', + year: 'YYYY' +}; + +core_adapters._date.override(typeof moment === 'function' ? { + _id: 'moment', // DEBUG ONLY + + formats: function() { + return FORMATS; + }, + + parse: function(value, format) { + if (typeof value === 'string' && typeof format === 'string') { + value = moment(value, format); + } else if (!(value instanceof moment)) { + value = moment(value); + } + return value.isValid() ? value.valueOf() : null; + }, + + format: function(time, format) { + return moment(time).format(format); + }, + + add: function(time, amount, unit) { + return moment(time).add(amount, unit).valueOf(); + }, + + diff: function(max, min, unit) { + return moment.duration(moment(max).diff(moment(min))).as(unit); + }, + + startOf: function(time, unit, weekday) { + time = moment(time); + if (unit === 'isoWeek') { + return time.isoWeekday(weekday).valueOf(); + } + return time.startOf(unit).valueOf(); + }, + + endOf: function(time, unit) { + return moment(time).endOf(unit).valueOf(); + }, + + // DEPRECATIONS + + /** + * Provided for backward compatibility with scale.getValueForPixel(). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function(time) { + return moment(time); + }, +} : {}); + +core_defaults._set('global', { + plugins: { + filler: { + propagate: true + } + } +}); + +var mappers = { + dataset: function(source) { + var index = source.fill; + var chart = source.chart; + var meta = chart.getDatasetMeta(index); + var visible = meta && chart.isDatasetVisible(index); + var points = (visible && meta.dataset._children) || []; + var length = points.length || 0; + + return !length ? null : function(point, i) { + return (i < length && points[i]._view) || null; + }; + }, + + boundary: function(source) { + var boundary = source.boundary; + var x = boundary ? boundary.x : null; + var y = boundary ? boundary.y : null; + + return function(point) { + return { + x: x === null ? point.x : x, + y: y === null ? point.y : y, + }; + }; + } +}; + +// @todo if (fill[0] === '#') +function decodeFill(el, index, count) { + var model = el._model || {}; + var fill = model.fill; + var target; + + if (fill === undefined) { + fill = !!model.backgroundColor; + } + + if (fill === false || fill === null) { + return false; + } + + if (fill === true) { + return 'origin'; + } + + target = parseFloat(fill, 10); + if (isFinite(target) && Math.floor(target) === target) { + if (fill[0] === '-' || fill[0] === '+') { + target = index + target; + } + + if (target === index || target < 0 || target >= count) { + return false; + } + + return target; + } + + switch (fill) { + // compatibility + case 'bottom': + return 'start'; + case 'top': + return 'end'; + case 'zero': + return 'origin'; + // supported boundaries + case 'origin': + case 'start': + case 'end': + return fill; + // invalid fill values + default: + return false; + } +} + +function computeBoundary(source) { + var model = source.el._model || {}; + var scale = source.el._scale || {}; + var fill = source.fill; + var target = null; + var horizontal; + + if (isFinite(fill)) { + return null; + } + + // Backward compatibility: until v3, we still need to support boundary values set on + // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and + // controllers might still use it (e.g. the Smith chart). + + if (fill === 'start') { + target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; + } else if (fill === 'end') { + target = model.scaleTop === undefined ? scale.top : model.scaleTop; + } else if (model.scaleZero !== undefined) { + target = model.scaleZero; + } else if (scale.getBasePosition) { + target = scale.getBasePosition(); + } else if (scale.getBasePixel) { + target = scale.getBasePixel(); + } + + if (target !== undefined && target !== null) { + if (target.x !== undefined && target.y !== undefined) { + return target; + } + + if (helpers$1.isFinite(target)) { + horizontal = scale.isHorizontal(); + return { + x: horizontal ? target : null, + y: horizontal ? null : target + }; + } + } + + return null; +} + +function resolveTarget(sources, index, propagate) { + var source = sources[index]; + var fill = source.fill; + var visited = [index]; + var target; + + if (!propagate) { + return fill; + } + + while (fill !== false && visited.indexOf(fill) === -1) { + if (!isFinite(fill)) { + return fill; + } + + target = sources[fill]; + if (!target) { + return false; + } + + if (target.visible) { + return fill; + } + + visited.push(fill); + fill = target.fill; + } + + return false; +} + +function createMapper(source) { + var fill = source.fill; + var type = 'dataset'; + + if (fill === false) { + return null; + } + + if (!isFinite(fill)) { + type = 'boundary'; + } + + return mappers[type](source); +} + +function isDrawable(point) { + return point && !point.skip; +} + +function drawArea(ctx, curve0, curve1, len0, len1) { + var i; + + if (!len0 || !len1) { + return; + } + + // building first area curve (normal) + ctx.moveTo(curve0[0].x, curve0[0].y); + for (i = 1; i < len0; ++i) { + helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); + } + + // joining the two area curves + ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); + + // building opposite area curve (reverse) + for (i = len1 - 1; i > 0; --i) { + helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); + } +} + +function doFill(ctx, points, mapper, view, color, loop) { + var count = points.length; + var span = view.spanGaps; + var curve0 = []; + var curve1 = []; + var len0 = 0; + var len1 = 0; + var i, ilen, index, p0, p1, d0, d1; + + ctx.beginPath(); + + for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { + index = i % count; + p0 = points[index]._view; + p1 = mapper(p0, index, view); + d0 = isDrawable(p0); + d1 = isDrawable(p1); + + if (d0 && d1) { + len0 = curve0.push(p0); + len1 = curve1.push(p1); + } else if (len0 && len1) { + if (!span) { + drawArea(ctx, curve0, curve1, len0, len1); + len0 = len1 = 0; + curve0 = []; + curve1 = []; + } else { + if (d0) { + curve0.push(p0); + } + if (d1) { + curve1.push(p1); + } + } + } + } + + drawArea(ctx, curve0, curve1, len0, len1); + + ctx.closePath(); + ctx.fillStyle = color; + ctx.fill(); +} + +var plugin_filler = { + id: 'filler', + + afterDatasetsUpdate: function(chart, options) { + var count = (chart.data.datasets || []).length; + var propagate = options.propagate; + var sources = []; + var meta, i, el, source; + + for (i = 0; i < count; ++i) { + meta = chart.getDatasetMeta(i); + el = meta.dataset; + source = null; + + if (el && el._model && el instanceof elements.Line) { + source = { + visible: chart.isDatasetVisible(i), + fill: decodeFill(el, i, count), + chart: chart, + el: el + }; + } + + meta.$filler = source; + sources.push(source); + } + + for (i = 0; i < count; ++i) { + source = sources[i]; + if (!source) { + continue; + } + + source.fill = resolveTarget(sources, i, propagate); + source.boundary = computeBoundary(source); + source.mapper = createMapper(source); + } + }, + + beforeDatasetDraw: function(chart, args) { + var meta = args.meta.$filler; + if (!meta) { + return; + } + + var ctx = chart.ctx; + var el = meta.el; + var view = el._view; + var points = el._children || []; + var mapper = meta.mapper; + var color = view.backgroundColor || core_defaults.global.defaultColor; + + if (mapper && color && points.length) { + helpers$1.canvas.clipArea(ctx, chart.chartArea); + doFill(ctx, points, mapper, view, color, el._loop); + helpers$1.canvas.unclipArea(ctx); + } + } +}; + +var noop$1 = helpers$1.noop; +var valueOrDefault$d = helpers$1.valueOrDefault; + +core_defaults._set('global', { + legend: { + display: true, + position: 'top', + fullWidth: true, + reverse: false, + weight: 1000, + + // a callback that will handle + onClick: function(e, legendItem) { + var index = legendItem.datasetIndex; + var ci = this.chart; + var meta = ci.getDatasetMeta(index); + + // See controller.isDatasetVisible comment + meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; + + // We hid a dataset ... rerender the chart + ci.update(); + }, + + onHover: null, + onLeave: null, + + labels: { + boxWidth: 40, + padding: 10, + // Generates labels shown in the legend + // Valid properties to return: + // text : text to display + // fillStyle : fill of coloured box + // strokeStyle: stroke of coloured box + // hidden : if this legend item refers to a hidden item + // lineCap : cap style for line + // lineDash + // lineDashOffset : + // lineJoin : + // lineWidth : + generateLabels: function(chart) { + var data = chart.data; + return helpers$1.isArray(data.datasets) ? data.datasets.map(function(dataset, i) { + return { + text: dataset.label, + fillStyle: (!helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), + hidden: !chart.isDatasetVisible(i), + lineCap: dataset.borderCapStyle, + lineDash: dataset.borderDash, + lineDashOffset: dataset.borderDashOffset, + lineJoin: dataset.borderJoinStyle, + lineWidth: dataset.borderWidth, + strokeStyle: dataset.borderColor, + pointStyle: dataset.pointStyle, + + // Below is extra data used for toggling the datasets + datasetIndex: i + }; + }, this) : []; + } + } + }, + + legendCallback: function(chart) { + var text = []; + text.push('
    '); + for (var i = 0; i < chart.data.datasets.length; i++) { + text.push('
  • '); + if (chart.data.datasets[i].label) { + text.push(chart.data.datasets[i].label); + } + text.push('
  • '); + } + text.push('
'); + return text.join(''); + } +}); + +/** + * Helper function to get the box width based on the usePointStyle option + * @param {object} labelopts - the label options on the legend + * @param {number} fontSize - the label font size + * @return {number} width of the color box area + */ +function getBoxWidth(labelOpts, fontSize) { + return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ? + fontSize : + labelOpts.boxWidth; +} + +/** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ +var Legend = core_element.extend({ + + initialize: function(config) { + helpers$1.extend(this, config); + + // Contains hit boxes for each dataset (in dataset order) + this.legendHitBoxes = []; + + /** + * @private + */ + this._hoveredItem = null; + + // Are we in doughnut mode which has a different data type + this.doughnutMode = false; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + // Any function defined here is inherited by all legend types. + // Any function can be extended by the legend type + + beforeUpdate: noop$1, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + }, + afterUpdate: noop$1, + + // + + beforeSetDimensions: noop$1, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$1, + + // + + beforeBuildLabels: noop$1, + buildLabels: function() { + var me = this; + var labelOpts = me.options.labels || {}; + var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || []; + + if (labelOpts.filter) { + legendItems = legendItems.filter(function(item) { + return labelOpts.filter(item, me.chart.data); + }); + } + + if (me.options.reverse) { + legendItems.reverse(); + } + + me.legendItems = legendItems; + }, + afterBuildLabels: noop$1, + + // + + beforeFit: noop$1, + fit: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var display = opts.display; + + var ctx = me.ctx; + + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + + // Reset hit boxes + var hitboxes = me.legendHitBoxes = []; + + var minSize = me.minSize; + var isHorizontal = me.isHorizontal(); + + if (isHorizontal) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = display ? 10 : 0; + } else { + minSize.width = display ? 10 : 0; + minSize.height = me.maxHeight; // fill all the height + } + + // Increase sizes here + if (display) { + ctx.font = labelFont.string; + + if (isHorizontal) { + // Labels + + // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one + var lineWidths = me.lineWidths = [0]; + var totalHeight = 0; + + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + + helpers$1.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + if (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) { + totalHeight += fontSize + labelOpts.padding; + lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding; + } + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: width, + height: fontSize + }; + + lineWidths[lineWidths.length - 1] += width + labelOpts.padding; + }); + + minSize.height += totalHeight; + + } else { + var vPadding = labelOpts.padding; + var columnWidths = me.columnWidths = []; + var totalWidth = labelOpts.padding; + var currentColWidth = 0; + var currentColHeight = 0; + var itemHeight = fontSize + vPadding; + + helpers$1.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + // If too tall, go to new column + if (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) { + totalWidth += currentColWidth + labelOpts.padding; + columnWidths.push(currentColWidth); // previous column width + + currentColWidth = 0; + currentColHeight = 0; + } + + // Get max width + currentColWidth = Math.max(currentColWidth, itemWidth); + currentColHeight += itemHeight; + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: itemWidth, + height: fontSize + }; + }); + + totalWidth += currentColWidth; + columnWidths.push(currentColWidth); + minSize.width += totalWidth; + } + } + + me.width = minSize.width; + me.height = minSize.height; + }, + afterFit: noop$1, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + + // Actually draw the legend on the canvas + draw: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; + var lineDefault = globalDefaults.elements.line; + var legendWidth = me.width; + var lineWidths = me.lineWidths; + + if (opts.display) { + var ctx = me.ctx; + var fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor); + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + var cursor; + + // Canvas setup + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + ctx.lineWidth = 0.5; + ctx.strokeStyle = fontColor; // for strikethrough effect + ctx.fillStyle = fontColor; // render in correct colour + ctx.font = labelFont.string; + + var boxWidth = getBoxWidth(labelOpts, fontSize); + var hitboxes = me.legendHitBoxes; + + // current position + var drawLegendBox = function(x, y, legendItem) { + if (isNaN(boxWidth) || boxWidth <= 0) { + return; + } + + // Set the ctx for the box + ctx.save(); + + var lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth); + ctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor); + ctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle); + ctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset); + ctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor); + + if (ctx.setLineDash) { + // IE 9 and 10 do not support line dash + ctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash)); + } + + if (opts.labels && opts.labels.usePointStyle) { + // Recalculate x and y for drawPoint() because its expecting + // x and y to be center of figure (instead of top left) + var radius = boxWidth * Math.SQRT2 / 2; + var centerX = x + boxWidth / 2; + var centerY = y + fontSize / 2; + + // Draw pointStyle as legend symbol + helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); + } else { + // Draw box as legend symbol + if (lineWidth !== 0) { + ctx.strokeRect(x, y, boxWidth, fontSize); + } + ctx.fillRect(x, y, boxWidth, fontSize); + } + + ctx.restore(); + }; + var fillText = function(x, y, legendItem, textWidth) { + var halfFontSize = fontSize / 2; + var xLeft = boxWidth + halfFontSize + x; + var yMiddle = y + halfFontSize; + + ctx.fillText(legendItem.text, xLeft, yMiddle); + + if (legendItem.hidden) { + // Strikethrough the text if hidden + ctx.beginPath(); + ctx.lineWidth = 2; + ctx.moveTo(xLeft, yMiddle); + ctx.lineTo(xLeft + textWidth, yMiddle); + ctx.stroke(); + } + }; + + // Horizontal + var isHorizontal = me.isHorizontal(); + if (isHorizontal) { + cursor = { + x: me.left + ((legendWidth - lineWidths[0]) / 2) + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } else { + cursor = { + x: me.left + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } + + var itemHeight = fontSize + labelOpts.padding; + helpers$1.each(me.legendItems, function(legendItem, i) { + var textWidth = ctx.measureText(legendItem.text).width; + var width = boxWidth + (fontSize / 2) + textWidth; + var x = cursor.x; + var y = cursor.y; + + // Use (me.left + me.minSize.width) and (me.top + me.minSize.height) + // instead of me.right and me.bottom because me.width and me.height + // may have been changed since me.minSize was calculated + if (isHorizontal) { + if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) { + y = cursor.y += itemHeight; + cursor.line++; + x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2) + labelOpts.padding; + } + } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) { + x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; + y = cursor.y = me.top + labelOpts.padding; + cursor.line++; + } + + drawLegendBox(x, y, legendItem); + + hitboxes[i].left = x; + hitboxes[i].top = y; + + // Fill the actual label + fillText(x, y, legendItem, textWidth); + + if (isHorizontal) { + cursor.x += width + labelOpts.padding; + } else { + cursor.y += itemHeight; + } + + }); + } + }, + + /** + * @private + */ + _getLegendItemAt: function(x, y) { + var me = this; + var i, hitBox, lh; + + if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { + // See if we are touching one of the dataset boxes + lh = me.legendHitBoxes; + for (i = 0; i < lh.length; ++i) { + hitBox = lh[i]; + + if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { + // Touching an element + return me.legendItems[i]; + } + } + } + + return null; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + */ + handleEvent: function(e) { + var me = this; + var opts = me.options; + var type = e.type === 'mouseup' ? 'click' : e.type; + var hoveredItem; + + if (type === 'mousemove') { + if (!opts.onHover && !opts.onLeave) { + return; + } + } else if (type === 'click') { + if (!opts.onClick) { + return; + } + } else { + return; + } + + // Chart event already has relative position in it + hoveredItem = me._getLegendItemAt(e.x, e.y); + + if (type === 'click') { + if (hoveredItem && opts.onClick) { + // use e.native for backwards compatibility + opts.onClick.call(me, e.native, hoveredItem); + } + } else { + if (opts.onLeave && hoveredItem !== me._hoveredItem) { + if (me._hoveredItem) { + opts.onLeave.call(me, e.native, me._hoveredItem); + } + me._hoveredItem = hoveredItem; + } + + if (opts.onHover && hoveredItem) { + // use e.native for backwards compatibility + opts.onHover.call(me, e.native, hoveredItem); + } + } + } +}); + +function createNewLegendAndAttach(chart, legendOpts) { + var legend = new Legend({ + ctx: chart.ctx, + options: legendOpts, + chart: chart + }); + + core_layouts.configure(chart, legend, legendOpts); + core_layouts.addBox(chart, legend); + chart.legend = legend; +} + +var plugin_legend = { + id: 'legend', + + /** + * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making + * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Legend, + + beforeInit: function(chart) { + var legendOpts = chart.options.legend; + + if (legendOpts) { + createNewLegendAndAttach(chart, legendOpts); + } + }, + + beforeUpdate: function(chart) { + var legendOpts = chart.options.legend; + var legend = chart.legend; + + if (legendOpts) { + helpers$1.mergeIf(legendOpts, core_defaults.global.legend); + + if (legend) { + core_layouts.configure(chart, legend, legendOpts); + legend.options = legendOpts; + } else { + createNewLegendAndAttach(chart, legendOpts); + } + } else if (legend) { + core_layouts.removeBox(chart, legend); + delete chart.legend; + } + }, + + afterEvent: function(chart, e) { + var legend = chart.legend; + if (legend) { + legend.handleEvent(e); + } + } +}; + +var noop$2 = helpers$1.noop; + +core_defaults._set('global', { + title: { + display: false, + fontStyle: 'bold', + fullWidth: true, + padding: 10, + position: 'top', + text: '', + weight: 2000 // by default greater than legend (1000) to be above + } +}); + +/** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ +var Title = core_element.extend({ + initialize: function(config) { + var me = this; + helpers$1.extend(me, config); + + // Contains hit boxes for each dataset (in dataset order) + me.legendHitBoxes = []; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + + beforeUpdate: noop$2, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: noop$2, + + // + + beforeSetDimensions: noop$2, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$2, + + // + + beforeBuildLabels: noop$2, + buildLabels: noop$2, + afterBuildLabels: noop$2, + + // + + beforeFit: noop$2, + fit: function() { + var me = this; + var opts = me.options; + var display = opts.display; + var minSize = me.minSize; + var lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1; + var fontOpts = helpers$1.options._parseFont(opts); + var textSize = display ? (lineCount * fontOpts.lineHeight) + (opts.padding * 2) : 0; + + if (me.isHorizontal()) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = textSize; + } else { + minSize.width = textSize; + minSize.height = me.maxHeight; // fill all the height + } + + me.width = minSize.width; + me.height = minSize.height; + + }, + afterFit: noop$2, + + // Shared Methods + isHorizontal: function() { + var pos = this.options.position; + return pos === 'top' || pos === 'bottom'; + }, + + // Actually draw the title block on the canvas + draw: function() { + var me = this; + var ctx = me.ctx; + var opts = me.options; + + if (opts.display) { + var fontOpts = helpers$1.options._parseFont(opts); + var lineHeight = fontOpts.lineHeight; + var offset = lineHeight / 2 + opts.padding; + var rotation = 0; + var top = me.top; + var left = me.left; + var bottom = me.bottom; + var right = me.right; + var maxWidth, titleX, titleY; + + ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour + ctx.font = fontOpts.string; + + // Horizontal + if (me.isHorizontal()) { + titleX = left + ((right - left) / 2); // midpoint of the width + titleY = top + offset; + maxWidth = right - left; + } else { + titleX = opts.position === 'left' ? left + offset : right - offset; + titleY = top + ((bottom - top) / 2); + maxWidth = bottom - top; + rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); + } + + ctx.save(); + ctx.translate(titleX, titleY); + ctx.rotate(rotation); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + var text = opts.text; + if (helpers$1.isArray(text)) { + var y = 0; + for (var i = 0; i < text.length; ++i) { + ctx.fillText(text[i], 0, y, maxWidth); + y += lineHeight; + } + } else { + ctx.fillText(text, 0, 0, maxWidth); + } + + ctx.restore(); + } + } +}); + +function createNewTitleBlockAndAttach(chart, titleOpts) { + var title = new Title({ + ctx: chart.ctx, + options: titleOpts, + chart: chart + }); + + core_layouts.configure(chart, title, titleOpts); + core_layouts.addBox(chart, title); + chart.titleBlock = title; +} + +var plugin_title = { + id: 'title', + + /** + * Backward compatibility: since 2.1.5, the title is registered as a plugin, making + * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Title, + + beforeInit: function(chart) { + var titleOpts = chart.options.title; + + if (titleOpts) { + createNewTitleBlockAndAttach(chart, titleOpts); + } + }, + + beforeUpdate: function(chart) { + var titleOpts = chart.options.title; + var titleBlock = chart.titleBlock; + + if (titleOpts) { + helpers$1.mergeIf(titleOpts, core_defaults.global.title); + + if (titleBlock) { + core_layouts.configure(chart, titleBlock, titleOpts); + titleBlock.options = titleOpts; + } else { + createNewTitleBlockAndAttach(chart, titleOpts); + } + } else if (titleBlock) { + core_layouts.removeBox(chart, titleBlock); + delete chart.titleBlock; + } + } +}; + +var plugins = {}; +var filler = plugin_filler; +var legend = plugin_legend; +var title = plugin_title; +plugins.filler = filler; +plugins.legend = legend; +plugins.title = title; + +/** + * @namespace Chart + */ + + +core_controller.helpers = helpers$1; + +// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! +core_helpers(core_controller); + +core_controller._adapters = core_adapters; +core_controller.Animation = core_animation; +core_controller.animationService = core_animations; +core_controller.controllers = controllers; +core_controller.DatasetController = core_datasetController; +core_controller.defaults = core_defaults; +core_controller.Element = core_element; +core_controller.elements = elements; +core_controller.Interaction = core_interaction; +core_controller.layouts = core_layouts; +core_controller.platform = platform; +core_controller.plugins = core_plugins; +core_controller.Scale = core_scale; +core_controller.scaleService = core_scaleService; +core_controller.Ticks = core_ticks; +core_controller.Tooltip = core_tooltip; + +// Register built-in scales + +core_controller.helpers.each(scales, function(scale, type) { + core_controller.scaleService.registerScaleType(type, scale, scale._defaults); +}); + +// Load to register built-in adapters (as side effects) + + +// Loading built-in plugins + +for (var k in plugins) { + if (plugins.hasOwnProperty(k)) { + core_controller.plugins.register(plugins[k]); + } +} + +core_controller.platform.initialize(); + +var src = core_controller; +if (typeof window !== 'undefined') { + window.Chart = core_controller; +} + +// DEPRECATIONS + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Chart + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +core_controller.Chart = core_controller; + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Legend + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.Legend = plugins.legend._element; + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Title + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.Title = plugins.title._element; + +/** + * Provided for backward compatibility, use Chart.plugins instead + * @namespace Chart.pluginService + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.pluginService = core_controller.plugins; + +/** + * Provided for backward compatibility, inheriting from Chart.PlugingBase has no + * effect, instead simply create/register plugins via plain JavaScript objects. + * @interface Chart.PluginBase + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ +core_controller.PluginBase = core_controller.Element.extend({}); + +/** + * Provided for backward compatibility, use Chart.helpers.canvas instead. + * @namespace Chart.canvasHelpers + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +core_controller.canvasHelpers = core_controller.helpers.canvas; + +/** + * Provided for backward compatibility, use Chart.layouts instead. + * @namespace Chart.layoutService + * @deprecated since version 2.7.3 + * @todo remove at version 3 + * @private + */ +core_controller.layoutService = core_controller.layouts; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.LinearScaleBase + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ +core_controller.LinearScaleBase = scale_linearbase; + +/** + * Provided for backward compatibility, instead we should create a new Chart + * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ +core_controller.helpers.each( + [ + 'Bar', + 'Bubble', + 'Doughnut', + 'Line', + 'PolarArea', + 'Radar', + 'Scatter' + ], + function(klass) { + core_controller[klass] = function(ctx, cfg) { + return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, { + type: klass.charAt(0).toLowerCase() + klass.slice(1) + })); + }; + } +); + +return src; + +}))); diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.min.js b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.min.js new file mode 100644 index 00000000..0ef77455 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.min.js @@ -0,0 +1,911 @@ +/* + CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ + Copyright 2018 fenopix + + --------------------- License Information -------------------- + CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. + https://canvasjs.com/license/ + +*/ +/*eslint-disable*/ +/*jshint ignore:start*/ +(function(){function qa(k,p){k.prototype=eb(p.prototype);k.prototype.constructor=k;k.base=p.prototype}function eb(k){function p(){}p.prototype=k;return new p}function Ya(k,p,D){"millisecond"===D?k.setMilliseconds(k.getMilliseconds()+1*p):"second"===D?k.setSeconds(k.getSeconds()+1*p):"minute"===D?k.setMinutes(k.getMinutes()+1*p):"hour"===D?k.setHours(k.getHours()+1*p):"day"===D?k.setDate(k.getDate()+1*p):"week"===D?k.setDate(k.getDate()+7*p):"month"===D?k.setMonth(k.getMonth()+1*p):"year"===D&&k.setFullYear(k.getFullYear()+ +1*p);return k}function $(k,p){var D=!1;0>k&&(D=!0,k*=-1);k=""+k;for(p=p?p:1;k.length
Please right click on the image and save it to your device
"), +p.document.close()}}}function N(k){var p=((k&16711680)>>16).toString(16),D=((k&65280)>>8).toString(16);k=((k&255)>>0).toString(16);p=2>p.length?"0"+p:p;D=2>D.length?"0"+D:D;k=2>k.length?"0"+k:k;return"#"+p+D+k}function fb(k,p){var D=this.length>>>0,r=Number(p)||0,r=0>r?Math.ceil(r):Math.floor(r);for(0>r&&(r+=D);rD;D++)if(k[D]!==k[D+4]|k[D]!==k[D+8]|k[D]!==k[D+12]){p=!1;break}return p?k[0]<<16|k[1]<<8|k[2]:0}function na(k,p,D){return k in p?p[k]:D[k]}function Oa(k,p,D){if(r&&bb){var u=k.getContext("2d");Pa=u.webkitBackingStorePixelRatio|| +u.mozBackingStorePixelRatio||u.msBackingStorePixelRatio||u.oBackingStorePixelRatio||u.backingStorePixelRatio||1;W=Ua/Pa;k.width=p*W;k.height=D*W;Ua!==Pa&&(k.style.width=p+"px",k.style.height=D+"px",u.scale(W,W))}else k.width=p,k.height=D}function hb(k){if(!ib){var p=!1,D=!1;"undefined"===typeof ra.Chart.creditHref?(k.creditHref=ja("iuuqr;..b`ow`rkr/bnl."),k.creditText=ja("B`ow`rKR/bnl")):(p=k.updateOption("creditText"),D=k.updateOption("creditHref"));if(k.creditHref&&k.creditText){k._creditLink|| +(k._creditLink=document.createElement("a"),k._creditLink.setAttribute("class","canvasjs-chart-credit"),k._creditLink.setAttribute("title","JavaScript Charts"),k._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:2px;top:"+(k.height-14)+"px;color:dimgrey;text-decoration:none;font-size:11px;font-family: Calibri, Lucida Grande, Lucida Sans Unicode, Arial, sans-serif"),k._creditLink.setAttribute("tabIndex",-1),k._creditLink.setAttribute("target","_blank"));if(0===k.renderCount|| +p||D)k._creditLink.setAttribute("href",k.creditHref),k._creditLink.innerHTML=k.creditText;k._creditLink&&k.creditHref&&k.creditText?(k._creditLink.parentElement||k._canvasJSContainer.appendChild(k._creditLink),k._creditLink.style.top=k.height-14+"px"):k._creditLink.parentElement&&k._canvasJSContainer.removeChild(k._creditLink)}}}function ta(k,p){Ja&&(this.canvasCount|=0,window.console.log(++this.canvasCount));var D=document.createElement("canvas");D.setAttribute("class","canvasjs-chart-canvas");Oa(D, +k,p);r||"undefined"===typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(D);return D}function sa(k,p,D){for(var r in D)p.style[r]=D[r]}function ua(k,p,D){p.getAttribute("state")||(p.style.backgroundColor=k.toolbar.backgroundColor,p.style.color=k.toolbar.fontColor,p.style.border="none",sa(k,p,{WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",userSelect:"none"}));p.getAttribute("state")!==D&&(p.setAttribute("state",D),p.setAttribute("type","button"),sa(k,p,{padding:"5px 12px", +cursor:"pointer","float":"left",width:"40px",height:"25px",outline:"0px",verticalAlign:"baseline",lineHeight:"0"}),p.setAttribute("title",k._cultureInfo[D+"Text"]),p.innerHTML=""+k._cultureInfo[D+"Text"]+"")}function Qa(){for(var k=null,p=0;pa?"a":"p";case "tt":return 12>a?"am":"pm";case "T":return 12>a?"A": +"P";case "TT":return 12>a?"AM":"PM";case "K":return S?"UTC":(String(z).match(H)||[""]).pop().replace(F,"");case "z":return(0k?!0:!1;u&&(k*=-1);var v=r?r.decimalSeparator:".",H=r?r.digitGroupSeparator: +",",F="";p=String(p);var F=1,z=r="",E=-1,L=[],R=[],I=0,N=0,S=0,O=!1,U=0,z=p.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|\u2030|./g);p=null;for(var Q=0;z&&QE)E=Q;else{if("%"===p)F*=100;else if("\u2030"===p){F*=1E3;continue}else if(","===p[0]&&"."===p[p.length-1]){F/=Math.pow(1E3,p.length-1);E=Q+p.length-1;continue}else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||(O=!0);0>E?(L.push(p),"#"===p||"0"===p?I++:","===p&&S++):(R.push(p),"#"!==p&&"0"!==p||N++)}O&&(p=Math.floor(k), +z=-Math.floor(Math.log(k)/Math.LN10+1),U=0===k?0:0===p?-(I+z):String(p).length-I,F/=Math.pow(10,U));0>E&&(E=Q);F=(k*F).toFixed(N);p=F.split(".");F=(p[0]+"").split("");k=(p[1]+"").split("");F&&"0"===F[0]&&F.shift();for(O=z=Q=N=E=0;0U?p.replace("+","").replace("-",""):p.replace("-",""),r+=p.replace(/[0]+/,function(k){return $(U,k.length)}));H="";for(L=!1;0U?p.replace("+","").replace("-",""):p.replace("-",""),H+=p.replace(/[0]+/,function(k){return $(U,k.length)}));r+=(L?v:"")+H;return u?"-"+r:r},Ra=function(k){var p=0,r=0;k=k||window.event;k.offsetX||0===k.offsetX?(p=k.offsetX,r=k.offsetY):k.layerX||0==k.layerX?(p=k.layerX,r=k.layerY):(p=k.pageX-k.target.offsetLeft, +r=k.pageY-k.target.offsetTop);return{x:p,y:r}},bb=!0,Ua=window.devicePixelRatio||1,Pa=1,W=bb?Ua/Pa:1,ea=function(k,p,r,u,v,H,F,z,E,L,R,N,O){"undefined"===typeof O&&(O=1);F=F||0;z=z||"black";var I=15p)v=H-1;else break}r>p&&1H&&(F=p.pop(),u-=F.height,v=z)}this._wrappedText={lines:p,width:v,height:u};this.width=v+(this.leftPadding+this.rightPadding);this.height=u+(this.topPadding+this.bottomPadding);this.ctx.font=r};ka.prototype._getFontString=function(){var k;k=""+(this.fontStyle?this.fontStyle+" ":"");k+=this.fontWeight?this.fontWeight+" ":"";k+=this.fontSize?this.fontSize+"px ":"";var p=this.fontFamily?this.fontFamily+"":"";!r&&p&&(p=p.split(",")[0],"'"!==p[0]&&'"'!==p[0]&&(p="'"+p+"'"));return k+=p}; +qa(Va,V);qa(Aa,V);Aa.prototype.setLayout=function(){if(this.text){var k=this.dockInsidePlotArea?this.chart.plotArea:this.chart,p=k.layoutManager.getFreeSpace(),r=p.x1,v=p.y1,E=0,H=0,F=this.chart._menuButton&&this.chart.exportEnabled&&"top"===this.verticalAlign?22:0,z,I;"top"===this.verticalAlign||"bottom"===this.verticalAlign?(null===this.maxWidth&&(this.maxWidth=p.width-4-F*("center"===this.horizontalAlign?2:1)),H=0.5*p.height-this.margin-2,E=0):"center"===this.verticalAlign&&("left"===this.horizontalAlign|| +"right"===this.horizontalAlign?(null===this.maxWidth&&(this.maxWidth=p.height-4),H=0.5*p.width-this.margin-2):"center"===this.horizontalAlign&&(null===this.maxWidth&&(this.maxWidth=p.width-4),H=0.5*p.height-4));var L;u(this.padding)||"number"!==typeof this.padding?u(this.padding)||"object"!==typeof this.padding||(L=this.padding.top?this.padding.top:this.padding.bottom?this.padding.bottom:0,L+=this.padding.bottom?this.padding.bottom:this.padding.top?this.padding.top:0,L*=1.25):L=2.5*this.padding;this.wrap|| +(H=Math.min(H,Math.max(1.5*this.fontSize,this.fontSize+L)));H=new ka(this.ctx,{fontSize:this.fontSize,fontFamily:this.fontFamily,fontColor:this.fontColor,fontStyle:this.fontStyle,fontWeight:this.fontWeight,horizontalAlign:this.horizontalAlign,verticalAlign:this.verticalAlign,borderColor:this.borderColor,borderThickness:this.borderThickness,backgroundColor:this.backgroundColor,maxWidth:this.maxWidth,maxHeight:H,cornerRadius:this.cornerRadius,text:this.text,padding:this.padding,textBaseline:"top"}); +L=H.measureText();"top"===this.verticalAlign||"bottom"===this.verticalAlign?("top"===this.verticalAlign?(v=p.y1+2,I="top"):"bottom"===this.verticalAlign&&(v=p.y2-2-L.height,I="bottom"),"left"===this.horizontalAlign?r=p.x1+2:"center"===this.horizontalAlign?r=p.x1+p.width/2-L.width/2:"right"===this.horizontalAlign&&(r=p.x2-2-L.width-F),z=this.horizontalAlign,this.width=L.width,this.height=L.height):"center"===this.verticalAlign&&("left"===this.horizontalAlign?(r=p.x1+2,v=p.y2-2-(this.maxWidth/2-L.width/ +2),E=-90,I="left",this.width=L.height,this.height=L.width):"right"===this.horizontalAlign?(r=p.x2-2,v=p.y1+2+(this.maxWidth/2-L.width/2),E=90,I="right",this.width=L.height,this.height=L.width):"center"===this.horizontalAlign&&(v=k.y1+(k.height/2-L.height/2),r=k.x1+(k.width/2-L.width/2),I="center",this.width=L.width,this.height=L.height),z="center");H.x=r;H.y=v;H.angle=E;H.horizontalAlign=z;this._textBlock=H;k.layoutManager.registerSpace(I,{width:this.width+("left"===I||"right"===I?this.margin+2:0), +height:this.height+("top"===I||"bottom"===I?this.margin+2:0)});this.bounds={x1:r,y1:v,x2:r+this.width,y2:v+this.height};this.ctx.textBaseline="top"}};Aa.prototype.render=function(){this._textBlock&&this._textBlock.render(!0)};qa(Ka,V);Ka.prototype.setLayout=Aa.prototype.setLayout;Ka.prototype.render=Aa.prototype.render;Wa.prototype.get=function(k,p){var r=null;0a[g].x&&0w?{x:a[l].x+w/3,y:a[l].y+c/3}:{x:a[l].x,y:a[l].y+c/9};l=e;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[l].x-a[g].x?0.01:a[l].x-a[g].x))*(d- +1)/2+1;w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0w?{x:a[l].x-w/3,y:a[l].y-c/3}:{x:a[l].x,y:a[l].y-c/9};b[b.length]=a[e]}return b}function E(a,d,b,c,e,g,m,l,w,h){var s=0;h?(m.color=g,l.color=g):h=1;s=w?Math.abs(e-b):Math.abs(c-d);s=0this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360);this.options.scaleBreaks&&(this.scaleBreaks=new Q(this.chart, +this.options.scaleBreaks,++this.chart._eventManager.lastObjectId,this));this.stripLines=[];if(this.options.stripLines&&0=this._appliedBreaks[a+1].startValue&&(this._appliedBreaks[a].endValue=Math.max(this._appliedBreaks[a].endValue,this._appliedBreaks[a+1].endValue),window.console&&window.console.log("CanvasJS Error: Breaks "+a+" and "+(a+1)+" are overlapping."),this._appliedBreaks.splice(a,2),a--)}}function L(a,d,b,c,e,g){L.base.constructor.call(this,"Break",d,b,c,g);this.id=e;this.chart=a;this.ctx=this.chart.ctx;this.scaleBreaks=g;this.optionsName= +d;this.isOptionsInArray=!0;this.type=b.type?this.type:g.type;this.fillOpacity=u(b.fillOpacity)?g.fillOpacity:this.fillOpacity;this.lineThickness=u(b.lineThickness)?g.lineThickness:this.lineThickness;this.color=b.color?this.color:g.color;this.lineColor=b.lineColor?this.lineColor:g.lineColor;this.lineDashType=b.lineDashType?this.lineDashType:g.lineDashType;!u(this.startValue)&&this.startValue.getTime&&(this.startValue=this.startValue.getTime());!u(this.endValue)&&this.endValue.getTime&&(this.endValue= +this.endValue.getTime());"number"===typeof this.startValue&&("number"===typeof this.endValue&&this.endValue=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers);O(this._zoomButton,"mouseout",function(){d||(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(0%)", +filter:"invert(0%)"}))},this.allDOMEventHandlers)}this._resetButton||(d=!1,va(this._resetButton=document.createElement("button")),ua(this,this._resetButton,"reset"),this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor,this._toolBar.appendChild(this._resetButton),O(this._resetButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._resetButton,"click",function(){a.toolTip.hide();a.zoomEnabled||a.panEnabled?(a.zoomEnabled= +!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"),a._defaultCursor="default",a.overlaidCanvas.style.cursor=a._defaultCursor):(a.zoomEnabled=!1,a.panEnabled=!1);if(a.sessionVariables.axisX)for(var c=0;c=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers),O(this._resetButton,"mouseout",function(){d||(sa(a,a._resetButton, +{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers),this.overlaidCanvas.style.cursor=a._defaultCursor);this.zoomEnabled||this.panEnabled||(this._zoomButton?(a._zoomButton.getAttribute("state")===a._cultureInfo.zoomText?(this.panEnabled=!0,this.zoomEnabled=!1):(this.zoomEnabled=!0,this.panEnabled= +!1),Qa(a._zoomButton,a._resetButton)):(this.zoomEnabled=!0,this.panEnabled=!1))}else this.panEnabled=this.zoomEnabled=!1;this._menuButton?this.exportEnabled?Qa(this._menuButton):va(this._menuButton):this.exportEnabled&&r&&(d=!1,this._menuButton=document.createElement("button"),ua(this,this._menuButton,"menu"),this._toolBar.appendChild(this._menuButton),O(this._menuButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._menuButton,"click",function(){"none"!==a._dropdownMenu.style.display|| +a._dropDownCloseTime&&500>=(new Date).getTime()-a._dropDownCloseTime.getTime()||(a._dropdownMenu.style.display="block",a._menuButton.blur(),a._dropdownMenu.focus())},this.allDOMEventHandlers,!0),O(this._menuButton,"mouseover",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.fontColorOnHover}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers,!0), +O(this._menuButton,"mouseout",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers,!0));if(!this._dropdownMenu&&this.exportEnabled&&r){d=!1;this._dropdownMenu=document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);var b=-1!==this.theme.indexOf("dark")?"black":"#888888";this._dropdownMenu.style.cssText= +"position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 0px;top: 25px;min-width: 120px;outline: 0;font-size: 14px; font-family: Arial, Helvetica, sans-serif;padding: 5px 0px 5px 0px;text-align: left;line-height: 10px;background-color:"+this.toolbar.backgroundColor+";box-shadow: 2px 2px 10px "+b;a._dropdownMenu.style.display="none";this._toolBar.appendChild(this._dropdownMenu);O(this._dropdownMenu,"blur",function(){va(a._dropdownMenu); +a._dropDownCloseTime=new Date},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.printText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers, +!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){a.print();va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.saveJPGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d= +!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"jpeg",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText= +"padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.savePNGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor, +this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"png",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0)}"none"!==this._toolBar.style.display&&this._zoomButton&&(this.panEnabled?ua(a,a._zoomButton,"zoom"):ua(a,a._zoomButton,"pan"),a._resetButton.getAttribute("state")!==a._cultureInfo.resetText&&ua(a,a._resetButton,"reset"));this.options.toolTip&&this.toolTip.options!==this.options.toolTip&&(this.toolTip.options=this.options.toolTip); +for(var c in this.toolTip.options)this.toolTip.options.hasOwnProperty(c)&&this.toolTip.updateOption(c)};p.prototype._updateSize=function(){var a;a=[this.canvas,this._preRenderCanvas,this.overlaidCanvas,this._eventManager.ghostCanvas];var d=0,b=0;this.options.width?d=this.width:this.width=d=0c.linkedDataSeriesIndex||c.linkedDataSeriesIndex>=this.options.data.length||"number"!==typeof c.linkedDataSeriesIndex|| +"error"===this.options.data[c.linkedDataSeriesIndex].type)&&(c.linkedDataSeriesIndex=null);null===c.name&&(c.name="DataSeries "+a);null===c.color?1a&&"undefined"!==typeof w.startTimePercent?a>=w.startTimePercent&&w.animationCallback(w.easingFunction(a-w.startTimePercent,0,1,1-w.startTimePercent),w):w.animationCallback(w.easingFunction(a,0,1,1),w);s.dispatchEvent("dataAnimationIterationEnd",{chart:s})},function(){b=[];for(var a=0;aa.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c);ed.max&&"number"===typeof e&&(d.max=e);if(0B&&(B=1/B);b.minDiff>B&&1!==B&&(b.minDiff=B)}else B=c-l.dataPoints[w-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B);null!==e&&null!==l.dataPoints[w-1].y&&(a.axisY.logarithmic?(B=e/l.dataPoints[w-1].y,1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e-l.dataPoints[w-1].y,0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B)))}if(cf&& +!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&qd.viewPortMax&&"number"===typeof e&&(d.viewPortMax=e))}}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype._processStackedPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d= +a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=[],l=[],w=Infinity,h=-Infinity,s=0;sb.max&&(b.max=c);if(0r&&(r=1/r);b.minDiff>r&&1!==r&&(b.minDiff=r)}else r=c-q.dataPoints[n-1].x,0>r&&(r*=-1),b.minDiff>r&&0!==r&&(b.minDiff=r);null!==e&&null!==q.dataPoints[n-1].y&&(a.axisY.logarithmic?0r&&(r=1/r),d.minDiff>r&&1!==r&&(d.minDiff=r)):(r=e-q.dataPoints[n-1].y,0>r&&(r*=-1),d.minDiff>r&&0!==r&&(d.minDiff=r)))}if(ct&&!B)B=!0;else if(c>t&&B)continue;q.dataPoints[n].label&&(a.axisX.labels[c]=q.dataPoints[n].label);cb.viewPortMax&&(b.viewPortMax=c);null===q.dataPoints[n].y?b.viewPortMin===c&&kd.max&&(d.max=a),nb.viewPortMax||(ad.viewPortMax&& +(d.viewPortMax=a)));for(n in l)l.hasOwnProperty(n)&&!isNaN(n)&&(a=l[n],ad.max&&(d.max=Math.max(a,h)),nb.viewPortMax||(ad.viewPortMax&&(d.viewPortMax=Math.max(a,h))))}};p.prototype._processStacked100PlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=!1,l=!1,w=[],h=0;hb.max&&(b.max=c);if(0t&&(t=1/t);b.minDiff>t&&1!==t&&(b.minDiff=t)}else t=c-s.dataPoints[q-1].x,0>t&&(t*=-1),b.minDiff>t&&0!==t&&(b.minDiff=t);u(e)||null===s.dataPoints[q-1].y||(a.axisY.logarithmic?0t&&(t=1/t),d.minDiff>t&&1!==t&&(d.minDiff=t)):(t=e-s.dataPoints[q-1].y,0>t&&(t*=-1),d.minDiff>t&&0!==t&&(d.minDiff=t)))}if(cr&&!f)f=!0;else if(c>r&&f)continue;s.dataPoints[q].label&&(a.axisX.labels[c]=s.dataPoints[q].label); +cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&Be&&(l=!0),w[c]=w[c]?w[c]+Math.abs(e):Math.abs(e))}}s.axisX.valueType=s.xValueType=g?"dateTime":"number"}a.axisY.logarithmic?(d.max=u(d.viewPortMax)?99*Math.pow(a.axisY.logarithmBase,-0.05):Math.max(d.viewPortMax,99*Math.pow(a.axisY.logarithmBase,-0.05)),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&!l?(d.max=u(d.viewPortMax)? +99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&l?(d.max=u(d.viewPortMax)?99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99)):!m&&l&&(d.max=u(d.viewPortMax)?-1:Math.max(d.viewPortMax,-1),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99));d.viewPortMin=d.min;d.viewPortMax=d.max;a.dataPointYSums=w}};p.prototype._processMultiYPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo, +b=a.axisX.dataInfo,c,e,g,m,l=!1,w=0;wb.max&&(b.max=c);gd.max&&(d.max=m);0B&&(B=1/B),b.minDiff>B&&1!==B&&(b.minDiff=B)):(B=c-h.dataPoints[s-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B)),e&&(null!==e[0]&&h.dataPoints[s-1].y&&null!==h.dataPoints[s-1].y[0])&&(a.axisY.logarithmic?(B=e[0]/ +h.dataPoints[s-1].y[0],1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e[0]-h.dataPoints[s-1].y[0],0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B))));if(!(ct&&!n)n=!0;else if(c>t&&n)continue;h.dataPoints[s].label&&(a.axisX.labels[c]=h.dataPoints[s].label);cb.viewPortMax&&(b.viewPortMax=c);if(b.viewPortMin===c&&e)for(p=0;pd.viewPortMax&&(d.viewPortMax=m))}}h.axisX.valueType=h.xValueType=l?"dateTime":"number"}};p.prototype._processSpecificPlotUnit=function(a){if("waterfall"===a.type&&a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c),l.dataPointEOs[w].cumulativeSumd.max&&(d.max=l.dataPointEOs[w].cumulativeSum),0q&&(q=1/q),b.minDiff>q&&1!==q&&(b.minDiff=q)):(q=c-l.dataPoints[w-1].x,0>q&&(q*=-1),b.minDiff>q&&0!==q&&(b.minDiff=q)),null!==e&&null!==l.dataPoints[w- +1].y&&(a.axisY.logarithmic?(e=l.dataPointEOs[w].cumulativeSum/l.dataPointEOs[w-1].cumulativeSum,1>e&&(e=1/e),d.minDiff>e&&1!==e&&(d.minDiff=e)):(e=l.dataPointEOs[w].cumulativeSum-l.dataPointEOs[w-1].cumulativeSum,0>e&&(e*=-1),d.minDiff>e&&0!==e&&(d.minDiff=e)))),!(cf&&!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);0d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w-1].cumulativeSum));l.dataPointEOs[w].cumulativeSumd.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w].cumulativeSum)}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype.calculateAutoBreaks=function(){function a(a,c,b,e){if(e)return b= +Math.pow(Math.min(b*a/c,c/a),0.2),1>=b&&(b=Math.pow(1>a?1/a:Math.min(c/a,a),0.25)),{startValue:a*b,endValue:c/b};b=0.2*Math.min(b-c+a,c-a);0>=b&&(b=0.25*Math.min(c-a,Math.abs(a)));return{startValue:a+b,endValue:c-b}}function d(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){var c=a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<=a.axisX.scaleBreaks.maxNumberOfAutoBreaks,b=a.axisY.scaleBreaks&&a.axisY.scaleBreaks.autoCalculate&&1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks;if(c|| +b)for(var d=a.axisY.dataInfo,f=a.axisX.dataInfo,g,h=f.min,l=f.max,m=d.min,n=d.max,f=f._dataRanges,d=d._dataRanges,q,w=0,s=0;sk.dataPoints.length))for(w=0;wf[q].max&&(f[q].max=g)),b){var r= +(n+1-m)*Math.max(parseFloat(a.axisY.scaleBreaks.collapsibleThreshold)||10,10)/100;if((g="waterfall"===a.type?k.dataPointEOs[w].cumulativeSum:k.dataPoints[w].y)&&g.length)for(var p=0;pd[q].max&&(d[q].max=g[p]);else u(g)||(q=Math.floor((g-m)/r),gd[q].max&&(d[q].max=g))}}}}function b(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)&&a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<= +a.axisX.scaleBreaks.maxNumberOfAutoBreaks)for(var c=a.axisX.dataInfo,b=c.min,d=c.max,f=c._dataRanges,g,h=0,l=0;lm.dataPoints.length))for(h=0;hf[g].max&&(f[g].max=c)}}for(var c,e=this,g=!1,m=0;m< +this._axes.length;m++)if(this._axes[m].scaleBreaks&&this._axes[m].scaleBreaks.autoCalculate&&1<=this._axes[m].scaleBreaks.maxNumberOfAutoBreaks){g=!0;this._axes[m].dataInfo._dataRanges=[];for(var l=0;l<100/Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10);l++)this._axes[m].dataInfo._dataRanges.push({min:Infinity,max:-Infinity})}if(g){for(m=0;ms[f].max&&(s[f].max=q)}delete this._axes[m].dataInfo.dataPointYPositiveSums}if(this._axes[m].dataInfo.dataPointYNegativeSums){n= +this._axes[m].dataInfo.dataPointYNegativeSums;s=h;for(l in n)n.hasOwnProperty(l)&&!isNaN(l)&&(q=-1*n[l],u(q)||(f=Math.floor((q-w)/c),qs[f].max&&(s[f].max=q)));delete this._axes[m].dataInfo.dataPointYNegativeSums}for(l=0;lc&&g.push({diff:q,start:s,end:w});break}else l++;if(this._axes[m].scaleBreaks.customBreaks)for(l=0;l=e.x1&&(a<=e.x2&&d>=e.y1&&d<=e.y2)&&(c=e.id)}return c};p.prototype.getAutoFontSize=lb;p.prototype.resetOverlayedCanvas=function(){this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height)};p.prototype.clearCanvas=kb;p.prototype.attachEvent=function(a){this._events.push(a)};p.prototype._touchEventHandler=function(a){if(a.changedTouches&&this.interactivityEnabled){var d=[],b=a.changedTouches,c=b?b[0]:a,e=null;switch(a.type){case "touchstart":case "MSPointerDown":d=["mousemove","mousedown"];this._lastTouchData= +Ra(c);this._lastTouchData.time=new Date;break;case "touchmove":case "MSPointerMove":d=["mousemove"];break;case "touchend":case "MSPointerUp":var g=this._lastTouchData&&this._lastTouchData.time?new Date-this._lastTouchData.time:0,d="touchstart"===this._lastTouchEventType||"MSPointerDown"===this._lastTouchEventType||300>g?["mouseup","click"]:["mouseup"];break;default:return}if(!(b&&1g)this._lastTouchData.scroll=!0}catch(l){}this._lastTouchEventType=a.type;if(this._lastTouchData.scroll&&this.zoomEnabled)this.isDrag&&this.resetOverlayedCanvas(),this.isDrag=!1;else for(b=0;b=e.x1&&d.x<=e.x2&&d.y>=e.y1&&d.y<=e.y2){c[b].call(c.context,d.x,d.y);"mousedown"===b&&!0===c.capture?(p.capturedEventParam=c,this.overlaidCanvas.setCapture?this.overlaidCanvas.setCapture():document.documentElement.addEventListener("mouseup", +this._mouseEventHandler,!1)):"mouseup"===b&&(c.chart.overlaidCanvas.releaseCapture?c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",this._mouseEventHandler,!1));break}else c=null;a.target.style.cursor=c&&c.cursor?c.cursor:this._defaultCursor}b=this.plotArea;if(d.xb.x2||d.yb.y2)this.toolTip&&this.toolTip.enabled?this.toolTip.hide():this.resetOverlayedCanvas();this.isDrag&&this.zoomEnabled||!this._eventManager||this._eventManager.mouseEventHandler(a)}}; +p.prototype._plotAreaMouseDown=function(a,d){this.isDrag=!0;this.dragStartPoint={x:a,y:d}};p.prototype._plotAreaMouseUp=function(a,d){if(("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)&&this.isDrag){var b=d-this.dragStartPoint.y,c=a-this.dragStartPoint.x,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=!1;this.resetOverlayedCanvas();if("xySwapped"===this.plotInfo.axisPlacement)var l=g,g=e,e=l;if(this.panEnabled||this.zoomEnabled){if(this.panEnabled)for(e= +g=0;eb.maximum&&(g=b.viewportMaximum/b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum/g,b.sessionVariables.newViewportMaximum=b.viewportMaximum/g,m=!0):b.viewportMinimumb.maximum&&(g=b.viewportMaximum-b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum-g,b.sessionVariables.newViewportMaximum=b.viewportMaximum-g,m=!0);else if((!e||2Math.abs(b)&&(this.panEnabled||this.zoomEnabled)?this.toolTip.hide():this.panEnabled||this.zoomEnabled||this.toolTip.mouseMoveHandler(a, +d);if((!e||2f)var B=f,f=n,n=B;if(q.scaleBreaks)for(B=0;!g&&B=f;if(isFinite(q.dataInfo.minDiff))if(B=q.getApparentDifference(n,f,null,!0),!(g||!(this.panEnabled&&q.scaleBreaks&&q.scaleBreaks._appliedBreaks.length)&&(q.logarithmic&&Bq.maximum))w.push(q),s.push({val1:n,val2:f}),l=!0;else if(!e){l=!1;break}}return{isValid:l,axesWithValidRange:w,axesRanges:s}};p.prototype.preparePlotArea=function(){var a=this.plotArea;!r&&(0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2;a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2;a.width=a.x2-a.x1;a.height=a.y2-a.y1}this.axisY2&&0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2,a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2,a.width=a.x2-a.x1,a.height=a.y2-a.y1)}else d= +this.layoutManager.getFreeSpace(),a.x1=d.x1,a.x2=d.x2,a.y1=d.y1,a.y2=d.y2,a.width=d.width,a.height=d.height;r||(a.canvas.width=a.width,a.canvas.height=a.height,a.canvas.style.left=a.x1+"px",a.canvas.style.top=a.y1+"px",(0b.x2||h.point.yb.y2+1)continue}else if("rangearea"===s||"rangesplinearea"===s){if(h.dataPoint.xy.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("bubble")||0<=s.indexOf("scatter")){if(h.dataPoint.xy.viewportMaximum|| +h.dataPoint.yA.viewportMaximum)continue}else if(0<=s.indexOf("column")||"waterfall"===s||"error"===s&&!h.axisSwapped){if(h.dataPoint.xy.viewportMaximum||h.bounds.y1>b.y2||h.bounds.y2y.viewportMaximum||h.bounds.x1>b.x2||h.bounds.x2 +y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(h.dataPoint.xy.viewportMaximum)continue;e=m=2;"horizontal"===C?(l=f.width,w=f.height):(w=f.width,l=f.height);if("normal"===this.plotInfo.axisPlacement){if(0<=s.indexOf("line")||0<=s.indexOf("area"))t="auto",m=4;else if(0<=s.indexOf("stacked"))"auto"===t&&(t="inside");else if("bubble"===s||"scatter"===s)t="inside";q=h.point.x- +l/2;"inside"!==t?(e=b.y1,g=b.y2,0h.point.y)):(n=h.point.y+m+c,n>g-w-m-c&&(n="auto"===t?Math.min(h.point.y,g)-w-m-c:g-w-m-c,v=ng-w-m&&("bubble"===s||"scatter"===s)&&(n=Math.min(h.point.y+m,b.y2-w-m))),n=Math.min(n,g-w))}else 0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("scatter")?(t="auto",e=4):0<=s.indexOf("stacked")?"auto"===t&&(t="inside"):"bubble"===s&&(t="inside"),n=h.point.y-w/2,"inside"!==t?(m=b.x1,g=b.x2,0>ma?(q=h.point.x-l-e-c,qh.point.x)):(q=h.point.x+e+c,q>g-l-e-c&&(q="auto"=== +t?Math.min(h.point.x,g)-l-e-c:g-l-e-c,v=qma?Math.max(h.bounds.x1,b.x1)+l/2+e:Math.min(h.bounds.x2,b.x2)-l/2-e:(Math.max(h.bounds.x1,b.x1)+Math.min(h.bounds.x2,b.x2))/2,q=0>ma?Math.max(h.point.x,c)-l/2:Math.min(h.point.x,c)-l/2,q=Math.max(q,m));"vertical"===C&&(n+=w);f.x=q;f.y=n;f.render(!0);p&&("inside"!==t&&(0>s.indexOf("bar")&&("error"!==s||!h.axisSwapped)&&h.point.x>b.x1&&h.point.xs.indexOf("column")&&("error"!==s||h.axisSwapped)&&h.point.y>b.y1&&h.point.y=a.dataSeriesIndexes.length)){var c= +this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepLine=function(a){var d=a.targetCanvasCtx|| +this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&& +(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation, +easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderSpline=function(a){function d(a){a=v(a,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx;c.save();var g=this.plotArea;c.beginPath(); +c.rect(g.x1,g.y1,g.width,g.height);c.clip();for(var m=[],l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[p].y)0s[p].y===a.axisY.reversed?1:-1,color:B});u=!1}d(x)}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(g.x1,g.y1,g.width,g.height),e.beginPath());c.restore();c.beginPath();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width, +0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.dataPointWidth=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){m=a.axisX.convertValueToPixel(w);l=a.axisY.convertValueToPixel(B[g].y);m=a.axisX.reversed?m+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:m-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var k=a.axisX.reversed?m-q<<0:m+q<<0,t;0<=B[g].y?t=h:(t=l,l=h);l>t&&(c=l,l=t,t=c);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,l,k,t,c,0,null,p&&0<=B[g].y, +0>B[g].y&&p,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:m,y1:l,x2:k,y2:t};c=N(c);r&&ea(this._eventManager.ghostCtx,m,l,k,t,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"column",dataPoint:B[g],dataSeries:f,point:{x:m+(k-m)/2,y:0>B[g].y===a.axisY.reversed?l:t},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:m, +y1:Math.min(l,t),x2:k,y2:Math.max(l,t)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore(); +return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.y2?a.axisY.bounds.y2:h}}};p.prototype.renderStackedColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth? +this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q="undefined"!==typeof m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;g[c]=A+(y-q)}else A=m[c]?m[c]:0,y=q+A,q=n+A,m[c]=A+(y-q);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1, +!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedColumn",dataPoint:t[h],dataSeries:p,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q, +y)},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx, +animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderStackedColumn100=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth: +this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);q=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;q=a.axisY.convertValueToPixel(l[c]);y=g[c]?g[c]:n;g[c]=q}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=q+("undefined"!==typeof w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q=m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(q),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y1-q)&&(q=e.y1);g[c]=A+(y-q)}else A="undefined"!==typeof m[c]? +m[c]:0,y=q+A,q=n+A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y2-y)&&(y=e.y2),m[c]=A+(y-q);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&& +this._indexLabels.push({chartType:"stackedColumn100",dataPoint:t[h],dataSeries:k,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q,y)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&& +this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= +null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.options.dataPointWidth? +this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height); +b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){l=a.axisX.convertValueToPixel(w); +m=a.axisY.convertValueToPixel(B[g].y);l=a.axisX.reversed?l+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:l-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var p=a.axisX.reversed?l-q<<0:l+q<<0,t;0<=B[g].y?t=h:(t=m,m=h);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,t,l,m,p,c,0,null,k,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:t,y1:l,x2:m,y2:p};c= +N(c);r&&ea(this._eventManager.ghostCtx,t,l,m,p,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"bar",dataPoint:B[g],dataSeries:f,point:{x:0<=B[g].y?m:t,y:l+(p-l)/2},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(t,m),y1:l,x2:Math.max(t,m),y2:p},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas, +0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.x2?a.axisY.bounds.x2: +h}}};p.prototype.renderStackedBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<< +0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),s=m[c]? +m[c]:n,m[c]=y=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A=g[c]?g[c]:0;y=n+A;s+=A;g[c]=A+(s-y)}else A=m[c]?m[c]:0,y=s-A,s=n-A,m[c]=A+(s-y);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,y,x,s,v,c,0,null,u,!1,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:y,y1:x,x2:s,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,y,x,s,v,c,0,null,!1,!1,!1, +!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar",dataPoint:t[h],dataSeries:k,point:{x:0<=t[h].y?s:y,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(y,s),y1:x,x2:Math.max(y,s),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderStackedBar100=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)|| +(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save(); +b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&& +"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x;x=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var v=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,y=v+f<<0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;x=g[c]?g[c]:n;g[c]=s=a.axisY.convertValueToPixel(l[c])}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=x+(w[c]?w[c]:0),s=m[c]?m[c]: +n,m[c]=x=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(x),0<=t[h].y){var A=g[c]?g[c]:0;x=n+A;s+=A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x2-s)&&(s=e.x2);g[c]=A+(s-x)}else A=m[c]?m[c]:0,x=s-A,s=n-A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x1-x)&&(x=e.x1),m[c]=A+(s-x);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,v,s,y,c,0,null,u,!1,!1,!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k, +dataPointIndex:h,x1:x,y1:v,x2:s,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,v,s,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar100",dataPoint:t[h],dataSeries:p,point:{x:0<=t[h].y?s:x,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(x,s),y1:v,x2:Math.max(x,s),y2:y},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop", +a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!da)))if("number"!==typeof p[k].y)B.connectNullData||(da||d)||c(),da=!0;else{t=a.axisX.convertValueToPixel(x);u=a.axisY.convertValueToPixel(p[k].y);d||da?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||b===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d=t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,b=B.nullDataLineDashType,g.setLineDash(Y)),g.lineTo(t,u),r&&m.lineTo(t, +u)):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),da=d=!1):(g.lineTo(t,u),r&&m.lineTo(t,u),0==k%250&&c());q={x:t,y:u};kp[k].y===a.axisY.reversed?1:-1,color:z})}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderSplineArea=function(a){function d(){var b=v(x,2);if(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum? +t=p:0>a.axisY.viewportMaximum?t=m.y1:0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=a.axisX.lineCoordinates,m=a.axisY.lineCoordinates,l=[],w=this.plotArea;c.save();r&& +e.save();c.beginPath();c.rect(w.x1,w.y1,w.width,w.height);c.clip();r&&(e.beginPath(),e.rect(w.x1,w.y1,w.width,w.height),e.clip());for(var h=0;ha.axisX.dataInfo.viewPortMax&&(!q.connectNullData||!k)))if("number"!==typeof n[f].y)0n[f].y===a.axisY.reversed?1:-1,color:ma});k=!1}d();ia.drawMarkers(l)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(w.x1,w.y1,w.width,w.height), +this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!b))){var Z=u;"number"!==typeof k[p].y?(B.connectNullData||(b||d)||c(),b=!0):(t=a.axisX.convertValueToPixel(x),u=a.axisY.convertValueToPixel(k[p].y),d||b?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||Y===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d= +t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,Y=B.nullDataLineDashType,g.setLineDash(ca)),g.lineTo(t,Z),g.lineTo(t,u),r&&(m.lineTo(t,Z),m.lineTo(t,u))):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),b=d=!1):(g.lineTo(t,Z),r&&m.lineTo(t,Z),g.lineTo(t,u),r&&m.lineTo(t,u),0==p%250&&c()),q={x:t,y:u},pk[p].y===a.axisY.reversed?1:-1,color:z}))}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea=function(a){function d(){if(!(1>h.length)){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=[],l=this.plotArea,w=[],h=[],s=[],q=[],n=0,f,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),u=this._eventManager.ghostCtx,t,C,x;r&&u.beginPath();c.save();r&&u.save();c.beginPath();c.rect(l.x1,l.y1,l.width,l.height);c.clip();r&&(u.beginPath(),u.rect(l.x1,l.y1,l.width,l.height),u.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData||!da)))if("number"!==typeof Z.y)A.connectNullData||(da||C)||d(),da=!0;else{f=a.axisX.convertValueToPixel(g);var oa= +w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(Z.y),k-=oa;h.push({x:f,y:p-oa});w[g]=p-k;C||da?(!C&&A.connectNullData?(c.setLineDash&&(A.options.nullDataLineDashType||x===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(C=h.pop(),x=h[h.length-1],d(),c.moveTo(t.x,t.y),h.push(x),h.push(C),x=A.nullDataLineDashType, +c.setLineDash(Y)),c.lineTo(f,k),r&&u.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(u.beginPath(),u.moveTo(f,k))),da=C=!1):(c.lineTo(f,k),r&&u.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&u.moveTo(f,k),h.push({x:f,y:p-oa})));t={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&u.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(l.x1,l.y1,l.width,l.height),u.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea100=function(a){function d(){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=[],w=[],h=[],s=[],q=[],n=0,f,k,p,u,t,C=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),x=this._eventManager.ghostCtx;c.save();r&&x.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(x.beginPath(), +x.rect(m.x1,m.y1,m.width,m.height),x.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData|| +!da)))if("number"!==typeof Z.y)A.connectNullData||(da||u)||d(),da=!0;else{var oa;oa=0!==a.dataPointYSums[g]?100*(Z.y/a.dataPointYSums[g]):0;f=a.axisX.convertValueToPixel(g);var la=w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(oa),k-=la;h.push({x:f,y:C-la});w[g]=C-k;u||da?(!u&&A.connectNullData?(c.setLineDash&& +(A.options.nullDataLineDashType||t===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(u=h.pop(),t=h[h.length-1],d(),c.moveTo(p.x,p.y),h.push(t),h.push(u),t=A.nullDataLineDashType,c.setLineDash(Y)),c.lineTo(f,k),r&&x.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(x.beginPath(),x.moveTo(f,k))),da=u=!1):(c.lineTo(f,k),r&&x.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&x.moveTo(f,k),h.push({x:f,y:C-la})));p={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&x.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(l);r&&(b.drawImage(this._preRenderCanvas,0, +0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),x.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}}; +p.prototype.renderBubble=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=-Infinity,w=Infinity,h=0;ha.axisX.dataInfo.viewPortMax||"undefined"===typeof n[e].z||(f=n[e].z,f>l&&(l=f),fa.axisX.dataInfo.viewPortMax)&&"number"===typeof n[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(n[e].y);var f=n[e].z,u=2*Math.max(Math.sqrt((l===w?p/2:k+(p-k)/(l-w)*(f-w))/Math.PI)<<0,1),f=q.getMarkerProperties(e,b);f.size=u;b.globalAlpha=q.fillOpacity;ia.drawMarker(g,m,b,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;var t=q.dataPointIds[e];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:s, +dataPointIndex:e,x1:g,y1:m,size:u};u=N(t);r&&ia.drawMarker(g,m,this._eventManager.ghostCtx,f.type,f.size,u,u,f.borderThickness);(n[e].indexLabel||q.indexLabel||n[e].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"bubble",dataPoint:n[e],dataSeries:q,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/2,x2:g+f.size/2,y2:m+f.size/2},color:null})}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderScatter=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=0;la.axisX.dataInfo.viewPortMax)&&"number"===typeof s[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(s[e].y);var f=h.getMarkerProperties(e,g,m,b);b.globalAlpha=h.fillOpacity;ia.drawMarker(f.x,f.y,f.ctx,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;Math.sqrt((q-g)*(q-g)+(n-m)*(n-m))Math.min(this.plotArea.width,this.plotArea.height)||(q=h.dataPointIds[e],this._eventManager.objectMap[q]={id:q,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:e,x1:g,y1:m},q=N(q),r&&ia.drawMarker(f.x,f.y,this._eventManager.ghostCtx,f.type,f.size,q,q,f.borderThickness),(s[e].indexLabel||h.indexLabel||s[e].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"scatter",dataPoint:s[e],dataSeries:h,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/ +2,x2:g+f.size/2,y2:m+f.size/2},color:null}),q=g,n=m)}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore()); +b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderCandlestick=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=0,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,g=this.options.dataPointMaxWidth? +this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*m.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&&e>g&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,g));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&gg&&(k=g);b.save();r&&c.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(c.beginPath(),c.rect(m.x1,m.y1,m.width,m.height),c.clip());for(var p=0;pa.axisX.dataInfo.viewPortMax)&&!u(C[l].y)&&C[l].y.length&& +"number"===typeof C[l].y[0]&&"number"===typeof C[l].y[1]&&"number"===typeof C[l].y[2]&&"number"===typeof C[l].y[3]){w=a.axisX.convertValueToPixel(f);h=a.axisY.convertValueToPixel(C[l].y[0]);s=a.axisY.convertValueToPixel(C[l].y[1]);q=a.axisY.convertValueToPixel(C[l].y[2]);n=a.axisY.convertValueToPixel(C[l].y[3]);var z=w-k/2<<0,y=z+k<<0,g=t.options.fallingColor?t.fallingColor:t._colorSet[0],e=C[l].color?C[l].color:t._colorSet[0],A=Math.round(Math.max(1,0.15*k)),D=0===A%2?0:0.5,aa=t.dataPointIds[l]; +this._eventManager.objectMap[aa]={id:aa,objectType:"dataPoint",dataSeriesIndex:v,dataPointIndex:l,x1:z,y1:h,x2:y,y2:s,x3:w,y3:q,x4:w,y4:n,borderThickness:A,color:e};b.strokeStyle=e;b.beginPath();b.lineWidth=A;c.lineWidth=Math.max(A,4);"candlestick"===t.type?(b.moveTo(w-D,s),b.lineTo(w-D,Math.min(h,n)),b.stroke(),b.moveTo(w-D,Math.max(h,n)),b.lineTo(w-D,q),b.stroke(),ea(b,z,Math.min(h,n),y,Math.max(h,n),C[l].y[0]<=C[l].y[3]?t.risingColor:g,A,e,x,x,!1,!1,t.fillOpacity),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w- +D,s),c.lineTo(w-D,Math.min(h,n)),c.stroke(),c.moveTo(w-D,Math.max(h,n)),c.lineTo(w-D,q),c.stroke(),ea(c,z,Math.min(h,n),y,Math.max(h,n),e,0,null,!1,!1,!1,!1))):"ohlc"===t.type&&(b.moveTo(w-D,s),b.lineTo(w-D,q),b.stroke(),b.beginPath(),b.moveTo(w,h),b.lineTo(z,h),b.stroke(),b.beginPath(),b.moveTo(w,n),b.lineTo(y,n),b.stroke(),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w-D,s),c.lineTo(w-D,q),c.stroke(),c.beginPath(),c.moveTo(w,h),c.lineTo(z,h),c.stroke(),c.beginPath(),c.moveTo(w,n),c.lineTo(y,n),c.stroke())); +(C[l].indexLabel||t.indexLabel||C[l].indexLabelFormatter||t.indexLabelFormatter)&&this._indexLabels.push({chartType:t.type,dataPoint:C[l],dataSeries:t,point:{x:z+(y-z)/2,y:a.axisY.reversed?q:s},direction:1,bounds:{x1:z,y1:Math.min(s,q),x2:y,y2:Math.max(s,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas, +0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderBoxAndWhisker=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e= +null,g=this.plotArea,m=0,l,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*g.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&& +e>m&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(k=m);b.save();r&&c.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(c.beginPath(),c.rect(g.x1,g.y1,g.width,g.height),c.clip());for(var p=!1,p=!!a.axisY.reversed,v=0;va.axisX.dataInfo.viewPortMax)&&!u(x[m].y)&&x[m].y.length&&"number"===typeof x[m].y[0]&&"number"===typeof x[m].y[1]&&"number"===typeof x[m].y[2]&&"number"===typeof x[m].y[3]&&"number"===typeof x[m].y[4]&&5===x[m].y.length){l=a.axisX.convertValueToPixel(f);w=a.axisY.convertValueToPixel(x[m].y[0]);h=a.axisY.convertValueToPixel(x[m].y[1]);s=a.axisY.convertValueToPixel(x[m].y[2]); +q=a.axisY.convertValueToPixel(x[m].y[3]);n=a.axisY.convertValueToPixel(x[m].y[4]);var y=l-k/2<<0,A=l+k/2<<0,e=x[m].color?x[m].color:C._colorSet[0],D=Math.round(Math.max(1,0.15*k)),aa=0===D%2?0:0.5,T=x[m].whiskerColor?x[m].whiskerColor:x[m].color?C.whiskerColor?C.whiskerColor:x[m].color:C.whiskerColor?C.whiskerColor:e,Y="number"===typeof x[m].whiskerThickness?x[m].whiskerThickness:"number"===typeof C.options.whiskerThickness?C.whiskerThickness:D,ca=x[m].whiskerDashType?x[m].whiskerDashType:C.whiskerDashType, +da=u(x[m].whiskerLength)?u(C.options.whiskerLength)?k:C.whiskerLength:x[m].whiskerLength,da="number"===typeof da?0>=da?0:da>=k?k:da:"string"===typeof da?parseInt(da)*k/100>k?k:parseInt(da)*k/100:k,Z=1===Math.round(Y)%2?0.5:0,oa=x[m].stemColor?x[m].stemColor:x[m].color?C.stemColor?C.stemColor:x[m].color:C.stemColor?C.stemColor:e,la="number"===typeof x[m].stemThickness?x[m].stemThickness:"number"===typeof C.options.stemThickness?C.stemThickness:D,G=1===Math.round(la)%2?0.5:0,F=x[m].stemDashType?x[m].stemDashType: +C.stemDashType,E=x[m].lineColor?x[m].lineColor:x[m].color?C.lineColor?C.lineColor:x[m].color:C.lineColor?C.lineColor:e,H="number"===typeof x[m].lineThickness?x[m].lineThickness:"number"===typeof C.options.lineThickness?C.lineThickness:D,I=x[m].lineDashType?x[m].lineDashType:C.lineDashType,K=1===Math.round(H)%2?0.5:0,L=C.upperBoxColor,O=C.lowerBoxColor,Q=u(C.options.fillOpacity)?1:C.fillOpacity,P=C.dataPointIds[m];this._eventManager.objectMap[P]={id:P,objectType:"dataPoint",dataSeriesIndex:t,dataPointIndex:m, +x1:y,y1:w,x2:A,y2:h,x3:l,y3:s,x4:l,y4:q,y5:n,borderThickness:D,color:e,stemThickness:la,stemColor:oa,whiskerThickness:Y,whiskerLength:da,whiskerColor:T,lineThickness:H,lineColor:E};b.save();0=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth: +1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.03*this.width;var h=a.axisX.dataInfo.minDiff;isFinite(h)||(h=0.3*Math.abs(a.axisX.range));h=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(h)/Math.log(a.axisX.range):Math.abs(h)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&& +(this.dataPointMinWidth&&mm&&(h=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var s=0;sa.axisX.dataInfo.viewPortMax)&&!u(f[g].y)&&f[g].y.length&&"number"===typeof f[g].y[0]&&"number"===typeof f[g].y[1]){c=a.axisX.convertValueToPixel(w);m=a.axisY.convertValueToPixel(f[g].y[0]);l=a.axisY.convertValueToPixel(f[g].y[1]);var p=a.axisX.reversed?c+a.plotType.totalDataSeries*h/2-(a.previousDataSeriesCount+s)*h<<0:c-a.plotType.totalDataSeries*h/2+(a.previousDataSeriesCount+ +s)*h<<0,v=a.axisX.reversed?p-h<<0:p+h<<0,c=f[g].color?f[g].color:n._colorSet[g%n._colorSet.length];if(m>l){var t=m;m=l;l=t}t=n.dataPointIds[g];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:q,dataPointIndex:g,x1:p,y1:m,x2:v,y2:l};ea(b,p,m,v,l,c,0,c,k,k,!1,!1,n.fillOpacity);c=N(t);r&&ea(this._eventManager.ghostCtx,p,m,v,l,c,0,null,!1,!1,!1,!1);if(f[g].indexLabel||n.indexLabel||f[g].indexLabelFormatter||n.indexLabelFormatter)this._indexLabels.push({chartType:"rangeColumn", +dataPoint:f[g],dataSeries:n,indexKeyword:0,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?l:m},direction:f[g].y[1]>=f[g].y[0]?-1:1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c}),this._indexLabels.push({chartType:"rangeColumn",dataPoint:f[g],dataSeries:n,indexKeyword:1,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?m:l},direction:f[g].y[1]>=f[g].y[0]?1:-1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation= +"source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderError= +function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=a.axisY._position?"left"===a.axisY._position||"right"===a.axisY._position?!1:!0:!1;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=!1,m=this.plotArea,l=0,w,h,s,q,n,f,k,p=a.axisX.dataInfo.minDiff;isFinite(p)||(p=0.3*Math.abs(a.axisX.range));b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(m.x1, +m.y1,m.width,m.height),this._eventManager.ghostCtx.clip());for(var v=0,t=0;tl&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,l));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ll&&(t=l);if(0=T.length?0:T.length>=t?t:T.length:"string"===typeof T.length?parseInt(T.length)*t/100>t?t:parseInt(T.length)*t/100>t:t;T.thickness="number"===typeof T.thickness?0>T.thickness?0:Math.round(T.thickness):2;var Y={color:y[l].stemColor?y[l].stemColor:y[l].color?z.stemColor?z.stemColor:y[l].color:z.stemColor?z.stemColor:e,thickness:y[l].stemThickness?y[l].stemThickness:z.stemThickness,dashType:y[l].stemDashType? +y[l].stemDashType:z.stemDashType};Y.thickness="number"===typeof Y.thickness?0>Y.thickness?0:Math.round(Y.thickness):2;y[l].getTime?k=y[l].x.getTime():k=y[l].x;if(!(ka.axisX.dataInfo.viewPortMax)&&!u(y[l].y)&&y[l].y.length&&"number"===typeof y[l].y[0]&&"number"===typeof y[l].y[1]){var ca=a.axisX.convertValueToPixel(k);c?h=ca:w=ca;ca=a.axisY.convertValueToPixel(y[l].y[0]);c?s=ca:n=ca;ca=a.axisY.convertValueToPixel(y[l].y[1]);c?q=ca:f=ca;c?(n=a.axisX.reversed?h+(A?v: +1)*t/2-(A?D-1:0)*t<<0:h-(A?v:1)*t/2+(A?D-1:0)*t<<0,f=a.axisX.reversed?n-t<<0:n+t<<0):(s=a.axisX.reversed?w+(A?v:1)*t/2-(A?D-1:0)*t<<0:w-(A?v:1)*t/2+(A?D-1:0)*t<<0,q=a.axisX.reversed?s-t<<0:s+t<<0);!c&&n>f&&(ca=n,n=f,f=ca);c&&s>q&&(ca=s,s=q,q=ca);ca=z.dataPointIds[l];this._eventManager.objectMap[ca]={id:ca,objectType:"dataPoint",dataSeriesIndex:x,dataPointIndex:l,x1:Math.min(s,q),y1:Math.min(n,f),x2:Math.max(q,s),y2:Math.max(f,n),isXYSwapped:c,stemProperties:Y,whiskerProperties:T};E(b,Math.min(s,q), +Math.min(n,f),Math.max(q,s),Math.max(f,n),e,T,Y,c);r&&E(this._eventManager.ghostCtx,s,n,q,f,e,T,Y,c);if(y[l].indexLabel||z.indexLabel||y[l].indexLabelFormatter||z.indexLabelFormatter)this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:0,point:{x:c?y[l].y[1]>=y[l].y[0]?s:q:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?f:n},direction:y[l].y[1]>=y[l].y[0]?-1:1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c}), +this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:1,point:{x:c?y[l].y[1]>=y[l].y[0]?q:s:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?n:f},direction:y[l].y[1]>=y[l].y[0]?1:-1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height), +a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx: +d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0;var s=a.axisX.dataInfo.minDiff;isFinite(s)||(s=0.3*Math.abs(a.axisX.range));s=this.options.dataPointWidth?this.dataPointWidth:0.9* +(e.height*(a.axisX.logarithmic?Math.log(s)/Math.log(a.axisX.range):Math.abs(s)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(s=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(), +this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var q=0;qa.axisX.dataInfo.viewPortMax)&&!u(k[g].y)&&k[g].y.length&&"number"===typeof k[g].y[0]&&"number"===typeof k[g].y[1]){m=a.axisY.convertValueToPixel(k[g].y[0]); +l=a.axisY.convertValueToPixel(k[g].y[1]);w=a.axisX.convertValueToPixel(h);w=a.axisX.reversed?w+a.plotType.totalDataSeries*s/2-(a.previousDataSeriesCount+q)*s<<0:w-a.plotType.totalDataSeries*s/2+(a.previousDataSeriesCount+q)*s<<0;var v=a.axisX.reversed?w-s<<0:w+s<<0;m>l&&(c=m,m=l,l=c);c=k[g].color?k[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,w,l,v,c,0,null,p,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g, +x1:m,y1:w,x2:l,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,m,w,l,v,c,0,null,!1,!1,!1,!1);if(k[g].indexLabel||f.indexLabel||k[g].indexLabelFormatter||f.indexLabelFormatter)this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:0,point:{x:k[g].y[1]>=k[g].y[0]?m:l,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?-1:1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c}),this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:1,point:{x:k[g].y[1]>= +k[g].y[0]?l:m,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?1:-1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1, +e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeArea=function(a){function d(){if(C){var a=null;0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width,m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!s.connectNullData||!T)))if(null!==q[f].y&&q[f].y.length&&"number"===typeof q[f].y[0]&&"number"===typeof q[f].y[1]){k=a.axisX.convertValueToPixel(t);p=a.axisY.convertValueToPixel(q[f].y[0]);u=a.axisY.convertValueToPixel(q[f].y[1]);n||T?(s.connectNullData&&!n?(c.setLineDash&&(s.options.nullDataLineDashType||A===s.lineDashType&&s.lineDashType!==s.nullDataLineDashType)&&(w[w.length- +1].newLineDashArray=D,A=s.nullDataLineDashType,c.setLineDash(z)),c.lineTo(k,p),r&&e.lineTo(k,p),w.push({x:k,y:u})):(c.beginPath(),c.moveTo(k,p),C={x:k,y:p},w=[],w.push({x:k,y:u}),r&&(e.beginPath(),e.moveTo(k,p))),T=n=!1):(c.lineTo(k,p),w.push({x:k,y:u}),r&&e.lineTo(k,p),0==f%250&&d());t=s.dataPointIds[f];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:h,dataPointIndex:f,x1:k,y1:p,y2:u};fq[f].y[1]===a.axisY.reversed?-1:1,color:x}),this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:1,point:{x:k, +y:u},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?1:-1,color:x})}else T||n||d(),T=!0;d();ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1, +m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderRangeSplineArea=function(a){function d(a,b){var d=v(u,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width, +m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!f)))if(null!==k[q].y&&k[q].y.length&&"number"===typeof k[q].y[0]&&"number"===typeof k[q].y[1]){n=a.axisX.convertValueToPixel(n);f=a.axisY.convertValueToPixel(k[q].y[0]);p=a.axisY.convertValueToPixel(k[q].y[1]);var E=h.dataPointIds[q];this._eventManager.objectMap[E]={id:E,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:q, +x1:n,y1:f,y2:p};u[u.length]={x:n,y:f};z[z.length]={x:n,y:p};q=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx,e=null,g=this.plotArea,m=0,l,k,h,s,q=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),m=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;k=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width,0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0;var n= +a.axisX.dataInfo.minDiff;isFinite(n)||(n=0.3*Math.abs(a.axisX.range));n=this.options.dataPointWidth?this.dataPointWidth:0.6*(g.width*(a.axisX.logarithmic?Math.log(n)/Math.log(a.axisX.range):Math.abs(n)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&m>k&&(m=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,k));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&kk&&(n=k);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.clip());for(var f=0;fh&&(e=k,k=h,h=e);a.axisY.reversed&&(e=k,k=h,h=e);e=u.dataPointIds[m];this._eventManager.objectMap[e]={id:e,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:m,x1:l,y1:k,x2:F,y2:h}; +var T=v[m].color?v[m].color:0v[m].y===a.axisY.reversed?1:-1,bounds:{x1:l,y1:Math.min(k,h),x2:F,y2:Math.max(k,h)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height), +b.clearRect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};var ja=function(a,d,b,c,e,g,m,l,k){if(!(0>b)){"undefined"===typeof l&&(l=1);if(!r){var h=Number((m%(2*Math.PI)).toFixed(8));Number((g%(2*Math.PI)).toFixed(8))===h&&(m-=1E-4)}a.save();a.globalAlpha=l;"pie"===e?(a.beginPath(),a.moveTo(d.x,d.y),a.arc(d.x,d.y,b,g,m,!1),a.fillStyle=c,a.strokeStyle= +"white",a.lineWidth=2,a.closePath(),a.fill()):"doughnut"===e&&(a.beginPath(),a.arc(d.x,d.y,b,g,m,!1),0<=k&&a.arc(d.x,d.y,k*b,m,g,!0),a.closePath(),a.fillStyle=c,a.strokeStyle="white",a.lineWidth=2,a.fill());a.globalAlpha=1;a.restore()}};p.prototype.renderPie=function(a){function d(){if(h&&s){for(var a=0,b=0,c=0,e=0,d=0;dMath.PI/2-t&&m.midAngle +m.midAngle)c=d;a++}else if(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t){if(0===b||f[e].midAngle>m.midAngle)e=d;b++}m.hemisphere=g>Math.PI/2&&g<=3*Math.PI/2?"left":"right";m.indexLabelTextBlock=new ka(k.plotArea.ctx,{fontSize:m.indexLabelFontSize,fontFamily:m.indexLabelFontFamily,fontColor:m.indexLabelFontColor,fontStyle:m.indexLabelFontStyle,fontWeight:m.indexLabelFontWeight,horizontalAlign:"left",backgroundColor:m.indexLabelBackgroundColor,maxWidth:m.indexLabelMaxWidth,maxHeight:m.indexLabelWrap? +5*m.indexLabelFontSize:1.5*m.indexLabelFontSize,text:m.indexLabelText,padding:0,textBaseline:"top"});m.indexLabelTextBlock.measureText()}l=g=0;q=!1;for(d=0;dMath.PI/2-t&&m.midAngle3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t)&&(l<=b/2&&!q?(m.hemisphere="left",l++):(m.hemisphere="right",q=!0))}}function b(a){var b= +k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);for(b=0;bc){var d=0.07*A*Math.cos(f[b].midAngle),g=0.07*A*Math.sin(f[b].midAngle),m=!1;if(s[b].exploded){if(1E-9a.indexLabelTextBlock.y?d-e:c-f}function e(a){for(var b=null,e=1;ec(f[b],f[a])||("right"===f[a].hemisphere?f[b].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y:f[b].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y)))break;else b=null;return b}function g(a,b,d){d=(d||0)+1;if(1E3< +d)return 0;b=b||0;var m=0,h=x.y-1*r,l=x.y+1*r;if(0<=a&&ab&&n.indexLabelTextBlock.yl)return 0;var k=0,q=0,q=k=k=0;0>b?n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2>h&&n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+bl&&(b=n.indexLabelTextBlock.y+ +n.indexLabelTextBlock.height/2+b-l);b=n.indexLabelTextBlock.y+b;h=0;h="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2));q=x.x+A*Math.cos(n.midAngle);k=x.y+A*Math.sin(n.midAngle);k=Math.sqrt(Math.pow(h-q,2)+Math.pow(b-k,2));q=Math.acos(A/r);k=Math.acos((r*r+A*A-k*k)/(2*A*r));b=kc(f[h],f[a])||("right"===f[a].hemisphere?f[h].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y:f[h].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y)))break;else h=null;q=h;k=e(a);l=h=0;0>b?(l="right"===n.hemisphere?q:k,m=b,null!==l&&(q=-b,b=n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2-(f[l].indexLabelTextBlock.y+f[l].indexLabelTextBlock.height/2),b-q+h.toFixed(C)&&(m=b>p?-(b-p):-(q-(l-h)))))):0p?b-p:q-(h-l)))));m&&(d=n.indexLabelTextBlock.y+m,b=0,b="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)),n.midAngle>Math.PI/2-t&&n.midAngleh.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x-15:"right"===n.hemisphere&&("left"===a.hemisphere&&b3*Math.PI/2-t&&n.midAngle<3*Math.PI/2+t&&(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"right"===n.hemisphere&&"left"===h.hemisphere&&ba.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x- +15)),n.indexLabelTextBlock.y=d,n.indexLabelTextBlock.x=b,n.indexLabelAngle=Math.atan2(n.indexLabelTextBlock.y-x.y,n.indexLabelTextBlock.x-x.x))}return m}function m(){var a=k.plotArea.ctx;a.fillStyle="grey";a.strokeStyle="grey";a.font="16px Arial";a.textBaseline="middle";for(var b=a=0,d=0,m=!0,b=0;10>b&&(1>b||0z){for(var E=u=0,H=0;Hu?l.indexLabelText="":l.indexLabelTextBlock.maxWidth=0.85*u,0.3*l.indexLabelTextBlock.maxWidthd&&(d=y)),y=y=0,0d&&(d=y)));var K=function(a, +b,c){for(var e=[],d=0;e.push(f[b]),b!==c;b=(b+1+s.length)%s.length);e.sort(function(a,b){return a.y-b.y});for(b=0;bz){n=t.indexLabelTextBlock.x;var k=t.indexLabelTextBlock.y-t.indexLabelTextBlock.height/ +2,w=t.indexLabelTextBlock.y+t.indexLabelTextBlock.height/2,p=h.indexLabelTextBlock.y-h.indexLabelTextBlock.height/2,u=h.indexLabelTextBlock.x+h.indexLabelTextBlock.width,r=h.indexLabelTextBlock.y+h.indexLabelTextBlock.height/2;n=t.indexLabelTextBlock.x+t.indexLabelTextBlock.widthu+q||k>r+q||wa&&(a=l),m!==a&&(b=m,d+=-z),0===l%Math.max(s.length/10,3)&&(g=!0)):g=!0;g&&(0=a.dataSeriesIndexes.length)){var h= +this.data[a.dataSeriesIndexes[0]],s=h.dataPoints,q=10,n=this.plotArea,f=h.dataPointEOs,p=2,r,v=1.3,t=20/180*Math.PI,C=6,x={x:(n.x2+n.x1)/2,y:(n.y2+n.y1)/2},z=0;a=!1;for(var y=0;ya&&(e=a,d=!0);var g=s[b].color?s[b].color:h._colorSet[b%h._colorSet.length];e>c&&ja(k.plotArea.ctx, +f[b].center,f[b].radius,g,h.type,c,e,h.fillOpacity,f[b].percentInnerRadius);if(d)break}l()},function(){k.disableToolTip=!1;k._animator.animate(0,k.animatedRender?500:0,function(a){b(a);l()})})}}};var ra=function(a,d,b,c){"undefined"===typeof b&&(b=1);0>=Math.round(d.y4-d.y1)||(a.save(),a.globalAlpha=b,a.beginPath(),a.moveTo(Math.round(d.x1),Math.round(d.y1)),a.lineTo(Math.round(d.x2),Math.round(d.y2)),a.lineTo(Math.round(d.x3),Math.round(d.y3)),a.lineTo(Math.round(d.x4),Math.round(d.y4)),"undefined"!== +d.x5&&(a.lineTo(Math.round(d.x5),Math.round(d.y5)),a.lineTo(Math.round(d.x6),Math.round(d.y6))),a.closePath(),a.fillStyle=c?c:d.color,a.fill(),a.globalAplha=1,a.restore())};p.prototype.renderFunnel=function(a){function d(){for(var a=0,b=[],c=0;ck?(k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=0==k?0:a/k,h+=a/k,m=!0):(n=(Math.abs(ba)*b-Math.sqrt(k))/2,k=b-2*n/Math.abs(ba),h+=n,h>d&&(h-=n, +k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=a/k,h+=a/k,m=!0),b=k)),e.push(n);return e}function c(){if(t&&C){for(var a,b,c,e,d,g,l,h,m,n,k,q,s,w,p=[],B=[],x={percent:null,total:null},v=null,y=0;yp[y]&&(p[y]=y!==fa?t.reversed?P[y].x3-P[y].x4:P[y].x2-P[y].x1:P[y].x2-P[y].x1,p[y]/=2));s=b.indexLabelMaxWidth?b.indexLabelMaxWidth:t.options.indexLabelMaxWidth?t.indexLabelMaxWidth:p[y];if(s>p[y]||0>s)s=p[y];B[y]="inside"===t.indexLabelPlacement?P[y].height:!1;x=z.getPercentAndTotal(t,b);if(t.indexLabelFormatter||b.indexLabelFormatter)v={chart:z.options,dataSeries:t,dataPoint:b,total:x.total,percent:x.percent};b=b.indexLabelFormatter?b.indexLabelFormatter(v):b.indexLabel? +z.replaceKeywordsWithValue(b.indexLabel,b,t,y):t.indexLabelFormatter?t.indexLabelFormatter(v):t.indexLabel?z.replaceKeywordsWithValue(t.indexLabel,b,t,y):b.label?b.label:"";0>=n&&(n=0);1E3>s&&1E3-sl?l:t.indexLabelMaxWidth:l,h=J.length-1;0<=h;h--){g=C[J[h].id];c=J[h];e=c.textBlock;b=(a=n(h)b.y&&(d=!0);c=g.indexLabelMaxWidth||l;if(c>l||0>c)c=l;f.push(c)}if(d)for(h=J.length-1;0<=h;h--)a=P[h],J[h].textBlock.maxWidth= +f[f.length-(h+1)],J[h].textBlock.measureText(),J[h].textBlock.x=L-l,c=J[h].textBlock.heightpa+D&&(J[h].textBlock.y=pa+D-J[h].height),J[h].textBlock.ywa+D&&(J[h].textBlock.y=wa+D-J[h].height))}function g(){var a,b,c,e;if("inside"!==t.indexLabelPlacement)for(var d=0;dDa?f(c).x2+1:(a.x2+a.x3)/2+1:(a.x2+a.x3)/2+1:"undefined"!==typeof a.x5?cpa+D&&(J[d].textBlock.y=pa+D-J[d].height),J[d].textBlock.ywa+D&&(J[d].textBlock.y=wa+D-J[d].height)));else for(d=0;d=c?(b=d!=fa?(a.x4+a.x3)/2-e/2:(a.x5+a.x4)/2-e/2,c=d!=fa?(a.y1+a.y3)/2-c/2:(a.y1+a.y4)/2-c/2,J[d].textBlock.x=b, +J[d].textBlock.y=c):J[d].isDirty=!0)}function m(){function a(b,c){var d;if(0>b||b>=J.length)return 0;var e,f=J[b].textBlock;if(0>c){c*=-1;e=q(b);d=l(e,b);if(d>=c)return f.y-=c,c;if(0==b)return 0=c)return f.y+=c,c;if(b==P.length-1)return 0e)&&(l=n(s),!(l>=J.length-1)&&J[s].textBlock.y+J[s].height+ga>J[l].textBlock.y&&(J[s].textBlock.y=J[s].textBlock.y+J[s].height-e>e-J[s].textBlock.y?e+1:e-J[s].height-1))}for(l=P.length-1;0e&&(e=0,J[e].isDirty))break;if(J[l].textBlock.y=f){f=0;h+=J[f].height;break}e=q(f); +if(0>e){f=0;h+=J[f].height;break}}if(f!=l){g=J[f].textBlock.y;a-=g;a=h-a;g=c(a,d,f);break}}}return g}function c(a,b,d){var e=[],f=0,g=0;for(a=Math.abs(a);d<=b;d++)e.push(P[d]);e.sort(function(a,b){return a.height-b.height});for(d=0;d+m.y.toFixed(6))&&(d=g.y+d+ga-m.y,e=a(w,-d),ea?t.reversed?wa-D:pa-D:J[a].textBlock.y+J[a].height+ga)}function k(a,b,c){var d,e,f,l=[],m=D,n=[];-1!==b&&(0<=W.indexOf(b)?(e=W.indexOf(b),W.splice(e,1)):(W.push(b),W=W.sort(function(a,b){return a-b})));if(0===W.length)l= +ia;else{e=D*(1!=W.length||0!=W[0]&&W[0]!=P.length-1?2:1)/h();for(var q=0;qn&&(n*=-1),c.y1+=b-n[d],c.y2+=b-n[d],c.y3+=b-n[d],c.y4+=b-n[d],c.y5&&(c.y5+=b-n[d],c.y6+=b-n[d]),n[d]=b}};a._animator.animate(0,c,function(c){var d=a.plotArea.ctx||a.ctx;ja=!0;d.clearRect(x.x1,x.y1,x.x2-x.x1,x.y2-x.y1);d.fillStyle=a.backgroundColor;d.fillRect(x.x1,x.y1,x.width,x.height);w.changeSection(c,b);var e={};e.dataSeries=t;e.dataPoint=t.reversed?t.dataPoints[C.length-1-b]:t.dataPoints[b];e.index=t.reversed?C.length-1-b:b;a.toolTip.highlightObjects([e]); +for(e=0;ea){b=P[c];break}return b?(a=b.y6?a>b.y6?b.x3+(b.x4-b.x3)/(b.y4-b.y3)*(a-b.y3):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2), +{x1:a,x2:a}):-1}function p(a){for(var b=0;b=a.dataSeriesIndexes.length)){for(var t=this.data[a.dataSeriesIndexes[0]],C=t.dataPoints,x=this.plotArea,D=0.025*x.width,y=0.01*x.width,A=0,F=x.height-2*D,E=Math.min(x.width-2*y,2.8*x.height),H=!1,I=0;IF?N=F:0>=N&&(N=0),G>a?G=a-0.5:0>=G&&(G=0)):"pyramid"===t.type&&(G=N=0,t.reversed=t.reversed?!1:!0);var y=I+a/2,$=I,V=I+a,pa=t.reversed?Z:O,K=y-G/2,ea=y+G/2,Da=t.reversed?O+N:Z- +N,wa=t.reversed?O:Z;a=[];var y=[],P=[],E=[],X=O,fa,ba=(Da-pa)/(K-$),ha=-ba,I="area"===(t.valueRepresents?t.valueRepresents:"height")?b():d();if(-1!==I){if(t.reversed)for(E.push(X),G=I.length-1;0a&&(A=a));for(G=0;G\n');c.document.close();setTimeout(function(){c.focus();c.print();setTimeout(function(){b._canvasJSContainer.removeChild(d)},1E3)},500)};p.prototype.getPercentAndTotal=function(a,d){var b=null,c=null, +e=null;if(0<=a.type.indexOf("stacked"))c=0,b=d.x.getTime?d.x.getTime():d.x,b in a.plotUnit.yTotals&&(c=a.plotUnit.yTotals[b],e=isNaN(d.y)?0:100*(d.y/c));else if("pie"===a.type||"doughnut"===a.type||"funnel"===a.type||"pyramid"===a.type){for(b=c=0;b=m||"undefined"=== +typeof m||0>=v||"undefined"===typeof v)){if("horizontal"===this.orientation){n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:v,maxHeight:this.itemWrap?m:this.lineHeight,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"});n.textBlock.measureText();null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"=== +n.chartType?2*0.1*this.lineHeight:0)));if(!q||q.width+Math.round(n.textBlock.width+r+l+(0===q.width?0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))>g)q={items:[],width:0},h.push(q),this.height+=f,f=0;f=Math.max(f,n.textBlock.height)}else n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:x,maxHeight:!0===this.itemWrap?m:1.5*this.fontSize,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily, +fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"}),n.textBlock.measureText(),null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))),this.height>0,0),this.dataPoints.length):0):(s=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,s=0>0,0),this.dataPoints.length):0));for(;;){g=0a?c.x/a:a/c.x: +Math.abs(c.x-a);qs-e&&s+e>=this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}return d||b.dataPoint.x!==a?d&&null!==b.dataPoint?b:null:b};F.prototype.getDataPointAtXY=function(a,d,b){if(!this.dataPoints||0===this.dataPoints.length||athis.chart.plotArea.x2||dthis.chart.plotArea.y2)return null;b=b||!1;var c=[],e=0,g=0,m=1,l=!1,k=Infinity, +h=0,s=0,q=0;if("none"!==this.chart.plotInfo.axisPlacement)if(q=(this.chart.axisX[0]?this.chart.axisX[0]:this.chart.axisX2[0]).getXValueAt({x:a,y:d}),this.axisX.logarithmic)var n=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),q=1>0,0),this.dataPoints.length):0;else n=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,q=0> +0,0),this.dataPoints.length):0;for(;;){g=0=n.x1&&(a<=n.x2&&d>=n.y1&&d<=n.y2)&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1- +a),Math.abs(n.x2-a),Math.abs(n.y1-d),Math.abs(n.y2-d))}),l=!0);break;case "line":case "stepLine":case "spline":case "area":case "stepArea":case "stackedArea":case "stackedArea100":case "splineArea":case "scatter":var u=na("markerSize",f,this)||4,r=b?20:u,p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0r&&(p=Math.atan2(d-u.y,a-u.x),0>p&&(p+=2*Math.PI),p=Number(((180*(p/Math.PI)%360+360)%360).toFixed(12)),u=Number(((180*(n.startAngle/Math.PI)%360+360)%360).toFixed(12)),r=Number(((180*(n.endAngle/Math.PI)%360+360)%360).toFixed(12)),0===r&&1=r&&0!==f.y&&(r+=360,pu&&pp.y1&&dp.y6?(g=p.x6+(p.x5-p.x6)/(p.y5-p.y6)*(d-p.y6),p=p.x3+(p.x4-p.x3)/(p.y4-p.y3)*(d-p.y3)):(g=p.x1+(p.x6-p.x1)/(p.y6-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)):(g=p.x1+(p.x4-p.x1)/(p.y4-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)),a>g&&a=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y4-n.borderThickness/2&&d<=n.y1+n.borderThickness/ +2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "candlestick":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y2-n.borderThickness/2&&d<=n.y3+n.borderThickness/2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a), +Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "ohlc":if(Math.abs(n.x2-a+n.x1-a)=n.y2&&d<=n.y3||a>=n.x1&&a<=(n.x2+n.x1)/2&&d>=n.y1-n.borderThickness/2&&d<=n.y1+n.borderThickness/2||a>=(n.x1+n.x2)/2&&a<=n.x2&&d>=n.y4-n.borderThickness/2&&d<=n.y4+n.borderThickness/2)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0}if(l||1E3q-e&&q+e>= +this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}a=null;for(d=0;dq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius, +horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle",borderThickness:0}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}f=n;for(b=this.intervalStartPosition;b<=e;b=parseFloat(1E-12>this.interval?this.logarithmic&&this.equidistantInterval?b*Math.pow(this.logarithmBase,this.interval):b+this.interval:(this.logarithmic&&this.equidistantInterval? +b*Math.pow(this.logarithmBase,this.interval):b+this.interval).toFixed(12))){for(;fq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix, +horizontalAlign:"left",backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}}else for(this.intervalStartPosition=this.getLabelStartPoint(new Date(this.viewportMinimum), +this.intervalType,this.interval),e=Ya(new Date(this.viewportMaximum),this.interval,this.intervalType),f=n,b=this.intervalStartPosition;bq[f].endValue;f++);p=a;a=f=q[f].startValue&&a<=q[f].endValue;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:new Date(p),label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:Ca(p,this.valueFormatString,this.chart._cultureInfo), +a=new ka(this.ctx,{x:0,y:0,maxWidth:g,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null, +breaksLabelType:void 0}))}if("bottom"===this._position||"top"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.width*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length-2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.width/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+ +"Duration"]*this.interval,g="undefined"===typeof this.options.labelMaxWidth?0.5*this.chart.width>>0:this.options.labelMaxWidth,this.chart.panEnabled||(m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize);else if("left"===this._position||"right"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.height*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length- +2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.height/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+"Duration"]*this.interval,this.chart.panEnabled||(g="undefined"===typeof this.options.labelMaxWidth?0.3*this.chart.width>>0:this.options.labelMaxWidth),m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize; +for(c=0;cthis.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360)),"bottom"===this._position||"top"===this._position)if(g=0.9*l>>0,n=0,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize= +this.labelFontSize;this.sessionVariables.labelMaxWidth=g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=this.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;bn&&(v=b,n=p.width)}b=0;for(b=this.intervalStartPosition< +this.viewportMinimum?1:0;b>0>2*g&&(this.sessionVariables.labelAngle=-25)):(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle):u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth= +g,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p)):(this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=this.labelWrap);else{if(u(this.options.labelWrap))if(!u(this.options.labelMaxWidth))this.options.labelMaxWidth>0,f=this.labelFontSize,nq&&(q=c-2*g,c>=2*g&&c<2.2*g?(this.sessionVariables.labelMaxWidth=g,u(this.options.labelFontSize)&&12=2.2*g&&c<2.8*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=f):c>=2.8*g&&c<3.2*g?(this.sessionVariables.labelMaxWidth=Math.max(g,n),this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12=3.2*g&&c<3.6*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=this.labelFontSize):c>3.6*g&&c<5*g?(u(this.options.labelFontSize)&&125*g&&(this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelFontSize=f,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=this.labelAngle));else if(v===b&&(0===v&&n+this._labels[v+1].textBlock.measureText().width-2*g>q||v===this._labels.length-1&&n+this._labels[v-1].textBlock.measureText().width-2*g>q||0q&&n+this._labels[v-1].textBlock.measureText().width- +2*g>q))q=0===v?n+this._labels[v+1].textBlock.measureText().width-2*g:n+this._labels[v-1].textBlock.measureText().width-2*g,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p;else if(0===q)for(this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,c=0;c>0>2*g&&(this.sessionVariables.labelAngle=-25))}else(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/ +Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=0!=this.labelAngle?(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)):g,this.sessionVariables.labelMaxHeight=m=this.labelWrap?(h-p*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)):1.5*this.labelFontSize,u(this.options.labelWrap))?u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap= +this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelMaxHeight=c<0.9*l?0.9*l:c,this.sessionVariables.labelWrap=this.labelWrap)):(this.options.labelWrap?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p): +(u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelWrap=this.labelWrap),this.sessionVariables.labelMaxHeight=m)}for(c=0;c>0:this.options.labelMaxWidth,m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize=this.labelFontSize;this.sessionVariables.labelMaxWidth= +g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b>0,l-2*m>n&&(n=l-2*m,l>=2*m&&l<2.4*m?(u(this.options.labelFontSize)&&12=2.4*m&&l<2.8*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelFontSize=this.labelFontSize,this.sessionVariables.labelWrap=!0):l>=2.8*m&&l<3.2*m?(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12< +this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>=3.2*m&&l<3.6*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelFontSize=this.labelFontSize):l>3.6*m&&l<10*m?(u(this.options.labelFontSize)&& +1210*m&&l<50*m&&(u(this.options.labelFontSize)&&12this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,u(this.options.labelMaxWidth)&& +(this.sessionVariables.labelAngle=this.labelAngle))):this.options.labelWrap?(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=g):(this.sessionVariables.labelMaxHeight=m,u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap)}for(c=0;c>0:1.5*this.labelFontSize;if("left"===this._position||"right"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.width>>0:1.5*this.labelFontSize;u(g.labelBackgroundColor)&&(g.labelBackgroundColor="#EEEEEE")}else m="bottom"===this._position||"top"===this._position?0.9*this.chart.width>>0:0.9*this.chart.height>> +0,z=u(g.options.labelWrap)||g.labelWrap?"bottom"===this._position||"top"===this._position?0.8*this.chart.width>>0:0.8*this.chart.height>>0:1.5*this.labelFontSize,u(g.labelBackgroundColor)&&(u(g.startValue)&&0!==g.startValue?g.labelBackgroundColor=r?"transparent":null:g.labelBackgroundColor="#EEEEEE");a=new ka(this.ctx,{x:0,y:0,backgroundColor:g.labelBackgroundColor,borderColor:g.labelBorderColor,borderThickness:g.labelBorderThickness,cornerRadius:g.labelCornerRadius,maxWidth:g.options.labelMaxWidth? +g.options.labelMaxWidth:m,maxHeight:z,angle:this.labelAngle,text:g.labelFormatter?g.labelFormatter({chart:this.chart,axis:this,stripLine:g}):g.label,horizontalAlign:"left",fontSize:"outside"===g.labelPlacement?g.options.labelFontSize?g.labelFontSize:this.labelFontSize:g.labelFontSize,fontFamily:"outside"===g.labelPlacement?g.options.labelFontFamily?g.labelFontFamily:this.labelFontFamily:g.labelFontFamily,fontWeight:"outside"===g.labelPlacement?g.options.labelFontWeight?g.labelFontWeight:this.labelFontWeight: +g.labelFontWeight,fontColor:g.labelFontColor||g.color,fontStyle:"outside"===g.labelPlacement?g.options.labelFontStyle?g.labelFontStyle:this.fontWeight:g.labelFontStyle,textBaseline:"middle"});this._stripLineLabels.push({position:g.value,textBlock:a,effectiveHeight:null,stripLine:g})}};z.prototype.createLabelsAndCalculateWidth=function(){var a=0,d=0;this._labels=[];this._stripLineLabels=[];var b=this.chart.isNavigator?0:5;if("left"===this._position||"right"===this._position){this.createLabels();for(d= +0;d=this.viewportMinimum&&this._stripLineLabels[d].stripLine.value<=this.viewportMaximum)&& +(c=this._stripLineLabels[d].textBlock,e=c.measureText(),g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle)),a=this.viewportMinimum&&this._stripLineLabels[b].stripLine.value<=this.viewportMaximum)&&(d=this._stripLineLabels[b].textBlock,e=d.measureText(),g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)),an[f].viewportMaximum);v++)r[v].endValue=n[f].viewPortMinimum&&(n[f].scaleBreaks.lastBreakIndex=v));for(var z=v=0,t=0,C=0,x=0,D=0,y=0,A,E,F=l=0,H,I,L,r=H=I=L=!1,f=0;fv;){var G=0,R=0,S=0,U=0,W=e=0,K=0,$=0,V=0,X=0,P=0,ba=0;if(b&& +0p.width- +q?p.width-q:g.x2-ba-$);if(a&&0p.width-q?p.width-q:g.x2-ba-$),a[f]._labels&&1k&&(l+=0a[f].labelAngle?A-zk&&(l=E+t/2-k-ba),A-za[f].labelAngle&&0p.width-q?p.width-q:g.x2-ba-$),d[f].lineCoordinates.width=Math.abs(k-m),d[f]._labels&&1v;){V=U=R=S=$=K=W=e=Q=O=G=X=0;if(a&&0p.width-10?p.width-10:g.x2-V-W),b[f].labelAutoFit&&!u(C)&&(0b[f].labelAngle?Math.max(m,C):0===b[f].labelAngle? +Math.max(m,C/2):m),0c[f].chart.width-10?c[f].chart.width-10:g.x2-V-W),c[f]&& +c[f].labelAutoFit&&!u(D)&&(0b[f].chart.height-10?b[f].chart.height-10:g.y2),b[f].lineCoordinates.y1=l-(q[f]+b[f].margin+ +X),b[f].lineCoordinates.y2=l-(q[f]+b[f].margin+X),b[f].bounds={x1:m,y1:l-(q[f]+X+b[f].margin),x2:k,y2:h-(X+b[f].margin),width:k-m,height:q[f]},b[f].title&&(b[f]._titleTextBlock.maxWidth=0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0===b[K].labelAngle?k-U:m);if(c&&0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0=== +b[K].labelAngle?k-V:m);if(c&&0d[g].spacing?0:Math.abs(d[g].spacing/b),this.logarithmic&&(d[g].size=Math.pow(this.logarithmBase,d[g].size))};z.prototype.calculateBreaksInPixels=function(){if(!(this.scaleBreaks&&0>=this.scaleBreaks._appliedBreaks.length)){var a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];a.length&&(this.scaleBreaks.firstBreakIndex=this.scaleBreaks.lastBreakIndex=null);for(var d=0;dthis.conversionParameters.maximum);d++)a[d].endValue< +this.conversionParameters.minimum||(u(this.scaleBreaks.firstBreakIndex)&&(this.scaleBreaks.firstBreakIndex=d),a[d].startValue>=this.conversionParameters.minimum&&(a[d].startPixel=this.convertValueToPixel(a[d].startValue),this.scaleBreaks.lastBreakIndex=d),a[d].endValue<=this.conversionParameters.maximum&&(a[d].endPixel=this.convertValueToPixel(a[d].endValue)))}};z.prototype.renderLabelsTicksAndTitle=function(){var a=this,d=!1,b=0,c=0,e=1,g=0;0!==this.labelAngle&&360!==this.labelAngle&&(e=1.2);if("undefined"=== +typeof this.options.interval){if("bottom"===this._position||"top"===this._position)if(this.logarithmic&&!this.equidistantInterval&&this.labelAutoFit){for(var b=[],e=0!==this.labelAngle&&360!==this.labelAngle?1:1.2,m,l=this.viewportMaximum,k=this.lineCoordinates.width/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||mthis.lineCoordinates.width*e&&this.labelAutoFit&&(d=!0)}if("left"===this._position||"right"===this._position)if(this.logarithmic&& +!this.equidistantInterval&&this.labelAutoFit){for(var b=[],p,l=this.viewportMaximum,k=this.lineCoordinates.height/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||pthis.lineCoordinates.height*e&&this.labelAutoFit&&(d=!0)}}this.logarithmic&&(!this.equidistantInterval&&this.labelAutoFit)&&this._labels.sort(function(a,b){return a.position-b.position});var h=0,q,n;if("bottom"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y+this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y-(this.tickLength+q.textBlock.fontSize/2):n.y+this.tickLength+q.textBlock.fontSize/2):(n.x="inside"===this.labelPlacement?0>this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x-(0>this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0>this.labelAngle?n.y-this.tickLength-5:n.y-this.tickLength-Math.abs(q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle)+5):n.y+this.tickLength+Math.abs(0>this.labelAngle?q.textBlock.width* +Math.sin(Math.PI/180*this.labelAngle)-5:5)),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save(); +a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y-a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y2-this._titleTextBlock.height-3,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("top"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y-this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y+this.labelFontSize/2+this.tickLength+5:n.y-(this.tickLength+q.textBlock.height-q.textBlock.fontSize/2)):(n.x="inside"===this.labelPlacement?0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&& +(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y+a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y1+1,this.titleMaxWidth= +this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("left"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<< +0,c),this.ctx.lineTo(n.x-this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle?(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5):(q.textBlock.y="inside"===this.labelPlacement?n.y:n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness; +a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x+a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x1+1,this._titleTextBlock.y=this.lineCoordinates.height/2+this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("right"=== +this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<<0,c),this.ctx.lineTo(n.x+this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle? +(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width-this.tickLength-5:n.x+this.tickLength+5):(q.textBlock.y="inside"===this.labelPlacement?n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0>this.labelAngle?n.y:n.y-(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.cos(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<< +0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x-a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x2-1,this._titleTextBlock.y=this.lineCoordinates.height/2-this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}g=0;if("inside"===this.labelPlacement)this.chart.addEventListener("dataAnimationIterationEnd", +function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)||(a.ctx.save(),a.ctx.beginPath(),q.textBlock.render(!0),a.ctx.restore())},this);else for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||q.textBlock.render(!0)};z.prototype.renderInterlacedColors=function(){var a=this.chart.plotArea.ctx,d,b,c=this.chart.plotArea, +e=0;d=!0;if(("bottom"===this._position||"top"===this._position)&&this.interlacedColor)for(a.fillStyle=this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(Math.min(b.x,d.x),c.y1,Math.abs(b.x-d.x),Math.abs(c.y1-c.y2)),d=!1):d=!0;else if(("left"===this._position||"right"===this._position)&&this.interlacedColor)for(a.fillStyle= +this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(c.x1,Math.min(b.y,d.y),Math.abs(c.x1-c.x2),Math.abs(d.y-b.y)),d=!1):d=!0;a.beginPath()};z.prototype.renderStripLinesOfThicknessType=function(a){if(this.stripLines&&0this.viewportMaximum||u(h.value)||isNaN(this.range))||l.push(h))}for(c=0;cthis.viewportMaximum||isNaN(this.range))){a=this.getPixelCoordinatesOnAxis(b.position);if("outside"===b.stripLine.labelPlacement)if(h&&(this.ctx.strokeStyle= +h.color,"pixel"===h._thicknessType&&(this.ctx.lineWidth=h.thickness)),"bottom"===this._position){var p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0;this.ctx.beginPath();this.ctx.moveTo(p,a.y<<0);this.ctx.lineTo(p,a.y+this.tickLength<<0);this.ctx.stroke();0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y+=this.tickLength+b.textBlock.fontSize/2):(a.x-=0>this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0,a.y+=this.tickLength+Math.abs(0>this.labelAngle?b.textBlock.width*Math.sin(Math.PI/ +180*this.labelAngle)-5:5))}else"top"===this._position?(p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,this.ctx.beginPath(),this.ctx.moveTo(p,a.y<<0),this.ctx.lineTo(p,a.y-this.tickLength<<0),this.ctx.stroke(),0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y-=this.tickLength+b.textBlock.height):(a.x+=(b.textBlock.height-this.tickLength-this.labelFontSize/2)*Math.sin(Math.PI/180*this.labelAngle)-(0this.labelAngle?a.y:a.y-(b.textBlock.height-b.textBlock.fontSize/ +2-5)*Math.cos(Math.PI/180*this.labelAngle),a.x=0this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/ +2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+=b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y1+b.textBlock.width+3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-b.textBlock.width-3:"center"=== +b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y1+3):"top"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+= +b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+b.textBlock.width+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y2-3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y2- +b.textBlock.width-3):"left"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-b.textBlock.height>this.chart.plotArea.y1?u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3:a.y-b.textBlock.heightthis.chart.plotArea.y1? +u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2-3:a.y-b.textBlock.heightthis.viewportMaximum|| +isNaN(this.range))||a[d].render(this.maskCtx);this.maskCtx.restore()}};z.prototype.renderCrosshair=function(a,d){this.crosshair.render(a,d)};z.prototype.renderGrid=function(){if(this.gridThickness&&0this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(),d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.x<<0)+0.5:d.x<<0,a.moveTo(d,b.y1<<0),a.lineTo(d,b.y2<<0),a.stroke());else if("left"===this._position||"right"===this._position)for(var c=0;cthis.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(), +d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.y<<0)+0.5:d.y<<0,a.moveTo(b.x1<<0,d),a.lineTo(b.x2<<0,d),a.stroke());a.restore()}};z.prototype.renderAxisLine=function(){var a=this.chart.ctx,d=r?this.chart._preRenderCtx:a,b=Math.ceil(this.tickThickness/(this.reversed?-2:2)),c=Math.ceil(this.tickThickness/(this.reversed?2:-2)),e,g;d.save();if("bottom"===this._position||"top"===this._position){if(this.lineThickness){this.reversed?(e=this.lineCoordinates.x2,g=this.lineCoordinates.x1): +(e=this.lineCoordinates.x1,g=this.lineCoordinates.x2);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor?this.lineColor:"black";d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));var m=1===this.lineThickness%2?(this.lineCoordinates.y1<<0)+0.5:this.lineCoordinates.y1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+c;else for(var l= +this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(e,m),d.lineTo(this.scaleBreaks._appliedBreaks[l].startPixel+b,m),e=this.scaleBreaks._appliedBreaks[l].endPixel+c;e&&(d.moveTo(e,m),d.lineTo(g,m));d.stroke()}}else if(("left"===this._position||"right"===this._position)&&this.lineThickness){this.reversed?(e=this.lineCoordinates.y1,g=this.lineCoordinates.y2):(e=this.lineCoordinates.y2,g=this.lineCoordinates.y1);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor; +d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));m=1===this.lineThickness%2?(this.lineCoordinates.x1<<0)+0.5:this.lineCoordinates.x1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+b;else for(l=this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(m,e),d.lineTo(m,this.scaleBreaks._appliedBreaks[l].startPixel+c), +e=this.scaleBreaks._appliedBreaks[l].endPixel+b;e&&(d.moveTo(m,e),d.lineTo(m,g));d.stroke()}r&&(a.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx&&this.chart._breaksCanvasCtx.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),d.clearRect(0,0,this.chart.width,this.chart.height));d.restore()};z.prototype.getPixelCoordinatesOnAxis=function(a){var d={};if("bottom"===this._position||"top"===this._position)d.x=this.convertValueToPixel(a), +d.y=this.lineCoordinates.y1;if("left"===this._position||"right"===this._position)d.y=this.convertValueToPixel(a),d.x=this.lineCoordinates.x2;return d};z.prototype.convertPixelToValue=function(a){if("undefined"===typeof a)return null;var d=0,b=0,c,d=!0,e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b="number"===typeof a?a:"left"===this._position||"right"===this._position?a.y:a.x;if(this.logarithmic){a=c=Math.pow(this.logarithmBase,(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit); +if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;be[b].startValue/this.conversionParameters.minimum){c/=e[b].startValue/this.conversionParameters.minimum;if(ce[b].startValue/e[b-1].endValue){c/=e[b].startValue/e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum){if(1e[b].startValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].startValue/this.conversionParameters.minimum*Math.pow(e[b].size,Math.log(e[b].startValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue))*c,c*=Math.pow(e[b].size,Math.log(this.conversionParameters.minimum/e[b].startValue)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size;d=!1}else break;else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size}else break; +d=a*this.viewportMinimum}else{a=c=(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit;if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b=e[b].size?0:c*(e[b].endValue- +e[b].startValue)/e[b].size;break}else a+=e[b].endValue-this.conversionParameters.minimum-e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue),c-=e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue);d=!1}else if(c>e[b].startValue-this.conversionParameters.minimum){c-=e[b].startValue-this.conversionParameters.minimum;if(ce[b].startValue-e[b-1].endValue){c-=e[b].startValue-e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum)if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue- +e[b].startValue)/e[b].size>e[b].startValue){a=0>=e[b].size?0:c*(e[b].endValue-e[b].startValue)/e[b].size;break}else a+=e[b].startValue-this.conversionParameters.minimum+e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),c+=e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),d=!1;else if(c-1*e[b].size){a+=(e[b].endValue- +e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size;d=!1}else break;else if(c-1*e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size}else break;d=this.conversionParameters.minimum+a}return d};z.prototype.convertValueToPixel=function(a){a=this.getApparentDifference(this.conversionParameters.minimum, +a,a);return this.logarithmic?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*Math.log(a/this.conversionParameters.minimum)/this.conversionParameters.lnLogarithmBase+0.5<<0:"axisX"===this.type?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5<<0:this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5};z.prototype.getApparentDifference=function(a, +d,b,c){var e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];if(this.logarithmic){b=u(b)?d/a:b;for(var g=0;ge[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*e[g].startValue*e[g].size:a>=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*a*Math.pow(e[g].size,Math.log(e[g].endValue/a)/Math.log(e[g].endValue/e[g].startValue)):a<=e[g].startValue&&d<=e[g].endValue?b=b/d*e[g].startValue*Math.pow(e[g].size,Math.log(d/e[g].startValue)/Math.log(e[g].endValue/ +e[g].startValue)):!c&&(a>e[g].startValue&&de[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+e[g].startValue+e[g].size:a>e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+a+e[g].size*(e[g].endValue-a)/(e[g].endValue-e[g].startValue):a<=e[g].startValue&&de[g].startValue&&da[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<= +a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*this.viewportMinimum,b=0a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<=a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+this.viewportMinimum, +b=0this.maxWidth?8:6);var a=Math.max(c,Math.floor(this.maxWidth/a)),e,g,m,c=0;!u(this.options.viewportMinimum)&&(!u(this.options.viewportMaximum)&&this.options.viewportMinimum>=this.options.viewportMaximum)&& +(this.viewportMinimum=this.viewportMaximum=null);if(u(this.options.viewportMinimum)&&!u(this.sessionVariables.newViewportMinimum)&&!isNaN(this.sessionVariables.newViewportMinimum))this.viewportMinimum=this.sessionVariables.newViewportMinimum;else if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(u(this.options.viewportMaximum)&&!u(this.sessionVariables.newViewportMaximum)&&!isNaN(this.sessionVariables.newViewportMaximum))this.viewportMaximum=this.sessionVariables.newViewportMaximum; +else if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(c=0;c=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue)&& +(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue)){this.scaleBreaks._appliedBreaks.splice(c,1);break}if("axisX"===this.type){if(this.dataSeries&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g, +null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0));c=this.getApparentDifference(isNaN(this.viewportMinimum)||null===this.viewportMinimum?e:this.viewportMinimum,isNaN(this.viewportMaximum)||null===this.viewportMaximum?g:this.viewportMaximum,null, +!0);if("axisX"===this.type&&b){this.intervalType||(c/1<=a?(this.interval=1,this.intervalType="millisecond"):c/2<=a?(this.interval=2,this.intervalType="millisecond"):c/5<=a?(this.interval=5,this.intervalType="millisecond"):c/10<=a?(this.interval=10,this.intervalType="millisecond"):c/20<=a?(this.interval=20,this.intervalType="millisecond"):c/50<=a?(this.interval=50,this.intervalType="millisecond"):c/100<=a?(this.interval=100,this.intervalType="millisecond"):c/200<=a?(this.interval=200,this.intervalType= +"millisecond"):c/250<=a?(this.interval=250,this.intervalType="millisecond"):c/300<=a?(this.interval=300,this.intervalType="millisecond"):c/400<=a?(this.interval=400,this.intervalType="millisecond"):c/500<=a?(this.interval=500,this.intervalType="millisecond"):c/(1*S.secondDuration)<=a?(this.interval=1,this.intervalType="second"):c/(2*S.secondDuration)<=a?(this.interval=2,this.intervalType="second"):c/(5*S.secondDuration)<=a?(this.interval=5,this.intervalType="second"):c/(10*S.secondDuration)<=a?(this.interval= +10,this.intervalType="second"):c/(15*S.secondDuration)<=a?(this.interval=15,this.intervalType="second"):c/(20*S.secondDuration)<=a?(this.interval=20,this.intervalType="second"):c/(30*S.secondDuration)<=a?(this.interval=30,this.intervalType="second"):c/(1*S.minuteDuration)<=a?(this.interval=1,this.intervalType="minute"):c/(2*S.minuteDuration)<=a?(this.interval=2,this.intervalType="minute"):c/(5*S.minuteDuration)<=a?(this.interval=5,this.intervalType="minute"):c/(10*S.minuteDuration)<=a?(this.interval= +10,this.intervalType="minute"):c/(15*S.minuteDuration)<=a?(this.interval=15,this.intervalType="minute"):c/(20*S.minuteDuration)<=a?(this.interval=20,this.intervalType="minute"):c/(30*S.minuteDuration)<=a?(this.interval=30,this.intervalType="minute"):c/(1*S.hourDuration)<=a?(this.interval=1,this.intervalType="hour"):c/(2*S.hourDuration)<=a?(this.interval=2,this.intervalType="hour"):c/(3*S.hourDuration)<=a?(this.interval=3,this.intervalType="hour"):c/(6*S.hourDuration)<=a?(this.interval=6,this.intervalType= +"hour"):c/(1*S.dayDuration)<=a?(this.interval=1,this.intervalType="day"):c/(2*S.dayDuration)<=a?(this.interval=2,this.intervalType="day"):c/(4*S.dayDuration)<=a?(this.interval=4,this.intervalType="day"):c/(1*S.weekDuration)<=a?(this.interval=1,this.intervalType="week"):c/(2*S.weekDuration)<=a?(this.interval=2,this.intervalType="week"):c/(3*S.weekDuration)<=a?(this.interval=3,this.intervalType="week"):c/(1*S.monthDuration)<=a?(this.interval=1,this.intervalType="month"):c/(2*S.monthDuration)<=a?(this.interval= +2,this.intervalType="month"):c/(3*S.monthDuration)<=a?(this.interval=3,this.intervalType="month"):c/(6*S.monthDuration)<=a?(this.interval=6,this.intervalType="month"):(this.interval=c/(1*S.yearDuration)<=a?1:c/(2*S.yearDuration)<=a?2:c/(4*S.yearDuration)<=a?4:Math.floor(z.getNiceNumber(c/(a-1),!0)/S.yearDuration),this.intervalType="year"));if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=e-m/2;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum= +g+m/2;d?this.autoValueFormatString="MMM DD YYYY HH:mm":"year"===this.intervalType?this.autoValueFormatString="YYYY":"month"===this.intervalType?this.autoValueFormatString="MMM YYYY":"week"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"day"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"hour"===this.intervalType?this.autoValueFormatString="hh:mm TT":"minute"===this.intervalType?this.autoValueFormatString="hh:mm TT":"second"===this.intervalType?this.autoValueFormatString= +"hh:mm:ss TT":"millisecond"===this.intervalType&&(this.autoValueFormatString="fff'ms'");this.valueFormatString||(this.valueFormatString=this.autoValueFormatString)}else{this.intervalType="number";c=z.getNiceNumber(c,!1);this.interval=this.options&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g,null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)):(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0)),Math.abs(this.getApparentDifference(e,g,null,!0)),"axisX"===this.type&&b){this.valueType="dateTime";if(null===this.minimum||isNaN(this.minimum))this.minimum=e-m/2;if(null===this.maximum||isNaN(this.maximum))this.maximum=g+m/2}else this.intervalType=this.valueType="number",null===this.minimum&&(this.minimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval,this.minimum=Math.min(this.minimum, +null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?Infinity:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval,this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?-Infinity:this.sessionVariables.viewportMaximum)),0===this.maximum&&0===this.minimum&&(0===this.options.minimum?this.maximum+=10:0=== +this.options.maximum&&(this.minimum-=10));u(this.sessionVariables.newViewportMinimum)&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));u(this.sessionVariables.newViewportMaximum)&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.range=this.viewportMaximum-this.viewportMinimum;this.intervalStartPosition="axisX"===this.type&&b?this.getLabelStartPoint(new Date(this.viewportMinimum),this.intervalType,this.interval):Math.floor((this.viewportMinimum+0.2*this.interval)/ +this.interval)*this.interval;this.valueFormatString||(this.valueFormatString=z.generateValueFormatString(this.range,2))}};z.prototype.calculateLogarithmicAxisParameters=function(){var a=this.chart.layoutManager.getFreeSpace(),d=Math.log(this.logarithmBase),b;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?500>this.maxWidth?7:Math.max(7,Math.floor(this.maxWidth/100)):Math.max(Math.floor(this.maxWidth/ +50),3),c,e,g,m;m=1;if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(m=0;m=this.scaleBreaks._appliedBreaks[m].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[m].startValue|| +!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue)&&(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue)){this.scaleBreaks._appliedBreaks.splice(m,1);break}"axisX"===this.type? +(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,1===e/c&&(m=Math.pow(this.logarithmBase,"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin, +e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,0>=c&&!isFinite(e)?(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1):0>=c?c=e:isFinite(e)||(e=c),1===c&&1===e?(e*=this.logarithmBase-1/this.logarithmBase,c=1):1===e/c?(m=Math.min(e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),e*=m,c/=m):c>e?(m=Math.min(c/e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase, +0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&1e&&(e=1));m=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)/(isNaN(this.viewportMinimum)||null=== +this.viewportMinimum?c:this.viewportMinimum);var l=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)-(isNaN(this.viewportMinimum)||null===this.viewportMinimum?c:this.viewportMinimum);this.intervalType="number";m=Math.pow(this.logarithmBase,z.getNiceNumber(Math.abs(Math.log(m)/d),!1));this.options&&0this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(c)||isFinite(e)?1===c&&1===e?(e*=this.logarithmBase,c/=this.logarithmBase):1===e/c?(m=Math.pow(this.logarithmBase,this.interval),e*=m,c/=m):c>e?(m= +Math.min(0.01*(c/e),5),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)):(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.minimum||isNaN(this.minimum))&&1e&&(e=1)),this.intervalType="number",null===this.minimum&&(this.minimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval)),this.minimum=Math.min(this.minimum,null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?"undefined"===typeof this.sessionVariables.newViewportMinimum?Infinity:this.sessionVariables.newViewportMinimum:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum= +"axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval)),this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?"undefined"===typeof this.sessionVariables.newViewportMaximum?0:this.sessionVariables.newViewportMaximum:this.sessionVariables.viewportMaximum)),1===this.maximum&&1===this.minimum&&(1===this.options.minimum?this.maximum*=this.logarithmBase-1/this.logarithmBase: +1===this.options.maximum&&(this.minimum/=this.logarithmBase-1/this.logarithmBase));this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum);this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum);this.viewportMinimum>this.viewportMaximum&&(!this.options.viewportMinimum&&!this.options.minimum||this.options.viewportMaximum||this.options.maximum?this.options.viewportMinimum||this.options.minimum||!this.options.viewportMaximum&&!this.options.maximum||(this.viewportMinimum=this.minimum= +(this.options.viewportMaximum||this.options.maximum)/Math.pow(this.logarithmBase,2*Math.ceil(this.interval))):this.viewportMaximum=this.maximum=this.options.viewportMinimum||this.options.minimum);c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval);this.range=this.viewportMaximum/this.viewportMinimum;this.noTicks=a;if(!this.options.interval&&this.rangethis.viewportMaximum||3>a?2:3)){for(d=Math.floor(this.viewportMinimum/ +b+0.5)*b;dthis.interval&&(this.interval=b,c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval))),this.equidistantInterval=!0,this.intervalStartPosition=c;if(!this.valueFormatString&&(this.valueFormatString="#,##0.##",1>this.viewportMinimum)){d=Math.floor(Math.abs(Math.log(this.viewportMinimum)/ +Math.LN10))+2;if(isNaN(d)||!isFinite(d))d=2;if(2a&&(c+=Math.floor(Math.abs(Math.log(a)/Math.LN10)),isNaN(c)||!isFinite(c))&&(c=d);for(var e=0;eb?1>=c?1:5>=c?5:10:Math.max(Math.floor(c),1);return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.getNiceNumber= +function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=d?1.5>c?1:3>c?2:7>c?5:10:1>=c?1:2>=c?2:5>=c?5:10;return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.prototype.getLabelStartPoint=function(){var a=S[this.intervalType+"Duration"]*this.interval,a=new Date(Math.floor(this.viewportMinimum/a)*a);if("millisecond"!==this.intervalType)if("second"===this.intervalType)0=a||"bottom"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(c,l),this.ctx.lineTo(m,l),this.ctx.lineTo(m,e);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(l-h)/a/3;for(var n=0;n=a||"right"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(m,e),this.ctx.lineTo(m,l), +this.ctx.lineTo(c,l);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(m-k)/a/3;for(n=0;nthis.parent.range?2:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range? +1:0):50this.parent.range?2:10>this.parent.range?1:0);this.valueFormatString=z.generateValueFormatString(this.parent.range,h)}var l=null===this.opacity?1:this.opacity,h=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness),p=this.chart.overlaidCanvasCtx,q=p.globalAlpha;p.globalAlpha=l;p.beginPath();p.strokeStyle=this.color;p.lineWidth=h;p.save();this.labelFontSize= +u(this.options.labelFontSize)?this.parent.labelFontSize:this.labelFontSize;if("left"===this.parent._position||"right"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?this.parent.bounds.x2-this.parent.bounds.x1:this.labelMaxWidth,this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?3*this.chart.height:2*this.labelFontSize;else if("top"===this.parent._position||"bottom"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?3*this.chart.width:this.labelMaxWidth, +this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?this.parent.bounds.height:2*this.labelFontSize;0this.chart.bounds.x2?l.x=this.chart.bounds.x2-l.width:l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}}else if("bottom"===this.parent._position||"top"===this.parent._position){n=this.parent.convertPixelToValue({x:a});for(r=0;rthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"=== +this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}m=null;("bottom"===this.parent._position||"top"===this.parent._position)&&(b>=this.parent.convertValueToPixel(this.parent.viewportMinimum)&&c<=this.parent.convertValueToPixel(this.parent.viewportMaximum))&&(0=this.parent.convertValueToPixel(this.parent.viewportMaximum)&& +e<=this.parent.convertValueToPixel(this.parent.viewportMinimum))&&(0this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x1-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}else{if("bottom"===this.parent._position||"top"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)? +ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label,l.x=b-l.measureText().width/2,l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width),l.xthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2),"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2);0(new Date).getTime()-this._lastUpdated||(this._lastUpdated=(new Date).getTime(), +this.chart.resetOverlayedCanvas(),this._updateToolTip(a,d))};$.prototype._updateToolTip=function(a,d,b){b="undefined"===typeof b?!0:b;this.container||this._initialize();this.enabled||this.hide();if(!this.chart.disableToolTip){if("undefined"===typeof a||"undefined"===typeof d){if(isNaN(this._prevX)||isNaN(this._prevY))return;a=this._prevX;d=this._prevY}else this._prevX=a,this._prevY=d;var c=null,e=null,g=[],k=0;if(this.shared&&this.enabled&&"none"!==this.chart.plotInfo.axisPlacement){if("xySwapped"=== +this.chart.plotInfo.axisPlacement){var l=[];if(this.chart.axisX)for(var p=0;ph.dataSeries.axisY.viewportMaximum&&b++;b-h.dataPoint.y.length&&g.push(h)}else"column"===e.type||"bar"===e.type?0>h.dataPoint.y?0>h.dataSeries.axisY.viewportMinimum&&h.dataSeries.axisY.viewportMaximum>=h.dataPoint.y&&g.push(h):h.dataSeries.axisY.viewportMinimum<=h.dataPoint.y&&0<=h.dataSeries.axisY.viewportMaximum&&g.push(h):"bubble"===e.type?(b=this.chart._eventManager.objectMap[e.dataPointIds[h.index]].size/2,h.dataPoint.y>= +h.dataSeries.axisY.viewportMinimum-b&&h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum+b&&g.push(h)):"waterfall"===e.type?(b=0,h.cumulativeSumYStartValueh.dataSeries.axisY.viewportMaximum&&b++,h.cumulativeSumh.dataSeries.axisY.viewportMaximum&&b++,2>b&&-2=h.dataSeries.axisY.viewportMinimum&& +h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum)&&g.push(h);else g.push(h)}}if(0a&&(a+=this.container.clientWidth+20);a+this.container.clientWidth> +Math.max(this.chart.container.clientWidth,this.chart.width)&&(a=Math.max(0,Math.max(this.chart.container.clientWidth,this.chart.width)-this.container.clientWidth));d=1!==g.length||this.shared||"line"!==g[0].dataSeries.type&&"stepLine"!==g[0].dataSeries.type&&"spline"!==g[0].dataSeries.type&&"area"!==g[0].dataSeries.type&&"stepArea"!==g[0].dataSeries.type&&"splineArea"!==g[0].dataSeries.type?"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"=== +g[0].dataSeries.type?g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x):d:g[0].dataSeries.axisY.convertValueToPixel(g[0].dataPoint.y);d=-d+10;0":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content? +this.content:"{name}:  {y}",p=b.axisXIndex):"bubble"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y},   {z}"): +"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y[0]}, {y[1]}"):"candlestick"=== +b.type||"ohlc"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Open:   {y[0]}
High:    {y[1]}
Low:   {y[2]}
Close:   {y[3]}"):"boxAndWhisker"=== +b.type&&(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"), +null===d&&(d=""),!0===this.reversed?(d=this.chart.replaceKeywordsWithValue(g,c,b,e)+d,l"+d)):(d+=this.chart.replaceKeywordsWithValue(g,c,b,e),l")));null!==d&&(d=h+d)}else{b=a[0].dataSeries;c=a[0].dataPoint;e=a[0].index;if(null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent)return null;"line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"===b.type||"splineArea"===b.type||"column"=== +b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y}":"bubble"===b.type?g=c.toolTipContent? +c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y},   {z}":"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.name?"{name}:  ":c.label?"{label}:  ":"")+"{y}":"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+" :  {y[0]},  {y[1]}": +"candlestick"===b.type||"ohlc"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Open:   {y[0]}
High:    {y[1]}
Low:     {y[2]}
Close:   {y[3]}":"boxAndWhisker"===b.type&&(g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent: +this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"); +null===d&&(d="");d+=this.chart.replaceKeywordsWithValue(g,c,b,e)}return d};$.prototype.enableAnimation=function(){if(!this.container.style.WebkitTransition){var a=this.getContainerTransition(this.containerTransitionDuration);this.container.style.WebkitTransition=a;this.container.style.MsTransition=a;this.container.style.transition=a;this.container.style.MozTransition=this.mozContainerTransition}};$.prototype.disableAnimation=function(){this.container.style.WebkitTransition&&(this.container.style.WebkitTransition= +"",this.container.style.MozTransition="",this.container.style.MsTransition="",this.container.style.transition="")};$.prototype.hide=function(a){this.container&&(this.container.style.display="none",this.currentSeriesIndex=-1,this._prevY=this._prevX=NaN,("undefined"===typeof a||a)&&this.chart.resetOverlayedCanvas())};$.prototype.show=function(a,d,b){this._updateToolTip(a,d,"undefined"===typeof b?!1:b)};$.prototype.fixMozTransitionDelay=function(a,d){if(20c&&a.push(d),d.animationCallback(c),1<=c&&d.onComplete)d.onComplete();this.animations=a;0g;g++)for(var e=0;3>e;e++){for(var f=0,d=0;3>d;d++)f+=a[g][d]*b[d][e];c[g][e]=f}return c}function P(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX= +a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha;b.font=a.font;b.textAlign=a.textAlign;b.textBaseline=a.textBaseline;b.arcScaleX_=a.arcScaleX_;b.arcScaleY_=a.arcScaleY_;b.lineScale_=a.lineScale_}function Q(a){var b=a.indexOf("(",3),c=a.indexOf(")",b+1),b=a.substring(b+1,c).split(",");if(4!=b.length||"a"!=a.charAt(3))b[3]=1;return b}function E(a,b,c){return Math.min(c,Math.max(b,a))}function F(a,b,c){0>c&&c++;16*c?a+6*(b-a)*c: +1>2*c?b:2>3*c?a+6*(b-a)*(2/3-c):a}function G(a){if(a in H)return H[a];var b,c=1;a=String(a);if("#"==a.charAt(0))b=a;else if(/^rgb/.test(a)){c=Q(a);b="#";for(var g,e=0;3>e;e++)g=-1!=c[e].indexOf("%")?Math.floor(255*(parseFloat(c[e])/100)):+c[e],b+=v[E(g,0,255)];c=+c[3]}else if(/^hsl/.test(a)){e=c=Q(a);b=parseFloat(e[0])/360%360;0>b&&b++;g=E(parseFloat(e[1])/100,0,1);e=E(parseFloat(e[2])/100,0,1);if(0==g)g=e=b=e;else{var f=0.5>e?e*(1+g):e+g-e*g,d=2*e-f;g=F(d,f,b+1/3);e=F(d,f,b);b=F(d,f,b-1/3)}b="#"+ +v[Math.floor(255*g)]+v[Math.floor(255*e)]+v[Math.floor(255*b)];c=c[3]}else b=Z[a]||a;return H[a]={color:b,alpha:c}}function C(a){this.m_=D();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=1*q;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=a;var b="width:"+a.clientWidth+"px;height:"+a.clientHeight+"px;overflow:hidden;position:absolute", +c=a.ownerDocument.createElement("div");c.style.cssText=b;a.appendChild(c);b=c.cloneNode(!1);b.style.backgroundColor="red";b.style.filter="alpha(opacity=0)";a.appendChild(b);this.element_=c;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}function R(a,b,c,g){a.currentPath_.push({type:"bezierCurveTo",cp1x:b.x,cp1y:b.y,cp2x:c.x,cp2y:c.y,x:g.x,y:g.y});a.currentX_=g.x;a.currentY_=g.y}function S(a,b){var c=G(a.strokeStyle),g=c.color,c=c.alpha*a.globalAlpha,e=a.lineScale_*a.lineWidth;1>e&&(c*=e);b.push("')}function T(a,b,c,g){var e=a.fillStyle,f=a.arcScaleX_,d=a.arcScaleY_,k=g.x-c.x,n=g.y-c.y;if(e instanceof w){var h=0,l=g=0,u=0,m=1;if("gradient"==e.type_){h=e.x1_/f;c=e.y1_/d;var p=s(a,e.x0_/f,e.y0_/d),h=s(a,h,c),h=180*Math.atan2(h.x-p.x,h.y-p.y)/Math.PI;0>h&&(h+=360);1E-6>h&&(h=0)}else p=s(a,e.x0_,e.y0_),g=(p.x-c.x)/k,l=(p.y-c.y)/n,k/=f*q, +n/=d*q,m=x.max(k,n),u=2*e.r0_/m,m=2*e.r1_/m-u;f=e.colors_;f.sort(function(a,b){return a.offset-b.offset});d=f.length;p=f[0].color;c=f[d-1].color;k=f[0].alpha*a.globalAlpha;a=f[d-1].alpha*a.globalAlpha;for(var n=[],r=0;r')}else e instanceof +I?k&&n&&b.push("'):(e=G(a.fillStyle),b.push(''))}function s(a,b,c){a=a.m_;return{x:q*(b*a[0][0]+c*a[1][0]+a[2][0])-r,y:q*(b*a[0][1]+c*a[1][1]+a[2][1])-r}}function z(a,b,c){isFinite(b[0][0])&&(isFinite(b[0][1])&&isFinite(b[1][0])&&isFinite(b[1][1])&&isFinite(b[2][0])&&isFinite(b[2][1]))&&(a.m_=b,c&&(a.lineScale_=aa(ba(b[0][0]*b[1][1]-b[0][1]* +b[1][0]))))}function w(a){this.type_=a;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}function I(a,b){if(!a||1!=a.nodeType||"IMG"!=a.tagName)throw new A("TYPE_MISMATCH_ERR");if("complete"!=a.readyState)throw new A("INVALID_STATE_ERR");switch(b){case "repeat":case null:case "":this.repetition_="repeat";break;case "repeat-x":case "repeat-y":case "no-repeat":this.repetition_=b;break;default:throw new A("SYNTAX_ERR");}this.src_=a.src;this.width_=a.width;this.height_=a.height} +function A(a){this.code=this[a];this.message=a+": DOM Exception "+this.code}var x=Math,k=x.round,J=x.sin,K=x.cos,ba=x.abs,aa=x.sqrt,q=10,r=q/2;navigator.userAgent.match(/MSIE ([\d.]+)?/);var M=Array.prototype.slice;O(document);var U={init:function(a){a=a||document;a.createElement("canvas");a.attachEvent("onreadystatechange",W(this.init_,this,a))},init_:function(a){a=a.getElementsByTagName("canvas");for(var b=0;bd;d++)for(var B=0;16>B;B++)v[16*d+B]=d.toString(16)+B.toString(16);var Z={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC", +bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000", +darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082", +ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA", +mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5", +peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"}, +H={},L={},$={butt:"flat",round:"round"},d=C.prototype;d.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null);this.element_.innerHTML=""};d.beginPath=function(){this.currentPath_=[]};d.moveTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.lineTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.bezierCurveTo= +function(a,b,c,g,e,f){e=s(this,e,f);a=s(this,a,b);c=s(this,c,g);R(this,a,c,e)};d.quadraticCurveTo=function(a,b,c,g){a=s(this,a,b);c=s(this,c,g);g={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)};R(this,g,{x:g.x+(c.x-this.currentX_)/3,y:g.y+(c.y-this.currentY_)/3},c)};d.arc=function(a,b,c,g,e,f){c*=q;var d=f?"at":"wa",k=a+K(g)*c-r,n=b+J(g)*c-r;g=a+K(e)*c-r;e=b+J(e)*c-r;k!=g||f||(k+=0.125);a=s(this,a,b);k=s(this,k,n);g=s(this,g,e);this.currentPath_.push({type:d, +x:a.x,y:a.y,radius:c,xStart:k.x,yStart:k.y,xEnd:g.x,yEnd:g.y})};d.rect=function(a,b,c,g){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath()};d.strokeRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath();this.stroke();this.currentPath_=e};d.fillRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+ +c,b+g);this.lineTo(a,b+g);this.closePath();this.fill();this.currentPath_=e};d.createLinearGradient=function(a,b,c,g){var e=new w("gradient");e.x0_=a;e.y0_=b;e.x1_=c;e.y1_=g;return e};d.createRadialGradient=function(a,b,c,g,e,f){var d=new w("gradientradial");d.x0_=a;d.y0_=b;d.r0_=c;d.x1_=g;d.y1_=e;d.r1_=f;return d};d.drawImage=function(a,b){var c,g,e,d,r,y,n,h;e=a.runtimeStyle.width;d=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var l=a.width,u=a.height;a.runtimeStyle.width= +e;a.runtimeStyle.height=d;if(3==arguments.length)c=arguments[1],g=arguments[2],r=y=0,n=e=l,h=d=u;else if(5==arguments.length)c=arguments[1],g=arguments[2],e=arguments[3],d=arguments[4],r=y=0,n=l,h=u;else if(9==arguments.length)r=arguments[1],y=arguments[2],n=arguments[3],h=arguments[4],c=arguments[5],g=arguments[6],e=arguments[7],d=arguments[8];else throw Error("Invalid number of arguments");var m=s(this,c,g),p=[];p.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))};d.stroke=function(a){var b=[];b.push("d.x)d.x=f.x;if(null==c.y||f.yd.y)d.y=f.y}}b.push(' ">');a?T(this,b,c,d):S(this,b);b.push("");this.element_.insertAdjacentHTML("beforeEnd",b.join(""))};d.fill=function(){this.stroke(!0)};d.closePath=function(){this.currentPath_.push({type:"close"})};d.save=function(){var a= +{};P(this,a);this.aStack_.push(a);this.mStack_.push(this.m_);this.m_=t(D(),this.m_)};d.restore=function(){this.aStack_.length&&(P(this.aStack_.pop(),this),this.m_=this.mStack_.pop())};d.translate=function(a,b){z(this,t([[1,0,0],[0,1,0],[a,b,1]],this.m_),!1)};d.rotate=function(a){var b=K(a);a=J(a);z(this,t([[b,a,0],[-a,b,0],[0,0,1]],this.m_),!1)};d.scale=function(a,b){this.arcScaleX_*=a;this.arcScaleY_*=b;z(this,t([[a,0,0],[0,b,0],[0,0,1]],this.m_),!0)};d.transform=function(a,b,c,d,e,f){z(this,t([[a, +b,0],[c,d,0],[e,f,1]],this.m_),!0)};d.setTransform=function(a,b,c,d,e,f){z(this,[[a,b,0],[c,d,0],[e,f,1]],!0)};d.drawText_=function(a,b,c,d,e){var f=this.m_;d=0;var r=1E3,t=0,n=[],h;h=this.font;if(L[h])h=L[h];else{var l=document.createElement("div").style;try{l.font=h}catch(u){}h=L[h]={style:l.fontStyle||"normal",variant:l.fontVariant||"normal",weight:l.fontWeight||"normal",size:l.fontSize||10,family:l.fontFamily||"sans-serif"}}var l=h,m=this.element_;h={};for(var p in l)h[p]=l[p];p=parseFloat(m.currentStyle.fontSize); +m=parseFloat(l.size);"number"==typeof l.size?h.size=l.size:-1!=l.size.indexOf("px")?h.size=m:-1!=l.size.indexOf("em")?h.size=p*m:-1!=l.size.indexOf("%")?h.size=p/100*m:-1!=l.size.indexOf("pt")?h.size=m/0.75:h.size=p;h.size*=0.981;p=h.style+" "+h.variant+" "+h.weight+" "+h.size+"px "+h.family;m=this.element_.currentStyle;l=this.textAlign.toLowerCase();switch(l){case "left":case "center":case "right":break;case "end":l="ltr"==m.direction?"right":"left";break;case "start":l="rtl"==m.direction?"right": +"left";break;default:l="left"}switch(this.textBaseline){case "hanging":case "top":t=h.size/1.75;break;case "middle":break;default:case null:case "alphabetic":case "ideographic":case "bottom":t=-h.size/2.25}switch(l){case "right":d=1E3;r=0.05;break;case "center":d=r=500}b=s(this,b+0,c+t);n.push('');e?S(this,n):T(this,n,{x:-d,y:0}, +{x:r,y:h.size});e=f[0][0].toFixed(3)+","+f[1][0].toFixed(3)+","+f[0][1].toFixed(3)+","+f[1][1].toFixed(3)+",0,0";b=k(b.x/q)+","+k(b.y/q);n.push('','','');this.element_.insertAdjacentHTML("beforeEnd",n.join(""))};d.fillText=function(a,b,c,d){this.drawText_(a,b,c,d,!1)};d.strokeText=function(a, +b,c,d){this.drawText_(a,b,c,d,!0)};d.measureText=function(a){this.textMeasureEl_||(this.element_.insertAdjacentHTML("beforeEnd",''),this.textMeasureEl_=this.element_.lastChild);var b=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(b.createTextNode(a));return{width:this.textMeasureEl_.offsetWidth}};d.clip=function(){}; +d.arcTo=function(){};d.createPattern=function(a,b){return new I(a,b)};w.prototype.addColorStop=function(a,b){b=G(b);this.colors_.push({offset:a,color:b.color,alpha:b.alpha})};d=A.prototype=Error();d.INDEX_SIZE_ERR=1;d.DOMSTRING_SIZE_ERR=2;d.HIERARCHY_REQUEST_ERR=3;d.WRONG_DOCUMENT_ERR=4;d.INVALID_CHARACTER_ERR=5;d.NO_DATA_ALLOWED_ERR=6;d.NO_MODIFICATION_ALLOWED_ERR=7;d.NOT_FOUND_ERR=8;d.NOT_SUPPORTED_ERR=9;d.INUSE_ATTRIBUTE_ERR=10;d.INVALID_STATE_ERR=11;d.SYNTAX_ERR=12;d.INVALID_MODIFICATION_ERR= +13;d.NAMESPACE_ERR=14;d.INVALID_ACCESS_ERR=15;d.VALIDATION_ERR=16;d.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=U;CanvasRenderingContext2D=C;CanvasGradient=w;CanvasPattern=I;DOMException=A}(); +/*eslint-enable*/ +/*jshint ignore:end*/ \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.react.js b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.react.js new file mode 100644 index 00000000..69c7951e --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/canvasjs.react.js @@ -0,0 +1,48 @@ +var React = require('react'); +var CanvasJS = require('./canvasjs.min'); +CanvasJS = CanvasJS.Chart ? CanvasJS : window.CanvasJS; + +class CanvasJSChart extends React.Component { + static _cjsContainerId = 0 + constructor(props) { + super(props); + this.options = props.options ? props.options : {}; + this.containerProps = props.containerProps ? props.containerProps : {width: "100%", position: "relative"}; + this.containerProps.height = props.containerProps && props.containerProps.height ? props.containerProps.height : this.options.height ? this.options.height + "px" : "400px"; + this.chartContainerId = "canvasjs-react-chart-container-" + CanvasJSChart._cjsContainerId++; + } + componentDidMount() { + //Create Chart and Render + this.chart = new CanvasJS.Chart(this.chartContainerId, this.options); + this.chart.render(); + + if(this.props.onRef) + this.props.onRef(this.chart); + } + shouldComponentUpdate(nextProps, nextState){ + //Check if Chart-options has changed and determine if component has to be updated + return !(nextProps.options === this.options); + } + componentDidUpdate() { + //Update Chart Options & Render + this.chart.options = this.props.options; + this.chart.render(); + } + componentWillUnmount() { + //Destroy chart and remove reference + this.chart.destroy(); + if(this.props.onRef) + this.props.onRef(undefined); + } + render() { + //return React.createElement('div', { id: this.chartContainerId, style: this.containerProps }); + return
+ } +} + +var CanvasJSReact = { + CanvasJSChart: CanvasJSChart, + CanvasJS: CanvasJS +}; + +export default CanvasJSReact; \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html new file mode 100644 index 00000000..ef650afe --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html new file mode 100644 index 00000000..57e08a55 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html @@ -0,0 +1,50 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html new file mode 100644 index 00000000..3cb8789c --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html @@ -0,0 +1,51 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html new file mode 100644 index 00000000..34e46259 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html @@ -0,0 +1,72 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html new file mode 100644 index 00000000..4f6e15c6 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html @@ -0,0 +1,233 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html new file mode 100644 index 00000000..50b7d737 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html @@ -0,0 +1,108 @@ + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html new file mode 100644 index 00000000..cd5dd33e --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html @@ -0,0 +1,46 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html new file mode 100644 index 00000000..0b69ea91 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html @@ -0,0 +1,46 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html new file mode 100644 index 00000000..895c4e28 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html @@ -0,0 +1,128 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html new file mode 100644 index 00000000..4e292db0 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html @@ -0,0 +1,87 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html new file mode 100644 index 00000000..79a3d417 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html @@ -0,0 +1,40 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html new file mode 100644 index 00000000..a42de04d --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html @@ -0,0 +1,57 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html new file mode 100644 index 00000000..17505925 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html @@ -0,0 +1,115 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html new file mode 100644 index 00000000..f156e2f8 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html @@ -0,0 +1,94 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html new file mode 100644 index 00000000..2b0a5ed9 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html @@ -0,0 +1,62 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html new file mode 100644 index 00000000..7be550ab --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html new file mode 100644 index 00000000..b5b8e010 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html @@ -0,0 +1,102 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html new file mode 100644 index 00000000..9bfb56e5 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html @@ -0,0 +1,56 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html new file mode 100644 index 00000000..9a6a355b --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html @@ -0,0 +1,71 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html new file mode 100644 index 00000000..8b620e23 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html @@ -0,0 +1,53 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html new file mode 100644 index 00000000..4a3430ac --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html @@ -0,0 +1,107 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html new file mode 100644 index 00000000..e4626cc0 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html @@ -0,0 +1,125 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html new file mode 100644 index 00000000..24a15c69 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html @@ -0,0 +1,46 @@ + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html new file mode 100644 index 00000000..d21bd730 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html @@ -0,0 +1,44 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html new file mode 100644 index 00000000..c25f9ae8 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html @@ -0,0 +1,257 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html new file mode 100644 index 00000000..7c4d43d0 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html @@ -0,0 +1,171 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html new file mode 100644 index 00000000..d6d67a13 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html @@ -0,0 +1,67 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html new file mode 100644 index 00000000..34c7c5bf --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html @@ -0,0 +1,123 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html new file mode 100644 index 00000000..3cdb8259 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html @@ -0,0 +1,100 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html new file mode 100644 index 00000000..7c1afce1 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html @@ -0,0 +1,55 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html new file mode 100644 index 00000000..dc1a4b7a --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html @@ -0,0 +1,57 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html new file mode 100644 index 00000000..f721ee43 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html @@ -0,0 +1,50 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html new file mode 100644 index 00000000..5e0ce683 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html @@ -0,0 +1,73 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html new file mode 100644 index 00000000..1bd75401 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html @@ -0,0 +1,127 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html new file mode 100644 index 00000000..54e2bece --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html @@ -0,0 +1,113 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html new file mode 100644 index 00000000..e5408a62 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html @@ -0,0 +1,72 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html new file mode 100644 index 00000000..280a052a --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html @@ -0,0 +1,51 @@ + + + + + + + +
+ + + diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html new file mode 100644 index 00000000..450b4a57 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html @@ -0,0 +1,55 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html new file mode 100644 index 00000000..76483f3a --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html @@ -0,0 +1,120 @@ + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html new file mode 100644 index 00000000..7af19276 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html @@ -0,0 +1,78 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html new file mode 100644 index 00000000..90e29ed7 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html @@ -0,0 +1,68 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html new file mode 100644 index 00000000..7fb51f0a --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html @@ -0,0 +1,42 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html new file mode 100644 index 00000000..5e7f2a0b --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html new file mode 100644 index 00000000..d12b9cf5 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html new file mode 100644 index 00000000..982c84d7 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html @@ -0,0 +1,83 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html new file mode 100644 index 00000000..db126063 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html new file mode 100644 index 00000000..69e6bb35 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html @@ -0,0 +1,104 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html new file mode 100644 index 00000000..a90e357d --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html @@ -0,0 +1,89 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html new file mode 100644 index 00000000..3e473fbf --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html @@ -0,0 +1,98 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html new file mode 100644 index 00000000..4a8b95f7 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html @@ -0,0 +1,49 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html new file mode 100644 index 00000000..2482015d --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html @@ -0,0 +1,49 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html new file mode 100644 index 00000000..a0fe8f0f --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html @@ -0,0 +1,76 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html new file mode 100644 index 00000000..e53506c7 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html @@ -0,0 +1,126 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html new file mode 100644 index 00000000..39e9e1b9 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html @@ -0,0 +1,103 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html new file mode 100644 index 00000000..f377f681 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html @@ -0,0 +1,113 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html new file mode 100644 index 00000000..bed3a0ab --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html @@ -0,0 +1,51 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html new file mode 100644 index 00000000..cf00ff2b --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html @@ -0,0 +1,48 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html new file mode 100644 index 00000000..7ad45521 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html @@ -0,0 +1,40 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html new file mode 100644 index 00000000..7e9b4297 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html @@ -0,0 +1,55 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html new file mode 100644 index 00000000..b5d9fb7b --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html @@ -0,0 +1,52 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html new file mode 100644 index 00000000..8aa524e4 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html @@ -0,0 +1,52 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html new file mode 100644 index 00000000..3b475ef7 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html @@ -0,0 +1,54 @@ + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html new file mode 100644 index 00000000..770bc9dc --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html @@ -0,0 +1,51 @@ + + + + + + + +
+ +
+ + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html new file mode 100644 index 00000000..e1bd01bb --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html @@ -0,0 +1,52 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html new file mode 100644 index 00000000..7dd8a3e7 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html @@ -0,0 +1,36 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html new file mode 100644 index 00000000..c84b2a9a --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html @@ -0,0 +1,39 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html new file mode 100644 index 00000000..e39048c9 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html @@ -0,0 +1,40 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html new file mode 100644 index 00000000..b9053b27 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html @@ -0,0 +1,40 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html new file mode 100644 index 00000000..72db3b31 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html @@ -0,0 +1,108 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html new file mode 100644 index 00000000..35871f64 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html @@ -0,0 +1,90 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html new file mode 100644 index 00000000..3cca87c6 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html new file mode 100644 index 00000000..ee555661 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html @@ -0,0 +1,54 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html new file mode 100644 index 00000000..580047d0 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html @@ -0,0 +1,59 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html new file mode 100644 index 00000000..2670b874 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html @@ -0,0 +1,60 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html new file mode 100644 index 00000000..a0980da9 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html @@ -0,0 +1,69 @@ + + + + + + + +
+ + + diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html new file mode 100644 index 00000000..7a3212ee --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html @@ -0,0 +1,73 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html new file mode 100644 index 00000000..eb0a7abd --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html @@ -0,0 +1,129 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html new file mode 100644 index 00000000..39a28571 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html @@ -0,0 +1,63 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html new file mode 100644 index 00000000..c38a46af --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html new file mode 100644 index 00000000..c7a16883 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html @@ -0,0 +1,81 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html new file mode 100644 index 00000000..327b5f6e --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html new file mode 100644 index 00000000..1d9c8738 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html @@ -0,0 +1,122 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html new file mode 100644 index 00000000..01b9a6aa --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html @@ -0,0 +1,54 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html new file mode 100644 index 00000000..ddb9026b --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html new file mode 100644 index 00000000..b6f1cc72 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html @@ -0,0 +1,73 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html new file mode 100644 index 00000000..24674cea --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html @@ -0,0 +1,106 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html new file mode 100644 index 00000000..fd35f556 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html @@ -0,0 +1,68 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html new file mode 100644 index 00000000..393d6af1 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html @@ -0,0 +1,66 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html new file mode 100644 index 00000000..be32272f --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html @@ -0,0 +1,108 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html new file mode 100644 index 00000000..392bb3c1 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html @@ -0,0 +1,54 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html new file mode 100644 index 00000000..988c2219 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html new file mode 100644 index 00000000..2dbd00d6 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html @@ -0,0 +1,113 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html new file mode 100644 index 00000000..d6d42070 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html @@ -0,0 +1,42 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html new file mode 100644 index 00000000..c139f406 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html @@ -0,0 +1,49 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html new file mode 100644 index 00000000..31523b13 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html @@ -0,0 +1,55 @@ + + + + + + + + +
+
+
+ + + + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html new file mode 100644 index 00000000..b35ebf4b --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html @@ -0,0 +1,98 @@ + + + + + + + + + +
+ + + + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html new file mode 100644 index 00000000..a3e82d02 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html @@ -0,0 +1,41 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/instruction.txt b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/instruction.txt new file mode 100644 index 00000000..93eb448f --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/instruction.txt @@ -0,0 +1,4 @@ +For standalone version include canvasjs.min.js +For jQuery version include jquery.canvasjs.min.js + +** DO NOT include both the files ** \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js new file mode 100644 index 00000000..8785b495 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js @@ -0,0 +1,922 @@ +/* + CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ + Copyright 2018 fenopix + + --------------------- License Information -------------------- + CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. + https://canvasjs.com/license/ + +*/ +/*eslint-disable*/ +/*jshint ignore:start*/ +(function(){function qa(k,p){k.prototype=eb(p.prototype);k.prototype.constructor=k;k.base=p.prototype}function eb(k){function p(){}p.prototype=k;return new p}function Ya(k,p,D){"millisecond"===D?k.setMilliseconds(k.getMilliseconds()+1*p):"second"===D?k.setSeconds(k.getSeconds()+1*p):"minute"===D?k.setMinutes(k.getMinutes()+1*p):"hour"===D?k.setHours(k.getHours()+1*p):"day"===D?k.setDate(k.getDate()+1*p):"week"===D?k.setDate(k.getDate()+7*p):"month"===D?k.setMonth(k.getMonth()+1*p):"year"===D&&k.setFullYear(k.getFullYear()+ +1*p);return k}function $(k,p){var D=!1;0>k&&(D=!0,k*=-1);k=""+k;for(p=p?p:1;k.length
Please right click on the image and save it to your device
"), +p.document.close()}}}function N(k){var p=((k&16711680)>>16).toString(16),D=((k&65280)>>8).toString(16);k=((k&255)>>0).toString(16);p=2>p.length?"0"+p:p;D=2>D.length?"0"+D:D;k=2>k.length?"0"+k:k;return"#"+p+D+k}function fb(k,p){var D=this.length>>>0,r=Number(p)||0,r=0>r?Math.ceil(r):Math.floor(r);for(0>r&&(r+=D);rD;D++)if(k[D]!==k[D+4]|k[D]!==k[D+8]|k[D]!==k[D+12]){p=!1;break}return p?k[0]<<16|k[1]<<8|k[2]:0}function na(k,p,D){return k in p?p[k]:D[k]}function Oa(k,p,D){if(r&&bb){var u=k.getContext("2d");Pa=u.webkitBackingStorePixelRatio|| +u.mozBackingStorePixelRatio||u.msBackingStorePixelRatio||u.oBackingStorePixelRatio||u.backingStorePixelRatio||1;W=Ua/Pa;k.width=p*W;k.height=D*W;Ua!==Pa&&(k.style.width=p+"px",k.style.height=D+"px",u.scale(W,W))}else k.width=p,k.height=D}function hb(k){if(!ib){var p=!1,D=!1;"undefined"===typeof ra.Chart.creditHref?(k.creditHref=ja("iuuqr;..b`ow`rkr/bnl."),k.creditText=ja("B`ow`rKR/bnl")):(p=k.updateOption("creditText"),D=k.updateOption("creditHref"));if(k.creditHref&&k.creditText){k._creditLink|| +(k._creditLink=document.createElement("a"),k._creditLink.setAttribute("class","canvasjs-chart-credit"),k._creditLink.setAttribute("title","JavaScript Charts"),k._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:2px;top:"+(k.height-14)+"px;color:dimgrey;text-decoration:none;font-size:11px;font-family: Calibri, Lucida Grande, Lucida Sans Unicode, Arial, sans-serif"),k._creditLink.setAttribute("tabIndex",-1),k._creditLink.setAttribute("target","_blank"));if(0===k.renderCount|| +p||D)k._creditLink.setAttribute("href",k.creditHref),k._creditLink.innerHTML=k.creditText;k._creditLink&&k.creditHref&&k.creditText?(k._creditLink.parentElement||k._canvasJSContainer.appendChild(k._creditLink),k._creditLink.style.top=k.height-14+"px"):k._creditLink.parentElement&&k._canvasJSContainer.removeChild(k._creditLink)}}}function ta(k,p){Ja&&(this.canvasCount|=0,window.console.log(++this.canvasCount));var D=document.createElement("canvas");D.setAttribute("class","canvasjs-chart-canvas");Oa(D, +k,p);r||"undefined"===typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(D);return D}function sa(k,p,D){for(var r in D)p.style[r]=D[r]}function ua(k,p,D){p.getAttribute("state")||(p.style.backgroundColor=k.toolbar.backgroundColor,p.style.color=k.toolbar.fontColor,p.style.border="none",sa(k,p,{WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",userSelect:"none"}));p.getAttribute("state")!==D&&(p.setAttribute("state",D),p.setAttribute("type","button"),sa(k,p,{padding:"5px 12px", +cursor:"pointer","float":"left",width:"40px",height:"25px",outline:"0px",verticalAlign:"baseline",lineHeight:"0"}),p.setAttribute("title",k._cultureInfo[D+"Text"]),p.innerHTML=""+k._cultureInfo[D+"Text"]+"")}function Qa(){for(var k=null,p=0;pa?"a":"p";case "tt":return 12>a?"am":"pm";case "T":return 12>a?"A": +"P";case "TT":return 12>a?"AM":"PM";case "K":return S?"UTC":(String(z).match(H)||[""]).pop().replace(F,"");case "z":return(0k?!0:!1;u&&(k*=-1);var v=r?r.decimalSeparator:".",H=r?r.digitGroupSeparator: +",",F="";p=String(p);var F=1,z=r="",E=-1,L=[],R=[],I=0,N=0,S=0,O=!1,U=0,z=p.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|\u2030|./g);p=null;for(var Q=0;z&&QE)E=Q;else{if("%"===p)F*=100;else if("\u2030"===p){F*=1E3;continue}else if(","===p[0]&&"."===p[p.length-1]){F/=Math.pow(1E3,p.length-1);E=Q+p.length-1;continue}else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||(O=!0);0>E?(L.push(p),"#"===p||"0"===p?I++:","===p&&S++):(R.push(p),"#"!==p&&"0"!==p||N++)}O&&(p=Math.floor(k), +z=-Math.floor(Math.log(k)/Math.LN10+1),U=0===k?0:0===p?-(I+z):String(p).length-I,F/=Math.pow(10,U));0>E&&(E=Q);F=(k*F).toFixed(N);p=F.split(".");F=(p[0]+"").split("");k=(p[1]+"").split("");F&&"0"===F[0]&&F.shift();for(O=z=Q=N=E=0;0U?p.replace("+","").replace("-",""):p.replace("-",""),r+=p.replace(/[0]+/,function(k){return $(U,k.length)}));H="";for(L=!1;0U?p.replace("+","").replace("-",""):p.replace("-",""),H+=p.replace(/[0]+/,function(k){return $(U,k.length)}));r+=(L?v:"")+H;return u?"-"+r:r},Ra=function(k){var p=0,r=0;k=k||window.event;k.offsetX||0===k.offsetX?(p=k.offsetX,r=k.offsetY):k.layerX||0==k.layerX?(p=k.layerX,r=k.layerY):(p=k.pageX-k.target.offsetLeft, +r=k.pageY-k.target.offsetTop);return{x:p,y:r}},bb=!0,Ua=window.devicePixelRatio||1,Pa=1,W=bb?Ua/Pa:1,ea=function(k,p,r,u,v,H,F,z,E,L,R,N,O){"undefined"===typeof O&&(O=1);F=F||0;z=z||"black";var I=15p)v=H-1;else break}r>p&&1H&&(F=p.pop(),u-=F.height,v=z)}this._wrappedText={lines:p,width:v,height:u};this.width=v+(this.leftPadding+this.rightPadding);this.height=u+(this.topPadding+this.bottomPadding);this.ctx.font=r};ka.prototype._getFontString=function(){var k;k=""+(this.fontStyle?this.fontStyle+" ":"");k+=this.fontWeight?this.fontWeight+" ":"";k+=this.fontSize?this.fontSize+"px ":"";var p=this.fontFamily?this.fontFamily+"":"";!r&&p&&(p=p.split(",")[0],"'"!==p[0]&&'"'!==p[0]&&(p="'"+p+"'"));return k+=p}; +qa(Va,V);qa(Aa,V);Aa.prototype.setLayout=function(){if(this.text){var k=this.dockInsidePlotArea?this.chart.plotArea:this.chart,p=k.layoutManager.getFreeSpace(),r=p.x1,v=p.y1,E=0,H=0,F=this.chart._menuButton&&this.chart.exportEnabled&&"top"===this.verticalAlign?22:0,z,I;"top"===this.verticalAlign||"bottom"===this.verticalAlign?(null===this.maxWidth&&(this.maxWidth=p.width-4-F*("center"===this.horizontalAlign?2:1)),H=0.5*p.height-this.margin-2,E=0):"center"===this.verticalAlign&&("left"===this.horizontalAlign|| +"right"===this.horizontalAlign?(null===this.maxWidth&&(this.maxWidth=p.height-4),H=0.5*p.width-this.margin-2):"center"===this.horizontalAlign&&(null===this.maxWidth&&(this.maxWidth=p.width-4),H=0.5*p.height-4));var L;u(this.padding)||"number"!==typeof this.padding?u(this.padding)||"object"!==typeof this.padding||(L=this.padding.top?this.padding.top:this.padding.bottom?this.padding.bottom:0,L+=this.padding.bottom?this.padding.bottom:this.padding.top?this.padding.top:0,L*=1.25):L=2.5*this.padding;this.wrap|| +(H=Math.min(H,Math.max(1.5*this.fontSize,this.fontSize+L)));H=new ka(this.ctx,{fontSize:this.fontSize,fontFamily:this.fontFamily,fontColor:this.fontColor,fontStyle:this.fontStyle,fontWeight:this.fontWeight,horizontalAlign:this.horizontalAlign,verticalAlign:this.verticalAlign,borderColor:this.borderColor,borderThickness:this.borderThickness,backgroundColor:this.backgroundColor,maxWidth:this.maxWidth,maxHeight:H,cornerRadius:this.cornerRadius,text:this.text,padding:this.padding,textBaseline:"top"}); +L=H.measureText();"top"===this.verticalAlign||"bottom"===this.verticalAlign?("top"===this.verticalAlign?(v=p.y1+2,I="top"):"bottom"===this.verticalAlign&&(v=p.y2-2-L.height,I="bottom"),"left"===this.horizontalAlign?r=p.x1+2:"center"===this.horizontalAlign?r=p.x1+p.width/2-L.width/2:"right"===this.horizontalAlign&&(r=p.x2-2-L.width-F),z=this.horizontalAlign,this.width=L.width,this.height=L.height):"center"===this.verticalAlign&&("left"===this.horizontalAlign?(r=p.x1+2,v=p.y2-2-(this.maxWidth/2-L.width/ +2),E=-90,I="left",this.width=L.height,this.height=L.width):"right"===this.horizontalAlign?(r=p.x2-2,v=p.y1+2+(this.maxWidth/2-L.width/2),E=90,I="right",this.width=L.height,this.height=L.width):"center"===this.horizontalAlign&&(v=k.y1+(k.height/2-L.height/2),r=k.x1+(k.width/2-L.width/2),I="center",this.width=L.width,this.height=L.height),z="center");H.x=r;H.y=v;H.angle=E;H.horizontalAlign=z;this._textBlock=H;k.layoutManager.registerSpace(I,{width:this.width+("left"===I||"right"===I?this.margin+2:0), +height:this.height+("top"===I||"bottom"===I?this.margin+2:0)});this.bounds={x1:r,y1:v,x2:r+this.width,y2:v+this.height};this.ctx.textBaseline="top"}};Aa.prototype.render=function(){this._textBlock&&this._textBlock.render(!0)};qa(Ka,V);Ka.prototype.setLayout=Aa.prototype.setLayout;Ka.prototype.render=Aa.prototype.render;Wa.prototype.get=function(k,p){var r=null;0a[g].x&&0w?{x:a[l].x+w/3,y:a[l].y+c/3}:{x:a[l].x,y:a[l].y+c/9};l=e;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[l].x-a[g].x?0.01:a[l].x-a[g].x))*(d- +1)/2+1;w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0w?{x:a[l].x-w/3,y:a[l].y-c/3}:{x:a[l].x,y:a[l].y-c/9};b[b.length]=a[e]}return b}function E(a,d,b,c,e,g,m,l,w,h){var s=0;h?(m.color=g,l.color=g):h=1;s=w?Math.abs(e-b):Math.abs(c-d);s=0this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360);this.options.scaleBreaks&&(this.scaleBreaks=new Q(this.chart, +this.options.scaleBreaks,++this.chart._eventManager.lastObjectId,this));this.stripLines=[];if(this.options.stripLines&&0=this._appliedBreaks[a+1].startValue&&(this._appliedBreaks[a].endValue=Math.max(this._appliedBreaks[a].endValue,this._appliedBreaks[a+1].endValue),window.console&&window.console.log("CanvasJS Error: Breaks "+a+" and "+(a+1)+" are overlapping."),this._appliedBreaks.splice(a,2),a--)}}function L(a,d,b,c,e,g){L.base.constructor.call(this,"Break",d,b,c,g);this.id=e;this.chart=a;this.ctx=this.chart.ctx;this.scaleBreaks=g;this.optionsName= +d;this.isOptionsInArray=!0;this.type=b.type?this.type:g.type;this.fillOpacity=u(b.fillOpacity)?g.fillOpacity:this.fillOpacity;this.lineThickness=u(b.lineThickness)?g.lineThickness:this.lineThickness;this.color=b.color?this.color:g.color;this.lineColor=b.lineColor?this.lineColor:g.lineColor;this.lineDashType=b.lineDashType?this.lineDashType:g.lineDashType;!u(this.startValue)&&this.startValue.getTime&&(this.startValue=this.startValue.getTime());!u(this.endValue)&&this.endValue.getTime&&(this.endValue= +this.endValue.getTime());"number"===typeof this.startValue&&("number"===typeof this.endValue&&this.endValue=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers);O(this._zoomButton,"mouseout",function(){d||(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(0%)", +filter:"invert(0%)"}))},this.allDOMEventHandlers)}this._resetButton||(d=!1,va(this._resetButton=document.createElement("button")),ua(this,this._resetButton,"reset"),this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor,this._toolBar.appendChild(this._resetButton),O(this._resetButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._resetButton,"click",function(){a.toolTip.hide();a.zoomEnabled||a.panEnabled?(a.zoomEnabled= +!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"),a._defaultCursor="default",a.overlaidCanvas.style.cursor=a._defaultCursor):(a.zoomEnabled=!1,a.panEnabled=!1);if(a.sessionVariables.axisX)for(var c=0;c=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers),O(this._resetButton,"mouseout",function(){d||(sa(a,a._resetButton, +{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers),this.overlaidCanvas.style.cursor=a._defaultCursor);this.zoomEnabled||this.panEnabled||(this._zoomButton?(a._zoomButton.getAttribute("state")===a._cultureInfo.zoomText?(this.panEnabled=!0,this.zoomEnabled=!1):(this.zoomEnabled=!0,this.panEnabled= +!1),Qa(a._zoomButton,a._resetButton)):(this.zoomEnabled=!0,this.panEnabled=!1))}else this.panEnabled=this.zoomEnabled=!1;this._menuButton?this.exportEnabled?Qa(this._menuButton):va(this._menuButton):this.exportEnabled&&r&&(d=!1,this._menuButton=document.createElement("button"),ua(this,this._menuButton,"menu"),this._toolBar.appendChild(this._menuButton),O(this._menuButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._menuButton,"click",function(){"none"!==a._dropdownMenu.style.display|| +a._dropDownCloseTime&&500>=(new Date).getTime()-a._dropDownCloseTime.getTime()||(a._dropdownMenu.style.display="block",a._menuButton.blur(),a._dropdownMenu.focus())},this.allDOMEventHandlers,!0),O(this._menuButton,"mouseover",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.fontColorOnHover}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers,!0), +O(this._menuButton,"mouseout",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers,!0));if(!this._dropdownMenu&&this.exportEnabled&&r){d=!1;this._dropdownMenu=document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);var b=-1!==this.theme.indexOf("dark")?"black":"#888888";this._dropdownMenu.style.cssText= +"position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 0px;top: 25px;min-width: 120px;outline: 0;font-size: 14px; font-family: Arial, Helvetica, sans-serif;padding: 5px 0px 5px 0px;text-align: left;line-height: 10px;background-color:"+this.toolbar.backgroundColor+";box-shadow: 2px 2px 10px "+b;a._dropdownMenu.style.display="none";this._toolBar.appendChild(this._dropdownMenu);O(this._dropdownMenu,"blur",function(){va(a._dropdownMenu); +a._dropDownCloseTime=new Date},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.printText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers, +!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){a.print();va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.saveJPGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d= +!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"jpeg",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText= +"padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.savePNGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor, +this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"png",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0)}"none"!==this._toolBar.style.display&&this._zoomButton&&(this.panEnabled?ua(a,a._zoomButton,"zoom"):ua(a,a._zoomButton,"pan"),a._resetButton.getAttribute("state")!==a._cultureInfo.resetText&&ua(a,a._resetButton,"reset"));this.options.toolTip&&this.toolTip.options!==this.options.toolTip&&(this.toolTip.options=this.options.toolTip); +for(var c in this.toolTip.options)this.toolTip.options.hasOwnProperty(c)&&this.toolTip.updateOption(c)};p.prototype._updateSize=function(){var a;a=[this.canvas,this._preRenderCanvas,this.overlaidCanvas,this._eventManager.ghostCanvas];var d=0,b=0;this.options.width?d=this.width:this.width=d=0c.linkedDataSeriesIndex||c.linkedDataSeriesIndex>=this.options.data.length||"number"!==typeof c.linkedDataSeriesIndex|| +"error"===this.options.data[c.linkedDataSeriesIndex].type)&&(c.linkedDataSeriesIndex=null);null===c.name&&(c.name="DataSeries "+a);null===c.color?1a&&"undefined"!==typeof w.startTimePercent?a>=w.startTimePercent&&w.animationCallback(w.easingFunction(a-w.startTimePercent,0,1,1-w.startTimePercent),w):w.animationCallback(w.easingFunction(a,0,1,1),w);s.dispatchEvent("dataAnimationIterationEnd",{chart:s})},function(){b=[];for(var a=0;aa.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c);ed.max&&"number"===typeof e&&(d.max=e);if(0B&&(B=1/B);b.minDiff>B&&1!==B&&(b.minDiff=B)}else B=c-l.dataPoints[w-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B);null!==e&&null!==l.dataPoints[w-1].y&&(a.axisY.logarithmic?(B=e/l.dataPoints[w-1].y,1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e-l.dataPoints[w-1].y,0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B)))}if(cf&& +!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&qd.viewPortMax&&"number"===typeof e&&(d.viewPortMax=e))}}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype._processStackedPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d= +a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=[],l=[],w=Infinity,h=-Infinity,s=0;sb.max&&(b.max=c);if(0r&&(r=1/r);b.minDiff>r&&1!==r&&(b.minDiff=r)}else r=c-q.dataPoints[n-1].x,0>r&&(r*=-1),b.minDiff>r&&0!==r&&(b.minDiff=r);null!==e&&null!==q.dataPoints[n-1].y&&(a.axisY.logarithmic?0r&&(r=1/r),d.minDiff>r&&1!==r&&(d.minDiff=r)):(r=e-q.dataPoints[n-1].y,0>r&&(r*=-1),d.minDiff>r&&0!==r&&(d.minDiff=r)))}if(ct&&!B)B=!0;else if(c>t&&B)continue;q.dataPoints[n].label&&(a.axisX.labels[c]=q.dataPoints[n].label);cb.viewPortMax&&(b.viewPortMax=c);null===q.dataPoints[n].y?b.viewPortMin===c&&kd.max&&(d.max=a),nb.viewPortMax||(ad.viewPortMax&& +(d.viewPortMax=a)));for(n in l)l.hasOwnProperty(n)&&!isNaN(n)&&(a=l[n],ad.max&&(d.max=Math.max(a,h)),nb.viewPortMax||(ad.viewPortMax&&(d.viewPortMax=Math.max(a,h))))}};p.prototype._processStacked100PlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=!1,l=!1,w=[],h=0;hb.max&&(b.max=c);if(0t&&(t=1/t);b.minDiff>t&&1!==t&&(b.minDiff=t)}else t=c-s.dataPoints[q-1].x,0>t&&(t*=-1),b.minDiff>t&&0!==t&&(b.minDiff=t);u(e)||null===s.dataPoints[q-1].y||(a.axisY.logarithmic?0t&&(t=1/t),d.minDiff>t&&1!==t&&(d.minDiff=t)):(t=e-s.dataPoints[q-1].y,0>t&&(t*=-1),d.minDiff>t&&0!==t&&(d.minDiff=t)))}if(cr&&!f)f=!0;else if(c>r&&f)continue;s.dataPoints[q].label&&(a.axisX.labels[c]=s.dataPoints[q].label); +cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&Be&&(l=!0),w[c]=w[c]?w[c]+Math.abs(e):Math.abs(e))}}s.axisX.valueType=s.xValueType=g?"dateTime":"number"}a.axisY.logarithmic?(d.max=u(d.viewPortMax)?99*Math.pow(a.axisY.logarithmBase,-0.05):Math.max(d.viewPortMax,99*Math.pow(a.axisY.logarithmBase,-0.05)),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&!l?(d.max=u(d.viewPortMax)? +99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&l?(d.max=u(d.viewPortMax)?99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99)):!m&&l&&(d.max=u(d.viewPortMax)?-1:Math.max(d.viewPortMax,-1),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99));d.viewPortMin=d.min;d.viewPortMax=d.max;a.dataPointYSums=w}};p.prototype._processMultiYPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo, +b=a.axisX.dataInfo,c,e,g,m,l=!1,w=0;wb.max&&(b.max=c);gd.max&&(d.max=m);0B&&(B=1/B),b.minDiff>B&&1!==B&&(b.minDiff=B)):(B=c-h.dataPoints[s-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B)),e&&(null!==e[0]&&h.dataPoints[s-1].y&&null!==h.dataPoints[s-1].y[0])&&(a.axisY.logarithmic?(B=e[0]/ +h.dataPoints[s-1].y[0],1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e[0]-h.dataPoints[s-1].y[0],0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B))));if(!(ct&&!n)n=!0;else if(c>t&&n)continue;h.dataPoints[s].label&&(a.axisX.labels[c]=h.dataPoints[s].label);cb.viewPortMax&&(b.viewPortMax=c);if(b.viewPortMin===c&&e)for(p=0;pd.viewPortMax&&(d.viewPortMax=m))}}h.axisX.valueType=h.xValueType=l?"dateTime":"number"}};p.prototype._processSpecificPlotUnit=function(a){if("waterfall"===a.type&&a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c),l.dataPointEOs[w].cumulativeSumd.max&&(d.max=l.dataPointEOs[w].cumulativeSum),0q&&(q=1/q),b.minDiff>q&&1!==q&&(b.minDiff=q)):(q=c-l.dataPoints[w-1].x,0>q&&(q*=-1),b.minDiff>q&&0!==q&&(b.minDiff=q)),null!==e&&null!==l.dataPoints[w- +1].y&&(a.axisY.logarithmic?(e=l.dataPointEOs[w].cumulativeSum/l.dataPointEOs[w-1].cumulativeSum,1>e&&(e=1/e),d.minDiff>e&&1!==e&&(d.minDiff=e)):(e=l.dataPointEOs[w].cumulativeSum-l.dataPointEOs[w-1].cumulativeSum,0>e&&(e*=-1),d.minDiff>e&&0!==e&&(d.minDiff=e)))),!(cf&&!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);0d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w-1].cumulativeSum));l.dataPointEOs[w].cumulativeSumd.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w].cumulativeSum)}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype.calculateAutoBreaks=function(){function a(a,c,b,e){if(e)return b= +Math.pow(Math.min(b*a/c,c/a),0.2),1>=b&&(b=Math.pow(1>a?1/a:Math.min(c/a,a),0.25)),{startValue:a*b,endValue:c/b};b=0.2*Math.min(b-c+a,c-a);0>=b&&(b=0.25*Math.min(c-a,Math.abs(a)));return{startValue:a+b,endValue:c-b}}function d(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){var c=a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<=a.axisX.scaleBreaks.maxNumberOfAutoBreaks,b=a.axisY.scaleBreaks&&a.axisY.scaleBreaks.autoCalculate&&1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks;if(c|| +b)for(var d=a.axisY.dataInfo,f=a.axisX.dataInfo,g,h=f.min,l=f.max,m=d.min,n=d.max,f=f._dataRanges,d=d._dataRanges,q,w=0,s=0;sk.dataPoints.length))for(w=0;wf[q].max&&(f[q].max=g)),b){var r= +(n+1-m)*Math.max(parseFloat(a.axisY.scaleBreaks.collapsibleThreshold)||10,10)/100;if((g="waterfall"===a.type?k.dataPointEOs[w].cumulativeSum:k.dataPoints[w].y)&&g.length)for(var p=0;pd[q].max&&(d[q].max=g[p]);else u(g)||(q=Math.floor((g-m)/r),gd[q].max&&(d[q].max=g))}}}}function b(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)&&a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<= +a.axisX.scaleBreaks.maxNumberOfAutoBreaks)for(var c=a.axisX.dataInfo,b=c.min,d=c.max,f=c._dataRanges,g,h=0,l=0;lm.dataPoints.length))for(h=0;hf[g].max&&(f[g].max=c)}}for(var c,e=this,g=!1,m=0;m< +this._axes.length;m++)if(this._axes[m].scaleBreaks&&this._axes[m].scaleBreaks.autoCalculate&&1<=this._axes[m].scaleBreaks.maxNumberOfAutoBreaks){g=!0;this._axes[m].dataInfo._dataRanges=[];for(var l=0;l<100/Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10);l++)this._axes[m].dataInfo._dataRanges.push({min:Infinity,max:-Infinity})}if(g){for(m=0;ms[f].max&&(s[f].max=q)}delete this._axes[m].dataInfo.dataPointYPositiveSums}if(this._axes[m].dataInfo.dataPointYNegativeSums){n= +this._axes[m].dataInfo.dataPointYNegativeSums;s=h;for(l in n)n.hasOwnProperty(l)&&!isNaN(l)&&(q=-1*n[l],u(q)||(f=Math.floor((q-w)/c),qs[f].max&&(s[f].max=q)));delete this._axes[m].dataInfo.dataPointYNegativeSums}for(l=0;lc&&g.push({diff:q,start:s,end:w});break}else l++;if(this._axes[m].scaleBreaks.customBreaks)for(l=0;l=e.x1&&(a<=e.x2&&d>=e.y1&&d<=e.y2)&&(c=e.id)}return c};p.prototype.getAutoFontSize=lb;p.prototype.resetOverlayedCanvas=function(){this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height)};p.prototype.clearCanvas=kb;p.prototype.attachEvent=function(a){this._events.push(a)};p.prototype._touchEventHandler=function(a){if(a.changedTouches&&this.interactivityEnabled){var d=[],b=a.changedTouches,c=b?b[0]:a,e=null;switch(a.type){case "touchstart":case "MSPointerDown":d=["mousemove","mousedown"];this._lastTouchData= +Ra(c);this._lastTouchData.time=new Date;break;case "touchmove":case "MSPointerMove":d=["mousemove"];break;case "touchend":case "MSPointerUp":var g=this._lastTouchData&&this._lastTouchData.time?new Date-this._lastTouchData.time:0,d="touchstart"===this._lastTouchEventType||"MSPointerDown"===this._lastTouchEventType||300>g?["mouseup","click"]:["mouseup"];break;default:return}if(!(b&&1g)this._lastTouchData.scroll=!0}catch(l){}this._lastTouchEventType=a.type;if(this._lastTouchData.scroll&&this.zoomEnabled)this.isDrag&&this.resetOverlayedCanvas(),this.isDrag=!1;else for(b=0;b=e.x1&&d.x<=e.x2&&d.y>=e.y1&&d.y<=e.y2){c[b].call(c.context,d.x,d.y);"mousedown"===b&&!0===c.capture?(p.capturedEventParam=c,this.overlaidCanvas.setCapture?this.overlaidCanvas.setCapture():document.documentElement.addEventListener("mouseup", +this._mouseEventHandler,!1)):"mouseup"===b&&(c.chart.overlaidCanvas.releaseCapture?c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",this._mouseEventHandler,!1));break}else c=null;a.target.style.cursor=c&&c.cursor?c.cursor:this._defaultCursor}b=this.plotArea;if(d.xb.x2||d.yb.y2)this.toolTip&&this.toolTip.enabled?this.toolTip.hide():this.resetOverlayedCanvas();this.isDrag&&this.zoomEnabled||!this._eventManager||this._eventManager.mouseEventHandler(a)}}; +p.prototype._plotAreaMouseDown=function(a,d){this.isDrag=!0;this.dragStartPoint={x:a,y:d}};p.prototype._plotAreaMouseUp=function(a,d){if(("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)&&this.isDrag){var b=d-this.dragStartPoint.y,c=a-this.dragStartPoint.x,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=!1;this.resetOverlayedCanvas();if("xySwapped"===this.plotInfo.axisPlacement)var l=g,g=e,e=l;if(this.panEnabled||this.zoomEnabled){if(this.panEnabled)for(e= +g=0;eb.maximum&&(g=b.viewportMaximum/b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum/g,b.sessionVariables.newViewportMaximum=b.viewportMaximum/g,m=!0):b.viewportMinimumb.maximum&&(g=b.viewportMaximum-b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum-g,b.sessionVariables.newViewportMaximum=b.viewportMaximum-g,m=!0);else if((!e||2Math.abs(b)&&(this.panEnabled||this.zoomEnabled)?this.toolTip.hide():this.panEnabled||this.zoomEnabled||this.toolTip.mouseMoveHandler(a, +d);if((!e||2f)var B=f,f=n,n=B;if(q.scaleBreaks)for(B=0;!g&&B=f;if(isFinite(q.dataInfo.minDiff))if(B=q.getApparentDifference(n,f,null,!0),!(g||!(this.panEnabled&&q.scaleBreaks&&q.scaleBreaks._appliedBreaks.length)&&(q.logarithmic&&Bq.maximum))w.push(q),s.push({val1:n,val2:f}),l=!0;else if(!e){l=!1;break}}return{isValid:l,axesWithValidRange:w,axesRanges:s}};p.prototype.preparePlotArea=function(){var a=this.plotArea;!r&&(0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2;a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2;a.width=a.x2-a.x1;a.height=a.y2-a.y1}this.axisY2&&0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2,a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2,a.width=a.x2-a.x1,a.height=a.y2-a.y1)}else d= +this.layoutManager.getFreeSpace(),a.x1=d.x1,a.x2=d.x2,a.y1=d.y1,a.y2=d.y2,a.width=d.width,a.height=d.height;r||(a.canvas.width=a.width,a.canvas.height=a.height,a.canvas.style.left=a.x1+"px",a.canvas.style.top=a.y1+"px",(0b.x2||h.point.yb.y2+1)continue}else if("rangearea"===s||"rangesplinearea"===s){if(h.dataPoint.xy.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("bubble")||0<=s.indexOf("scatter")){if(h.dataPoint.xy.viewportMaximum|| +h.dataPoint.yA.viewportMaximum)continue}else if(0<=s.indexOf("column")||"waterfall"===s||"error"===s&&!h.axisSwapped){if(h.dataPoint.xy.viewportMaximum||h.bounds.y1>b.y2||h.bounds.y2y.viewportMaximum||h.bounds.x1>b.x2||h.bounds.x2 +y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(h.dataPoint.xy.viewportMaximum)continue;e=m=2;"horizontal"===C?(l=f.width,w=f.height):(w=f.width,l=f.height);if("normal"===this.plotInfo.axisPlacement){if(0<=s.indexOf("line")||0<=s.indexOf("area"))t="auto",m=4;else if(0<=s.indexOf("stacked"))"auto"===t&&(t="inside");else if("bubble"===s||"scatter"===s)t="inside";q=h.point.x- +l/2;"inside"!==t?(e=b.y1,g=b.y2,0h.point.y)):(n=h.point.y+m+c,n>g-w-m-c&&(n="auto"===t?Math.min(h.point.y,g)-w-m-c:g-w-m-c,v=ng-w-m&&("bubble"===s||"scatter"===s)&&(n=Math.min(h.point.y+m,b.y2-w-m))),n=Math.min(n,g-w))}else 0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("scatter")?(t="auto",e=4):0<=s.indexOf("stacked")?"auto"===t&&(t="inside"):"bubble"===s&&(t="inside"),n=h.point.y-w/2,"inside"!==t?(m=b.x1,g=b.x2,0>ma?(q=h.point.x-l-e-c,qh.point.x)):(q=h.point.x+e+c,q>g-l-e-c&&(q="auto"=== +t?Math.min(h.point.x,g)-l-e-c:g-l-e-c,v=qma?Math.max(h.bounds.x1,b.x1)+l/2+e:Math.min(h.bounds.x2,b.x2)-l/2-e:(Math.max(h.bounds.x1,b.x1)+Math.min(h.bounds.x2,b.x2))/2,q=0>ma?Math.max(h.point.x,c)-l/2:Math.min(h.point.x,c)-l/2,q=Math.max(q,m));"vertical"===C&&(n+=w);f.x=q;f.y=n;f.render(!0);p&&("inside"!==t&&(0>s.indexOf("bar")&&("error"!==s||!h.axisSwapped)&&h.point.x>b.x1&&h.point.xs.indexOf("column")&&("error"!==s||h.axisSwapped)&&h.point.y>b.y1&&h.point.y=a.dataSeriesIndexes.length)){var c= +this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepLine=function(a){var d=a.targetCanvasCtx|| +this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&& +(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation, +easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderSpline=function(a){function d(a){a=v(a,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx;c.save();var g=this.plotArea;c.beginPath(); +c.rect(g.x1,g.y1,g.width,g.height);c.clip();for(var m=[],l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[p].y)0s[p].y===a.axisY.reversed?1:-1,color:B});u=!1}d(x)}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(g.x1,g.y1,g.width,g.height),e.beginPath());c.restore();c.beginPath();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width, +0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.dataPointWidth=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){m=a.axisX.convertValueToPixel(w);l=a.axisY.convertValueToPixel(B[g].y);m=a.axisX.reversed?m+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:m-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var k=a.axisX.reversed?m-q<<0:m+q<<0,t;0<=B[g].y?t=h:(t=l,l=h);l>t&&(c=l,l=t,t=c);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,l,k,t,c,0,null,p&&0<=B[g].y, +0>B[g].y&&p,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:m,y1:l,x2:k,y2:t};c=N(c);r&&ea(this._eventManager.ghostCtx,m,l,k,t,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"column",dataPoint:B[g],dataSeries:f,point:{x:m+(k-m)/2,y:0>B[g].y===a.axisY.reversed?l:t},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:m, +y1:Math.min(l,t),x2:k,y2:Math.max(l,t)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore(); +return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.y2?a.axisY.bounds.y2:h}}};p.prototype.renderStackedColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth? +this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q="undefined"!==typeof m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;g[c]=A+(y-q)}else A=m[c]?m[c]:0,y=q+A,q=n+A,m[c]=A+(y-q);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1, +!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedColumn",dataPoint:t[h],dataSeries:p,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q, +y)},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx, +animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderStackedColumn100=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth: +this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);q=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;q=a.axisY.convertValueToPixel(l[c]);y=g[c]?g[c]:n;g[c]=q}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=q+("undefined"!==typeof w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q=m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(q),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y1-q)&&(q=e.y1);g[c]=A+(y-q)}else A="undefined"!==typeof m[c]? +m[c]:0,y=q+A,q=n+A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y2-y)&&(y=e.y2),m[c]=A+(y-q);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&& +this._indexLabels.push({chartType:"stackedColumn100",dataPoint:t[h],dataSeries:k,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q,y)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&& +this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= +null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.options.dataPointWidth? +this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height); +b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){l=a.axisX.convertValueToPixel(w); +m=a.axisY.convertValueToPixel(B[g].y);l=a.axisX.reversed?l+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:l-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var p=a.axisX.reversed?l-q<<0:l+q<<0,t;0<=B[g].y?t=h:(t=m,m=h);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,t,l,m,p,c,0,null,k,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:t,y1:l,x2:m,y2:p};c= +N(c);r&&ea(this._eventManager.ghostCtx,t,l,m,p,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"bar",dataPoint:B[g],dataSeries:f,point:{x:0<=B[g].y?m:t,y:l+(p-l)/2},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(t,m),y1:l,x2:Math.max(t,m),y2:p},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas, +0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.x2?a.axisY.bounds.x2: +h}}};p.prototype.renderStackedBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<< +0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),s=m[c]? +m[c]:n,m[c]=y=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A=g[c]?g[c]:0;y=n+A;s+=A;g[c]=A+(s-y)}else A=m[c]?m[c]:0,y=s-A,s=n-A,m[c]=A+(s-y);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,y,x,s,v,c,0,null,u,!1,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:y,y1:x,x2:s,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,y,x,s,v,c,0,null,!1,!1,!1, +!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar",dataPoint:t[h],dataSeries:k,point:{x:0<=t[h].y?s:y,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(y,s),y1:x,x2:Math.max(y,s),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderStackedBar100=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)|| +(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save(); +b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&& +"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x;x=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var v=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,y=v+f<<0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;x=g[c]?g[c]:n;g[c]=s=a.axisY.convertValueToPixel(l[c])}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=x+(w[c]?w[c]:0),s=m[c]?m[c]: +n,m[c]=x=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(x),0<=t[h].y){var A=g[c]?g[c]:0;x=n+A;s+=A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x2-s)&&(s=e.x2);g[c]=A+(s-x)}else A=m[c]?m[c]:0,x=s-A,s=n-A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x1-x)&&(x=e.x1),m[c]=A+(s-x);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,v,s,y,c,0,null,u,!1,!1,!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k, +dataPointIndex:h,x1:x,y1:v,x2:s,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,v,s,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar100",dataPoint:t[h],dataSeries:p,point:{x:0<=t[h].y?s:x,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(x,s),y1:v,x2:Math.max(x,s),y2:y},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop", +a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!da)))if("number"!==typeof p[k].y)B.connectNullData||(da||d)||c(),da=!0;else{t=a.axisX.convertValueToPixel(x);u=a.axisY.convertValueToPixel(p[k].y);d||da?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||b===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d=t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,b=B.nullDataLineDashType,g.setLineDash(Y)),g.lineTo(t,u),r&&m.lineTo(t, +u)):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),da=d=!1):(g.lineTo(t,u),r&&m.lineTo(t,u),0==k%250&&c());q={x:t,y:u};kp[k].y===a.axisY.reversed?1:-1,color:z})}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderSplineArea=function(a){function d(){var b=v(x,2);if(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum? +t=p:0>a.axisY.viewportMaximum?t=m.y1:0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=a.axisX.lineCoordinates,m=a.axisY.lineCoordinates,l=[],w=this.plotArea;c.save();r&& +e.save();c.beginPath();c.rect(w.x1,w.y1,w.width,w.height);c.clip();r&&(e.beginPath(),e.rect(w.x1,w.y1,w.width,w.height),e.clip());for(var h=0;ha.axisX.dataInfo.viewPortMax&&(!q.connectNullData||!k)))if("number"!==typeof n[f].y)0n[f].y===a.axisY.reversed?1:-1,color:ma});k=!1}d();ia.drawMarkers(l)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(w.x1,w.y1,w.width,w.height), +this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!b))){var Z=u;"number"!==typeof k[p].y?(B.connectNullData||(b||d)||c(),b=!0):(t=a.axisX.convertValueToPixel(x),u=a.axisY.convertValueToPixel(k[p].y),d||b?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||Y===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d= +t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,Y=B.nullDataLineDashType,g.setLineDash(ca)),g.lineTo(t,Z),g.lineTo(t,u),r&&(m.lineTo(t,Z),m.lineTo(t,u))):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),b=d=!1):(g.lineTo(t,Z),r&&m.lineTo(t,Z),g.lineTo(t,u),r&&m.lineTo(t,u),0==p%250&&c()),q={x:t,y:u},pk[p].y===a.axisY.reversed?1:-1,color:z}))}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea=function(a){function d(){if(!(1>h.length)){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=[],l=this.plotArea,w=[],h=[],s=[],q=[],n=0,f,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),u=this._eventManager.ghostCtx,t,C,x;r&&u.beginPath();c.save();r&&u.save();c.beginPath();c.rect(l.x1,l.y1,l.width,l.height);c.clip();r&&(u.beginPath(),u.rect(l.x1,l.y1,l.width,l.height),u.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData||!da)))if("number"!==typeof Z.y)A.connectNullData||(da||C)||d(),da=!0;else{f=a.axisX.convertValueToPixel(g);var oa= +w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(Z.y),k-=oa;h.push({x:f,y:p-oa});w[g]=p-k;C||da?(!C&&A.connectNullData?(c.setLineDash&&(A.options.nullDataLineDashType||x===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(C=h.pop(),x=h[h.length-1],d(),c.moveTo(t.x,t.y),h.push(x),h.push(C),x=A.nullDataLineDashType, +c.setLineDash(Y)),c.lineTo(f,k),r&&u.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(u.beginPath(),u.moveTo(f,k))),da=C=!1):(c.lineTo(f,k),r&&u.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&u.moveTo(f,k),h.push({x:f,y:p-oa})));t={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&u.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(l.x1,l.y1,l.width,l.height),u.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea100=function(a){function d(){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=[],w=[],h=[],s=[],q=[],n=0,f,k,p,u,t,C=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),x=this._eventManager.ghostCtx;c.save();r&&x.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(x.beginPath(), +x.rect(m.x1,m.y1,m.width,m.height),x.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData|| +!da)))if("number"!==typeof Z.y)A.connectNullData||(da||u)||d(),da=!0;else{var oa;oa=0!==a.dataPointYSums[g]?100*(Z.y/a.dataPointYSums[g]):0;f=a.axisX.convertValueToPixel(g);var la=w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(oa),k-=la;h.push({x:f,y:C-la});w[g]=C-k;u||da?(!u&&A.connectNullData?(c.setLineDash&& +(A.options.nullDataLineDashType||t===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(u=h.pop(),t=h[h.length-1],d(),c.moveTo(p.x,p.y),h.push(t),h.push(u),t=A.nullDataLineDashType,c.setLineDash(Y)),c.lineTo(f,k),r&&x.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(x.beginPath(),x.moveTo(f,k))),da=u=!1):(c.lineTo(f,k),r&&x.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&x.moveTo(f,k),h.push({x:f,y:C-la})));p={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&x.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(l);r&&(b.drawImage(this._preRenderCanvas,0, +0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),x.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}}; +p.prototype.renderBubble=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=-Infinity,w=Infinity,h=0;ha.axisX.dataInfo.viewPortMax||"undefined"===typeof n[e].z||(f=n[e].z,f>l&&(l=f),fa.axisX.dataInfo.viewPortMax)&&"number"===typeof n[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(n[e].y);var f=n[e].z,u=2*Math.max(Math.sqrt((l===w?p/2:k+(p-k)/(l-w)*(f-w))/Math.PI)<<0,1),f=q.getMarkerProperties(e,b);f.size=u;b.globalAlpha=q.fillOpacity;ia.drawMarker(g,m,b,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;var t=q.dataPointIds[e];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:s, +dataPointIndex:e,x1:g,y1:m,size:u};u=N(t);r&&ia.drawMarker(g,m,this._eventManager.ghostCtx,f.type,f.size,u,u,f.borderThickness);(n[e].indexLabel||q.indexLabel||n[e].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"bubble",dataPoint:n[e],dataSeries:q,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/2,x2:g+f.size/2,y2:m+f.size/2},color:null})}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderScatter=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=0;la.axisX.dataInfo.viewPortMax)&&"number"===typeof s[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(s[e].y);var f=h.getMarkerProperties(e,g,m,b);b.globalAlpha=h.fillOpacity;ia.drawMarker(f.x,f.y,f.ctx,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;Math.sqrt((q-g)*(q-g)+(n-m)*(n-m))Math.min(this.plotArea.width,this.plotArea.height)||(q=h.dataPointIds[e],this._eventManager.objectMap[q]={id:q,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:e,x1:g,y1:m},q=N(q),r&&ia.drawMarker(f.x,f.y,this._eventManager.ghostCtx,f.type,f.size,q,q,f.borderThickness),(s[e].indexLabel||h.indexLabel||s[e].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"scatter",dataPoint:s[e],dataSeries:h,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/ +2,x2:g+f.size/2,y2:m+f.size/2},color:null}),q=g,n=m)}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore()); +b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderCandlestick=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=0,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,g=this.options.dataPointMaxWidth? +this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*m.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&&e>g&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,g));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&gg&&(k=g);b.save();r&&c.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(c.beginPath(),c.rect(m.x1,m.y1,m.width,m.height),c.clip());for(var p=0;pa.axisX.dataInfo.viewPortMax)&&!u(C[l].y)&&C[l].y.length&& +"number"===typeof C[l].y[0]&&"number"===typeof C[l].y[1]&&"number"===typeof C[l].y[2]&&"number"===typeof C[l].y[3]){w=a.axisX.convertValueToPixel(f);h=a.axisY.convertValueToPixel(C[l].y[0]);s=a.axisY.convertValueToPixel(C[l].y[1]);q=a.axisY.convertValueToPixel(C[l].y[2]);n=a.axisY.convertValueToPixel(C[l].y[3]);var z=w-k/2<<0,y=z+k<<0,g=t.options.fallingColor?t.fallingColor:t._colorSet[0],e=C[l].color?C[l].color:t._colorSet[0],A=Math.round(Math.max(1,0.15*k)),D=0===A%2?0:0.5,aa=t.dataPointIds[l]; +this._eventManager.objectMap[aa]={id:aa,objectType:"dataPoint",dataSeriesIndex:v,dataPointIndex:l,x1:z,y1:h,x2:y,y2:s,x3:w,y3:q,x4:w,y4:n,borderThickness:A,color:e};b.strokeStyle=e;b.beginPath();b.lineWidth=A;c.lineWidth=Math.max(A,4);"candlestick"===t.type?(b.moveTo(w-D,s),b.lineTo(w-D,Math.min(h,n)),b.stroke(),b.moveTo(w-D,Math.max(h,n)),b.lineTo(w-D,q),b.stroke(),ea(b,z,Math.min(h,n),y,Math.max(h,n),C[l].y[0]<=C[l].y[3]?t.risingColor:g,A,e,x,x,!1,!1,t.fillOpacity),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w- +D,s),c.lineTo(w-D,Math.min(h,n)),c.stroke(),c.moveTo(w-D,Math.max(h,n)),c.lineTo(w-D,q),c.stroke(),ea(c,z,Math.min(h,n),y,Math.max(h,n),e,0,null,!1,!1,!1,!1))):"ohlc"===t.type&&(b.moveTo(w-D,s),b.lineTo(w-D,q),b.stroke(),b.beginPath(),b.moveTo(w,h),b.lineTo(z,h),b.stroke(),b.beginPath(),b.moveTo(w,n),b.lineTo(y,n),b.stroke(),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w-D,s),c.lineTo(w-D,q),c.stroke(),c.beginPath(),c.moveTo(w,h),c.lineTo(z,h),c.stroke(),c.beginPath(),c.moveTo(w,n),c.lineTo(y,n),c.stroke())); +(C[l].indexLabel||t.indexLabel||C[l].indexLabelFormatter||t.indexLabelFormatter)&&this._indexLabels.push({chartType:t.type,dataPoint:C[l],dataSeries:t,point:{x:z+(y-z)/2,y:a.axisY.reversed?q:s},direction:1,bounds:{x1:z,y1:Math.min(s,q),x2:y,y2:Math.max(s,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas, +0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderBoxAndWhisker=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e= +null,g=this.plotArea,m=0,l,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*g.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&& +e>m&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(k=m);b.save();r&&c.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(c.beginPath(),c.rect(g.x1,g.y1,g.width,g.height),c.clip());for(var p=!1,p=!!a.axisY.reversed,v=0;va.axisX.dataInfo.viewPortMax)&&!u(x[m].y)&&x[m].y.length&&"number"===typeof x[m].y[0]&&"number"===typeof x[m].y[1]&&"number"===typeof x[m].y[2]&&"number"===typeof x[m].y[3]&&"number"===typeof x[m].y[4]&&5===x[m].y.length){l=a.axisX.convertValueToPixel(f);w=a.axisY.convertValueToPixel(x[m].y[0]);h=a.axisY.convertValueToPixel(x[m].y[1]);s=a.axisY.convertValueToPixel(x[m].y[2]); +q=a.axisY.convertValueToPixel(x[m].y[3]);n=a.axisY.convertValueToPixel(x[m].y[4]);var y=l-k/2<<0,A=l+k/2<<0,e=x[m].color?x[m].color:C._colorSet[0],D=Math.round(Math.max(1,0.15*k)),aa=0===D%2?0:0.5,T=x[m].whiskerColor?x[m].whiskerColor:x[m].color?C.whiskerColor?C.whiskerColor:x[m].color:C.whiskerColor?C.whiskerColor:e,Y="number"===typeof x[m].whiskerThickness?x[m].whiskerThickness:"number"===typeof C.options.whiskerThickness?C.whiskerThickness:D,ca=x[m].whiskerDashType?x[m].whiskerDashType:C.whiskerDashType, +da=u(x[m].whiskerLength)?u(C.options.whiskerLength)?k:C.whiskerLength:x[m].whiskerLength,da="number"===typeof da?0>=da?0:da>=k?k:da:"string"===typeof da?parseInt(da)*k/100>k?k:parseInt(da)*k/100:k,Z=1===Math.round(Y)%2?0.5:0,oa=x[m].stemColor?x[m].stemColor:x[m].color?C.stemColor?C.stemColor:x[m].color:C.stemColor?C.stemColor:e,la="number"===typeof x[m].stemThickness?x[m].stemThickness:"number"===typeof C.options.stemThickness?C.stemThickness:D,G=1===Math.round(la)%2?0.5:0,F=x[m].stemDashType?x[m].stemDashType: +C.stemDashType,E=x[m].lineColor?x[m].lineColor:x[m].color?C.lineColor?C.lineColor:x[m].color:C.lineColor?C.lineColor:e,H="number"===typeof x[m].lineThickness?x[m].lineThickness:"number"===typeof C.options.lineThickness?C.lineThickness:D,I=x[m].lineDashType?x[m].lineDashType:C.lineDashType,K=1===Math.round(H)%2?0.5:0,L=C.upperBoxColor,O=C.lowerBoxColor,Q=u(C.options.fillOpacity)?1:C.fillOpacity,P=C.dataPointIds[m];this._eventManager.objectMap[P]={id:P,objectType:"dataPoint",dataSeriesIndex:t,dataPointIndex:m, +x1:y,y1:w,x2:A,y2:h,x3:l,y3:s,x4:l,y4:q,y5:n,borderThickness:D,color:e,stemThickness:la,stemColor:oa,whiskerThickness:Y,whiskerLength:da,whiskerColor:T,lineThickness:H,lineColor:E};b.save();0=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth: +1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.03*this.width;var h=a.axisX.dataInfo.minDiff;isFinite(h)||(h=0.3*Math.abs(a.axisX.range));h=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(h)/Math.log(a.axisX.range):Math.abs(h)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&& +(this.dataPointMinWidth&&mm&&(h=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var s=0;sa.axisX.dataInfo.viewPortMax)&&!u(f[g].y)&&f[g].y.length&&"number"===typeof f[g].y[0]&&"number"===typeof f[g].y[1]){c=a.axisX.convertValueToPixel(w);m=a.axisY.convertValueToPixel(f[g].y[0]);l=a.axisY.convertValueToPixel(f[g].y[1]);var p=a.axisX.reversed?c+a.plotType.totalDataSeries*h/2-(a.previousDataSeriesCount+s)*h<<0:c-a.plotType.totalDataSeries*h/2+(a.previousDataSeriesCount+ +s)*h<<0,v=a.axisX.reversed?p-h<<0:p+h<<0,c=f[g].color?f[g].color:n._colorSet[g%n._colorSet.length];if(m>l){var t=m;m=l;l=t}t=n.dataPointIds[g];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:q,dataPointIndex:g,x1:p,y1:m,x2:v,y2:l};ea(b,p,m,v,l,c,0,c,k,k,!1,!1,n.fillOpacity);c=N(t);r&&ea(this._eventManager.ghostCtx,p,m,v,l,c,0,null,!1,!1,!1,!1);if(f[g].indexLabel||n.indexLabel||f[g].indexLabelFormatter||n.indexLabelFormatter)this._indexLabels.push({chartType:"rangeColumn", +dataPoint:f[g],dataSeries:n,indexKeyword:0,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?l:m},direction:f[g].y[1]>=f[g].y[0]?-1:1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c}),this._indexLabels.push({chartType:"rangeColumn",dataPoint:f[g],dataSeries:n,indexKeyword:1,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?m:l},direction:f[g].y[1]>=f[g].y[0]?1:-1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation= +"source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderError= +function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=a.axisY._position?"left"===a.axisY._position||"right"===a.axisY._position?!1:!0:!1;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=!1,m=this.plotArea,l=0,w,h,s,q,n,f,k,p=a.axisX.dataInfo.minDiff;isFinite(p)||(p=0.3*Math.abs(a.axisX.range));b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(m.x1, +m.y1,m.width,m.height),this._eventManager.ghostCtx.clip());for(var v=0,t=0;tl&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,l));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ll&&(t=l);if(0=T.length?0:T.length>=t?t:T.length:"string"===typeof T.length?parseInt(T.length)*t/100>t?t:parseInt(T.length)*t/100>t:t;T.thickness="number"===typeof T.thickness?0>T.thickness?0:Math.round(T.thickness):2;var Y={color:y[l].stemColor?y[l].stemColor:y[l].color?z.stemColor?z.stemColor:y[l].color:z.stemColor?z.stemColor:e,thickness:y[l].stemThickness?y[l].stemThickness:z.stemThickness,dashType:y[l].stemDashType? +y[l].stemDashType:z.stemDashType};Y.thickness="number"===typeof Y.thickness?0>Y.thickness?0:Math.round(Y.thickness):2;y[l].getTime?k=y[l].x.getTime():k=y[l].x;if(!(ka.axisX.dataInfo.viewPortMax)&&!u(y[l].y)&&y[l].y.length&&"number"===typeof y[l].y[0]&&"number"===typeof y[l].y[1]){var ca=a.axisX.convertValueToPixel(k);c?h=ca:w=ca;ca=a.axisY.convertValueToPixel(y[l].y[0]);c?s=ca:n=ca;ca=a.axisY.convertValueToPixel(y[l].y[1]);c?q=ca:f=ca;c?(n=a.axisX.reversed?h+(A?v: +1)*t/2-(A?D-1:0)*t<<0:h-(A?v:1)*t/2+(A?D-1:0)*t<<0,f=a.axisX.reversed?n-t<<0:n+t<<0):(s=a.axisX.reversed?w+(A?v:1)*t/2-(A?D-1:0)*t<<0:w-(A?v:1)*t/2+(A?D-1:0)*t<<0,q=a.axisX.reversed?s-t<<0:s+t<<0);!c&&n>f&&(ca=n,n=f,f=ca);c&&s>q&&(ca=s,s=q,q=ca);ca=z.dataPointIds[l];this._eventManager.objectMap[ca]={id:ca,objectType:"dataPoint",dataSeriesIndex:x,dataPointIndex:l,x1:Math.min(s,q),y1:Math.min(n,f),x2:Math.max(q,s),y2:Math.max(f,n),isXYSwapped:c,stemProperties:Y,whiskerProperties:T};E(b,Math.min(s,q), +Math.min(n,f),Math.max(q,s),Math.max(f,n),e,T,Y,c);r&&E(this._eventManager.ghostCtx,s,n,q,f,e,T,Y,c);if(y[l].indexLabel||z.indexLabel||y[l].indexLabelFormatter||z.indexLabelFormatter)this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:0,point:{x:c?y[l].y[1]>=y[l].y[0]?s:q:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?f:n},direction:y[l].y[1]>=y[l].y[0]?-1:1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c}), +this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:1,point:{x:c?y[l].y[1]>=y[l].y[0]?q:s:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?n:f},direction:y[l].y[1]>=y[l].y[0]?1:-1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height), +a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx: +d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0;var s=a.axisX.dataInfo.minDiff;isFinite(s)||(s=0.3*Math.abs(a.axisX.range));s=this.options.dataPointWidth?this.dataPointWidth:0.9* +(e.height*(a.axisX.logarithmic?Math.log(s)/Math.log(a.axisX.range):Math.abs(s)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(s=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(), +this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var q=0;qa.axisX.dataInfo.viewPortMax)&&!u(k[g].y)&&k[g].y.length&&"number"===typeof k[g].y[0]&&"number"===typeof k[g].y[1]){m=a.axisY.convertValueToPixel(k[g].y[0]); +l=a.axisY.convertValueToPixel(k[g].y[1]);w=a.axisX.convertValueToPixel(h);w=a.axisX.reversed?w+a.plotType.totalDataSeries*s/2-(a.previousDataSeriesCount+q)*s<<0:w-a.plotType.totalDataSeries*s/2+(a.previousDataSeriesCount+q)*s<<0;var v=a.axisX.reversed?w-s<<0:w+s<<0;m>l&&(c=m,m=l,l=c);c=k[g].color?k[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,w,l,v,c,0,null,p,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g, +x1:m,y1:w,x2:l,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,m,w,l,v,c,0,null,!1,!1,!1,!1);if(k[g].indexLabel||f.indexLabel||k[g].indexLabelFormatter||f.indexLabelFormatter)this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:0,point:{x:k[g].y[1]>=k[g].y[0]?m:l,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?-1:1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c}),this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:1,point:{x:k[g].y[1]>= +k[g].y[0]?l:m,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?1:-1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1, +e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeArea=function(a){function d(){if(C){var a=null;0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width,m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!s.connectNullData||!T)))if(null!==q[f].y&&q[f].y.length&&"number"===typeof q[f].y[0]&&"number"===typeof q[f].y[1]){k=a.axisX.convertValueToPixel(t);p=a.axisY.convertValueToPixel(q[f].y[0]);u=a.axisY.convertValueToPixel(q[f].y[1]);n||T?(s.connectNullData&&!n?(c.setLineDash&&(s.options.nullDataLineDashType||A===s.lineDashType&&s.lineDashType!==s.nullDataLineDashType)&&(w[w.length- +1].newLineDashArray=D,A=s.nullDataLineDashType,c.setLineDash(z)),c.lineTo(k,p),r&&e.lineTo(k,p),w.push({x:k,y:u})):(c.beginPath(),c.moveTo(k,p),C={x:k,y:p},w=[],w.push({x:k,y:u}),r&&(e.beginPath(),e.moveTo(k,p))),T=n=!1):(c.lineTo(k,p),w.push({x:k,y:u}),r&&e.lineTo(k,p),0==f%250&&d());t=s.dataPointIds[f];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:h,dataPointIndex:f,x1:k,y1:p,y2:u};fq[f].y[1]===a.axisY.reversed?-1:1,color:x}),this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:1,point:{x:k, +y:u},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?1:-1,color:x})}else T||n||d(),T=!0;d();ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1, +m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderRangeSplineArea=function(a){function d(a,b){var d=v(u,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width, +m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!f)))if(null!==k[q].y&&k[q].y.length&&"number"===typeof k[q].y[0]&&"number"===typeof k[q].y[1]){n=a.axisX.convertValueToPixel(n);f=a.axisY.convertValueToPixel(k[q].y[0]);p=a.axisY.convertValueToPixel(k[q].y[1]);var E=h.dataPointIds[q];this._eventManager.objectMap[E]={id:E,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:q, +x1:n,y1:f,y2:p};u[u.length]={x:n,y:f};z[z.length]={x:n,y:p};q=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx,e=null,g=this.plotArea,m=0,l,k,h,s,q=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),m=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;k=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width,0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0;var n= +a.axisX.dataInfo.minDiff;isFinite(n)||(n=0.3*Math.abs(a.axisX.range));n=this.options.dataPointWidth?this.dataPointWidth:0.6*(g.width*(a.axisX.logarithmic?Math.log(n)/Math.log(a.axisX.range):Math.abs(n)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&m>k&&(m=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,k));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&kk&&(n=k);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.clip());for(var f=0;fh&&(e=k,k=h,h=e);a.axisY.reversed&&(e=k,k=h,h=e);e=u.dataPointIds[m];this._eventManager.objectMap[e]={id:e,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:m,x1:l,y1:k,x2:F,y2:h}; +var T=v[m].color?v[m].color:0v[m].y===a.axisY.reversed?1:-1,bounds:{x1:l,y1:Math.min(k,h),x2:F,y2:Math.max(k,h)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height), +b.clearRect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};var ja=function(a,d,b,c,e,g,m,l,k){if(!(0>b)){"undefined"===typeof l&&(l=1);if(!r){var h=Number((m%(2*Math.PI)).toFixed(8));Number((g%(2*Math.PI)).toFixed(8))===h&&(m-=1E-4)}a.save();a.globalAlpha=l;"pie"===e?(a.beginPath(),a.moveTo(d.x,d.y),a.arc(d.x,d.y,b,g,m,!1),a.fillStyle=c,a.strokeStyle= +"white",a.lineWidth=2,a.closePath(),a.fill()):"doughnut"===e&&(a.beginPath(),a.arc(d.x,d.y,b,g,m,!1),0<=k&&a.arc(d.x,d.y,k*b,m,g,!0),a.closePath(),a.fillStyle=c,a.strokeStyle="white",a.lineWidth=2,a.fill());a.globalAlpha=1;a.restore()}};p.prototype.renderPie=function(a){function d(){if(h&&s){for(var a=0,b=0,c=0,e=0,d=0;dMath.PI/2-t&&m.midAngle +m.midAngle)c=d;a++}else if(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t){if(0===b||f[e].midAngle>m.midAngle)e=d;b++}m.hemisphere=g>Math.PI/2&&g<=3*Math.PI/2?"left":"right";m.indexLabelTextBlock=new ka(k.plotArea.ctx,{fontSize:m.indexLabelFontSize,fontFamily:m.indexLabelFontFamily,fontColor:m.indexLabelFontColor,fontStyle:m.indexLabelFontStyle,fontWeight:m.indexLabelFontWeight,horizontalAlign:"left",backgroundColor:m.indexLabelBackgroundColor,maxWidth:m.indexLabelMaxWidth,maxHeight:m.indexLabelWrap? +5*m.indexLabelFontSize:1.5*m.indexLabelFontSize,text:m.indexLabelText,padding:0,textBaseline:"top"});m.indexLabelTextBlock.measureText()}l=g=0;q=!1;for(d=0;dMath.PI/2-t&&m.midAngle3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t)&&(l<=b/2&&!q?(m.hemisphere="left",l++):(m.hemisphere="right",q=!0))}}function b(a){var b= +k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);for(b=0;bc){var d=0.07*A*Math.cos(f[b].midAngle),g=0.07*A*Math.sin(f[b].midAngle),m=!1;if(s[b].exploded){if(1E-9a.indexLabelTextBlock.y?d-e:c-f}function e(a){for(var b=null,e=1;ec(f[b],f[a])||("right"===f[a].hemisphere?f[b].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y:f[b].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y)))break;else b=null;return b}function g(a,b,d){d=(d||0)+1;if(1E3< +d)return 0;b=b||0;var m=0,h=x.y-1*r,l=x.y+1*r;if(0<=a&&ab&&n.indexLabelTextBlock.yl)return 0;var k=0,q=0,q=k=k=0;0>b?n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2>h&&n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+bl&&(b=n.indexLabelTextBlock.y+ +n.indexLabelTextBlock.height/2+b-l);b=n.indexLabelTextBlock.y+b;h=0;h="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2));q=x.x+A*Math.cos(n.midAngle);k=x.y+A*Math.sin(n.midAngle);k=Math.sqrt(Math.pow(h-q,2)+Math.pow(b-k,2));q=Math.acos(A/r);k=Math.acos((r*r+A*A-k*k)/(2*A*r));b=kc(f[h],f[a])||("right"===f[a].hemisphere?f[h].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y:f[h].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y)))break;else h=null;q=h;k=e(a);l=h=0;0>b?(l="right"===n.hemisphere?q:k,m=b,null!==l&&(q=-b,b=n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2-(f[l].indexLabelTextBlock.y+f[l].indexLabelTextBlock.height/2),b-q+h.toFixed(C)&&(m=b>p?-(b-p):-(q-(l-h)))))):0p?b-p:q-(h-l)))));m&&(d=n.indexLabelTextBlock.y+m,b=0,b="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)),n.midAngle>Math.PI/2-t&&n.midAngleh.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x-15:"right"===n.hemisphere&&("left"===a.hemisphere&&b3*Math.PI/2-t&&n.midAngle<3*Math.PI/2+t&&(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"right"===n.hemisphere&&"left"===h.hemisphere&&ba.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x- +15)),n.indexLabelTextBlock.y=d,n.indexLabelTextBlock.x=b,n.indexLabelAngle=Math.atan2(n.indexLabelTextBlock.y-x.y,n.indexLabelTextBlock.x-x.x))}return m}function m(){var a=k.plotArea.ctx;a.fillStyle="grey";a.strokeStyle="grey";a.font="16px Arial";a.textBaseline="middle";for(var b=a=0,d=0,m=!0,b=0;10>b&&(1>b||0z){for(var E=u=0,H=0;Hu?l.indexLabelText="":l.indexLabelTextBlock.maxWidth=0.85*u,0.3*l.indexLabelTextBlock.maxWidthd&&(d=y)),y=y=0,0d&&(d=y)));var K=function(a, +b,c){for(var e=[],d=0;e.push(f[b]),b!==c;b=(b+1+s.length)%s.length);e.sort(function(a,b){return a.y-b.y});for(b=0;bz){n=t.indexLabelTextBlock.x;var k=t.indexLabelTextBlock.y-t.indexLabelTextBlock.height/ +2,w=t.indexLabelTextBlock.y+t.indexLabelTextBlock.height/2,p=h.indexLabelTextBlock.y-h.indexLabelTextBlock.height/2,u=h.indexLabelTextBlock.x+h.indexLabelTextBlock.width,r=h.indexLabelTextBlock.y+h.indexLabelTextBlock.height/2;n=t.indexLabelTextBlock.x+t.indexLabelTextBlock.widthu+q||k>r+q||wa&&(a=l),m!==a&&(b=m,d+=-z),0===l%Math.max(s.length/10,3)&&(g=!0)):g=!0;g&&(0=a.dataSeriesIndexes.length)){var h= +this.data[a.dataSeriesIndexes[0]],s=h.dataPoints,q=10,n=this.plotArea,f=h.dataPointEOs,p=2,r,v=1.3,t=20/180*Math.PI,C=6,x={x:(n.x2+n.x1)/2,y:(n.y2+n.y1)/2},z=0;a=!1;for(var y=0;ya&&(e=a,d=!0);var g=s[b].color?s[b].color:h._colorSet[b%h._colorSet.length];e>c&&ja(k.plotArea.ctx, +f[b].center,f[b].radius,g,h.type,c,e,h.fillOpacity,f[b].percentInnerRadius);if(d)break}l()},function(){k.disableToolTip=!1;k._animator.animate(0,k.animatedRender?500:0,function(a){b(a);l()})})}}};var ra=function(a,d,b,c){"undefined"===typeof b&&(b=1);0>=Math.round(d.y4-d.y1)||(a.save(),a.globalAlpha=b,a.beginPath(),a.moveTo(Math.round(d.x1),Math.round(d.y1)),a.lineTo(Math.round(d.x2),Math.round(d.y2)),a.lineTo(Math.round(d.x3),Math.round(d.y3)),a.lineTo(Math.round(d.x4),Math.round(d.y4)),"undefined"!== +d.x5&&(a.lineTo(Math.round(d.x5),Math.round(d.y5)),a.lineTo(Math.round(d.x6),Math.round(d.y6))),a.closePath(),a.fillStyle=c?c:d.color,a.fill(),a.globalAplha=1,a.restore())};p.prototype.renderFunnel=function(a){function d(){for(var a=0,b=[],c=0;ck?(k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=0==k?0:a/k,h+=a/k,m=!0):(n=(Math.abs(ba)*b-Math.sqrt(k))/2,k=b-2*n/Math.abs(ba),h+=n,h>d&&(h-=n, +k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=a/k,h+=a/k,m=!0),b=k)),e.push(n);return e}function c(){if(t&&C){for(var a,b,c,e,d,g,l,h,m,n,k,q,s,w,p=[],B=[],x={percent:null,total:null},v=null,y=0;yp[y]&&(p[y]=y!==fa?t.reversed?P[y].x3-P[y].x4:P[y].x2-P[y].x1:P[y].x2-P[y].x1,p[y]/=2));s=b.indexLabelMaxWidth?b.indexLabelMaxWidth:t.options.indexLabelMaxWidth?t.indexLabelMaxWidth:p[y];if(s>p[y]||0>s)s=p[y];B[y]="inside"===t.indexLabelPlacement?P[y].height:!1;x=z.getPercentAndTotal(t,b);if(t.indexLabelFormatter||b.indexLabelFormatter)v={chart:z.options,dataSeries:t,dataPoint:b,total:x.total,percent:x.percent};b=b.indexLabelFormatter?b.indexLabelFormatter(v):b.indexLabel? +z.replaceKeywordsWithValue(b.indexLabel,b,t,y):t.indexLabelFormatter?t.indexLabelFormatter(v):t.indexLabel?z.replaceKeywordsWithValue(t.indexLabel,b,t,y):b.label?b.label:"";0>=n&&(n=0);1E3>s&&1E3-sl?l:t.indexLabelMaxWidth:l,h=J.length-1;0<=h;h--){g=C[J[h].id];c=J[h];e=c.textBlock;b=(a=n(h)b.y&&(d=!0);c=g.indexLabelMaxWidth||l;if(c>l||0>c)c=l;f.push(c)}if(d)for(h=J.length-1;0<=h;h--)a=P[h],J[h].textBlock.maxWidth= +f[f.length-(h+1)],J[h].textBlock.measureText(),J[h].textBlock.x=L-l,c=J[h].textBlock.heightpa+D&&(J[h].textBlock.y=pa+D-J[h].height),J[h].textBlock.ywa+D&&(J[h].textBlock.y=wa+D-J[h].height))}function g(){var a,b,c,e;if("inside"!==t.indexLabelPlacement)for(var d=0;dDa?f(c).x2+1:(a.x2+a.x3)/2+1:(a.x2+a.x3)/2+1:"undefined"!==typeof a.x5?cpa+D&&(J[d].textBlock.y=pa+D-J[d].height),J[d].textBlock.ywa+D&&(J[d].textBlock.y=wa+D-J[d].height)));else for(d=0;d=c?(b=d!=fa?(a.x4+a.x3)/2-e/2:(a.x5+a.x4)/2-e/2,c=d!=fa?(a.y1+a.y3)/2-c/2:(a.y1+a.y4)/2-c/2,J[d].textBlock.x=b, +J[d].textBlock.y=c):J[d].isDirty=!0)}function m(){function a(b,c){var d;if(0>b||b>=J.length)return 0;var e,f=J[b].textBlock;if(0>c){c*=-1;e=q(b);d=l(e,b);if(d>=c)return f.y-=c,c;if(0==b)return 0=c)return f.y+=c,c;if(b==P.length-1)return 0e)&&(l=n(s),!(l>=J.length-1)&&J[s].textBlock.y+J[s].height+ga>J[l].textBlock.y&&(J[s].textBlock.y=J[s].textBlock.y+J[s].height-e>e-J[s].textBlock.y?e+1:e-J[s].height-1))}for(l=P.length-1;0e&&(e=0,J[e].isDirty))break;if(J[l].textBlock.y=f){f=0;h+=J[f].height;break}e=q(f); +if(0>e){f=0;h+=J[f].height;break}}if(f!=l){g=J[f].textBlock.y;a-=g;a=h-a;g=c(a,d,f);break}}}return g}function c(a,b,d){var e=[],f=0,g=0;for(a=Math.abs(a);d<=b;d++)e.push(P[d]);e.sort(function(a,b){return a.height-b.height});for(d=0;d+m.y.toFixed(6))&&(d=g.y+d+ga-m.y,e=a(w,-d),ea?t.reversed?wa-D:pa-D:J[a].textBlock.y+J[a].height+ga)}function k(a,b,c){var d,e,f,l=[],m=D,n=[];-1!==b&&(0<=W.indexOf(b)?(e=W.indexOf(b),W.splice(e,1)):(W.push(b),W=W.sort(function(a,b){return a-b})));if(0===W.length)l= +ia;else{e=D*(1!=W.length||0!=W[0]&&W[0]!=P.length-1?2:1)/h();for(var q=0;qn&&(n*=-1),c.y1+=b-n[d],c.y2+=b-n[d],c.y3+=b-n[d],c.y4+=b-n[d],c.y5&&(c.y5+=b-n[d],c.y6+=b-n[d]),n[d]=b}};a._animator.animate(0,c,function(c){var d=a.plotArea.ctx||a.ctx;ja=!0;d.clearRect(x.x1,x.y1,x.x2-x.x1,x.y2-x.y1);d.fillStyle=a.backgroundColor;d.fillRect(x.x1,x.y1,x.width,x.height);w.changeSection(c,b);var e={};e.dataSeries=t;e.dataPoint=t.reversed?t.dataPoints[C.length-1-b]:t.dataPoints[b];e.index=t.reversed?C.length-1-b:b;a.toolTip.highlightObjects([e]); +for(e=0;ea){b=P[c];break}return b?(a=b.y6?a>b.y6?b.x3+(b.x4-b.x3)/(b.y4-b.y3)*(a-b.y3):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2), +{x1:a,x2:a}):-1}function p(a){for(var b=0;b=a.dataSeriesIndexes.length)){for(var t=this.data[a.dataSeriesIndexes[0]],C=t.dataPoints,x=this.plotArea,D=0.025*x.width,y=0.01*x.width,A=0,F=x.height-2*D,E=Math.min(x.width-2*y,2.8*x.height),H=!1,I=0;IF?N=F:0>=N&&(N=0),G>a?G=a-0.5:0>=G&&(G=0)):"pyramid"===t.type&&(G=N=0,t.reversed=t.reversed?!1:!0);var y=I+a/2,$=I,V=I+a,pa=t.reversed?Z:O,K=y-G/2,ea=y+G/2,Da=t.reversed?O+N:Z- +N,wa=t.reversed?O:Z;a=[];var y=[],P=[],E=[],X=O,fa,ba=(Da-pa)/(K-$),ha=-ba,I="area"===(t.valueRepresents?t.valueRepresents:"height")?b():d();if(-1!==I){if(t.reversed)for(E.push(X),G=I.length-1;0a&&(A=a));for(G=0;G\n');c.document.close();setTimeout(function(){c.focus();c.print();setTimeout(function(){b._canvasJSContainer.removeChild(d)},1E3)},500)};p.prototype.getPercentAndTotal=function(a,d){var b=null,c=null, +e=null;if(0<=a.type.indexOf("stacked"))c=0,b=d.x.getTime?d.x.getTime():d.x,b in a.plotUnit.yTotals&&(c=a.plotUnit.yTotals[b],e=isNaN(d.y)?0:100*(d.y/c));else if("pie"===a.type||"doughnut"===a.type||"funnel"===a.type||"pyramid"===a.type){for(b=c=0;b=m||"undefined"=== +typeof m||0>=v||"undefined"===typeof v)){if("horizontal"===this.orientation){n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:v,maxHeight:this.itemWrap?m:this.lineHeight,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"});n.textBlock.measureText();null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"=== +n.chartType?2*0.1*this.lineHeight:0)));if(!q||q.width+Math.round(n.textBlock.width+r+l+(0===q.width?0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))>g)q={items:[],width:0},h.push(q),this.height+=f,f=0;f=Math.max(f,n.textBlock.height)}else n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:x,maxHeight:!0===this.itemWrap?m:1.5*this.fontSize,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily, +fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"}),n.textBlock.measureText(),null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))),this.height>0,0),this.dataPoints.length):0):(s=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,s=0>0,0),this.dataPoints.length):0));for(;;){g=0a?c.x/a:a/c.x: +Math.abs(c.x-a);qs-e&&s+e>=this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}return d||b.dataPoint.x!==a?d&&null!==b.dataPoint?b:null:b};F.prototype.getDataPointAtXY=function(a,d,b){if(!this.dataPoints||0===this.dataPoints.length||athis.chart.plotArea.x2||dthis.chart.plotArea.y2)return null;b=b||!1;var c=[],e=0,g=0,m=1,l=!1,k=Infinity, +h=0,s=0,q=0;if("none"!==this.chart.plotInfo.axisPlacement)if(q=(this.chart.axisX[0]?this.chart.axisX[0]:this.chart.axisX2[0]).getXValueAt({x:a,y:d}),this.axisX.logarithmic)var n=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),q=1>0,0),this.dataPoints.length):0;else n=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,q=0> +0,0),this.dataPoints.length):0;for(;;){g=0=n.x1&&(a<=n.x2&&d>=n.y1&&d<=n.y2)&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1- +a),Math.abs(n.x2-a),Math.abs(n.y1-d),Math.abs(n.y2-d))}),l=!0);break;case "line":case "stepLine":case "spline":case "area":case "stepArea":case "stackedArea":case "stackedArea100":case "splineArea":case "scatter":var u=na("markerSize",f,this)||4,r=b?20:u,p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0r&&(p=Math.atan2(d-u.y,a-u.x),0>p&&(p+=2*Math.PI),p=Number(((180*(p/Math.PI)%360+360)%360).toFixed(12)),u=Number(((180*(n.startAngle/Math.PI)%360+360)%360).toFixed(12)),r=Number(((180*(n.endAngle/Math.PI)%360+360)%360).toFixed(12)),0===r&&1=r&&0!==f.y&&(r+=360,pu&&pp.y1&&dp.y6?(g=p.x6+(p.x5-p.x6)/(p.y5-p.y6)*(d-p.y6),p=p.x3+(p.x4-p.x3)/(p.y4-p.y3)*(d-p.y3)):(g=p.x1+(p.x6-p.x1)/(p.y6-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)):(g=p.x1+(p.x4-p.x1)/(p.y4-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)),a>g&&a=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y4-n.borderThickness/2&&d<=n.y1+n.borderThickness/ +2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "candlestick":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y2-n.borderThickness/2&&d<=n.y3+n.borderThickness/2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a), +Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "ohlc":if(Math.abs(n.x2-a+n.x1-a)=n.y2&&d<=n.y3||a>=n.x1&&a<=(n.x2+n.x1)/2&&d>=n.y1-n.borderThickness/2&&d<=n.y1+n.borderThickness/2||a>=(n.x1+n.x2)/2&&a<=n.x2&&d>=n.y4-n.borderThickness/2&&d<=n.y4+n.borderThickness/2)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0}if(l||1E3q-e&&q+e>= +this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}a=null;for(d=0;dq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius, +horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle",borderThickness:0}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}f=n;for(b=this.intervalStartPosition;b<=e;b=parseFloat(1E-12>this.interval?this.logarithmic&&this.equidistantInterval?b*Math.pow(this.logarithmBase,this.interval):b+this.interval:(this.logarithmic&&this.equidistantInterval? +b*Math.pow(this.logarithmBase,this.interval):b+this.interval).toFixed(12))){for(;fq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix, +horizontalAlign:"left",backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}}else for(this.intervalStartPosition=this.getLabelStartPoint(new Date(this.viewportMinimum), +this.intervalType,this.interval),e=Ya(new Date(this.viewportMaximum),this.interval,this.intervalType),f=n,b=this.intervalStartPosition;bq[f].endValue;f++);p=a;a=f=q[f].startValue&&a<=q[f].endValue;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:new Date(p),label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:Ca(p,this.valueFormatString,this.chart._cultureInfo), +a=new ka(this.ctx,{x:0,y:0,maxWidth:g,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null, +breaksLabelType:void 0}))}if("bottom"===this._position||"top"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.width*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length-2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.width/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+ +"Duration"]*this.interval,g="undefined"===typeof this.options.labelMaxWidth?0.5*this.chart.width>>0:this.options.labelMaxWidth,this.chart.panEnabled||(m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize);else if("left"===this._position||"right"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.height*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length- +2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.height/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+"Duration"]*this.interval,this.chart.panEnabled||(g="undefined"===typeof this.options.labelMaxWidth?0.3*this.chart.width>>0:this.options.labelMaxWidth),m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize; +for(c=0;cthis.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360)),"bottom"===this._position||"top"===this._position)if(g=0.9*l>>0,n=0,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize= +this.labelFontSize;this.sessionVariables.labelMaxWidth=g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=this.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;bn&&(v=b,n=p.width)}b=0;for(b=this.intervalStartPosition< +this.viewportMinimum?1:0;b>0>2*g&&(this.sessionVariables.labelAngle=-25)):(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle):u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth= +g,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p)):(this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=this.labelWrap);else{if(u(this.options.labelWrap))if(!u(this.options.labelMaxWidth))this.options.labelMaxWidth>0,f=this.labelFontSize,nq&&(q=c-2*g,c>=2*g&&c<2.2*g?(this.sessionVariables.labelMaxWidth=g,u(this.options.labelFontSize)&&12=2.2*g&&c<2.8*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=f):c>=2.8*g&&c<3.2*g?(this.sessionVariables.labelMaxWidth=Math.max(g,n),this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12=3.2*g&&c<3.6*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=this.labelFontSize):c>3.6*g&&c<5*g?(u(this.options.labelFontSize)&&125*g&&(this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelFontSize=f,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=this.labelAngle));else if(v===b&&(0===v&&n+this._labels[v+1].textBlock.measureText().width-2*g>q||v===this._labels.length-1&&n+this._labels[v-1].textBlock.measureText().width-2*g>q||0q&&n+this._labels[v-1].textBlock.measureText().width- +2*g>q))q=0===v?n+this._labels[v+1].textBlock.measureText().width-2*g:n+this._labels[v-1].textBlock.measureText().width-2*g,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p;else if(0===q)for(this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,c=0;c>0>2*g&&(this.sessionVariables.labelAngle=-25))}else(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/ +Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=0!=this.labelAngle?(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)):g,this.sessionVariables.labelMaxHeight=m=this.labelWrap?(h-p*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)):1.5*this.labelFontSize,u(this.options.labelWrap))?u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap= +this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelMaxHeight=c<0.9*l?0.9*l:c,this.sessionVariables.labelWrap=this.labelWrap)):(this.options.labelWrap?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p): +(u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelWrap=this.labelWrap),this.sessionVariables.labelMaxHeight=m)}for(c=0;c>0:this.options.labelMaxWidth,m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize=this.labelFontSize;this.sessionVariables.labelMaxWidth= +g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b>0,l-2*m>n&&(n=l-2*m,l>=2*m&&l<2.4*m?(u(this.options.labelFontSize)&&12=2.4*m&&l<2.8*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelFontSize=this.labelFontSize,this.sessionVariables.labelWrap=!0):l>=2.8*m&&l<3.2*m?(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12< +this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>=3.2*m&&l<3.6*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelFontSize=this.labelFontSize):l>3.6*m&&l<10*m?(u(this.options.labelFontSize)&& +1210*m&&l<50*m&&(u(this.options.labelFontSize)&&12this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,u(this.options.labelMaxWidth)&& +(this.sessionVariables.labelAngle=this.labelAngle))):this.options.labelWrap?(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=g):(this.sessionVariables.labelMaxHeight=m,u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap)}for(c=0;c>0:1.5*this.labelFontSize;if("left"===this._position||"right"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.width>>0:1.5*this.labelFontSize;u(g.labelBackgroundColor)&&(g.labelBackgroundColor="#EEEEEE")}else m="bottom"===this._position||"top"===this._position?0.9*this.chart.width>>0:0.9*this.chart.height>> +0,z=u(g.options.labelWrap)||g.labelWrap?"bottom"===this._position||"top"===this._position?0.8*this.chart.width>>0:0.8*this.chart.height>>0:1.5*this.labelFontSize,u(g.labelBackgroundColor)&&(u(g.startValue)&&0!==g.startValue?g.labelBackgroundColor=r?"transparent":null:g.labelBackgroundColor="#EEEEEE");a=new ka(this.ctx,{x:0,y:0,backgroundColor:g.labelBackgroundColor,borderColor:g.labelBorderColor,borderThickness:g.labelBorderThickness,cornerRadius:g.labelCornerRadius,maxWidth:g.options.labelMaxWidth? +g.options.labelMaxWidth:m,maxHeight:z,angle:this.labelAngle,text:g.labelFormatter?g.labelFormatter({chart:this.chart,axis:this,stripLine:g}):g.label,horizontalAlign:"left",fontSize:"outside"===g.labelPlacement?g.options.labelFontSize?g.labelFontSize:this.labelFontSize:g.labelFontSize,fontFamily:"outside"===g.labelPlacement?g.options.labelFontFamily?g.labelFontFamily:this.labelFontFamily:g.labelFontFamily,fontWeight:"outside"===g.labelPlacement?g.options.labelFontWeight?g.labelFontWeight:this.labelFontWeight: +g.labelFontWeight,fontColor:g.labelFontColor||g.color,fontStyle:"outside"===g.labelPlacement?g.options.labelFontStyle?g.labelFontStyle:this.fontWeight:g.labelFontStyle,textBaseline:"middle"});this._stripLineLabels.push({position:g.value,textBlock:a,effectiveHeight:null,stripLine:g})}};z.prototype.createLabelsAndCalculateWidth=function(){var a=0,d=0;this._labels=[];this._stripLineLabels=[];var b=this.chart.isNavigator?0:5;if("left"===this._position||"right"===this._position){this.createLabels();for(d= +0;d=this.viewportMinimum&&this._stripLineLabels[d].stripLine.value<=this.viewportMaximum)&& +(c=this._stripLineLabels[d].textBlock,e=c.measureText(),g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle)),a=this.viewportMinimum&&this._stripLineLabels[b].stripLine.value<=this.viewportMaximum)&&(d=this._stripLineLabels[b].textBlock,e=d.measureText(),g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)),an[f].viewportMaximum);v++)r[v].endValue=n[f].viewPortMinimum&&(n[f].scaleBreaks.lastBreakIndex=v));for(var z=v=0,t=0,C=0,x=0,D=0,y=0,A,E,F=l=0,H,I,L,r=H=I=L=!1,f=0;fv;){var G=0,R=0,S=0,U=0,W=e=0,K=0,$=0,V=0,X=0,P=0,ba=0;if(b&& +0p.width- +q?p.width-q:g.x2-ba-$);if(a&&0p.width-q?p.width-q:g.x2-ba-$),a[f]._labels&&1k&&(l+=0a[f].labelAngle?A-zk&&(l=E+t/2-k-ba),A-za[f].labelAngle&&0p.width-q?p.width-q:g.x2-ba-$),d[f].lineCoordinates.width=Math.abs(k-m),d[f]._labels&&1v;){V=U=R=S=$=K=W=e=Q=O=G=X=0;if(a&&0p.width-10?p.width-10:g.x2-V-W),b[f].labelAutoFit&&!u(C)&&(0b[f].labelAngle?Math.max(m,C):0===b[f].labelAngle? +Math.max(m,C/2):m),0c[f].chart.width-10?c[f].chart.width-10:g.x2-V-W),c[f]&& +c[f].labelAutoFit&&!u(D)&&(0b[f].chart.height-10?b[f].chart.height-10:g.y2),b[f].lineCoordinates.y1=l-(q[f]+b[f].margin+ +X),b[f].lineCoordinates.y2=l-(q[f]+b[f].margin+X),b[f].bounds={x1:m,y1:l-(q[f]+X+b[f].margin),x2:k,y2:h-(X+b[f].margin),width:k-m,height:q[f]},b[f].title&&(b[f]._titleTextBlock.maxWidth=0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0===b[K].labelAngle?k-U:m);if(c&&0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0=== +b[K].labelAngle?k-V:m);if(c&&0d[g].spacing?0:Math.abs(d[g].spacing/b),this.logarithmic&&(d[g].size=Math.pow(this.logarithmBase,d[g].size))};z.prototype.calculateBreaksInPixels=function(){if(!(this.scaleBreaks&&0>=this.scaleBreaks._appliedBreaks.length)){var a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];a.length&&(this.scaleBreaks.firstBreakIndex=this.scaleBreaks.lastBreakIndex=null);for(var d=0;dthis.conversionParameters.maximum);d++)a[d].endValue< +this.conversionParameters.minimum||(u(this.scaleBreaks.firstBreakIndex)&&(this.scaleBreaks.firstBreakIndex=d),a[d].startValue>=this.conversionParameters.minimum&&(a[d].startPixel=this.convertValueToPixel(a[d].startValue),this.scaleBreaks.lastBreakIndex=d),a[d].endValue<=this.conversionParameters.maximum&&(a[d].endPixel=this.convertValueToPixel(a[d].endValue)))}};z.prototype.renderLabelsTicksAndTitle=function(){var a=this,d=!1,b=0,c=0,e=1,g=0;0!==this.labelAngle&&360!==this.labelAngle&&(e=1.2);if("undefined"=== +typeof this.options.interval){if("bottom"===this._position||"top"===this._position)if(this.logarithmic&&!this.equidistantInterval&&this.labelAutoFit){for(var b=[],e=0!==this.labelAngle&&360!==this.labelAngle?1:1.2,m,l=this.viewportMaximum,k=this.lineCoordinates.width/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||mthis.lineCoordinates.width*e&&this.labelAutoFit&&(d=!0)}if("left"===this._position||"right"===this._position)if(this.logarithmic&& +!this.equidistantInterval&&this.labelAutoFit){for(var b=[],p,l=this.viewportMaximum,k=this.lineCoordinates.height/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||pthis.lineCoordinates.height*e&&this.labelAutoFit&&(d=!0)}}this.logarithmic&&(!this.equidistantInterval&&this.labelAutoFit)&&this._labels.sort(function(a,b){return a.position-b.position});var h=0,q,n;if("bottom"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y+this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y-(this.tickLength+q.textBlock.fontSize/2):n.y+this.tickLength+q.textBlock.fontSize/2):(n.x="inside"===this.labelPlacement?0>this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x-(0>this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0>this.labelAngle?n.y-this.tickLength-5:n.y-this.tickLength-Math.abs(q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle)+5):n.y+this.tickLength+Math.abs(0>this.labelAngle?q.textBlock.width* +Math.sin(Math.PI/180*this.labelAngle)-5:5)),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save(); +a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y-a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y2-this._titleTextBlock.height-3,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("top"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y-this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y+this.labelFontSize/2+this.tickLength+5:n.y-(this.tickLength+q.textBlock.height-q.textBlock.fontSize/2)):(n.x="inside"===this.labelPlacement?0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&& +(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y+a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y1+1,this.titleMaxWidth= +this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("left"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<< +0,c),this.ctx.lineTo(n.x-this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle?(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5):(q.textBlock.y="inside"===this.labelPlacement?n.y:n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness; +a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x+a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x1+1,this._titleTextBlock.y=this.lineCoordinates.height/2+this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("right"=== +this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<<0,c),this.ctx.lineTo(n.x+this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle? +(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width-this.tickLength-5:n.x+this.tickLength+5):(q.textBlock.y="inside"===this.labelPlacement?n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0>this.labelAngle?n.y:n.y-(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.cos(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<< +0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x-a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x2-1,this._titleTextBlock.y=this.lineCoordinates.height/2-this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}g=0;if("inside"===this.labelPlacement)this.chart.addEventListener("dataAnimationIterationEnd", +function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)||(a.ctx.save(),a.ctx.beginPath(),q.textBlock.render(!0),a.ctx.restore())},this);else for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||q.textBlock.render(!0)};z.prototype.renderInterlacedColors=function(){var a=this.chart.plotArea.ctx,d,b,c=this.chart.plotArea, +e=0;d=!0;if(("bottom"===this._position||"top"===this._position)&&this.interlacedColor)for(a.fillStyle=this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(Math.min(b.x,d.x),c.y1,Math.abs(b.x-d.x),Math.abs(c.y1-c.y2)),d=!1):d=!0;else if(("left"===this._position||"right"===this._position)&&this.interlacedColor)for(a.fillStyle= +this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(c.x1,Math.min(b.y,d.y),Math.abs(c.x1-c.x2),Math.abs(d.y-b.y)),d=!1):d=!0;a.beginPath()};z.prototype.renderStripLinesOfThicknessType=function(a){if(this.stripLines&&0this.viewportMaximum||u(h.value)||isNaN(this.range))||l.push(h))}for(c=0;cthis.viewportMaximum||isNaN(this.range))){a=this.getPixelCoordinatesOnAxis(b.position);if("outside"===b.stripLine.labelPlacement)if(h&&(this.ctx.strokeStyle= +h.color,"pixel"===h._thicknessType&&(this.ctx.lineWidth=h.thickness)),"bottom"===this._position){var p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0;this.ctx.beginPath();this.ctx.moveTo(p,a.y<<0);this.ctx.lineTo(p,a.y+this.tickLength<<0);this.ctx.stroke();0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y+=this.tickLength+b.textBlock.fontSize/2):(a.x-=0>this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0,a.y+=this.tickLength+Math.abs(0>this.labelAngle?b.textBlock.width*Math.sin(Math.PI/ +180*this.labelAngle)-5:5))}else"top"===this._position?(p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,this.ctx.beginPath(),this.ctx.moveTo(p,a.y<<0),this.ctx.lineTo(p,a.y-this.tickLength<<0),this.ctx.stroke(),0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y-=this.tickLength+b.textBlock.height):(a.x+=(b.textBlock.height-this.tickLength-this.labelFontSize/2)*Math.sin(Math.PI/180*this.labelAngle)-(0this.labelAngle?a.y:a.y-(b.textBlock.height-b.textBlock.fontSize/ +2-5)*Math.cos(Math.PI/180*this.labelAngle),a.x=0this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/ +2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+=b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y1+b.textBlock.width+3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-b.textBlock.width-3:"center"=== +b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y1+3):"top"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+= +b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+b.textBlock.width+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y2-3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y2- +b.textBlock.width-3):"left"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-b.textBlock.height>this.chart.plotArea.y1?u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3:a.y-b.textBlock.heightthis.chart.plotArea.y1? +u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2-3:a.y-b.textBlock.heightthis.viewportMaximum|| +isNaN(this.range))||a[d].render(this.maskCtx);this.maskCtx.restore()}};z.prototype.renderCrosshair=function(a,d){this.crosshair.render(a,d)};z.prototype.renderGrid=function(){if(this.gridThickness&&0this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(),d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.x<<0)+0.5:d.x<<0,a.moveTo(d,b.y1<<0),a.lineTo(d,b.y2<<0),a.stroke());else if("left"===this._position||"right"===this._position)for(var c=0;cthis.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(), +d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.y<<0)+0.5:d.y<<0,a.moveTo(b.x1<<0,d),a.lineTo(b.x2<<0,d),a.stroke());a.restore()}};z.prototype.renderAxisLine=function(){var a=this.chart.ctx,d=r?this.chart._preRenderCtx:a,b=Math.ceil(this.tickThickness/(this.reversed?-2:2)),c=Math.ceil(this.tickThickness/(this.reversed?2:-2)),e,g;d.save();if("bottom"===this._position||"top"===this._position){if(this.lineThickness){this.reversed?(e=this.lineCoordinates.x2,g=this.lineCoordinates.x1): +(e=this.lineCoordinates.x1,g=this.lineCoordinates.x2);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor?this.lineColor:"black";d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));var m=1===this.lineThickness%2?(this.lineCoordinates.y1<<0)+0.5:this.lineCoordinates.y1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+c;else for(var l= +this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(e,m),d.lineTo(this.scaleBreaks._appliedBreaks[l].startPixel+b,m),e=this.scaleBreaks._appliedBreaks[l].endPixel+c;e&&(d.moveTo(e,m),d.lineTo(g,m));d.stroke()}}else if(("left"===this._position||"right"===this._position)&&this.lineThickness){this.reversed?(e=this.lineCoordinates.y1,g=this.lineCoordinates.y2):(e=this.lineCoordinates.y2,g=this.lineCoordinates.y1);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor; +d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));m=1===this.lineThickness%2?(this.lineCoordinates.x1<<0)+0.5:this.lineCoordinates.x1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+b;else for(l=this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(m,e),d.lineTo(m,this.scaleBreaks._appliedBreaks[l].startPixel+c), +e=this.scaleBreaks._appliedBreaks[l].endPixel+b;e&&(d.moveTo(m,e),d.lineTo(m,g));d.stroke()}r&&(a.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx&&this.chart._breaksCanvasCtx.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),d.clearRect(0,0,this.chart.width,this.chart.height));d.restore()};z.prototype.getPixelCoordinatesOnAxis=function(a){var d={};if("bottom"===this._position||"top"===this._position)d.x=this.convertValueToPixel(a), +d.y=this.lineCoordinates.y1;if("left"===this._position||"right"===this._position)d.y=this.convertValueToPixel(a),d.x=this.lineCoordinates.x2;return d};z.prototype.convertPixelToValue=function(a){if("undefined"===typeof a)return null;var d=0,b=0,c,d=!0,e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b="number"===typeof a?a:"left"===this._position||"right"===this._position?a.y:a.x;if(this.logarithmic){a=c=Math.pow(this.logarithmBase,(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit); +if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;be[b].startValue/this.conversionParameters.minimum){c/=e[b].startValue/this.conversionParameters.minimum;if(ce[b].startValue/e[b-1].endValue){c/=e[b].startValue/e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum){if(1e[b].startValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].startValue/this.conversionParameters.minimum*Math.pow(e[b].size,Math.log(e[b].startValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue))*c,c*=Math.pow(e[b].size,Math.log(this.conversionParameters.minimum/e[b].startValue)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size;d=!1}else break;else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size}else break; +d=a*this.viewportMinimum}else{a=c=(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit;if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b=e[b].size?0:c*(e[b].endValue- +e[b].startValue)/e[b].size;break}else a+=e[b].endValue-this.conversionParameters.minimum-e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue),c-=e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue);d=!1}else if(c>e[b].startValue-this.conversionParameters.minimum){c-=e[b].startValue-this.conversionParameters.minimum;if(ce[b].startValue-e[b-1].endValue){c-=e[b].startValue-e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum)if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue- +e[b].startValue)/e[b].size>e[b].startValue){a=0>=e[b].size?0:c*(e[b].endValue-e[b].startValue)/e[b].size;break}else a+=e[b].startValue-this.conversionParameters.minimum+e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),c+=e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),d=!1;else if(c-1*e[b].size){a+=(e[b].endValue- +e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size;d=!1}else break;else if(c-1*e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size}else break;d=this.conversionParameters.minimum+a}return d};z.prototype.convertValueToPixel=function(a){a=this.getApparentDifference(this.conversionParameters.minimum, +a,a);return this.logarithmic?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*Math.log(a/this.conversionParameters.minimum)/this.conversionParameters.lnLogarithmBase+0.5<<0:"axisX"===this.type?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5<<0:this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5};z.prototype.getApparentDifference=function(a, +d,b,c){var e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];if(this.logarithmic){b=u(b)?d/a:b;for(var g=0;ge[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*e[g].startValue*e[g].size:a>=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*a*Math.pow(e[g].size,Math.log(e[g].endValue/a)/Math.log(e[g].endValue/e[g].startValue)):a<=e[g].startValue&&d<=e[g].endValue?b=b/d*e[g].startValue*Math.pow(e[g].size,Math.log(d/e[g].startValue)/Math.log(e[g].endValue/ +e[g].startValue)):!c&&(a>e[g].startValue&&de[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+e[g].startValue+e[g].size:a>e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+a+e[g].size*(e[g].endValue-a)/(e[g].endValue-e[g].startValue):a<=e[g].startValue&&de[g].startValue&&da[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<= +a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*this.viewportMinimum,b=0a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<=a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+this.viewportMinimum, +b=0this.maxWidth?8:6);var a=Math.max(c,Math.floor(this.maxWidth/a)),e,g,m,c=0;!u(this.options.viewportMinimum)&&(!u(this.options.viewportMaximum)&&this.options.viewportMinimum>=this.options.viewportMaximum)&& +(this.viewportMinimum=this.viewportMaximum=null);if(u(this.options.viewportMinimum)&&!u(this.sessionVariables.newViewportMinimum)&&!isNaN(this.sessionVariables.newViewportMinimum))this.viewportMinimum=this.sessionVariables.newViewportMinimum;else if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(u(this.options.viewportMaximum)&&!u(this.sessionVariables.newViewportMaximum)&&!isNaN(this.sessionVariables.newViewportMaximum))this.viewportMaximum=this.sessionVariables.newViewportMaximum; +else if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(c=0;c=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue)&& +(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue)){this.scaleBreaks._appliedBreaks.splice(c,1);break}if("axisX"===this.type){if(this.dataSeries&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g, +null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0));c=this.getApparentDifference(isNaN(this.viewportMinimum)||null===this.viewportMinimum?e:this.viewportMinimum,isNaN(this.viewportMaximum)||null===this.viewportMaximum?g:this.viewportMaximum,null, +!0);if("axisX"===this.type&&b){this.intervalType||(c/1<=a?(this.interval=1,this.intervalType="millisecond"):c/2<=a?(this.interval=2,this.intervalType="millisecond"):c/5<=a?(this.interval=5,this.intervalType="millisecond"):c/10<=a?(this.interval=10,this.intervalType="millisecond"):c/20<=a?(this.interval=20,this.intervalType="millisecond"):c/50<=a?(this.interval=50,this.intervalType="millisecond"):c/100<=a?(this.interval=100,this.intervalType="millisecond"):c/200<=a?(this.interval=200,this.intervalType= +"millisecond"):c/250<=a?(this.interval=250,this.intervalType="millisecond"):c/300<=a?(this.interval=300,this.intervalType="millisecond"):c/400<=a?(this.interval=400,this.intervalType="millisecond"):c/500<=a?(this.interval=500,this.intervalType="millisecond"):c/(1*S.secondDuration)<=a?(this.interval=1,this.intervalType="second"):c/(2*S.secondDuration)<=a?(this.interval=2,this.intervalType="second"):c/(5*S.secondDuration)<=a?(this.interval=5,this.intervalType="second"):c/(10*S.secondDuration)<=a?(this.interval= +10,this.intervalType="second"):c/(15*S.secondDuration)<=a?(this.interval=15,this.intervalType="second"):c/(20*S.secondDuration)<=a?(this.interval=20,this.intervalType="second"):c/(30*S.secondDuration)<=a?(this.interval=30,this.intervalType="second"):c/(1*S.minuteDuration)<=a?(this.interval=1,this.intervalType="minute"):c/(2*S.minuteDuration)<=a?(this.interval=2,this.intervalType="minute"):c/(5*S.minuteDuration)<=a?(this.interval=5,this.intervalType="minute"):c/(10*S.minuteDuration)<=a?(this.interval= +10,this.intervalType="minute"):c/(15*S.minuteDuration)<=a?(this.interval=15,this.intervalType="minute"):c/(20*S.minuteDuration)<=a?(this.interval=20,this.intervalType="minute"):c/(30*S.minuteDuration)<=a?(this.interval=30,this.intervalType="minute"):c/(1*S.hourDuration)<=a?(this.interval=1,this.intervalType="hour"):c/(2*S.hourDuration)<=a?(this.interval=2,this.intervalType="hour"):c/(3*S.hourDuration)<=a?(this.interval=3,this.intervalType="hour"):c/(6*S.hourDuration)<=a?(this.interval=6,this.intervalType= +"hour"):c/(1*S.dayDuration)<=a?(this.interval=1,this.intervalType="day"):c/(2*S.dayDuration)<=a?(this.interval=2,this.intervalType="day"):c/(4*S.dayDuration)<=a?(this.interval=4,this.intervalType="day"):c/(1*S.weekDuration)<=a?(this.interval=1,this.intervalType="week"):c/(2*S.weekDuration)<=a?(this.interval=2,this.intervalType="week"):c/(3*S.weekDuration)<=a?(this.interval=3,this.intervalType="week"):c/(1*S.monthDuration)<=a?(this.interval=1,this.intervalType="month"):c/(2*S.monthDuration)<=a?(this.interval= +2,this.intervalType="month"):c/(3*S.monthDuration)<=a?(this.interval=3,this.intervalType="month"):c/(6*S.monthDuration)<=a?(this.interval=6,this.intervalType="month"):(this.interval=c/(1*S.yearDuration)<=a?1:c/(2*S.yearDuration)<=a?2:c/(4*S.yearDuration)<=a?4:Math.floor(z.getNiceNumber(c/(a-1),!0)/S.yearDuration),this.intervalType="year"));if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=e-m/2;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum= +g+m/2;d?this.autoValueFormatString="MMM DD YYYY HH:mm":"year"===this.intervalType?this.autoValueFormatString="YYYY":"month"===this.intervalType?this.autoValueFormatString="MMM YYYY":"week"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"day"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"hour"===this.intervalType?this.autoValueFormatString="hh:mm TT":"minute"===this.intervalType?this.autoValueFormatString="hh:mm TT":"second"===this.intervalType?this.autoValueFormatString= +"hh:mm:ss TT":"millisecond"===this.intervalType&&(this.autoValueFormatString="fff'ms'");this.valueFormatString||(this.valueFormatString=this.autoValueFormatString)}else{this.intervalType="number";c=z.getNiceNumber(c,!1);this.interval=this.options&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g,null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)):(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0)),Math.abs(this.getApparentDifference(e,g,null,!0)),"axisX"===this.type&&b){this.valueType="dateTime";if(null===this.minimum||isNaN(this.minimum))this.minimum=e-m/2;if(null===this.maximum||isNaN(this.maximum))this.maximum=g+m/2}else this.intervalType=this.valueType="number",null===this.minimum&&(this.minimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval,this.minimum=Math.min(this.minimum, +null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?Infinity:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval,this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?-Infinity:this.sessionVariables.viewportMaximum)),0===this.maximum&&0===this.minimum&&(0===this.options.minimum?this.maximum+=10:0=== +this.options.maximum&&(this.minimum-=10));u(this.sessionVariables.newViewportMinimum)&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));u(this.sessionVariables.newViewportMaximum)&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.range=this.viewportMaximum-this.viewportMinimum;this.intervalStartPosition="axisX"===this.type&&b?this.getLabelStartPoint(new Date(this.viewportMinimum),this.intervalType,this.interval):Math.floor((this.viewportMinimum+0.2*this.interval)/ +this.interval)*this.interval;this.valueFormatString||(this.valueFormatString=z.generateValueFormatString(this.range,2))}};z.prototype.calculateLogarithmicAxisParameters=function(){var a=this.chart.layoutManager.getFreeSpace(),d=Math.log(this.logarithmBase),b;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?500>this.maxWidth?7:Math.max(7,Math.floor(this.maxWidth/100)):Math.max(Math.floor(this.maxWidth/ +50),3),c,e,g,m;m=1;if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(m=0;m=this.scaleBreaks._appliedBreaks[m].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[m].startValue|| +!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue)&&(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue)){this.scaleBreaks._appliedBreaks.splice(m,1);break}"axisX"===this.type? +(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,1===e/c&&(m=Math.pow(this.logarithmBase,"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin, +e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,0>=c&&!isFinite(e)?(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1):0>=c?c=e:isFinite(e)||(e=c),1===c&&1===e?(e*=this.logarithmBase-1/this.logarithmBase,c=1):1===e/c?(m=Math.min(e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),e*=m,c/=m):c>e?(m=Math.min(c/e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase, +0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&1e&&(e=1));m=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)/(isNaN(this.viewportMinimum)||null=== +this.viewportMinimum?c:this.viewportMinimum);var l=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)-(isNaN(this.viewportMinimum)||null===this.viewportMinimum?c:this.viewportMinimum);this.intervalType="number";m=Math.pow(this.logarithmBase,z.getNiceNumber(Math.abs(Math.log(m)/d),!1));this.options&&0this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(c)||isFinite(e)?1===c&&1===e?(e*=this.logarithmBase,c/=this.logarithmBase):1===e/c?(m=Math.pow(this.logarithmBase,this.interval),e*=m,c/=m):c>e?(m= +Math.min(0.01*(c/e),5),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)):(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.minimum||isNaN(this.minimum))&&1e&&(e=1)),this.intervalType="number",null===this.minimum&&(this.minimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval)),this.minimum=Math.min(this.minimum,null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?"undefined"===typeof this.sessionVariables.newViewportMinimum?Infinity:this.sessionVariables.newViewportMinimum:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum= +"axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval)),this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?"undefined"===typeof this.sessionVariables.newViewportMaximum?0:this.sessionVariables.newViewportMaximum:this.sessionVariables.viewportMaximum)),1===this.maximum&&1===this.minimum&&(1===this.options.minimum?this.maximum*=this.logarithmBase-1/this.logarithmBase: +1===this.options.maximum&&(this.minimum/=this.logarithmBase-1/this.logarithmBase));this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum);this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum);this.viewportMinimum>this.viewportMaximum&&(!this.options.viewportMinimum&&!this.options.minimum||this.options.viewportMaximum||this.options.maximum?this.options.viewportMinimum||this.options.minimum||!this.options.viewportMaximum&&!this.options.maximum||(this.viewportMinimum=this.minimum= +(this.options.viewportMaximum||this.options.maximum)/Math.pow(this.logarithmBase,2*Math.ceil(this.interval))):this.viewportMaximum=this.maximum=this.options.viewportMinimum||this.options.minimum);c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval);this.range=this.viewportMaximum/this.viewportMinimum;this.noTicks=a;if(!this.options.interval&&this.rangethis.viewportMaximum||3>a?2:3)){for(d=Math.floor(this.viewportMinimum/ +b+0.5)*b;dthis.interval&&(this.interval=b,c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval))),this.equidistantInterval=!0,this.intervalStartPosition=c;if(!this.valueFormatString&&(this.valueFormatString="#,##0.##",1>this.viewportMinimum)){d=Math.floor(Math.abs(Math.log(this.viewportMinimum)/ +Math.LN10))+2;if(isNaN(d)||!isFinite(d))d=2;if(2a&&(c+=Math.floor(Math.abs(Math.log(a)/Math.LN10)),isNaN(c)||!isFinite(c))&&(c=d);for(var e=0;eb?1>=c?1:5>=c?5:10:Math.max(Math.floor(c),1);return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.getNiceNumber= +function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=d?1.5>c?1:3>c?2:7>c?5:10:1>=c?1:2>=c?2:5>=c?5:10;return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.prototype.getLabelStartPoint=function(){var a=S[this.intervalType+"Duration"]*this.interval,a=new Date(Math.floor(this.viewportMinimum/a)*a);if("millisecond"!==this.intervalType)if("second"===this.intervalType)0=a||"bottom"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(c,l),this.ctx.lineTo(m,l),this.ctx.lineTo(m,e);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(l-h)/a/3;for(var n=0;n=a||"right"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(m,e),this.ctx.lineTo(m,l), +this.ctx.lineTo(c,l);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(m-k)/a/3;for(n=0;nthis.parent.range?2:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range? +1:0):50this.parent.range?2:10>this.parent.range?1:0);this.valueFormatString=z.generateValueFormatString(this.parent.range,h)}var l=null===this.opacity?1:this.opacity,h=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness),p=this.chart.overlaidCanvasCtx,q=p.globalAlpha;p.globalAlpha=l;p.beginPath();p.strokeStyle=this.color;p.lineWidth=h;p.save();this.labelFontSize= +u(this.options.labelFontSize)?this.parent.labelFontSize:this.labelFontSize;if("left"===this.parent._position||"right"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?this.parent.bounds.x2-this.parent.bounds.x1:this.labelMaxWidth,this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?3*this.chart.height:2*this.labelFontSize;else if("top"===this.parent._position||"bottom"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?3*this.chart.width:this.labelMaxWidth, +this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?this.parent.bounds.height:2*this.labelFontSize;0this.chart.bounds.x2?l.x=this.chart.bounds.x2-l.width:l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}}else if("bottom"===this.parent._position||"top"===this.parent._position){n=this.parent.convertPixelToValue({x:a});for(r=0;rthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"=== +this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}m=null;("bottom"===this.parent._position||"top"===this.parent._position)&&(b>=this.parent.convertValueToPixel(this.parent.viewportMinimum)&&c<=this.parent.convertValueToPixel(this.parent.viewportMaximum))&&(0=this.parent.convertValueToPixel(this.parent.viewportMaximum)&& +e<=this.parent.convertValueToPixel(this.parent.viewportMinimum))&&(0this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x1-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}else{if("bottom"===this.parent._position||"top"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)? +ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label,l.x=b-l.measureText().width/2,l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width),l.xthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2),"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2);0(new Date).getTime()-this._lastUpdated||(this._lastUpdated=(new Date).getTime(), +this.chart.resetOverlayedCanvas(),this._updateToolTip(a,d))};$.prototype._updateToolTip=function(a,d,b){b="undefined"===typeof b?!0:b;this.container||this._initialize();this.enabled||this.hide();if(!this.chart.disableToolTip){if("undefined"===typeof a||"undefined"===typeof d){if(isNaN(this._prevX)||isNaN(this._prevY))return;a=this._prevX;d=this._prevY}else this._prevX=a,this._prevY=d;var c=null,e=null,g=[],k=0;if(this.shared&&this.enabled&&"none"!==this.chart.plotInfo.axisPlacement){if("xySwapped"=== +this.chart.plotInfo.axisPlacement){var l=[];if(this.chart.axisX)for(var p=0;ph.dataSeries.axisY.viewportMaximum&&b++;b-h.dataPoint.y.length&&g.push(h)}else"column"===e.type||"bar"===e.type?0>h.dataPoint.y?0>h.dataSeries.axisY.viewportMinimum&&h.dataSeries.axisY.viewportMaximum>=h.dataPoint.y&&g.push(h):h.dataSeries.axisY.viewportMinimum<=h.dataPoint.y&&0<=h.dataSeries.axisY.viewportMaximum&&g.push(h):"bubble"===e.type?(b=this.chart._eventManager.objectMap[e.dataPointIds[h.index]].size/2,h.dataPoint.y>= +h.dataSeries.axisY.viewportMinimum-b&&h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum+b&&g.push(h)):"waterfall"===e.type?(b=0,h.cumulativeSumYStartValueh.dataSeries.axisY.viewportMaximum&&b++,h.cumulativeSumh.dataSeries.axisY.viewportMaximum&&b++,2>b&&-2=h.dataSeries.axisY.viewportMinimum&& +h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum)&&g.push(h);else g.push(h)}}if(0a&&(a+=this.container.clientWidth+20);a+this.container.clientWidth> +Math.max(this.chart.container.clientWidth,this.chart.width)&&(a=Math.max(0,Math.max(this.chart.container.clientWidth,this.chart.width)-this.container.clientWidth));d=1!==g.length||this.shared||"line"!==g[0].dataSeries.type&&"stepLine"!==g[0].dataSeries.type&&"spline"!==g[0].dataSeries.type&&"area"!==g[0].dataSeries.type&&"stepArea"!==g[0].dataSeries.type&&"splineArea"!==g[0].dataSeries.type?"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"=== +g[0].dataSeries.type?g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x):d:g[0].dataSeries.axisY.convertValueToPixel(g[0].dataPoint.y);d=-d+10;0":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content? +this.content:"{name}:  {y}",p=b.axisXIndex):"bubble"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y},   {z}"): +"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y[0]}, {y[1]}"):"candlestick"=== +b.type||"ohlc"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Open:   {y[0]}
High:    {y[1]}
Low:   {y[2]}
Close:   {y[3]}"):"boxAndWhisker"=== +b.type&&(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"), +null===d&&(d=""),!0===this.reversed?(d=this.chart.replaceKeywordsWithValue(g,c,b,e)+d,l"+d)):(d+=this.chart.replaceKeywordsWithValue(g,c,b,e),l")));null!==d&&(d=h+d)}else{b=a[0].dataSeries;c=a[0].dataPoint;e=a[0].index;if(null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent)return null;"line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"===b.type||"splineArea"===b.type||"column"=== +b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y}":"bubble"===b.type?g=c.toolTipContent? +c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y},   {z}":"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.name?"{name}:  ":c.label?"{label}:  ":"")+"{y}":"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+" :  {y[0]},  {y[1]}": +"candlestick"===b.type||"ohlc"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Open:   {y[0]}
High:    {y[1]}
Low:     {y[2]}
Close:   {y[3]}":"boxAndWhisker"===b.type&&(g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent: +this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"); +null===d&&(d="");d+=this.chart.replaceKeywordsWithValue(g,c,b,e)}return d};$.prototype.enableAnimation=function(){if(!this.container.style.WebkitTransition){var a=this.getContainerTransition(this.containerTransitionDuration);this.container.style.WebkitTransition=a;this.container.style.MsTransition=a;this.container.style.transition=a;this.container.style.MozTransition=this.mozContainerTransition}};$.prototype.disableAnimation=function(){this.container.style.WebkitTransition&&(this.container.style.WebkitTransition= +"",this.container.style.MozTransition="",this.container.style.MsTransition="",this.container.style.transition="")};$.prototype.hide=function(a){this.container&&(this.container.style.display="none",this.currentSeriesIndex=-1,this._prevY=this._prevX=NaN,("undefined"===typeof a||a)&&this.chart.resetOverlayedCanvas())};$.prototype.show=function(a,d,b){this._updateToolTip(a,d,"undefined"===typeof b?!1:b)};$.prototype.fixMozTransitionDelay=function(a,d){if(20c&&a.push(d),d.animationCallback(c),1<=c&&d.onComplete)d.onComplete();this.animations=a;0g;g++)for(var e=0;3>e;e++){for(var f=0,d=0;3>d;d++)f+=a[g][d]*b[d][e];c[g][e]=f}return c}function P(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX= +a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha;b.font=a.font;b.textAlign=a.textAlign;b.textBaseline=a.textBaseline;b.arcScaleX_=a.arcScaleX_;b.arcScaleY_=a.arcScaleY_;b.lineScale_=a.lineScale_}function Q(a){var b=a.indexOf("(",3),c=a.indexOf(")",b+1),b=a.substring(b+1,c).split(",");if(4!=b.length||"a"!=a.charAt(3))b[3]=1;return b}function E(a,b,c){return Math.min(c,Math.max(b,a))}function F(a,b,c){0>c&&c++;16*c?a+6*(b-a)*c: +1>2*c?b:2>3*c?a+6*(b-a)*(2/3-c):a}function G(a){if(a in H)return H[a];var b,c=1;a=String(a);if("#"==a.charAt(0))b=a;else if(/^rgb/.test(a)){c=Q(a);b="#";for(var g,e=0;3>e;e++)g=-1!=c[e].indexOf("%")?Math.floor(255*(parseFloat(c[e])/100)):+c[e],b+=v[E(g,0,255)];c=+c[3]}else if(/^hsl/.test(a)){e=c=Q(a);b=parseFloat(e[0])/360%360;0>b&&b++;g=E(parseFloat(e[1])/100,0,1);e=E(parseFloat(e[2])/100,0,1);if(0==g)g=e=b=e;else{var f=0.5>e?e*(1+g):e+g-e*g,d=2*e-f;g=F(d,f,b+1/3);e=F(d,f,b);b=F(d,f,b-1/3)}b="#"+ +v[Math.floor(255*g)]+v[Math.floor(255*e)]+v[Math.floor(255*b)];c=c[3]}else b=Z[a]||a;return H[a]={color:b,alpha:c}}function C(a){this.m_=D();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=1*q;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=a;var b="width:"+a.clientWidth+"px;height:"+a.clientHeight+"px;overflow:hidden;position:absolute", +c=a.ownerDocument.createElement("div");c.style.cssText=b;a.appendChild(c);b=c.cloneNode(!1);b.style.backgroundColor="red";b.style.filter="alpha(opacity=0)";a.appendChild(b);this.element_=c;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}function R(a,b,c,g){a.currentPath_.push({type:"bezierCurveTo",cp1x:b.x,cp1y:b.y,cp2x:c.x,cp2y:c.y,x:g.x,y:g.y});a.currentX_=g.x;a.currentY_=g.y}function S(a,b){var c=G(a.strokeStyle),g=c.color,c=c.alpha*a.globalAlpha,e=a.lineScale_*a.lineWidth;1>e&&(c*=e);b.push("')}function T(a,b,c,g){var e=a.fillStyle,f=a.arcScaleX_,d=a.arcScaleY_,k=g.x-c.x,n=g.y-c.y;if(e instanceof w){var h=0,l=g=0,u=0,m=1;if("gradient"==e.type_){h=e.x1_/f;c=e.y1_/d;var p=s(a,e.x0_/f,e.y0_/d),h=s(a,h,c),h=180*Math.atan2(h.x-p.x,h.y-p.y)/Math.PI;0>h&&(h+=360);1E-6>h&&(h=0)}else p=s(a,e.x0_,e.y0_),g=(p.x-c.x)/k,l=(p.y-c.y)/n,k/=f*q, +n/=d*q,m=x.max(k,n),u=2*e.r0_/m,m=2*e.r1_/m-u;f=e.colors_;f.sort(function(a,b){return a.offset-b.offset});d=f.length;p=f[0].color;c=f[d-1].color;k=f[0].alpha*a.globalAlpha;a=f[d-1].alpha*a.globalAlpha;for(var n=[],r=0;r')}else e instanceof +I?k&&n&&b.push("'):(e=G(a.fillStyle),b.push(''))}function s(a,b,c){a=a.m_;return{x:q*(b*a[0][0]+c*a[1][0]+a[2][0])-r,y:q*(b*a[0][1]+c*a[1][1]+a[2][1])-r}}function z(a,b,c){isFinite(b[0][0])&&(isFinite(b[0][1])&&isFinite(b[1][0])&&isFinite(b[1][1])&&isFinite(b[2][0])&&isFinite(b[2][1]))&&(a.m_=b,c&&(a.lineScale_=aa(ba(b[0][0]*b[1][1]-b[0][1]* +b[1][0]))))}function w(a){this.type_=a;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}function I(a,b){if(!a||1!=a.nodeType||"IMG"!=a.tagName)throw new A("TYPE_MISMATCH_ERR");if("complete"!=a.readyState)throw new A("INVALID_STATE_ERR");switch(b){case "repeat":case null:case "":this.repetition_="repeat";break;case "repeat-x":case "repeat-y":case "no-repeat":this.repetition_=b;break;default:throw new A("SYNTAX_ERR");}this.src_=a.src;this.width_=a.width;this.height_=a.height} +function A(a){this.code=this[a];this.message=a+": DOM Exception "+this.code}var x=Math,k=x.round,J=x.sin,K=x.cos,ba=x.abs,aa=x.sqrt,q=10,r=q/2;navigator.userAgent.match(/MSIE ([\d.]+)?/);var M=Array.prototype.slice;O(document);var U={init:function(a){a=a||document;a.createElement("canvas");a.attachEvent("onreadystatechange",W(this.init_,this,a))},init_:function(a){a=a.getElementsByTagName("canvas");for(var b=0;bd;d++)for(var B=0;16>B;B++)v[16*d+B]=d.toString(16)+B.toString(16);var Z={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC", +bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000", +darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082", +ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA", +mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5", +peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"}, +H={},L={},$={butt:"flat",round:"round"},d=C.prototype;d.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null);this.element_.innerHTML=""};d.beginPath=function(){this.currentPath_=[]};d.moveTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.lineTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.bezierCurveTo= +function(a,b,c,g,e,f){e=s(this,e,f);a=s(this,a,b);c=s(this,c,g);R(this,a,c,e)};d.quadraticCurveTo=function(a,b,c,g){a=s(this,a,b);c=s(this,c,g);g={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)};R(this,g,{x:g.x+(c.x-this.currentX_)/3,y:g.y+(c.y-this.currentY_)/3},c)};d.arc=function(a,b,c,g,e,f){c*=q;var d=f?"at":"wa",k=a+K(g)*c-r,n=b+J(g)*c-r;g=a+K(e)*c-r;e=b+J(e)*c-r;k!=g||f||(k+=0.125);a=s(this,a,b);k=s(this,k,n);g=s(this,g,e);this.currentPath_.push({type:d, +x:a.x,y:a.y,radius:c,xStart:k.x,yStart:k.y,xEnd:g.x,yEnd:g.y})};d.rect=function(a,b,c,g){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath()};d.strokeRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath();this.stroke();this.currentPath_=e};d.fillRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+ +c,b+g);this.lineTo(a,b+g);this.closePath();this.fill();this.currentPath_=e};d.createLinearGradient=function(a,b,c,g){var e=new w("gradient");e.x0_=a;e.y0_=b;e.x1_=c;e.y1_=g;return e};d.createRadialGradient=function(a,b,c,g,e,f){var d=new w("gradientradial");d.x0_=a;d.y0_=b;d.r0_=c;d.x1_=g;d.y1_=e;d.r1_=f;return d};d.drawImage=function(a,b){var c,g,e,d,r,y,n,h;e=a.runtimeStyle.width;d=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var l=a.width,u=a.height;a.runtimeStyle.width= +e;a.runtimeStyle.height=d;if(3==arguments.length)c=arguments[1],g=arguments[2],r=y=0,n=e=l,h=d=u;else if(5==arguments.length)c=arguments[1],g=arguments[2],e=arguments[3],d=arguments[4],r=y=0,n=l,h=u;else if(9==arguments.length)r=arguments[1],y=arguments[2],n=arguments[3],h=arguments[4],c=arguments[5],g=arguments[6],e=arguments[7],d=arguments[8];else throw Error("Invalid number of arguments");var m=s(this,c,g),p=[];p.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))};d.stroke=function(a){var b=[];b.push("d.x)d.x=f.x;if(null==c.y||f.yd.y)d.y=f.y}}b.push(' ">');a?T(this,b,c,d):S(this,b);b.push("");this.element_.insertAdjacentHTML("beforeEnd",b.join(""))};d.fill=function(){this.stroke(!0)};d.closePath=function(){this.currentPath_.push({type:"close"})};d.save=function(){var a= +{};P(this,a);this.aStack_.push(a);this.mStack_.push(this.m_);this.m_=t(D(),this.m_)};d.restore=function(){this.aStack_.length&&(P(this.aStack_.pop(),this),this.m_=this.mStack_.pop())};d.translate=function(a,b){z(this,t([[1,0,0],[0,1,0],[a,b,1]],this.m_),!1)};d.rotate=function(a){var b=K(a);a=J(a);z(this,t([[b,a,0],[-a,b,0],[0,0,1]],this.m_),!1)};d.scale=function(a,b){this.arcScaleX_*=a;this.arcScaleY_*=b;z(this,t([[a,0,0],[0,b,0],[0,0,1]],this.m_),!0)};d.transform=function(a,b,c,d,e,f){z(this,t([[a, +b,0],[c,d,0],[e,f,1]],this.m_),!0)};d.setTransform=function(a,b,c,d,e,f){z(this,[[a,b,0],[c,d,0],[e,f,1]],!0)};d.drawText_=function(a,b,c,d,e){var f=this.m_;d=0;var r=1E3,t=0,n=[],h;h=this.font;if(L[h])h=L[h];else{var l=document.createElement("div").style;try{l.font=h}catch(u){}h=L[h]={style:l.fontStyle||"normal",variant:l.fontVariant||"normal",weight:l.fontWeight||"normal",size:l.fontSize||10,family:l.fontFamily||"sans-serif"}}var l=h,m=this.element_;h={};for(var p in l)h[p]=l[p];p=parseFloat(m.currentStyle.fontSize); +m=parseFloat(l.size);"number"==typeof l.size?h.size=l.size:-1!=l.size.indexOf("px")?h.size=m:-1!=l.size.indexOf("em")?h.size=p*m:-1!=l.size.indexOf("%")?h.size=p/100*m:-1!=l.size.indexOf("pt")?h.size=m/0.75:h.size=p;h.size*=0.981;p=h.style+" "+h.variant+" "+h.weight+" "+h.size+"px "+h.family;m=this.element_.currentStyle;l=this.textAlign.toLowerCase();switch(l){case "left":case "center":case "right":break;case "end":l="ltr"==m.direction?"right":"left";break;case "start":l="rtl"==m.direction?"right": +"left";break;default:l="left"}switch(this.textBaseline){case "hanging":case "top":t=h.size/1.75;break;case "middle":break;default:case null:case "alphabetic":case "ideographic":case "bottom":t=-h.size/2.25}switch(l){case "right":d=1E3;r=0.05;break;case "center":d=r=500}b=s(this,b+0,c+t);n.push('');e?S(this,n):T(this,n,{x:-d,y:0}, +{x:r,y:h.size});e=f[0][0].toFixed(3)+","+f[1][0].toFixed(3)+","+f[0][1].toFixed(3)+","+f[1][1].toFixed(3)+",0,0";b=k(b.x/q)+","+k(b.y/q);n.push('','','');this.element_.insertAdjacentHTML("beforeEnd",n.join(""))};d.fillText=function(a,b,c,d){this.drawText_(a,b,c,d,!1)};d.strokeText=function(a, +b,c,d){this.drawText_(a,b,c,d,!0)};d.measureText=function(a){this.textMeasureEl_||(this.element_.insertAdjacentHTML("beforeEnd",''),this.textMeasureEl_=this.element_.lastChild);var b=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(b.createTextNode(a));return{width:this.textMeasureEl_.offsetWidth}};d.clip=function(){}; +d.arcTo=function(){};d.createPattern=function(a,b){return new I(a,b)};w.prototype.addColorStop=function(a,b){b=G(b);this.colors_.push({offset:a,color:b.color,alpha:b.alpha})};d=A.prototype=Error();d.INDEX_SIZE_ERR=1;d.DOMSTRING_SIZE_ERR=2;d.HIERARCHY_REQUEST_ERR=3;d.WRONG_DOCUMENT_ERR=4;d.INVALID_CHARACTER_ERR=5;d.NO_DATA_ALLOWED_ERR=6;d.NO_MODIFICATION_ALLOWED_ERR=7;d.NOT_FOUND_ERR=8;d.NOT_SUPPORTED_ERR=9;d.INUSE_ATTRIBUTE_ERR=10;d.INVALID_STATE_ERR=11;d.SYNTAX_ERR=12;d.INVALID_MODIFICATION_ERR= +13;d.NAMESPACE_ERR=14;d.INVALID_ACCESS_ERR=15;d.VALIDATION_ERR=16;d.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=U;CanvasRenderingContext2D=C;CanvasGradient=w;CanvasPattern=I;DOMException=A}(); + +/* + CanvasJS jQuery Charting Plugin - https://canvasjs.com/ + Copyright 2017 fenopix + + --------------------- License Information -------------------- + CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. + https://canvasjs.com/license/ + +*/ +(function(b,c,d,e){b.fn.CanvasJSChart=function(a){if(a){var b=this.first();a=new CanvasJS.Chart(this[0],a);b.children(".canvasjs-chart-container").data("canvasjsChartRef",a);a.render();return this}return this.first().children(".canvasjs-chart-container").data("canvasjsChartRef")}})(jQuery,window,document); +/*eslint-enable*/ +/*jshint ignore:end*/ \ No newline at end of file diff --git a/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/license.txt b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/license.txt new file mode 100644 index 00000000..f9882a14 --- /dev/null +++ b/Project-2 Issue Number 243/Libraries/canvasjs-2.3.1/license.txt @@ -0,0 +1,9 @@ +* +* @preserve CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ +* Copyright 2018 fenopix +* +* --------------------- License Information -------------------- +* CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. +* https://canvasjs.com/license/ +* +* \ No newline at end of file diff --git a/SRIP/Quiz/quiz.css b/Project-2 Issue Number 243/Quiz/quiz.css similarity index 100% rename from SRIP/Quiz/quiz.css rename to Project-2 Issue Number 243/Quiz/quiz.css diff --git a/SRIP/Quiz/quiz.html b/Project-2 Issue Number 243/Quiz/quiz.html similarity index 100% rename from SRIP/Quiz/quiz.html rename to Project-2 Issue Number 243/Quiz/quiz.html diff --git a/SRIP/Quiz/quiz.js b/Project-2 Issue Number 243/Quiz/quiz.js similarity index 100% rename from SRIP/Quiz/quiz.js rename to Project-2 Issue Number 243/Quiz/quiz.js diff --git a/Project-2 Issue Number 243/README.txt b/Project-2 Issue Number 243/README.txt new file mode 100644 index 00000000..f9f07192 --- /dev/null +++ b/Project-2 Issue Number 243/README.txt @@ -0,0 +1,15 @@ +This is Readme file containing instruction for running the experiment: MLE: Learning the classifier from data + +TO RUN THE EXPERIMENT: +1. Download the SRIP folder +2. Go to Codes folder +3. Run the .html file + +HTML file will open in the browser and all functionalities will run from the HTML file. + + +TAKE A QUIZ OF THE EXPERIMENT: +1. Go to Quiz folder +2. Run quiz.html +3. Quiz will open in the browser +4. Give the quiz diff --git a/SRIP/SRIP Project 2 Documentation.pdf b/Project-2 Issue Number 243/SRIP Project 2 Documentation.pdf similarity index 100% rename from SRIP/SRIP Project 2 Documentation.pdf rename to Project-2 Issue Number 243/SRIP Project 2 Documentation.pdf diff --git a/SRIP/Test Cases for Project 2.pdf b/Project-2 Issue Number 243/Test Cases for Project 2.pdf similarity index 100% rename from SRIP/Test Cases for Project 2.pdf rename to Project-2 Issue Number 243/Test Cases for Project 2.pdf diff --git a/SRIP/Codes/exp4.css b/SRIP/Codes/exp4.css new file mode 100644 index 00000000..c61348f1 --- /dev/null +++ b/SRIP/Codes/exp4.css @@ -0,0 +1,71 @@ +*{ + +box-sizing: border-box; + +} + +body{ + +font-family: Arial; + +padding: 50px; + +} + +/* Create two columns that floats next to each other */ +/* Left column */ +.leftcolumn { + +float: left; + +width: 50%; + +} + +/* Right column */ +.rightcolumn { + +float: left; + +width: 50%; + +background-color: #f1f1f1; + +padding-left: 20px; + +} + +.card { + +background-color: #f1f1f1; + +padding: 20px; + +margin-top: 25px; + +} + +.row:after { + +content: ""; + +display: table; + +clear: both; + +} + +/* Responsive layout - when the screen is less than 800px wide, make the two columns stack on top of each other instead of next to each other */ +@media screen and (max-width: 800px) { + +.leftcolumn, .rightcolumn { + +width: 100%; + +padding: 0; + +} + +} + +} \ No newline at end of file diff --git a/SRIP/Codes/exp4.html b/SRIP/Codes/exp4.html new file mode 100644 index 00000000..cbbdd47c --- /dev/null +++ b/SRIP/Codes/exp4.html @@ -0,0 +1,58 @@ + + + + + MLE: Learning the Classifier from Data + + + + + + +
+
+
+
+ + +
+
+

Distribution Function

+

Select Distribution Function + +

+
+ +
+

Mark Points

+

Class 1

+

Mean:

+

Covariance:

+

+ +

Class 2

+

Mean:

+

Covariance:

+

+
+ +
+

Add Data

+ X Value: + Y Value: + + + +

+ + +

+
+ +
+ + + \ No newline at end of file diff --git a/SRIP/README.txt b/SRIP/README.txt index 7d7553c3..a4b10dfd 100644 --- a/SRIP/README.txt +++ b/SRIP/README.txt @@ -1,6 +1,6 @@ -This is Readme file containing instruction for running the experiment: MLE: Learning the classifier from data +This is Readme file containing instruction for running the experiment: Generation of Random Variables -TO RUN THE EXPERIMENT OF PERCEPTRON: +TO RUN THE EXPERIMENT: 1. Download the SRIP folder 2. Go to Codes folder 3. Run the .html file From 9bd6e1fd7685ec7dc9853b31ba525ff44436202f Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 19 Jun 2019 16:37:16 +0530 Subject: [PATCH 111/166] basic layout and working chart --- SRIP/Codes/exp4.css | 2 +- SRIP/Codes/exp4.html | 58 +++++++++++-------------- SRIP/Codes/exp4.js | 101 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+), 33 deletions(-) create mode 100644 SRIP/Codes/exp4.js diff --git a/SRIP/Codes/exp4.css b/SRIP/Codes/exp4.css index c61348f1..ce778a67 100644 --- a/SRIP/Codes/exp4.css +++ b/SRIP/Codes/exp4.css @@ -6,7 +6,7 @@ box-sizing: border-box; body{ -font-family: Arial; +font-family: SansSerif; padding: 50px; diff --git a/SRIP/Codes/exp4.html b/SRIP/Codes/exp4.html index cbbdd47c..e7eef948 100644 --- a/SRIP/Codes/exp4.html +++ b/SRIP/Codes/exp4.html @@ -1,10 +1,9 @@ - - MLE: Learning the Classifier from Data - - + Generation of Random Variables + + @@ -17,42 +16,37 @@
-

Distribution Function

-

Select Distribution Function - -

+

Load Custom Datasets

+

Class 1 + + +

-

Mark Points

-

Class 1

-

Mean:

-

Covariance:

-

- -

Class 2

-

Mean:

-

Covariance:

-

+

Mark Points

+ X Value: + Y Value: +
-

Add Data

- X Value: - Y Value: - - - +

Classification DDAG

+ +

- - -

-
- +

Current Classifier:

+

Current Class:

+

+ + \ No newline at end of file diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js new file mode 100644 index 00000000..f7286204 --- /dev/null +++ b/SRIP/Codes/exp4.js @@ -0,0 +1,101 @@ +window.onload = function() { + var loadDataset = 0; + var series11 = [{x: 0.3, y:0.2}, {x:0.4, y:0.3}]; + var series12 = [{x: -0.4, y:-0.3}, {x:-0.3, y:-0.2}]; + var series13 = [{x: 0.2, y:-0.4}, {x:0.3, y:-0.2}]; + var series14 = [{x: -0.4, y:0.6}, {x:-0.7, y:0.3}]; + /*var series21 = [{x: 0.4, y:0.6}, {x:0.7, y:0.3}]; + var series22 = []; + var series23 = []; + var series24 = []; + var series31 = []; + var series32 = []; + var series33 = []; + var series34 = []; + var series41 = []; + var series42 = []; + var series43 = []; + var series44 = [];*/ + var ans = []; + + var chart = new CanvasJS.Chart("chartContainer", { + title: {text: "Chart"}, + axisX:{ + title: "X-axis", + }, + axisY: { + title: "Y-axis", + }, + data: [{ + showInLegend: true, + legendText: "Class 1", + color: "red", + type: "scatter", + dataPoints: 0 + },{ + showInLegend: true, + legendText: "Class 2", + color: "blue", + type: "scatter", + dataPoints: 0 + },{ + showInLegend: true, + legendText: "Class 3", + color: "green", + type: "scatter", + dataPoints: 0 + },{ + showInLegend: true, + legendText: "Class 4", + color: "yellow", + type: "scatter", + dataPoints: 0 + },{ + showInLegend: true, + legendText: "Test", + color: "pink", + type: "scatter", + dataPoints: 0 + }] + }); + + + function datasetLoad(){ + loadDataset = document.getElementById("load-dataset").value; + if(loadDataset == 1){ + chart.options.data[0].dataPoints = series11; + chart.options.data[1].dataPoints = series12; + chart.options.data[2].dataPoints = series13; + chart.options.data[3].dataPoints = series14; + chart.render(); + } + } + + function addDataPointsAndRender() { + var xValue = Number(document.getElementById("xValue").value); + var yValue = Number(document.getElementById("yValue").value); + ans.push({ + x: xValue, + y: yValue + }); + chart.options.data[4].dataPoints = ans; + chart.render(); + } + + function startDDAG(){ + + } + + function nextDDAG(){ + + } + + var load = document.getElementById("load"); + load.addEventListener("click", datasetLoad); + var testPoints = document.getElementById("test-points"); + testPoints.addEventListener("click", addDataPointsAndRender); + var start = document.getElementById("start"); + start.addEventListener("click", startDDAG); + var next = document.getElementById("next"); + next.addEventListener("click", nextDDAG); +}; \ No newline at end of file From c7986e37d0c9a015ba2bc66f6d4997125dd71f62 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 19 Jun 2019 16:38:37 +0530 Subject: [PATCH 112/166] basic layout and chart created --- SRIP/Codes/exp4.html | 1 - 1 file changed, 1 deletion(-) diff --git a/SRIP/Codes/exp4.html b/SRIP/Codes/exp4.html index e7eef948..454ed5cc 100644 --- a/SRIP/Codes/exp4.html +++ b/SRIP/Codes/exp4.html @@ -45,7 +45,6 @@

Classification DDAG

Current Class:

- From 983464a59e089eb13e94afe56f49627ee23b663b Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 19 Jun 2019 16:46:55 +0530 Subject: [PATCH 113/166] basic layout and chart created --- SRIP/Codes/exp4.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index f7286204..ce669759 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -67,9 +67,9 @@ window.onload = function() { chart.options.data[1].dataPoints = series12; chart.options.data[2].dataPoints = series13; chart.options.data[3].dataPoints = series14; - chart.render(); - } - } + chart.render(); + } + } function addDataPointsAndRender() { var xValue = Number(document.getElementById("xValue").value); From cfae14ec9b136947edaefba559b3cc7e0e0ef470 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 20 Jun 2019 17:54:16 +0530 Subject: [PATCH 114/166] some functions added --- SRIP/Codes/exp4.html | 1 + SRIP/Codes/exp4.js | 53 ++++- SRIP/Codes/svm/.npmignore | 3 + SRIP/Codes/svm/README.md | 103 ++++++++++ SRIP/Codes/svm/lib/svm.js | 348 ++++++++++++++++++++++++++++++++ SRIP/Codes/svm/package.json | 50 +++++ SRIP/Libraries/svm/.npmignore | 3 + SRIP/Libraries/svm/README.md | 103 ++++++++++ SRIP/Libraries/svm/lib/svm.js | 348 ++++++++++++++++++++++++++++++++ SRIP/Libraries/svm/package.json | 50 +++++ 10 files changed, 1059 insertions(+), 3 deletions(-) create mode 100644 SRIP/Codes/svm/.npmignore create mode 100755 SRIP/Codes/svm/README.md create mode 100755 SRIP/Codes/svm/lib/svm.js create mode 100644 SRIP/Codes/svm/package.json create mode 100644 SRIP/Libraries/svm/.npmignore create mode 100755 SRIP/Libraries/svm/README.md create mode 100755 SRIP/Libraries/svm/lib/svm.js create mode 100644 SRIP/Libraries/svm/package.json diff --git a/SRIP/Codes/exp4.html b/SRIP/Codes/exp4.html index 454ed5cc..44820571 100644 --- a/SRIP/Codes/exp4.html +++ b/SRIP/Codes/exp4.html @@ -5,6 +5,7 @@ + diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index ce669759..88d15b2a 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -18,6 +18,9 @@ window.onload = function() { var series44 = [];*/ var ans = []; + var ddag_1; + var ddag_2; + var chart = new CanvasJS.Chart("chartContainer", { title: {text: "Chart"}, axisX:{ @@ -47,13 +50,13 @@ window.onload = function() { },{ showInLegend: true, legendText: "Class 4", - color: "yellow", + color: "gold", type: "scatter", dataPoints: 0 },{ showInLegend: true, legendText: "Test", - color: "pink", + color: "deeppink", type: "scatter", dataPoints: 0 }] @@ -83,11 +86,55 @@ window.onload = function() { } function startDDAG(){ - + ddag_1 = 1; + ddag_2 = 4; + document.getElementById("current-classifier").innerHTML = "Current Classifier: " + ddag_1 + " vs " + ddag_2; + var x = classify(ddag_1 - 1, ddag_2 - 1); + //console.log(x); + document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + (x > 0.0 ? ddag_2 : ddag_1); + if(x > 0.0){ + ddag_2 = ddag_2 - 1; + } + else{ + ddag_1 = ddag_1 + 1; + } + document.getElementById("next").disabled = false; } function nextDDAG(){ + document.getElementById("current-classifier").innerHTML = "Current Classifier: " + ddag_1 + " vs " + ddag_2; + var x = classify(ddag_1 - 1, ddag_2 - 1); + document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + (x > 0.0 ? ddag_2 : ddag_1); + if(x > 0.0){ + ddag_2 = ddag_2 - 1; + } + else{ + ddag_1 = ddag_1 + 1; + } + if(ddag_1 == ddag_2){ + document.getElementById("next").disabled = true; + document.getElementById("current-class").innerHTML = "Current Class: " + " Classified as " + ddag_1; + } + } + function classify(x1, x2){ + if(loadDataset == 1){ + if(x1==0&&x2==3){ + data = [[0.3,0.2], [0.4, 0.3], [-0.4, -0.3], [-0.3, -0.2]]; + labels = [1, 1, 2, 2]; + svm = new svmjs.SVM(); + svm.train(data, labels, {C: 1.0}); + testdata = [[-0.4, 0.6]]; + testlabels = svm.predict(testdata); + console.log(testlabels); + return testlabels; + } + } + /*data = [[0.3,0.2], [0.4, 0.3], [-0.4, -0.3], [-0.3, -0.2], [0.2, -0.4], [0.3, -0.2], [-0.4, 0.6], [-0.7, 0.3]]; + labels = [1, 1, 2, 2, 3, 3, 4, 4]; + svm = new svmjs.SVM(); + svm.train(data, labels, {C: 1.0}); // C is a parameter to SVM*/ + } var load = document.getElementById("load"); diff --git a/SRIP/Codes/svm/.npmignore b/SRIP/Codes/svm/.npmignore new file mode 100644 index 00000000..ba757415 --- /dev/null +++ b/SRIP/Codes/svm/.npmignore @@ -0,0 +1,3 @@ +demo +test +MIT-LICENSE diff --git a/SRIP/Codes/svm/README.md b/SRIP/Codes/svm/README.md new file mode 100755 index 00000000..45fe8f12 --- /dev/null +++ b/SRIP/Codes/svm/README.md @@ -0,0 +1,103 @@ +# svmjs +Andrej Karpathy +July 2012 + +svmjs is a lightweight implementation of the SMO algorithm to train a binary +Support Vector Machine. As this uses the dual formulation, it also supports +arbitrary kernels. Correctness test, together with MATLAB reference code +are in /test. + +## Online GUI demo + +Can be found here: http://cs.stanford.edu/~karpathy/svmjs/demo/ + +Corresponding code is inside /demo directory. + +## Usage + +The simplest use case: +```javascript +// include the library + + +``` +Here, `data` and `testdata` are a 2D, NxD array of floats, `labels` and `testlabels` +is an array of size N that contains 1 or -1. You can also query for the raw margins: +```javascript +margins = svm.margins(testdata); +margin = svm.marginOne(testadata[0]); +``` + +The library supports arbitrary kernels, but currently comes with linear and rbf kernel: +```javascript +svm.train(data, labels, { kernel: function(v1,v2){ /* return K(v1, v2) */} }); // arbitrary function +svm.train(data, labels, { kernel: 'linear' }); +svm.train(data, labels, { kernel: 'rbf', rbfsigma: 0.5 }); // sigma in the gaussian kernel = 0.5 +``` + +For training you can pass in several options. Here are the defaults: +```javascript +var options = {}; +/* For C, Higher = you trust your data more. Lower = more regularization. +Should be in range of around 1e-2 ... 1e5 at most. */ +options.C = 1.0; +options.tol = 1e-4; // do not touch this unless you're pro +options.alphatol = 1e-7; // used for pruning non-support vectors. do not touch unless you're pro +options.maxiter = 10000; // if you have a larger problem, you may need to increase this +options.kernel = svmjs.linearKernel; // discussed above +options.numpasses = 10; // increase this for higher precision of the result. (but slower) +svm.train(data, labels, options); +``` + +Rules of thumb: You almost always want to try the linear SVM first and see how that works. You want +to play around with different values of C from about 1e-2 to 1e5, as every dataset is different. `C=1` +is usually a fairly reasonable value. Roughly, C is the cost to the SVM when it mis-classifies one of your +training examples. If you increase it, the SVM will try very hard to fit all your data, which may be good +if you strongly trust your data. In practice, you usually don't want it too high though. If linear kernel +doesn't work very well, try the rbf kernel. You will have to try different values of both C and just as crucially the sigma for the gaussian kernel. + +The linear SVM should be much faster than SVM with any other kernel. If you want it even faster +but less accurate, you want to play around with options.tol (try increase a bit). You can also try to +decrease options.maxiter and especially options.numpasses (decrease a bit). +If you use non-linear svm, you can also speed up the svm at test by playing around with +options.alphatol (try increase a bit). + +If you use linear or rbf kernel (instead of some custom one) you can load and save the svm: +```javascript +var svm = new svmjs.SVM(); +var json = svm.toJSON(); +var svm2 = new svmjs.SVM(); +svm2.fromJSON(json); +``` + +## Using in node +To use this library in [node.js](http://nodejs.org/), install with `npm`: + +``` +npm install svm +``` + +And use like so: + +```javascript +var svm = require("svm"); +var SVM = new svm.SVM(); +SVM.train(data, labels); +``` + +## Implementation details +The SMO algorithm is very space efficient, so you need not worry about +running out of space no matter how large your problem is. However, you do need to +worry about runtime efficiency. In practice, there are many heuristics one can +use to select the pair of alphas (i,j) to optimize and this uses a rather naive +approach. If you have a large and complex problem, you will need to increase +maxiter a lot. (or don't use Javascript!) + +## License +MIT diff --git a/SRIP/Codes/svm/lib/svm.js b/SRIP/Codes/svm/lib/svm.js new file mode 100755 index 00000000..9b2255b7 --- /dev/null +++ b/SRIP/Codes/svm/lib/svm.js @@ -0,0 +1,348 @@ +// MIT License +// Andrej Karpathy + +var svmjs = (function(exports){ + + /* + This is a binary SVM and is trained using the SMO algorithm. + Reference: "The Simplified SMO Algorithm" (http://math.unt.edu/~hsp0009/smo.pdf) + + Simple usage example: + svm = svmjs.SVM(); + svm.train(data, labels); + testlabels = svm.predict(testdata); + */ + var SVM = function(options) { + } + + SVM.prototype = { + + // data is NxD array of floats. labels are 1 or -1. + train: function(data, labels, options) { + + // we need these in helper functions + this.data = data; + this.labels = labels; + + // parameters + options = options || {}; + var C = options.C || 1.0; // C value. Decrease for more regularization + var tol = options.tol || 1e-4; // numerical tolerance. Don't touch unless you're pro + var alphatol = options.alphatol || 1e-7; // non-support vectors for space and time efficiency are truncated. To guarantee correct result set this to 0 to do no truncating. If you want to increase efficiency, experiment with setting this little higher, up to maybe 1e-4 or so. + var maxiter = options.maxiter || 10000; // max number of iterations + var numpasses = options.numpasses || 10; // how many passes over data with no change before we halt? Increase for more precision. + + // instantiate kernel according to options. kernel can be given as string or as a custom function + var kernel = linearKernel; + this.kernelType = "linear"; + if("kernel" in options) { + if(typeof options.kernel === "string") { + // kernel was specified as a string. Handle these special cases appropriately + if(options.kernel === "linear") { + this.kernelType = "linear"; + kernel = linearKernel; + } + if(options.kernel === "rbf") { + var rbfSigma = options.rbfsigma || 0.5; + this.rbfSigma = rbfSigma; // back this up + this.kernelType = "rbf"; + kernel = makeRbfKernel(rbfSigma); + } + } else { + // assume kernel was specified as a function. Let's just use it + this.kernelType = "custom"; + kernel = options.kernel; + } + } + + // initializations + this.kernel = kernel; + this.N = data.length; var N = this.N; + this.D = data[0].length; var D = this.D; + this.alpha = zeros(N); + this.b = 0.0; + this.usew_ = false; // internal efficiency flag + + // run SMO algorithm + var iter = 0; + var passes = 0; + while(passes < numpasses && iter < maxiter) { + + var alphaChanged = 0; + for(var i=0;i tol && this.alpha[i] > 0) ){ + + // alpha_i needs updating! Pick a j to update it with + var j = i; + while(j === i) j= randi(0, this.N); + var Ej= this.marginOne(data[j]) - labels[j]; + + // calculate L and H bounds for j to ensure we're in [0 C]x[0 C] box + ai= this.alpha[i]; + aj= this.alpha[j]; + var L = 0; var H = C; + if(labels[i] === labels[j]) { + L = Math.max(0, ai+aj-C); + H = Math.min(C, ai+aj); + } else { + L = Math.max(0, aj-ai); + H = Math.min(C, C+aj-ai); + } + + if(Math.abs(L - H) < 1e-4) continue; + + var eta = 2*kernel(data[i],data[j]) - kernel(data[i],data[i]) - kernel(data[j],data[j]); + if(eta >= 0) continue; + + // compute new alpha_j and clip it inside [0 C]x[0 C] box + // then compute alpha_i based on it. + var newaj = aj - labels[j]*(Ei-Ej) / eta; + if(newaj>H) newaj = H; + if(newaj 0 && newai < C) this.b= b1; + if(newaj > 0 && newaj < C) this.b= b2; + + alphaChanged++; + + } // end alpha_i needed updating + } // end for i=1..N + + iter++; + //console.log("iter number %d, alphaChanged = %d", iter, alphaChanged); + if(alphaChanged == 0) passes++; + else passes= 0; + + } // end outer loop + + // if the user was using a linear kernel, lets also compute and store the + // weights. This will speed up evaluations during testing time + if(this.kernelType === "linear") { + + // compute weights and store them + this.w = new Array(this.D); + for(var j=0;j alphatol) { + newdata.push(this.data[i]); + newlabels.push(this.labels[i]); + newalpha.push(this.alpha[i]); + } + } + + // store data and labels + this.data = newdata; + this.labels = newlabels; + this.alpha = newalpha; + this.N = this.data.length; + //console.log("filtered training data from %d to %d support vectors.", data.length, this.data.length); + } + + var trainstats = {}; + trainstats.iters= iter; + return trainstats; + }, + + // inst is an array of length D. Returns margin of given example + // this is the core prediction function. All others are for convenience mostly + // and end up calling this one somehow. + marginOne: function(inst) { + + var f = this.b; + // if the linear kernel was used and w was computed and stored, + // (i.e. the svm has fully finished training) + // the internal class variable usew_ will be set to true. + if(this.usew_) { + + // we can speed this up a lot by using the computed weights + // we computed these during train(). This is significantly faster + // than the version below + for(var j=0;j 0 ? 1 : -1; + }, + + // data is an NxD array. Returns array of margins. + margins: function(data) { + + // go over support vectors and accumulate the prediction. + var N = data.length; + var margins = new Array(N); + for(var i=0;i 0 ? 1 : -1; + } + return margs; + }, + + // THIS FUNCTION IS NOW DEPRECATED. WORKS FINE BUT NO NEED TO USE ANYMORE. + // LEAVING IT HERE JUST FOR BACKWARDS COMPATIBILITY FOR A WHILE. + // if we trained a linear svm, it is possible to calculate just the weights and the offset + // prediction is then yhat = sign(X * w + b) + getWeights: function() { + + // DEPRECATED + var w= new Array(this.D); + for(var j=0;j + +``` +Here, `data` and `testdata` are a 2D, NxD array of floats, `labels` and `testlabels` +is an array of size N that contains 1 or -1. You can also query for the raw margins: +```javascript +margins = svm.margins(testdata); +margin = svm.marginOne(testadata[0]); +``` + +The library supports arbitrary kernels, but currently comes with linear and rbf kernel: +```javascript +svm.train(data, labels, { kernel: function(v1,v2){ /* return K(v1, v2) */} }); // arbitrary function +svm.train(data, labels, { kernel: 'linear' }); +svm.train(data, labels, { kernel: 'rbf', rbfsigma: 0.5 }); // sigma in the gaussian kernel = 0.5 +``` + +For training you can pass in several options. Here are the defaults: +```javascript +var options = {}; +/* For C, Higher = you trust your data more. Lower = more regularization. +Should be in range of around 1e-2 ... 1e5 at most. */ +options.C = 1.0; +options.tol = 1e-4; // do not touch this unless you're pro +options.alphatol = 1e-7; // used for pruning non-support vectors. do not touch unless you're pro +options.maxiter = 10000; // if you have a larger problem, you may need to increase this +options.kernel = svmjs.linearKernel; // discussed above +options.numpasses = 10; // increase this for higher precision of the result. (but slower) +svm.train(data, labels, options); +``` + +Rules of thumb: You almost always want to try the linear SVM first and see how that works. You want +to play around with different values of C from about 1e-2 to 1e5, as every dataset is different. `C=1` +is usually a fairly reasonable value. Roughly, C is the cost to the SVM when it mis-classifies one of your +training examples. If you increase it, the SVM will try very hard to fit all your data, which may be good +if you strongly trust your data. In practice, you usually don't want it too high though. If linear kernel +doesn't work very well, try the rbf kernel. You will have to try different values of both C and just as crucially the sigma for the gaussian kernel. + +The linear SVM should be much faster than SVM with any other kernel. If you want it even faster +but less accurate, you want to play around with options.tol (try increase a bit). You can also try to +decrease options.maxiter and especially options.numpasses (decrease a bit). +If you use non-linear svm, you can also speed up the svm at test by playing around with +options.alphatol (try increase a bit). + +If you use linear or rbf kernel (instead of some custom one) you can load and save the svm: +```javascript +var svm = new svmjs.SVM(); +var json = svm.toJSON(); +var svm2 = new svmjs.SVM(); +svm2.fromJSON(json); +``` + +## Using in node +To use this library in [node.js](http://nodejs.org/), install with `npm`: + +``` +npm install svm +``` + +And use like so: + +```javascript +var svm = require("svm"); +var SVM = new svm.SVM(); +SVM.train(data, labels); +``` + +## Implementation details +The SMO algorithm is very space efficient, so you need not worry about +running out of space no matter how large your problem is. However, you do need to +worry about runtime efficiency. In practice, there are many heuristics one can +use to select the pair of alphas (i,j) to optimize and this uses a rather naive +approach. If you have a large and complex problem, you will need to increase +maxiter a lot. (or don't use Javascript!) + +## License +MIT diff --git a/SRIP/Libraries/svm/lib/svm.js b/SRIP/Libraries/svm/lib/svm.js new file mode 100755 index 00000000..9b2255b7 --- /dev/null +++ b/SRIP/Libraries/svm/lib/svm.js @@ -0,0 +1,348 @@ +// MIT License +// Andrej Karpathy + +var svmjs = (function(exports){ + + /* + This is a binary SVM and is trained using the SMO algorithm. + Reference: "The Simplified SMO Algorithm" (http://math.unt.edu/~hsp0009/smo.pdf) + + Simple usage example: + svm = svmjs.SVM(); + svm.train(data, labels); + testlabels = svm.predict(testdata); + */ + var SVM = function(options) { + } + + SVM.prototype = { + + // data is NxD array of floats. labels are 1 or -1. + train: function(data, labels, options) { + + // we need these in helper functions + this.data = data; + this.labels = labels; + + // parameters + options = options || {}; + var C = options.C || 1.0; // C value. Decrease for more regularization + var tol = options.tol || 1e-4; // numerical tolerance. Don't touch unless you're pro + var alphatol = options.alphatol || 1e-7; // non-support vectors for space and time efficiency are truncated. To guarantee correct result set this to 0 to do no truncating. If you want to increase efficiency, experiment with setting this little higher, up to maybe 1e-4 or so. + var maxiter = options.maxiter || 10000; // max number of iterations + var numpasses = options.numpasses || 10; // how many passes over data with no change before we halt? Increase for more precision. + + // instantiate kernel according to options. kernel can be given as string or as a custom function + var kernel = linearKernel; + this.kernelType = "linear"; + if("kernel" in options) { + if(typeof options.kernel === "string") { + // kernel was specified as a string. Handle these special cases appropriately + if(options.kernel === "linear") { + this.kernelType = "linear"; + kernel = linearKernel; + } + if(options.kernel === "rbf") { + var rbfSigma = options.rbfsigma || 0.5; + this.rbfSigma = rbfSigma; // back this up + this.kernelType = "rbf"; + kernel = makeRbfKernel(rbfSigma); + } + } else { + // assume kernel was specified as a function. Let's just use it + this.kernelType = "custom"; + kernel = options.kernel; + } + } + + // initializations + this.kernel = kernel; + this.N = data.length; var N = this.N; + this.D = data[0].length; var D = this.D; + this.alpha = zeros(N); + this.b = 0.0; + this.usew_ = false; // internal efficiency flag + + // run SMO algorithm + var iter = 0; + var passes = 0; + while(passes < numpasses && iter < maxiter) { + + var alphaChanged = 0; + for(var i=0;i tol && this.alpha[i] > 0) ){ + + // alpha_i needs updating! Pick a j to update it with + var j = i; + while(j === i) j= randi(0, this.N); + var Ej= this.marginOne(data[j]) - labels[j]; + + // calculate L and H bounds for j to ensure we're in [0 C]x[0 C] box + ai= this.alpha[i]; + aj= this.alpha[j]; + var L = 0; var H = C; + if(labels[i] === labels[j]) { + L = Math.max(0, ai+aj-C); + H = Math.min(C, ai+aj); + } else { + L = Math.max(0, aj-ai); + H = Math.min(C, C+aj-ai); + } + + if(Math.abs(L - H) < 1e-4) continue; + + var eta = 2*kernel(data[i],data[j]) - kernel(data[i],data[i]) - kernel(data[j],data[j]); + if(eta >= 0) continue; + + // compute new alpha_j and clip it inside [0 C]x[0 C] box + // then compute alpha_i based on it. + var newaj = aj - labels[j]*(Ei-Ej) / eta; + if(newaj>H) newaj = H; + if(newaj 0 && newai < C) this.b= b1; + if(newaj > 0 && newaj < C) this.b= b2; + + alphaChanged++; + + } // end alpha_i needed updating + } // end for i=1..N + + iter++; + //console.log("iter number %d, alphaChanged = %d", iter, alphaChanged); + if(alphaChanged == 0) passes++; + else passes= 0; + + } // end outer loop + + // if the user was using a linear kernel, lets also compute and store the + // weights. This will speed up evaluations during testing time + if(this.kernelType === "linear") { + + // compute weights and store them + this.w = new Array(this.D); + for(var j=0;j alphatol) { + newdata.push(this.data[i]); + newlabels.push(this.labels[i]); + newalpha.push(this.alpha[i]); + } + } + + // store data and labels + this.data = newdata; + this.labels = newlabels; + this.alpha = newalpha; + this.N = this.data.length; + //console.log("filtered training data from %d to %d support vectors.", data.length, this.data.length); + } + + var trainstats = {}; + trainstats.iters= iter; + return trainstats; + }, + + // inst is an array of length D. Returns margin of given example + // this is the core prediction function. All others are for convenience mostly + // and end up calling this one somehow. + marginOne: function(inst) { + + var f = this.b; + // if the linear kernel was used and w was computed and stored, + // (i.e. the svm has fully finished training) + // the internal class variable usew_ will be set to true. + if(this.usew_) { + + // we can speed this up a lot by using the computed weights + // we computed these during train(). This is significantly faster + // than the version below + for(var j=0;j 0 ? 1 : -1; + }, + + // data is an NxD array. Returns array of margins. + margins: function(data) { + + // go over support vectors and accumulate the prediction. + var N = data.length; + var margins = new Array(N); + for(var i=0;i 0 ? 1 : -1; + } + return margs; + }, + + // THIS FUNCTION IS NOW DEPRECATED. WORKS FINE BUT NO NEED TO USE ANYMORE. + // LEAVING IT HERE JUST FOR BACKWARDS COMPATIBILITY FOR A WHILE. + // if we trained a linear svm, it is possible to calculate just the weights and the offset + // prediction is then yhat = sign(X * w + b) + getWeights: function() { + + // DEPRECATED + var w= new Array(this.D); + for(var j=0;j Date: Fri, 21 Jun 2019 18:31:41 +0530 Subject: [PATCH 115/166] node js used --- SRIP/Codes/exp4.html | 4 ++-- SRIP/Codes/exp4.js | 15 +++------------ SRIP/Codes/exp4node.js | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 SRIP/Codes/exp4node.js diff --git a/SRIP/Codes/exp4.html b/SRIP/Codes/exp4.html index 44820571..f6a2da07 100644 --- a/SRIP/Codes/exp4.html +++ b/SRIP/Codes/exp4.html @@ -2,10 +2,10 @@ Generation of Random Variables - + - + diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 88d15b2a..9618e91a 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -118,18 +118,9 @@ window.onload = function() { } function classify(x1, x2){ - if(loadDataset == 1){ - if(x1==0&&x2==3){ - data = [[0.3,0.2], [0.4, 0.3], [-0.4, -0.3], [-0.3, -0.2]]; - labels = [1, 1, 2, 2]; - svm = new svmjs.SVM(); - svm.train(data, labels, {C: 1.0}); - testdata = [[-0.4, 0.6]]; - testlabels = svm.predict(testdata); - console.log(testlabels); - return testlabels; - } - } + require('libsvm-js').then(SVM => { + const svm = new SVM(); // ... +}); /*data = [[0.3,0.2], [0.4, 0.3], [-0.4, -0.3], [-0.3, -0.2], [0.2, -0.4], [0.3, -0.2], [-0.4, 0.6], [-0.7, 0.3]]; labels = [1, 1, 2, 2, 3, 3, 4, 4]; svm = new svmjs.SVM(); diff --git a/SRIP/Codes/exp4node.js b/SRIP/Codes/exp4node.js new file mode 100644 index 00000000..11777b8f --- /dev/null +++ b/SRIP/Codes/exp4node.js @@ -0,0 +1,34 @@ +var http = require('http'); +var fs = require('fs'); + +var server = http.createServer(function(req, res){ + //console.log("Request was made: " + req.url); + res.writeHead(200, {"Content-Type": "text/html"}); + res.write(fs.readFileSync("exp4.html", "utf8")); + res.end(); +}) + +var url = require("url"); +var path = require("path"); + +var server = http.createServer(function(request, response) { + var pathname = url.parse(request.url).pathname; + var ext = path.extname(pathname); + if(ext){ + if(ext === ".css"){ + response.writeHead(200, {"Content-Type": "text/css"}); + } + else if(ext === ".js"){ + response.writeHead(200, {"Content-Type": "text/javascript"}); + } + response.write(fs.readFileSync(__dirname + pathname, "utf8")); + } + else{ + response.writeHead(200, {"Content-Type": "text/html"}); + response.write(fs.readFileSync("exp4.html", "utf8")); + } + response.end(); +}) + +server.listen(3000); +console.log("HIIIIIIIIIIIIIII"); From 11b717d25127c03201aeeea87fbd4b632a07f249 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Fri, 21 Jun 2019 18:37:27 +0530 Subject: [PATCH 116/166] node js used --- SRIP/Codes/exp4.js | 15 ++++++++++++--- SRIP/Codes/exp4node.js | 10 +++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 9618e91a..88d15b2a 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -118,9 +118,18 @@ window.onload = function() { } function classify(x1, x2){ - require('libsvm-js').then(SVM => { - const svm = new SVM(); // ... -}); + if(loadDataset == 1){ + if(x1==0&&x2==3){ + data = [[0.3,0.2], [0.4, 0.3], [-0.4, -0.3], [-0.3, -0.2]]; + labels = [1, 1, 2, 2]; + svm = new svmjs.SVM(); + svm.train(data, labels, {C: 1.0}); + testdata = [[-0.4, 0.6]]; + testlabels = svm.predict(testdata); + console.log(testlabels); + return testlabels; + } + } /*data = [[0.3,0.2], [0.4, 0.3], [-0.4, -0.3], [-0.3, -0.2], [0.2, -0.4], [0.3, -0.2], [-0.4, 0.6], [-0.7, 0.3]]; labels = [1, 1, 2, 2, 3, 3, 4, 4]; svm = new svmjs.SVM(); diff --git a/SRIP/Codes/exp4node.js b/SRIP/Codes/exp4node.js index 11777b8f..7d9a2853 100644 --- a/SRIP/Codes/exp4node.js +++ b/SRIP/Codes/exp4node.js @@ -1,5 +1,5 @@ -var http = require('http'); -var fs = require('fs'); +var http = require("http"); +var fs = require("fs"); var server = http.createServer(function(req, res){ //console.log("Request was made: " + req.url); @@ -11,7 +11,7 @@ var server = http.createServer(function(req, res){ var url = require("url"); var path = require("path"); -var server = http.createServer(function(request, response) { +server = http.createServer(function(request, response) { var pathname = url.parse(request.url).pathname; var ext = path.extname(pathname); if(ext){ @@ -28,7 +28,7 @@ var server = http.createServer(function(request, response) { response.write(fs.readFileSync("exp4.html", "utf8")); } response.end(); -}) +}); server.listen(3000); -console.log("HIIIIIIIIIIIIIII"); +//console.log("HIIIIIIIIIIIIIII"); From 242ab03d8c05a84a3310b2424bb1dac4562e2d6c Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 22 Jun 2019 12:38:00 +0530 Subject: [PATCH 117/166] documentation corrected --- .../SRIP Project 1 Documentation.pdf | Bin 235748 -> 235618 bytes .../SRIP Project 2 Documentation.pdf | Bin 435606 -> 434939 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Project-1 Issue Number 240/SRIP Project 1 Documentation.pdf b/Project-1 Issue Number 240/SRIP Project 1 Documentation.pdf index a67da9c1ecf22be06aa167e7534e6fb31a089e19..9d487ca384a58fc9861ab53544c1a67825727149 100644 GIT binary patch delta 4180 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 diff --git a/Project-2 Issue Number 243/SRIP Project 2 Documentation.pdf b/Project-2 Issue Number 243/SRIP Project 2 Documentation.pdf index a9ab12a7b04de897f74f33fc446e135b73688f06..9d4144813ebbc389cd023fa4e101b4675d814377 100644 GIT binary patch delta 10575 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 Date: Sat, 22 Jun 2019 12:40:44 +0530 Subject: [PATCH 118/166] documentation added --- SRIP/Codes/exp4.js | 16 ---------------- SRIP/Codes/exp4node.js | 10 +++++++--- SRIP/SRIP Project 3 Documentation.pdf | Bin 0 -> 37450 bytes 3 files changed, 7 insertions(+), 19 deletions(-) create mode 100644 SRIP/SRIP Project 3 Documentation.pdf diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 88d15b2a..0ed4b4be 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -118,22 +118,6 @@ window.onload = function() { } function classify(x1, x2){ - if(loadDataset == 1){ - if(x1==0&&x2==3){ - data = [[0.3,0.2], [0.4, 0.3], [-0.4, -0.3], [-0.3, -0.2]]; - labels = [1, 1, 2, 2]; - svm = new svmjs.SVM(); - svm.train(data, labels, {C: 1.0}); - testdata = [[-0.4, 0.6]]; - testlabels = svm.predict(testdata); - console.log(testlabels); - return testlabels; - } - } - /*data = [[0.3,0.2], [0.4, 0.3], [-0.4, -0.3], [-0.3, -0.2], [0.2, -0.4], [0.3, -0.2], [-0.4, 0.6], [-0.7, 0.3]]; - labels = [1, 1, 2, 2, 3, 3, 4, 4]; - svm = new svmjs.SVM(); - svm.train(data, labels, {C: 1.0}); // C is a parameter to SVM*/ } diff --git a/SRIP/Codes/exp4node.js b/SRIP/Codes/exp4node.js index 7d9a2853..a2e4883b 100644 --- a/SRIP/Codes/exp4node.js +++ b/SRIP/Codes/exp4node.js @@ -18,9 +18,9 @@ server = http.createServer(function(request, response) { if(ext === ".css"){ response.writeHead(200, {"Content-Type": "text/css"}); } - else if(ext === ".js"){ + /*else if(ext === ".js"){ response.writeHead(200, {"Content-Type": "text/javascript"}); - } + }*/ response.write(fs.readFileSync(__dirname + pathname, "utf8")); } else{ @@ -30,5 +30,9 @@ server = http.createServer(function(request, response) { response.end(); }); -server.listen(3000); + //console.log("HIIIIIIIIIIIIIII"); + + + +server.listen(3000); \ No newline at end of file diff --git a/SRIP/SRIP Project 3 Documentation.pdf b/SRIP/SRIP Project 3 Documentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b6966f31caccfbc7b75979596c11ec947c2c4244 GIT binary patch literal 37450 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 literal 0 HcmV?d00001 From 321e207facf9eeb2e216c26a9a1e6e055a7ae5af Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sun, 23 Jun 2019 17:10:34 +0530 Subject: [PATCH 119/166] classification done for 2 points --- SRIP/Codes/exp4.html | 2 +- SRIP/Codes/exp4.js | 135 ++++++++------ SRIP/Codes/exp4node.js | 3 - SRIP/Codes/svm/.npmignore | 3 - SRIP/Codes/svm/README.md | 103 ----------- SRIP/Codes/svm/lib/svm.js | 348 ------------------------------------ SRIP/Codes/svm/package.json | 50 ------ 7 files changed, 80 insertions(+), 564 deletions(-) delete mode 100644 SRIP/Codes/svm/.npmignore delete mode 100755 SRIP/Codes/svm/README.md delete mode 100755 SRIP/Codes/svm/lib/svm.js delete mode 100644 SRIP/Codes/svm/package.json diff --git a/SRIP/Codes/exp4.html b/SRIP/Codes/exp4.html index f6a2da07..aa13ab22 100644 --- a/SRIP/Codes/exp4.html +++ b/SRIP/Codes/exp4.html @@ -4,8 +4,8 @@ Generation of Random Variables + - diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 0ed4b4be..097af022 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -1,25 +1,19 @@ window.onload = function() { var loadDataset = 0; - var series11 = [{x: 0.3, y:0.2}, {x:0.4, y:0.3}]; - var series12 = [{x: -0.4, y:-0.3}, {x:-0.3, y:-0.2}]; - var series13 = [{x: 0.2, y:-0.4}, {x:0.3, y:-0.2}]; - var series14 = [{x: -0.4, y:0.6}, {x:-0.7, y:0.3}]; - /*var series21 = [{x: 0.4, y:0.6}, {x:0.7, y:0.3}]; - var series22 = []; - var series23 = []; - var series24 = []; - var series31 = []; - var series32 = []; - var series33 = []; - var series34 = []; + var series11 = [{x: 0.3, y: 0.2}, {x: 0.4, y: 0.3}]; + var series12 = [{x: -0.4, y: -0.3}, {x: -0.3, y: -0.2}]; + var series21 = [{x: 0.2, y: -0.4}, {x: 0.3, y: -0.2}]; + var series22 = [{x: -0.4, y: 0.6}, {x: -0.7, y: 0.3}]; + var series31 = [{x: 0.4, y: 0.6}, {x: 0.7, y: 0.3}]; + var series32 = [{x: 1.2, y: 2.1}, {x: 1.3, y: 2.3}]; var series41 = []; var series42 = []; - var series43 = []; - var series44 = [];*/ + var ans = []; var ddag_1; var ddag_2; + var result; var chart = new CanvasJS.Chart("chartContainer", { title: {text: "Chart"}, @@ -38,25 +32,13 @@ window.onload = function() { },{ showInLegend: true, legendText: "Class 2", - color: "blue", - type: "scatter", - dataPoints: 0 - },{ - showInLegend: true, - legendText: "Class 3", color: "green", type: "scatter", dataPoints: 0 - },{ - showInLegend: true, - legendText: "Class 4", - color: "gold", - type: "scatter", - dataPoints: 0 },{ showInLegend: true, legendText: "Test", - color: "deeppink", + color: "gold", type: "scatter", dataPoints: 0 }] @@ -68,10 +50,26 @@ window.onload = function() { if(loadDataset == 1){ chart.options.data[0].dataPoints = series11; chart.options.data[1].dataPoints = series12; - chart.options.data[2].dataPoints = series13; - chart.options.data[3].dataPoints = series14; chart.render(); } + + if(loadDataset == 2){ + chart.options.data[0].dataPoints = series21; + chart.options.data[1].dataPoints = series22; + chart.render(); + } + + if(loadDataset == 3){ + chart.options.data[0].dataPoints = series31; + chart.options.data[1].dataPoints = series32; + chart.render(); + } + + if(loadDataset == 4){ + chart.options.data[0].dataPoints = series41; + chart.options.data[1].dataPoints = series42; + chart.render(); + } } function addDataPointsAndRender() { @@ -81,44 +79,67 @@ window.onload = function() { x: xValue, y: yValue }); - chart.options.data[4].dataPoints = ans; + chart.options.data[2].dataPoints = ans; chart.render(); } function startDDAG(){ ddag_1 = 1; - ddag_2 = 4; + ddag_2 = 2; document.getElementById("current-classifier").innerHTML = "Current Classifier: " + ddag_1 + " vs " + ddag_2; - var x = classify(ddag_1 - 1, ddag_2 - 1); - //console.log(x); - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + (x > 0.0 ? ddag_2 : ddag_1); - if(x > 0.0){ - ddag_2 = ddag_2 - 1; - } - else{ - ddag_1 = ddag_1 + 1; - } - document.getElementById("next").disabled = false; + result = classify(); + if(result == 1) + document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; + else if(result == 2) + document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 1; + document.getElementById("next").disabled = false; } function nextDDAG(){ document.getElementById("current-classifier").innerHTML = "Current Classifier: " + ddag_1 + " vs " + ddag_2; - var x = classify(ddag_1 - 1, ddag_2 - 1); - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + (x > 0.0 ? ddag_2 : ddag_1); - if(x > 0.0){ - ddag_2 = ddag_2 - 1; - } - else{ - ddag_1 = ddag_1 + 1; - } - if(ddag_1 == ddag_2){ - document.getElementById("next").disabled = true; - document.getElementById("current-class").innerHTML = "Current Class: " + " Classified as " + ddag_1; - } + document.getElementById("next").disabled = true; + document.getElementById("current-class").innerHTML = "Current Class: " + " Classified as " + result; } - function classify(x1, x2){ - + function classify(){ + if(loadDataset == 1){ + var i = 0; + var j = 0; + var a1 = 0; + var b1 = 0; + var c1 = 0; + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a1 = series11[i].x - ans[j].x; + b1 = series11[i].y - ans[j].y; + c1 += Math.sqrt((a1 * a1) + (b1 * b1)); + } + } + var a2 = 0; + var b2 = 0; + var c2 = 0; + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a2 = series12[i].x - ans[j].x; + b2 = series12[i].y - ans[j].y; + c2 += Math.sqrt((a2 * a2) + (b2 * b2)); + } + } + if(c2 - -``` -Here, `data` and `testdata` are a 2D, NxD array of floats, `labels` and `testlabels` -is an array of size N that contains 1 or -1. You can also query for the raw margins: -```javascript -margins = svm.margins(testdata); -margin = svm.marginOne(testadata[0]); -``` - -The library supports arbitrary kernels, but currently comes with linear and rbf kernel: -```javascript -svm.train(data, labels, { kernel: function(v1,v2){ /* return K(v1, v2) */} }); // arbitrary function -svm.train(data, labels, { kernel: 'linear' }); -svm.train(data, labels, { kernel: 'rbf', rbfsigma: 0.5 }); // sigma in the gaussian kernel = 0.5 -``` - -For training you can pass in several options. Here are the defaults: -```javascript -var options = {}; -/* For C, Higher = you trust your data more. Lower = more regularization. -Should be in range of around 1e-2 ... 1e5 at most. */ -options.C = 1.0; -options.tol = 1e-4; // do not touch this unless you're pro -options.alphatol = 1e-7; // used for pruning non-support vectors. do not touch unless you're pro -options.maxiter = 10000; // if you have a larger problem, you may need to increase this -options.kernel = svmjs.linearKernel; // discussed above -options.numpasses = 10; // increase this for higher precision of the result. (but slower) -svm.train(data, labels, options); -``` - -Rules of thumb: You almost always want to try the linear SVM first and see how that works. You want -to play around with different values of C from about 1e-2 to 1e5, as every dataset is different. `C=1` -is usually a fairly reasonable value. Roughly, C is the cost to the SVM when it mis-classifies one of your -training examples. If you increase it, the SVM will try very hard to fit all your data, which may be good -if you strongly trust your data. In practice, you usually don't want it too high though. If linear kernel -doesn't work very well, try the rbf kernel. You will have to try different values of both C and just as crucially the sigma for the gaussian kernel. - -The linear SVM should be much faster than SVM with any other kernel. If you want it even faster -but less accurate, you want to play around with options.tol (try increase a bit). You can also try to -decrease options.maxiter and especially options.numpasses (decrease a bit). -If you use non-linear svm, you can also speed up the svm at test by playing around with -options.alphatol (try increase a bit). - -If you use linear or rbf kernel (instead of some custom one) you can load and save the svm: -```javascript -var svm = new svmjs.SVM(); -var json = svm.toJSON(); -var svm2 = new svmjs.SVM(); -svm2.fromJSON(json); -``` - -## Using in node -To use this library in [node.js](http://nodejs.org/), install with `npm`: - -``` -npm install svm -``` - -And use like so: - -```javascript -var svm = require("svm"); -var SVM = new svm.SVM(); -SVM.train(data, labels); -``` - -## Implementation details -The SMO algorithm is very space efficient, so you need not worry about -running out of space no matter how large your problem is. However, you do need to -worry about runtime efficiency. In practice, there are many heuristics one can -use to select the pair of alphas (i,j) to optimize and this uses a rather naive -approach. If you have a large and complex problem, you will need to increase -maxiter a lot. (or don't use Javascript!) - -## License -MIT diff --git a/SRIP/Codes/svm/lib/svm.js b/SRIP/Codes/svm/lib/svm.js deleted file mode 100755 index 9b2255b7..00000000 --- a/SRIP/Codes/svm/lib/svm.js +++ /dev/null @@ -1,348 +0,0 @@ -// MIT License -// Andrej Karpathy - -var svmjs = (function(exports){ - - /* - This is a binary SVM and is trained using the SMO algorithm. - Reference: "The Simplified SMO Algorithm" (http://math.unt.edu/~hsp0009/smo.pdf) - - Simple usage example: - svm = svmjs.SVM(); - svm.train(data, labels); - testlabels = svm.predict(testdata); - */ - var SVM = function(options) { - } - - SVM.prototype = { - - // data is NxD array of floats. labels are 1 or -1. - train: function(data, labels, options) { - - // we need these in helper functions - this.data = data; - this.labels = labels; - - // parameters - options = options || {}; - var C = options.C || 1.0; // C value. Decrease for more regularization - var tol = options.tol || 1e-4; // numerical tolerance. Don't touch unless you're pro - var alphatol = options.alphatol || 1e-7; // non-support vectors for space and time efficiency are truncated. To guarantee correct result set this to 0 to do no truncating. If you want to increase efficiency, experiment with setting this little higher, up to maybe 1e-4 or so. - var maxiter = options.maxiter || 10000; // max number of iterations - var numpasses = options.numpasses || 10; // how many passes over data with no change before we halt? Increase for more precision. - - // instantiate kernel according to options. kernel can be given as string or as a custom function - var kernel = linearKernel; - this.kernelType = "linear"; - if("kernel" in options) { - if(typeof options.kernel === "string") { - // kernel was specified as a string. Handle these special cases appropriately - if(options.kernel === "linear") { - this.kernelType = "linear"; - kernel = linearKernel; - } - if(options.kernel === "rbf") { - var rbfSigma = options.rbfsigma || 0.5; - this.rbfSigma = rbfSigma; // back this up - this.kernelType = "rbf"; - kernel = makeRbfKernel(rbfSigma); - } - } else { - // assume kernel was specified as a function. Let's just use it - this.kernelType = "custom"; - kernel = options.kernel; - } - } - - // initializations - this.kernel = kernel; - this.N = data.length; var N = this.N; - this.D = data[0].length; var D = this.D; - this.alpha = zeros(N); - this.b = 0.0; - this.usew_ = false; // internal efficiency flag - - // run SMO algorithm - var iter = 0; - var passes = 0; - while(passes < numpasses && iter < maxiter) { - - var alphaChanged = 0; - for(var i=0;i tol && this.alpha[i] > 0) ){ - - // alpha_i needs updating! Pick a j to update it with - var j = i; - while(j === i) j= randi(0, this.N); - var Ej= this.marginOne(data[j]) - labels[j]; - - // calculate L and H bounds for j to ensure we're in [0 C]x[0 C] box - ai= this.alpha[i]; - aj= this.alpha[j]; - var L = 0; var H = C; - if(labels[i] === labels[j]) { - L = Math.max(0, ai+aj-C); - H = Math.min(C, ai+aj); - } else { - L = Math.max(0, aj-ai); - H = Math.min(C, C+aj-ai); - } - - if(Math.abs(L - H) < 1e-4) continue; - - var eta = 2*kernel(data[i],data[j]) - kernel(data[i],data[i]) - kernel(data[j],data[j]); - if(eta >= 0) continue; - - // compute new alpha_j and clip it inside [0 C]x[0 C] box - // then compute alpha_i based on it. - var newaj = aj - labels[j]*(Ei-Ej) / eta; - if(newaj>H) newaj = H; - if(newaj 0 && newai < C) this.b= b1; - if(newaj > 0 && newaj < C) this.b= b2; - - alphaChanged++; - - } // end alpha_i needed updating - } // end for i=1..N - - iter++; - //console.log("iter number %d, alphaChanged = %d", iter, alphaChanged); - if(alphaChanged == 0) passes++; - else passes= 0; - - } // end outer loop - - // if the user was using a linear kernel, lets also compute and store the - // weights. This will speed up evaluations during testing time - if(this.kernelType === "linear") { - - // compute weights and store them - this.w = new Array(this.D); - for(var j=0;j alphatol) { - newdata.push(this.data[i]); - newlabels.push(this.labels[i]); - newalpha.push(this.alpha[i]); - } - } - - // store data and labels - this.data = newdata; - this.labels = newlabels; - this.alpha = newalpha; - this.N = this.data.length; - //console.log("filtered training data from %d to %d support vectors.", data.length, this.data.length); - } - - var trainstats = {}; - trainstats.iters= iter; - return trainstats; - }, - - // inst is an array of length D. Returns margin of given example - // this is the core prediction function. All others are for convenience mostly - // and end up calling this one somehow. - marginOne: function(inst) { - - var f = this.b; - // if the linear kernel was used and w was computed and stored, - // (i.e. the svm has fully finished training) - // the internal class variable usew_ will be set to true. - if(this.usew_) { - - // we can speed this up a lot by using the computed weights - // we computed these during train(). This is significantly faster - // than the version below - for(var j=0;j 0 ? 1 : -1; - }, - - // data is an NxD array. Returns array of margins. - margins: function(data) { - - // go over support vectors and accumulate the prediction. - var N = data.length; - var margins = new Array(N); - for(var i=0;i 0 ? 1 : -1; - } - return margs; - }, - - // THIS FUNCTION IS NOW DEPRECATED. WORKS FINE BUT NO NEED TO USE ANYMORE. - // LEAVING IT HERE JUST FOR BACKWARDS COMPATIBILITY FOR A WHILE. - // if we trained a linear svm, it is possible to calculate just the weights and the offset - // prediction is then yhat = sign(X * w + b) - getWeights: function() { - - // DEPRECATED - var w= new Array(this.D); - for(var j=0;j Date: Sun, 23 Jun 2019 17:14:52 +0530 Subject: [PATCH 120/166] classification done for 2 points --- SRIP/Codes/exp4.js | 60 ++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 097af022..ba008f96 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -47,25 +47,25 @@ window.onload = function() { function datasetLoad(){ loadDataset = document.getElementById("load-dataset").value; - if(loadDataset == 1){ + if(loadDataset === 1){ chart.options.data[0].dataPoints = series11; chart.options.data[1].dataPoints = series12; chart.render(); } - if(loadDataset == 2){ + if(loadDataset === 2){ chart.options.data[0].dataPoints = series21; chart.options.data[1].dataPoints = series22; chart.render(); } - if(loadDataset == 3){ + if(loadDataset === 3){ chart.options.data[0].dataPoints = series31; chart.options.data[1].dataPoints = series32; chart.render(); } - if(loadDataset == 4){ + if(loadDataset === 4){ chart.options.data[0].dataPoints = series41; chart.options.data[1].dataPoints = series42; chart.render(); @@ -83,26 +83,8 @@ window.onload = function() { chart.render(); } - function startDDAG(){ - ddag_1 = 1; - ddag_2 = 2; - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + ddag_1 + " vs " + ddag_2; - result = classify(); - if(result == 1) - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; - else if(result == 2) - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 1; - document.getElementById("next").disabled = false; - } - - function nextDDAG(){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + ddag_1 + " vs " + ddag_2; - document.getElementById("next").disabled = true; - document.getElementById("current-class").innerHTML = "Current Class: " + " Classified as " + result; - } - function classify(){ - if(loadDataset == 1){ + if(loadDataset === 1){ var i = 0; var j = 0; var a1 = 0; @@ -125,23 +107,45 @@ window.onload = function() { c2 += Math.sqrt((a2 * a2) + (b2 * b2)); } } - if(c2 Date: Sun, 23 Jun 2019 17:17:51 +0530 Subject: [PATCH 121/166] classification done for 2 classes --- SRIP/Codes/exp4.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index ba008f96..f7770b90 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -115,7 +115,7 @@ window.onload = function() { } } - if(loadDataset === 2){ + /*if(loadDataset === 2){ } if(loadDataset === 3){ @@ -123,7 +123,7 @@ window.onload = function() { } if(loadDataset === 4){ - } + }*/ } function startDDAG(){ @@ -134,7 +134,7 @@ window.onload = function() { if(result === 1){ document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; } - else if(result === 2){ + else if(result === 2){ document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 1; } document.getElementById("next").disabled = false; @@ -154,6 +154,4 @@ window.onload = function() { start.addEventListener("click", startDDAG); var next = document.getElementById("next"); next.addEventListener("click", nextDDAG); -}; - - +}; \ No newline at end of file From e7c82eb1404acf27cc51de017566f0b0277caebf Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 24 Jun 2019 09:10:53 +0530 Subject: [PATCH 122/166] classification done for 2 classes --- SRIP/Codes/exp4.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index f7770b90..326b009c 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -47,25 +47,25 @@ window.onload = function() { function datasetLoad(){ loadDataset = document.getElementById("load-dataset").value; - if(loadDataset === 1){ + if(loadDataset == 1){ chart.options.data[0].dataPoints = series11; chart.options.data[1].dataPoints = series12; chart.render(); } - if(loadDataset === 2){ + if(loadDataset == 2){ chart.options.data[0].dataPoints = series21; chart.options.data[1].dataPoints = series22; chart.render(); } - if(loadDataset === 3){ + if(loadDataset == 3){ chart.options.data[0].dataPoints = series31; chart.options.data[1].dataPoints = series32; chart.render(); } - if(loadDataset === 4){ + if(loadDataset == 4){ chart.options.data[0].dataPoints = series41; chart.options.data[1].dataPoints = series42; chart.render(); @@ -84,7 +84,7 @@ window.onload = function() { } function classify(){ - if(loadDataset === 1){ + if(loadDataset == 1){ var i = 0; var j = 0; var a1 = 0; @@ -131,10 +131,10 @@ window.onload = function() { ddag_2 = 2; document.getElementById("current-classifier").innerHTML = "Current Classifier: " + ddag_1 + " vs " + ddag_2; result = classify(); - if(result === 1){ + if(result == 1){ document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; } - else if(result === 2){ + else if(result == 2){ document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 1; } document.getElementById("next").disabled = false; From 59bcb2d68b758be6da71235316512b63ec949a60 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 24 Jun 2019 22:51:31 +0530 Subject: [PATCH 123/166] quiz added --- SRIP/Quiz/JSONquestions.js | 41 ++++++++ SRIP/Quiz/quiz.css | 192 +++++++++++++++++++++++++++++++++++++ SRIP/Quiz/quiz.html | 27 ++++++ SRIP/Quiz/quiz.js | 61 ++++++++++++ 4 files changed, 321 insertions(+) create mode 100644 SRIP/Quiz/JSONquestions.js create mode 100644 SRIP/Quiz/quiz.css create mode 100644 SRIP/Quiz/quiz.html create mode 100644 SRIP/Quiz/quiz.js diff --git a/SRIP/Quiz/JSONquestions.js b/SRIP/Quiz/JSONquestions.js new file mode 100644 index 00000000..2bf68f59 --- /dev/null +++ b/SRIP/Quiz/JSONquestions.js @@ -0,0 +1,41 @@ +var questions = [ +["Probability distribution of discrete random variable is classified as", "probability mass function" , "posterior mass function", "interior mass function", "continuous mass function", "1"], +["The appropriate graph of probability density function is: ", "Curve", "Histogram", "Polygon", "All","1"], +["A discrete probability distribution may be represented by: ", "Table", "Graph", "Mathematical equation", "All","4"], +["If the random variable takes negative values, then the negative values will have: ", "Positive Probabilities", "Negative Probabilities", "Negative Probabilities", "All","1"], +["Total area under the curve of a continuous probability density function is always equal to: ", "0", "1", "-1", "None of the above","2"], +["A quantity resulting from an experiment that, by chance, can assume different values is called: ", "Random experiment", "Random sample", "Random variable", "Random process","3"], +["In a discrete probability distribution the sum of all the probabilities is always equal to: ", " 0", "1", "Minimum", "Maximum","2"], +["Numbers selected by a random process and are equally distributed in a table are called: " , "Attributes", "Random variables", "Random numbers", "Quantitative variables","3"], +["Which one is not an example of random experiment?", "A coin is tossed and the outcome is either a head or a tail ", " A six-sided die is rolled ", "Some number of persons will be admitted to a hospital emergency room during any hour. ", "All medical insurance claims received by a company in a given year. ","4"], +["A basketball player makes 80 percent of his free throws during the season. What is the probability that he will make exactly 6 of his next 8 free throws?", "0.1468", "0.3355", "0.1678", "0.2936","4"], +["The covariance of two random variables", "does not have an upper or lower bound", "does not provide an indication of the direction of the relationship between the variables", "is greatly influenced by the scaling of the numbers.", "both Answer 1 and 3","4"], +["The sum of the product of each value of a discrete random variable X times its probability is referred to as its ", "expected value", "Variance", "Mean", "Both a and c","4"], +["Difference between highest and lowest observation is 20 and coefficient of range is 0.077 then sum of highest and lowest value is", "210", "220", "260", "240", "3"], +["What is Euclidean distance?", "technique used to find the distance among objects", "technique used to find the dissimilarity among objects", "Both 1 and 2", "None of the above", "3"], +["Find the distance of the point (-6, 8) from the origin", "8", "11", "10", "9", "3"], +["Find the value of p for which the points (-5, 1), (1, p) and (4, -2) are collinear.", "-3", "-2", "0", "-1", "4"], +["What is the basic operation of closest pair algorithm using brute force technique?", "Euclidean distance", "Radius", "Area", "Manhattan distance", "1"], +["Which of the following is similar to Euclidean distance?", "Manhattan distance", "Pythagoras metric", "Chebyshev distance", "Heuristic distance", "2"], +["Which of the following areas do closest pair problem arise?", "computational geometry", "graph colouring problems", "numerical problems", "string matching", "1"], +["Which approach is based on computing the distance between each pair of distinct points and finding a pair with the smallest distance?", "Brute force", "Exhaustive search", "Divide and conquer", "Branch and bound", "1"], +["The most important condition for which closest pair is calculated for the points (pi, pj) is?", "i>j", "i!=j", "i=j", "i + + + + QUIZ + + + +
+

Quiz on Experiment: Generation of Random Variables

+

+
+
+ + + + + +
+ + + + + + + \ No newline at end of file diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js new file mode 100644 index 00000000..bf29b30d --- /dev/null +++ b/SRIP/Quiz/quiz.js @@ -0,0 +1,61 @@ +var quiz = document.getElementById("quiz"); +var ques = document.getElementById("question"); +var opt1 = document.getElementById("option1"); +var opt2 = document.getElementById("option2"); +var opt3 = document.getElementById("option3"); +var opt4 = document.getElementById("option4"); +var res = document.getElementById("result"); +var nextbutton = document.getElementById("next"); +var q = document.getElementById("quit"); + +var tques = questions.length; +var score = 0; +var quesindex = 0; + +//finish the quiz +function quit(){ + quiz.style.display = "none"; + result.style.display = ""; + var f = score / tques; + result.textContent = "SCORE = " + score; + q.style.display = "none"; +} + +//start the quiz +function give_ques(quesindex){ + ques.textContent = quesindex + 1 + ". " + questions[quesindex][0]; + opt1.textContent = questions[quesindex][1]; + opt2.textContent = questions[quesindex][2]; + opt3.textContent = questions[quesindex][3]; + opt4.textContent = questions[quesindex][4]; + return; +}; + +give_ques(0); + +//next question +function nextques(){ + var selected_ans = document.querySelector("input[type=radio]:checked"); + if(!selected_ans){ + alert("SELECT AN OPTION"); + return; + } + + if(selected_ans.value == questions[quesindex][5]){ + score = score + 1; + } + selected_ans.checked = false; + quesindex++; + if(quesindex == tques - 1){ + nextbutton.textContent = "Finish"; + } + var f = score / tques; + if(quesindex == tques){ + q.style.display = "none"; + quiz.style.display = "none"; + result.style.display = ""; + result.textContent = "SCORED: " + score + " out of 25 " + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973); + return; + } + give_ques(quesindex); +} From c5231ce7f54caaed155262dce82efde9c1ddc6de Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Mon, 24 Jun 2019 23:00:17 +0530 Subject: [PATCH 124/166] quiz added --- SRIP/Quiz/quiz.css | 14 ++++++-------- SRIP/Quiz/quiz.js | 18 +++++++++--------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/SRIP/Quiz/quiz.css b/SRIP/Quiz/quiz.css index 6f96327b..c5e1ae85 100644 --- a/SRIP/Quiz/quiz.css +++ b/SRIP/Quiz/quiz.css @@ -106,9 +106,7 @@ color: #f6f6f6; #next { -font-family: 'Macondo', cursive; - -background-color: : #4CAF50; +background-color: #4CAF50; width:10%; @@ -118,7 +116,7 @@ border: 1px solid #00038c; box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); -cursor: pointer;; +cursor: pointer; float: right; @@ -128,7 +126,7 @@ padding: 10px 10px; #next:hover{ -background-color:rgb(106, 90, 205) +background-color:rgb(106, 90, 205); } @@ -141,13 +139,13 @@ right: 0; bottom: 0; -background-color: : #4CAF50; +background-color: #4CAF50; border: 1px solid #00038c; box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); -cursor: pointer;; +cursor: pointer; float: right; @@ -157,7 +155,7 @@ padding: 5px 5px; #quit:hover{ -background-color:rgb(106, 90, 205) +background-color:rgb(106, 90, 205); } diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js index bf29b30d..d89861ea 100644 --- a/SRIP/Quiz/quiz.js +++ b/SRIP/Quiz/quiz.js @@ -22,40 +22,40 @@ function quit(){ } //start the quiz -function give_ques(quesindex){ +function giveQues(quesindex){ ques.textContent = quesindex + 1 + ". " + questions[quesindex][0]; opt1.textContent = questions[quesindex][1]; opt2.textContent = questions[quesindex][2]; opt3.textContent = questions[quesindex][3]; opt4.textContent = questions[quesindex][4]; return; -}; +} -give_ques(0); +giveQues(0); //next question function nextques(){ - var selected_ans = document.querySelector("input[type=radio]:checked"); - if(!selected_ans){ + var selectedAns = document.querySelector("input[type=radio]:checked"); + if(!selectedAns){ alert("SELECT AN OPTION"); return; } - if(selected_ans.value == questions[quesindex][5]){ + if(selectedAns.value == questions[quesindex][5]){ score = score + 1; } - selected_ans.checked = false; + selectedAns.checked = false; quesindex++; if(quesindex == tques - 1){ nextbutton.textContent = "Finish"; } var f = score / tques; - if(quesindex == tques){ + if(quesindex == tques){ q.style.display = "none"; quiz.style.display = "none"; result.style.display = ""; result.textContent = "SCORED: " + score + " out of 25 " + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973); return; } - give_ques(quesindex); + giveQues(quesindex); } From 6caa12c2db512bb0d6a3d56b1c398d8c5c8caf69 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Tue, 25 Jun 2019 00:03:02 +0530 Subject: [PATCH 125/166] quiz added --- Project-1 Issue Number 240/JSONquestions.js | 41 ++ .../Quiz/JSONquestions.js | 41 ++ Project-1 Issue Number 240/Quiz/quiz.css | 366 +++++++++--------- Project-1 Issue Number 240/Quiz/quiz.html | 142 ++----- Project-1 Issue Number 240/Quiz/quiz.js | 198 +++------- Project-1 Issue Number 240/quiz.css | 190 +++++++++ Project-1 Issue Number 240/quiz.html | 27 ++ Project-1 Issue Number 240/quiz.js | 61 +++ 8 files changed, 639 insertions(+), 427 deletions(-) create mode 100644 Project-1 Issue Number 240/JSONquestions.js create mode 100644 Project-1 Issue Number 240/Quiz/JSONquestions.js create mode 100644 Project-1 Issue Number 240/quiz.css create mode 100644 Project-1 Issue Number 240/quiz.html create mode 100644 Project-1 Issue Number 240/quiz.js diff --git a/Project-1 Issue Number 240/JSONquestions.js b/Project-1 Issue Number 240/JSONquestions.js new file mode 100644 index 00000000..8c32a6c0 --- /dev/null +++ b/Project-1 Issue Number 240/JSONquestions.js @@ -0,0 +1,41 @@ +var questions = [ +["Which of the following techniques can not be used for pre-processing the inputs to an artificial neural network?", "Normalization" , "Winner-takes-all", "Principal Component Analysis(PCA)", "Deleting outliers from the training set", "2"], +["Which of the following algorithms can be used to train a single layer feedforward network?", "Hard competitive learning", "Soft competitive learning", "Genetic algorithm", "All","4"], +["Which of the following neural networks would you use for time series prediction?", "Hopfield network", "Simple recurrent network(SRN)", "Self-organizing feature map (SOFM)", "Perceptron","2"], +["Can a preceptron implement a NOT logical functions?", "No", "Only if parameters are set properly", "Yes", "Both 2 and 3","4"], +["Can a preceptron implement a AND logical functions?", "No", "Only if parameters are set properly", "Yes", "Both 2 and 3","4"], +["Can a preceptron implement a OR logical functions?", "No", "Only if parameters are set properly", "Yes", "Both 2 and 3","4"], +["When was Perceptron algorithm invented?", "1953", "1958", "1954", "1957","2"], +["Who invented Perceptron algorithm?" , "C.F. Jeff Wu", "Peter Naur", "Frank Rosen Blatt", "John Myles White","3"], +["Can a perceptron be used to detect hand written digit?", "No", "Yes", "Hand written digits cannot be read", "None of the above","2"], +["What is Perceptron rule?", "This algorithm always converges", "Can't say", "This algorithm only converges if the 2 or more classes are linearly seperable", "This algorithm only converges if the 2 classes are linearly seperable","4"], +["What is a Perceptron?", "Model of a single neuron", "Model of a mulitple neurons", "None of the above", "Both Answer 1 and 2","1"], +["Perceptron can't distingush between 2 different binary pattern with wraparound if they have same number of nonzero entries", "True", "False", "Can't say", "None of the above","1"], +["Perceptron is used for ", "Multi-class classification", "3 class classification", "2 class classification", "None of the above", "3"], +["Perceptron is a ", "Clustering method", "Supervised learning method", "Unsupervised learning method", "None of the above", "2"], +["Can perceptron learn functions?", "It only implements linearly seperable functions", "It only implements non-linearly seperable functions", "Both 1 and 2", "None of the above", "1"], +["Is perceptron linear regression?", "True", "False", "Can't say", "None of the above", "2"], +["For effective training of a neural network, the network should have ", "at least 5 to 10 times as many weights as there are training sample", "at least 15 to 20 times as many weights as there are training sample", "same number of weights as there are training sample", "at least 1 to 5 times as many weights as there are training sample", "3"], +["A single perceptron can compute the XOR function", "True", "False", "Can't say", "None of the above", "2"], +["What is a decision boundary in perceptron", "line to classify the classes", "points to classify the classes", "boundary around the classes", "None of the above", "1"], +["What is the difference between perceptron and neuron", "Perceptron is a mathematical model, Neuron is a dendrite", "Neuron is a mathematical model, Perceptron is a dendrite", "No difference", "None of the above", "1"], +["A perceptron adds up all the weighted inputs it receives, and if it exceeds a certain value, it outputs a 1, otherwise outputs a 0", "True", "False", "Sometimes it can also output intermediate values as well", "None of the above", "1"], +["Which of the following points will not form any perceptron line?", "Class 1: (-5, -4) Class 2: (5, 5)", "Class 1: (1, 2) Class 2: (3, 4)", "Both", "None of the above", "2"], +["Which of these points represent the perceptron line?", "x=0, y = (bias/weights[0])", "x=0, y = (-bias/weights[1])", "x=(-bias/weights[1]), y=0", "x=(bias/weights[0]), y=0", "2"], +["A perceptron classifier works,", "Only for data that is non linearly separable", "Only for data that is linearly separable", "For both linearly and non linearly separable data", "None of the above", "2"], +["What is the importance of threshold?", "It determines whether perceptron works or not", "It determines whether perceptron is correct or not", "All of the above", "It determines whether perceptron fires or not", "4"] +]; + +function shuffle(array) { + var currentIndex = array.length, temporaryValue, randomIndex; + while (0 !== currentIndex) { + randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex -= 1; + temporaryValue = array[currentIndex]; + array[currentIndex] = array[randomIndex]; + array[randomIndex] = temporaryValue; + } + return array; +} + +shuffle(questions); \ No newline at end of file diff --git a/Project-1 Issue Number 240/Quiz/JSONquestions.js b/Project-1 Issue Number 240/Quiz/JSONquestions.js new file mode 100644 index 00000000..2bf68f59 --- /dev/null +++ b/Project-1 Issue Number 240/Quiz/JSONquestions.js @@ -0,0 +1,41 @@ +var questions = [ +["Probability distribution of discrete random variable is classified as", "probability mass function" , "posterior mass function", "interior mass function", "continuous mass function", "1"], +["The appropriate graph of probability density function is: ", "Curve", "Histogram", "Polygon", "All","1"], +["A discrete probability distribution may be represented by: ", "Table", "Graph", "Mathematical equation", "All","4"], +["If the random variable takes negative values, then the negative values will have: ", "Positive Probabilities", "Negative Probabilities", "Negative Probabilities", "All","1"], +["Total area under the curve of a continuous probability density function is always equal to: ", "0", "1", "-1", "None of the above","2"], +["A quantity resulting from an experiment that, by chance, can assume different values is called: ", "Random experiment", "Random sample", "Random variable", "Random process","3"], +["In a discrete probability distribution the sum of all the probabilities is always equal to: ", " 0", "1", "Minimum", "Maximum","2"], +["Numbers selected by a random process and are equally distributed in a table are called: " , "Attributes", "Random variables", "Random numbers", "Quantitative variables","3"], +["Which one is not an example of random experiment?", "A coin is tossed and the outcome is either a head or a tail ", " A six-sided die is rolled ", "Some number of persons will be admitted to a hospital emergency room during any hour. ", "All medical insurance claims received by a company in a given year. ","4"], +["A basketball player makes 80 percent of his free throws during the season. What is the probability that he will make exactly 6 of his next 8 free throws?", "0.1468", "0.3355", "0.1678", "0.2936","4"], +["The covariance of two random variables", "does not have an upper or lower bound", "does not provide an indication of the direction of the relationship between the variables", "is greatly influenced by the scaling of the numbers.", "both Answer 1 and 3","4"], +["The sum of the product of each value of a discrete random variable X times its probability is referred to as its ", "expected value", "Variance", "Mean", "Both a and c","4"], +["Difference between highest and lowest observation is 20 and coefficient of range is 0.077 then sum of highest and lowest value is", "210", "220", "260", "240", "3"], +["What is Euclidean distance?", "technique used to find the distance among objects", "technique used to find the dissimilarity among objects", "Both 1 and 2", "None of the above", "3"], +["Find the distance of the point (-6, 8) from the origin", "8", "11", "10", "9", "3"], +["Find the value of p for which the points (-5, 1), (1, p) and (4, -2) are collinear.", "-3", "-2", "0", "-1", "4"], +["What is the basic operation of closest pair algorithm using brute force technique?", "Euclidean distance", "Radius", "Area", "Manhattan distance", "1"], +["Which of the following is similar to Euclidean distance?", "Manhattan distance", "Pythagoras metric", "Chebyshev distance", "Heuristic distance", "2"], +["Which of the following areas do closest pair problem arise?", "computational geometry", "graph colouring problems", "numerical problems", "string matching", "1"], +["Which approach is based on computing the distance between each pair of distinct points and finding a pair with the smallest distance?", "Brute force", "Exhaustive search", "Divide and conquer", "Branch and bound", "1"], +["The most important condition for which closest pair is calculated for the points (pi, pj) is?", "i>j", "i!=j", "i=j", "i - - - - Quiz on Experiment- Perceptron - - - - - - - - -

Take a Quiz!

- - - - - - - - - - - - - - -
-
-

1. A perceptron adds up all the weighted inputs it receives, and if it exceeds a certain value, it outputs a 1, otherwise outputs a 0.

- -
    - - -
    - - -
    - - -
    - - -
-
-
-
-

2. Which of the following points will not form any perceptron line?

- -
    - - -
    - - -
    - - -
-
-
-
-

3. Which of these points represent the perceptron line?

- -
    - - -
    - - -
    - - -
    - - -
-
-
-
-

4. A perceptron classifier works,

- -
    - - -
    - - -
    - - -
    - - -
-
-
- -
- -
- - -
-
-
-
- - -
-

-
- - - + + + + + QUIZ + + + +
+

Quiz on Experiment: Generation of Random Variables

+

+
+
+ + + + + +
+ + + + + + \ No newline at end of file diff --git a/Project-1 Issue Number 240/Quiz/quiz.js b/Project-1 Issue Number 240/Quiz/quiz.js index 0d4fd43f..bf29b30d 100644 --- a/Project-1 Issue Number 240/Quiz/quiz.js +++ b/Project-1 Issue Number 240/Quiz/quiz.js @@ -1,137 +1,61 @@ -function submitQuiz() { - - // get each answer - function answerScore (qName) { - var radiosNo = document.getElementsByName(qName); - - for (var i = 0, length = radiosNo.length; i < length; i++) { - if (radiosNo[i].checked) { - // do something with radiosNo - var answerValue = Number(radiosNo[i].value); - } - } - // change NaNs to zero - if (isNaN(answerValue)) { - answerValue = 0; - } - return answerValue; - } - - // calc score with answerScore function - var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); - //console.log("CalcScore: " + calcScore); // it works! - - // function to return correct answer string - function correctAnswer (correctStringNo, qNumber) { - //console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below - return ("The correct answer for question #" + qNumber + ":  " + - (document.getElementById(correctStringNo).innerHTML) + ""); - } - - // print correct answers only if wrong (calls correctAnswer function) - if (answerScore('q1') === 0) { - document.getElementById('correctAnswer1').innerHTML = correctAnswer('correctString1', 1); - } - if (answerScore('q2') === 0) { - document.getElementById('correctAnswer2').innerHTML = correctAnswer('correctString2', 2); - } - if (answerScore('q3') === 0) { - document.getElementById('correctAnswer3').innerHTML = correctAnswer('correctString3', 3); - } - if (answerScore('q4') === 0) { - document.getElementById('correctAnswer4').innerHTML = correctAnswer('correctString4', 4); - } - - // calculate "possible score" integer - var questionCountArray = document.getElementsByClassName('question'); - - var questionCounter = 0; - for (var i = 0, length = questionCountArray.length; i < length; i++) { - questionCounter++; - } - - // show score as "score/possible score" - var showScore = "Your Score: " + calcScore +"/" + questionCounter; - // if 4/4, "perfect score!" - if (calcScore === questionCounter) { - showScore = showScore + "  Perfect Score!" - }; - document.getElementById('userScore').innerHTML = showScore; - } - -$(document).ready(function() { - - $('#submitButton').click(function() { - $(this).addClass('hide'); - }); - -}); - - function submitQuiz() { - //console.log('submitted'); - - // get each answer score - function answerScore (qName) { - var radiosNo = document.getElementsByName(qName); - - for (var i = 0, length = radiosNo.length; i < length; i++) { - if (radiosNo[i].checked) { - // do something with radiosNo - var answerValue = Number(radiosNo[i].value); - } - } - // change NaNs to zero - if (isNaN(answerValue)) { - answerValue = 0; - } - return answerValue; - } - - // calc score with answerScore function - var calcScore = (answerScore('q1') + answerScore('q2') + answerScore('q3') + answerScore('q4')); - //console.log("CalcScore: " + calcScore); // it works! - - // function to return correct answer string - function correctAnswer (correctStringNo, qNumber) { - //console.log("qNumber: " + qNumber); // logs 1,2,3,4 after called below - return ("The correct answer for question " + qNumber + ":  " + - (document.getElementById(correctStringNo).innerHTML) + ""); - } - - // print correct answers only if wrong (calls correctAnswer function) - if (answerScore('q1') === 0) { - document.getElementById('correctAnswer1').innerHTML = correctAnswer('correctString1', 1); - } - if (answerScore('q2') === 0) { - document.getElementById('correctAnswer2').innerHTML = correctAnswer('correctString2', 2); - } - if (answerScore('q3') === 0) { - document.getElementById('correctAnswer3').innerHTML = correctAnswer('correctString3', 3); - } - if (answerScore('q4') === 0) { - document.getElementById('correctAnswer4').innerHTML = correctAnswer('correctString4', 4); - } - - // calculate "possible score" integer - var questionCountArray = document.getElementsByClassName('question'); - - var questionCounter = 0; - for (var i = 0, length = questionCountArray.length; i < length; i++) { - questionCounter++; - } - - // show score as "score/possible score" - var showScore = "Your Score: " + calcScore +"/" + questionCounter; - if (calcScore === questionCounter) { - showScore = showScore + "  Perfect Score!" + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973) - }; - document.getElementById('userScore').innerHTML = showScore; - } - -$(document).ready(function() { - - $('#submitButton').click(function() { - $(this).addClass('hide'); - }); - -}); \ No newline at end of file +var quiz = document.getElementById("quiz"); +var ques = document.getElementById("question"); +var opt1 = document.getElementById("option1"); +var opt2 = document.getElementById("option2"); +var opt3 = document.getElementById("option3"); +var opt4 = document.getElementById("option4"); +var res = document.getElementById("result"); +var nextbutton = document.getElementById("next"); +var q = document.getElementById("quit"); + +var tques = questions.length; +var score = 0; +var quesindex = 0; + +//finish the quiz +function quit(){ + quiz.style.display = "none"; + result.style.display = ""; + var f = score / tques; + result.textContent = "SCORE = " + score; + q.style.display = "none"; +} + +//start the quiz +function give_ques(quesindex){ + ques.textContent = quesindex + 1 + ". " + questions[quesindex][0]; + opt1.textContent = questions[quesindex][1]; + opt2.textContent = questions[quesindex][2]; + opt3.textContent = questions[quesindex][3]; + opt4.textContent = questions[quesindex][4]; + return; +}; + +give_ques(0); + +//next question +function nextques(){ + var selected_ans = document.querySelector("input[type=radio]:checked"); + if(!selected_ans){ + alert("SELECT AN OPTION"); + return; + } + + if(selected_ans.value == questions[quesindex][5]){ + score = score + 1; + } + selected_ans.checked = false; + quesindex++; + if(quesindex == tques - 1){ + nextbutton.textContent = "Finish"; + } + var f = score / tques; + if(quesindex == tques){ + q.style.display = "none"; + quiz.style.display = "none"; + result.style.display = ""; + result.textContent = "SCORED: " + score + " out of 25 " + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973); + return; + } + give_ques(quesindex); +} diff --git a/Project-1 Issue Number 240/quiz.css b/Project-1 Issue Number 240/quiz.css new file mode 100644 index 00000000..c5e1ae85 --- /dev/null +++ b/Project-1 Issue Number 240/quiz.css @@ -0,0 +1,190 @@ +body +{ + +background-repeat: no-repeat; + +background-size: 1600px 800px + +} + +#heading +{ + +position: absolute; + +left:20%; + +width: 60%; + +background: rgba(255,255,255,0.5); + +padding: 20px; + +border: 1px solid #00038c; + +box-shadow: 0 0 8px 3px #fff; + +} + +#text +{ + +text-align: center; + +} + +#quiz +{ + +height: 330px; + +width: 60%; + +position: absolute; + +left:20%; + +top: 30%; + +transform: translateX(-50) translateY(-50); + +background: rgba(255,255,255,0.5); + +padding: 20px; + +border: 1px solid #00038c; + +box-shadow: 0 0 8px 3px #fff; +} + +#question +{ + +padding: 20px; + +font-size: 22px; + +background: #08038C; + +border-radius: 10px; + +margin: 10px 0 10px 0; + +color: #f6f6f6; + +} + +.option{ + +width: 470px; + +display: inline-block; + +padding: 10px 0 10px 0; + +background: rgba(255,255,255,0.5); + +margin: 10px 0 10px 10px; + +color: #0000000; + +border: 2px solid #008CBA; + +border-radius: 5px; + +} + +.option:hover +{ + +background: #08038C; + +color: #f6f6f6; + +} + +#next +{ + +background-color: #4CAF50; + +width:10%; + +height: 4%px; + +border: 1px solid #00038c; + +box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); + +cursor: pointer; + +float: right; + +padding: 10px 10px; + +} + +#next:hover{ + +background-color:rgb(106, 90, 205); + +} + +#quit +{ + +position: absolute; + +right: 0; + +bottom: 0; + +background-color: #4CAF50; + +border: 1px solid #00038c; + +box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); + +cursor: pointer; + +float: right; + +padding: 5px 5px; + +} + +#quit:hover{ + +background-color:rgb(106, 90, 205); + +} + +#result +{ + +font-size:100px; + +text-align: center; + +height: 100px; + +width: 60%; + +position: absolute; + +left:20%; + +top: 30%; + +transform: translateX(-50) translateY(-50); + +background: rgba(255,255,255,0.5); + +padding: 20px; + +border: 1px solid #00038c; + +box-shadow: 0 0 8px 3px #fff; + +} + diff --git a/Project-1 Issue Number 240/quiz.html b/Project-1 Issue Number 240/quiz.html new file mode 100644 index 00000000..ca47a5bd --- /dev/null +++ b/Project-1 Issue Number 240/quiz.html @@ -0,0 +1,27 @@ + + + + + QUIZ + + + +
+

Quiz on Experiment: Linear Perceptron Learning

+

+
+
+ + + + + +
+ + + + + + + \ No newline at end of file diff --git a/Project-1 Issue Number 240/quiz.js b/Project-1 Issue Number 240/quiz.js new file mode 100644 index 00000000..d89861ea --- /dev/null +++ b/Project-1 Issue Number 240/quiz.js @@ -0,0 +1,61 @@ +var quiz = document.getElementById("quiz"); +var ques = document.getElementById("question"); +var opt1 = document.getElementById("option1"); +var opt2 = document.getElementById("option2"); +var opt3 = document.getElementById("option3"); +var opt4 = document.getElementById("option4"); +var res = document.getElementById("result"); +var nextbutton = document.getElementById("next"); +var q = document.getElementById("quit"); + +var tques = questions.length; +var score = 0; +var quesindex = 0; + +//finish the quiz +function quit(){ + quiz.style.display = "none"; + result.style.display = ""; + var f = score / tques; + result.textContent = "SCORE = " + score; + q.style.display = "none"; +} + +//start the quiz +function giveQues(quesindex){ + ques.textContent = quesindex + 1 + ". " + questions[quesindex][0]; + opt1.textContent = questions[quesindex][1]; + opt2.textContent = questions[quesindex][2]; + opt3.textContent = questions[quesindex][3]; + opt4.textContent = questions[quesindex][4]; + return; +} + +giveQues(0); + +//next question +function nextques(){ + var selectedAns = document.querySelector("input[type=radio]:checked"); + if(!selectedAns){ + alert("SELECT AN OPTION"); + return; + } + + if(selectedAns.value == questions[quesindex][5]){ + score = score + 1; + } + selectedAns.checked = false; + quesindex++; + if(quesindex == tques - 1){ + nextbutton.textContent = "Finish"; + } + var f = score / tques; + if(quesindex == tques){ + q.style.display = "none"; + quiz.style.display = "none"; + result.style.display = ""; + result.textContent = "SCORED: " + score + " out of 25 " + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973); + return; + } + giveQues(quesindex); +} From 9524e8498fcf1d706b0fb6fa476f58cf91728a03 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Tue, 25 Jun 2019 00:09:02 +0530 Subject: [PATCH 126/166] quiz added --- Project-1 Issue Number 240/JSONquestions.js | 41 ---- .../Quiz/JSONquestions.js | 50 ++--- Project-1 Issue Number 240/Quiz/quiz.css | 14 +- Project-1 Issue Number 240/Quiz/quiz.html | 2 +- Project-1 Issue Number 240/Quiz/quiz.js | 18 +- Project-1 Issue Number 240/quiz.css | 190 ------------------ Project-1 Issue Number 240/quiz.html | 27 --- Project-1 Issue Number 240/quiz.js | 61 ------ 8 files changed, 41 insertions(+), 362 deletions(-) delete mode 100644 Project-1 Issue Number 240/JSONquestions.js delete mode 100644 Project-1 Issue Number 240/quiz.css delete mode 100644 Project-1 Issue Number 240/quiz.html delete mode 100644 Project-1 Issue Number 240/quiz.js diff --git a/Project-1 Issue Number 240/JSONquestions.js b/Project-1 Issue Number 240/JSONquestions.js deleted file mode 100644 index 8c32a6c0..00000000 --- a/Project-1 Issue Number 240/JSONquestions.js +++ /dev/null @@ -1,41 +0,0 @@ -var questions = [ -["Which of the following techniques can not be used for pre-processing the inputs to an artificial neural network?", "Normalization" , "Winner-takes-all", "Principal Component Analysis(PCA)", "Deleting outliers from the training set", "2"], -["Which of the following algorithms can be used to train a single layer feedforward network?", "Hard competitive learning", "Soft competitive learning", "Genetic algorithm", "All","4"], -["Which of the following neural networks would you use for time series prediction?", "Hopfield network", "Simple recurrent network(SRN)", "Self-organizing feature map (SOFM)", "Perceptron","2"], -["Can a preceptron implement a NOT logical functions?", "No", "Only if parameters are set properly", "Yes", "Both 2 and 3","4"], -["Can a preceptron implement a AND logical functions?", "No", "Only if parameters are set properly", "Yes", "Both 2 and 3","4"], -["Can a preceptron implement a OR logical functions?", "No", "Only if parameters are set properly", "Yes", "Both 2 and 3","4"], -["When was Perceptron algorithm invented?", "1953", "1958", "1954", "1957","2"], -["Who invented Perceptron algorithm?" , "C.F. Jeff Wu", "Peter Naur", "Frank Rosen Blatt", "John Myles White","3"], -["Can a perceptron be used to detect hand written digit?", "No", "Yes", "Hand written digits cannot be read", "None of the above","2"], -["What is Perceptron rule?", "This algorithm always converges", "Can't say", "This algorithm only converges if the 2 or more classes are linearly seperable", "This algorithm only converges if the 2 classes are linearly seperable","4"], -["What is a Perceptron?", "Model of a single neuron", "Model of a mulitple neurons", "None of the above", "Both Answer 1 and 2","1"], -["Perceptron can't distingush between 2 different binary pattern with wraparound if they have same number of nonzero entries", "True", "False", "Can't say", "None of the above","1"], -["Perceptron is used for ", "Multi-class classification", "3 class classification", "2 class classification", "None of the above", "3"], -["Perceptron is a ", "Clustering method", "Supervised learning method", "Unsupervised learning method", "None of the above", "2"], -["Can perceptron learn functions?", "It only implements linearly seperable functions", "It only implements non-linearly seperable functions", "Both 1 and 2", "None of the above", "1"], -["Is perceptron linear regression?", "True", "False", "Can't say", "None of the above", "2"], -["For effective training of a neural network, the network should have ", "at least 5 to 10 times as many weights as there are training sample", "at least 15 to 20 times as many weights as there are training sample", "same number of weights as there are training sample", "at least 1 to 5 times as many weights as there are training sample", "3"], -["A single perceptron can compute the XOR function", "True", "False", "Can't say", "None of the above", "2"], -["What is a decision boundary in perceptron", "line to classify the classes", "points to classify the classes", "boundary around the classes", "None of the above", "1"], -["What is the difference between perceptron and neuron", "Perceptron is a mathematical model, Neuron is a dendrite", "Neuron is a mathematical model, Perceptron is a dendrite", "No difference", "None of the above", "1"], -["A perceptron adds up all the weighted inputs it receives, and if it exceeds a certain value, it outputs a 1, otherwise outputs a 0", "True", "False", "Sometimes it can also output intermediate values as well", "None of the above", "1"], -["Which of the following points will not form any perceptron line?", "Class 1: (-5, -4) Class 2: (5, 5)", "Class 1: (1, 2) Class 2: (3, 4)", "Both", "None of the above", "2"], -["Which of these points represent the perceptron line?", "x=0, y = (bias/weights[0])", "x=0, y = (-bias/weights[1])", "x=(-bias/weights[1]), y=0", "x=(bias/weights[0]), y=0", "2"], -["A perceptron classifier works,", "Only for data that is non linearly separable", "Only for data that is linearly separable", "For both linearly and non linearly separable data", "None of the above", "2"], -["What is the importance of threshold?", "It determines whether perceptron works or not", "It determines whether perceptron is correct or not", "All of the above", "It determines whether perceptron fires or not", "4"] -]; - -function shuffle(array) { - var currentIndex = array.length, temporaryValue, randomIndex; - while (0 !== currentIndex) { - randomIndex = Math.floor(Math.random() * currentIndex); - currentIndex -= 1; - temporaryValue = array[currentIndex]; - array[currentIndex] = array[randomIndex]; - array[randomIndex] = temporaryValue; - } - return array; -} - -shuffle(questions); \ No newline at end of file diff --git a/Project-1 Issue Number 240/Quiz/JSONquestions.js b/Project-1 Issue Number 240/Quiz/JSONquestions.js index 2bf68f59..8c32a6c0 100644 --- a/Project-1 Issue Number 240/Quiz/JSONquestions.js +++ b/Project-1 Issue Number 240/Quiz/JSONquestions.js @@ -1,29 +1,29 @@ var questions = [ -["Probability distribution of discrete random variable is classified as", "probability mass function" , "posterior mass function", "interior mass function", "continuous mass function", "1"], -["The appropriate graph of probability density function is: ", "Curve", "Histogram", "Polygon", "All","1"], -["A discrete probability distribution may be represented by: ", "Table", "Graph", "Mathematical equation", "All","4"], -["If the random variable takes negative values, then the negative values will have: ", "Positive Probabilities", "Negative Probabilities", "Negative Probabilities", "All","1"], -["Total area under the curve of a continuous probability density function is always equal to: ", "0", "1", "-1", "None of the above","2"], -["A quantity resulting from an experiment that, by chance, can assume different values is called: ", "Random experiment", "Random sample", "Random variable", "Random process","3"], -["In a discrete probability distribution the sum of all the probabilities is always equal to: ", " 0", "1", "Minimum", "Maximum","2"], -["Numbers selected by a random process and are equally distributed in a table are called: " , "Attributes", "Random variables", "Random numbers", "Quantitative variables","3"], -["Which one is not an example of random experiment?", "A coin is tossed and the outcome is either a head or a tail ", " A six-sided die is rolled ", "Some number of persons will be admitted to a hospital emergency room during any hour. ", "All medical insurance claims received by a company in a given year. ","4"], -["A basketball player makes 80 percent of his free throws during the season. What is the probability that he will make exactly 6 of his next 8 free throws?", "0.1468", "0.3355", "0.1678", "0.2936","4"], -["The covariance of two random variables", "does not have an upper or lower bound", "does not provide an indication of the direction of the relationship between the variables", "is greatly influenced by the scaling of the numbers.", "both Answer 1 and 3","4"], -["The sum of the product of each value of a discrete random variable X times its probability is referred to as its ", "expected value", "Variance", "Mean", "Both a and c","4"], -["Difference between highest and lowest observation is 20 and coefficient of range is 0.077 then sum of highest and lowest value is", "210", "220", "260", "240", "3"], -["What is Euclidean distance?", "technique used to find the distance among objects", "technique used to find the dissimilarity among objects", "Both 1 and 2", "None of the above", "3"], -["Find the distance of the point (-6, 8) from the origin", "8", "11", "10", "9", "3"], -["Find the value of p for which the points (-5, 1), (1, p) and (4, -2) are collinear.", "-3", "-2", "0", "-1", "4"], -["What is the basic operation of closest pair algorithm using brute force technique?", "Euclidean distance", "Radius", "Area", "Manhattan distance", "1"], -["Which of the following is similar to Euclidean distance?", "Manhattan distance", "Pythagoras metric", "Chebyshev distance", "Heuristic distance", "2"], -["Which of the following areas do closest pair problem arise?", "computational geometry", "graph colouring problems", "numerical problems", "string matching", "1"], -["Which approach is based on computing the distance between each pair of distinct points and finding a pair with the smallest distance?", "Brute force", "Exhaustive search", "Divide and conquer", "Branch and bound", "1"], -["The most important condition for which closest pair is calculated for the points (pi, pj) is?", "i>j", "i!=j", "i=j", "i
-

Quiz on Experiment: Generation of Random Variables

+

Quiz on Experiment: Linear Perceptron Learning

diff --git a/Project-1 Issue Number 240/Quiz/quiz.js b/Project-1 Issue Number 240/Quiz/quiz.js index bf29b30d..d89861ea 100644 --- a/Project-1 Issue Number 240/Quiz/quiz.js +++ b/Project-1 Issue Number 240/Quiz/quiz.js @@ -22,40 +22,40 @@ function quit(){ } //start the quiz -function give_ques(quesindex){ +function giveQues(quesindex){ ques.textContent = quesindex + 1 + ". " + questions[quesindex][0]; opt1.textContent = questions[quesindex][1]; opt2.textContent = questions[quesindex][2]; opt3.textContent = questions[quesindex][3]; opt4.textContent = questions[quesindex][4]; return; -}; +} -give_ques(0); +giveQues(0); //next question function nextques(){ - var selected_ans = document.querySelector("input[type=radio]:checked"); - if(!selected_ans){ + var selectedAns = document.querySelector("input[type=radio]:checked"); + if(!selectedAns){ alert("SELECT AN OPTION"); return; } - if(selected_ans.value == questions[quesindex][5]){ + if(selectedAns.value == questions[quesindex][5]){ score = score + 1; } - selected_ans.checked = false; + selectedAns.checked = false; quesindex++; if(quesindex == tques - 1){ nextbutton.textContent = "Finish"; } var f = score / tques; - if(quesindex == tques){ + if(quesindex == tques){ q.style.display = "none"; quiz.style.display = "none"; result.style.display = ""; result.textContent = "SCORED: " + score + " out of 25 " + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973); return; } - give_ques(quesindex); + giveQues(quesindex); } diff --git a/Project-1 Issue Number 240/quiz.css b/Project-1 Issue Number 240/quiz.css deleted file mode 100644 index c5e1ae85..00000000 --- a/Project-1 Issue Number 240/quiz.css +++ /dev/null @@ -1,190 +0,0 @@ -body -{ - -background-repeat: no-repeat; - -background-size: 1600px 800px - -} - -#heading -{ - -position: absolute; - -left:20%; - -width: 60%; - -background: rgba(255,255,255,0.5); - -padding: 20px; - -border: 1px solid #00038c; - -box-shadow: 0 0 8px 3px #fff; - -} - -#text -{ - -text-align: center; - -} - -#quiz -{ - -height: 330px; - -width: 60%; - -position: absolute; - -left:20%; - -top: 30%; - -transform: translateX(-50) translateY(-50); - -background: rgba(255,255,255,0.5); - -padding: 20px; - -border: 1px solid #00038c; - -box-shadow: 0 0 8px 3px #fff; -} - -#question -{ - -padding: 20px; - -font-size: 22px; - -background: #08038C; - -border-radius: 10px; - -margin: 10px 0 10px 0; - -color: #f6f6f6; - -} - -.option{ - -width: 470px; - -display: inline-block; - -padding: 10px 0 10px 0; - -background: rgba(255,255,255,0.5); - -margin: 10px 0 10px 10px; - -color: #0000000; - -border: 2px solid #008CBA; - -border-radius: 5px; - -} - -.option:hover -{ - -background: #08038C; - -color: #f6f6f6; - -} - -#next -{ - -background-color: #4CAF50; - -width:10%; - -height: 4%px; - -border: 1px solid #00038c; - -box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); - -cursor: pointer; - -float: right; - -padding: 10px 10px; - -} - -#next:hover{ - -background-color:rgb(106, 90, 205); - -} - -#quit -{ - -position: absolute; - -right: 0; - -bottom: 0; - -background-color: #4CAF50; - -border: 1px solid #00038c; - -box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); - -cursor: pointer; - -float: right; - -padding: 5px 5px; - -} - -#quit:hover{ - -background-color:rgb(106, 90, 205); - -} - -#result -{ - -font-size:100px; - -text-align: center; - -height: 100px; - -width: 60%; - -position: absolute; - -left:20%; - -top: 30%; - -transform: translateX(-50) translateY(-50); - -background: rgba(255,255,255,0.5); - -padding: 20px; - -border: 1px solid #00038c; - -box-shadow: 0 0 8px 3px #fff; - -} - diff --git a/Project-1 Issue Number 240/quiz.html b/Project-1 Issue Number 240/quiz.html deleted file mode 100644 index ca47a5bd..00000000 --- a/Project-1 Issue Number 240/quiz.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - QUIZ - - - -
-

Quiz on Experiment: Linear Perceptron Learning

-

-
-
- - - - - -
- - - - - - - \ No newline at end of file diff --git a/Project-1 Issue Number 240/quiz.js b/Project-1 Issue Number 240/quiz.js deleted file mode 100644 index d89861ea..00000000 --- a/Project-1 Issue Number 240/quiz.js +++ /dev/null @@ -1,61 +0,0 @@ -var quiz = document.getElementById("quiz"); -var ques = document.getElementById("question"); -var opt1 = document.getElementById("option1"); -var opt2 = document.getElementById("option2"); -var opt3 = document.getElementById("option3"); -var opt4 = document.getElementById("option4"); -var res = document.getElementById("result"); -var nextbutton = document.getElementById("next"); -var q = document.getElementById("quit"); - -var tques = questions.length; -var score = 0; -var quesindex = 0; - -//finish the quiz -function quit(){ - quiz.style.display = "none"; - result.style.display = ""; - var f = score / tques; - result.textContent = "SCORE = " + score; - q.style.display = "none"; -} - -//start the quiz -function giveQues(quesindex){ - ques.textContent = quesindex + 1 + ". " + questions[quesindex][0]; - opt1.textContent = questions[quesindex][1]; - opt2.textContent = questions[quesindex][2]; - opt3.textContent = questions[quesindex][3]; - opt4.textContent = questions[quesindex][4]; - return; -} - -giveQues(0); - -//next question -function nextques(){ - var selectedAns = document.querySelector("input[type=radio]:checked"); - if(!selectedAns){ - alert("SELECT AN OPTION"); - return; - } - - if(selectedAns.value == questions[quesindex][5]){ - score = score + 1; - } - selectedAns.checked = false; - quesindex++; - if(quesindex == tques - 1){ - nextbutton.textContent = "Finish"; - } - var f = score / tques; - if(quesindex == tques){ - q.style.display = "none"; - quiz.style.display = "none"; - result.style.display = ""; - result.textContent = "SCORED: " + score + " out of 25 " + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973); - return; - } - giveQues(quesindex); -} From 2c6bec81cda4f42b15baeefe294b28762e901479 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Tue, 25 Jun 2019 11:25:17 +0530 Subject: [PATCH 127/166] 4 classes added --- SRIP/Codes/exp4.html | 1 - SRIP/Codes/exp4.js | 154 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 130 insertions(+), 25 deletions(-) diff --git a/SRIP/Codes/exp4.html b/SRIP/Codes/exp4.html index aa13ab22..46f6e5c5 100644 --- a/SRIP/Codes/exp4.html +++ b/SRIP/Codes/exp4.html @@ -4,7 +4,6 @@ Generation of Random Variables - diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 326b009c..b00d385e 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -1,16 +1,27 @@ window.onload = function() { var loadDataset = 0; +//first dataset var series11 = [{x: 0.3, y: 0.2}, {x: 0.4, y: 0.3}]; var series12 = [{x: -0.4, y: -0.3}, {x: -0.3, y: -0.2}]; - var series21 = [{x: 0.2, y: -0.4}, {x: 0.3, y: -0.2}]; - var series22 = [{x: -0.4, y: 0.6}, {x: -0.7, y: 0.3}]; - var series31 = [{x: 0.4, y: 0.6}, {x: 0.7, y: 0.3}]; - var series32 = [{x: 1.2, y: 2.1}, {x: 1.3, y: 2.3}]; - var series41 = []; - var series42 = []; + var series13 = [{x: 0.2, y: -0.4}, {x: 0.3, y: -0.2}]; + var series14 = [{x: -0.4, y: 0.6}, {x: -0.7, y: 0.3}]; +//second dataset + var series21 = []; + var series22 = []; + var series23 = []; + var series24 = []; +//third dataset + var series31 = []; + var series32 = []; + var series33 = []; + var series34 = []; +//fourth dataset + var series41 = []; + var series42 = []; + var series43 = []; + var series44 = []; var ans = []; - var ddag_1; var ddag_2; var result; @@ -35,6 +46,18 @@ window.onload = function() { color: "green", type: "scatter", dataPoints: 0 + },{ + showInLegend: true, + legendText: "Class 3", + color: "blue", + type: "scatter", + dataPoints: 0 + },{ + showInLegend: true, + legendText: "Class 4", + color: "deeppink", + type: "scatter", + dataPoints: 0 },{ showInLegend: true, legendText: "Test", @@ -50,10 +73,12 @@ window.onload = function() { if(loadDataset == 1){ chart.options.data[0].dataPoints = series11; chart.options.data[1].dataPoints = series12; + chart.options.data[2].dataPoints = series13; + chart.options.data[3].dataPoints = series14; chart.render(); } - if(loadDataset == 2){ + /*if(loadDataset == 2){ chart.options.data[0].dataPoints = series21; chart.options.data[1].dataPoints = series22; chart.render(); @@ -69,7 +94,7 @@ window.onload = function() { chart.options.data[0].dataPoints = series41; chart.options.data[1].dataPoints = series42; chart.render(); - } + }*/ } function addDataPointsAndRender() { @@ -79,17 +104,27 @@ window.onload = function() { x: xValue, y: yValue }); - chart.options.data[2].dataPoints = ans; + chart.options.data[4].dataPoints = ans; chart.render(); } function classify(){ +// first dataset if(loadDataset == 1){ var i = 0; var j = 0; var a1 = 0; var b1 = 0; var c1 = 0; + var a2 = 0; + var b2 = 0; + var c2 = 0; + var a3 = 0; + var b3 = 0; + var c3 = 0; + var a4 = 0; + var b4 = 0; + var c4 = 0; for(i = 0; i<2; i++){ for(j = 0; j < ans.length; j++){ a1 = series11[i].x - ans[j].x; @@ -97,9 +132,6 @@ window.onload = function() { c1 += Math.sqrt((a1 * a1) + (b1 * b1)); } } - var a2 = 0; - var b2 = 0; - var c2 = 0; for(i = 0; i<2; i++){ for(j = 0; j < ans.length; j++){ a2 = series12[i].x - ans[j].x; @@ -107,13 +139,35 @@ window.onload = function() { c2 += Math.sqrt((a2 * a2) + (b2 * b2)); } } - if(c2 Date: Tue, 25 Jun 2019 11:40:23 +0530 Subject: [PATCH 128/166] 4 classes added --- SRIP/Codes/exp4.js | 53 +++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index b00d385e..d35a1754 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -22,8 +22,10 @@ window.onload = function() { var series44 = []; var ans = []; - var ddag_1; - var ddag_2; + var ddag1; + var ddag2; + var ddag3; + var ddag4; var result; var chart = new CanvasJS.Chart("chartContainer", { @@ -183,14 +185,13 @@ window.onload = function() { function startDDAG(){ result = classify(); console.log(result); - ddag_1 = 1; - ddag_2 = 1; - ddag_3 = 1; - ddag_4 = 1; + ddag1 = 1; + ddag2 = 1; + ddag3 = 1; + ddag4 = 1; if(result == 1){ document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 2; document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; - ddag_2 = 3; } else if(result == 2){ document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 1 + " vs " + result; @@ -208,44 +209,44 @@ window.onload = function() { } function nextDDAG(){ - if(result == 1 && ddag_1 == 1){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 3; - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 3; - ddag_1 += ddag_1; + if(result == 1 && ddag1 == 1){ + document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 3; + document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 3; + ddag1 += ddag1; } - else if(result == 2 && ddag_2 == 1){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 3; - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 3; - ddag_2 += ddag_2; + else if(result == 2 && ddag2 == 1){ + document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 3; + document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 3; + ddag2 += ddag2; } - else if(result == 3 && ddag_3 == 1){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 2 + " vs " + result; - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; - ddag_3 += ddag_3; + else if(result == 3 && ddag3 == 1){ + document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 2 + " vs " + result; + document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; + ddag3 += ddag3; } else if(result == 4 && ddag_4 == 1){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 2 + " vs " + result; - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; - ddag_4 += ddag_4; + document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 2 + " vs " + result; + document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; + ddag4 += ddag4; } //final iteration - else if(result == 1 && ddag_1 == 2){ + else if(result == 1 && ddag1 == 2){ document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 4; document.getElementById("current-class").innerHTML = "Current Class: " + " Classified as " + result; document.getElementById("next").disabled = true; } - else if(result == 2 && ddag_2 == 2){ + else if(result == 2 && ddag2 == 2){ document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 4; document.getElementById("current-class").innerHTML = "Current Class: " + " Classified as " + result; document.getElementById("next").disabled = true; } - else if(result == 3 && ddag_3 == 2){ + else if(result == 3 && ddag3 == 2){ document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 4; document.getElementById("current-class").innerHTML = "Current Class: " + " Classified as " + result; document.getElementById("next").disabled = true; } - else if(result == 4 && ddag_4 == 2){ + else if(result == 4 && ddag4 == 2){ document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 3 + " vs " + result; document.getElementById("current-class").innerHTML = "Current Class: " + " Classified as " + result; document.getElementById("next").disabled = true; From ae80690bde0e66ee2061640eecd48bac95bde24d Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Tue, 25 Jun 2019 11:43:46 +0530 Subject: [PATCH 129/166] 4 classes added --- SRIP/Codes/exp4.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index d35a1754..a07dd077 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -185,7 +185,7 @@ window.onload = function() { function startDDAG(){ result = classify(); console.log(result); - ddag1 = 1; + ddag1 = 1; ddag2 = 1; ddag3 = 1; ddag4 = 1; From 3911284b8cdf28cd0f4b8674ced79ef39ec0cc43 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Tue, 25 Jun 2019 14:23:02 +0530 Subject: [PATCH 130/166] 4 datasets added --- SRIP/Codes/exp4.html | 20 ++-- SRIP/Codes/exp4.js | 230 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 215 insertions(+), 35 deletions(-) diff --git a/SRIP/Codes/exp4.html b/SRIP/Codes/exp4.html index 46f6e5c5..df4440e8 100644 --- a/SRIP/Codes/exp4.html +++ b/SRIP/Codes/exp4.html @@ -17,16 +17,16 @@

Load Custom Datasets

-

Class 1 - - -

+

Class: + + +

diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index a07dd077..d90dc882 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -1,25 +1,25 @@ window.onload = function() { var loadDataset = 0; //first dataset - var series11 = [{x: 0.3, y: 0.2}, {x: 0.4, y: 0.3}]; - var series12 = [{x: -0.4, y: -0.3}, {x: -0.3, y: -0.2}]; - var series13 = [{x: 0.2, y: -0.4}, {x: 0.3, y: -0.2}]; - var series14 = [{x: -0.4, y: 0.6}, {x: -0.7, y: 0.3}]; + var series11 = [{x: 1, y: 3}, {x: 2, y: 2}]; + var series12 = [{x: 4, y: 10}, {x: 5, y: 10.5}]; + var series13 = [{x: 7, y: 6}, {x: 7, y: 7}]; + var series14 = [{x: 10, y: 1}, {x: 11, y: 1}]; //second dataset - var series21 = []; - var series22 = []; - var series23 = []; - var series24 = []; + var series21 = [{x: 3, y: 4}, {x: 2, y: 3}]; + var series22 = [{x: 5, y: -2}, {x: 4, y: -3}]; + var series23 = [{x: -2, y: -4}, {x: -3, y: -4}]; + var series24 = [{x: -4, y: 2}, {x: -5, y: 2}]; //third dataset - var series31 = []; - var series32 = []; - var series33 = []; - var series34 = []; + var series31 = [{x: 0.3, y: 0.2}, {x: 0.4, y: 0.3}]; + var series32 = [{x: -0.4, y: -0.3}, {x: -0.3, y: -0.2}]; + var series33 = [{x: 0.2, y: -0.4}, {x: 0.3, y: -0.2}]; + var series34 = [{x: -0.4, y: 0.6}, {x: -0.7, y: 0.3}]; //fourth dataset - var series41 = []; - var series42 = []; - var series43 = []; - var series44 = []; + var series41 = [{x: -13, y: -7}, {x: -12, y: -5}]; + var series42 = [{x: -2, y: -1}, {x: -3, y: -2}]; + var series43 = [{x: -2, y: -17}, {x: -1, y: -19}]; + var series44 = [{x: -17, y: -15}, {x: -13, y: -16}]; var ans = []; var ddag1; @@ -80,23 +80,29 @@ window.onload = function() { chart.render(); } - /*if(loadDataset == 2){ + if(loadDataset == 2){ chart.options.data[0].dataPoints = series21; chart.options.data[1].dataPoints = series22; + chart.options.data[2].dataPoints = series23; + chart.options.data[3].dataPoints = series24; chart.render(); } if(loadDataset == 3){ chart.options.data[0].dataPoints = series31; chart.options.data[1].dataPoints = series32; + chart.options.data[2].dataPoints = series33; + chart.options.data[3].dataPoints = series34; chart.render(); } if(loadDataset == 4){ chart.options.data[0].dataPoints = series41; chart.options.data[1].dataPoints = series42; + chart.options.data[2].dataPoints = series43; + chart.options.data[3].dataPoints = series44; chart.render(); - }*/ + } } function addDataPointsAndRender() { @@ -171,15 +177,189 @@ window.onload = function() { return 1; } } - /*if(loadDataset === 2){ - + +//second dataset + if(loadDataset == 2){ + var i = 0; + var j = 0; + var a1 = 0; + var b1 = 0; + var c1 = 0; + var a2 = 0; + var b2 = 0; + var c2 = 0; + var a3 = 0; + var b3 = 0; + var c3 = 0; + var a4 = 0; + var b4 = 0; + var c4 = 0; + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a1 = series21[i].x - ans[j].x; + b1 = series21[i].y - ans[j].y; + c1 += Math.sqrt((a1 * a1) + (b1 * b1)); + } + } + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a2 = series22[i].x - ans[j].x; + b2 = series22[i].y - ans[j].y; + c2 += Math.sqrt((a2 * a2) + (b2 * b2)); + } + } + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a3 = series23[i].x - ans[j].x; + b3 = series23[i].y - ans[j].y; + c3 += Math.sqrt((a3 * a3) + (b3 * b3)); + } + } + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a4 = series24[i].x - ans[j].x; + b4 = series24[i].y - ans[j].y; + c4 += Math.sqrt((a4 * a4) + (b4 * b4)); + } + } + if(c1 < c2 && c1 < c3 && c1 < c4){ + return 1; + } + else if(c2 < c1 && c2 < c3 && c2 < c4){ + return 2; + } + else if(c3 < c1 && c3 < c2 && c3 < c4){ + return 3; + } + else if(c4 < c1 && c4 < c3 && c4 < c3){ + return 4; + } + else{ + return 1; + } } - if(loadDataset === 3){ - + +//third dataset + if(loadDataset == 3){ + var i = 0; + var j = 0; + var a1 = 0; + var b1 = 0; + var c1 = 0; + var a2 = 0; + var b2 = 0; + var c2 = 0; + var a3 = 0; + var b3 = 0; + var c3 = 0; + var a4 = 0; + var b4 = 0; + var c4 = 0; + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a1 = series31[i].x - ans[j].x; + b1 = series31[i].y - ans[j].y; + c1 += Math.sqrt((a1 * a1) + (b1 * b1)); + } + } + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a2 = series32[i].x - ans[j].x; + b2 = series32[i].y - ans[j].y; + c2 += Math.sqrt((a2 * a2) + (b2 * b2)); + } + } + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a3 = series33[i].x - ans[j].x; + b3 = series33[i].y - ans[j].y; + c3 += Math.sqrt((a3 * a3) + (b3 * b3)); + } + } + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a4 = series34[i].x - ans[j].x; + b4 = series34[i].y - ans[j].y; + c4 += Math.sqrt((a4 * a4) + (b4 * b4)); + } + } + if(c1 < c2 && c1 < c3 && c1 < c4){ + return 1; + } + else if(c2 < c1 && c2 < c3 && c2 < c4){ + return 2; + } + else if(c3 < c1 && c3 < c2 && c3 < c4){ + return 3; + } + else if(c4 < c1 && c4 < c3 && c4 < c3){ + return 4; + } + else{ + return 1; + } + } + +//fourth dataset + if(loadDataset == 4){ + var i = 0; + var j = 0; + var a1 = 0; + var b1 = 0; + var c1 = 0; + var a2 = 0; + var b2 = 0; + var c2 = 0; + var a3 = 0; + var b3 = 0; + var c3 = 0; + var a4 = 0; + var b4 = 0; + var c4 = 0; + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a1 = series41[i].x - ans[j].x; + b1 = series41[i].y - ans[j].y; + c1 += Math.sqrt((a1 * a1) + (b1 * b1)); + } + } + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a2 = series42[i].x - ans[j].x; + b2 = series42[i].y - ans[j].y; + c2 += Math.sqrt((a2 * a2) + (b2 * b2)); + } + } + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a3 = series43[i].x - ans[j].x; + b3 = series43[i].y - ans[j].y; + c3 += Math.sqrt((a3 * a3) + (b3 * b3)); + } + } + for(i = 0; i<2; i++){ + for(j = 0; j < ans.length; j++){ + a4 = series44[i].x - ans[j].x; + b4 = series44[i].y - ans[j].y; + c4 += Math.sqrt((a4 * a4) + (b4 * b4)); + } + } + if(c1 < c2 && c1 < c3 && c1 < c4){ + return 1; + } + else if(c2 < c1 && c2 < c3 && c2 < c4){ + return 2; + } + else if(c3 < c1 && c3 < c2 && c3 < c4){ + return 3; + } + else if(c4 < c1 && c4 < c3 && c4 < c3){ + return 4; + } + else{ + return 1; + } } - if(loadDataset === 4){ - - }*/ } function startDDAG(){ From af4bf98bb8b7a241f65a90865a478cdb87aa8ef1 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Tue, 25 Jun 2019 14:33:36 +0530 Subject: [PATCH 131/166] some modifications done --- Project-2 Issue Number 243/Codes/exp6.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project-2 Issue Number 243/Codes/exp6.js b/Project-2 Issue Number 243/Codes/exp6.js index 3e39ffd3..417e99b0 100644 --- a/Project-2 Issue Number 243/Codes/exp6.js +++ b/Project-2 Issue Number 243/Codes/exp6.js @@ -89,7 +89,7 @@ window.onload = function() { ymeanClass2 = 0.0; var l1gammax = 0.0; var l1gammay = 0.0; - + //FINDING THE MEAN FOR X-VALUE AND Y-VALUE OF CLASS 1 for(i1 = 0; i1 < series1.length; i1++){ xmeanClass1 += series1[i1].x; From 8a28f973d8be712170ccf236201ead571056867e Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 10:32:08 +0530 Subject: [PATCH 132/166] Test cases added --- SRIP/Codes/exp4.css | 2 +- SRIP/SRIP Project 3 Documentation.pdf | Bin 37450 -> 489973 bytes SRIP/Test Cases for Project 3.pdf | Bin 0 -> 63935 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 SRIP/Test Cases for Project 3.pdf diff --git a/SRIP/Codes/exp4.css b/SRIP/Codes/exp4.css index ce778a67..d3e92b65 100644 --- a/SRIP/Codes/exp4.css +++ b/SRIP/Codes/exp4.css @@ -39,7 +39,7 @@ padding-left: 20px; background-color: #f1f1f1; -padding: 20px; +padding: 5px; margin-top: 25px; diff --git a/SRIP/SRIP Project 3 Documentation.pdf b/SRIP/SRIP Project 3 Documentation.pdf index b6966f31caccfbc7b75979596c11ec947c2c4244..8f2d8998267ec453ef3269e4c808199ce2f4fda1 100644 GIT binary patch literal 489973 zcmc$^WpE@*vn42IW>$%rnVFfHnHgKm%*;$JmRiiL7PHi1mRig#t?qZ<%siVNv)y02 zX<6YGkzP>|=NwN<_ewHFQE@sZdNvrc-lw8Z7-mKQBf!Df8itn_z#wa7Z)W6dSUI`4I9LD-k^mh52OBGZiJcjs2VhVDFtY*}!~iT@T#VmWL2>AcO2GqLGD}%eM^w1^HjnMT}gHY#l8An+};-{+lxX zj}lP%R`>rD%D)=^U-%gs8iEulz)cD&hYBSC!}QsjCs2Y;NTWkI>_W=<_k8I1zYQZo zK+M@ez8fFC{8Zo%AdUfBEzAf^j1SBY?2lQ$gd8o2hp~-2!@&Y7fyJHwzeD>ipZ^tv zLiY9!t}frYVqyEwzF64*H5~sj-!c<%uy-}H|8`;i*MULqTct+A4*zKJpJ-;|Vh3=t zvizgSZ&iPL{!fII&0HMZoK3zl`$y?Vs=cPp&TX*5fwXkbU#( zW?cdfZ~cISfEHK?1T2gIgbCH~V3GlDpM+3uHi_%pmsM$tQ_~~jKSq>QXp@Gk20NtO zn7=-x4*iSRHn+bXZr5e}hsp98EE9DVYu`T4CbmBpKX|rL`=#nsW<@$*{o5PQ-p^e7anLBf%0wD#ya;U+2IP+eoGkwdnTMvO-p zmDIpVMYE2!k9IFV@^MI1CMJ9->>JZY1M!{5VwB^cm83n;<{&P+a0iH6o|`>>*Iil8 zg<0lj*4O7FN^=5#Q}$UiobW@^05_Sjq?hTmP2$?XC_Y%4bL9l=M*F0>brLHgpx=7U zs)kTJNI7?c_Ofdd_K6dv5zBRpFC~N*lwRN|kyLbhZ3mIu=&$2ejk;(0ZGIayjvPiT z`NXJGQ6&QUWtYs)<^$Wh%xDDbku|sGTsrKnXeH z}6TTKJ9o60FkJOX0LS*T9HIOD_s^m$mk!0+&^gr`;&r4y=5G z`~+(VmO8!s1ZO5wYJx+!6YV?6s^ziOhg3=HhZi;>N4f1jQ=fqG3iHbIKLNErAE-w0 zW?h5(ch~44F@5GjLFfSKH|c+ZN=0Ps4EkLuuRoH&yB=1K5nBZ}AUj5WAlH+fzk~_p zEL#O-Hzy&gZ3lcMcosPEn`-_BP!q{x<6Q#V(UU6jJDF{t!7b?VZ;ZP7>c8xv!+`YF zu?p$I1X(}5Myp`>-Vu`rOS89tn)pBolcQ1tx!+qw#y3s+NRD#C*5Gs?>_X$pVyoGQ z8wOg}C7knkVw{U|-B$$Iuez%%t&>)(cc+?bO_Z(Lat0l|^sui_;R{W(e)-!twn7~D zsaAIJ-i%uF!uUuO==>0*#{8={XOII5K7Vw*6R`6M?Fw%t%(ps}b16NA3o;V20Ivm& ze?ChEl!L>F2Z6MZ8vp>JP=ChrR1_w`MMR~JmckZENKs)mR!51(2W5KTS*4U@FNg*2 zaWL=nhnmLKnM6t2ITWTWU%@OgRyWNNOlGAL9`QLtyfnhN;d|?9+&0=9QPD&7EF68c z0x_~!oJE7e1(IW>VJ?`TC-o8op=XU$!xokz{&@+O8BlnEW?V4->bz><@)1F_}5HtZ>;^@?n^h% zJL?1Ph)qYEyZd;r9t0xXOqNx;Nw4qv$=IR(*ESAP5Qa$_6Kd>df$dyc1wZHlx zu~3*!>GM~lES5fhEd4^MWU8d6&`q;RS_}{JP=teo<6d)7HcWwu%dHeAUK)n>>oBaB7oIk9O%wFl8 z;ikw{?otn=p25ad)wHG|7fn-_P!dzIkwWnG4^h~GLoJg=BDjX|J?IUOl&KAn8s`^s z1-OJI*G7!}bXetl&u06nZiCNYnLF3;2T&!Hz(scm?t!!}9QVL>@s#4oD#H@>DGBKO zF{DBOIMD=N5kasZsEQ8z%I#@I5EtL``pEE$o2~ z%q+0k*_|kd&5(WH$ezoUkteNm{RQq2Y&U1hAql#MCXXU6k;(+vQpJ`PE2k};DB=vq zxpQ!G^M~<*<=Zy1UMz$2L?M6*udRAo7>mHy9aXR}3ZF|v zpb9Vf*Z@M!utMY6gRdpB8)fSzvw+a%*}W9zxE2)DS5cXjwb>m}O#%O6g`Dd05vL5& z>C^N_RhS*MpTJX@%>(3R z4QYy%lq`{zRi_O&ZW}*5nukJ^#WoYb6#{3_bwKFXXC5bFJ1i_%9FwDN{0xKEaRnjA zuQgu80$+B1Pg@H+bz;$yD73*&8SRR6}E$TX$NN1+U5l6Etz zav~d^Z%iIaoWlZkJ+VAq_NYRnX;BolWUl83 z!#|%CyL>OE-N|UA7tynV72B=1FwwzhYGEQ+MyA=(Q3L$6?xPdEm#8EbmsZ^Fjloi@ zeIp3-%>T7jrJFwZr2bcY`*yL_T`DX2?w6%R zL?j<36q7w`q(&096cy=Sp?oM6p03E_cz}>9I9G{YN1nn%Iz(#~w+i~KeP5G2#{Jg( z-1swKBSWFhb~vph1lszMxGi2B6Z{OL=> z+)*c0B;|7r-J%!JON{FN_|`-1QK+C81Fn=@JPqm~NOghGKxK&(kW#e*A4@t#Jj%gZ ztB(BB%$jib1+iy;M*>WH8NMb;M# z%X-Tzl2U5x1fOwMnS6BSIWHd}OvmC8K;AbZ%`v zC$4I7i-oiQubz_IY@NC|s3-|iDt+EPM3vfa$%8J(%^H6R}nJbM0yg&$GM zwrXScWN3hc`&=VF84*U3PxWWi)-$BrUwC(zTAU;68Fl?SjrOfLhKVNJi1yzeh7|S8bGp)CtVNXJ|Ro!GI2fq4IH=8$hC>6#Ee_nn)UZZWGq)hOovF@ud ze5KNGpy`>e90Xpm?k{Wcm-tNFEc;=#%SESH9FwI)Q{=KB@EDNwF=$I3hvTT2+Y=pkW&72F6@&1I}#sd%h6e|Y!0Si0fy#o?Fe5=n^B1Z z5vPy7ta>7~iI1ZrB|o@+orao7An?Mi4K;|6=uMrqf*Obetusx*ni$R$v$2P4>C^|w z=@y<UqOP=*}fl%za7JosI&_cN(tULL=R{bJT-JcQ@j#6GC&2 zI-}tOcVi`9Wn-@S<;WP{a|blspt`U9clC+Z1j>9MfID$k$*6YQQtH+Ak5jz51EZ;$5FivQH1ixWSA1s!(EzJRv5w(sAR z`@`Zd*yMb{m;YPggZZBX{QpHh%Jf~>VPgL-^88nN%FNEe@lV<4f90p=-5x%wVow5o zWg8d1P1!ALNmKNJK+sYEFk&r$P~sLe3Y1)yB(xY3ktE_$Sb#KYDm4+Bh@g-t8d`%f zFfckAY*17M>DotbduL?d{;^ly_S4hb=gmjY>cm@KrHA=+j?2;H#uNw`P_rTk+Tq3l4q;TOyWQIhCcdg08kRB$`Ph9b=xO@%d@m^s@l>=tFFqsh7PokRf zi$K#Fi0y(i6t;rE4{By1CM95+8a`f#@e?r%pLSf1jQ!}BWd@#Y;YN)F&?IA_5Q#JG zgKcrZArs2>p5H=7V?ANTBbZiVq2CBk7kY^|MiDqb*L~1;OVbbpsX+pBO&P+G;!h+#z_!yC7c^1V>nK@-+09-A*Aljb35>T*GvVWnVtMn8a zeb=$I>$`CuTW3T7h+7r>-+#u|GEYWDeb7j@RKb}R~ z!ucSAU)07-9ts;$!mKz6Xm!N>LoTaC5&~V;!1sUJ7t?^JW26X6}J9~@I$N9 z7p6!NNMa4?Of&Z8Dgv7mOchqI5>JLPV_>9mv=fOr1hyms2SgJNyfhT%O6c|7>(6UA zCeQ_jz9-Kfmw-v1P%tW31q-=?|6#R_&I?)t*?W;3-6WN09ox8QRF$zgd~m0>^%E`A zl|--bzY=pK3Ob9}R*K7`*kx}F@l9KSY@UnoGV+4otVo_QxdxdR`*rJ;ofFq1$M4oU zad@GsuQS`T@|Wt-#OUHV)EA9iepS-wI3%}{&Y!2d(vNC0$eH&18u|ot?raF^a+u!_ zf6ljgkaOEtm`JR1Rwin*P;L_CPl@E{wFMN_JxbhLVF%kU2TCk0g|n5~(p}ft<=SFp zh?vOLrr5^r7xcW8mANhFuf-^QMwO}oF9}@ACl5VQ$i)2BtGO;HuO1wXeNN*wpG65- ziF-`m#A6VEcr~oCoT&m){;+m4n0eE}2}48&wqe>zwC+i;uK;=ZZWeWgWb$ht#BhAV z^pCQ} z_Kk3P3{DW&LHvkFqRM9xVEy-~C=aO;>agHt80{iM+)>u`LabaA{TCEHFpYgRhU`IG zx{(&dHg$I=pa_LdqM3oz#Ujrk12!Oc%MIVoe`wBJhJsU$)~G2E5grMX=rTb4&O@Ce zh2!EU2^uyUvnpdGBQOt=IJk#GMT-8bE<8~ zYeqXHg+BX=nu!hY0sYW)Sgi5F`lM-=OG#c|#s5pvcNHk^+?@@0`i0T@km)Yivl;CY z^?|;t^BV12b7o;j_*LkC%Q@`QkViR~54^z=G7a!C!Z{aD?^7S*eg$tf%Qd843xPP& zvXr1F&WknV*&tcSjj(SU;UHT;j`dRU1ZRRBgiq`VTSbm5zFJ0;Cpp?{GLYzyIfn(a z#I+=+{JzUqi*~7Gd$5S=e5LrYlz6tW^*~C4jr~%L?YlTkoSCZcHh-r-pa3y*Y7a0b zzgLkTdHETBD(`b-=VVKfdljhkRVnZVeLz|=&I?E4c!yifKm6+KSP!2%0awzFuBlVO7+K*+_SDa7?>NLR4-ht-ow*MSBrKD*q z4e7L3=;iZ!>-sF`+yrOXh|%V%NDd!0iUXP%zKvMluQFkj5WFEj>VBzn`keO{6tL`5 zpYR3I8nKV2>DbANERb4V;cTBa4(xcAS~Lrxq*+-RL;=?FKz8MbL93W>hbRFXZE=q z+3U7nqG|K_lKI5}>~_q#M>jP0wP^=ULt+~uwHnEC5`Iub_yYY(@zie{fYVI2R2hLe zhwvc!N>#S|7r#1w)?_utYA}%>Qt^Q&jKc7h!YG6?KHLqtmlQT%Te@yr==t-%9( zAACv$F3-Tj&lZ5V(KF@{3Dzgd>6xU4@e5)77G6pC;0qfl6F;^S(7u52JFut$9D{_l z$R8vlG0pl<7~tLb_X+;{FOS!mxA?ELq8Vnew^I}geaZ6ep77^7s|%k`NbfiOV)xH4 z)b7*C9d?`}(96so@!q=gqwbmB_5DTVoSB`eoo->a6P3RqgmgYyy8;uRCLzDyIM(8a z-GPg&E3b1yzo>mIc6*8S;#~uUlin6&&hNx}1@)CpIZZ=>+&p58Bo{E-Ix;zf(MJnr z@yru4O|iXlswvD4;GpL~UNQK@drd=_%FOlIgHs!aZTWu0pLt?#`Ye{;W%?-fVC4^{AK08s+#fy@T&F%C zJ!3p$yyacjJlWl)zES%^`bhX(J%YEyYedXwD`(j z=l&)xVFPWWf%y26`&9Y+(eG8(UGfMVzZ)3XaSMQ()B$E|^BDNP#x#az0<~km&=poDe@k3 z+(+=EI+34JPucG8^;LQ*eB@uMZ?O-p52+8O519_#54{hyb$fd>nv)zoeuqJAl1nm`A=&_X$BK0S#0HE65;!}&=Ur<3B-Jz4tBy^UnXiE z`>({WTfcfa>v5iLr!Bt6bKyHgGJ6sn_35$$srR)qBBl)xdm^w8in}69C)PCWLbt*6 z_Mv##w9lLYH{{-NU!ybs;qO6IsC)1hItckZIr_Y(ECgzspoCgW) zqAE*cByO4_uF2>Vp^GZOnG#l#iW?J~8wcK9qc#|* zVs%MY#t9D;ZZX@1lqJzC$=OIHarU?&QWT}J4^@j`s!FJ<%5df*tSjUGRtDl!MrKup zYFnXM$=WT-D@)(p!|nR6&#@m6POtNP^1}^<7jrn={qUXD^^~ z1=gd?BxUIyFmG71rO%$hXe6`6{t?7Ctln_!c<2*oXRfp6-V%Ia`eT*=E86JX3vA)hg%TF+5xOh53)q z+`7E;ent6D_3mOmi+$34#To2v-w{5?zf<^SeofY0|9r>%r1^?9*zZkt7z6jq{p$ZZ z@V~+Bf^iq-q9e9L&ZX40+cupIti#;2+9oa-Zj zc!TW-q~33~IElIAlmt5=X~Ue!8+JB~Y6_#8aC*S}k{N%D`b?`o38N|CPIxv0^Mc18 zsj%zvV#*({aCr9u(vy&WE9S%GA0aTFeqHK=T{{*(Zgb1>u61v%`6+k_9^*O*&P(c~9D{d>q>WHPyem*wB)@NxlW z6Z7$E35%Ib9*57M(9&oO2CWX;7n68_n*$Y^JpFd-2bLNBR`ZLF2i&~v=YePjyFXoK zH0v!NhxleZ6CM{^O;4#&zNv4BU9W%oMd}Fs_Q$d%w!Pn0Z#=g6Znnmsc7qWGUZ0ay z^8FrPFw19rydF33w{POEJV!mc_Ib8$@UNcZJbXrZdiKAEd++c;Yjhx;bv9EM8pYi2 zs>?F5Pvz#7aXG9r<_r9s`Fa_~vrn8lbD-m%+g39yJL!H~GiAp>bj$x#`k4X~$s%1~ z)YGb$*g0vSI`Xmgc!@O2WeLty85Bi079Ul<=j_0DuWcH%KT$@f1I zjqb@3DMy%xyZi3eYRv<-j-M=QIEbc;YfT=7>({=m10JV|WjgAvXA5rO+- zekIz(n%;geOXM`+NE1!~9Ly#aei$2DtIS?U)!Le9UhIQ;Je=S7^vZHQx+~qkgUw8l zRBV^!1A&+=PZ}t66Dq9DVT&-@=(h=ut@H;G!T1 zqjJnIUPAV|C<+K}L{dwtwP&{t7h*JB1i)5W5Q7n!Bl3%@MW495guT4hI}wx2tF`N_ zDYf$5?JI`7lg(c=n%Ve^V{LHY1>f6~$MtMwCD%Y3ZPzY5uXSkPW$NsfxRBXqy@xhW zT$nX)yqz-T;|wNR(m)UUX;&bWc2R^Tg*ru=E3|DrH8biGdK;FNV8&molGs&kF=>2z ziFlLNCehiZ>yYk7r=y(4Y}M$p9N+tqhHhyiDZB{7zTP*aU`S-9hrnZ<`6M*!bkHBY zP-F@mW^V#ytg)pC=(hnU6-sxhp%1BU03lIsEKZAvh=%r`=`(u`ZB_0HVpZnVGj=bT zr@6s<$J4g=BJKW4C^h;h2AkG4ATPF{X3NDtu;Li-8c0N7pqN`K$a+Yi$P-95$T00W zlGxE1k(?22)W=|&t}px8fiR@erj0g>pr_8RikyFX72_`dsvwo+c7$5#zd1Hw>>A54 z501yKhgfxo8CltiS5NvYiX!i88*j=^M<| z8ItqG;}{P8pf{%51MHFR!3Yb@?7Jbzl>o30v$}e9ptlx(!}2BuC)zT#8c-?|EwJND@qLuo#ShMl!?^-lPmh4 z)~bo|yM-h-k=%F}kudshKOl_1TRm@MC|12bJ!sEwLSZBf~$E0pA*KhgBP?9 z)*Wbk55a!`?-PK0^$+_Z5i}7}5xPTyL$X8YA;Oo_=wP7@iS(BV zJZU(mu9(Qh4m+t4>EYfW(B$D%!>))rM*wk((>*vYD~#1)`fX$NOsCeCC&Z6@{}Z82 zZMpP$vxETD243Ox)UVW?Dge#I$D3Y_-GP;(a|(A7yx*S4AH1kTPZh@suqiOe%_!FH zjXB((*b^V{dZ|MI>kGG!!?vB*EhQl)&+&%shsw^NWakx%j7GP*Gm}x_m4-za^fJ6_ z4J6W3`}Pxl373_}edjr?jE0U4Hj#wxS_wRlPH~=t7^B@7;9)FSEWOQ-58bDoyIZ_q zy+C81BYllplK>hD-Kxrprj^t%JxORtTtka9o&)i2`Io@%M(VK$L6JikGXpbBGZwRs z#=`kxS1Qz$o8OeFVrI(Ns@$pKrOH&Qx?*YtQB_d6h$RuAJCvbPNH@8_Ai4ZT? z#zrd1U90GpHg}Sm|8daHsGQ`KZuTbB{dY*cqf z4hN0q#CJwUfkbGJ2p$?2^ZwE!Wm7ga(n}0=mWg@S8$qTo7BKj(h7(Mbytn2X*(ocJ z)uw@qd{^!S6FK~`iYjd94v?A5$bvU7b46f?al!oOc8Ey8@L8*?`*>*UY$G^kx|__t z{KqaC8g;zy+=aj1^L#xX5#c6i9I!1jukcee>d!7~GqqZqf7RF4OxAu~*VpbDWfs+R zHhmKD$e3=^{rQbzXBOFViLgP}3f>swanY#)ZU-}ak#b63wN%iBG5iDO&#K(M_V~d1 zJSq!GPf|3)qtzVj%5I!|Jd#$dHitD`qhh&envm@yu@)1Hw)Y;*c$s7xbn?^|djhkQ z@(pRkIAJE{r$!8+Y!;^!Bd?DF)n`6`Mtb~POV?f`5dLqR`xC{qXunJOQWTZwp@iSs zi)B{7UQX=8P;pI+VH3wR^@I}BNah#+O7{Eben}z!QMVL=-t3JA%P}QJ!>nhv2+u>4 z6Pk(8(2KlG(jA#ym`Ey z7-fUWjD#8uei@BO9s6WPugRqB&A7@&e6=QLyI^S-pezL_=cMHK-$`uyIY~7e=6wQG zO(9K8C|QY#CCYucix0c0kc21FNMe%W_U!!Zeqro2$hnC_xV0dx6C+q1YGHoqjIc!k z^0Ft4dOz1~n>Qj@eJTp=3!ZGiQguS|?DZ`Cc_3t&At9%05b6PvTz@%Y@RcN7=JcOE zl|01M&^SXXNVEYcP59Ijs`hN}lFvfar&ij+evKLx_+H&{+pzgQ%xy~QW;Va# z){n~geB*h?I$o*7M4tSneb_gHEZ2Bl^7ov|98~1-Nh$}pf6@?2W@hWwl6_dd6uF=z z_<%L&H?BD!AE8L1$pd4L~?dzSr_bse3wAxM#qaLeYY;`R%L; zj2qpZHIuggE8KT@|5=Jan7>?xrsUT=xz$fs%`OEM{wSH(&ZU_Z)(S4%ke#5NC_^tt zj}w~uUA#TxK%EM_^AA9m_^wZ#VB|V5Au|3geH<&GMpEKnQjj?+h60g@;y7XH0KEN* zAsKY6RAC(byeW_SfS;pG&IRW zPXF)K&hI>(t#i8S2F3~A<3{xInCji0KS5#7=Go(&r?U4x&Q+;UDMo2hMU~P|h@vdD z@n>Upqhh;kyT(gHm1IuQ0Dkp}(&Z}#x*8iA%Xizn@+=9Y*T0hEXqMO2bBM zpJX8k%L#fY!tcm;kA(xdv=Nn6o@;O(i4-5coFg0*Ir@ckO^uWw4KJEX2G7-|Yi3*p zfM?HK2cOk1JO+2oRB0WGNRt!YXzt#jNA_~KIwN9+erU|zYf+ueFJ<}uf2 z1bxw(3I@Ik%Yynu6IW7(QuRh$%5B=uyi8JLanA#Cbo;9L8{YpXNMR89;G>-)5>h~q+jJnK7&D=omxrQDmnBK_hp<#o; zg`_m3;q@k`zBOBU%DBhuz)tPnf)mS4o|-z4GQ z16C$x5wxY=3RC=H_y8QuocGYu9?aUSYK&MP3$UEO^BY2ctP+huxtH;XT&!~9U2&aY zcvBq^<6t3s19kKPdkRtY1I(mL0wF*7EYW~q_u6ieBxav~wL_=w)o~+nMc4uTZUt5) z0a`q4YcUC@^v5zko$r0%F=kZc7{H zhekS%GsFuhCK3dB9FAP{qK13g2a1$}^2uwZ5S));{A-kXVDZI=0|zA8{|fKqW_yn+ zNd3q}2VXGG9pGxqQ_Lkuep`b5Sce@a0Q>X9vD{(Z>gngOG|RY#MEP&csX!C;%e8faKM?)drA`SA`dluz1hDKN<91(WgVdZlr8np((UB4p8y7)Lj)*y7dnI;Zq< z*<+E3qNvr^_9@mZ{5(T!be*zFyusjNzR4U$6@!o#-k#N}B$!Ty#Svz4*4VkQYJq-) zo?F0Ckjb_1XL^uPtdaEGlE*BYwimbHIr2QQ=b?%sI4E@2>Enl4#W==v*FL9|FG$`a zA6k&QuFp*qpNT8awqsa7wY8|sPO~=WIpMi1emH@C+x67O_F#>QvsJe$Cn*j$n>DH| z@euzqZ`KnRz`QVZKvh`SYt&mL%s(ibtw?NAGKq!QyLbf4Ubpw?q+yFKV$Bl&d?ioP z+FlE?+CL`qghbOC)mqWgs$w%NU1ouvFqV`Bzrb`HYH^l#q(}%knmR+&ET?#NlY?kW z73HF~dH)>|f~L=|N7Lna;Y@@AXArOfo9@Ce!@(-gRA5R8&vgeMl;M2v{l>oXa~)xX zVm`=mO7SZ2eUy zQ#MXswVVN^xmX05^(!WV0LzFD*O0XhZn1vqcIHB-+i<%2c$8+4z^*mZa*9@UeyH=W zT((<*L3wh&{Q>XG-@YF7(hvUXs+YavojM`(mL4+Cw8=2kg23q?td`=f)YOtI0r~ZK z(ve{Y0b$HB0Y&YNVwhM^CPw7dB5`#KwU{6tHP?T@7tC0N$4uAIG6z~Jq_iO#xupxM zSE{v^w@~%oN-T<1bFg~HwyE4_eOK*ml!YYbm@4YvK^yi@IK_Dq)$v+2>YdO{cF)3ZzZJ@HIc;%nGy6sRB1k+*xRhSq(~`9KW-VNugZA)RfY&)ky+ zqbuP{!f8Q{<p2RYPjiR9YW@&3e_7&_bD<_!u&3OqRno!^VulC23d27QQUU zwfrzyA9-qiY<-BoAP~^z(&ia@4X|^yReD$D7Gu)lnc_5PP;MV^r9Fc6mUfc<@dpd@ z_&_;Dr7oUc9g=rzl9dhkmz3Pngx-;H1r$CE7UL2;@cAF-W1VPI_R<1T^f(3NNtAQq z(EUQBtY}0bO*srB;ByQ#`Zan@IpOsw@@61uvAQ|JnrvPEhN+79Wq;m>2H)&*h3zh{ zk^3L8rxGE_oh|Si=y1Nsa1h(8J-6t$y4R;P8skvRe~%OIhIDg8Ak>H)SQYUcn*z3S zxUyzSCQhi)w?`sz&``{*BTp!~Y7^h=kx4*^?BH)QlgZb^RC2qrAssJfsKN|8N$92wB9}W46;4*};mKaHs?ElB zc4S1h2MwLi@f4Ffs?UA^lN55xIo(UF5;EnR3gm*@GbSDZ=Xxp7<4catXQnJjXNB|( zH|Fj_qkjrVAt|p-3Dp%|2dxp0#I^n*BdV@b#k#EinzADe5V zO3~HI6)X0gsq1O9S{jV!mwD9sdfzENd+Kua6!AZPyr^*r!^?6y*!w8X_iS18zP%%C zdD?U~+z%3xOGxe(*>>h}W(MbnA(ip&@^}L+Q&JMSNWNDoK01{t z#u(`>Sdp|R?}@8K_Yay$9s0R~++P61Z!3Uo&@z`?*6GHL8(&$1OOzG|MY@)Q5Xp0P zMmG$)X|lPfS48_b!M#JV!|_t-?^T=uGvCGgNTN*T*GWJo@z%=BS`CQ5s$L4WL5^)x z$5M~NIWTai&f@AHVZ*Bx(E`^lJn4TqTO9fMfAT>sjR-i-)Zz zX|YL)n2s)!!{XSmQYW84*Zb_v+!La&tJn2><%)=@`()LNS-iXf;jb|M`>_Ox<4LD0 zFB{L7*}xfg_nwY>#p@@BhS9y&2iZ0RYeB>nkSSVUHxk#MZrN_5uF4Y2N?)WF7%6nK zR2jVfen+0)Q%T9uG37fJpHy74eoGhH-bGkpdG*n@}25)J7-NFnyQ)0`j z!j2UtIj@)SMs|A%7ZeU}tAs9vrm1Go+Mdmw&yCZltYHd+aFWd>FSVjk(!-9*8?S26 zs$SlQFiGjhF=PCz^a-LKJYoflwY(c;%LrjRWbUG=C}+Ure4Cgcr@9r8&V%oLC%B-w zAiKbf%29|nGUkjW0vJIPF-hyBgOpTZOe$B5%1+09d{5@>uumQBB~zyDpbT$MS0aX; zg3|S4nABjCPfTbB*!-%VHTBt@3W}V!d|2g$BSW!OlHSdH@?L8B8z|x7V6b7~bbC~K zf0w1vG3j-Vq$H>7d~t!JY)q}^YC8D$mcHHnb>jQ=?$7=+!mbC+7q5mYH(~ofiutGo zz$uV_W8=uYeh1Jou+MDH%rEd|!K)#t#WupZDX7XhPpVD1a!nAX zWR*Lw{o!LSsdOEWD8n!Vz#nsMe0h)y|Jh5sp{&?oei(;uEQcMUZIiAqoQsdih&P8C z_f-+~Q;8(BU7s%~337dMt=wsO^T6&>>)XSmN za0_?c2u8iq`YpMezMQ9uYch7LDQ1~|oMv$ZXNZ{bfTt_V*Vfr$rcEE3&7$1AW0Pfq z(muiS<4z%=czk9rsprStOz;XJF0aFVL_6#iVNZeB+aaI1-Jj2s$#hMhkJRF2Unl#` z4}}#6Pt*QDBqV3cwX>4r2(Bhbg#U}Na|qIf3A*&{?%TF)Teof7wr$(C&9`mawr$%s z=9`Jx{4twZRYcV?t19AT=E*06uatAi!Xph`3U9js^4StUa*X>XO^!7ad`lZRL{SEn zBl{QuRE&=e)iD6-*Q}fBAR-Q(IcBGfyX?+a%-Rj%bMDv#lw4N1H@JpA1k#wtt{?TG z@fL0=2_=|%dCzEQv}|FteIRV0H8r;=884YYR>n}};0vg`td2UC7E+E+%$6D(RH|-n zQCZyp-cDgVyPLKT%(}uu^s9>c3Hf&x%5y_jJeVV3Y1kp^;QXoW{NCAqtInNMlWmOu z696reh4}#Uk5{$$NWa32HK@lI#i4-d3c{TyA{QrZBqb^RZ06oQo1yPL-<1EUjAZc- z8>eJpSMw?H!+H2x*ipLW5$*Uh&N{a)!{nv2v7MB?uS4ld^l1AC|BNrtCQ=lsYBDjU(Ek{*p|yhCX>;@S~1#P->E($=zZPm%?F2O zUeS0Eyfy9Fl|cwl_adwQf;fPM7G*9-52_F^iIjj^x1XmwD?5xiFBhpufEKY`TVerd znZHXuWqz{+rd_mWVWle-q_PVK3l%9+IAJPLI7w|awj^~>$mB=1w9!LImt-XrIZ&k) z1V%xZ@)vyY5%^r>C7LL-H~d9TLk%QXx~cibXB}Fyk#z;c`8QSE#64t3Q!m41hh#*L zB}jA1X%rNXkw=vBLWe2Q0)7qcGY<`A(&&YxZDqHPx1gEa=%cRT=$Id|M~j5L#R(xE zWyE4JVsSF)Lns@%gfd#h!kEljeSO@Vh?OX*=YK=y@&q@b#)9udbhjuxGQu=?ru5_h z#{UjMHeM&IS!Sz#v%eZDbP9-tD!S%laUf3SeT|2ED5cNpDAi3qWG407%Vh-(o$9AS*aDqB63h_j}# zzkaSF^s~8UE7Ui1IJJn&NypxjXu$UZNcfhP;-7W#ywxaMNS(2>yFZLc_3xbsoNs2a zjQ{=&+x?pFp-`WJHBleXqc_>>^_9eDQ>7?EMn?r$F3HlCB^%D*kV%y^kawk?JRyBsL(L7pg>EWSHe^c#Q9@+bK=XZyzeXw{D+@&yczG*))07*(WYk4QUh}Ji>*dn2=0HvXrjx z`H=>(g=3S39bC8dsv*h+Xe}<7cMC{g%uS3UEs5aP3TSXpNhhZ`7Z@i4Z)-nk+FW1h z7M`Cp1@T^Q?_hSgTyOR%b59;2eXK{8RsXqRmvis|-0?B*)+rUcyxfPAEDj|(U9uKU z`ZtLC`J}*15F69SW6HQ98l++S?Lyi+cp(;T5|3W!W*ud8q{KNw~LJ-qn6@!X6};ad0tJ7!7Pee7-VYm zNq6@!$k>NkNNc|(lc?BDI7>|y<04G}*HBIB<0b>i4PT3@v4g7#G_)}~aIm%p}B*8eBBZr2E|Dls`hr3cUKhlM#M>iK*7 zs^pcPjt_zHZvIs)`^JbKucCES581$~cWOpeZApI3^*5;5-Zhllf4S7pICG$G}N##mD3~jR&YoH`f6dY1{oN9SX0F*!9SSu-HZiQ1Ez?6<3`RvNrzl2 zi!8XO;?-c2du@p=ce!@Cj;Z2(J;%oSX!v|H{uT;-_e@EZtg!ZB7DC?$*gp|pme?K1 z*N{-FN1Z^ekhvl)9uSNH6Ur1WB#Ef7x636fXDC~6VRI!1(wPjX zCMXjzmIvByn4m3SQo}hwI~m%aJ#fbDw{?t#2x>n&IStL*Zli|v_^W@P@)6bkh}(Pq z=$`0->Xbn#1C-9da}w3w;Y>KEq(-;_ihei$%!MtDcYp77Ee^*iWI7uEvOLX zvlXP)mdX}!E?KRDlqRZwI}HVwb*4j+VavoKD>wJ67fYK&tmtR(_ag>ii1*+DohkvY z>oE9rtvW4K@py10X4J?=$Azce^%&Cd;35@l-UQXprqr+s5S8J2n^wd6g6!%30$C70 z?Te{CmsuR^RcQGT$Of9>@9V7?)!vny;a3^MW<*w!6_Rsm7=e{zX$zzJ{_g3R6p_q{ z6iUj<-p=0Kr(}4=F)JgF)AL@iVz4xvoMgEj$iOFbD|GV#Z9R&5F8E6HkNj4>X90}e zhaW@qk-8!>^|B*0veg?W=(oiOl1So#^Yrehmu>5eR4BRg)1y;oXc{tm5~l+a@ixAx zkW35x*%I@NfrQ3D7B6rXtuAi%xBW@|6Eb#5!E$m*Z{@puFS>V1p4riav$$|Q_9xo* z+qtb0y{mzKf8`RTk$R)d^B{DC>(qv_gIHKLF*LXvf336dygKkmUASKUfgwqZ z`p*}zAV@Kb@vVMWFw)tUL-=%0BBez>bk+(_>E$W{(Tk-Egxym1RW`T&Wb@DkqW(yCJT~1WyLO>GA&#$Q_?yp zC!eWNP@f{}mW@=XyqA{c$gG-y|6f@bI_>ssOc50^J1^+LB;n0H@^KZZ(wiZxR+ot8G(JL$dwlQBPY zXxKDMA%O-$s4u}rGFq?=!6j3HpoH8JBI>4Wc@j%08@HBQ=|Od;F*g;@!)@a}j+6BD z0;9vVZ8gXT%Y)NfWMx)o{{8$k$U@O1t+kZbi>g0u$wSee+k(l=!Ku2z6lroS)AJSL zT}JeG&h1O=X<~r@!`&4Edmw6Ec*f^Bv%y+SYejdRk#IL9ZK*~VUN!$JZ;sppupD3Y zN9el`ttI?laE`BZ_~zSsXnEA{qOtVA#sU>#Bh&Cm2#)No~5>7 zX4b#W*EZh}hmh%WDWUTO;&JZp63<7(sP8b`4U6?6BAXsf+}LfYunLyQIaTk7L(_cVXq0$F4DF}{J4 zn*8C;t$o^iYA7~9`2k5pJP*m$oI#D{ZAIM-^gPS5HpSNpN$=%U^>>H3(teJT6+=K8 z*dgin%Qc%XvSJ-xb;TV~p}sf&A=}HbkIJa>7F{YF7aeX!S8)YyuNuqxTY>X<*%A;- z6fs|zAntK#h%J}HX6J@Qf=_n$(9D(Rx)8d{vbvg*IkFYpjD#e>etBL73R`jgFCZ1c zIc@+<`6b!7bbKlb4jxw3=S%l)q;1g6&hKbRx4gmgG_C*QG!5zdwMxq6y`Lute$tN9 z!RK#z&KK+cYadTJlEt6#sZxpM;`2ynXcg$?NtZBZH5bj+n#x#5=TL{*V%N$dil@kV zK4&G$NJR;mvZrpXpq&W@R7_Eog4d0ss~RfB0?nEMc0wQ?SQ0b%B4bP)DN0mI)7B-G z0*f;MO&Xkp8YyIVGH7R$NY;Svg!?_3+<%E1-*YT;2pgTpm$0LRk(wb<1{HEN=-|%m()qkurR(-%sYb1g4DV0aTVnB z%FnAW%uh`))XKH$u@6QSa_?ppv#_N! zyZ2HRQlWOVu*0{Sl@V`@f+Z{&RiZ(xRvi4%W)GCY+U`QYd7WDppmhY-I|( zOVJn4wzyFX=NPiwM#-Abo;h&J<*bHLv9V5D81R#12R;gBS7U?B{%2${e8HbVn zqV-(*7nYnBhGaA-b8UpI6RvB-C+x+K&24M4EFp~OM)c^qbVK~7Uj`lxe7dhX;v=zi`$PRo&_<|AL#@C!g^cb4^YQv_;_3A@IW?Dm-a^5X0((WQ> z3p;PtDu&*yGcy3kusd;hQ0-W2YC0Mi0NYxjQx%%mlMa`0>8;PFy%S&^~mHj4ka>!ct9MvVYpy<*Q*BfC|)#u9J=*z5@8_Sp^4|Z$9Pnu#( zuN6zQ78@Bim={)F##9= zp2|HzZxpIxO@KUg`bPD#>}pc=^YS1ny^^|w3cOd6`LD9Hz)Mz5B!i5?tu)(o`W2adE1!W^s|X~let zZ4hfwRm_1%2(gG5^sy-onbCftl4}#?;RToJ=La>2X?#I zoFlm0sl`KS5)srZRw}WFE)KDlR@uz`I|Z~K>a`MIM{eYJk-V7Rg*Ma1E4aBFL^=%>u~^5ZPS#;JAHA?%R8fnzYOykyG}!dq zq+ip1YEhh2O9JebEEP?iJIJX_^}p+%Equf(2v_T->Q)e##I0btVANoy^zG};pgKtP z<2eAd1N|*EH2@hV1e_<%L8}N8J3~L(T{EYGX28z9@xfHk9W_fr6+llWmZj+ zuFUnM4J{W0h9y8>Fi=Zo6i*U4me=lP><0mn<)T@)+D(9QJIjBeg<5alo3?d~SA z*j(>grVW1aqQ41pFYn|wY~V~E&akd0o=o1CqWRWk};KH7Zpa1oHf|}Xm&E&5!M%rCvLs=6i&ZLvD zq&$#PuBx0A(5V#=56+J;&NOcon;T5mpANY+xkXbeqh5SsL0^L$h?e8c#WC=j`!U?a zUpj50&+85O+I&-fl&;w!&2$RZsJA9tO2gDT>x6-4bz>KpzmVdc3I`v+9F9 zK)KDlTNs(71O8z)3+ufOAmZ}{j(&BY7vpb*d8Hw{BU>>#OZooRteltXB)`JxGV&&P zyQ~BkU7XU5li7J0C>q}^n#kNubJ1|^Vs|HXzu;&%(61FC-|_f8gKT2b5lUM#N&aAG zM{LuoCZ-e9vf4buTfv(bSt&R(J7czP_ARt9%9bsTTaGRuUZ=1~w9W1j{w=VL^Q<+E zlQmnNUi1;lAauxgsB$Ptz>Gjxd9ipnS4NBuIutv;s6MZ@z4rlE{CggQ(feTmtrjcuRasytP z7PE6K1z%h41gp8E3I^#znU8Dvm*49iT5+9R$+SJ*qxSHTd-U4AqpifQrhK7Wth1Rd zDKoIYCnOU2|7}9#G#mMRoq_MXoh|K)DKu;lrp=6-84EVFSW>KhK4pAxcQ5^`C@+M+ zEm0N=+vfk5WM0Xg2Ys2Es^*b zc|mI`?*W-!ZH=K%kHKsrBbH26wE#n*Er}T?*ki`_AzS=3 zHDm&x5;;L)W|M0o!Bx&x&Q%Ic*1oHWN~AQ($$5Yp0CMwCv#Y3wwAQ2Nz2Nz zZ9Z0Whv(;Go_>cXko(eq<4kzGfpB&PEVQG~pzv4DY8Mz!#f7e8WykBq>SgN6!x+ya zK4+99Aee+CARfacJ}sPt{|{&cr?hKgK!!9EGoi2ofOjsHs(F-n?d9O|jlG41Uzwk$ zr25%vS@*6f7w?(sO+s#YWx|58HI=OWSJP|O7-4hA>6UP6=U3OO+OPVz{^$AE>)Xo| zchlrNaYe($wUU(ZTvb7YN;N}rbu*REYvvf*NxM3LBLrH9`Vk$i#?=O@iV~*t;C+AK z`s=03X^NvavTM!Y@mY-?puT_~)olAq7O)TVhBhV_31 zM;S2_h71MPL!fXm3Vt|Bz0l-D%MYdz0O8vOH z+kHscwexz0K?kOlzgIE-O3tU&Y!>^x|9Pvu^vZt!cdL&3Iv8U)3@*&no#YB)3G@O4 z(8s^0HPLD#w?5>pm16Uc0dEgDxTE6hpoD0Cgeq1L^OSKJk8SipoOiE3m(nf#5tL(y z>DA!F`06hEUFHcgLtA~T3H`%!3Ev$NUx@S!Clyg+fH0q2iglakr)g4sK*CfrYH>~J zu1r=J$sI8jMa2=7fc%!CZx3sFqZwK)$dD8}$HWPH{D<}obxMc{_EG#~761ai_1m=#54~mDXkdhoVG7?EH&!3jck~GH-3$Bd)a8n9GjS=spzV-x1Ip740Ol4 zGN3I}HPcdQGTK{=ucyioC?lr20H$WsTq*b|Uo}^alBKhgr?>`iu_~w?pqBm0u!0JP zy{-ig&cKM*9UM(_it1I@dKXRh=+WI5BGw^64HvI zj^8r_x3pa$y{1OyyLue;^2f<#!0DLmIgG|TIep8 zy+)^D-tivcKFfM=&>uo(V$;jN!;GIV`!|*%gl#;gRzGAx<~@yDKWh-zHczXAM0AQT zPtR~L)uI$(@F zU1z1m@Qnt6=;0V&;`ayDEhZ+$p_jw=%NtM4;RiSUODRseW~ACVny!hjDY5Y{ZJK>d zDia+W;#yNC4hxlR7999W^})C$5*lj!&b>*<=Y-g(!-iHA`PG`{+b&(}#--fq)w&lj)l;(M5`#=1-u_FdjL@_PTE zUGM{_FHf(6A#Mww`po?mr>nZDcGpQsz;wo7jU>`pHfB)cq#(38w=bD9SMnXsUpDW? zCYZLt+0@#Euyw+B+!rBT_v}#a5Dl+z?6PO zAWoZ`juz5&^!$zA7{Dg?ES_5wurg%>$5wD3d&UbBi9`2%bl*4w(#+vHB9HO&s_QF@ z?PQfVOOX~MhC<^9-1GTyw}bY6{TvOpYQ}yai*R$c+Z1F`_BbSVY1w0!2{13;@Q5XV zq7|RKkARskY9DIzjk2d6bpfa)1SgXZAQj$3;p4ZAi~{LVFMGO~ zbUV*gd~L0N(Ep%75tP)^gv${~f0>kEAleuxy#KpWME0rN(m$5pzJ(Pot$bqO(Bak?1XkclY_{6uTka!G5Ya8-|Uy+i)Fl zpr!kX|Lfgmy=VgR%it>Ws?w?19{IUhyX!q&Z(~kch3y+6ZTd3X9pA#!Y; zg?K*DAeaZ)iin)1qt?}>lqjMRuc2FQ|L_8Q6|X}!DDDU%jaRYg@i>LR7G}_ikLh_E z8m3nMuvS&AR+PI(h39TM-Zv4NMXorN^L-!k+RZ4?;Efi~1 zBp*uQAK3Ibd2H>y=(xViYI{x1d77lSGe3T-vnFTpbm}w`xYL#lvu#3#U)E(5jqlYB zes5Ga+xLkTIXNGXr}=A67~F3CC&J-K%BywOm;QlS?>kg(fQ?<(&qx-Z?>Ebt=c{ot zHBe7m-y|2_2f0X2wQfa?d^_ky*$9dib4o)&Xjf>#WE5CacjnrK6>Zysn@K;|y{1W$ zol-xVLnV^RVNW&a;l?b_?fdTJ?|bxO?jp0Sg;Hi~bfs$LV%eTn`7pyuiEyqC@ zH`7FqNA4rk>_|!Stig)yxaOTzx77$*A#%G7cf0Dxdz;NXU!ojNcFg9kr{(3!SLtgn z=ZCM=8p|B^S>BgMHC?~U=T%?G3LkLxzqP=<*=H?tq%O8qj&0Fa2WSpC+VE*7?&Fk_ z1;$QXq}YZc*2Td@8WkJVhV{x$Mr=wKUzNV;R_oLnd@%n#8;QhY;W5kcE*Sr%yqlIq zoWL5A^?f#qf81U`rh~X~+GslV*Dh%~zVD=~9;WuF@bJ3xAHv5Cpll@Mz5*+spa@d< z!S}0&twL-L#kmWr=aLori7?o%h&aobq_bHEK>|@xKo5-6AXN?YTvv;;* zJL*>z9(gCfZ=(mLiNcgP72KLPhmh8A?jM(F^K}YUFw~66RjLPeD;ot~hi~X85NKfB zfJ>0szp>!%V)^Xx5ZN&H!vS6((tDt$xI<0h!VpyBFY@=0cOZ5D{m72)Ylk)k-Ga0n}B^Xs3r?5By`-c2GD5H9REAvw@kj=q=glA!f&H@v5i@wL5bR zJAE|fYwLag$}kQci&D5G`6V+XxC+@u_6>_RkPrQ!3gE6!Msw6Dl)ip zWd1&4j?gJ{c!^>LE27FS7k8+n(l=XxidP^()tRv3n7Z#Z4C$)+OHNuxvLoYkS4c{n zRJH>vSD_&`niu)agZRMkR(h_|9fZLniMf6}hfG9HXohyhdd}+-eI>-WVNKAmAGLj! z;BKCR^}b*H#D+YY`4m2$q_J{}r6@a(qSdz6?7gJntK<7TpB&m9N!A9QKuTF87WymjjDW?OhA{Ax9S@pBDh7A7^T}n-Y=E}OrrgtWb zUwERo+`^&i^m!eY=d+@t!*aL}a$)j8ENu*rW|*Y6%X~kb!tx%Rx~adCU9kK2dqE*t zF4x*0e#qRGUIKv~IrIGCpGv1g``HWC+I90lup2N(**x~s=NZw(;34mo)okfvE=|F^ z*+WLaSJ;EtW9dV?clcfdSU{IYnFKk(%6`!cKP$uMzee9clYBYyP0cAa6#n7|j%8b? zHH@7xo)DE}C8&5AXRQ7HDvi!)THHrQB@<9sMDImP!>d4CJDpeaFiYG<&QG=4p3}s7 zyEq-h+w?5Mn=JOPXO2l#w;eC^Mc{n|vRk=&d?0#b@9jq?LI_%ymN8@2&1_mEb_5wB z4hFFjUJe*D>s*rtW};~d3qcio|H?Q)q_?CoXz(^q@+WH*8{~z(J$cgts&YYF0jFc? zIVKMt-C1jd+5}H~cx2SV1=oMkVHt=Ho&RWVM>;dO);mKwhiWBv1wM=H#&$*G#^?d3 zAwdsv^Kr*+b6O8}^I;Dj&Z;#D2_i4Vwb~(6N2cu{0k^i0?Oigd2yKE)!H5D9FXD;O z>R?1*NBtOBWBMH;3D#2(4MRlMllMf~)&(7c@PEI@*Lt(z&^{~u zyqp{ID%0D#+3H=fozNrXV!A6%1&HWQ^u=A=?`UjGrnJwyRy^X8T#&w#Bc(Ez28f7# zp?zxGx*`ry$EVT7fzm>RaO_g5T<434*e(&FhJmdR+sFkBQq^tj1f4=u?~y(YT`}>I zR3oXYqHrd&)jDcisvK-kJBD>vA^ZyC(c&IPac0|p#`4lCs%EH^O)8tzIH+`7a^K6= zS!i}BZ;bHebNl3&3{y3N_Jq=5RC` z6op~Xw6o9bsa&(Jk~vmPlu#1CrH3vYgon)I05(7IHM>b;j$ORi#2oHn3sn>0c zRziy4$Yt5>ToRXpTnH;I``PBg!$AA_?rC^Wc~^zfLi#2eb##0gKJW4<_|ty*=+@#$ z{YJ2hm5H;T+CBq$HlXG5Av5d<2=IZEW+UehW~@f6GYc5$Wpe~EcwfqqjmmZa?Xl81 z6Fmiu2E*n`eUg1RpbuMCCM&)?IlwW;k3f>Z%;Dm|h_3GpwGXPPJ*vz<5bWTo-KwiAM@KB8A7x zV>^9>=O@=B(Q4DZ_t%u5+eS)b@zTA{oo1zDyYH5!^a2W^t zry9hN{%Ph|{)2!-nm=KKC8kP$lr!8I;52+tyQvs08M6M~RlsfrwtM{Pl6?Gg1c&ZQ z+qzwlJQ2%4zm1gGAJ2_{pmxu7ZbcO(=o-@^5GgH{4}Z>T zpp=wmk-PyJPqa89H{8Qmz*XmGc(Em!9L}2LRbQ*z&F|j)#z5xYzMiZvh~IU$nEs2y9XDUO^p~9Xap*XmVYeiiT4OKB`|;s+7;ea#fatxtfmDiF_aSBm?7Co| ze04>S1Sz;cg0^nfu8KvqGL_9^vPVn%%eSmmO67!4h+B|Vke86|5~_>Xqv)GW3*u=^ zF81S1ozHUnX!EE~t6APx(X+@i=qckY`9m#_Uz1E(o>vK!nLnhwaviz;I|yDY*I6Qu z{l0vk{@?0`QOlHVy0ijyj~0eK{t!z-CABw4LM8WLjk~HrT*nY@vGiubOJKFJVeMPb z_2IVIy~#YMJ;kOXezI0=xM?gX3(4*UKwV`rW#+xZ`#vW)!Xym_^_;8!{TO^1@)0Oe zJe36LOQo3{_*m3i-pS{(9A)s=Q2The`jiioh_UsFV--g8VD!^qv^Nl?5eId{5T+i;pQJ5q(2i%Fac5QOPw_ zUgLmaPW10x_r=1&1^g(P5%lDxTa{hrm5*dK75&-;#X$wx3;gv)eayP&5BaQi4~Os!}$SgJ6q# z6S9WgdFr)s#aaw2?K76PYm7fI;9VcnUlwC>Yr=qhmqgFUh(ssR@i$oa$m$P8Fj_py zik!;Fw?M^v55ZR$d$fBR1qVBOIQX<*8}w<)eA=-$H+}L^-`XRH%}O)Nv<%Hp7|c-j z!wKK^dW+?W;%>8=oKRo6$ z;XqlIhp_w5^cMNnsc8?9_wY0f1cr<5hHld2l(*v>dI8s z*9O17%5v3hq)fM@HZfysqFjW#&jB;wM`u9=lAs(29nL*6LVj3Fq2io-0OJK+x zdo{sKl9SCX=my=qG3{b@8Pz9R7I%Nhe#xeHfyld3?@h?22s)2_kWJ@ZQXP;_952-4 zcOSTrPZDzS3s?)sD;ZM{tvJQCU450fe zW+e@BlRu#-XyzUyp`uW1OX`d##{6M1G3yA4L0FBA`?O_og+#%u$NtA=Xf(`Pd;$*sp3i&1lopmYu#%+j2qW}?q8cC|0kg3R+?1Xg_RGh(Y$8?ykZnU25?be^ zq|kyhE9~Vc1O2&}w??+iFNOw)z|2_X%g{#?%4k&sc~icT%(Jq)E;2q1^570P5=#j7 zVl6>s@nAj|_7TEr#=rbE;;R63$8#BMC=Csvh9VW3WE+y8JoTR)q8Opv6j@yJZlLdb zZd?(HP)5(SSa|m484{W?mHfpOS}HQ}KOiHHoKq+^w>yF>-<6pic?&bQ!@4GPQ&x!N zgMIxxe`XloHhZbbazRE(n|CYW7Ii3r9hz3nz$0qATq_zq6{URIKP2*RuT)6&)vU5 z_(pAq3E@$0WvKw!q_k5~zFknp>eeVvs>goJnJUh_vX;!yWVMNl?sT9^VCYC_VH1_P z6Fu9ukYV<`E!o1#Z!{*65-G7;@J-)=SCS=}<{iUfYD+JWhcEOimORZ`5l2+e5q≧7+UcMIYA(C2HXg5daAz}>B;ls;!}Ax>7*-8 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

N=!8Tbc8Z=UYb7A~dD)m-fAS%M@VrRp-Esxe{x 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

MV`AFa+zZk_; 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 Date: Wed, 26 Jun 2019 10:34:52 +0530 Subject: [PATCH 133/166] Test cases added --- SRIP/Codes/exp4.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index d90dc882..aefcb866 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -364,7 +364,7 @@ window.onload = function() { function startDDAG(){ result = classify(); - console.log(result); + //console.log(result); ddag1 = 1; ddag2 = 1; ddag3 = 1; From d77284ecabf26d8a0827bca47e33c54d400ee406 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 10:45:14 +0530 Subject: [PATCH 134/166] Test cases added --- SRIP/Codes/exp4.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index aefcb866..d8f0383a 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -77,7 +77,7 @@ window.onload = function() { chart.options.data[1].dataPoints = series12; chart.options.data[2].dataPoints = series13; chart.options.data[3].dataPoints = series14; - chart.render(); + chart.render(); } if(loadDataset == 2){ From ec8d5b93521ebb255bd27f9647c32626192f8166 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 18:01:19 +0530 Subject: [PATCH 135/166] Some corrections made --- SRIP/Codes/exp4.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index d8f0383a..10fbe5d5 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -11,15 +11,15 @@ window.onload = function() { var series23 = [{x: -2, y: -4}, {x: -3, y: -4}]; var series24 = [{x: -4, y: 2}, {x: -5, y: 2}]; //third dataset - var series31 = [{x: 0.3, y: 0.2}, {x: 0.4, y: 0.3}]; - var series32 = [{x: -0.4, y: -0.3}, {x: -0.3, y: -0.2}]; - var series33 = [{x: 0.2, y: -0.4}, {x: 0.3, y: -0.2}]; - var series34 = [{x: -0.4, y: 0.6}, {x: -0.7, y: 0.3}]; + var series31 = [{x: -13, y: -7}, {x: -12, y: -5}]; + var series32 = [{x: -2, y: -1}, {x: -3, y: -2}]; + var series33 = [{x: -2, y: -17}, {x: -1, y: -19}]; + var series34 = [{x: -17, y: -15}, {x: -13, y: -16}]; //fourth dataset - var series41 = [{x: -13, y: -7}, {x: -12, y: -5}]; - var series42 = [{x: -2, y: -1}, {x: -3, y: -2}]; - var series43 = [{x: -2, y: -17}, {x: -1, y: -19}]; - var series44 = [{x: -17, y: -15}, {x: -13, y: -16}]; + var series41 = [{x: 0.3, y: 0.2}, {x: 0.4, y: 0.3}]; + var series42 = [{x: -0.4, y: -0.3}, {x: -0.3, y: -0.2}]; + var series43 = [{x: 0.2, y: -0.4}, {x: 0.3, y: -0.2}]; + var series44 = [{x: -0.4, y: 0.6}, {x: -0.7, y: 0.3}]; var ans = []; var ddag1; From aa299dac13af58f5d33e0d339b7297224721d5c8 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 18:32:59 +0530 Subject: [PATCH 136/166] Some corrections made --- SRIP/Codes/exp4.js | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 10fbe5d5..bf42e0f0 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -364,7 +364,7 @@ window.onload = function() { function startDDAG(){ result = classify(); - //console.log(result); + console.log(result); ddag1 = 1; ddag2 = 1; ddag3 = 1; @@ -373,15 +373,7 @@ window.onload = function() { document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 2; document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; } - else if(result == 2){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 1 + " vs " + result; - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 1; - } - else if(result == 3){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 1 + " vs " + result; - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 1; - } - else if(result == 4){ + if(result == 2 || result == 3 || result == 4){ document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 1 + " vs " + result; document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 1; } @@ -404,7 +396,7 @@ window.onload = function() { document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; ddag3 += ddag3; } - else if(result == 4 && ddag_4 == 1){ + else if(result == 4 && ddag4 == 1){ document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 2 + " vs " + result; document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; ddag4 += ddag4; From 1d6d2d4569209644498ed59a03dd5b8f820319ff Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 18:38:18 +0530 Subject: [PATCH 137/166] Some corrections made --- SRIP/Codes/exp4.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index bf42e0f0..33da1b59 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -164,13 +164,13 @@ window.onload = function() { if(c1 < c2 && c1 < c3 && c1 < c4){ return 1; } - else if(c2 < c1 && c2 < c3 && c2 < c4){ + if(c2 < c1 && c2 < c3 && c2 < c4){ return 2; } - else if(c3 < c1 && c3 < c2 && c3 < c4){ + if(c3 < c1 && c3 < c2 && c3 < c4){ return 3; } - else if(c4 < c1 && c4 < c3 && c4 < c3){ + if(c4 < c1 && c4 < c3 && c4 < c3){ return 4; } else{ @@ -225,13 +225,13 @@ window.onload = function() { if(c1 < c2 && c1 < c3 && c1 < c4){ return 1; } - else if(c2 < c1 && c2 < c3 && c2 < c4){ + if(c2 < c1 && c2 < c3 && c2 < c4){ return 2; } - else if(c3 < c1 && c3 < c2 && c3 < c4){ + if(c3 < c1 && c3 < c2 && c3 < c4){ return 3; } - else if(c4 < c1 && c4 < c3 && c4 < c3){ + if(c4 < c1 && c4 < c3 && c4 < c3){ return 4; } else{ @@ -286,13 +286,13 @@ window.onload = function() { if(c1 < c2 && c1 < c3 && c1 < c4){ return 1; } - else if(c2 < c1 && c2 < c3 && c2 < c4){ + if(c2 < c1 && c2 < c3 && c2 < c4){ return 2; } - else if(c3 < c1 && c3 < c2 && c3 < c4){ + if(c3 < c1 && c3 < c2 && c3 < c4){ return 3; } - else if(c4 < c1 && c4 < c3 && c4 < c3){ + if(c4 < c1 && c4 < c3 && c4 < c3){ return 4; } else{ @@ -347,13 +347,13 @@ window.onload = function() { if(c1 < c2 && c1 < c3 && c1 < c4){ return 1; } - else if(c2 < c1 && c2 < c3 && c2 < c4){ + if(c2 < c1 && c2 < c3 && c2 < c4){ return 2; } - else if(c3 < c1 && c3 < c2 && c3 < c4){ + if(c3 < c1 && c3 < c2 && c3 < c4){ return 3; } - else if(c4 < c1 && c4 < c3 && c4 < c3){ + if(c4 < c1 && c4 < c3 && c4 < c3){ return 4; } else{ From bb35cd7826a5ab38a84536b8e56d239c0ccf5b26 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 18:46:47 +0530 Subject: [PATCH 138/166] Some corrections made --- SRIP/Codes/exp4.js | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 33da1b59..fbabab87 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -370,57 +370,57 @@ window.onload = function() { ddag3 = 1; ddag4 = 1; if(result == 1){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 2; - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; + document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 2; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; } if(result == 2 || result == 3 || result == 4){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 1 + " vs " + result; - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 1; + document.getElementById("current-classifier").textContent = "Current Classifier: " + 1 + " vs " + result; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 1; } document.getElementById("next").disabled = false; } function nextDDAG(){ if(result == 1 && ddag1 == 1){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 3; - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 3; + document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 3; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 3; ddag1 += ddag1; } else if(result == 2 && ddag2 == 1){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 3; - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 3; + document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 3; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 3; ddag2 += ddag2; } else if(result == 3 && ddag3 == 1){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 2 + " vs " + result; - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; + document.getElementById("current-classifier").textContent = "Current Classifier: " + 2 + " vs " + result; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; ddag3 += ddag3; } else if(result == 4 && ddag4 == 1){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 2 + " vs " + result; - document.getElementById("current-class").innerHTML = "Current Class: " + " Not " + 2; + document.getElementById("current-classifier").textContent = "Current Classifier: " + 2 + " vs " + result; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; ddag4 += ddag4; } //final iteration else if(result == 1 && ddag1 == 2){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 4; - document.getElementById("current-class").innerHTML = "Current Class: " + " Classified as " + result; + document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 4; + document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; document.getElementById("next").disabled = true; } else if(result == 2 && ddag2 == 2){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 4; - document.getElementById("current-class").innerHTML = "Current Class: " + " Classified as " + result; + document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 4; + document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; document.getElementById("next").disabled = true; } else if(result == 3 && ddag3 == 2){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + result + " vs " + 4; - document.getElementById("current-class").innerHTML = "Current Class: " + " Classified as " + result; + document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 4; + document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; document.getElementById("next").disabled = true; } else if(result == 4 && ddag4 == 2){ - document.getElementById("current-classifier").innerHTML = "Current Classifier: " + 3 + " vs " + result; - document.getElementById("current-class").innerHTML = "Current Class: " + " Classified as " + result; + document.getElementById("current-classifier").textContent = "Current Classifier: " + 3 + " vs " + result; + document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; document.getElementById("next").disabled = true; } } From 83c9ad8d51e26e3e35bdc73d817dee4f806ae0c8 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 18:55:20 +0530 Subject: [PATCH 139/166] Some corrections made --- SRIP/Codes/exp4.js | 56 ++++------------------------------------------ 1 file changed, 4 insertions(+), 52 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index fbabab87..5a91f641 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -138,28 +138,16 @@ window.onload = function() { a1 = series11[i].x - ans[j].x; b1 = series11[i].y - ans[j].y; c1 += Math.sqrt((a1 * a1) + (b1 * b1)); - } - } - for(i = 0; i<2; i++){ - for(j = 0; j < ans.length; j++){ a2 = series12[i].x - ans[j].x; b2 = series12[i].y - ans[j].y; c2 += Math.sqrt((a2 * a2) + (b2 * b2)); - } - } - for(i = 0; i<2; i++){ - for(j = 0; j < ans.length; j++){ a3 = series13[i].x - ans[j].x; b3 = series13[i].y - ans[j].y; c3 += Math.sqrt((a3 * a3) + (b3 * b3)); - } - } - for(i = 0; i<2; i++){ - for(j = 0; j < ans.length; j++){ a4 = series14[i].x - ans[j].x; b4 = series14[i].y - ans[j].y; c4 += Math.sqrt((a4 * a4) + (b4 * b4)); - } + } } if(c1 < c2 && c1 < c3 && c1 < c4){ return 1; @@ -199,28 +187,16 @@ window.onload = function() { a1 = series21[i].x - ans[j].x; b1 = series21[i].y - ans[j].y; c1 += Math.sqrt((a1 * a1) + (b1 * b1)); - } - } - for(i = 0; i<2; i++){ - for(j = 0; j < ans.length; j++){ a2 = series22[i].x - ans[j].x; b2 = series22[i].y - ans[j].y; c2 += Math.sqrt((a2 * a2) + (b2 * b2)); - } - } - for(i = 0; i<2; i++){ - for(j = 0; j < ans.length; j++){ a3 = series23[i].x - ans[j].x; b3 = series23[i].y - ans[j].y; c3 += Math.sqrt((a3 * a3) + (b3 * b3)); - } - } - for(i = 0; i<2; i++){ - for(j = 0; j < ans.length; j++){ a4 = series24[i].x - ans[j].x; b4 = series24[i].y - ans[j].y; c4 += Math.sqrt((a4 * a4) + (b4 * b4)); - } + } } if(c1 < c2 && c1 < c3 && c1 < c4){ return 1; @@ -260,28 +236,16 @@ window.onload = function() { a1 = series31[i].x - ans[j].x; b1 = series31[i].y - ans[j].y; c1 += Math.sqrt((a1 * a1) + (b1 * b1)); - } - } - for(i = 0; i<2; i++){ - for(j = 0; j < ans.length; j++){ a2 = series32[i].x - ans[j].x; b2 = series32[i].y - ans[j].y; c2 += Math.sqrt((a2 * a2) + (b2 * b2)); - } - } - for(i = 0; i<2; i++){ - for(j = 0; j < ans.length; j++){ a3 = series33[i].x - ans[j].x; b3 = series33[i].y - ans[j].y; c3 += Math.sqrt((a3 * a3) + (b3 * b3)); - } - } - for(i = 0; i<2; i++){ - for(j = 0; j < ans.length; j++){ a4 = series34[i].x - ans[j].x; b4 = series34[i].y - ans[j].y; c4 += Math.sqrt((a4 * a4) + (b4 * b4)); - } + } } if(c1 < c2 && c1 < c3 && c1 < c4){ return 1; @@ -321,28 +285,16 @@ window.onload = function() { a1 = series41[i].x - ans[j].x; b1 = series41[i].y - ans[j].y; c1 += Math.sqrt((a1 * a1) + (b1 * b1)); - } - } - for(i = 0; i<2; i++){ - for(j = 0; j < ans.length; j++){ a2 = series42[i].x - ans[j].x; b2 = series42[i].y - ans[j].y; c2 += Math.sqrt((a2 * a2) + (b2 * b2)); - } - } - for(i = 0; i<2; i++){ - for(j = 0; j < ans.length; j++){ a3 = series43[i].x - ans[j].x; b3 = series43[i].y - ans[j].y; c3 += Math.sqrt((a3 * a3) + (b3 * b3)); - } - } - for(i = 0; i<2; i++){ - for(j = 0; j < ans.length; j++){ a4 = series44[i].x - ans[j].x; b4 = series44[i].y - ans[j].y; c4 += Math.sqrt((a4 * a4) + (b4 * b4)); - } + } } if(c1 < c2 && c1 < c3 && c1 < c4){ return 1; From 42bb863733851009058c8d650dfe29cc174d1db2 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 19:10:37 +0530 Subject: [PATCH 140/166] Some corrections made --- SRIP/Codes/exp4.js | 96 ++++++++++++++++------------------------------ 1 file changed, 33 insertions(+), 63 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 5a91f641..1a88c8b8 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -75,9 +75,9 @@ window.onload = function() { if(loadDataset == 1){ chart.options.data[0].dataPoints = series11; chart.options.data[1].dataPoints = series12; - chart.options.data[2].dataPoints = series13; - chart.options.data[3].dataPoints = series14; - chart.render(); + chart.options.data[2].dataPoints = series13; + chart.options.data[3].dataPoints = series14; + chart.render(); } if(loadDataset == 2){ @@ -116,6 +116,24 @@ window.onload = function() { chart.render(); } + function compare(c1, c2, c3, c4){ + if(c1 < c2 && c1 < c3 && c1 < c4){ + return 1; + } + if(c2 < c1 && c2 < c3 && c2 < c4){ + return 2; + } + if(c3 < c1 && c3 < c2 && c3 < c4){ + return 3; + } + if(c4 < c1 && c4 < c3 && c4 < c3){ + return 4; + } + else{ + return 1; + } + } + function classify(){ // first dataset if(loadDataset == 1){ @@ -133,6 +151,7 @@ window.onload = function() { var a4 = 0; var b4 = 0; var c4 = 0; + var p = 0; for(i = 0; i<2; i++){ for(j = 0; j < ans.length; j++){ a1 = series11[i].x - ans[j].x; @@ -149,21 +168,8 @@ window.onload = function() { c4 += Math.sqrt((a4 * a4) + (b4 * b4)); } } - if(c1 < c2 && c1 < c3 && c1 < c4){ - return 1; - } - if(c2 < c1 && c2 < c3 && c2 < c4){ - return 2; - } - if(c3 < c1 && c3 < c2 && c3 < c4){ - return 3; - } - if(c4 < c1 && c4 < c3 && c4 < c3){ - return 4; - } - else{ - return 1; - } + p = compare(c1, c2, c3, c4); + return p; } //second dataset @@ -182,6 +188,7 @@ window.onload = function() { var a4 = 0; var b4 = 0; var c4 = 0; + var p = 0; for(i = 0; i<2; i++){ for(j = 0; j < ans.length; j++){ a1 = series21[i].x - ans[j].x; @@ -198,21 +205,8 @@ window.onload = function() { c4 += Math.sqrt((a4 * a4) + (b4 * b4)); } } - if(c1 < c2 && c1 < c3 && c1 < c4){ - return 1; - } - if(c2 < c1 && c2 < c3 && c2 < c4){ - return 2; - } - if(c3 < c1 && c3 < c2 && c3 < c4){ - return 3; - } - if(c4 < c1 && c4 < c3 && c4 < c3){ - return 4; - } - else{ - return 1; - } + p = compare(c1, c2, c3, c4); + return p; } //third dataset @@ -231,6 +225,7 @@ window.onload = function() { var a4 = 0; var b4 = 0; var c4 = 0; + var p = 0; for(i = 0; i<2; i++){ for(j = 0; j < ans.length; j++){ a1 = series31[i].x - ans[j].x; @@ -247,21 +242,8 @@ window.onload = function() { c4 += Math.sqrt((a4 * a4) + (b4 * b4)); } } - if(c1 < c2 && c1 < c3 && c1 < c4){ - return 1; - } - if(c2 < c1 && c2 < c3 && c2 < c4){ - return 2; - } - if(c3 < c1 && c3 < c2 && c3 < c4){ - return 3; - } - if(c4 < c1 && c4 < c3 && c4 < c3){ - return 4; - } - else{ - return 1; - } + p = compare(c1, c2, c3, c4); + return p; } //fourth dataset @@ -280,6 +262,7 @@ window.onload = function() { var a4 = 0; var b4 = 0; var c4 = 0; + var p = 0; for(i = 0; i<2; i++){ for(j = 0; j < ans.length; j++){ a1 = series41[i].x - ans[j].x; @@ -296,21 +279,8 @@ window.onload = function() { c4 += Math.sqrt((a4 * a4) + (b4 * b4)); } } - if(c1 < c2 && c1 < c3 && c1 < c4){ - return 1; - } - if(c2 < c1 && c2 < c3 && c2 < c4){ - return 2; - } - if(c3 < c1 && c3 < c2 && c3 < c4){ - return 3; - } - if(c4 < c1 && c4 < c3 && c4 < c3){ - return 4; - } - else{ - return 1; - } + p = compare(c1, c2, c3, c4); + return p; } } From c69285fc08f40c218081f90cd454c8915d451cd2 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 19:19:37 +0530 Subject: [PATCH 141/166] Some corrections made --- SRIP/Codes/exp4.js | 95 ++++++++++++---------------------------------- 1 file changed, 25 insertions(+), 70 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 1a88c8b8..4d598031 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -28,6 +28,22 @@ window.onload = function() { var ddag4; var result; + var i = 0; + var j = 0; + var a1 = 0; + var b1 = 0; + var c1 = 0; + var a2 = 0; + var b2 = 0; + var c2 = 0; + var a3 = 0; + var b3 = 0; + var c3 = 0; + var a4 = 0; + var b4 = 0; + var c4 = 0; + var p = 0; + var chart = new CanvasJS.Chart("chartContainer", { title: {text: "Chart"}, axisX:{ @@ -71,16 +87,15 @@ window.onload = function() { function datasetLoad(){ - loadDataset = document.getElementById("load-dataset").value; - if(loadDataset == 1){ - chart.options.data[0].dataPoints = series11; - chart.options.data[1].dataPoints = series12; - chart.options.data[2].dataPoints = series13; - chart.options.data[3].dataPoints = series14; - chart.render(); - } - - if(loadDataset == 2){ + loadDataset = document.getElementById("load-dataset").value; + if(loadDataset == 1){ + chart.options.data[0].dataPoints = series11; + chart.options.data[1].dataPoints = series12; + chart.options.data[2].dataPoints = series13; + chart.options.data[3].dataPoints = series14; + chart.render(); + } + if(loadDataset == 2){ chart.options.data[0].dataPoints = series21; chart.options.data[1].dataPoints = series22; chart.options.data[2].dataPoints = series23; @@ -137,21 +152,6 @@ window.onload = function() { function classify(){ // first dataset if(loadDataset == 1){ - var i = 0; - var j = 0; - var a1 = 0; - var b1 = 0; - var c1 = 0; - var a2 = 0; - var b2 = 0; - var c2 = 0; - var a3 = 0; - var b3 = 0; - var c3 = 0; - var a4 = 0; - var b4 = 0; - var c4 = 0; - var p = 0; for(i = 0; i<2; i++){ for(j = 0; j < ans.length; j++){ a1 = series11[i].x - ans[j].x; @@ -174,21 +174,6 @@ window.onload = function() { //second dataset if(loadDataset == 2){ - var i = 0; - var j = 0; - var a1 = 0; - var b1 = 0; - var c1 = 0; - var a2 = 0; - var b2 = 0; - var c2 = 0; - var a3 = 0; - var b3 = 0; - var c3 = 0; - var a4 = 0; - var b4 = 0; - var c4 = 0; - var p = 0; for(i = 0; i<2; i++){ for(j = 0; j < ans.length; j++){ a1 = series21[i].x - ans[j].x; @@ -211,21 +196,6 @@ window.onload = function() { //third dataset if(loadDataset == 3){ - var i = 0; - var j = 0; - var a1 = 0; - var b1 = 0; - var c1 = 0; - var a2 = 0; - var b2 = 0; - var c2 = 0; - var a3 = 0; - var b3 = 0; - var c3 = 0; - var a4 = 0; - var b4 = 0; - var c4 = 0; - var p = 0; for(i = 0; i<2; i++){ for(j = 0; j < ans.length; j++){ a1 = series31[i].x - ans[j].x; @@ -248,21 +218,6 @@ window.onload = function() { //fourth dataset if(loadDataset == 4){ - var i = 0; - var j = 0; - var a1 = 0; - var b1 = 0; - var c1 = 0; - var a2 = 0; - var b2 = 0; - var c2 = 0; - var a3 = 0; - var b3 = 0; - var c3 = 0; - var a4 = 0; - var b4 = 0; - var c4 = 0; - var p = 0; for(i = 0; i<2; i++){ for(j = 0; j < ans.length; j++){ a1 = series41[i].x - ans[j].x; From 2309d9e48f32cf66081c17d05154ffa65bc353bc Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 19:31:49 +0530 Subject: [PATCH 142/166] Some corrections made --- SRIP/Codes/exp4.js | 70 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 4d598031..42a4a0f1 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -131,7 +131,7 @@ window.onload = function() { chart.render(); } - function compare(c1, c2, c3, c4){ + function compare(c1, c2, c3, c4){ if(c1 < c2 && c1 < c3 && c1 < c4){ return 1; } @@ -241,7 +241,7 @@ window.onload = function() { function startDDAG(){ result = classify(); - console.log(result); + //console.log(result); ddag1 = 1; ddag2 = 1; ddag3 = 1; @@ -258,12 +258,58 @@ window.onload = function() { } function nextDDAG(){ - if(result == 1 && ddag1 == 1){ - document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 3; - document.getElementById("current-class").textContent = "Current Class: " + " Not " + 3; - ddag1 += ddag1; - } - else if(result == 2 && ddag2 == 1){ + if(result == 1){ + if(ddag1 == 1){ + document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 3; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 3; + ddag1 += ddag1; + } + else{ + document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 4; + document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; + document.getElementById("next").disabled = true; + } + } + + if(result == 2){ + if(ddag2 == 1){ + document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 3; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 3; + ddag2 += ddag2; + } + else{ + document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 4; + document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; + document.getElementById("next").disabled = true; + } + } + + if(result == 3){ + if(ddag3 == 1){ + document.getElementById("current-classifier").textContent = "Current Classifier: " + 2 + " vs " + result; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; + ddag3 += ddag3; + } + else{ + document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 4; + document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; + document.getElementById("next").disabled = true; + } + } + + if(result == 4){ + if(ddag3 == 1){ + document.getElementById("current-classifier").textContent = "Current Classifier: " + 2 + " vs " + result; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; + ddag3 += ddag3; + } + else{ + document.getElementById("current-classifier").textContent = "Current Classifier: " + 3 + " vs " + result; + document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; + document.getElementById("next").disabled = true; + } + } + /*else if(result == 2 && ddag2 == 1){ document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 3; document.getElementById("current-class").textContent = "Current Class: " + " Not " + 3; ddag2 += ddag2; @@ -280,11 +326,7 @@ window.onload = function() { } //final iteration - else if(result == 1 && ddag1 == 2){ - document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 4; - document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; - document.getElementById("next").disabled = true; - } + else if(result == 2 && ddag2 == 2){ document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 4; document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; @@ -299,7 +341,7 @@ window.onload = function() { document.getElementById("current-classifier").textContent = "Current Classifier: " + 3 + " vs " + result; document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; document.getElementById("next").disabled = true; - } + }*/ } var load = document.getElementById("load"); From 804c886c14fd7726bb2833f2128c25ac06bf169c Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 19:47:52 +0530 Subject: [PATCH 143/166] Some corrections made --- SRIP/Codes/exp4.js | 41 ++++------------------------------------- 1 file changed, 4 insertions(+), 37 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 42a4a0f1..07bfc57b 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -259,7 +259,7 @@ window.onload = function() { function nextDDAG(){ if(result == 1){ - if(ddag1 == 1){ + if(ddag1 === 1){ document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 3; document.getElementById("current-class").textContent = "Current Class: " + " Not " + 3; ddag1 += ddag1; @@ -272,7 +272,7 @@ window.onload = function() { } if(result == 2){ - if(ddag2 == 1){ + if(ddag2 === 1){ document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 3; document.getElementById("current-class").textContent = "Current Class: " + " Not " + 3; ddag2 += ddag2; @@ -285,7 +285,7 @@ window.onload = function() { } if(result == 3){ - if(ddag3 == 1){ + if(ddag3 === 1){ document.getElementById("current-classifier").textContent = "Current Classifier: " + 2 + " vs " + result; document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; ddag3 += ddag3; @@ -298,7 +298,7 @@ window.onload = function() { } if(result == 4){ - if(ddag3 == 1){ + if(ddag3 === 1){ document.getElementById("current-classifier").textContent = "Current Classifier: " + 2 + " vs " + result; document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; ddag3 += ddag3; @@ -309,39 +309,6 @@ window.onload = function() { document.getElementById("next").disabled = true; } } - /*else if(result == 2 && ddag2 == 1){ - document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 3; - document.getElementById("current-class").textContent = "Current Class: " + " Not " + 3; - ddag2 += ddag2; - } - else if(result == 3 && ddag3 == 1){ - document.getElementById("current-classifier").textContent = "Current Classifier: " + 2 + " vs " + result; - document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; - ddag3 += ddag3; - } - else if(result == 4 && ddag4 == 1){ - document.getElementById("current-classifier").textContent = "Current Classifier: " + 2 + " vs " + result; - document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; - ddag4 += ddag4; - } - -//final iteration - - else if(result == 2 && ddag2 == 2){ - document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 4; - document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; - document.getElementById("next").disabled = true; - } - else if(result == 3 && ddag3 == 2){ - document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 4; - document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; - document.getElementById("next").disabled = true; - } - else if(result == 4 && ddag4 == 2){ - document.getElementById("current-classifier").textContent = "Current Classifier: " + 3 + " vs " + result; - document.getElementById("current-class").textContent = "Current Class: " + " Classified as " + result; - document.getElementById("next").disabled = true; - }*/ } var load = document.getElementById("load"); From 949dbc16fa8dc5629431cea6e0b02169ad460e50 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 19:52:45 +0530 Subject: [PATCH 144/166] Some corrections made --- SRIP/Codes/exp4.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 07bfc57b..ca75e034 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -298,10 +298,10 @@ window.onload = function() { } if(result == 4){ - if(ddag3 === 1){ + if(ddag4 === 1){ document.getElementById("current-classifier").textContent = "Current Classifier: " + 2 + " vs " + result; document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; - ddag3 += ddag3; + ddag4 += ddag4; } else{ document.getElementById("current-classifier").textContent = "Current Classifier: " + 3 + " vs " + result; From 1be9b122dd6d1ade95e9e72186a91b26b6f96d91 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 19:57:47 +0530 Subject: [PATCH 145/166] Some corrections made --- SRIP/Codes/exp4.js | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index ca75e034..689c9af3 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -132,22 +132,22 @@ window.onload = function() { } function compare(c1, c2, c3, c4){ - if(c1 < c2 && c1 < c3 && c1 < c4){ - return 1; - } - if(c2 < c1 && c2 < c3 && c2 < c4){ - return 2; - } - if(c3 < c1 && c3 < c2 && c3 < c4){ - return 3; - } - if(c4 < c1 && c4 < c3 && c4 < c3){ - return 4; - } - else{ - return 1; - } - } + if(c1 < c2 && c1 < c3 && c1 < c4){ + return 1; + } + if(c2 < c1 && c2 < c3 && c2 < c4){ + return 2; + } + if(c3 < c1 && c3 < c2 && c3 < c4){ + return 3; + } + if(c4 < c1 && c4 < c3 && c4 < c3){ + return 4; + } + else{ + return 1; + } + } function classify(){ // first dataset @@ -296,7 +296,7 @@ window.onload = function() { document.getElementById("next").disabled = true; } } - + if(result == 4){ if(ddag4 === 1){ document.getElementById("current-classifier").textContent = "Current Classifier: " + 2 + " vs " + result; From 0eda2c351b64ef8b829d78da7f3bf72465a23200 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 20:10:20 +0530 Subject: [PATCH 146/166] Some corrections made --- SRIP/Codes/exp4.js | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 689c9af3..87c73a9d 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -250,19 +250,18 @@ window.onload = function() { document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 2; document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; } - if(result == 2 || result == 3 || result == 4){ - document.getElementById("current-classifier").textContent = "Current Classifier: " + 1 + " vs " + result; - document.getElementById("current-class").textContent = "Current Class: " + " Not " + 1; + if(result == 2 || result == 3 || result == 4){ + document.getElementById("current-classifier").textContent = "Current Classifier: " + 1 + " vs " + result; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 1; } - document.getElementById("next").disabled = false; } - + function nextDDAG(){ if(result == 1){ if(ddag1 === 1){ - document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 3; - document.getElementById("current-class").textContent = "Current Class: " + " Not " + 3; - ddag1 += ddag1; + document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 3; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 3; + ddag1 += ddag1; } else{ document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 4; @@ -270,7 +269,6 @@ window.onload = function() { document.getElementById("next").disabled = true; } } - if(result == 2){ if(ddag2 === 1){ document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 3; @@ -283,8 +281,7 @@ window.onload = function() { document.getElementById("next").disabled = true; } } - - if(result == 3){ + if(result == 3){ if(ddag3 === 1){ document.getElementById("current-classifier").textContent = "Current Classifier: " + 2 + " vs " + result; document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; @@ -296,7 +293,6 @@ window.onload = function() { document.getElementById("next").disabled = true; } } - if(result == 4){ if(ddag4 === 1){ document.getElementById("current-classifier").textContent = "Current Classifier: " + 2 + " vs " + result; @@ -309,7 +305,7 @@ window.onload = function() { document.getElementById("next").disabled = true; } } - } + } var load = document.getElementById("load"); load.addEventListener("click", datasetLoad); From d50e5a562f8c4e8594128d43ef84b68181733f5f Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Wed, 26 Jun 2019 20:44:12 +0530 Subject: [PATCH 147/166] Some corrections made --- SRIP/Codes/exp4.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 87c73a9d..85606b08 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -240,20 +240,20 @@ window.onload = function() { } function startDDAG(){ - result = classify(); - //console.log(result); - ddag1 = 1; - ddag2 = 1; - ddag3 = 1; - ddag4 = 1; - if(result == 1){ - document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 2; - document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; - } - if(result == 2 || result == 3 || result == 4){ - document.getElementById("current-classifier").textContent = "Current Classifier: " + 1 + " vs " + result; - document.getElementById("current-class").textContent = "Current Class: " + " Not " + 1; - } + result = classify(); + //console.log(result); + ddag1 = 1; + ddag2 = 1; + ddag3 = 1; + ddag4 = 1; + if(result == 1){ + document.getElementById("current-classifier").textContent = "Current Classifier: " + result + " vs " + 2; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 2; + } + if(result == 2 || result == 3 || result == 4){ + document.getElementById("current-classifier").textContent = "Current Classifier: " + 1 + " vs " + result; + document.getElementById("current-class").textContent = "Current Class: " + " Not " + 1; + } } function nextDDAG(){ From f37cb0cbed518aaeb9335c1107b02371d1e5117e Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 27 Jun 2019 08:06:22 +0530 Subject: [PATCH 148/166] Some corrections made --- SRIP/Codes/exp4.js | 1 - 1 file changed, 1 deletion(-) diff --git a/SRIP/Codes/exp4.js b/SRIP/Codes/exp4.js index 85606b08..f17fee83 100644 --- a/SRIP/Codes/exp4.js +++ b/SRIP/Codes/exp4.js @@ -241,7 +241,6 @@ window.onload = function() { function startDDAG(){ result = classify(); - //console.log(result); ddag1 = 1; ddag2 = 1; ddag3 = 1; From b7168387e331bd1c2dbfb9f794ad3e3776444f45 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Fri, 28 Jun 2019 09:16:47 +0530 Subject: [PATCH 149/166] project 3 folder created --- .../Codes/exp4.css | 0 .../Codes/exp4.html | 0 .../Codes/exp4.js | 0 .../Codes/exp4node.js | 0 Project-3 Issue Number 241/Libraries/Chart.js | 14680 ++++++++++++++++ .../Libraries/canvasjs-2.3.1/canvasjs.min.js | 911 + .../canvasjs-2.3.1/canvasjs.react.js | 48 + .../examples/01-overview/animated-chart.html | 43 + .../01-overview/chart-from-json-data.html | 50 + .../chart-with-axis-scale-breaks.html | 51 + .../01-overview/chart-with-crosshair.html | 72 + .../chart-with-custom-legend-chart.html | 233 + .../01-overview/chart-with-image-overlay.html | 108 + .../chart-with-index-data-label.html | 46 + .../chart-with-inverted-reversed-axis.html | 46 + .../chart-with-logarithmic-axis.html | 128 + .../chart-with-secondary-axis.html | 87 + .../01-overview/chart-with-zoom-pan.html | 40 + .../examples/01-overview/dynamic-chart.html | 57 + .../interactive-draggable-chart.html | 115 + .../01-overview/multi-series-chart.html | 94 + .../examples/01-overview/null-data-chart.html | 62 + .../01-overview/performance-demo.html | 43 + .../dashed-line-chart.html | 102 + .../dynamic-spline-chart.html | 56 + .../line-chart-with-axis-scale-breaks.html | 71 + .../line-chart-with-data-markers.html | 53 + .../line-chart-with-logarithmic-axis.html | 107 + .../line-chart-with-multiple-axis.html | 125 + .../line-chart-with-zoom-pan.html | 46 + .../line-chart.html | 44 + .../multi-series-line-chart.html | 257 + .../multi-series-spline-chart.html | 171 + .../multi-series-step-line-chart.html | 67 + .../spline-chart-with-legends.html | 123 + .../spline-chart-with-secondary-axis.html | 100 + .../spline-chart.html | 55 + .../step-line-chart.html | 57 + .../area-chart.html | 50 + .../multi-series-area-chart.html | 73 + .../multi-series-range-area-chart.html | 127 + .../multi-series-spline-area-chart.html | 113 + .../range-area-chart.html | 72 + .../range-spline-area-chart.html | 51 + .../spline-area-chart.html | 55 + ...ed-area-100-chart-with-date-time-axis.html | 120 + .../stacked-area-100-chart.html | 78 + .../stacked-area-chart.html | 68 + .../step-area-chart.html | 42 + .../bar-chart-with-axis-scale-break.html | 58 + .../bar-chart.html | 58 + .../column-chart-with-multiple-axis.html | 83 + .../column-chart.html | 43 + .../multi-series-bar-chart.html | 104 + .../multi-series-range-column-chart.html | 89 + .../multi-series-waterfall-chart.html | 98 + .../range-bar-chart.html | 49 + .../range-column-chart.html | 49 + .../stacked-bar-100-chart.html | 76 + .../stacked-bar-chart.html | 126 + .../stacked-column-100-chart.html | 103 + .../stacked-column-chart.html | 113 + .../waterfall-chart-with-custom-color.html | 51 + .../waterfall-chart.html | 48 + .../doughnut-Chart.html | 40 + ...ughnut-chart-with-custom-inner-radius.html | 55 + .../funnel-chart-with-custom-neck.html | 52 + .../funnel-chart.html | 52 + .../inverted-reversed-funnel-chart.html | 54 + .../pie-chart-with-custom-radius.html | 51 + .../pie-chart-with-legends.html | 52 + .../pie-chart.html | 36 + ...mid-chart-where-area-represents-value.html | 39 + ...-chart-with-index-label-placed-Inside.html | 40 + .../pyramid-chart.html | 40 + .../candlestick-line-chart.html | 108 + .../multi-series-candlestick-chart.html | 90 + .../ohlc-chart-from-json-data.html | 58 + .../ohlc-stock-chart.html | 54 + .../bubble-chart-with-data-marker.html | 59 + .../bubble-chart-with-zoom-pan.html | 60 + .../bubble-chart.html | 69 + .../multi-series-scatter-point-chart.html | 73 + ...catter-point-chart-with-custom-marker.html | 129 + .../scatter-point-chart.html | 63 + ...x-and-whisker-chart-with-custom-color.html | 43 + .../box-and-whisker-chart-with-outliers.html | 81 + .../box-and-whisker-chart.html | 43 + .../column-line-area-chart.html | 122 + .../error-bar-chart.html | 54 + .../09-combination-charts/error-chart.html | 58 + .../error-line-chart.html | 73 + .../ohlc-line-chart.html | 106 + .../pareto-chart-with-index-data-label.html | 68 + .../09-combination-charts/pareto-chart.html | 66 + .../range-area-line-chart.html | 108 + .../dynamic-column-chart.html | 54 + .../10-dynamic-charts/dynamic-line-chart.html | 58 + .../dynamic-multi-series-chart.html | 113 + .../11-integration/jquery-charts.html | 42 + .../jquery-line-chart-with-zoom-pan.html | 49 + .../jquery-resizable-chart.html | 55 + .../jquery-spline-area-chart-in-tab.html | 98 + ...jquery-spline-chart-with-image-export.html | 41 + .../Libraries/canvasjs-2.3.1/instruction.txt | 4 + .../canvasjs-2.3.1/jquery.canvasjs.min.js | 922 + .../Libraries/canvasjs-2.3.1/license.txt | 9 + .../Libraries/svm/.npmignore | 0 .../Libraries/svm/README.md | 0 .../Libraries/svm/lib/svm.js | 0 .../Libraries/svm/package.json | 0 .../Quiz/JSONquestions.js | 41 + Project-3 Issue Number 241/Quiz/quiz.css | 190 + Project-3 Issue Number 241/Quiz/quiz.html | 27 + Project-3 Issue Number 241/Quiz/quiz.js | 61 + Project-3 Issue Number 241/README.txt | 15 + .../SRIP Project 3 Documentation.pdf | Bin .../Test Cases for Project 3.pdf | Bin SRIP/Quiz/JSONquestions.js | 28 +- SRIP/README.txt | 2 +- 120 files changed, 24222 insertions(+), 28 deletions(-) rename {SRIP => Project-3 Issue Number 241}/Codes/exp4.css (100%) rename {SRIP => Project-3 Issue Number 241}/Codes/exp4.html (100%) rename {SRIP => Project-3 Issue Number 241}/Codes/exp4.js (100%) rename {SRIP => Project-3 Issue Number 241}/Codes/exp4node.js (100%) create mode 100644 Project-3 Issue Number 241/Libraries/Chart.js create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/canvasjs.min.js create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/canvasjs.react.js create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/instruction.txt create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js create mode 100644 Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/license.txt rename {SRIP => Project-3 Issue Number 241}/Libraries/svm/.npmignore (100%) rename {SRIP => Project-3 Issue Number 241}/Libraries/svm/README.md (100%) rename {SRIP => Project-3 Issue Number 241}/Libraries/svm/lib/svm.js (100%) rename {SRIP => Project-3 Issue Number 241}/Libraries/svm/package.json (100%) create mode 100644 Project-3 Issue Number 241/Quiz/JSONquestions.js create mode 100644 Project-3 Issue Number 241/Quiz/quiz.css create mode 100644 Project-3 Issue Number 241/Quiz/quiz.html create mode 100644 Project-3 Issue Number 241/Quiz/quiz.js create mode 100644 Project-3 Issue Number 241/README.txt rename {SRIP => Project-3 Issue Number 241}/SRIP Project 3 Documentation.pdf (100%) rename {SRIP => Project-3 Issue Number 241}/Test Cases for Project 3.pdf (100%) diff --git a/SRIP/Codes/exp4.css b/Project-3 Issue Number 241/Codes/exp4.css similarity index 100% rename from SRIP/Codes/exp4.css rename to Project-3 Issue Number 241/Codes/exp4.css diff --git a/SRIP/Codes/exp4.html b/Project-3 Issue Number 241/Codes/exp4.html similarity index 100% rename from SRIP/Codes/exp4.html rename to Project-3 Issue Number 241/Codes/exp4.html diff --git a/SRIP/Codes/exp4.js b/Project-3 Issue Number 241/Codes/exp4.js similarity index 100% rename from SRIP/Codes/exp4.js rename to Project-3 Issue Number 241/Codes/exp4.js diff --git a/SRIP/Codes/exp4node.js b/Project-3 Issue Number 241/Codes/exp4node.js similarity index 100% rename from SRIP/Codes/exp4node.js rename to Project-3 Issue Number 241/Codes/exp4node.js diff --git a/Project-3 Issue Number 241/Libraries/Chart.js b/Project-3 Issue Number 241/Libraries/Chart.js new file mode 100644 index 00000000..4c50e09b --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/Chart.js @@ -0,0 +1,14680 @@ +/*! + * Chart.js v2.8.0 + * https://www.chartjs.org + * (c) 2019 Chart.js Contributors + * Released under the MIT License + */ +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(function() { try { return require('moment'); } catch(e) { } }()) : +typeof define === 'function' && define.amd ? define(['require'], function(require) { return factory(function() { try { return require('moment'); } catch(e) { } }()); }) : +(global.Chart = factory(global.moment)); +}(this, (function (moment) { 'use strict'; + +moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment; + +/* MIT license */ + +var conversions = { + rgb2hsl: rgb2hsl, + rgb2hsv: rgb2hsv, + rgb2hwb: rgb2hwb, + rgb2cmyk: rgb2cmyk, + rgb2keyword: rgb2keyword, + rgb2xyz: rgb2xyz, + rgb2lab: rgb2lab, + rgb2lch: rgb2lch, + + hsl2rgb: hsl2rgb, + hsl2hsv: hsl2hsv, + hsl2hwb: hsl2hwb, + hsl2cmyk: hsl2cmyk, + hsl2keyword: hsl2keyword, + + hsv2rgb: hsv2rgb, + hsv2hsl: hsv2hsl, + hsv2hwb: hsv2hwb, + hsv2cmyk: hsv2cmyk, + hsv2keyword: hsv2keyword, + + hwb2rgb: hwb2rgb, + hwb2hsl: hwb2hsl, + hwb2hsv: hwb2hsv, + hwb2cmyk: hwb2cmyk, + hwb2keyword: hwb2keyword, + + cmyk2rgb: cmyk2rgb, + cmyk2hsl: cmyk2hsl, + cmyk2hsv: cmyk2hsv, + cmyk2hwb: cmyk2hwb, + cmyk2keyword: cmyk2keyword, + + keyword2rgb: keyword2rgb, + keyword2hsl: keyword2hsl, + keyword2hsv: keyword2hsv, + keyword2hwb: keyword2hwb, + keyword2cmyk: keyword2cmyk, + keyword2lab: keyword2lab, + keyword2xyz: keyword2xyz, + + xyz2rgb: xyz2rgb, + xyz2lab: xyz2lab, + xyz2lch: xyz2lch, + + lab2xyz: lab2xyz, + lab2rgb: lab2rgb, + lab2lch: lab2lch, + + lch2lab: lch2lab, + lch2xyz: lch2xyz, + lch2rgb: lch2rgb +}; + + +function rgb2hsl(rgb) { + var r = rgb[0]/255, + g = rgb[1]/255, + b = rgb[2]/255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, l; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g)/ delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + l = (min + max) / 2; + + if (max == min) + s = 0; + else if (l <= 0.5) + s = delta / (max + min); + else + s = delta / (2 - max - min); + + return [h, s * 100, l * 100]; +} + +function rgb2hsv(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, v; + + if (max == 0) + s = 0; + else + s = (delta/max * 1000)/10; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g) / delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + v = ((max / 255) * 1000) / 10; + + return [h, s, v]; +} + +function rgb2hwb(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + h = rgb2hsl(rgb)[0], + w = 1/255 * Math.min(r, Math.min(g, b)), + b = 1 - 1/255 * Math.max(r, Math.max(g, b)); + + return [h, w * 100, b * 100]; +} + +function rgb2cmyk(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255, + c, m, y, k; + + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; + return [c * 100, m * 100, y * 100, k * 100]; +} + +function rgb2keyword(rgb) { + return reverseKeywords[JSON.stringify(rgb)]; +} + +function rgb2xyz(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255; + + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y *100, z * 100]; +} + +function rgb2lab(rgb) { + var xyz = rgb2xyz(rgb), + x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function rgb2lch(args) { + return lab2lch(rgb2lab(args)); +} + +function hsl2rgb(hsl) { + var h = hsl[0] / 360, + s = hsl[1] / 100, + l = hsl[2] / 100, + t1, t2, t3, rgb, val; + + if (s == 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) + t2 = l * (1 + s); + else + t2 = l + s - l * s; + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * - (i - 1); + t3 < 0 && t3++; + t3 > 1 && t3--; + + if (6 * t3 < 1) + val = t1 + (t2 - t1) * 6 * t3; + else if (2 * t3 < 1) + val = t2; + else if (3 * t3 < 2) + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + else + val = t1; + + rgb[i] = val * 255; + } + + return rgb; +} + +function hsl2hsv(hsl) { + var h = hsl[0], + s = hsl[1] / 100, + l = hsl[2] / 100, + sv, v; + + if(l === 0) { + // no need to do calc on black + // also avoids divide by 0 error + return [0, 0, 0]; + } + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + v = (l + s) / 2; + sv = (2 * s) / (l + s); + return [h, sv * 100, v * 100]; +} + +function hsl2hwb(args) { + return rgb2hwb(hsl2rgb(args)); +} + +function hsl2cmyk(args) { + return rgb2cmyk(hsl2rgb(args)); +} + +function hsl2keyword(args) { + return rgb2keyword(hsl2rgb(args)); +} + + +function hsv2rgb(hsv) { + var h = hsv[0] / 60, + s = hsv[1] / 100, + v = hsv[2] / 100, + hi = Math.floor(h) % 6; + + var f = h - Math.floor(h), + p = 255 * v * (1 - s), + q = 255 * v * (1 - (s * f)), + t = 255 * v * (1 - (s * (1 - f))), + v = 255 * v; + + switch(hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +} + +function hsv2hsl(hsv) { + var h = hsv[0], + s = hsv[1] / 100, + v = hsv[2] / 100, + sl, l; + + l = (2 - s) * v; + sl = s * v; + sl /= (l <= 1) ? l : 2 - l; + sl = sl || 0; + l /= 2; + return [h, sl * 100, l * 100]; +} + +function hsv2hwb(args) { + return rgb2hwb(hsv2rgb(args)) +} + +function hsv2cmyk(args) { + return rgb2cmyk(hsv2rgb(args)); +} + +function hsv2keyword(args) { + return rgb2keyword(hsv2rgb(args)); +} + +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +function hwb2rgb(hwb) { + var h = hwb[0] / 360, + wh = hwb[1] / 100, + bl = hwb[2] / 100, + ratio = wh + bl, + i, v, f, n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + if ((i & 0x01) != 0) { + f = 1 - f; + } + n = wh + f * (v - wh); // linear interpolation + + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + + return [r * 255, g * 255, b * 255]; +} + +function hwb2hsl(args) { + return rgb2hsl(hwb2rgb(args)); +} + +function hwb2hsv(args) { + return rgb2hsv(hwb2rgb(args)); +} + +function hwb2cmyk(args) { + return rgb2cmyk(hwb2rgb(args)); +} + +function hwb2keyword(args) { + return rgb2keyword(hwb2rgb(args)); +} + +function cmyk2rgb(cmyk) { + var c = cmyk[0] / 100, + m = cmyk[1] / 100, + y = cmyk[2] / 100, + k = cmyk[3] / 100, + r, g, b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + return [r * 255, g * 255, b * 255]; +} + +function cmyk2hsl(args) { + return rgb2hsl(cmyk2rgb(args)); +} + +function cmyk2hsv(args) { + return rgb2hsv(cmyk2rgb(args)); +} + +function cmyk2hwb(args) { + return rgb2hwb(cmyk2rgb(args)); +} + +function cmyk2keyword(args) { + return rgb2keyword(cmyk2rgb(args)); +} + + +function xyz2rgb(xyz) { + var x = xyz[0] / 100, + y = xyz[1] / 100, + z = xyz[2] / 100, + r, g, b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r = (r * 12.92); + + g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g = (g * 12.92); + + b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b = (b * 12.92); + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; +} + +function xyz2lab(xyz) { + var x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function xyz2lch(args) { + return lab2lch(xyz2lab(args)); +} + +function lab2xyz(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + x, y, z, y2; + + if (l <= 8) { + y = (l * 100) / 903.3; + y2 = (7.787 * (y / 100)) + (16 / 116); + } else { + y = 100 * Math.pow((l + 16) / 116, 3); + y2 = Math.pow(y / 100, 1/3); + } + + x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); + + z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); + + return [x, y, z]; +} + +function lab2lch(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + hr, h, c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + if (h < 0) { + h += 360; + } + c = Math.sqrt(a * a + b * b); + return [l, c, h]; +} + +function lab2rgb(args) { + return xyz2rgb(lab2xyz(args)); +} + +function lch2lab(lch) { + var l = lch[0], + c = lch[1], + h = lch[2], + a, b, hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + return [l, a, b]; +} + +function lch2xyz(args) { + return lab2xyz(lch2lab(args)); +} + +function lch2rgb(args) { + return lab2rgb(lch2lab(args)); +} + +function keyword2rgb(keyword) { + return cssKeywords[keyword]; +} + +function keyword2hsl(args) { + return rgb2hsl(keyword2rgb(args)); +} + +function keyword2hsv(args) { + return rgb2hsv(keyword2rgb(args)); +} + +function keyword2hwb(args) { + return rgb2hwb(keyword2rgb(args)); +} + +function keyword2cmyk(args) { + return rgb2cmyk(keyword2rgb(args)); +} + +function keyword2lab(args) { + return rgb2lab(keyword2rgb(args)); +} + +function keyword2xyz(args) { + return rgb2xyz(keyword2rgb(args)); +} + +var cssKeywords = { + aliceblue: [240,248,255], + antiquewhite: [250,235,215], + aqua: [0,255,255], + aquamarine: [127,255,212], + azure: [240,255,255], + beige: [245,245,220], + bisque: [255,228,196], + black: [0,0,0], + blanchedalmond: [255,235,205], + blue: [0,0,255], + blueviolet: [138,43,226], + brown: [165,42,42], + burlywood: [222,184,135], + cadetblue: [95,158,160], + chartreuse: [127,255,0], + chocolate: [210,105,30], + coral: [255,127,80], + cornflowerblue: [100,149,237], + cornsilk: [255,248,220], + crimson: [220,20,60], + cyan: [0,255,255], + darkblue: [0,0,139], + darkcyan: [0,139,139], + darkgoldenrod: [184,134,11], + darkgray: [169,169,169], + darkgreen: [0,100,0], + darkgrey: [169,169,169], + darkkhaki: [189,183,107], + darkmagenta: [139,0,139], + darkolivegreen: [85,107,47], + darkorange: [255,140,0], + darkorchid: [153,50,204], + darkred: [139,0,0], + darksalmon: [233,150,122], + darkseagreen: [143,188,143], + darkslateblue: [72,61,139], + darkslategray: [47,79,79], + darkslategrey: [47,79,79], + darkturquoise: [0,206,209], + darkviolet: [148,0,211], + deeppink: [255,20,147], + deepskyblue: [0,191,255], + dimgray: [105,105,105], + dimgrey: [105,105,105], + dodgerblue: [30,144,255], + firebrick: [178,34,34], + floralwhite: [255,250,240], + forestgreen: [34,139,34], + fuchsia: [255,0,255], + gainsboro: [220,220,220], + ghostwhite: [248,248,255], + gold: [255,215,0], + goldenrod: [218,165,32], + gray: [128,128,128], + green: [0,128,0], + greenyellow: [173,255,47], + grey: [128,128,128], + honeydew: [240,255,240], + hotpink: [255,105,180], + indianred: [205,92,92], + indigo: [75,0,130], + ivory: [255,255,240], + khaki: [240,230,140], + lavender: [230,230,250], + lavenderblush: [255,240,245], + lawngreen: [124,252,0], + lemonchiffon: [255,250,205], + lightblue: [173,216,230], + lightcoral: [240,128,128], + lightcyan: [224,255,255], + lightgoldenrodyellow: [250,250,210], + lightgray: [211,211,211], + lightgreen: [144,238,144], + lightgrey: [211,211,211], + lightpink: [255,182,193], + lightsalmon: [255,160,122], + lightseagreen: [32,178,170], + lightskyblue: [135,206,250], + lightslategray: [119,136,153], + lightslategrey: [119,136,153], + lightsteelblue: [176,196,222], + lightyellow: [255,255,224], + lime: [0,255,0], + limegreen: [50,205,50], + linen: [250,240,230], + magenta: [255,0,255], + maroon: [128,0,0], + mediumaquamarine: [102,205,170], + mediumblue: [0,0,205], + mediumorchid: [186,85,211], + mediumpurple: [147,112,219], + mediumseagreen: [60,179,113], + mediumslateblue: [123,104,238], + mediumspringgreen: [0,250,154], + mediumturquoise: [72,209,204], + mediumvioletred: [199,21,133], + midnightblue: [25,25,112], + mintcream: [245,255,250], + mistyrose: [255,228,225], + moccasin: [255,228,181], + navajowhite: [255,222,173], + navy: [0,0,128], + oldlace: [253,245,230], + olive: [128,128,0], + olivedrab: [107,142,35], + orange: [255,165,0], + orangered: [255,69,0], + orchid: [218,112,214], + palegoldenrod: [238,232,170], + palegreen: [152,251,152], + paleturquoise: [175,238,238], + palevioletred: [219,112,147], + papayawhip: [255,239,213], + peachpuff: [255,218,185], + peru: [205,133,63], + pink: [255,192,203], + plum: [221,160,221], + powderblue: [176,224,230], + purple: [128,0,128], + rebeccapurple: [102, 51, 153], + red: [255,0,0], + rosybrown: [188,143,143], + royalblue: [65,105,225], + saddlebrown: [139,69,19], + salmon: [250,128,114], + sandybrown: [244,164,96], + seagreen: [46,139,87], + seashell: [255,245,238], + sienna: [160,82,45], + silver: [192,192,192], + skyblue: [135,206,235], + slateblue: [106,90,205], + slategray: [112,128,144], + slategrey: [112,128,144], + snow: [255,250,250], + springgreen: [0,255,127], + steelblue: [70,130,180], + tan: [210,180,140], + teal: [0,128,128], + thistle: [216,191,216], + tomato: [255,99,71], + turquoise: [64,224,208], + violet: [238,130,238], + wheat: [245,222,179], + white: [255,255,255], + whitesmoke: [245,245,245], + yellow: [255,255,0], + yellowgreen: [154,205,50] +}; + +var reverseKeywords = {}; +for (var key in cssKeywords) { + reverseKeywords[JSON.stringify(cssKeywords[key])] = key; +} + +var convert = function() { + return new Converter(); +}; + +for (var func in conversions) { + // export Raw versions + convert[func + "Raw"] = (function(func) { + // accept array or plain args + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + return conversions[func](arg); + } + })(func); + + var pair = /(\w+)2(\w+)/.exec(func), + from = pair[1], + to = pair[2]; + + // export rgb2hsl and ["rgb"]["hsl"] + convert[from] = convert[from] || {}; + + convert[from][to] = convert[func] = (function(func) { + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + + var val = conversions[func](arg); + if (typeof val == "string" || val === undefined) + return val; // keyword + + for (var i = 0; i < val.length; i++) + val[i] = Math.round(val[i]); + return val; + } + })(func); +} + + +/* Converter does lazy conversion and caching */ +var Converter = function() { + this.convs = {}; +}; + +/* Either get the values for a space or + set the values for a space, depending on args */ +Converter.prototype.routeSpace = function(space, args) { + var values = args[0]; + if (values === undefined) { + // color.rgb() + return this.getValues(space); + } + // color.rgb(10, 10, 10) + if (typeof values == "number") { + values = Array.prototype.slice.call(args); + } + + return this.setValues(space, values); +}; + +/* Set the values for a space, invalidating cache */ +Converter.prototype.setValues = function(space, values) { + this.space = space; + this.convs = {}; + this.convs[space] = values; + return this; +}; + +/* Get the values for a space. If there's already + a conversion for the space, fetch it, otherwise + compute it */ +Converter.prototype.getValues = function(space) { + var vals = this.convs[space]; + if (!vals) { + var fspace = this.space, + from = this.convs[fspace]; + vals = convert[fspace][space](from); + + this.convs[space] = vals; + } + return vals; +}; + +["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { + Converter.prototype[space] = function(vals) { + return this.routeSpace(space, arguments); + }; +}); + +var colorConvert = convert; + +var colorName = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; + +/* MIT license */ + + +var colorString = { + getRgba: getRgba, + getHsla: getHsla, + getRgb: getRgb, + getHsl: getHsl, + getHwb: getHwb, + getAlpha: getAlpha, + + hexString: hexString, + rgbString: rgbString, + rgbaString: rgbaString, + percentString: percentString, + percentaString: percentaString, + hslString: hslString, + hslaString: hslaString, + hwbString: hwbString, + keyword: keyword +}; + +function getRgba(string) { + if (!string) { + return; + } + var abbr = /^#([a-fA-F0-9]{3,4})$/i, + hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i, + rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + keyword = /(\w+)/; + + var rgb = [0, 0, 0], + a = 1, + match = string.match(abbr), + hexAlpha = ""; + if (match) { + match = match[1]; + hexAlpha = match[3]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i] + match[i], 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(hex)) { + hexAlpha = match[2]; + match = match[1]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(rgba)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i + 1]); + } + a = parseFloat(match[4]); + } + else if (match = string.match(per)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); + } + a = parseFloat(match[4]); + } + else if (match = string.match(keyword)) { + if (match[1] == "transparent") { + return [0, 0, 0, 0]; + } + rgb = colorName[match[1]]; + if (!rgb) { + return; + } + } + + for (var i = 0; i < rgb.length; i++) { + rgb[i] = scale(rgb[i], 0, 255); + } + if (!a && a != 0) { + a = 1; + } + else { + a = scale(a, 0, 1); + } + rgb[3] = a; + return rgb; +} + +function getHsla(string) { + if (!string) { + return; + } + var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hsl); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + s = scale(parseFloat(match[2]), 0, 100), + l = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, s, l, a]; + } +} + +function getHwb(string) { + if (!string) { + return; + } + var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hwb); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + w = scale(parseFloat(match[2]), 0, 100), + b = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, w, b, a]; + } +} + +function getRgb(string) { + var rgba = getRgba(string); + return rgba && rgba.slice(0, 3); +} + +function getHsl(string) { + var hsla = getHsla(string); + return hsla && hsla.slice(0, 3); +} + +function getAlpha(string) { + var vals = getRgba(string); + if (vals) { + return vals[3]; + } + else if (vals = getHsla(string)) { + return vals[3]; + } + else if (vals = getHwb(string)) { + return vals[3]; + } +} + +// generators +function hexString(rgba, a) { + var a = (a !== undefined && rgba.length === 3) ? a : rgba[3]; + return "#" + hexDouble(rgba[0]) + + hexDouble(rgba[1]) + + hexDouble(rgba[2]) + + ( + (a >= 0 && a < 1) + ? hexDouble(Math.round(a * 255)) + : "" + ); +} + +function rgbString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return rgbaString(rgba, alpha); + } + return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; +} + +function rgbaString(rgba, alpha) { + if (alpha === undefined) { + alpha = (rgba[3] !== undefined ? rgba[3] : 1); + } + return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + + ", " + alpha + ")"; +} + +function percentString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return percentaString(rgba, alpha); + } + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + + return "rgb(" + r + "%, " + g + "%, " + b + "%)"; +} + +function percentaString(rgba, alpha) { + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; +} + +function hslString(hsla, alpha) { + if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { + return hslaString(hsla, alpha); + } + return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; +} + +function hslaString(hsla, alpha) { + if (alpha === undefined) { + alpha = (hsla[3] !== undefined ? hsla[3] : 1); + } + return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + + alpha + ")"; +} + +// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax +// (hwb have alpha optional & 1 is default value) +function hwbString(hwb, alpha) { + if (alpha === undefined) { + alpha = (hwb[3] !== undefined ? hwb[3] : 1); + } + return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" + + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; +} + +function keyword(rgb) { + return reverseNames[rgb.slice(0, 3)]; +} + +// helpers +function scale(num, min, max) { + return Math.min(Math.max(min, num), max); +} + +function hexDouble(num) { + var str = num.toString(16).toUpperCase(); + return (str.length < 2) ? "0" + str : str; +} + + +//create a list of reverse color names +var reverseNames = {}; +for (var name in colorName) { + reverseNames[colorName[name]] = name; +} + +/* MIT license */ + + + +var Color = function (obj) { + if (obj instanceof Color) { + return obj; + } + if (!(this instanceof Color)) { + return new Color(obj); + } + + this.valid = false; + this.values = { + rgb: [0, 0, 0], + hsl: [0, 0, 0], + hsv: [0, 0, 0], + hwb: [0, 0, 0], + cmyk: [0, 0, 0, 0], + alpha: 1 + }; + + // parse Color() argument + var vals; + if (typeof obj === 'string') { + vals = colorString.getRgba(obj); + if (vals) { + this.setValues('rgb', vals); + } else if (vals = colorString.getHsla(obj)) { + this.setValues('hsl', vals); + } else if (vals = colorString.getHwb(obj)) { + this.setValues('hwb', vals); + } + } else if (typeof obj === 'object') { + vals = obj; + if (vals.r !== undefined || vals.red !== undefined) { + this.setValues('rgb', vals); + } else if (vals.l !== undefined || vals.lightness !== undefined) { + this.setValues('hsl', vals); + } else if (vals.v !== undefined || vals.value !== undefined) { + this.setValues('hsv', vals); + } else if (vals.w !== undefined || vals.whiteness !== undefined) { + this.setValues('hwb', vals); + } else if (vals.c !== undefined || vals.cyan !== undefined) { + this.setValues('cmyk', vals); + } + } +}; + +Color.prototype = { + isValid: function () { + return this.valid; + }, + rgb: function () { + return this.setSpace('rgb', arguments); + }, + hsl: function () { + return this.setSpace('hsl', arguments); + }, + hsv: function () { + return this.setSpace('hsv', arguments); + }, + hwb: function () { + return this.setSpace('hwb', arguments); + }, + cmyk: function () { + return this.setSpace('cmyk', arguments); + }, + + rgbArray: function () { + return this.values.rgb; + }, + hslArray: function () { + return this.values.hsl; + }, + hsvArray: function () { + return this.values.hsv; + }, + hwbArray: function () { + var values = this.values; + if (values.alpha !== 1) { + return values.hwb.concat([values.alpha]); + } + return values.hwb; + }, + cmykArray: function () { + return this.values.cmyk; + }, + rgbaArray: function () { + var values = this.values; + return values.rgb.concat([values.alpha]); + }, + hslaArray: function () { + var values = this.values; + return values.hsl.concat([values.alpha]); + }, + alpha: function (val) { + if (val === undefined) { + return this.values.alpha; + } + this.setValues('alpha', val); + return this; + }, + + red: function (val) { + return this.setChannel('rgb', 0, val); + }, + green: function (val) { + return this.setChannel('rgb', 1, val); + }, + blue: function (val) { + return this.setChannel('rgb', 2, val); + }, + hue: function (val) { + if (val) { + val %= 360; + val = val < 0 ? 360 + val : val; + } + return this.setChannel('hsl', 0, val); + }, + saturation: function (val) { + return this.setChannel('hsl', 1, val); + }, + lightness: function (val) { + return this.setChannel('hsl', 2, val); + }, + saturationv: function (val) { + return this.setChannel('hsv', 1, val); + }, + whiteness: function (val) { + return this.setChannel('hwb', 1, val); + }, + blackness: function (val) { + return this.setChannel('hwb', 2, val); + }, + value: function (val) { + return this.setChannel('hsv', 2, val); + }, + cyan: function (val) { + return this.setChannel('cmyk', 0, val); + }, + magenta: function (val) { + return this.setChannel('cmyk', 1, val); + }, + yellow: function (val) { + return this.setChannel('cmyk', 2, val); + }, + black: function (val) { + return this.setChannel('cmyk', 3, val); + }, + + hexString: function () { + return colorString.hexString(this.values.rgb); + }, + rgbString: function () { + return colorString.rgbString(this.values.rgb, this.values.alpha); + }, + rgbaString: function () { + return colorString.rgbaString(this.values.rgb, this.values.alpha); + }, + percentString: function () { + return colorString.percentString(this.values.rgb, this.values.alpha); + }, + hslString: function () { + return colorString.hslString(this.values.hsl, this.values.alpha); + }, + hslaString: function () { + return colorString.hslaString(this.values.hsl, this.values.alpha); + }, + hwbString: function () { + return colorString.hwbString(this.values.hwb, this.values.alpha); + }, + keyword: function () { + return colorString.keyword(this.values.rgb, this.values.alpha); + }, + + rgbNumber: function () { + var rgb = this.values.rgb; + return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + }, + + luminosity: function () { + // http://www.w3.org/TR/WCAG20/#relativeluminancedef + var rgb = this.values.rgb; + var lum = []; + for (var i = 0; i < rgb.length; i++) { + var chan = rgb[i] / 255; + lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); + } + return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; + }, + + contrast: function (color2) { + // http://www.w3.org/TR/WCAG20/#contrast-ratiodef + var lum1 = this.luminosity(); + var lum2 = color2.luminosity(); + if (lum1 > lum2) { + return (lum1 + 0.05) / (lum2 + 0.05); + } + return (lum2 + 0.05) / (lum1 + 0.05); + }, + + level: function (color2) { + var contrastRatio = this.contrast(color2); + if (contrastRatio >= 7.1) { + return 'AAA'; + } + + return (contrastRatio >= 4.5) ? 'AA' : ''; + }, + + dark: function () { + // YIQ equation from http://24ways.org/2010/calculating-color-contrast + var rgb = this.values.rgb; + var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; + return yiq < 128; + }, + + light: function () { + return !this.dark(); + }, + + negate: function () { + var rgb = []; + for (var i = 0; i < 3; i++) { + rgb[i] = 255 - this.values.rgb[i]; + } + this.setValues('rgb', rgb); + return this; + }, + + lighten: function (ratio) { + var hsl = this.values.hsl; + hsl[2] += hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + darken: function (ratio) { + var hsl = this.values.hsl; + hsl[2] -= hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + saturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] += hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + desaturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] -= hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + whiten: function (ratio) { + var hwb = this.values.hwb; + hwb[1] += hwb[1] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + blacken: function (ratio) { + var hwb = this.values.hwb; + hwb[2] += hwb[2] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + greyscale: function () { + var rgb = this.values.rgb; + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; + this.setValues('rgb', [val, val, val]); + return this; + }, + + clearer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha - (alpha * ratio)); + return this; + }, + + opaquer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha + (alpha * ratio)); + return this; + }, + + rotate: function (degrees) { + var hsl = this.values.hsl; + var hue = (hsl[0] + degrees) % 360; + hsl[0] = hue < 0 ? 360 + hue : hue; + this.setValues('hsl', hsl); + return this; + }, + + /** + * Ported from sass implementation in C + * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 + */ + mix: function (mixinColor, weight) { + var color1 = this; + var color2 = mixinColor; + var p = weight === undefined ? 0.5 : weight; + + var w = 2 * p - 1; + var a = color1.alpha() - color2.alpha(); + + var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + return this + .rgb( + w1 * color1.red() + w2 * color2.red(), + w1 * color1.green() + w2 * color2.green(), + w1 * color1.blue() + w2 * color2.blue() + ) + .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); + }, + + toJSON: function () { + return this.rgb(); + }, + + clone: function () { + // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, + // making the final build way to big to embed in Chart.js. So let's do it manually, + // assuming that values to clone are 1 dimension arrays containing only numbers, + // except 'alpha' which is a number. + var result = new Color(); + var source = this.values; + var target = result.values; + var value, type; + + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + value = source[prop]; + type = ({}).toString.call(value); + if (type === '[object Array]') { + target[prop] = value.slice(0); + } else if (type === '[object Number]') { + target[prop] = value; + } else { + console.error('unexpected color value:', value); + } + } + } + + return result; + } +}; + +Color.prototype.spaces = { + rgb: ['red', 'green', 'blue'], + hsl: ['hue', 'saturation', 'lightness'], + hsv: ['hue', 'saturation', 'value'], + hwb: ['hue', 'whiteness', 'blackness'], + cmyk: ['cyan', 'magenta', 'yellow', 'black'] +}; + +Color.prototype.maxes = { + rgb: [255, 255, 255], + hsl: [360, 100, 100], + hsv: [360, 100, 100], + hwb: [360, 100, 100], + cmyk: [100, 100, 100, 100] +}; + +Color.prototype.getValues = function (space) { + var values = this.values; + var vals = {}; + + for (var i = 0; i < space.length; i++) { + vals[space.charAt(i)] = values[space][i]; + } + + if (values.alpha !== 1) { + vals.a = values.alpha; + } + + // {r: 255, g: 255, b: 255, a: 0.4} + return vals; +}; + +Color.prototype.setValues = function (space, vals) { + var values = this.values; + var spaces = this.spaces; + var maxes = this.maxes; + var alpha = 1; + var i; + + this.valid = true; + + if (space === 'alpha') { + alpha = vals; + } else if (vals.length) { + // [10, 10, 10] + values[space] = vals.slice(0, space.length); + alpha = vals[space.length]; + } else if (vals[space.charAt(0)] !== undefined) { + // {r: 10, g: 10, b: 10} + for (i = 0; i < space.length; i++) { + values[space][i] = vals[space.charAt(i)]; + } + + alpha = vals.a; + } else if (vals[spaces[space][0]] !== undefined) { + // {red: 10, green: 10, blue: 10} + var chans = spaces[space]; + + for (i = 0; i < space.length; i++) { + values[space][i] = vals[chans[i]]; + } + + alpha = vals.alpha; + } + + values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); + + if (space === 'alpha') { + return false; + } + + var capped; + + // cap values of the space prior converting all values + for (i = 0; i < space.length; i++) { + capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); + values[space][i] = Math.round(capped); + } + + // convert to all the other color spaces + for (var sname in spaces) { + if (sname !== space) { + values[sname] = colorConvert[space][sname](values[space]); + } + } + + return true; +}; + +Color.prototype.setSpace = function (space, args) { + var vals = args[0]; + + if (vals === undefined) { + // color.rgb() + return this.getValues(space); + } + + // color.rgb(10, 10, 10) + if (typeof vals === 'number') { + vals = Array.prototype.slice.call(args); + } + + this.setValues(space, vals); + return this; +}; + +Color.prototype.setChannel = function (space, index, val) { + var svalues = this.values[space]; + if (val === undefined) { + // color.red() + return svalues[index]; + } else if (val === svalues[index]) { + // color.red(color.red()) + return this; + } + + // color.red(100) + svalues[index] = val; + this.setValues(space, svalues); + + return this; +}; + +if (typeof window !== 'undefined') { + window.Color = Color; +} + +var chartjsColor = Color; + +/** + * @namespace Chart.helpers + */ +var helpers = { + /** + * An empty function that can be used, for example, for optional callback. + */ + noop: function() {}, + + /** + * Returns a unique id, sequentially generated from a global variable. + * @returns {number} + * @function + */ + uid: (function() { + var id = 0; + return function() { + return id++; + }; + }()), + + /** + * Returns true if `value` is neither null nor undefined, else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isNullOrUndef: function(value) { + return value === null || typeof value === 'undefined'; + }, + + /** + * Returns true if `value` is an array (including typed arrays), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @function + */ + isArray: function(value) { + if (Array.isArray && Array.isArray(value)) { + return true; + } + var type = Object.prototype.toString.call(value); + if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { + return true; + } + return false; + }, + + /** + * Returns true if `value` is an object (excluding null), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isObject: function(value) { + return value !== null && Object.prototype.toString.call(value) === '[object Object]'; + }, + + /** + * Returns true if `value` is a finite number, else returns false + * @param {*} value - The value to test. + * @returns {boolean} + */ + isFinite: function(value) { + return (typeof value === 'number' || value instanceof Number) && isFinite(value); + }, + + /** + * Returns `value` if defined, else returns `defaultValue`. + * @param {*} value - The value to return if defined. + * @param {*} defaultValue - The value to return if `value` is undefined. + * @returns {*} + */ + valueOrDefault: function(value, defaultValue) { + return typeof value === 'undefined' ? defaultValue : value; + }, + + /** + * Returns value at the given `index` in array if defined, else returns `defaultValue`. + * @param {Array} value - The array to lookup for value at `index`. + * @param {number} index - The index in `value` to lookup for value. + * @param {*} defaultValue - The value to return if `value[index]` is undefined. + * @returns {*} + */ + valueAtIndexOrDefault: function(value, index, defaultValue) { + return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); + }, + + /** + * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the + * value returned by `fn`. If `fn` is not a function, this method returns undefined. + * @param {function} fn - The function to call. + * @param {Array|undefined|null} args - The arguments with which `fn` should be called. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @returns {*} + */ + callback: function(fn, args, thisArg) { + if (fn && typeof fn.call === 'function') { + return fn.apply(thisArg, args); + } + }, + + /** + * Note(SB) for performance sake, this method should only be used when loopable type + * is unknown or in none intensive code (not called often and small loopable). Else + * it's preferable to use a regular for() loop and save extra function calls. + * @param {object|Array} loopable - The object or array to be iterated. + * @param {function} fn - The function to call for each item. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @param {boolean} [reverse] - If true, iterates backward on the loopable. + */ + each: function(loopable, fn, thisArg, reverse) { + var i, len, keys; + if (helpers.isArray(loopable)) { + len = loopable.length; + if (reverse) { + for (i = len - 1; i >= 0; i--) { + fn.call(thisArg, loopable[i], i); + } + } else { + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[i], i); + } + } + } else if (helpers.isObject(loopable)) { + keys = Object.keys(loopable); + len = keys.length; + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[keys[i]], keys[i]); + } + } + }, + + /** + * Returns true if the `a0` and `a1` arrays have the same content, else returns false. + * @see https://stackoverflow.com/a/14853974 + * @param {Array} a0 - The array to compare + * @param {Array} a1 - The array to compare + * @returns {boolean} + */ + arrayEquals: function(a0, a1) { + var i, ilen, v0, v1; + + if (!a0 || !a1 || a0.length !== a1.length) { + return false; + } + + for (i = 0, ilen = a0.length; i < ilen; ++i) { + v0 = a0[i]; + v1 = a1[i]; + + if (v0 instanceof Array && v1 instanceof Array) { + if (!helpers.arrayEquals(v0, v1)) { + return false; + } + } else if (v0 !== v1) { + // NOTE: two different object instances will never be equal: {x:20} != {x:20} + return false; + } + } + + return true; + }, + + /** + * Returns a deep copy of `source` without keeping references on objects and arrays. + * @param {*} source - The value to clone. + * @returns {*} + */ + clone: function(source) { + if (helpers.isArray(source)) { + return source.map(helpers.clone); + } + + if (helpers.isObject(source)) { + var target = {}; + var keys = Object.keys(source); + var klen = keys.length; + var k = 0; + + for (; k < klen; ++k) { + target[keys[k]] = helpers.clone(source[keys[k]]); + } + + return target; + } + + return source; + }, + + /** + * The default merger when Chart.helpers.merge is called without merger option. + * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. + * @private + */ + _merger: function(key, target, source, options) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.merge(tval, sval, options); + } else { + target[key] = helpers.clone(sval); + } + }, + + /** + * Merges source[key] in target[key] only if target[key] is undefined. + * @private + */ + _mergerIf: function(key, target, source) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.mergeIf(tval, sval); + } else if (!target.hasOwnProperty(key)) { + target[key] = helpers.clone(sval); + } + }, + + /** + * Recursively deep copies `source` properties into `target` with the given `options`. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @param {object} [options] - Merging options: + * @param {function} [options.merger] - The merge method (key, target, source, options) + * @returns {object} The `target` object. + */ + merge: function(target, source, options) { + var sources = helpers.isArray(source) ? source : [source]; + var ilen = sources.length; + var merge, i, keys, klen, k; + + if (!helpers.isObject(target)) { + return target; + } + + options = options || {}; + merge = options.merger || helpers._merger; + + for (i = 0; i < ilen; ++i) { + source = sources[i]; + if (!helpers.isObject(source)) { + continue; + } + + keys = Object.keys(source); + for (k = 0, klen = keys.length; k < klen; ++k) { + merge(keys[k], target, source, options); + } + } + + return target; + }, + + /** + * Recursively deep copies `source` properties into `target` *only* if not defined in target. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @returns {object} The `target` object. + */ + mergeIf: function(target, source) { + return helpers.merge(target, source, {merger: helpers._mergerIf}); + }, + + /** + * Applies the contents of two or more objects together into the first object. + * @param {object} target - The target object in which all objects are merged into. + * @param {object} arg1 - Object containing additional properties to merge in target. + * @param {object} argN - Additional objects containing properties to merge in target. + * @returns {object} The `target` object. + */ + extend: function(target) { + var setFn = function(value, key) { + target[key] = value; + }; + for (var i = 1, ilen = arguments.length; i < ilen; ++i) { + helpers.each(arguments[i], setFn); + } + return target; + }, + + /** + * Basic javascript inheritance based on the model created in Backbone.js + */ + inherits: function(extensions) { + var me = this; + var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { + return me.apply(this, arguments); + }; + + var Surrogate = function() { + this.constructor = ChartElement; + }; + + Surrogate.prototype = me.prototype; + ChartElement.prototype = new Surrogate(); + ChartElement.extend = helpers.inherits; + + if (extensions) { + helpers.extend(ChartElement.prototype, extensions); + } + + ChartElement.__super__ = me.prototype; + return ChartElement; + } +}; + +var helpers_core = helpers; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.callback instead. + * @function Chart.helpers.callCallback + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +helpers.callCallback = helpers.callback; + +/** + * Provided for backward compatibility, use Array.prototype.indexOf instead. + * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ + * @function Chart.helpers.indexOf + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.indexOf = function(array, item, fromIndex) { + return Array.prototype.indexOf.call(array, item, fromIndex); +}; + +/** + * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. + * @function Chart.helpers.getValueOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueOrDefault = helpers.valueOrDefault; + +/** + * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. + * @function Chart.helpers.getValueAtIndexOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + +/** + * Easing functions adapted from Robert Penner's easing equations. + * @namespace Chart.helpers.easingEffects + * @see http://www.robertpenner.com/easing/ + */ +var effects = { + linear: function(t) { + return t; + }, + + easeInQuad: function(t) { + return t * t; + }, + + easeOutQuad: function(t) { + return -t * (t - 2); + }, + + easeInOutQuad: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t; + } + return -0.5 * ((--t) * (t - 2) - 1); + }, + + easeInCubic: function(t) { + return t * t * t; + }, + + easeOutCubic: function(t) { + return (t = t - 1) * t * t + 1; + }, + + easeInOutCubic: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t; + } + return 0.5 * ((t -= 2) * t * t + 2); + }, + + easeInQuart: function(t) { + return t * t * t * t; + }, + + easeOutQuart: function(t) { + return -((t = t - 1) * t * t * t - 1); + }, + + easeInOutQuart: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t; + } + return -0.5 * ((t -= 2) * t * t * t - 2); + }, + + easeInQuint: function(t) { + return t * t * t * t * t; + }, + + easeOutQuint: function(t) { + return (t = t - 1) * t * t * t * t + 1; + }, + + easeInOutQuint: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t * t; + } + return 0.5 * ((t -= 2) * t * t * t * t + 2); + }, + + easeInSine: function(t) { + return -Math.cos(t * (Math.PI / 2)) + 1; + }, + + easeOutSine: function(t) { + return Math.sin(t * (Math.PI / 2)); + }, + + easeInOutSine: function(t) { + return -0.5 * (Math.cos(Math.PI * t) - 1); + }, + + easeInExpo: function(t) { + return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); + }, + + easeOutExpo: function(t) { + return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; + }, + + easeInOutExpo: function(t) { + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if ((t /= 0.5) < 1) { + return 0.5 * Math.pow(2, 10 * (t - 1)); + } + return 0.5 * (-Math.pow(2, -10 * --t) + 2); + }, + + easeInCirc: function(t) { + if (t >= 1) { + return t; + } + return -(Math.sqrt(1 - t * t) - 1); + }, + + easeOutCirc: function(t) { + return Math.sqrt(1 - (t = t - 1) * t); + }, + + easeInOutCirc: function(t) { + if ((t /= 0.5) < 1) { + return -0.5 * (Math.sqrt(1 - t * t) - 1); + } + return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + + easeInElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + }, + + easeOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; + }, + + easeInOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if ((t /= 0.5) === 2) { + return 1; + } + if (!p) { + p = 0.45; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + if (t < 1) { + return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function(t) { + var s = 1.70158; + return t * t * ((s + 1) * t - s); + }, + + easeOutBack: function(t) { + var s = 1.70158; + return (t = t - 1) * t * ((s + 1) * t + s) + 1; + }, + + easeInOutBack: function(t) { + var s = 1.70158; + if ((t /= 0.5) < 1) { + return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); + } + return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + + easeInBounce: function(t) { + return 1 - effects.easeOutBounce(1 - t); + }, + + easeOutBounce: function(t) { + if (t < (1 / 2.75)) { + return 7.5625 * t * t; + } + if (t < (2 / 2.75)) { + return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; + } + if (t < (2.5 / 2.75)) { + return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; + } + return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; + }, + + easeInOutBounce: function(t) { + if (t < 0.5) { + return effects.easeInBounce(t * 2) * 0.5; + } + return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; + } +}; + +var helpers_easing = { + effects: effects +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.easing.effects instead. + * @function Chart.helpers.easingEffects + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.easingEffects = effects; + +var PI = Math.PI; +var RAD_PER_DEG = PI / 180; +var DOUBLE_PI = PI * 2; +var HALF_PI = PI / 2; +var QUARTER_PI = PI / 4; +var TWO_THIRDS_PI = PI * 2 / 3; + +/** + * @namespace Chart.helpers.canvas + */ +var exports$1 = { + /** + * Clears the entire canvas associated to the given `chart`. + * @param {Chart} chart - The chart for which to clear the canvas. + */ + clear: function(chart) { + chart.ctx.clearRect(0, 0, chart.width, chart.height); + }, + + /** + * Creates a "path" for a rectangle with rounded corners at position (x, y) with a + * given size (width, height) and the same `radius` for all corners. + * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. + * @param {number} x - The x axis of the coordinate for the rectangle starting point. + * @param {number} y - The y axis of the coordinate for the rectangle starting point. + * @param {number} width - The rectangle's width. + * @param {number} height - The rectangle's height. + * @param {number} radius - The rounded amount (in pixels) for the four corners. + * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? + */ + roundedRect: function(ctx, x, y, width, height, radius) { + if (radius) { + var r = Math.min(radius, height / 2, width / 2); + var left = x + r; + var top = y + r; + var right = x + width - r; + var bottom = y + height - r; + + ctx.moveTo(x, top); + if (left < right && top < bottom) { + ctx.arc(left, top, r, -PI, -HALF_PI); + ctx.arc(right, top, r, -HALF_PI, 0); + ctx.arc(right, bottom, r, 0, HALF_PI); + ctx.arc(left, bottom, r, HALF_PI, PI); + } else if (left < right) { + ctx.moveTo(left, y); + ctx.arc(right, top, r, -HALF_PI, HALF_PI); + ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); + } else if (top < bottom) { + ctx.arc(left, top, r, -PI, 0); + ctx.arc(left, bottom, r, 0, PI); + } else { + ctx.arc(left, top, r, -PI, PI); + } + ctx.closePath(); + ctx.moveTo(x, y); + } else { + ctx.rect(x, y, width, height); + } + }, + + drawPoint: function(ctx, style, radius, x, y, rotation) { + var type, xOffset, yOffset, size, cornerRadius; + var rad = (rotation || 0) * RAD_PER_DEG; + + if (style && typeof style === 'object') { + type = style.toString(); + if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { + ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); + return; + } + } + + if (isNaN(radius) || radius <= 0) { + return; + } + + ctx.beginPath(); + + switch (style) { + // Default includes circle + default: + ctx.arc(x, y, radius, 0, DOUBLE_PI); + ctx.closePath(); + break; + case 'triangle': + ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + ctx.closePath(); + break; + case 'rectRounded': + // NOTE: the rounded rect implementation changed to use `arc` instead of + // `quadraticCurveTo` since it generates better results when rect is + // almost a circle. 0.516 (instead of 0.5) produces results with visually + // closer proportion to the previous impl and it is inscribed in the + // circle with `radius`. For more details, see the following PRs: + // https://github.com/chartjs/Chart.js/issues/5597 + // https://github.com/chartjs/Chart.js/issues/5858 + cornerRadius = radius * 0.516; + size = radius - cornerRadius; + xOffset = Math.cos(rad + QUARTER_PI) * size; + yOffset = Math.sin(rad + QUARTER_PI) * size; + ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); + ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); + ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); + ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); + ctx.closePath(); + break; + case 'rect': + if (!rotation) { + size = Math.SQRT1_2 * radius; + ctx.rect(x - size, y - size, 2 * size, 2 * size); + break; + } + rad += QUARTER_PI; + /* falls through */ + case 'rectRot': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + yOffset, y - xOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.lineTo(x - yOffset, y + xOffset); + ctx.closePath(); + break; + case 'crossRot': + rad += QUARTER_PI; + /* falls through */ + case 'cross': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'star': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + rad += QUARTER_PI; + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'line': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + break; + case 'dash': + ctx.moveTo(x, y); + ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); + break; + } + + ctx.fill(); + ctx.stroke(); + }, + + /** + * Returns true if the point is inside the rectangle + * @param {object} point - The point to test + * @param {object} area - The rectangle + * @returns {boolean} + * @private + */ + _isPointInArea: function(point, area) { + var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error. + + return point.x > area.left - epsilon && point.x < area.right + epsilon && + point.y > area.top - epsilon && point.y < area.bottom + epsilon; + }, + + clipArea: function(ctx, area) { + ctx.save(); + ctx.beginPath(); + ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); + ctx.clip(); + }, + + unclipArea: function(ctx) { + ctx.restore(); + }, + + lineTo: function(ctx, previous, target, flip) { + var stepped = target.steppedLine; + if (stepped) { + if (stepped === 'middle') { + var midpoint = (previous.x + target.x) / 2.0; + ctx.lineTo(midpoint, flip ? target.y : previous.y); + ctx.lineTo(midpoint, flip ? previous.y : target.y); + } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) { + ctx.lineTo(previous.x, target.y); + } else { + ctx.lineTo(target.x, previous.y); + } + ctx.lineTo(target.x, target.y); + return; + } + + if (!target.tension) { + ctx.lineTo(target.x, target.y); + return; + } + + ctx.bezierCurveTo( + flip ? previous.controlPointPreviousX : previous.controlPointNextX, + flip ? previous.controlPointPreviousY : previous.controlPointNextY, + flip ? target.controlPointNextX : target.controlPointPreviousX, + flip ? target.controlPointNextY : target.controlPointPreviousY, + target.x, + target.y); + } +}; + +var helpers_canvas = exports$1; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. + * @namespace Chart.helpers.clear + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.clear = exports$1.clear; + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. + * @namespace Chart.helpers.drawRoundedRectangle + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.drawRoundedRectangle = function(ctx) { + ctx.beginPath(); + exports$1.roundedRect.apply(exports$1, arguments); +}; + +var defaults = { + /** + * @private + */ + _set: function(scope, values) { + return helpers_core.merge(this[scope] || (this[scope] = {}), values); + } +}; + +defaults._set('global', { + defaultColor: 'rgba(0,0,0,0.1)', + defaultFontColor: '#666', + defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + defaultFontSize: 12, + defaultFontStyle: 'normal', + defaultLineHeight: 1.2, + showLines: true +}); + +var core_defaults = defaults; + +var valueOrDefault = helpers_core.valueOrDefault; + +/** + * Converts the given font object into a CSS font string. + * @param {object} font - A font object. + * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font + * @private + */ +function toFontString(font) { + if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) { + return null; + } + + return (font.style ? font.style + ' ' : '') + + (font.weight ? font.weight + ' ' : '') + + font.size + 'px ' + + font.family; +} + +/** + * @alias Chart.helpers.options + * @namespace + */ +var helpers_options = { + /** + * Converts the given line height `value` in pixels for a specific font `size`. + * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). + * @param {number} size - The font size (in pixels) used to resolve relative `value`. + * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid). + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height + * @since 2.7.0 + */ + toLineHeight: function(value, size) { + var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); + if (!matches || matches[1] === 'normal') { + return size * 1.2; + } + + value = +matches[2]; + + switch (matches[3]) { + case 'px': + return value; + case '%': + value /= 100; + break; + default: + break; + } + + return size * value; + }, + + /** + * Converts the given value into a padding object with pre-computed width/height. + * @param {number|object} value - If a number, set the value to all TRBL component, + * else, if and object, use defined properties and sets undefined ones to 0. + * @returns {object} The padding values (top, right, bottom, left, width, height) + * @since 2.7.0 + */ + toPadding: function(value) { + var t, r, b, l; + + if (helpers_core.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + top: t, + right: r, + bottom: b, + left: l, + height: t + b, + width: l + r + }; + }, + + /** + * Parses font options and returns the font object. + * @param {object} options - A object that contains font options to be parsed. + * @return {object} The font object. + * @todo Support font.* options and renamed to toFont(). + * @private + */ + _parseFont: function(options) { + var globalDefaults = core_defaults.global; + var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); + var font = { + family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily), + lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size), + size: size, + style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle), + weight: null, + string: '' + }; + + font.string = toFontString(font); + return font; + }, + + /** + * Evaluates the given `inputs` sequentially and returns the first defined value. + * @param {Array} inputs - An array of values, falling back to the last value. + * @param {object} [context] - If defined and the current value is a function, the value + * is called with `context` as first argument and the result becomes the new input. + * @param {number} [index] - If defined and the current value is an array, the value + * at `index` become the new input. + * @since 2.7.0 + */ + resolve: function(inputs, context, index) { + var i, ilen, value; + + for (i = 0, ilen = inputs.length; i < ilen; ++i) { + value = inputs[i]; + if (value === undefined) { + continue; + } + if (context !== undefined && typeof value === 'function') { + value = value(context); + } + if (index !== undefined && helpers_core.isArray(value)) { + value = value[index]; + } + if (value !== undefined) { + return value; + } + } + } +}; + +var helpers$1 = helpers_core; +var easing = helpers_easing; +var canvas = helpers_canvas; +var options = helpers_options; +helpers$1.easing = easing; +helpers$1.canvas = canvas; +helpers$1.options = options; + +function interpolate(start, view, model, ease) { + var keys = Object.keys(model); + var i, ilen, key, actual, origin, target, type, c0, c1; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + + target = model[key]; + + // if a value is added to the model after pivot() has been called, the view + // doesn't contain it, so let's initialize the view to the target value. + if (!view.hasOwnProperty(key)) { + view[key] = target; + } + + actual = view[key]; + + if (actual === target || key[0] === '_') { + continue; + } + + if (!start.hasOwnProperty(key)) { + start[key] = actual; + } + + origin = start[key]; + + type = typeof target; + + if (type === typeof origin) { + if (type === 'string') { + c0 = chartjsColor(origin); + if (c0.valid) { + c1 = chartjsColor(target); + if (c1.valid) { + view[key] = c1.mix(c0, ease).rgbString(); + continue; + } + } + } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) { + view[key] = origin + (target - origin) * ease; + continue; + } + } + + view[key] = target; + } +} + +var Element = function(configuration) { + helpers$1.extend(this, configuration); + this.initialize.apply(this, arguments); +}; + +helpers$1.extend(Element.prototype, { + + initialize: function() { + this.hidden = false; + }, + + pivot: function() { + var me = this; + if (!me._view) { + me._view = helpers$1.clone(me._model); + } + me._start = {}; + return me; + }, + + transition: function(ease) { + var me = this; + var model = me._model; + var start = me._start; + var view = me._view; + + // No animation -> No Transition + if (!model || ease === 1) { + me._view = model; + me._start = null; + return me; + } + + if (!view) { + view = me._view = {}; + } + + if (!start) { + start = me._start = {}; + } + + interpolate(start, view, model, ease); + + return me; + }, + + tooltipPosition: function() { + return { + x: this._model.x, + y: this._model.y + }; + }, + + hasValue: function() { + return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y); + } +}); + +Element.extend = helpers$1.inherits; + +var core_element = Element; + +var exports$2 = core_element.extend({ + chart: null, // the animation associated chart instance + currentStep: 0, // the current animation step + numSteps: 60, // default number of steps + easing: '', // the easing to use for this animation + render: null, // render function used by the animation service + + onAnimationProgress: null, // user specified callback to fire on each step of the animation + onAnimationComplete: null, // user specified callback to fire when the animation finishes +}); + +var core_animation = exports$2; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.Animation instead + * @prop Chart.Animation#animationObject + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$2.prototype, 'animationObject', { + get: function() { + return this; + } +}); + +/** + * Provided for backward compatibility, use Chart.Animation#chart instead + * @prop Chart.Animation#chartInstance + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$2.prototype, 'chartInstance', { + get: function() { + return this.chart; + }, + set: function(value) { + this.chart = value; + } +}); + +core_defaults._set('global', { + animation: { + duration: 1000, + easing: 'easeOutQuart', + onProgress: helpers$1.noop, + onComplete: helpers$1.noop + } +}); + +var core_animations = { + animations: [], + request: null, + + /** + * @param {Chart} chart - The chart to animate. + * @param {Chart.Animation} animation - The animation that we will animate. + * @param {number} duration - The animation duration in ms. + * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions + */ + addAnimation: function(chart, animation, duration, lazy) { + var animations = this.animations; + var i, ilen; + + animation.chart = chart; + animation.startTime = Date.now(); + animation.duration = duration; + + if (!lazy) { + chart.animating = true; + } + + for (i = 0, ilen = animations.length; i < ilen; ++i) { + if (animations[i].chart === chart) { + animations[i] = animation; + return; + } + } + + animations.push(animation); + + // If there are no animations queued, manually kickstart a digest, for lack of a better word + if (animations.length === 1) { + this.requestAnimationFrame(); + } + }, + + cancelAnimation: function(chart) { + var index = helpers$1.findIndex(this.animations, function(animation) { + return animation.chart === chart; + }); + + if (index !== -1) { + this.animations.splice(index, 1); + chart.animating = false; + } + }, + + requestAnimationFrame: function() { + var me = this; + if (me.request === null) { + // Skip animation frame requests until the active one is executed. + // This can happen when processing mouse events, e.g. 'mousemove' + // and 'mouseout' events will trigger multiple renders. + me.request = helpers$1.requestAnimFrame.call(window, function() { + me.request = null; + me.startDigest(); + }); + } + }, + + /** + * @private + */ + startDigest: function() { + var me = this; + + me.advance(); + + // Do we have more stuff to animate? + if (me.animations.length > 0) { + me.requestAnimationFrame(); + } + }, + + /** + * @private + */ + advance: function() { + var animations = this.animations; + var animation, chart, numSteps, nextStep; + var i = 0; + + // 1 animation per chart, so we are looping charts here + while (i < animations.length) { + animation = animations[i]; + chart = animation.chart; + numSteps = animation.numSteps; + + // Make sure that currentStep starts at 1 + // https://github.com/chartjs/Chart.js/issues/6104 + nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1; + animation.currentStep = Math.min(nextStep, numSteps); + + helpers$1.callback(animation.render, [chart, animation], chart); + helpers$1.callback(animation.onAnimationProgress, [animation], chart); + + if (animation.currentStep >= numSteps) { + helpers$1.callback(animation.onAnimationComplete, [animation], chart); + chart.animating = false; + animations.splice(i, 1); + } else { + ++i; + } + } + } +}; + +var resolve = helpers$1.options.resolve; + +var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; + +/** + * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', + * 'unshift') and notify the listener AFTER the array has been altered. Listeners are + * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. + */ +function listenArrayEvents(array, listener) { + if (array._chartjs) { + array._chartjs.listeners.push(listener); + return; + } + + Object.defineProperty(array, '_chartjs', { + configurable: true, + enumerable: false, + value: { + listeners: [listener] + } + }); + + arrayEvents.forEach(function(key) { + var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); + var base = array[key]; + + Object.defineProperty(array, key, { + configurable: true, + enumerable: false, + value: function() { + var args = Array.prototype.slice.call(arguments); + var res = base.apply(this, args); + + helpers$1.each(array._chartjs.listeners, function(object) { + if (typeof object[method] === 'function') { + object[method].apply(object, args); + } + }); + + return res; + } + }); + }); +} + +/** + * Removes the given array event listener and cleanup extra attached properties (such as + * the _chartjs stub and overridden methods) if array doesn't have any more listeners. + */ +function unlistenArrayEvents(array, listener) { + var stub = array._chartjs; + if (!stub) { + return; + } + + var listeners = stub.listeners; + var index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + + if (listeners.length > 0) { + return; + } + + arrayEvents.forEach(function(key) { + delete array[key]; + }); + + delete array._chartjs; +} + +// Base class for all dataset controllers (line, bar, etc) +var DatasetController = function(chart, datasetIndex) { + this.initialize(chart, datasetIndex); +}; + +helpers$1.extend(DatasetController.prototype, { + + /** + * Element type used to generate a meta dataset (e.g. Chart.element.Line). + * @type {Chart.core.element} + */ + datasetElementType: null, + + /** + * Element type used to generate a meta data (e.g. Chart.element.Point). + * @type {Chart.core.element} + */ + dataElementType: null, + + initialize: function(chart, datasetIndex) { + var me = this; + me.chart = chart; + me.index = datasetIndex; + me.linkScales(); + me.addElements(); + }, + + updateIndex: function(datasetIndex) { + this.index = datasetIndex; + }, + + linkScales: function() { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + + if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) { + meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; + } + if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) { + meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; + } + }, + + getDataset: function() { + return this.chart.data.datasets[this.index]; + }, + + getMeta: function() { + return this.chart.getDatasetMeta(this.index); + }, + + getScaleForId: function(scaleID) { + return this.chart.scales[scaleID]; + }, + + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().yAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getValueScale: function() { + return this.getScaleForId(this._getValueScaleId()); + }, + + /** + * @private + */ + _getIndexScale: function() { + return this.getScaleForId(this._getIndexScaleId()); + }, + + reset: function() { + this.update(true); + }, + + /** + * @private + */ + destroy: function() { + if (this._data) { + unlistenArrayEvents(this._data, this); + } + }, + + createMetaDataset: function() { + var me = this; + var type = me.datasetElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index + }); + }, + + createMetaData: function(index) { + var me = this; + var type = me.dataElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index, + _index: index + }); + }, + + addElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data || []; + var metaData = meta.data; + var i, ilen; + + for (i = 0, ilen = data.length; i < ilen; ++i) { + metaData[i] = metaData[i] || me.createMetaData(i); + } + + meta.dataset = meta.dataset || me.createMetaDataset(); + }, + + addElementAndReset: function(index) { + var element = this.createMetaData(index); + this.getMeta().data.splice(index, 0, element); + this.updateElement(element, index, true); + }, + + buildOrUpdateElements: function() { + var me = this; + var dataset = me.getDataset(); + var data = dataset.data || (dataset.data = []); + + // In order to correctly handle data addition/deletion animation (an thus simulate + // real-time charts), we need to monitor these data modifications and synchronize + // the internal meta data accordingly. + if (me._data !== data) { + if (me._data) { + // This case happens when the user replaced the data array instance. + unlistenArrayEvents(me._data, me); + } + + if (data && Object.isExtensible(data)) { + listenArrayEvents(data, me); + } + me._data = data; + } + + // Re-sync meta data in case the user replaced the data array or if we missed + // any updates and so make sure that we handle number of datapoints changing. + me.resyncElements(); + }, + + update: helpers$1.noop, + + transition: function(easingValue) { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + for (; i < ilen; ++i) { + elements[i].transition(easingValue); + } + + if (meta.dataset) { + meta.dataset.transition(easingValue); + } + }, + + draw: function() { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + if (meta.dataset) { + meta.dataset.draw(); + } + + for (; i < ilen; ++i) { + elements[i].draw(); + } + }, + + removeHoverStyle: function(element) { + helpers$1.merge(element._model, element.$previousStyle || {}); + delete element.$previousStyle; + }, + + setHoverStyle: function(element) { + var dataset = this.chart.data.datasets[element._datasetIndex]; + var index = element._index; + var custom = element.custom || {}; + var model = element._model; + var getHoverColor = helpers$1.getHoverColor; + + element.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth + }; + + model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index); + model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index); + model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index); + }, + + /** + * @private + */ + resyncElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data; + var numMeta = meta.data.length; + var numData = data.length; + + if (numData < numMeta) { + meta.data.splice(numData, numMeta - numData); + } else if (numData > numMeta) { + me.insertElements(numMeta, numData - numMeta); + } + }, + + /** + * @private + */ + insertElements: function(start, count) { + for (var i = 0; i < count; ++i) { + this.addElementAndReset(start + i); + } + }, + + /** + * @private + */ + onDataPush: function() { + var count = arguments.length; + this.insertElements(this.getDataset().data.length - count, count); + }, + + /** + * @private + */ + onDataPop: function() { + this.getMeta().data.pop(); + }, + + /** + * @private + */ + onDataShift: function() { + this.getMeta().data.shift(); + }, + + /** + * @private + */ + onDataSplice: function(start, count) { + this.getMeta().data.splice(start, count); + this.insertElements(start, arguments.length - 2); + }, + + /** + * @private + */ + onDataUnshift: function() { + this.insertElements(0, arguments.length); + } +}); + +DatasetController.extend = helpers$1.inherits; + +var core_datasetController = DatasetController; + +core_defaults._set('global', { + elements: { + arc: { + backgroundColor: core_defaults.global.defaultColor, + borderColor: '#fff', + borderWidth: 2, + borderAlign: 'center' + } + } +}); + +var element_arc = core_element.extend({ + inLabelRange: function(mouseX) { + var vm = this._view; + + if (vm) { + return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); + } + return false; + }, + + inRange: function(chartX, chartY) { + var vm = this._view; + + if (vm) { + var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY}); + var angle = pointRelativePosition.angle; + var distance = pointRelativePosition.distance; + + // Sanitise angle range + var startAngle = vm.startAngle; + var endAngle = vm.endAngle; + while (endAngle < startAngle) { + endAngle += 2.0 * Math.PI; + } + while (angle > endAngle) { + angle -= 2.0 * Math.PI; + } + while (angle < startAngle) { + angle += 2.0 * Math.PI; + } + + // Check if within the range of the open/close angle + var betweenAngles = (angle >= startAngle && angle <= endAngle); + var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); + + return (betweenAngles && withinRadius); + } + return false; + }, + + getCenterPoint: function() { + var vm = this._view; + var halfAngle = (vm.startAngle + vm.endAngle) / 2; + var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; + return { + x: vm.x + Math.cos(halfAngle) * halfRadius, + y: vm.y + Math.sin(halfAngle) * halfRadius + }; + }, + + getArea: function() { + var vm = this._view; + return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); + }, + + tooltipPosition: function() { + var vm = this._view; + var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); + var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; + + return { + x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), + y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var sA = vm.startAngle; + var eA = vm.endAngle; + var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0; + var angleMargin; + + ctx.save(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.fillStyle = vm.backgroundColor; + ctx.fill(); + + if (vm.borderWidth) { + if (vm.borderAlign === 'inner') { + // Draw an inner border by cliping the arc and drawing a double-width border + // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders + ctx.beginPath(); + angleMargin = pixelMargin / vm.outerRadius; + ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin); + if (vm.innerRadius > pixelMargin) { + angleMargin = pixelMargin / vm.innerRadius; + ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true); + } else { + ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2); + } + ctx.closePath(); + ctx.clip(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.lineWidth = vm.borderWidth * 2; + ctx.lineJoin = 'round'; + } else { + ctx.lineWidth = vm.borderWidth; + ctx.lineJoin = 'bevel'; + } + + ctx.strokeStyle = vm.borderColor; + ctx.stroke(); + } + + ctx.restore(); + } +}); + +var valueOrDefault$1 = helpers$1.valueOrDefault; + +var defaultColor = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + line: { + tension: 0.4, + backgroundColor: defaultColor, + borderWidth: 3, + borderColor: defaultColor, + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + capBezierPoints: true, + fill: true, // do we fill in the area between the line and its base axis + } + } +}); + +var element_line = core_element.extend({ + draw: function() { + var me = this; + var vm = me._view; + var ctx = me._chart.ctx; + var spanGaps = vm.spanGaps; + var points = me._children.slice(); // clone array + var globalDefaults = core_defaults.global; + var globalOptionLineElements = globalDefaults.elements.line; + var lastDrawnIndex = -1; + var index, current, previous, currentVM; + + // If we are looping, adding the first point again + if (me._loop && points.length) { + points.push(points[0]); + } + + ctx.save(); + + // Stroke Line Options + ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; + + // IE 9 and 10 do not support line dash + if (ctx.setLineDash) { + ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); + } + + ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset); + ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; + ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth); + ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; + + // Stroke Line + ctx.beginPath(); + lastDrawnIndex = -1; + + for (index = 0; index < points.length; ++index) { + current = points[index]; + previous = helpers$1.previousItem(points, index); + currentVM = current._view; + + // First point moves to it's starting position no matter what + if (index === 0) { + if (!currentVM.skip) { + ctx.moveTo(currentVM.x, currentVM.y); + lastDrawnIndex = index; + } + } else { + previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; + + if (!currentVM.skip) { + if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { + // There was a gap and this is the first point after the gap + ctx.moveTo(currentVM.x, currentVM.y); + } else { + // Line to next point + helpers$1.canvas.lineTo(ctx, previous._view, current._view); + } + lastDrawnIndex = index; + } + } + } + + ctx.stroke(); + ctx.restore(); + } +}); + +var valueOrDefault$2 = helpers$1.valueOrDefault; + +var defaultColor$1 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + point: { + radius: 3, + pointStyle: 'circle', + backgroundColor: defaultColor$1, + borderColor: defaultColor$1, + borderWidth: 1, + // Hover + hitRadius: 1, + hoverRadius: 4, + hoverBorderWidth: 1 + } + } +}); + +function xRange(mouseX) { + var vm = this._view; + return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false; +} + +function yRange(mouseY) { + var vm = this._view; + return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false; +} + +var element_point = core_element.extend({ + inRange: function(mouseX, mouseY) { + var vm = this._view; + return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; + }, + + inLabelRange: xRange, + inXRange: xRange, + inYRange: yRange, + + getCenterPoint: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + }, + + getArea: function() { + return Math.PI * Math.pow(this._view.radius, 2); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y, + padding: vm.radius + vm.borderWidth + }; + }, + + draw: function(chartArea) { + var vm = this._view; + var ctx = this._chart.ctx; + var pointStyle = vm.pointStyle; + var rotation = vm.rotation; + var radius = vm.radius; + var x = vm.x; + var y = vm.y; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow + + if (vm.skip) { + return; + } + + // Clipping for Points. + if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) { + ctx.strokeStyle = vm.borderColor || defaultColor; + ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth); + ctx.fillStyle = vm.backgroundColor || defaultColor; + helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation); + } + } +}); + +var defaultColor$2 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + rectangle: { + backgroundColor: defaultColor$2, + borderColor: defaultColor$2, + borderSkipped: 'bottom', + borderWidth: 0 + } + } +}); + +function isVertical(vm) { + return vm && vm.width !== undefined; +} + +/** + * Helper function to get the bounds of the bar regardless of the orientation + * @param bar {Chart.Element.Rectangle} the bar + * @return {Bounds} bounds of the bar + * @private + */ +function getBarBounds(vm) { + var x1, x2, y1, y2, half; + + if (isVertical(vm)) { + half = vm.width / 2; + x1 = vm.x - half; + x2 = vm.x + half; + y1 = Math.min(vm.y, vm.base); + y2 = Math.max(vm.y, vm.base); + } else { + half = vm.height / 2; + x1 = Math.min(vm.x, vm.base); + x2 = Math.max(vm.x, vm.base); + y1 = vm.y - half; + y2 = vm.y + half; + } + + return { + left: x1, + top: y1, + right: x2, + bottom: y2 + }; +} + +function swap(orig, v1, v2) { + return orig === v1 ? v2 : orig === v2 ? v1 : orig; +} + +function parseBorderSkipped(vm) { + var edge = vm.borderSkipped; + var res = {}; + + if (!edge) { + return res; + } + + if (vm.horizontal) { + if (vm.base > vm.x) { + edge = swap(edge, 'left', 'right'); + } + } else if (vm.base < vm.y) { + edge = swap(edge, 'bottom', 'top'); + } + + res[edge] = true; + return res; +} + +function parseBorderWidth(vm, maxW, maxH) { + var value = vm.borderWidth; + var skip = parseBorderSkipped(vm); + var t, r, b, l; + + if (helpers$1.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t, + r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r, + b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b, + l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l + }; +} + +function boundingRects(vm) { + var bounds = getBarBounds(vm); + var width = bounds.right - bounds.left; + var height = bounds.bottom - bounds.top; + var border = parseBorderWidth(vm, width / 2, height / 2); + + return { + outer: { + x: bounds.left, + y: bounds.top, + w: width, + h: height + }, + inner: { + x: bounds.left + border.l, + y: bounds.top + border.t, + w: width - border.l - border.r, + h: height - border.t - border.b + } + }; +} + +function inRange(vm, x, y) { + var skipX = x === null; + var skipY = y === null; + var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm); + + return bounds + && (skipX || x >= bounds.left && x <= bounds.right) + && (skipY || y >= bounds.top && y <= bounds.bottom); +} + +var element_rectangle = core_element.extend({ + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var rects = boundingRects(vm); + var outer = rects.outer; + var inner = rects.inner; + + ctx.fillStyle = vm.backgroundColor; + ctx.fillRect(outer.x, outer.y, outer.w, outer.h); + + if (outer.w === inner.w && outer.h === inner.h) { + return; + } + + ctx.save(); + ctx.beginPath(); + ctx.rect(outer.x, outer.y, outer.w, outer.h); + ctx.clip(); + ctx.fillStyle = vm.borderColor; + ctx.rect(inner.x, inner.y, inner.w, inner.h); + ctx.fill('evenodd'); + ctx.restore(); + }, + + height: function() { + var vm = this._view; + return vm.base - vm.y; + }, + + inRange: function(mouseX, mouseY) { + return inRange(this._view, mouseX, mouseY); + }, + + inLabelRange: function(mouseX, mouseY) { + var vm = this._view; + return isVertical(vm) + ? inRange(vm, mouseX, null) + : inRange(vm, null, mouseY); + }, + + inXRange: function(mouseX) { + return inRange(this._view, mouseX, null); + }, + + inYRange: function(mouseY) { + return inRange(this._view, null, mouseY); + }, + + getCenterPoint: function() { + var vm = this._view; + var x, y; + if (isVertical(vm)) { + x = vm.x; + y = (vm.y + vm.base) / 2; + } else { + x = (vm.x + vm.base) / 2; + y = vm.y; + } + + return {x: x, y: y}; + }, + + getArea: function() { + var vm = this._view; + + return isVertical(vm) + ? vm.width * Math.abs(vm.y - vm.base) + : vm.height * Math.abs(vm.x - vm.base); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + } +}); + +var elements = {}; +var Arc = element_arc; +var Line = element_line; +var Point = element_point; +var Rectangle = element_rectangle; +elements.Arc = Arc; +elements.Line = Line; +elements.Point = Point; +elements.Rectangle = Rectangle; + +var resolve$1 = helpers$1.options.resolve; + +core_defaults._set('bar', { + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }], + + yAxes: [{ + type: 'linear' + }] + } +}); + +/** + * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. + * @private + */ +function computeMinSampleSize(scale, pixels) { + var min = scale.isHorizontal() ? scale.width : scale.height; + var ticks = scale.getTicks(); + var prev, curr, i, ilen; + + for (i = 1, ilen = pixels.length; i < ilen; ++i) { + min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1])); + } + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + curr = scale.getPixelForTick(i); + min = i > 0 ? Math.min(min, curr - prev) : min; + prev = curr; + } + + return min; +} + +/** + * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, + * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This + * mode currently always generates bars equally sized (until we introduce scriptable options?). + * @private + */ +function computeFitCategoryTraits(index, ruler, options) { + var thickness = options.barThickness; + var count = ruler.stackCount; + var curr = ruler.pixels[index]; + var size, ratio; + + if (helpers$1.isNullOrUndef(thickness)) { + size = ruler.min * options.categoryPercentage; + ratio = options.barPercentage; + } else { + // When bar thickness is enforced, category and bar percentages are ignored. + // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') + // and deprecate barPercentage since this value is ignored when thickness is absolute. + size = thickness * count; + ratio = 1; + } + + return { + chunk: size / count, + ratio: ratio, + start: curr - (size / 2) + }; +} + +/** + * Computes an "optimal" category that globally arranges bars side by side (no gap when + * percentage options are 1), based on the previous and following categories. This mode + * generates bars with different widths when data are not evenly spaced. + * @private + */ +function computeFlexCategoryTraits(index, ruler, options) { + var pixels = ruler.pixels; + var curr = pixels[index]; + var prev = index > 0 ? pixels[index - 1] : null; + var next = index < pixels.length - 1 ? pixels[index + 1] : null; + var percent = options.categoryPercentage; + var start, size; + + if (prev === null) { + // first data: its size is double based on the next point or, + // if it's also the last data, we use the scale size. + prev = curr - (next === null ? ruler.end - ruler.start : next - curr); + } + + if (next === null) { + // last data: its size is also double based on the previous point. + next = curr + curr - prev; + } + + start = curr - (curr - Math.min(prev, next)) / 2 * percent; + size = Math.abs(next - prev) / 2 * percent; + + return { + chunk: size / ruler.stackCount, + ratio: options.barPercentage, + start: start + }; +} + +var controller_bar = core_datasetController.extend({ + + dataElementType: elements.Rectangle, + + initialize: function() { + var me = this; + var meta; + + core_datasetController.prototype.initialize.apply(me, arguments); + + meta = me.getMeta(); + meta.stack = me.getDataset().stack; + meta.bar = true; + }, + + update: function(reset) { + var me = this; + var rects = me.getMeta().data; + var i, ilen; + + me._ruler = me.getRuler(); + + for (i = 0, ilen = rects.length; i < ilen; ++i) { + me.updateElement(rects[i], i, reset); + } + }, + + updateElement: function(rectangle, index, reset) { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + var options = me._resolveElementOptions(rectangle, index); + + rectangle._xScale = me.getScaleForId(meta.xAxisID); + rectangle._yScale = me.getScaleForId(meta.yAxisID); + rectangle._datasetIndex = me.index; + rectangle._index = index; + rectangle._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderSkipped: options.borderSkipped, + borderWidth: options.borderWidth, + datasetLabel: dataset.label, + label: me.chart.data.labels[index] + }; + + me._updateElementGeometry(rectangle, index, reset); + + rectangle.pivot(); + }, + + /** + * @private + */ + _updateElementGeometry: function(rectangle, index, reset) { + var me = this; + var model = rectangle._model; + var vscale = me._getValueScale(); + var base = vscale.getBasePixel(); + var horizontal = vscale.isHorizontal(); + var ruler = me._ruler || me.getRuler(); + var vpixels = me.calculateBarValuePixels(me.index, index); + var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); + + model.horizontal = horizontal; + model.base = reset ? base : vpixels.base; + model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; + model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; + model.height = horizontal ? ipixels.size : undefined; + model.width = horizontal ? undefined : ipixels.size; + }, + + /** + * Returns the stacks based on groups and bar visibility. + * @param {number} [last] - The dataset index + * @returns {string[]} The list of stack IDs + * @private + */ + _getStacks: function(last) { + var me = this; + var chart = me.chart; + var scale = me._getIndexScale(); + var stacked = scale.options.stacked; + var ilen = last === undefined ? chart.data.datasets.length : last + 1; + var stacks = []; + var i, meta; + + for (i = 0; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + if (meta.bar && chart.isDatasetVisible(i) && + (stacked === false || + (stacked === true && stacks.indexOf(meta.stack) === -1) || + (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { + stacks.push(meta.stack); + } + } + + return stacks; + }, + + /** + * Returns the effective number of stacks based on groups and bar visibility. + * @private + */ + getStackCount: function() { + return this._getStacks().length; + }, + + /** + * Returns the stack index for the given dataset based on groups and bar visibility. + * @param {number} [datasetIndex] - The dataset index + * @param {string} [name] - The stack name to find + * @returns {number} The stack index + * @private + */ + getStackIndex: function(datasetIndex, name) { + var stacks = this._getStacks(datasetIndex); + var index = (name !== undefined) + ? stacks.indexOf(name) + : -1; // indexOf returns -1 if element is not present + + return (index === -1) + ? stacks.length - 1 + : index; + }, + + /** + * @private + */ + getRuler: function() { + var me = this; + var scale = me._getIndexScale(); + var stackCount = me.getStackCount(); + var datasetIndex = me.index; + var isHorizontal = scale.isHorizontal(); + var start = isHorizontal ? scale.left : scale.top; + var end = start + (isHorizontal ? scale.width : scale.height); + var pixels = []; + var i, ilen, min; + + for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { + pixels.push(scale.getPixelForValue(null, i, datasetIndex)); + } + + min = helpers$1.isNullOrUndef(scale.options.barThickness) + ? computeMinSampleSize(scale, pixels) + : -1; + + return { + min: min, + pixels: pixels, + start: start, + end: end, + stackCount: stackCount, + scale: scale + }; + }, + + /** + * Note: pixel values are not clamped to the scale area. + * @private + */ + calculateBarValuePixels: function(datasetIndex, index) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var scale = me._getValueScale(); + var isHorizontal = scale.isHorizontal(); + var datasets = chart.data.datasets; + var value = +scale.getRightValue(datasets[datasetIndex].data[index]); + var minBarLength = scale.options.minBarLength; + var stacked = scale.options.stacked; + var stack = meta.stack; + var start = 0; + var i, imeta, ivalue, base, head, size; + + if (stacked || (stacked === undefined && stack !== undefined)) { + for (i = 0; i < datasetIndex; ++i) { + imeta = chart.getDatasetMeta(i); + + if (imeta.bar && + imeta.stack === stack && + imeta.controller._getValueScaleId() === scale.id && + chart.isDatasetVisible(i)) { + + ivalue = +scale.getRightValue(datasets[i].data[index]); + if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { + start += ivalue; + } + } + } + } + + base = scale.getPixelForValue(start); + head = scale.getPixelForValue(start + value); + size = head - base; + + if (minBarLength !== undefined && Math.abs(size) < minBarLength) { + size = minBarLength; + if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) { + head = base - minBarLength; + } else { + head = base + minBarLength; + } + } + + return { + size: size, + base: base, + head: head, + center: head + size / 2 + }; + }, + + /** + * @private + */ + calculateBarIndexPixels: function(datasetIndex, index, ruler) { + var me = this; + var options = ruler.scale.options; + var range = options.barThickness === 'flex' + ? computeFlexCategoryTraits(index, ruler, options) + : computeFitCategoryTraits(index, ruler, options); + + var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); + var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); + var size = Math.min( + helpers$1.valueOrDefault(options.maxBarThickness, Infinity), + range.chunk * range.ratio); + + return { + base: center - size / 2, + head: center + size / 2, + center: center, + size: size + }; + }, + + draw: function() { + var me = this; + var chart = me.chart; + var scale = me._getValueScale(); + var rects = me.getMeta().data; + var dataset = me.getDataset(); + var ilen = rects.length; + var i = 0; + + helpers$1.canvas.clipArea(chart.ctx, chart.chartArea); + + for (; i < ilen; ++i) { + if (!isNaN(scale.getRightValue(dataset.data[i]))) { + rects[i].draw(); + } + } + + helpers$1.canvas.unclipArea(chart.ctx); + }, + + /** + * @private + */ + _resolveElementOptions: function(rectangle, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = rectangle.custom || {}; + var options = chart.options.elements.rectangle; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderSkipped', + 'borderWidth' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$1([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + } +}); + +var valueOrDefault$3 = helpers$1.valueOrDefault; +var resolve$2 = helpers$1.options.resolve; + +core_defaults._set('bubble', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + type: 'linear', // bubble should probably use a linear scale by default + position: 'bottom', + id: 'x-axis-0' // need an ID so datasets can reference the scale + }], + yAxes: [{ + type: 'linear', + position: 'left', + id: 'y-axis-0' + }] + }, + + tooltips: { + callbacks: { + title: function() { + // Title doesn't make sense for scatter since we format the data as a point + return ''; + }, + label: function(item, data) { + var datasetLabel = data.datasets[item.datasetIndex].label || ''; + var dataPoint = data.datasets[item.datasetIndex].data[item.index]; + return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; + } + } + } +}); + +var controller_bubble = core_datasetController.extend({ + /** + * @protected + */ + dataElementType: elements.Point, + + /** + * @protected + */ + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var points = meta.data; + + // Update Points + helpers$1.each(points, function(point, index) { + me.updateElement(point, index, reset); + }); + }, + + /** + * @protected + */ + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var xScale = me.getScaleForId(meta.xAxisID); + var yScale = me.getScaleForId(meta.yAxisID); + var options = me._resolveElementOptions(point, index); + var data = me.getDataset().data[index]; + var dsIndex = me.index; + + var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); + var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); + + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = dsIndex; + point._index = index; + point._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + hitRadius: options.hitRadius, + pointStyle: options.pointStyle, + rotation: options.rotation, + radius: reset ? 0 : options.radius, + skip: custom.skip || isNaN(x) || isNaN(y), + x: x, + y: y, + }; + + point.pivot(); + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth); + model.radius = options.radius + options.hoverRadius; + }, + + /** + * @private + */ + _resolveElementOptions: function(point, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = point.custom || {}; + var options = chart.options.elements.point; + var data = dataset.data[index]; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + 'hoverRadius', + 'hitRadius', + 'pointStyle', + 'rotation' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$2([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + // Custom radius resolution + values.radius = resolve$2([ + custom.radius, + data ? data.r : undefined, + dataset.radius, + options.radius + ], context, index); + + return values; + } +}); + +var resolve$3 = helpers$1.options.resolve; +var valueOrDefault$4 = helpers$1.valueOrDefault; + +core_defaults._set('doughnut', { + animation: { + // Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + // Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false + }, + hover: { + mode: 'single' + }, + legendCallback: function(chart) { + var text = []; + text.push('
    '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
  • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
  • '); + } + } + + text.push('
'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc && arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + // toggle visibility of index if exists + if (meta.data[index]) { + meta.data[index].hidden = !meta.data[index].hidden; + } + } + + chart.update(); + } + }, + + // The percentage of the chart that we cut out of the middle. + cutoutPercentage: 50, + + // The rotation of the chart, where the first data arc begins. + rotation: Math.PI * -0.5, + + // The total circumference of the chart. + circumference: Math.PI * 2.0, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(tooltipItem, data) { + var dataLabel = data.labels[tooltipItem.index]; + var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; + + if (helpers$1.isArray(dataLabel)) { + // show value on first line of multiline label + // need to clone because we are changing the value + dataLabel = dataLabel.slice(); + dataLabel[0] += value; + } else { + dataLabel += value; + } + + return dataLabel; + } + } + } +}); + +var controller_doughnut = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly + getRingIndex: function(datasetIndex) { + var ringIndex = 0; + + for (var j = 0; j < datasetIndex; ++j) { + if (this.chart.isDatasetVisible(j)) { + ++ringIndex; + } + } + + return ringIndex; + }, + + update: function(reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var availableWidth = chartArea.right - chartArea.left; + var availableHeight = chartArea.bottom - chartArea.top; + var minSize = Math.min(availableWidth, availableHeight); + var offset = {x: 0, y: 0}; + var meta = me.getMeta(); + var arcs = meta.data; + var cutoutPercentage = opts.cutoutPercentage; + var circumference = opts.circumference; + var chartWeight = me._getRingWeight(me.index); + var i, ilen; + + // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc + if (circumference < Math.PI * 2.0) { + var startAngle = opts.rotation % (Math.PI * 2.0); + startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); + var endAngle = startAngle + circumference; + var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; + var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; + var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); + var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); + var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); + var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); + var cutout = cutoutPercentage / 100.0; + var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; + var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; + var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; + minSize = Math.min(availableWidth / size.width, availableHeight / size.height); + offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + } + + chart.borderWidth = me.getMaxBorderWidth(); + chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); + chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1); + chart.offsetX = offset.x * chart.outerRadius; + chart.offsetY = offset.y * chart.outerRadius; + + meta.total = me.calculateTotal(); + + me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index); + me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0); + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + me.updateElement(arcs[i], i, reset); + } + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var animationOpts = opts.animation; + var centerX = (chartArea.left + chartArea.right) / 2; + var centerY = (chartArea.top + chartArea.bottom) / 2; + var startAngle = opts.rotation; // non reset case handled later + var endAngle = opts.rotation; // non reset case handled later + var dataset = me.getDataset(); + var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); + var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; + var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX + chart.offsetX, + y: centerY + chart.offsetY, + startAngle: startAngle, + endAngle: endAngle, + circumference: circumference, + outerRadius: outerRadius, + innerRadius: innerRadius, + label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) + } + }); + + var model = arc._model; + + // Set correct angles if not resetting + if (!reset || !animationOpts.animateRotate) { + if (index === 0) { + model.startAngle = opts.rotation; + } else { + model.startAngle = me.getMeta().data[index - 1]._model.endAngle; + } + + model.endAngle = model.startAngle + model.circumference; + } + + arc.pivot(); + }, + + calculateTotal: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var total = 0; + var value; + + helpers$1.each(meta.data, function(element, index) { + value = dataset.data[index]; + if (!isNaN(value) && !element.hidden) { + total += Math.abs(value); + } + }); + + /* if (total === 0) { + total = NaN; + }*/ + + return total; + }, + + calculateCircumference: function(value) { + var total = this.getMeta().total; + if (total > 0 && !isNaN(value)) { + return (Math.PI * 2.0) * (Math.abs(value) / total); + } + return 0; + }, + + // gets the max border or hover width to properly scale pie charts + getMaxBorderWidth: function(arcs) { + var me = this; + var max = 0; + var chart = me.chart; + var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth; + + if (!arcs) { + // Find the outmost visible dataset + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + arcs = meta.data; + if (i !== me.index) { + controller = meta.controller; + } + break; + } + } + } + + if (!arcs) { + return 0; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arc = arcs[i]; + options = controller ? controller._resolveElementOptions(arc, i) : arc._options; + if (options.borderAlign !== 'inner') { + borderWidth = options.borderWidth; + hoverWidth = options.hoverBorderWidth; + + max = borderWidth > max ? borderWidth : max; + max = hoverWidth > max ? hoverWidth : max; + } + } + return max; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function(arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$3([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly + * @private + */ + _getRingWeightOffset: function(datasetIndex) { + var ringWeightOffset = 0; + + for (var i = 0; i < datasetIndex; ++i) { + if (this.chart.isDatasetVisible(i)) { + ringWeightOffset += this._getRingWeight(i); + } + } + + return ringWeightOffset; + }, + + /** + * @private + */ + _getRingWeight: function(dataSetIndex) { + return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0); + }, + + /** + * Returns the sum of all visibile data set weights. This value can be 0. + * @private + */ + _getVisibleDatasetWeightTotal: function() { + return this._getRingWeightOffset(this.chart.data.datasets.length); + } +}); + +core_defaults._set('horizontalBar', { + hover: { + mode: 'index', + axis: 'y' + }, + + scales: { + xAxes: [{ + type: 'linear', + position: 'bottom' + }], + + yAxes: [{ + type: 'category', + position: 'left', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }] + }, + + elements: { + rectangle: { + borderSkipped: 'left' + } + }, + + tooltips: { + mode: 'index', + axis: 'y' + } +}); + +var controller_horizontalBar = controller_bar.extend({ + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().yAxisID; + } +}); + +var valueOrDefault$5 = helpers$1.valueOrDefault; +var resolve$4 = helpers$1.options.resolve; +var isPointInArea = helpers$1.canvas._isPointInArea; + +core_defaults._set('line', { + showLines: true, + spanGaps: false, + + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + id: 'x-axis-0' + }], + yAxes: [{ + type: 'linear', + id: 'y-axis-0' + }] + } +}); + +function lineEnabled(dataset, options) { + return valueOrDefault$5(dataset.showLine, options.showLines); +} + +var controller_line = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.getScaleForId(meta.yAxisID); + var dataset = me.getDataset(); + var showLine = lineEnabled(dataset, me.chart.options); + var i, ilen; + + // Update Line + if (showLine) { + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + } + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + if (showLine && line._model.tension !== 0) { + me.updateBezierControlPoints(); + } + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var dataset = me.getDataset(); + var datasetIndex = me.index; + var value = dataset.data[index]; + var yScale = me.getScaleForId(meta.yAxisID); + var xScale = me.getScaleForId(meta.xAxisID); + var lineModel = meta.dataset._model; + var x, y; + + var options = me._resolvePointOptions(point, index); + + x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); + y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); + + // Utility + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = datasetIndex; + point._index = index; + + // Desired view properties + point._model = { + x: x, + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0), + steppedLine: lineModel ? lineModel.steppedLine : false, + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function(element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function(element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options; + var elementOptions = options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill', + 'cubicInterpolationMode' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[key], + elementOptions[key] + ]); + } + + // The default behavior of lines is to break at null values, according + // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 + // This option gives lines the ability to span gaps + values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps); + values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension); + values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]); + + return values; + }, + + calculatePointY: function(value, index, datasetIndex) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var yScale = me.getScaleForId(meta.yAxisID); + var sumPos = 0; + var sumNeg = 0; + var i, ds, dsMeta; + + if (yScale.options.stacked) { + for (i = 0; i < datasetIndex; i++) { + ds = chart.data.datasets[i]; + dsMeta = chart.getDatasetMeta(i); + if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { + var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); + if (stackedRightValue < 0) { + sumNeg += stackedRightValue || 0; + } else { + sumPos += stackedRightValue || 0; + } + } + } + + var rightValue = Number(yScale.getRightValue(value)); + if (rightValue < 0) { + return yScale.getPixelForValue(sumNeg + rightValue); + } + return yScale.getPixelForValue(sumPos + rightValue); + } + + return yScale.getPixelForValue(value); + }, + + updateBezierControlPoints: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var lineModel = meta.dataset._model; + var area = chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + // Only consider points that are drawn in case the spanGaps option is used + if (lineModel.spanGaps) { + points = points.filter(function(pt) { + return !pt._model.skip; + }); + } + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + if (lineModel.cubicInterpolationMode === 'monotone') { + helpers$1.splineCurveMonotone(points); + } else { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i)._model, + model, + helpers$1.nextItem(points, i)._model, + lineModel.tension + ); + model.controlPointPreviousX = controlPoints.previous.x; + model.controlPointPreviousY = controlPoints.previous.y; + model.controlPointNextX = controlPoints.next.x; + model.controlPointNextY = controlPoints.next.y; + } + } + + if (chart.options.elements.line.capBezierPoints) { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + if (isPointInArea(model, area)) { + if (i > 0 && isPointInArea(points[i - 1]._model, area)) { + model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); + model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); + } + if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) { + model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); + model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); + } + } + } + } + }, + + draw: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var points = meta.data || []; + var area = chart.chartArea; + var ilen = points.length; + var halfBorderWidth; + var i = 0; + + if (lineEnabled(me.getDataset(), chart.options)) { + halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2; + + helpers$1.canvas.clipArea(chart.ctx, { + left: area.left, + right: area.right, + top: area.top - halfBorderWidth, + bottom: area.bottom + halfBorderWidth + }); + + meta.dataset.draw(); + + helpers$1.canvas.unclipArea(chart.ctx); + } + + // Draw the points + for (; i < ilen; ++i) { + points[i].draw(area); + } + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$5(options.hoverRadius, options.radius); + }, +}); + +var resolve$5 = helpers$1.options.resolve; + +core_defaults._set('polarArea', { + scale: { + type: 'radialLinear', + angleLines: { + display: false + }, + gridLines: { + circular: true + }, + pointLabels: { + display: false + }, + ticks: { + beginAtZero: true + } + }, + + // Boolean - Whether to animate the rotation of the chart + animation: { + animateRotate: true, + animateScale: true + }, + + startAngle: -0.5 * Math.PI, + legendCallback: function(chart) { + var text = []; + text.push('
    '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
  • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
  • '); + } + } + + text.push('
'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + meta.data[index].hidden = !meta.data[index].hidden; + } + + chart.update(); + } + }, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(item, data) { + return data.labels[item.index] + ': ' + item.yLabel; + } + } + } +}); + +var controller_polarArea = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + update: function(reset) { + var me = this; + var dataset = me.getDataset(); + var meta = me.getMeta(); + var start = me.chart.options.startAngle || 0; + var starts = me._starts = []; + var angles = me._angles = []; + var arcs = meta.data; + var i, ilen, angle; + + me._updateRadius(); + + meta.count = me.countVisibleElements(); + + for (i = 0, ilen = dataset.data.length; i < ilen; i++) { + starts[i] = start; + angle = me._computeAngle(i); + angles[i] = angle; + start += angle; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + me.updateElement(arcs[i], i, reset); + } + }, + + /** + * @private + */ + _updateRadius: function() { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); + + chart.outerRadius = Math.max(minSize / 2, 0); + chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + + me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); + me.innerRadius = me.outerRadius - chart.radiusLength; + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var opts = chart.options; + var animationOpts = opts.animation; + var scale = chart.scale; + var labels = chart.data.labels; + + var centerX = scale.xCenter; + var centerY = scale.yCenter; + + // var negHalfPI = -0.5 * Math.PI; + var datasetStartAngle = opts.startAngle; + var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var startAngle = me._starts[index]; + var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]); + + var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX, + y: centerY, + innerRadius: 0, + outerRadius: reset ? resetRadius : distance, + startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, + endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, + label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index]) + } + }); + + arc.pivot(); + }, + + countVisibleElements: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var count = 0; + + helpers$1.each(meta.data, function(element, index) { + if (!isNaN(dataset.data[index]) && !element.hidden) { + count++; + } + }); + + return count; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + var valueOrDefault = helpers$1.valueOrDefault; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function(arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$5([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _computeAngle: function(index) { + var me = this; + var count = this.getMeta().count; + var dataset = me.getDataset(); + var meta = me.getMeta(); + + if (isNaN(dataset.data[index]) || meta.data[index].hidden) { + return 0; + } + + // Scriptable options + var context = { + chart: me.chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + return resolve$5([ + me.chart.options.elements.arc.angle, + (2 * Math.PI) / count + ], context, index); + } +}); + +core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut)); +core_defaults._set('pie', { + cutoutPercentage: 0 +}); + +// Pie charts are Doughnut chart with different defaults +var controller_pie = controller_doughnut; + +var valueOrDefault$6 = helpers$1.valueOrDefault; +var resolve$6 = helpers$1.options.resolve; + +core_defaults._set('radar', { + scale: { + type: 'radialLinear' + }, + elements: { + line: { + tension: 0 // no bezier in radar + } + } +}); + +var controller_radar = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + linkScales: helpers$1.noop, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.chart.scale; + var dataset = me.getDataset(); + var i, ilen; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + line._loop = true; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + // Update bezier control points + me.updateBezierControlPoints(); + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var custom = point.custom || {}; + var dataset = me.getDataset(); + var scale = me.chart.scale; + var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); + var options = me._resolvePointOptions(point, index); + var lineModel = me.getMeta().dataset._model; + var x = reset ? scale.xCenter : pointPosition.x; + var y = reset ? scale.yCenter : pointPosition.y; + + // Utility + point._scale = scale; + point._options = options; + point._datasetIndex = me.index; + point._index = index; + + // Desired view properties + point._model = { + x: x, // value not used in dataset scale, but we want a consistent API between scales + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0), + + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function(element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function(element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[key], + options[key] + ]); + } + + values.tension = valueOrDefault$6(dataset.lineTension, options.tension); + + return values; + }, + + updateBezierControlPoints: function() { + var me = this; + var meta = me.getMeta(); + var area = me.chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i, true)._model, + model, + helpers$1.nextItem(points, i, true)._model, + model.tension + ); + + // Prevent the bezier going outside of the bounds of the graph + model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right); + model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom); + model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right); + model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom); + } + }, + + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$6(options.hoverRadius, options.radius); + } +}); + +core_defaults._set('scatter', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + id: 'x-axis-1', // need an ID so datasets can reference the scale + type: 'linear', // scatter should not use a category axis + position: 'bottom' + }], + yAxes: [{ + id: 'y-axis-1', + type: 'linear', + position: 'left' + }] + }, + + showLines: false, + + tooltips: { + callbacks: { + title: function() { + return ''; // doesn't make sense for scatter since data are formatted as a point + }, + label: function(item) { + return '(' + item.xLabel + ', ' + item.yLabel + ')'; + } + } + } +}); + +// Scatter charts use line controllers +var controller_scatter = controller_line; + +// NOTE export a map in which the key represents the controller type, not +// the class, and so must be CamelCase in order to be correctly retrieved +// by the controller in core.controller.js (`controllers[meta.type]`). + +var controllers = { + bar: controller_bar, + bubble: controller_bubble, + doughnut: controller_doughnut, + horizontalBar: controller_horizontalBar, + line: controller_line, + polarArea: controller_polarArea, + pie: controller_pie, + radar: controller_radar, + scatter: controller_scatter +}; + +/** + * Helper function to get relative position for an event + * @param {Event|IEvent} event - The event to get the position for + * @param {Chart} chart - The chart + * @returns {object} the event position + */ +function getRelativePosition(e, chart) { + if (e.native) { + return { + x: e.x, + y: e.y + }; + } + + return helpers$1.getRelativePosition(e, chart); +} + +/** + * Helper function to traverse all of the visible elements in the chart + * @param {Chart} chart - the chart + * @param {function} handler - the callback to execute for each visible item + */ +function parseVisibleItems(chart, handler) { + var datasets = chart.data.datasets; + var meta, i, j, ilen, jlen; + + for (i = 0, ilen = datasets.length; i < ilen; ++i) { + if (!chart.isDatasetVisible(i)) { + continue; + } + + meta = chart.getDatasetMeta(i); + for (j = 0, jlen = meta.data.length; j < jlen; ++j) { + var element = meta.data[j]; + if (!element._view.skip) { + handler(element); + } + } + } +} + +/** + * Helper function to get the items that intersect the event position + * @param {ChartElement[]} items - elements to filter + * @param {object} position - the point to be nearest to + * @return {ChartElement[]} the nearest items + */ +function getIntersectItems(chart, position) { + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + } + }); + + return elements; +} + +/** + * Helper function to get the items nearest to the event position considering all visible items in teh chart + * @param {Chart} chart - the chart to look at elements from + * @param {object} position - the point to be nearest to + * @param {boolean} intersect - if true, only consider items that intersect the position + * @param {function} distanceMetric - function to provide the distance between points + * @return {ChartElement[]} the nearest items + */ +function getNearestItems(chart, position, intersect, distanceMetric) { + var minDistance = Number.POSITIVE_INFINITY; + var nearestItems = []; + + parseVisibleItems(chart, function(element) { + if (intersect && !element.inRange(position.x, position.y)) { + return; + } + + var center = element.getCenterPoint(); + var distance = distanceMetric(position, center); + if (distance < minDistance) { + nearestItems = [element]; + minDistance = distance; + } else if (distance === minDistance) { + // Can have multiple items at the same distance in which case we sort by size + nearestItems.push(element); + } + }); + + return nearestItems; +} + +/** + * Get a distance metric function for two points based on the + * axis mode setting + * @param {string} axis - the axis mode. x|y|xy + */ +function getDistanceMetricForAxis(axis) { + var useX = axis.indexOf('x') !== -1; + var useY = axis.indexOf('y') !== -1; + + return function(pt1, pt2) { + var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; + var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; + return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); + }; +} + +function indexMode(chart, e, options) { + var position = getRelativePosition(e, chart); + // Default axis for index mode is 'x' to match old behaviour + options.axis = options.axis || 'x'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + var elements = []; + + if (!items.length) { + return []; + } + + chart.data.datasets.forEach(function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + var element = meta.data[items[0]._index]; + + // don't count items that are skipped (null data) + if (element && !element._view.skip) { + elements.push(element); + } + } + }); + + return elements; +} + +/** + * @interface IInteractionOptions + */ +/** + * If true, only consider items that intersect the point + * @name IInterfaceOptions#boolean + * @type Boolean + */ + +/** + * Contains interaction related functions + * @namespace Chart.Interaction + */ +var core_interaction = { + // Helper function for different modes + modes: { + single: function(chart, e) { + var position = getRelativePosition(e, chart); + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + return elements; + } + }); + + return elements.slice(0, 1); + }, + + /** + * @function Chart.Interaction.modes.label + * @deprecated since version 2.4.0 + * @todo remove at version 3 + * @private + */ + label: indexMode, + + /** + * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item + * @function Chart.Interaction.modes.index + * @since v2.4.0 + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + index: indexMode, + + /** + * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect is false, we find the nearest item and return the items in that dataset + * @function Chart.Interaction.modes.dataset + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + dataset: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + + if (items.length > 0) { + items = chart.getDatasetMeta(items[0]._datasetIndex).data; + } + + return items; + }, + + /** + * @function Chart.Interaction.modes.x-axis + * @deprecated since version 2.4.0. Use index mode and intersect == true + * @todo remove at version 3 + * @private + */ + 'x-axis': function(chart, e) { + return indexMode(chart, e, {intersect: false}); + }, + + /** + * Point mode returns all elements that hit test based on the event position + * of the event + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + point: function(chart, e) { + var position = getRelativePosition(e, chart); + return getIntersectItems(chart, position); + }, + + /** + * nearest mode returns the element closest to the point + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + nearest: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + return getNearestItems(chart, position, options.intersect, distanceMetric); + }, + + /** + * x mode returns the elements that hit-test at the current x coordinate + * @function Chart.Interaction.modes.x + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + x: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inXRange(position.x)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + }, + + /** + * y mode returns the elements that hit-test at the current y coordinate + * @function Chart.Interaction.modes.y + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + y: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inYRange(position.y)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + } + } +}; + +function filterByPosition(array, position) { + return helpers$1.where(array, function(v) { + return v.position === position; + }); +} + +function sortByWeight(array, reverse) { + array.forEach(function(v, i) { + v._tmpIndex_ = i; + return v; + }); + array.sort(function(a, b) { + var v0 = reverse ? b : a; + var v1 = reverse ? a : b; + return v0.weight === v1.weight ? + v0._tmpIndex_ - v1._tmpIndex_ : + v0.weight - v1.weight; + }); + array.forEach(function(v) { + delete v._tmpIndex_; + }); +} + +function findMaxPadding(boxes) { + var top = 0; + var left = 0; + var bottom = 0; + var right = 0; + helpers$1.each(boxes, function(box) { + if (box.getPadding) { + var boxPadding = box.getPadding(); + top = Math.max(top, boxPadding.top); + left = Math.max(left, boxPadding.left); + bottom = Math.max(bottom, boxPadding.bottom); + right = Math.max(right, boxPadding.right); + } + }); + return { + top: top, + left: left, + bottom: bottom, + right: right + }; +} + +function addSizeByPosition(boxes, size) { + helpers$1.each(boxes, function(box) { + size[box.position] += box.isHorizontal() ? box.height : box.width; + }); +} + +core_defaults._set('global', { + layout: { + padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + } +}); + +/** + * @interface ILayoutItem + * @prop {string} position - The position of the item in the chart layout. Possible values are + * 'left', 'top', 'right', 'bottom', and 'chartArea' + * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area + * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down + * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) + * @prop {function} update - Takes two parameters: width and height. Returns size of item + * @prop {function} getPadding - Returns an object with padding on the edges + * @prop {number} width - Width of item. Must be valid after update() + * @prop {number} height - Height of item. Must be valid after update() + * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update + * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update + * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update + * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update + */ + +// The layout service is very self explanatory. It's responsible for the layout within a chart. +// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need +// It is this service's responsibility of carrying out that layout. +var core_layouts = { + defaults: {}, + + /** + * Register a box to a chart. + * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. + * @param {Chart} chart - the chart to use + * @param {ILayoutItem} item - the item to add to be layed out + */ + addBox: function(chart, item) { + if (!chart.boxes) { + chart.boxes = []; + } + + // initialize item with default values + item.fullWidth = item.fullWidth || false; + item.position = item.position || 'top'; + item.weight = item.weight || 0; + + chart.boxes.push(item); + }, + + /** + * Remove a layoutItem from a chart + * @param {Chart} chart - the chart to remove the box from + * @param {ILayoutItem} layoutItem - the item to remove from the layout + */ + removeBox: function(chart, layoutItem) { + var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; + if (index !== -1) { + chart.boxes.splice(index, 1); + } + }, + + /** + * Sets (or updates) options on the given `item`. + * @param {Chart} chart - the chart in which the item lives (or will be added to) + * @param {ILayoutItem} item - the item to configure with the given options + * @param {object} options - the new item options. + */ + configure: function(chart, item, options) { + var props = ['fullWidth', 'position', 'weight']; + var ilen = props.length; + var i = 0; + var prop; + + for (; i < ilen; ++i) { + prop = props[i]; + if (options.hasOwnProperty(prop)) { + item[prop] = options[prop]; + } + } + }, + + /** + * Fits boxes of the given chart into the given size by having each box measure itself + * then running a fitting algorithm + * @param {Chart} chart - the chart + * @param {number} width - the width to fit into + * @param {number} height - the height to fit into + */ + update: function(chart, width, height) { + if (!chart) { + return; + } + + var layoutOptions = chart.options.layout || {}; + var padding = helpers$1.options.toPadding(layoutOptions.padding); + var leftPadding = padding.left; + var rightPadding = padding.right; + var topPadding = padding.top; + var bottomPadding = padding.bottom; + + var leftBoxes = filterByPosition(chart.boxes, 'left'); + var rightBoxes = filterByPosition(chart.boxes, 'right'); + var topBoxes = filterByPosition(chart.boxes, 'top'); + var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); + var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); + + // Sort boxes by weight. A higher weight is further away from the chart area + sortByWeight(leftBoxes, true); + sortByWeight(rightBoxes, false); + sortByWeight(topBoxes, true); + sortByWeight(bottomBoxes, false); + + var verticalBoxes = leftBoxes.concat(rightBoxes); + var horizontalBoxes = topBoxes.concat(bottomBoxes); + var outerBoxes = verticalBoxes.concat(horizontalBoxes); + + // Essentially we now have any number of boxes on each of the 4 sides. + // Our canvas looks like the following. + // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and + // B1 is the bottom axis + // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays + // These locations are single-box locations only, when trying to register a chartArea location that is already taken, + // an error will be thrown. + // + // |----------------------------------------------------| + // | T1 (Full Width) | + // |----------------------------------------------------| + // | | | T2 | | + // | |----|-------------------------------------|----| + // | | | C1 | | C2 | | + // | | |----| |----| | + // | | | | | + // | L1 | L2 | ChartArea (C0) | R1 | + // | | | | | + // | | |----| |----| | + // | | | C3 | | C4 | | + // | |----|-------------------------------------|----| + // | | | B1 | | + // |----------------------------------------------------| + // | B2 (Full Width) | + // |----------------------------------------------------| + // + // What we do to find the best sizing, we do the following + // 1. Determine the minimum size of the chart area. + // 2. Split the remaining width equally between each vertical axis + // 3. Split the remaining height equally between each horizontal axis + // 4. Give each layout the maximum size it can be. The layout will return it's minimum size + // 5. Adjust the sizes of each axis based on it's minimum reported size. + // 6. Refit each axis + // 7. Position each axis in the final location + // 8. Tell the chart the final location of the chart area + // 9. Tell any axes that overlay the chart area the positions of the chart area + + // Step 1 + var chartWidth = width - leftPadding - rightPadding; + var chartHeight = height - topPadding - bottomPadding; + var chartAreaWidth = chartWidth / 2; // min 50% + + // Step 2 + var verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length; + + // Step 3 + // TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837) + // var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length; + + // Step 4 + var maxChartAreaWidth = chartWidth; + var maxChartAreaHeight = chartHeight; + var outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; + var minBoxSizes = []; + var maxPadding; + + function getMinimumBoxSize(box) { + var minSize; + var isHorizontal = box.isHorizontal(); + + if (isHorizontal) { + minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2); + maxChartAreaHeight -= minSize.height; + } else { + minSize = box.update(verticalBoxWidth, maxChartAreaHeight); + maxChartAreaWidth -= minSize.width; + } + + minBoxSizes.push({ + horizontal: isHorizontal, + width: minSize.width, + box: box, + }); + } + + helpers$1.each(outerBoxes, getMinimumBoxSize); + + // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) + maxPadding = findMaxPadding(outerBoxes); + + // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could + // be if the axes are drawn at their minimum sizes. + // Steps 5 & 6 + + // Function to fit a box + function fitBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minBox) { + return minBox.box === box; + }); + + if (minBoxSize) { + if (minBoxSize.horizontal) { + var scaleMargin = { + left: Math.max(outerBoxSizes.left, maxPadding.left), + right: Math.max(outerBoxSizes.right, maxPadding.right), + top: 0, + bottom: 0 + }; + + // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends + // on the margin. Sometimes they need to increase in size slightly + box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); + } else { + box.update(minBoxSize.width, maxChartAreaHeight); + } + } + } + + // Update, and calculate the left and right margins for the horizontal boxes + helpers$1.each(verticalBoxes, fitBox); + addSizeByPosition(verticalBoxes, outerBoxSizes); + + // Set the Left and Right margins for the horizontal boxes + helpers$1.each(horizontalBoxes, fitBox); + addSizeByPosition(horizontalBoxes, outerBoxSizes); + + function finalFitVerticalBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minSize) { + return minSize.box === box; + }); + + var scaleMargin = { + left: 0, + right: 0, + top: outerBoxSizes.top, + bottom: outerBoxSizes.bottom + }; + + if (minBoxSize) { + box.update(minBoxSize.width, maxChartAreaHeight, scaleMargin); + } + } + + // Let the left layout know the final margin + helpers$1.each(verticalBoxes, finalFitVerticalBox); + + // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) + outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; + addSizeByPosition(outerBoxes, outerBoxSizes); + + // We may be adding some padding to account for rotated x axis labels + var leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0); + outerBoxSizes.left += leftPaddingAddition; + outerBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0); + + var topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0); + outerBoxSizes.top += topPaddingAddition; + outerBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 0); + + // Figure out if our chart area changed. This would occur if the dataset layout label rotation + // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do + // without calling `fit` again + var newMaxChartAreaHeight = height - outerBoxSizes.top - outerBoxSizes.bottom; + var newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right; + + if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { + helpers$1.each(verticalBoxes, function(box) { + box.height = newMaxChartAreaHeight; + }); + + helpers$1.each(horizontalBoxes, function(box) { + if (!box.fullWidth) { + box.width = newMaxChartAreaWidth; + } + }); + + maxChartAreaHeight = newMaxChartAreaHeight; + maxChartAreaWidth = newMaxChartAreaWidth; + } + + // Step 7 - Position the boxes + var left = leftPadding + leftPaddingAddition; + var top = topPadding + topPaddingAddition; + + function placeBox(box) { + if (box.isHorizontal()) { + box.left = box.fullWidth ? leftPadding : outerBoxSizes.left; + box.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + maxChartAreaWidth; + box.top = top; + box.bottom = top + box.height; + + // Move to next point + top = box.bottom; + + } else { + + box.left = left; + box.right = left + box.width; + box.top = outerBoxSizes.top; + box.bottom = outerBoxSizes.top + maxChartAreaHeight; + + // Move to next point + left = box.right; + } + } + + helpers$1.each(leftBoxes.concat(topBoxes), placeBox); + + // Account for chart width and height + left += maxChartAreaWidth; + top += maxChartAreaHeight; + + helpers$1.each(rightBoxes, placeBox); + helpers$1.each(bottomBoxes, placeBox); + + // Step 8 + chart.chartArea = { + left: outerBoxSizes.left, + top: outerBoxSizes.top, + right: outerBoxSizes.left + maxChartAreaWidth, + bottom: outerBoxSizes.top + maxChartAreaHeight + }; + + // Step 9 + helpers$1.each(chartAreaBoxes, function(box) { + box.left = chart.chartArea.left; + box.top = chart.chartArea.top; + box.right = chart.chartArea.right; + box.bottom = chart.chartArea.bottom; + + box.update(maxChartAreaWidth, maxChartAreaHeight); + }); + } +}; + +/** + * Platform fallback implementation (minimal). + * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 + */ + +var platform_basic = { + acquireContext: function(item) { + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + return item && item.getContext('2d') || null; + } +}; + +var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n"; + +var platform_dom$1 = /*#__PURE__*/Object.freeze({ +default: platform_dom +}); + +function getCjsExportFromNamespace (n) { + return n && n.default || n; +} + +var stylesheet = getCjsExportFromNamespace(platform_dom$1); + +var EXPANDO_KEY = '$chartjs'; +var CSS_PREFIX = 'chartjs-'; +var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor'; +var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; +var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; +var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; + +/** + * DOM event types -> Chart.js event types. + * Note: only events with different types are mapped. + * @see https://developer.mozilla.org/en-US/docs/Web/Events + */ +var EVENT_TYPES = { + touchstart: 'mousedown', + touchmove: 'mousemove', + touchend: 'mouseup', + pointerenter: 'mouseenter', + pointerdown: 'mousedown', + pointermove: 'mousemove', + pointerup: 'mouseup', + pointerleave: 'mouseout', + pointerout: 'mouseout' +}; + +/** + * The "used" size is the final value of a dimension property after all calculations have + * been performed. This method uses the computed style of `element` but returns undefined + * if the computed style is not expressed in pixels. That can happen in some cases where + * `element` has a size relative to its parent and this last one is not yet displayed, + * for example because of `display: none` on a parent node. + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value + * @returns {number} Size in pixels or undefined if unknown. + */ +function readUsedSize(element, property) { + var value = helpers$1.getStyle(element, property); + var matches = value && value.match(/^(\d+)(\.\d+)?px$/); + return matches ? Number(matches[1]) : undefined; +} + +/** + * Initializes the canvas style and render size without modifying the canvas display size, + * since responsiveness is handled by the controller.resize() method. The config is used + * to determine the aspect ratio to apply in case no explicit height has been specified. + */ +function initCanvas(canvas, config) { + var style = canvas.style; + + // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it + // returns null or '' if no explicit value has been set to the canvas attribute. + var renderHeight = canvas.getAttribute('height'); + var renderWidth = canvas.getAttribute('width'); + + // Chart.js modifies some canvas values that we want to restore on destroy + canvas[EXPANDO_KEY] = { + initial: { + height: renderHeight, + width: renderWidth, + style: { + display: style.display, + height: style.height, + width: style.width + } + } + }; + + // Force canvas to display as block to avoid extra space caused by inline + // elements, which would interfere with the responsive resize process. + // https://github.com/chartjs/Chart.js/issues/2538 + style.display = style.display || 'block'; + + if (renderWidth === null || renderWidth === '') { + var displayWidth = readUsedSize(canvas, 'width'); + if (displayWidth !== undefined) { + canvas.width = displayWidth; + } + } + + if (renderHeight === null || renderHeight === '') { + if (canvas.style.height === '') { + // If no explicit render height and style height, let's apply the aspect ratio, + // which one can be specified by the user but also by charts as default option + // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. + canvas.height = canvas.width / (config.options.aspectRatio || 2); + } else { + var displayHeight = readUsedSize(canvas, 'height'); + if (displayWidth !== undefined) { + canvas.height = displayHeight; + } + } + } + + return canvas; +} + +/** + * Detects support for options object argument in addEventListener. + * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + * @private + */ +var supportsEventListenerOptions = (function() { + var supports = false; + try { + var options = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line getter-return + get: function() { + supports = true; + } + }); + window.addEventListener('e', null, options); + } catch (e) { + // continue regardless of error + } + return supports; +}()); + +// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. +// https://github.com/chartjs/Chart.js/issues/4287 +var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; + +function addListener(node, type, listener) { + node.addEventListener(type, listener, eventListenerOptions); +} + +function removeListener(node, type, listener) { + node.removeEventListener(type, listener, eventListenerOptions); +} + +function createEvent(type, chart, x, y, nativeEvent) { + return { + type: type, + chart: chart, + native: nativeEvent || null, + x: x !== undefined ? x : null, + y: y !== undefined ? y : null, + }; +} + +function fromNativeEvent(event, chart) { + var type = EVENT_TYPES[event.type] || event.type; + var pos = helpers$1.getRelativePosition(event, chart); + return createEvent(type, chart, pos.x, pos.y, event); +} + +function throttled(fn, thisArg) { + var ticking = false; + var args = []; + + return function() { + args = Array.prototype.slice.call(arguments); + thisArg = thisArg || this; + + if (!ticking) { + ticking = true; + helpers$1.requestAnimFrame.call(window, function() { + ticking = false; + fn.apply(thisArg, args); + }); + } + }; +} + +function createDiv(cls) { + var el = document.createElement('div'); + el.className = cls || ''; + return el; +} + +// Implementation based on https://github.com/marcj/css-element-queries +function createResizer(handler) { + var maxSize = 1000000; + + // NOTE(SB) Don't use innerHTML because it could be considered unsafe. + // https://github.com/chartjs/Chart.js/issues/5902 + var resizer = createDiv(CSS_SIZE_MONITOR); + var expand = createDiv(CSS_SIZE_MONITOR + '-expand'); + var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink'); + + expand.appendChild(createDiv()); + shrink.appendChild(createDiv()); + + resizer.appendChild(expand); + resizer.appendChild(shrink); + resizer._reset = function() { + expand.scrollLeft = maxSize; + expand.scrollTop = maxSize; + shrink.scrollLeft = maxSize; + shrink.scrollTop = maxSize; + }; + + var onScroll = function() { + resizer._reset(); + handler(); + }; + + addListener(expand, 'scroll', onScroll.bind(expand, 'expand')); + addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); + + return resizer; +} + +// https://davidwalsh.name/detect-node-insertion +function watchForRender(node, handler) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + var proxy = expando.renderProxy = function(e) { + if (e.animationName === CSS_RENDER_ANIMATION) { + handler(); + } + }; + + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + addListener(node, type, proxy); + }); + + // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class + // is removed then added back immediately (same animation frame?). Accessing the + // `offsetParent` property will force a reflow and re-evaluate the CSS animation. + // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics + // https://github.com/chartjs/Chart.js/issues/4737 + expando.reflow = !!node.offsetParent; + + node.classList.add(CSS_RENDER_MONITOR); +} + +function unwatchForRender(node) { + var expando = node[EXPANDO_KEY] || {}; + var proxy = expando.renderProxy; + + if (proxy) { + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + removeListener(node, type, proxy); + }); + + delete expando.renderProxy; + } + + node.classList.remove(CSS_RENDER_MONITOR); +} + +function addResizeListener(node, listener, chart) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + + // Let's keep track of this added resizer and thus avoid DOM query when removing it. + var resizer = expando.resizer = createResizer(throttled(function() { + if (expando.resizer) { + var container = chart.options.maintainAspectRatio && node.parentNode; + var w = container ? container.clientWidth : 0; + listener(createEvent('resize', chart)); + if (container && container.clientWidth < w && chart.canvas) { + // If the container size shrank during chart resize, let's assume + // scrollbar appeared. So we resize again with the scrollbar visible - + // effectively making chart smaller and the scrollbar hidden again. + // Because we are inside `throttled`, and currently `ticking`, scroll + // events are ignored during this whole 2 resize process. + // If we assumed wrong and something else happened, we are resizing + // twice in a frame (potential performance issue) + listener(createEvent('resize', chart)); + } + } + })); + + // The resizer needs to be attached to the node parent, so we first need to be + // sure that `node` is attached to the DOM before injecting the resizer element. + watchForRender(node, function() { + if (expando.resizer) { + var container = node.parentNode; + if (container && container !== resizer.parentNode) { + container.insertBefore(resizer, container.firstChild); + } + + // The container size might have changed, let's reset the resizer state. + resizer._reset(); + } + }); +} + +function removeResizeListener(node) { + var expando = node[EXPANDO_KEY] || {}; + var resizer = expando.resizer; + + delete expando.resizer; + unwatchForRender(node); + + if (resizer && resizer.parentNode) { + resizer.parentNode.removeChild(resizer); + } +} + +function injectCSS(platform, css) { + // https://stackoverflow.com/q/3922139 + var style = platform._style || document.createElement('style'); + if (!platform._style) { + platform._style = style; + css = '/* Chart.js */\n' + css; + style.setAttribute('type', 'text/css'); + document.getElementsByTagName('head')[0].appendChild(style); + } + + style.appendChild(document.createTextNode(css)); +} + +var platform_dom$2 = { + /** + * When `true`, prevents the automatic injection of the stylesheet required to + * correctly detect when the chart is added to the DOM and then resized. This + * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`) + * to be manually imported to make this library compatible with any CSP. + * See https://github.com/chartjs/Chart.js/issues/5208 + */ + disableCSSInjection: false, + + /** + * This property holds whether this platform is enabled for the current environment. + * Currently used by platform.js to select the proper implementation. + * @private + */ + _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', + + /** + * @private + */ + _ensureLoaded: function() { + if (this._loaded) { + return; + } + + this._loaded = true; + + // https://github.com/chartjs/Chart.js/issues/5208 + if (!this.disableCSSInjection) { + injectCSS(this, stylesheet); + } + }, + + acquireContext: function(item, config) { + if (typeof item === 'string') { + item = document.getElementById(item); + } else if (item.length) { + // Support for array based queries (such as jQuery) + item = item[0]; + } + + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + // To prevent canvas fingerprinting, some add-ons undefine the getContext + // method, for example: https://github.com/kkapsner/CanvasBlocker + // https://github.com/chartjs/Chart.js/issues/2807 + var context = item && item.getContext && item.getContext('2d'); + + // Load platform resources on first chart creation, to make possible to change + // platform options after importing the library (e.g. `disableCSSInjection`). + this._ensureLoaded(); + + // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is + // inside an iframe or when running in a protected environment. We could guess the + // types from their toString() value but let's keep things flexible and assume it's + // a sufficient condition if the item has a context2D which has item as `canvas`. + // https://github.com/chartjs/Chart.js/issues/3887 + // https://github.com/chartjs/Chart.js/issues/4102 + // https://github.com/chartjs/Chart.js/issues/4152 + if (context && context.canvas === item) { + initCanvas(item, config); + return context; + } + + return null; + }, + + releaseContext: function(context) { + var canvas = context.canvas; + if (!canvas[EXPANDO_KEY]) { + return; + } + + var initial = canvas[EXPANDO_KEY].initial; + ['height', 'width'].forEach(function(prop) { + var value = initial[prop]; + if (helpers$1.isNullOrUndef(value)) { + canvas.removeAttribute(prop); + } else { + canvas.setAttribute(prop, value); + } + }); + + helpers$1.each(initial.style || {}, function(value, key) { + canvas.style[key] = value; + }); + + // The canvas render size might have been changed (and thus the state stack discarded), + // we can't use save() and restore() to restore the initial state. So make sure that at + // least the canvas context is reset to the default state by setting the canvas width. + // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html + // eslint-disable-next-line no-self-assign + canvas.width = canvas.width; + + delete canvas[EXPANDO_KEY]; + }, + + addEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + addResizeListener(canvas, listener, chart); + return; + } + + var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); + var proxies = expando.proxies || (expando.proxies = {}); + var proxy = proxies[chart.id + '_' + type] = function(event) { + listener(fromNativeEvent(event, chart)); + }; + + addListener(canvas, type, proxy); + }, + + removeEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + removeResizeListener(canvas); + return; + } + + var expando = listener[EXPANDO_KEY] || {}; + var proxies = expando.proxies || {}; + var proxy = proxies[chart.id + '_' + type]; + if (!proxy) { + return; + } + + removeListener(canvas, type, proxy); + } +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use EventTarget.addEventListener instead. + * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener + * @function Chart.helpers.addEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers$1.addEvent = addListener; + +/** + * Provided for backward compatibility, use EventTarget.removeEventListener instead. + * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener + * @function Chart.helpers.removeEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers$1.removeEvent = removeListener; + +// @TODO Make possible to select another platform at build time. +var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic; + +/** + * @namespace Chart.platform + * @see https://chartjs.gitbooks.io/proposals/content/Platform.html + * @since 2.4.0 + */ +var platform = helpers$1.extend({ + /** + * @since 2.7.0 + */ + initialize: function() {}, + + /** + * Called at chart construction time, returns a context2d instance implementing + * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. + * @param {*} item - The native item from which to acquire context (platform specific) + * @param {object} options - The chart options + * @returns {CanvasRenderingContext2D} context2d instance + */ + acquireContext: function() {}, + + /** + * Called at chart destruction time, releases any resources associated to the context + * previously returned by the acquireContext() method. + * @param {CanvasRenderingContext2D} context - The context2d instance + * @returns {boolean} true if the method succeeded, else false + */ + releaseContext: function() {}, + + /** + * Registers the specified listener on the given chart. + * @param {Chart} chart - Chart from which to listen for event + * @param {string} type - The ({@link IEvent}) type to listen for + * @param {function} listener - Receives a notification (an object that implements + * the {@link IEvent} interface) when an event of the specified type occurs. + */ + addEventListener: function() {}, + + /** + * Removes the specified listener previously registered with addEventListener. + * @param {Chart} chart - Chart from which to remove the listener + * @param {string} type - The ({@link IEvent}) type to remove + * @param {function} listener - The listener function to remove from the event target. + */ + removeEventListener: function() {} + +}, implementation); + +core_defaults._set('global', { + plugins: {} +}); + +/** + * The plugin service singleton + * @namespace Chart.plugins + * @since 2.1.0 + */ +var core_plugins = { + /** + * Globally registered plugins. + * @private + */ + _plugins: [], + + /** + * This identifier is used to invalidate the descriptors cache attached to each chart + * when a global plugin is registered or unregistered. In this case, the cache ID is + * incremented and descriptors are regenerated during following API calls. + * @private + */ + _cacheId: 0, + + /** + * Registers the given plugin(s) if not already registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + register: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + if (p.indexOf(plugin) === -1) { + p.push(plugin); + } + }); + + this._cacheId++; + }, + + /** + * Unregisters the given plugin(s) only if registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + unregister: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + var idx = p.indexOf(plugin); + if (idx !== -1) { + p.splice(idx, 1); + } + }); + + this._cacheId++; + }, + + /** + * Remove all registered plugins. + * @since 2.1.5 + */ + clear: function() { + this._plugins = []; + this._cacheId++; + }, + + /** + * Returns the number of registered plugins? + * @returns {number} + * @since 2.1.5 + */ + count: function() { + return this._plugins.length; + }, + + /** + * Returns all registered plugin instances. + * @returns {IPlugin[]} array of plugin objects. + * @since 2.1.5 + */ + getAll: function() { + return this._plugins; + }, + + /** + * Calls enabled plugins for `chart` on the specified hook and with the given args. + * This method immediately returns as soon as a plugin explicitly returns false. The + * returned value can be used, for instance, to interrupt the current action. + * @param {Chart} chart - The chart instance for which plugins should be called. + * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). + * @param {Array} [args] - Extra arguments to apply to the hook call. + * @returns {boolean} false if any of the plugins return false, else returns true. + */ + notify: function(chart, hook, args) { + var descriptors = this.descriptors(chart); + var ilen = descriptors.length; + var i, descriptor, plugin, params, method; + + for (i = 0; i < ilen; ++i) { + descriptor = descriptors[i]; + plugin = descriptor.plugin; + method = plugin[hook]; + if (typeof method === 'function') { + params = [chart].concat(args || []); + params.push(descriptor.options); + if (method.apply(plugin, params) === false) { + return false; + } + } + } + + return true; + }, + + /** + * Returns descriptors of enabled plugins for the given chart. + * @returns {object[]} [{ plugin, options }] + * @private + */ + descriptors: function(chart) { + var cache = chart.$plugins || (chart.$plugins = {}); + if (cache.id === this._cacheId) { + return cache.descriptors; + } + + var plugins = []; + var descriptors = []; + var config = (chart && chart.config) || {}; + var options = (config.options && config.options.plugins) || {}; + + this._plugins.concat(config.plugins || []).forEach(function(plugin) { + var idx = plugins.indexOf(plugin); + if (idx !== -1) { + return; + } + + var id = plugin.id; + var opts = options[id]; + if (opts === false) { + return; + } + + if (opts === true) { + opts = helpers$1.clone(core_defaults.global.plugins[id]); + } + + plugins.push(plugin); + descriptors.push({ + plugin: plugin, + options: opts || {} + }); + }); + + cache.descriptors = descriptors; + cache.id = this._cacheId; + return descriptors; + }, + + /** + * Invalidates cache for the given chart: descriptors hold a reference on plugin option, + * but in some cases, this reference can be changed by the user when updating options. + * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + * @private + */ + _invalidate: function(chart) { + delete chart.$plugins; + } +}; + +var core_scaleService = { + // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then + // use the new chart options to grab the correct scale + constructors: {}, + // Use a registration function so that we can move to an ES6 map when we no longer need to support + // old browsers + + // Scale config defaults + defaults: {}, + registerScaleType: function(type, scaleConstructor, scaleDefaults) { + this.constructors[type] = scaleConstructor; + this.defaults[type] = helpers$1.clone(scaleDefaults); + }, + getScaleConstructor: function(type) { + return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; + }, + getScaleDefaults: function(type) { + // Return the scale defaults merged with the global settings so that we always use the latest ones + return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {}; + }, + updateScaleDefaults: function(type, additions) { + var me = this; + if (me.defaults.hasOwnProperty(type)) { + me.defaults[type] = helpers$1.extend(me.defaults[type], additions); + } + }, + addScalesToLayout: function(chart) { + // Adds each scale to the chart.boxes array to be sized accordingly + helpers$1.each(chart.scales, function(scale) { + // Set ILayoutItem parameters for backwards compatibility + scale.fullWidth = scale.options.fullWidth; + scale.position = scale.options.position; + scale.weight = scale.options.weight; + core_layouts.addBox(chart, scale); + }); + } +}; + +var valueOrDefault$7 = helpers$1.valueOrDefault; + +core_defaults._set('global', { + tooltips: { + enabled: true, + custom: null, + mode: 'nearest', + position: 'average', + intersect: true, + backgroundColor: 'rgba(0,0,0,0.8)', + titleFontStyle: 'bold', + titleSpacing: 2, + titleMarginBottom: 6, + titleFontColor: '#fff', + titleAlign: 'left', + bodySpacing: 2, + bodyFontColor: '#fff', + bodyAlign: 'left', + footerFontStyle: 'bold', + footerSpacing: 2, + footerMarginTop: 6, + footerFontColor: '#fff', + footerAlign: 'left', + yPadding: 6, + xPadding: 6, + caretPadding: 2, + caretSize: 5, + cornerRadius: 6, + multiKeyBackground: '#fff', + displayColors: true, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 0, + callbacks: { + // Args are: (tooltipItems, data) + beforeTitle: helpers$1.noop, + title: function(tooltipItems, data) { + var title = ''; + var labels = data.labels; + var labelCount = labels ? labels.length : 0; + + if (tooltipItems.length > 0) { + var item = tooltipItems[0]; + if (item.label) { + title = item.label; + } else if (item.xLabel) { + title = item.xLabel; + } else if (labelCount > 0 && item.index < labelCount) { + title = labels[item.index]; + } + } + + return title; + }, + afterTitle: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeBody: helpers$1.noop, + + // Args are: (tooltipItem, data) + beforeLabel: helpers$1.noop, + label: function(tooltipItem, data) { + var label = data.datasets[tooltipItem.datasetIndex].label || ''; + + if (label) { + label += ': '; + } + if (!helpers$1.isNullOrUndef(tooltipItem.value)) { + label += tooltipItem.value; + } else { + label += tooltipItem.yLabel; + } + return label; + }, + labelColor: function(tooltipItem, chart) { + var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); + var activeElement = meta.data[tooltipItem.index]; + var view = activeElement._view; + return { + borderColor: view.borderColor, + backgroundColor: view.backgroundColor + }; + }, + labelTextColor: function() { + return this._options.bodyFontColor; + }, + afterLabel: helpers$1.noop, + + // Args are: (tooltipItems, data) + afterBody: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeFooter: helpers$1.noop, + footer: helpers$1.noop, + afterFooter: helpers$1.noop + } + } +}); + +var positioners = { + /** + * Average mode places the tooltip at the average position of the elements shown + * @function Chart.Tooltip.positioners.average + * @param elements {ChartElement[]} the elements being displayed in the tooltip + * @returns {object} tooltip position + */ + average: function(elements) { + if (!elements.length) { + return false; + } + + var i, len; + var x = 0; + var y = 0; + var count = 0; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var pos = el.tooltipPosition(); + x += pos.x; + y += pos.y; + ++count; + } + } + + return { + x: x / count, + y: y / count + }; + }, + + /** + * Gets the tooltip position nearest of the item nearest to the event position + * @function Chart.Tooltip.positioners.nearest + * @param elements {Chart.Element[]} the tooltip elements + * @param eventPosition {object} the position of the event in canvas coordinates + * @returns {object} the tooltip position + */ + nearest: function(elements, eventPosition) { + var x = eventPosition.x; + var y = eventPosition.y; + var minDistance = Number.POSITIVE_INFINITY; + var i, len, nearestElement; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var center = el.getCenterPoint(); + var d = helpers$1.distanceBetweenPoints(eventPosition, center); + + if (d < minDistance) { + minDistance = d; + nearestElement = el; + } + } + } + + if (nearestElement) { + var tp = nearestElement.tooltipPosition(); + x = tp.x; + y = tp.y; + } + + return { + x: x, + y: y + }; + } +}; + +// Helper to push or concat based on if the 2nd parameter is an array or not +function pushOrConcat(base, toPush) { + if (toPush) { + if (helpers$1.isArray(toPush)) { + // base = base.concat(toPush); + Array.prototype.push.apply(base, toPush); + } else { + base.push(toPush); + } + } + + return base; +} + +/** + * Returns array of strings split by newline + * @param {string} value - The value to split by newline. + * @returns {string[]} value if newline present - Returned from String split() method + * @function + */ +function splitNewlines(str) { + if ((typeof str === 'string' || str instanceof String) && str.indexOf('\n') > -1) { + return str.split('\n'); + } + return str; +} + + +/** + * Private helper to create a tooltip item model + * @param element - the chart element (point, arc, bar) to create the tooltip item for + * @return new tooltip item + */ +function createTooltipItem(element) { + var xScale = element._xScale; + var yScale = element._yScale || element._scale; // handle radar || polarArea charts + var index = element._index; + var datasetIndex = element._datasetIndex; + var controller = element._chart.getDatasetMeta(datasetIndex).controller; + var indexScale = controller._getIndexScale(); + var valueScale = controller._getValueScale(); + + return { + xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', + yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', + label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '', + value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '', + index: index, + datasetIndex: datasetIndex, + x: element._model.x, + y: element._model.y + }; +} + +/** + * Helper to get the reset model for the tooltip + * @param tooltipOpts {object} the tooltip options + */ +function getBaseModel(tooltipOpts) { + var globalDefaults = core_defaults.global; + + return { + // Positioning + xPadding: tooltipOpts.xPadding, + yPadding: tooltipOpts.yPadding, + xAlign: tooltipOpts.xAlign, + yAlign: tooltipOpts.yAlign, + + // Body + bodyFontColor: tooltipOpts.bodyFontColor, + _bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), + _bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), + _bodyAlign: tooltipOpts.bodyAlign, + bodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), + bodySpacing: tooltipOpts.bodySpacing, + + // Title + titleFontColor: tooltipOpts.titleFontColor, + _titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), + _titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), + titleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), + _titleAlign: tooltipOpts.titleAlign, + titleSpacing: tooltipOpts.titleSpacing, + titleMarginBottom: tooltipOpts.titleMarginBottom, + + // Footer + footerFontColor: tooltipOpts.footerFontColor, + _footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), + _footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), + footerFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), + _footerAlign: tooltipOpts.footerAlign, + footerSpacing: tooltipOpts.footerSpacing, + footerMarginTop: tooltipOpts.footerMarginTop, + + // Appearance + caretSize: tooltipOpts.caretSize, + cornerRadius: tooltipOpts.cornerRadius, + backgroundColor: tooltipOpts.backgroundColor, + opacity: 0, + legendColorBackground: tooltipOpts.multiKeyBackground, + displayColors: tooltipOpts.displayColors, + borderColor: tooltipOpts.borderColor, + borderWidth: tooltipOpts.borderWidth + }; +} + +/** + * Get the size of the tooltip + */ +function getTooltipSize(tooltip, model) { + var ctx = tooltip._chart.ctx; + + var height = model.yPadding * 2; // Tooltip Padding + var width = 0; + + // Count of all lines in the body + var body = model.body; + var combinedBodyLength = body.reduce(function(count, bodyItem) { + return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; + }, 0); + combinedBodyLength += model.beforeBody.length + model.afterBody.length; + + var titleLineCount = model.title.length; + var footerLineCount = model.footer.length; + var titleFontSize = model.titleFontSize; + var bodyFontSize = model.bodyFontSize; + var footerFontSize = model.footerFontSize; + + height += titleLineCount * titleFontSize; // Title Lines + height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing + height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin + height += combinedBodyLength * bodyFontSize; // Body Lines + height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing + height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin + height += footerLineCount * (footerFontSize); // Footer Lines + height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing + + // Title width + var widthPadding = 0; + var maxLineWidth = function(line) { + width = Math.max(width, ctx.measureText(line).width + widthPadding); + }; + + ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); + helpers$1.each(model.title, maxLineWidth); + + // Body width + ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); + helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth); + + // Body lines may include some extra width due to the color box + widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; + helpers$1.each(body, function(bodyItem) { + helpers$1.each(bodyItem.before, maxLineWidth); + helpers$1.each(bodyItem.lines, maxLineWidth); + helpers$1.each(bodyItem.after, maxLineWidth); + }); + + // Reset back to 0 + widthPadding = 0; + + // Footer width + ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); + helpers$1.each(model.footer, maxLineWidth); + + // Add padding + width += 2 * model.xPadding; + + return { + width: width, + height: height + }; +} + +/** + * Helper to get the alignment of a tooltip given the size + */ +function determineAlignment(tooltip, size) { + var model = tooltip._model; + var chart = tooltip._chart; + var chartArea = tooltip._chart.chartArea; + var xAlign = 'center'; + var yAlign = 'center'; + + if (model.y < size.height) { + yAlign = 'top'; + } else if (model.y > (chart.height - size.height)) { + yAlign = 'bottom'; + } + + var lf, rf; // functions to determine left, right alignment + var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart + var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges + var midX = (chartArea.left + chartArea.right) / 2; + var midY = (chartArea.top + chartArea.bottom) / 2; + + if (yAlign === 'center') { + lf = function(x) { + return x <= midX; + }; + rf = function(x) { + return x > midX; + }; + } else { + lf = function(x) { + return x <= (size.width / 2); + }; + rf = function(x) { + return x >= (chart.width - (size.width / 2)); + }; + } + + olf = function(x) { + return x + size.width + model.caretSize + model.caretPadding > chart.width; + }; + orf = function(x) { + return x - size.width - model.caretSize - model.caretPadding < 0; + }; + yf = function(y) { + return y <= midY ? 'top' : 'bottom'; + }; + + if (lf(model.x)) { + xAlign = 'left'; + + // Is tooltip too wide and goes over the right side of the chart.? + if (olf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } else if (rf(model.x)) { + xAlign = 'right'; + + // Is tooltip too wide and goes outside left edge of canvas? + if (orf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } + + var opts = tooltip._options; + return { + xAlign: opts.xAlign ? opts.xAlign : xAlign, + yAlign: opts.yAlign ? opts.yAlign : yAlign + }; +} + +/** + * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment + */ +function getBackgroundPoint(vm, size, alignment, chart) { + // Background Position + var x = vm.x; + var y = vm.y; + + var caretSize = vm.caretSize; + var caretPadding = vm.caretPadding; + var cornerRadius = vm.cornerRadius; + var xAlign = alignment.xAlign; + var yAlign = alignment.yAlign; + var paddingAndSize = caretSize + caretPadding; + var radiusAndPadding = cornerRadius + caretPadding; + + if (xAlign === 'right') { + x -= size.width; + } else if (xAlign === 'center') { + x -= (size.width / 2); + if (x + size.width > chart.width) { + x = chart.width - size.width; + } + if (x < 0) { + x = 0; + } + } + + if (yAlign === 'top') { + y += paddingAndSize; + } else if (yAlign === 'bottom') { + y -= size.height + paddingAndSize; + } else { + y -= (size.height / 2); + } + + if (yAlign === 'center') { + if (xAlign === 'left') { + x += paddingAndSize; + } else if (xAlign === 'right') { + x -= paddingAndSize; + } + } else if (xAlign === 'left') { + x -= radiusAndPadding; + } else if (xAlign === 'right') { + x += radiusAndPadding; + } + + return { + x: x, + y: y + }; +} + +function getAlignedX(vm, align) { + return align === 'center' + ? vm.x + vm.width / 2 + : align === 'right' + ? vm.x + vm.width - vm.xPadding + : vm.x + vm.xPadding; +} + +/** + * Helper to build before and after body lines + */ +function getBeforeAfterBodyLines(callback) { + return pushOrConcat([], splitNewlines(callback)); +} + +var exports$3 = core_element.extend({ + initialize: function() { + this._model = getBaseModel(this._options); + this._lastActive = []; + }, + + // Get the title + // Args are: (tooltipItem, data) + getTitle: function() { + var me = this; + var opts = me._options; + var callbacks = opts.callbacks; + + var beforeTitle = callbacks.beforeTitle.apply(me, arguments); + var title = callbacks.title.apply(me, arguments); + var afterTitle = callbacks.afterTitle.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeTitle)); + lines = pushOrConcat(lines, splitNewlines(title)); + lines = pushOrConcat(lines, splitNewlines(afterTitle)); + + return lines; + }, + + // Args are: (tooltipItem, data) + getBeforeBody: function() { + return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments)); + }, + + // Args are: (tooltipItem, data) + getBody: function(tooltipItems, data) { + var me = this; + var callbacks = me._options.callbacks; + var bodyItems = []; + + helpers$1.each(tooltipItems, function(tooltipItem) { + var bodyItem = { + before: [], + lines: [], + after: [] + }; + pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data))); + pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); + pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data))); + + bodyItems.push(bodyItem); + }); + + return bodyItems; + }, + + // Args are: (tooltipItem, data) + getAfterBody: function() { + return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments)); + }, + + // Get the footer and beforeFooter and afterFooter lines + // Args are: (tooltipItem, data) + getFooter: function() { + var me = this; + var callbacks = me._options.callbacks; + + var beforeFooter = callbacks.beforeFooter.apply(me, arguments); + var footer = callbacks.footer.apply(me, arguments); + var afterFooter = callbacks.afterFooter.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeFooter)); + lines = pushOrConcat(lines, splitNewlines(footer)); + lines = pushOrConcat(lines, splitNewlines(afterFooter)); + + return lines; + }, + + update: function(changed) { + var me = this; + var opts = me._options; + + // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition + // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time + // which breaks any animations. + var existingModel = me._model; + var model = me._model = getBaseModel(opts); + var active = me._active; + + var data = me._data; + + // In the case where active.length === 0 we need to keep these at existing values for good animations + var alignment = { + xAlign: existingModel.xAlign, + yAlign: existingModel.yAlign + }; + var backgroundPoint = { + x: existingModel.x, + y: existingModel.y + }; + var tooltipSize = { + width: existingModel.width, + height: existingModel.height + }; + var tooltipPosition = { + x: existingModel.caretX, + y: existingModel.caretY + }; + + var i, len; + + if (active.length) { + model.opacity = 1; + + var labelColors = []; + var labelTextColors = []; + tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition); + + var tooltipItems = []; + for (i = 0, len = active.length; i < len; ++i) { + tooltipItems.push(createTooltipItem(active[i])); + } + + // If the user provided a filter function, use it to modify the tooltip items + if (opts.filter) { + tooltipItems = tooltipItems.filter(function(a) { + return opts.filter(a, data); + }); + } + + // If the user provided a sorting function, use it to modify the tooltip items + if (opts.itemSort) { + tooltipItems = tooltipItems.sort(function(a, b) { + return opts.itemSort(a, b, data); + }); + } + + // Determine colors for boxes + helpers$1.each(tooltipItems, function(tooltipItem) { + labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); + labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); + }); + + + // Build the Text Lines + model.title = me.getTitle(tooltipItems, data); + model.beforeBody = me.getBeforeBody(tooltipItems, data); + model.body = me.getBody(tooltipItems, data); + model.afterBody = me.getAfterBody(tooltipItems, data); + model.footer = me.getFooter(tooltipItems, data); + + // Initial positioning and colors + model.x = tooltipPosition.x; + model.y = tooltipPosition.y; + model.caretPadding = opts.caretPadding; + model.labelColors = labelColors; + model.labelTextColors = labelTextColors; + + // data points + model.dataPoints = tooltipItems; + + // We need to determine alignment of the tooltip + tooltipSize = getTooltipSize(this, model); + alignment = determineAlignment(this, tooltipSize); + // Final Size and Position + backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart); + } else { + model.opacity = 0; + } + + model.xAlign = alignment.xAlign; + model.yAlign = alignment.yAlign; + model.x = backgroundPoint.x; + model.y = backgroundPoint.y; + model.width = tooltipSize.width; + model.height = tooltipSize.height; + + // Point where the caret on the tooltip points to + model.caretX = tooltipPosition.x; + model.caretY = tooltipPosition.y; + + me._model = model; + + if (changed && opts.custom) { + opts.custom.call(me, model); + } + + return me; + }, + + drawCaret: function(tooltipPoint, size) { + var ctx = this._chart.ctx; + var vm = this._view; + var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); + + ctx.lineTo(caretPosition.x1, caretPosition.y1); + ctx.lineTo(caretPosition.x2, caretPosition.y2); + ctx.lineTo(caretPosition.x3, caretPosition.y3); + }, + getCaretPosition: function(tooltipPoint, size, vm) { + var x1, x2, x3, y1, y2, y3; + var caretSize = vm.caretSize; + var cornerRadius = vm.cornerRadius; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var ptX = tooltipPoint.x; + var ptY = tooltipPoint.y; + var width = size.width; + var height = size.height; + + if (yAlign === 'center') { + y2 = ptY + (height / 2); + + if (xAlign === 'left') { + x1 = ptX; + x2 = x1 - caretSize; + x3 = x1; + + y1 = y2 + caretSize; + y3 = y2 - caretSize; + } else { + x1 = ptX + width; + x2 = x1 + caretSize; + x3 = x1; + + y1 = y2 - caretSize; + y3 = y2 + caretSize; + } + } else { + if (xAlign === 'left') { + x2 = ptX + cornerRadius + (caretSize); + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else if (xAlign === 'right') { + x2 = ptX + width - cornerRadius - caretSize; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else { + x2 = vm.caretX; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } + if (yAlign === 'top') { + y1 = ptY; + y2 = y1 - caretSize; + y3 = y1; + } else { + y1 = ptY + height; + y2 = y1 + caretSize; + y3 = y1; + // invert drawing order + var tmp = x3; + x3 = x1; + x1 = tmp; + } + } + return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; + }, + + drawTitle: function(pt, vm, ctx) { + var title = vm.title; + + if (title.length) { + pt.x = getAlignedX(vm, vm._titleAlign); + + ctx.textAlign = vm._titleAlign; + ctx.textBaseline = 'top'; + + var titleFontSize = vm.titleFontSize; + var titleSpacing = vm.titleSpacing; + + ctx.fillStyle = vm.titleFontColor; + ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); + + var i, len; + for (i = 0, len = title.length; i < len; ++i) { + ctx.fillText(title[i], pt.x, pt.y); + pt.y += titleFontSize + titleSpacing; // Line Height and spacing + + if (i + 1 === title.length) { + pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing + } + } + } + }, + + drawBody: function(pt, vm, ctx) { + var bodyFontSize = vm.bodyFontSize; + var bodySpacing = vm.bodySpacing; + var bodyAlign = vm._bodyAlign; + var body = vm.body; + var drawColorBoxes = vm.displayColors; + var labelColors = vm.labelColors; + var xLinePadding = 0; + var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0; + var textColor; + + ctx.textAlign = bodyAlign; + ctx.textBaseline = 'top'; + ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); + + pt.x = getAlignedX(vm, bodyAlign); + + // Before Body + var fillLineOfText = function(line) { + ctx.fillText(line, pt.x + xLinePadding, pt.y); + pt.y += bodyFontSize + bodySpacing; + }; + + // Before body lines + ctx.fillStyle = vm.bodyFontColor; + helpers$1.each(vm.beforeBody, fillLineOfText); + + xLinePadding = drawColorBoxes && bodyAlign !== 'right' + ? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2) + : 0; + + // Draw body lines now + helpers$1.each(body, function(bodyItem, i) { + textColor = vm.labelTextColors[i]; + ctx.fillStyle = textColor; + helpers$1.each(bodyItem.before, fillLineOfText); + + helpers$1.each(bodyItem.lines, function(line) { + // Draw Legend-like boxes if needed + if (drawColorBoxes) { + // Fill a white rect so that colours merge nicely if the opacity is < 1 + ctx.fillStyle = vm.legendColorBackground; + ctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Border + ctx.lineWidth = 1; + ctx.strokeStyle = labelColors[i].borderColor; + ctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Inner square + ctx.fillStyle = labelColors[i].backgroundColor; + ctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); + ctx.fillStyle = textColor; + } + + fillLineOfText(line); + }); + + helpers$1.each(bodyItem.after, fillLineOfText); + }); + + // Reset back to 0 for after body + xLinePadding = 0; + + // After body lines + helpers$1.each(vm.afterBody, fillLineOfText); + pt.y -= bodySpacing; // Remove last body spacing + }, + + drawFooter: function(pt, vm, ctx) { + var footer = vm.footer; + + if (footer.length) { + pt.x = getAlignedX(vm, vm._footerAlign); + pt.y += vm.footerMarginTop; + + ctx.textAlign = vm._footerAlign; + ctx.textBaseline = 'top'; + + ctx.fillStyle = vm.footerFontColor; + ctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); + + helpers$1.each(footer, function(line) { + ctx.fillText(line, pt.x, pt.y); + pt.y += vm.footerFontSize + vm.footerSpacing; + }); + } + }, + + drawBackground: function(pt, vm, ctx, tooltipSize) { + ctx.fillStyle = vm.backgroundColor; + ctx.strokeStyle = vm.borderColor; + ctx.lineWidth = vm.borderWidth; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var x = pt.x; + var y = pt.y; + var width = tooltipSize.width; + var height = tooltipSize.height; + var radius = vm.cornerRadius; + + ctx.beginPath(); + ctx.moveTo(x + radius, y); + if (yAlign === 'top') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + if (yAlign === 'center' && xAlign === 'right') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + if (yAlign === 'bottom') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + if (yAlign === 'center' && xAlign === 'left') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + + ctx.fill(); + + if (vm.borderWidth > 0) { + ctx.stroke(); + } + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + + if (vm.opacity === 0) { + return; + } + + var tooltipSize = { + width: vm.width, + height: vm.height + }; + var pt = { + x: vm.x, + y: vm.y + }; + + // IE11/Edge does not like very small opacities, so snap to 0 + var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; + + // Truthy/falsey value for empty tooltip + var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; + + if (this._options.enabled && hasTooltipContent) { + ctx.save(); + ctx.globalAlpha = opacity; + + // Draw Background + this.drawBackground(pt, vm, ctx, tooltipSize); + + // Draw Title, Body, and Footer + pt.y += vm.yPadding; + + // Titles + this.drawTitle(pt, vm, ctx); + + // Body + this.drawBody(pt, vm, ctx); + + // Footer + this.drawFooter(pt, vm, ctx); + + ctx.restore(); + } + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + * @returns {boolean} true if the tooltip changed + */ + handleEvent: function(e) { + var me = this; + var options = me._options; + var changed = false; + + me._lastActive = me._lastActive || []; + + // Find Active Elements for tooltips + if (e.type === 'mouseout') { + me._active = []; + } else { + me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); + } + + // Remember Last Actives + changed = !helpers$1.arrayEquals(me._active, me._lastActive); + + // Only handle target event on tooltip change + if (changed) { + me._lastActive = me._active; + + if (options.enabled || options.custom) { + me._eventPosition = { + x: e.x, + y: e.y + }; + + me.update(true); + me.pivot(); + } + } + + return changed; + } +}); + +/** + * @namespace Chart.Tooltip.positioners + */ +var positioners_1 = positioners; + +var core_tooltip = exports$3; +core_tooltip.positioners = positioners_1; + +var valueOrDefault$8 = helpers$1.valueOrDefault; + +core_defaults._set('global', { + elements: {}, + events: [ + 'mousemove', + 'mouseout', + 'click', + 'touchstart', + 'touchmove' + ], + hover: { + onHover: null, + mode: 'nearest', + intersect: true, + animationDuration: 400 + }, + onClick: null, + maintainAspectRatio: true, + responsive: true, + responsiveAnimationDuration: 0 +}); + +/** + * Recursively merge the given config objects representing the `scales` option + * by incorporating scale defaults in `xAxes` and `yAxes` array items, then + * returns a deep copy of the result, thus doesn't alter inputs. + */ +function mergeScaleConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function(key, target, source, options) { + if (key === 'xAxes' || key === 'yAxes') { + var slen = source[key].length; + var i, type, scale; + + if (!target[key]) { + target[key] = []; + } + + for (i = 0; i < slen; ++i) { + scale = source[key][i]; + type = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear'); + + if (i >= target[key].length) { + target[key].push({}); + } + + if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { + // new/untyped scale or type changed: let's apply the new defaults + // then merge source scale to correctly overwrite the defaults. + helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]); + } else { + // scales type are the same + helpers$1.merge(target[key][i], scale); + } + } + } else { + helpers$1._merger(key, target, source, options); + } + } + }); +} + +/** + * Recursively merge the given config objects as the root options by handling + * default scale options for the `scales` and `scale` properties, then returns + * a deep copy of the result, thus doesn't alter inputs. + */ +function mergeConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function(key, target, source, options) { + var tval = target[key] || {}; + var sval = source[key]; + + if (key === 'scales') { + // scale config merging is complex. Add our own function here for that + target[key] = mergeScaleConfig(tval, sval); + } else if (key === 'scale') { + // used in polar area & radar charts since there is only one scale + target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]); + } else { + helpers$1._merger(key, target, source, options); + } + } + }); +} + +function initConfig(config) { + config = config || {}; + + // Do NOT use mergeConfig for the data object because this method merges arrays + // and so would change references to labels and datasets, preventing data updates. + var data = config.data = config.data || {}; + data.datasets = data.datasets || []; + data.labels = data.labels || []; + + config.options = mergeConfig( + core_defaults.global, + core_defaults[config.type], + config.options || {}); + + return config; +} + +function updateConfig(chart) { + var newOptions = chart.options; + + helpers$1.each(chart.scales, function(scale) { + core_layouts.removeBox(chart, scale); + }); + + newOptions = mergeConfig( + core_defaults.global, + core_defaults[chart.config.type], + newOptions); + + chart.options = chart.config.options = newOptions; + chart.ensureScalesHaveIDs(); + chart.buildOrUpdateScales(); + + // Tooltip + chart.tooltip._options = newOptions.tooltips; + chart.tooltip.initialize(); +} + +function positionIsHorizontal(position) { + return position === 'top' || position === 'bottom'; +} + +var Chart = function(item, config) { + this.construct(item, config); + return this; +}; + +helpers$1.extend(Chart.prototype, /** @lends Chart */ { + /** + * @private + */ + construct: function(item, config) { + var me = this; + + config = initConfig(config); + + var context = platform.acquireContext(item, config); + var canvas = context && context.canvas; + var height = canvas && canvas.height; + var width = canvas && canvas.width; + + me.id = helpers$1.uid(); + me.ctx = context; + me.canvas = canvas; + me.config = config; + me.width = width; + me.height = height; + me.aspectRatio = height ? width / height : null; + me.options = config.options; + me._bufferedRender = false; + + /** + * Provided for backward compatibility, Chart and Chart.Controller have been merged, + * the "instance" still need to be defined since it might be called from plugins. + * @prop Chart#chart + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ + me.chart = me; + me.controller = me; // chart.chart.controller #inception + + // Add the chart instance to the global namespace + Chart.instances[me.id] = me; + + // Define alias to the config data: `chart.data === chart.config.data` + Object.defineProperty(me, 'data', { + get: function() { + return me.config.data; + }, + set: function(value) { + me.config.data = value; + } + }); + + if (!context || !canvas) { + // The given item is not a compatible context2d element, let's return before finalizing + // the chart initialization but after setting basic chart / controller properties that + // can help to figure out that the chart is not valid (e.g chart.canvas !== null); + // https://github.com/chartjs/Chart.js/issues/2807 + console.error("Failed to create chart: can't acquire context from the given item"); + return; + } + + me.initialize(); + me.update(); + }, + + /** + * @private + */ + initialize: function() { + var me = this; + + // Before init plugin notification + core_plugins.notify(me, 'beforeInit'); + + helpers$1.retinaScale(me, me.options.devicePixelRatio); + + me.bindEvents(); + + if (me.options.responsive) { + // Initial resize before chart draws (must be silent to preserve initial animations). + me.resize(true); + } + + // Make sure scales have IDs and are built before we build any controllers. + me.ensureScalesHaveIDs(); + me.buildOrUpdateScales(); + me.initToolTip(); + + // After init plugin notification + core_plugins.notify(me, 'afterInit'); + + return me; + }, + + clear: function() { + helpers$1.canvas.clear(this); + return this; + }, + + stop: function() { + // Stops any current animation loop occurring + core_animations.cancelAnimation(this); + return this; + }, + + resize: function(silent) { + var me = this; + var options = me.options; + var canvas = me.canvas; + var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; + + // the canvas render width and height will be casted to integers so make sure that + // the canvas display style uses the same integer values to avoid blurring effect. + + // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed + var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas))); + var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas))); + + if (me.width === newWidth && me.height === newHeight) { + return; + } + + canvas.width = me.width = newWidth; + canvas.height = me.height = newHeight; + canvas.style.width = newWidth + 'px'; + canvas.style.height = newHeight + 'px'; + + helpers$1.retinaScale(me, options.devicePixelRatio); + + if (!silent) { + // Notify any plugins about the resize + var newSize = {width: newWidth, height: newHeight}; + core_plugins.notify(me, 'resize', [newSize]); + + // Notify of resize + if (options.onResize) { + options.onResize(me, newSize); + } + + me.stop(); + me.update({ + duration: options.responsiveAnimationDuration + }); + } + }, + + ensureScalesHaveIDs: function() { + var options = this.options; + var scalesOptions = options.scales || {}; + var scaleOptions = options.scale; + + helpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) { + xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); + }); + + helpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) { + yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); + }); + + if (scaleOptions) { + scaleOptions.id = scaleOptions.id || 'scale'; + } + }, + + /** + * Builds a map of scale ID to scale object for future lookup. + */ + buildOrUpdateScales: function() { + var me = this; + var options = me.options; + var scales = me.scales || {}; + var items = []; + var updated = Object.keys(scales).reduce(function(obj, id) { + obj[id] = false; + return obj; + }, {}); + + if (options.scales) { + items = items.concat( + (options.scales.xAxes || []).map(function(xAxisOptions) { + return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; + }), + (options.scales.yAxes || []).map(function(yAxisOptions) { + return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; + }) + ); + } + + if (options.scale) { + items.push({ + options: options.scale, + dtype: 'radialLinear', + isDefault: true, + dposition: 'chartArea' + }); + } + + helpers$1.each(items, function(item) { + var scaleOptions = item.options; + var id = scaleOptions.id; + var scaleType = valueOrDefault$8(scaleOptions.type, item.dtype); + + if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { + scaleOptions.position = item.dposition; + } + + updated[id] = true; + var scale = null; + if (id in scales && scales[id].type === scaleType) { + scale = scales[id]; + scale.options = scaleOptions; + scale.ctx = me.ctx; + scale.chart = me; + } else { + var scaleClass = core_scaleService.getScaleConstructor(scaleType); + if (!scaleClass) { + return; + } + scale = new scaleClass({ + id: id, + type: scaleType, + options: scaleOptions, + ctx: me.ctx, + chart: me + }); + scales[scale.id] = scale; + } + + scale.mergeTicksOptions(); + + // TODO(SB): I think we should be able to remove this custom case (options.scale) + // and consider it as a regular scale part of the "scales"" map only! This would + // make the logic easier and remove some useless? custom code. + if (item.isDefault) { + me.scale = scale; + } + }); + // clear up discarded scales + helpers$1.each(updated, function(hasUpdated, id) { + if (!hasUpdated) { + delete scales[id]; + } + }); + + me.scales = scales; + + core_scaleService.addScalesToLayout(this); + }, + + buildOrUpdateControllers: function() { + var me = this; + var newControllers = []; + + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + var meta = me.getDatasetMeta(datasetIndex); + var type = dataset.type || me.config.type; + + if (meta.type && meta.type !== type) { + me.destroyDatasetMeta(datasetIndex); + meta = me.getDatasetMeta(datasetIndex); + } + meta.type = type; + + if (meta.controller) { + meta.controller.updateIndex(datasetIndex); + meta.controller.linkScales(); + } else { + var ControllerClass = controllers[meta.type]; + if (ControllerClass === undefined) { + throw new Error('"' + meta.type + '" is not a chart type.'); + } + + meta.controller = new ControllerClass(me, datasetIndex); + newControllers.push(meta.controller); + } + }, me); + + return newControllers; + }, + + /** + * Reset the elements of all datasets + * @private + */ + resetElements: function() { + var me = this; + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.reset(); + }, me); + }, + + /** + * Resets the chart back to it's state before the initial animation + */ + reset: function() { + this.resetElements(); + this.tooltip.initialize(); + }, + + update: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + updateConfig(me); + + // plugins options references might have change, let's invalidate the cache + // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + core_plugins._invalidate(me); + + if (core_plugins.notify(me, 'beforeUpdate') === false) { + return; + } + + // In case the entire data object changed + me.tooltip._data = me.data; + + // Make sure dataset controllers are updated and new controllers are reset + var newControllers = me.buildOrUpdateControllers(); + + // Make sure all dataset controllers have correct meta data counts + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); + }, me); + + me.updateLayout(); + + // Can only reset the new controllers after the scales have been updated + if (me.options.animation && me.options.animation.duration) { + helpers$1.each(newControllers, function(controller) { + controller.reset(); + }); + } + + me.updateDatasets(); + + // Need to reset tooltip in case it is displayed with elements that are removed + // after update. + me.tooltip.initialize(); + + // Last active contains items that were previously in the tooltip. + // When we reset the tooltip, we need to clear it + me.lastActive = []; + + // Do this before render so that any plugins that need final scale updates can use it + core_plugins.notify(me, 'afterUpdate'); + + if (me._bufferedRender) { + me._bufferedRequest = { + duration: config.duration, + easing: config.easing, + lazy: config.lazy + }; + } else { + me.render(config); + } + }, + + /** + * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` + * hook, in which case, plugins will not be called on `afterLayout`. + * @private + */ + updateLayout: function() { + var me = this; + + if (core_plugins.notify(me, 'beforeLayout') === false) { + return; + } + + core_layouts.update(this, this.width, this.height); + + /** + * Provided for backward compatibility, use `afterLayout` instead. + * @method IPlugin#afterScaleUpdate + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ + core_plugins.notify(me, 'afterScaleUpdate'); + core_plugins.notify(me, 'afterLayout'); + }, + + /** + * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` + * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. + * @private + */ + updateDatasets: function() { + var me = this; + + if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) { + return; + } + + for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.updateDataset(i); + } + + core_plugins.notify(me, 'afterDatasetsUpdate'); + }, + + /** + * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` + * hook, in which case, plugins will not be called on `afterDatasetUpdate`. + * @private + */ + updateDataset: function(index) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index + }; + + if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { + return; + } + + meta.controller.update(); + + core_plugins.notify(me, 'afterDatasetUpdate', [args]); + }, + + render: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + var animationOptions = me.options.animation; + var duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration); + var lazy = config.lazy; + + if (core_plugins.notify(me, 'beforeRender') === false) { + return; + } + + var onComplete = function(animation) { + core_plugins.notify(me, 'afterRender'); + helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me); + }; + + if (animationOptions && duration) { + var animation = new core_animation({ + numSteps: duration / 16.66, // 60 fps + easing: config.easing || animationOptions.easing, + + render: function(chart, animationObject) { + var easingFunction = helpers$1.easing.effects[animationObject.easing]; + var currentStep = animationObject.currentStep; + var stepDecimal = currentStep / animationObject.numSteps; + + chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); + }, + + onAnimationProgress: animationOptions.onProgress, + onAnimationComplete: onComplete + }); + + core_animations.addAnimation(me, animation, duration, lazy); + } else { + me.draw(); + + // See https://github.com/chartjs/Chart.js/issues/3781 + onComplete(new core_animation({numSteps: 0, chart: me})); + } + + return me; + }, + + draw: function(easingValue) { + var me = this; + + me.clear(); + + if (helpers$1.isNullOrUndef(easingValue)) { + easingValue = 1; + } + + me.transition(easingValue); + + if (me.width <= 0 || me.height <= 0) { + return; + } + + if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) { + return; + } + + // Draw all the scales + helpers$1.each(me.boxes, function(box) { + box.draw(me.chartArea); + }, me); + + me.drawDatasets(easingValue); + me._drawTooltip(easingValue); + + core_plugins.notify(me, 'afterDraw', [easingValue]); + }, + + /** + * @private + */ + transition: function(easingValue) { + var me = this; + + for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { + if (me.isDatasetVisible(i)) { + me.getDatasetMeta(i).controller.transition(easingValue); + } + } + + me.tooltip.transition(easingValue); + }, + + /** + * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` + * hook, in which case, plugins will not be called on `afterDatasetsDraw`. + * @private + */ + drawDatasets: function(easingValue) { + var me = this; + + if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { + return; + } + + // Draw datasets reversed to support proper line stacking + for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { + if (me.isDatasetVisible(i)) { + me.drawDataset(i, easingValue); + } + } + + core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]); + }, + + /** + * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` + * hook, in which case, plugins will not be called on `afterDatasetDraw`. + * @private + */ + drawDataset: function(index, easingValue) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index, + easingValue: easingValue + }; + + if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { + return; + } + + meta.controller.draw(easingValue); + + core_plugins.notify(me, 'afterDatasetDraw', [args]); + }, + + /** + * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` + * hook, in which case, plugins will not be called on `afterTooltipDraw`. + * @private + */ + _drawTooltip: function(easingValue) { + var me = this; + var tooltip = me.tooltip; + var args = { + tooltip: tooltip, + easingValue: easingValue + }; + + if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { + return; + } + + tooltip.draw(); + + core_plugins.notify(me, 'afterTooltipDraw', [args]); + }, + + /** + * Get the single element that was clicked on + * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw + */ + getElementAtEvent: function(e) { + return core_interaction.modes.single(this, e); + }, + + getElementsAtEvent: function(e) { + return core_interaction.modes.label(this, e, {intersect: true}); + }, + + getElementsAtXAxis: function(e) { + return core_interaction.modes['x-axis'](this, e, {intersect: true}); + }, + + getElementsAtEventForMode: function(e, mode, options) { + var method = core_interaction.modes[mode]; + if (typeof method === 'function') { + return method(this, e, options); + } + + return []; + }, + + getDatasetAtEvent: function(e) { + return core_interaction.modes.dataset(this, e, {intersect: true}); + }, + + getDatasetMeta: function(datasetIndex) { + var me = this; + var dataset = me.data.datasets[datasetIndex]; + if (!dataset._meta) { + dataset._meta = {}; + } + + var meta = dataset._meta[me.id]; + if (!meta) { + meta = dataset._meta[me.id] = { + type: null, + data: [], + dataset: null, + controller: null, + hidden: null, // See isDatasetVisible() comment + xAxisID: null, + yAxisID: null + }; + } + + return meta; + }, + + getVisibleDatasetCount: function() { + var count = 0; + for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + if (this.isDatasetVisible(i)) { + count++; + } + } + return count; + }, + + isDatasetVisible: function(datasetIndex) { + var meta = this.getDatasetMeta(datasetIndex); + + // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, + // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. + return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; + }, + + generateLegend: function() { + return this.options.legendCallback(this); + }, + + /** + * @private + */ + destroyDatasetMeta: function(datasetIndex) { + var id = this.id; + var dataset = this.data.datasets[datasetIndex]; + var meta = dataset._meta && dataset._meta[id]; + + if (meta) { + meta.controller.destroy(); + delete dataset._meta[id]; + } + }, + + destroy: function() { + var me = this; + var canvas = me.canvas; + var i, ilen; + + me.stop(); + + // dataset controllers need to cleanup associated data + for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.destroyDatasetMeta(i); + } + + if (canvas) { + me.unbindEvents(); + helpers$1.canvas.clear(me); + platform.releaseContext(me.ctx); + me.canvas = null; + me.ctx = null; + } + + core_plugins.notify(me, 'destroy'); + + delete Chart.instances[me.id]; + }, + + toBase64Image: function() { + return this.canvas.toDataURL.apply(this.canvas, arguments); + }, + + initToolTip: function() { + var me = this; + me.tooltip = new core_tooltip({ + _chart: me, + _chartInstance: me, // deprecated, backward compatibility + _data: me.data, + _options: me.options.tooltips + }, me); + }, + + /** + * @private + */ + bindEvents: function() { + var me = this; + var listeners = me._listeners = {}; + var listener = function() { + me.eventHandler.apply(me, arguments); + }; + + helpers$1.each(me.options.events, function(type) { + platform.addEventListener(me, type, listener); + listeners[type] = listener; + }); + + // Elements used to detect size change should not be injected for non responsive charts. + // See https://github.com/chartjs/Chart.js/issues/2210 + if (me.options.responsive) { + listener = function() { + me.resize(); + }; + + platform.addEventListener(me, 'resize', listener); + listeners.resize = listener; + } + }, + + /** + * @private + */ + unbindEvents: function() { + var me = this; + var listeners = me._listeners; + if (!listeners) { + return; + } + + delete me._listeners; + helpers$1.each(listeners, function(listener, type) { + platform.removeEventListener(me, type, listener); + }); + }, + + updateHoverStyle: function(elements, mode, enabled) { + var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; + var element, i, ilen; + + for (i = 0, ilen = elements.length; i < ilen; ++i) { + element = elements[i]; + if (element) { + this.getDatasetMeta(element._datasetIndex).controller[method](element); + } + } + }, + + /** + * @private + */ + eventHandler: function(e) { + var me = this; + var tooltip = me.tooltip; + + if (core_plugins.notify(me, 'beforeEvent', [e]) === false) { + return; + } + + // Buffer any update calls so that renders do not occur + me._bufferedRender = true; + me._bufferedRequest = null; + + var changed = me.handleEvent(e); + // for smooth tooltip animations issue #4989 + // the tooltip should be the source of change + // Animation check workaround: + // tooltip._start will be null when tooltip isn't animating + if (tooltip) { + changed = tooltip._start + ? tooltip.handleEvent(e) + : changed | tooltip.handleEvent(e); + } + + core_plugins.notify(me, 'afterEvent', [e]); + + var bufferedRequest = me._bufferedRequest; + if (bufferedRequest) { + // If we have an update that was triggered, we need to do a normal render + me.render(bufferedRequest); + } else if (changed && !me.animating) { + // If entering, leaving, or changing elements, animate the change via pivot + me.stop(); + + // We only need to render at this point. Updating will cause scales to be + // recomputed generating flicker & using more memory than necessary. + me.render({ + duration: me.options.hover.animationDuration, + lazy: true + }); + } + + me._bufferedRender = false; + me._bufferedRequest = null; + + return me; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event the event to handle + * @return {boolean} true if the chart needs to re-render + */ + handleEvent: function(e) { + var me = this; + var options = me.options || {}; + var hoverOptions = options.hover; + var changed = false; + + me.lastActive = me.lastActive || []; + + // Find Active Elements for hover and tooltips + if (e.type === 'mouseout') { + me.active = []; + } else { + me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); + } + + // Invoke onHover hook + // Need to call with native event here to not break backwards compatibility + helpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); + + if (e.type === 'mouseup' || e.type === 'click') { + if (options.onClick) { + // Use e.native here for backwards compatibility + options.onClick.call(me, e.native, me.active); + } + } + + // Remove styling for last active (even if it may still be active) + if (me.lastActive.length) { + me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); + } + + // Built in hover styling + if (me.active.length && hoverOptions.mode) { + me.updateHoverStyle(me.active, hoverOptions.mode, true); + } + + changed = !helpers$1.arrayEquals(me.active, me.lastActive); + + // Remember Last Actives + me.lastActive = me.active; + + return changed; + } +}); + +/** + * NOTE(SB) We actually don't use this container anymore but we need to keep it + * for backward compatibility. Though, it can still be useful for plugins that + * would need to work on multiple charts?! + */ +Chart.instances = {}; + +var core_controller = Chart; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart instead. + * @class Chart.Controller + * @deprecated since version 2.6 + * @todo remove at version 3 + * @private + */ +Chart.Controller = Chart; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ +Chart.types = {}; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.configMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +helpers$1.configMerge = mergeConfig; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.scaleMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +helpers$1.scaleMerge = mergeScaleConfig; + +var core_helpers = function() { + + // -- Basic js utility methods + + helpers$1.where = function(collection, filterCallback) { + if (helpers$1.isArray(collection) && Array.prototype.filter) { + return collection.filter(filterCallback); + } + var filtered = []; + + helpers$1.each(collection, function(item) { + if (filterCallback(item)) { + filtered.push(item); + } + }); + + return filtered; + }; + helpers$1.findIndex = Array.prototype.findIndex ? + function(array, callback, scope) { + return array.findIndex(callback, scope); + } : + function(array, callback, scope) { + scope = scope === undefined ? array : scope; + for (var i = 0, ilen = array.length; i < ilen; ++i) { + if (callback.call(scope, array[i], i, array)) { + return i; + } + } + return -1; + }; + helpers$1.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to start of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = -1; + } + for (var i = startIndex + 1; i < arrayToSearch.length; i++) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + helpers$1.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to end of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = arrayToSearch.length; + } + for (var i = startIndex - 1; i >= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + + // -- Math methods + helpers$1.isNumber = function(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }; + helpers$1.almostEquals = function(x, y, epsilon) { + return Math.abs(x - y) < epsilon; + }; + helpers$1.almostWhole = function(x, epsilon) { + var rounded = Math.round(x); + return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); + }; + helpers$1.max = function(array) { + return array.reduce(function(max, value) { + if (!isNaN(value)) { + return Math.max(max, value); + } + return max; + }, Number.NEGATIVE_INFINITY); + }; + helpers$1.min = function(array) { + return array.reduce(function(min, value) { + if (!isNaN(value)) { + return Math.min(min, value); + } + return min; + }, Number.POSITIVE_INFINITY); + }; + helpers$1.sign = Math.sign ? + function(x) { + return Math.sign(x); + } : + function(x) { + x = +x; // convert to a number + if (x === 0 || isNaN(x)) { + return x; + } + return x > 0 ? 1 : -1; + }; + helpers$1.log10 = Math.log10 ? + function(x) { + return Math.log10(x); + } : + function(x) { + var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. + // Check for whole powers of 10, + // which due to floating point rounding error should be corrected. + var powerOf10 = Math.round(exponent); + var isPowerOf10 = x === Math.pow(10, powerOf10); + + return isPowerOf10 ? powerOf10 : exponent; + }; + helpers$1.toRadians = function(degrees) { + return degrees * (Math.PI / 180); + }; + helpers$1.toDegrees = function(radians) { + return radians * (180 / Math.PI); + }; + + /** + * Returns the number of decimal places + * i.e. the number of digits after the decimal point, of the value of this Number. + * @param {number} x - A number. + * @returns {number} The number of decimal places. + * @private + */ + helpers$1._decimalPlaces = function(x) { + if (!helpers$1.isFinite(x)) { + return; + } + var e = 1; + var p = 0; + while (Math.round(x * e) / e !== x) { + e *= 10; + p++; + } + return p; + }; + + // Gets the angle from vertical upright to the point about a centre. + helpers$1.getAngleFromPoint = function(centrePoint, anglePoint) { + var distanceFromXCenter = anglePoint.x - centrePoint.x; + var distanceFromYCenter = anglePoint.y - centrePoint.y; + var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + + var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); + + if (angle < (-0.5 * Math.PI)) { + angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }; + helpers$1.distanceBetweenPoints = function(pt1, pt2) { + return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); + }; + + /** + * Provided for backward compatibility, not available anymore + * @function Chart.helpers.aliasPixel + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ + helpers$1.aliasPixel = function(pixelWidth) { + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }; + + /** + * Returns the aligned pixel value to avoid anti-aliasing blur + * @param {Chart} chart - The chart instance. + * @param {number} pixel - A pixel value. + * @param {number} width - The width of the element. + * @returns {number} The aligned pixel value. + * @private + */ + helpers$1._alignPixel = function(chart, pixel, width) { + var devicePixelRatio = chart.currentDevicePixelRatio; + var halfWidth = width / 2; + return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; + }; + + helpers$1.splineCurve = function(firstPoint, middlePoint, afterPoint, t) { + // Props to Rob Spencer at scaled innovation for his post on splining between points + // http://scaledinnovation.com/analytics/splines/aboutSplines.html + + // This function must also respect "skipped" points + + var previous = firstPoint.skip ? middlePoint : firstPoint; + var current = middlePoint; + var next = afterPoint.skip ? middlePoint : afterPoint; + + var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); + var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); + + var s01 = d01 / (d01 + d12); + var s12 = d12 / (d01 + d12); + + // If all points are the same, s01 & s02 will be inf + s01 = isNaN(s01) ? 0 : s01; + s12 = isNaN(s12) ? 0 : s12; + + var fa = t * s01; // scaling factor for triangle Ta + var fb = t * s12; + + return { + previous: { + x: current.x - fa * (next.x - previous.x), + y: current.y - fa * (next.y - previous.y) + }, + next: { + x: current.x + fb * (next.x - previous.x), + y: current.y + fb * (next.y - previous.y) + } + }; + }; + helpers$1.EPSILON = Number.EPSILON || 1e-14; + helpers$1.splineCurveMonotone = function(points) { + // This function calculates Bézier control points in a similar way than |splineCurve|, + // but preserves monotonicity of the provided data and ensures no local extremums are added + // between the dataset discrete points due to the interpolation. + // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation + + var pointsWithTangents = (points || []).map(function(point) { + return { + model: point._model, + deltaK: 0, + mK: 0 + }; + }); + + // Calculate slopes (deltaK) and initialize tangents (mK) + var pointsLen = pointsWithTangents.length; + var i, pointBefore, pointCurrent, pointAfter; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointAfter && !pointAfter.model.skip) { + var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); + + // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 + pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; + } + + if (!pointBefore || pointBefore.model.skip) { + pointCurrent.mK = pointCurrent.deltaK; + } else if (!pointAfter || pointAfter.model.skip) { + pointCurrent.mK = pointBefore.deltaK; + } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { + pointCurrent.mK = 0; + } else { + pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; + } + } + + // Adjust tangents to ensure monotonic properties + var alphaK, betaK, tauK, squaredMagnitude; + for (i = 0; i < pointsLen - 1; ++i) { + pointCurrent = pointsWithTangents[i]; + pointAfter = pointsWithTangents[i + 1]; + if (pointCurrent.model.skip || pointAfter.model.skip) { + continue; + } + + if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { + pointCurrent.mK = pointAfter.mK = 0; + continue; + } + + alphaK = pointCurrent.mK / pointCurrent.deltaK; + betaK = pointAfter.mK / pointCurrent.deltaK; + squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); + if (squaredMagnitude <= 9) { + continue; + } + + tauK = 3 / Math.sqrt(squaredMagnitude); + pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; + pointAfter.mK = betaK * tauK * pointCurrent.deltaK; + } + + // Compute control points + var deltaX; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointBefore && !pointBefore.model.skip) { + deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; + pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; + pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; + } + if (pointAfter && !pointAfter.model.skip) { + deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; + pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; + pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; + } + } + }; + helpers$1.nextItem = function(collection, index, loop) { + if (loop) { + return index >= collection.length - 1 ? collection[0] : collection[index + 1]; + } + return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; + }; + helpers$1.previousItem = function(collection, index, loop) { + if (loop) { + return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; + } + return index <= 0 ? collection[0] : collection[index - 1]; + }; + // Implementation of the nice number algorithm used in determining where axis labels will go + helpers$1.niceNum = function(range, round) { + var exponent = Math.floor(helpers$1.log10(range)); + var fraction = range / Math.pow(10, exponent); + var niceFraction; + + if (round) { + if (fraction < 1.5) { + niceFraction = 1; + } else if (fraction < 3) { + niceFraction = 2; + } else if (fraction < 7) { + niceFraction = 5; + } else { + niceFraction = 10; + } + } else if (fraction <= 1.0) { + niceFraction = 1; + } else if (fraction <= 2) { + niceFraction = 2; + } else if (fraction <= 5) { + niceFraction = 5; + } else { + niceFraction = 10; + } + + return niceFraction * Math.pow(10, exponent); + }; + // Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + helpers$1.requestAnimFrame = (function() { + if (typeof window === 'undefined') { + return function(callback) { + callback(); + }; + } + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + }()); + // -- DOM methods + helpers$1.getRelativePosition = function(evt, chart) { + var mouseX, mouseY; + var e = evt.originalEvent || evt; + var canvas = evt.target || evt.srcElement; + var boundingRect = canvas.getBoundingClientRect(); + + var touches = e.touches; + if (touches && touches.length > 0) { + mouseX = touches[0].clientX; + mouseY = touches[0].clientY; + + } else { + mouseX = e.clientX; + mouseY = e.clientY; + } + + // Scale mouse coordinates into canvas coordinates + // by following the pattern laid out by 'jerryj' in the comments of + // https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ + var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left')); + var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top')); + var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right')); + var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom')); + var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; + var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; + + // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However + // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here + mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); + mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); + + return { + x: mouseX, + y: mouseY + }; + + }; + + // Private helper function to convert max-width/max-height values that may be percentages into a number + function parseMaxStyle(styleValue, node, parentProperty) { + var valueInPixels; + if (typeof styleValue === 'string') { + valueInPixels = parseInt(styleValue, 10); + + if (styleValue.indexOf('%') !== -1) { + // percentage * size in dimension + valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; + } + } else { + valueInPixels = styleValue; + } + + return valueInPixels; + } + + /** + * Returns if the given value contains an effective constraint. + * @private + */ + function isConstrainedValue(value) { + return value !== undefined && value !== null && value !== 'none'; + } + + /** + * Returns the max width or height of the given DOM node in a cross-browser compatible fashion + * @param {HTMLElement} domNode - the node to check the constraint on + * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height') + * @param {string} percentageProperty - property of parent to use when calculating width as a percentage + * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser} + */ + function getConstraintDimension(domNode, maxStyle, percentageProperty) { + var view = document.defaultView; + var parentNode = helpers$1._getParentNode(domNode); + var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; + var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; + var hasCNode = isConstrainedValue(constrainedNode); + var hasCContainer = isConstrainedValue(constrainedContainer); + var infinity = Number.POSITIVE_INFINITY; + + if (hasCNode || hasCContainer) { + return Math.min( + hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, + hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); + } + + return 'none'; + } + // returns Number or undefined if no constraint + helpers$1.getConstraintWidth = function(domNode) { + return getConstraintDimension(domNode, 'max-width', 'clientWidth'); + }; + // returns Number or undefined if no constraint + helpers$1.getConstraintHeight = function(domNode) { + return getConstraintDimension(domNode, 'max-height', 'clientHeight'); + }; + /** + * @private + */ + helpers$1._calculatePadding = function(container, padding, parentDimension) { + padding = helpers$1.getStyle(container, padding); + + return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10); + }; + /** + * @private + */ + helpers$1._getParentNode = function(domNode) { + var parent = domNode.parentNode; + if (parent && parent.toString() === '[object ShadowRoot]') { + parent = parent.host; + } + return parent; + }; + helpers$1.getMaximumWidth = function(domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientWidth; + } + + var clientWidth = container.clientWidth; + var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth); + var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth); + + var w = clientWidth - paddingLeft - paddingRight; + var cw = helpers$1.getConstraintWidth(domNode); + return isNaN(cw) ? w : Math.min(w, cw); + }; + helpers$1.getMaximumHeight = function(domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientHeight; + } + + var clientHeight = container.clientHeight; + var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight); + var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight); + + var h = clientHeight - paddingTop - paddingBottom; + var ch = helpers$1.getConstraintHeight(domNode); + return isNaN(ch) ? h : Math.min(h, ch); + }; + helpers$1.getStyle = function(el, property) { + return el.currentStyle ? + el.currentStyle[property] : + document.defaultView.getComputedStyle(el, null).getPropertyValue(property); + }; + helpers$1.retinaScale = function(chart, forceRatio) { + var pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && window.devicePixelRatio) || 1; + if (pixelRatio === 1) { + return; + } + + var canvas = chart.canvas; + var height = chart.height; + var width = chart.width; + + canvas.height = height * pixelRatio; + canvas.width = width * pixelRatio; + chart.ctx.scale(pixelRatio, pixelRatio); + + // If no style has been set on the canvas, the render size is used as display size, + // making the chart visually bigger, so let's enforce it to the "correct" values. + // See https://github.com/chartjs/Chart.js/issues/3575 + if (!canvas.style.height && !canvas.style.width) { + canvas.style.height = height + 'px'; + canvas.style.width = width + 'px'; + } + }; + // -- Canvas methods + helpers$1.fontString = function(pixelSize, fontStyle, fontFamily) { + return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; + }; + helpers$1.longestText = function(ctx, font, arrayOfThings, cache) { + cache = cache || {}; + var data = cache.data = cache.data || {}; + var gc = cache.garbageCollect = cache.garbageCollect || []; + + if (cache.font !== font) { + data = cache.data = {}; + gc = cache.garbageCollect = []; + cache.font = font; + } + + ctx.font = font; + var longest = 0; + helpers$1.each(arrayOfThings, function(thing) { + // Undefined strings and arrays should not be measured + if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) { + longest = helpers$1.measureText(ctx, data, gc, longest, thing); + } else if (helpers$1.isArray(thing)) { + // if it is an array lets measure each element + // to do maybe simplify this function a bit so we can do this more recursively? + helpers$1.each(thing, function(nestedThing) { + // Undefined strings and arrays should not be measured + if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) { + longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing); + } + }); + } + }); + + var gcLen = gc.length / 2; + if (gcLen > arrayOfThings.length) { + for (var i = 0; i < gcLen; i++) { + delete data[gc[i]]; + } + gc.splice(0, gcLen); + } + return longest; + }; + helpers$1.measureText = function(ctx, data, gc, longest, string) { + var textWidth = data[string]; + if (!textWidth) { + textWidth = data[string] = ctx.measureText(string).width; + gc.push(string); + } + if (textWidth > longest) { + longest = textWidth; + } + return longest; + }; + helpers$1.numberOfLabelLines = function(arrayOfThings) { + var numberOfLines = 1; + helpers$1.each(arrayOfThings, function(thing) { + if (helpers$1.isArray(thing)) { + if (thing.length > numberOfLines) { + numberOfLines = thing.length; + } + } + }); + return numberOfLines; + }; + + helpers$1.color = !chartjsColor ? + function(value) { + console.error('Color.js not found!'); + return value; + } : + function(value) { + /* global CanvasGradient */ + if (value instanceof CanvasGradient) { + value = core_defaults.global.defaultColor; + } + + return chartjsColor(value); + }; + + helpers$1.getHoverColor = function(colorValue) { + /* global CanvasPattern */ + return (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ? + colorValue : + helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString(); + }; +}; + +function abstract() { + throw new Error( + 'This method is not implemented: either no adapter can ' + + 'be found or an incomplete integration was provided.' + ); +} + +/** + * Date adapter (current used by the time scale) + * @namespace Chart._adapters._date + * @memberof Chart._adapters + * @private + */ + +/** + * Currently supported unit string values. + * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')} + * @memberof Chart._adapters._date + * @name Unit + */ + +/** + * @class + */ +function DateAdapter(options) { + this.options = options || {}; +} + +helpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */ { + /** + * Returns a map of time formats for the supported formatting units defined + * in Unit as well as 'datetime' representing a detailed date/time string. + * @returns {{string: string}} + */ + formats: abstract, + + /** + * Parses the given `value` and return the associated timestamp. + * @param {any} value - the value to parse (usually comes from the data) + * @param {string} [format] - the expected data format + * @returns {(number|null)} + * @function + */ + parse: abstract, + + /** + * Returns the formatted date in the specified `format` for a given `timestamp`. + * @param {number} timestamp - the timestamp to format + * @param {string} format - the date/time token + * @return {string} + * @function + */ + format: abstract, + + /** + * Adds the specified `amount` of `unit` to the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {number} amount - the amount to add + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + add: abstract, + + /** + * Returns the number of `unit` between the given timestamps. + * @param {number} max - the input timestamp (reference) + * @param {number} min - the timestamp to substract + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + diff: abstract, + + /** + * Returns start of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @param {number} [weekday] - the ISO day of the week with 1 being Monday + * and 7 being Sunday (only needed if param *unit* is `isoWeek`). + * @function + */ + startOf: abstract, + + /** + * Returns end of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @function + */ + endOf: abstract, + + // DEPRECATIONS + + /** + * Provided for backward compatibility for scale.getValueForPixel(), + * this method should be overridden only by the moment adapter. + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function(value) { + return value; + } +}); + +DateAdapter.override = function(members) { + helpers$1.extend(DateAdapter.prototype, members); +}; + +var _date = DateAdapter; + +var core_adapters = { + _date: _date +}; + +/** + * Namespace to hold static tick generation functions + * @namespace Chart.Ticks + */ +var core_ticks = { + /** + * Namespace to hold formatters for different types of ticks + * @namespace Chart.Ticks.formatters + */ + formatters: { + /** + * Formatter for value labels + * @method Chart.Ticks.formatters.values + * @param value the value to display + * @return {string|string[]} the label to display + */ + values: function(value) { + return helpers$1.isArray(value) ? value : '' + value; + }, + + /** + * Formatter for linear numeric ticks + * @method Chart.Ticks.formatters.linear + * @param tickValue {number} the value to be formatted + * @param index {number} the position of the tickValue parameter in the ticks array + * @param ticks {number[]} the list of ticks being converted + * @return {string} string representation of the tickValue parameter + */ + linear: function(tickValue, index, ticks) { + // If we have lots of ticks, don't use the ones + var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; + + // If we have a number like 2.5 as the delta, figure out how many decimal places we need + if (Math.abs(delta) > 1) { + if (tickValue !== Math.floor(tickValue)) { + // not an integer + delta = tickValue - Math.floor(tickValue); + } + } + + var logDelta = helpers$1.log10(Math.abs(delta)); + var tickString = ''; + + if (tickValue !== 0) { + var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1])); + if (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation + var logTick = helpers$1.log10(Math.abs(tickValue)); + tickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta)); + } else { + var numDecimal = -1 * Math.floor(logDelta); + numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places + tickString = tickValue.toFixed(numDecimal); + } + } else { + tickString = '0'; // never show decimal places for 0 + } + + return tickString; + }, + + logarithmic: function(tickValue, index, ticks) { + var remain = tickValue / (Math.pow(10, Math.floor(helpers$1.log10(tickValue)))); + + if (tickValue === 0) { + return '0'; + } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { + return tickValue.toExponential(); + } + return ''; + } + } +}; + +var valueOrDefault$9 = helpers$1.valueOrDefault; +var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault; + +core_defaults._set('scale', { + display: true, + position: 'left', + offset: false, + + // grid line settings + gridLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + drawBorder: true, + drawOnChartArea: true, + drawTicks: true, + tickMarkLength: 10, + zeroLineWidth: 1, + zeroLineColor: 'rgba(0,0,0,0.25)', + zeroLineBorderDash: [], + zeroLineBorderDashOffset: 0.0, + offsetGridLines: false, + borderDash: [], + borderDashOffset: 0.0 + }, + + // scale label + scaleLabel: { + // display property + display: false, + + // actual label + labelString: '', + + // top/bottom padding + padding: { + top: 4, + bottom: 4 + } + }, + + // label settings + ticks: { + beginAtZero: false, + minRotation: 0, + maxRotation: 50, + mirror: false, + padding: 0, + reverse: false, + display: true, + autoSkip: true, + autoSkipPadding: 0, + labelOffset: 0, + // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. + callback: core_ticks.formatters.values, + minor: {}, + major: {} + } +}); + +function labelsFromTicks(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(ticks[i].label); + } + + return labels; +} + +function getPixelForGridLine(scale, index, offsetGridLines) { + var lineValue = scale.getPixelForTick(index); + + if (offsetGridLines) { + if (scale.getTicks().length === 1) { + lineValue -= scale.isHorizontal() ? + Math.max(lineValue - scale.left, scale.right - lineValue) : + Math.max(lineValue - scale.top, scale.bottom - lineValue); + } else if (index === 0) { + lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; + } else { + lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; + } + } + return lineValue; +} + +function computeTextSize(context, tick, font) { + return helpers$1.isArray(tick) ? + helpers$1.longestText(context, font, tick) : + context.measureText(tick).width; +} + +var core_scale = core_element.extend({ + /** + * Get the padding needed for the scale + * @method getPadding + * @private + * @returns {Padding} the necessary padding + */ + getPadding: function() { + var me = this; + return { + left: me.paddingLeft || 0, + top: me.paddingTop || 0, + right: me.paddingRight || 0, + bottom: me.paddingBottom || 0 + }; + }, + + /** + * Returns the scale tick objects ({label, major}) + * @since 2.7 + */ + getTicks: function() { + return this._ticks; + }, + + // These methods are ordered by lifecyle. Utilities then follow. + // Any function defined here is inherited by all scale types. + // Any function can be extended by the scale type + + mergeTicksOptions: function() { + var ticks = this.options.ticks; + if (ticks.minor === false) { + ticks.minor = { + display: false + }; + } + if (ticks.major === false) { + ticks.major = { + display: false + }; + } + for (var key in ticks) { + if (key !== 'major' && key !== 'minor') { + if (typeof ticks.minor[key] === 'undefined') { + ticks.minor[key] = ticks[key]; + } + if (typeof ticks.major[key] === 'undefined') { + ticks.major[key] = ticks[key]; + } + } + } + }, + beforeUpdate: function() { + helpers$1.callback(this.options.beforeUpdate, [this]); + }, + + update: function(maxWidth, maxHeight, margins) { + var me = this; + var i, ilen, labels, label, ticks, tick; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = helpers$1.extend({ + left: 0, + right: 0, + top: 0, + bottom: 0 + }, margins); + + me._maxLabelLines = 0; + me.longestLabelWidth = 0; + me.longestTextCache = me.longestTextCache || {}; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + + // Data min/max + me.beforeDataLimits(); + me.determineDataLimits(); + me.afterDataLimits(); + + // Ticks - `this.ticks` is now DEPRECATED! + // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member + // and must not be accessed directly from outside this class. `this.ticks` being + // around for long time and not marked as private, we can't change its structure + // without unexpected breaking changes. If you need to access the scale ticks, + // use scale.getTicks() instead. + + me.beforeBuildTicks(); + + // New implementations should return an array of objects but for BACKWARD COMPAT, + // we still support no return (`this.ticks` internally set by calling this method). + ticks = me.buildTicks() || []; + + // Allow modification of ticks in callback. + ticks = me.afterBuildTicks(ticks) || ticks; + + me.beforeTickToLabelConversion(); + + // New implementations should return the formatted tick labels but for BACKWARD + // COMPAT, we still support no return (`this.ticks` internally changed by calling + // this method and supposed to contain only string values). + labels = me.convertTicksToLabels(ticks) || me.ticks; + + me.afterTickToLabelConversion(); + + me.ticks = labels; // BACKWARD COMPATIBILITY + + // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! + + // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) + for (i = 0, ilen = labels.length; i < ilen; ++i) { + label = labels[i]; + tick = ticks[i]; + if (!tick) { + ticks.push(tick = { + label: label, + major: false + }); + } else { + tick.label = label; + } + } + + me._ticks = ticks; + + // Tick Rotation + me.beforeCalculateTickRotation(); + me.calculateTickRotation(); + me.afterCalculateTickRotation(); + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: function() { + helpers$1.callback(this.options.afterUpdate, [this]); + }, + + // + + beforeSetDimensions: function() { + helpers$1.callback(this.options.beforeSetDimensions, [this]); + }, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + }, + afterSetDimensions: function() { + helpers$1.callback(this.options.afterSetDimensions, [this]); + }, + + // Data limits + beforeDataLimits: function() { + helpers$1.callback(this.options.beforeDataLimits, [this]); + }, + determineDataLimits: helpers$1.noop, + afterDataLimits: function() { + helpers$1.callback(this.options.afterDataLimits, [this]); + }, + + // + beforeBuildTicks: function() { + helpers$1.callback(this.options.beforeBuildTicks, [this]); + }, + buildTicks: helpers$1.noop, + afterBuildTicks: function(ticks) { + var me = this; + // ticks is empty for old axis implementations here + if (helpers$1.isArray(ticks) && ticks.length) { + return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]); + } + // Support old implementations (that modified `this.ticks` directly in buildTicks) + me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks; + return ticks; + }, + + beforeTickToLabelConversion: function() { + helpers$1.callback(this.options.beforeTickToLabelConversion, [this]); + }, + convertTicksToLabels: function() { + var me = this; + // Convert ticks to strings + var tickOpts = me.options.ticks; + me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); + }, + afterTickToLabelConversion: function() { + helpers$1.callback(this.options.afterTickToLabelConversion, [this]); + }, + + // + + beforeCalculateTickRotation: function() { + helpers$1.callback(this.options.beforeCalculateTickRotation, [this]); + }, + calculateTickRotation: function() { + var me = this; + var context = me.ctx; + var tickOpts = me.options.ticks; + var labels = labelsFromTicks(me._ticks); + + // Get the width of each grid by calculating the difference + // between x offsets between 0 and 1. + var tickFont = helpers$1.options._parseFont(tickOpts); + context.font = tickFont.string; + + var labelRotation = tickOpts.minRotation || 0; + + if (labels.length && me.options.display && me.isHorizontal()) { + var originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache); + var labelWidth = originalLabelWidth; + var cosRotation, sinRotation; + + // Allow 3 pixels x2 padding either side for label readability + var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; + + // Max label rotation can be set or default to 90 - also act as a loop counter + while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { + var angleRadians = helpers$1.toRadians(labelRotation); + cosRotation = Math.cos(angleRadians); + sinRotation = Math.sin(angleRadians); + + if (sinRotation * originalLabelWidth > me.maxHeight) { + // go back one step + labelRotation--; + break; + } + + labelRotation++; + labelWidth = cosRotation * originalLabelWidth; + } + } + + me.labelRotation = labelRotation; + }, + afterCalculateTickRotation: function() { + helpers$1.callback(this.options.afterCalculateTickRotation, [this]); + }, + + // + + beforeFit: function() { + helpers$1.callback(this.options.beforeFit, [this]); + }, + fit: function() { + var me = this; + // Reset + var minSize = me.minSize = { + width: 0, + height: 0 + }; + + var labels = labelsFromTicks(me._ticks); + + var opts = me.options; + var tickOpts = opts.ticks; + var scaleLabelOpts = opts.scaleLabel; + var gridLineOpts = opts.gridLines; + var display = me._isVisible(); + var position = opts.position; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var tickFont = parseFont(tickOpts); + var tickMarkLength = opts.gridLines.tickMarkLength; + + // Width + if (isHorizontal) { + // subtract the margins to line up with the chartArea if we are a full width scale + minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; + } else { + minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } + + // height + if (isHorizontal) { + minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } else { + minSize.height = me.maxHeight; // fill all the height + } + + // Are we showing a title for the scale? + if (scaleLabelOpts.display && display) { + var scaleLabelFont = parseFont(scaleLabelOpts); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding); + var deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height; + + if (isHorizontal) { + minSize.height += deltaHeight; + } else { + minSize.width += deltaHeight; + } + } + + // Don't bother fitting the ticks if we are not showing the labels + if (tickOpts.display && display) { + var largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache); + var tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels); + var lineSpace = tickFont.size * 0.5; + var tickPadding = me.options.ticks.padding; + + // Store max number of lines and widest label for _autoSkip + me._maxLabelLines = tallestLabelHeightInLines; + me.longestLabelWidth = largestTextWidth; + + if (isHorizontal) { + var angleRadians = helpers$1.toRadians(me.labelRotation); + var cosRotation = Math.cos(angleRadians); + var sinRotation = Math.sin(angleRadians); + + // TODO - improve this calculation + var labelHeight = (sinRotation * largestTextWidth) + + (tickFont.lineHeight * tallestLabelHeightInLines) + + lineSpace; // padding + + minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); + + me.ctx.font = tickFont.string; + var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string); + var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string); + var offsetLeft = me.getPixelForTick(0) - me.left; + var offsetRight = me.right - me.getPixelForTick(labels.length - 1); + var paddingLeft, paddingRight; + + // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned + // which means that the right padding is dominated by the font height + if (me.labelRotation !== 0) { + paddingLeft = position === 'bottom' ? (cosRotation * firstLabelWidth) : (cosRotation * lineSpace); + paddingRight = position === 'bottom' ? (cosRotation * lineSpace) : (cosRotation * lastLabelWidth); + } else { + paddingLeft = firstLabelWidth / 2; + paddingRight = lastLabelWidth / 2; + } + me.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges + me.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3; + } else { + // A vertical axis is more constrained by the width. Labels are the + // dominant factor here, so get that length first and account for padding + if (tickOpts.mirror) { + largestTextWidth = 0; + } else { + // use lineSpace for consistency with horizontal axis + // tickPadding is not implemented for horizontal + largestTextWidth += tickPadding + lineSpace; + } + + minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); + + me.paddingTop = tickFont.size / 2; + me.paddingBottom = tickFont.size / 2; + } + } + + me.handleMargins(); + + me.width = minSize.width; + me.height = minSize.height; + }, + + /** + * Handle margins and padding interactions + * @private + */ + handleMargins: function() { + var me = this; + if (me.margins) { + me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); + me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); + me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); + me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); + } + }, + + afterFit: function() { + helpers$1.callback(this.options.afterFit, [this]); + }, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + isFullWidth: function() { + return (this.options.fullWidth); + }, + + // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not + getRightValue: function(rawValue) { + // Null and undefined values first + if (helpers$1.isNullOrUndef(rawValue)) { + return NaN; + } + // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values + if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) { + return NaN; + } + // If it is in fact an object, dive in one more level + if (rawValue) { + if (this.isHorizontal()) { + if (rawValue.x !== undefined) { + return this.getRightValue(rawValue.x); + } + } else if (rawValue.y !== undefined) { + return this.getRightValue(rawValue.y); + } + } + + // Value is good, return it + return rawValue; + }, + + /** + * Used to get the value to display in the tooltip for the data at the given index + * @param index + * @param datasetIndex + */ + getLabelForIndex: helpers$1.noop, + + /** + * Returns the location of the given data point. Value can either be an index or a numerical value + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param value + * @param index + * @param datasetIndex + */ + getPixelForValue: helpers$1.noop, + + /** + * Used to get the data value from a given pixel. This is the inverse of getPixelForValue + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param pixel + */ + getValueForPixel: helpers$1.noop, + + /** + * Returns the location of the tick at the given index + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForTick: function(index) { + var me = this; + var offset = me.options.offset; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var pixel = (tickWidth * index) + me.paddingLeft; + + if (offset) { + pixel += tickWidth / 2; + } + + var finalVal = me.left + pixel; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + var innerHeight = me.height - (me.paddingTop + me.paddingBottom); + return me.top + (index * (innerHeight / (me._ticks.length - 1))); + }, + + /** + * Utility for getting the pixel location of a percentage of scale + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForDecimal: function(decimal) { + var me = this; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var valueOffset = (innerWidth * decimal) + me.paddingLeft; + + var finalVal = me.left + valueOffset; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + return me.top + (decimal * me.height); + }, + + /** + * Returns the pixel for the minimum chart value + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getBasePixel: function() { + return this.getPixelForValue(this.getBaseValue()); + }, + + getBaseValue: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0; + }, + + /** + * Returns a subset of ticks to be plotted to avoid overlapping labels. + * @private + */ + _autoSkip: function(ticks) { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + var tickCount = ticks.length; + var skipRatio = false; + var maxTicks = optionTicks.maxTicksLimit; + + // Total space needed to display all ticks. First and last ticks are + // drawn as their center at end of axis, so tickCount-1 + var ticksLength = me._tickSize() * (tickCount - 1); + + // Axis length + var axisLength = isHorizontal + ? me.width - (me.paddingLeft + me.paddingRight) + : me.height - (me.paddingTop + me.PaddingBottom); + + var result = []; + var i, tick; + + if (ticksLength > axisLength) { + skipRatio = 1 + Math.floor(ticksLength / axisLength); + } + + // if they defined a max number of optionTicks, + // increase skipRatio until that number is met + if (tickCount > maxTicks) { + skipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks)); + } + + for (i = 0; i < tickCount; i++) { + tick = ticks[i]; + + if (skipRatio > 1 && i % skipRatio > 0) { + // leave tick in place but make sure it's not displayed (#4635) + delete tick.label; + } + result.push(tick); + } + return result; + }, + + /** + * @private + */ + _tickSize: function() { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + + // Calculate space needed by label in axis direction. + var rot = helpers$1.toRadians(me.labelRotation); + var cos = Math.abs(Math.cos(rot)); + var sin = Math.abs(Math.sin(rot)); + + var padding = optionTicks.autoSkipPadding || 0; + var w = (me.longestLabelWidth + padding) || 0; + + var tickFont = helpers$1.options._parseFont(optionTicks); + var h = (me._maxLabelLines * tickFont.lineHeight + padding) || 0; + + // Calculate space needed for 1 tick in axis direction. + return isHorizontal + ? h * cos > w * sin ? w / cos : h / sin + : h * sin < w * cos ? h / cos : w / sin; + }, + + /** + * @private + */ + _isVisible: function() { + var me = this; + var chart = me.chart; + var display = me.options.display; + var i, ilen, meta; + + if (display !== 'auto') { + return !!display; + } + + // When 'auto', the scale is visible if at least one associated dataset is visible. + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + if (meta.xAxisID === me.id || meta.yAxisID === me.id) { + return true; + } + } + } + + return false; + }, + + /** + * Actually draw the scale on the canvas + * @param {object} chartArea - the area of the chart to draw full grid lines on + */ + draw: function(chartArea) { + var me = this; + var options = me.options; + + if (!me._isVisible()) { + return; + } + + var chart = me.chart; + var context = me.ctx; + var globalDefaults = core_defaults.global; + var defaultFontColor = globalDefaults.defaultFontColor; + var optionTicks = options.ticks.minor; + var optionMajorTicks = options.ticks.major || optionTicks; + var gridLines = options.gridLines; + var scaleLabel = options.scaleLabel; + var position = options.position; + + var isRotated = me.labelRotation !== 0; + var isMirrored = optionTicks.mirror; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); + var tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor); + var tickFont = parseFont(optionTicks); + var lineHeight = tickFont.lineHeight; + var majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor); + var majorTickFont = parseFont(optionMajorTicks); + var tickPadding = optionTicks.padding; + var labelOffset = optionTicks.labelOffset; + + var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; + + var scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor); + var scaleLabelFont = parseFont(scaleLabel); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding); + var labelRotationRadians = helpers$1.toRadians(me.labelRotation); + + var itemsToDraw = []; + + var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0; + var alignPixel = helpers$1._alignPixel; + var borderValue, tickStart, tickEnd; + + if (position === 'top') { + borderValue = alignPixel(chart, me.bottom, axisWidth); + tickStart = me.bottom - tl; + tickEnd = borderValue - axisWidth / 2; + } else if (position === 'bottom') { + borderValue = alignPixel(chart, me.top, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.top + tl; + } else if (position === 'left') { + borderValue = alignPixel(chart, me.right, axisWidth); + tickStart = me.right - tl; + tickEnd = borderValue - axisWidth / 2; + } else { + borderValue = alignPixel(chart, me.left, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.left + tl; + } + + var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error. + + helpers$1.each(ticks, function(tick, index) { + // autoskipper skipped this tick (#4635) + if (helpers$1.isNullOrUndef(tick.label)) { + return; + } + + var label = tick.label; + var lineWidth, lineColor, borderDash, borderDashOffset; + if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { + // Draw the first index specially + lineWidth = gridLines.zeroLineWidth; + lineColor = gridLines.zeroLineColor; + borderDash = gridLines.zeroLineBorderDash || []; + borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0; + } else { + lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index); + lineColor = valueAtIndexOrDefault(gridLines.color, index); + borderDash = gridLines.borderDash || []; + borderDashOffset = gridLines.borderDashOffset || 0.0; + } + + // Common properties + var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign; + var labelCount = helpers$1.isArray(label) ? label.length : 1; + var lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines); + + if (isHorizontal) { + var labelYOffset = tl + tickPadding; + + if (lineValue < me.left - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth); + ty1 = tickStart; + ty2 = tickEnd; + labelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option) + + if (position === 'top') { + y1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2; + y2 = chartArea.bottom; + textOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight; + textAlign = !isRotated ? 'center' : 'left'; + labelY = me.bottom - labelYOffset; + } else { + y1 = chartArea.top; + y2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2; + textOffset = (!isRotated ? 0.5 : 0) * lineHeight; + textAlign = !isRotated ? 'center' : 'right'; + labelY = me.top + labelYOffset; + } + } else { + var labelXOffset = (isMirrored ? 0 : tl) + tickPadding; + + if (lineValue < me.top - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tickStart; + tx2 = tickEnd; + ty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth); + labelY = me.getPixelForTick(index) + labelOffset; + textOffset = (1 - labelCount) * lineHeight / 2; + + if (position === 'left') { + x1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2; + x2 = chartArea.right; + textAlign = isMirrored ? 'left' : 'right'; + labelX = me.right - labelXOffset; + } else { + x1 = chartArea.left; + x2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2; + textAlign = isMirrored ? 'right' : 'left'; + labelX = me.left + labelXOffset; + } + } + + itemsToDraw.push({ + tx1: tx1, + ty1: ty1, + tx2: tx2, + ty2: ty2, + x1: x1, + y1: y1, + x2: x2, + y2: y2, + labelX: labelX, + labelY: labelY, + glWidth: lineWidth, + glColor: lineColor, + glBorderDash: borderDash, + glBorderDashOffset: borderDashOffset, + rotation: -1 * labelRotationRadians, + label: label, + major: tick.major, + textOffset: textOffset, + textAlign: textAlign + }); + }); + + // Draw all of the tick labels, tick marks, and grid lines at the correct places + helpers$1.each(itemsToDraw, function(itemToDraw) { + var glWidth = itemToDraw.glWidth; + var glColor = itemToDraw.glColor; + + if (gridLines.display && glWidth && glColor) { + context.save(); + context.lineWidth = glWidth; + context.strokeStyle = glColor; + if (context.setLineDash) { + context.setLineDash(itemToDraw.glBorderDash); + context.lineDashOffset = itemToDraw.glBorderDashOffset; + } + + context.beginPath(); + + if (gridLines.drawTicks) { + context.moveTo(itemToDraw.tx1, itemToDraw.ty1); + context.lineTo(itemToDraw.tx2, itemToDraw.ty2); + } + + if (gridLines.drawOnChartArea) { + context.moveTo(itemToDraw.x1, itemToDraw.y1); + context.lineTo(itemToDraw.x2, itemToDraw.y2); + } + + context.stroke(); + context.restore(); + } + + if (optionTicks.display) { + // Make sure we draw text in the correct color and font + context.save(); + context.translate(itemToDraw.labelX, itemToDraw.labelY); + context.rotate(itemToDraw.rotation); + context.font = itemToDraw.major ? majorTickFont.string : tickFont.string; + context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; + context.textBaseline = 'middle'; + context.textAlign = itemToDraw.textAlign; + + var label = itemToDraw.label; + var y = itemToDraw.textOffset; + if (helpers$1.isArray(label)) { + for (var i = 0; i < label.length; ++i) { + // We just make sure the multiline element is a string here.. + context.fillText('' + label[i], 0, y); + y += lineHeight; + } + } else { + context.fillText(label, 0, y); + } + context.restore(); + } + }); + + if (scaleLabel.display) { + // Draw the scale label + var scaleLabelX; + var scaleLabelY; + var rotation = 0; + var halfLineHeight = scaleLabelFont.lineHeight / 2; + + if (isHorizontal) { + scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width + scaleLabelY = position === 'bottom' + ? me.bottom - halfLineHeight - scaleLabelPadding.bottom + : me.top + halfLineHeight + scaleLabelPadding.top; + } else { + var isLeft = position === 'left'; + scaleLabelX = isLeft + ? me.left + halfLineHeight + scaleLabelPadding.top + : me.right - halfLineHeight - scaleLabelPadding.top; + scaleLabelY = me.top + ((me.bottom - me.top) / 2); + rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; + } + + context.save(); + context.translate(scaleLabelX, scaleLabelY); + context.rotate(rotation); + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.fillStyle = scaleLabelFontColor; // render in correct colour + context.font = scaleLabelFont.string; + context.fillText(scaleLabel.labelString, 0, 0); + context.restore(); + } + + if (axisWidth) { + // Draw the line at the edge of the axis + var firstLineWidth = axisWidth; + var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0); + var x1, x2, y1, y2; + + if (isHorizontal) { + x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2; + x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2; + y1 = y2 = borderValue; + } else { + y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2; + y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2; + x1 = x2 = borderValue; + } + + context.lineWidth = axisWidth; + context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0); + context.beginPath(); + context.moveTo(x1, y1); + context.lineTo(x2, y2); + context.stroke(); + } + } +}); + +var defaultConfig = { + position: 'bottom' +}; + +var scale_category = core_scale.extend({ + /** + * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those + * else fall back to data.labels + * @private + */ + getLabels: function() { + var data = this.chart.data; + return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; + }, + + determineDataLimits: function() { + var me = this; + var labels = me.getLabels(); + me.minIndex = 0; + me.maxIndex = labels.length - 1; + var findIndex; + + if (me.options.ticks.min !== undefined) { + // user specified min value + findIndex = labels.indexOf(me.options.ticks.min); + me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; + } + + if (me.options.ticks.max !== undefined) { + // user specified max value + findIndex = labels.indexOf(me.options.ticks.max); + me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; + } + + me.min = labels[me.minIndex]; + me.max = labels[me.maxIndex]; + }, + + buildTicks: function() { + var me = this; + var labels = me.getLabels(); + // If we are viewing some subset of labels, slice the original array + me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var chart = me.chart; + + if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) { + return me.getRightValue(chart.data.datasets[datasetIndex].data[index]); + } + + return me.ticks[index - me.minIndex]; + }, + + // Used to get data value locations. Value can either be an index or a numerical value + getPixelForValue: function(value, index) { + var me = this; + var offset = me.options.offset; + // 1 is added because we need the length but we have the indexes + var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); + + // If value is a data object, then index is the index in the data array, + // not the index of the scale. We need to change that. + var valueCategory; + if (value !== undefined && value !== null) { + valueCategory = me.isHorizontal() ? value.x : value.y; + } + if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { + var labels = me.getLabels(); + value = valueCategory || value; + var idx = labels.indexOf(value); + index = idx !== -1 ? idx : index; + } + + if (me.isHorizontal()) { + var valueWidth = me.width / offsetAmt; + var widthOffset = (valueWidth * (index - me.minIndex)); + + if (offset) { + widthOffset += (valueWidth / 2); + } + + return me.left + widthOffset; + } + var valueHeight = me.height / offsetAmt; + var heightOffset = (valueHeight * (index - me.minIndex)); + + if (offset) { + heightOffset += (valueHeight / 2); + } + + return me.top + heightOffset; + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); + }, + + getValueForPixel: function(pixel) { + var me = this; + var offset = me.options.offset; + var value; + var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var horz = me.isHorizontal(); + var valueDimension = (horz ? me.width : me.height) / offsetAmt; + + pixel -= horz ? me.left : me.top; + + if (offset) { + pixel -= (valueDimension / 2); + } + + if (pixel <= 0) { + value = 0; + } else { + value = Math.round(pixel / valueDimension); + } + + return value + me.minIndex; + }, + + getBasePixel: function() { + return this.bottom; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults = defaultConfig; +scale_category._defaults = _defaults; + +var noop = helpers$1.noop; +var isNullOrUndef = helpers$1.isNullOrUndef; + +/** + * Generate a set of linear ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ +function generateTicks(generationOptions, dataRange) { + var ticks = []; + // To get a "nice" value for the tick spacing, we will use the appropriately named + // "nice number" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks + // for details. + + var MIN_SPACING = 1e-14; + var stepSize = generationOptions.stepSize; + var unit = stepSize || 1; + var maxNumSpaces = generationOptions.maxTicks - 1; + var min = generationOptions.min; + var max = generationOptions.max; + var precision = generationOptions.precision; + var rmin = dataRange.min; + var rmax = dataRange.max; + var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit; + var factor, niceMin, niceMax, numSpaces; + + // Beyond MIN_SPACING floating point numbers being to lose precision + // such that we can't do the math necessary to generate ticks + if (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) { + return [rmin, rmax]; + } + + numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); + if (numSpaces > maxNumSpaces) { + // If the calculated num of spaces exceeds maxNumSpaces, recalculate it + spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit; + } + + if (stepSize || isNullOrUndef(precision)) { + // If a precision is not specified, calculate factor based on spacing + factor = Math.pow(10, helpers$1._decimalPlaces(spacing)); + } else { + // If the user specified a precision, round to that number of decimal places + factor = Math.pow(10, precision); + spacing = Math.ceil(spacing * factor) / factor; + } + + niceMin = Math.floor(rmin / spacing) * spacing; + niceMax = Math.ceil(rmax / spacing) * spacing; + + // If min, max and stepSize is set and they make an evenly spaced scale use it. + if (stepSize) { + // If very close to our whole number, use it. + if (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) { + niceMin = min; + } + if (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) { + niceMax = max; + } + } + + numSpaces = (niceMax - niceMin) / spacing; + // If very close to our rounded value, use it. + if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { + numSpaces = Math.round(numSpaces); + } else { + numSpaces = Math.ceil(numSpaces); + } + + niceMin = Math.round(niceMin * factor) / factor; + niceMax = Math.round(niceMax * factor) / factor; + ticks.push(isNullOrUndef(min) ? niceMin : min); + for (var j = 1; j < numSpaces; ++j) { + ticks.push(Math.round((niceMin + j * spacing) * factor) / factor); + } + ticks.push(isNullOrUndef(max) ? niceMax : max); + + return ticks; +} + +var scale_linearbase = core_scale.extend({ + getRightValue: function(value) { + if (typeof value === 'string') { + return +value; + } + return core_scale.prototype.getRightValue.call(this, value); + }, + + handleTickRangeOptions: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, + // do nothing since that would make the chart weird. If the user really wants a weird chart + // axis, they can manually override it + if (tickOpts.beginAtZero) { + var minSign = helpers$1.sign(me.min); + var maxSign = helpers$1.sign(me.max); + + if (minSign < 0 && maxSign < 0) { + // move the top up to 0 + me.max = 0; + } else if (minSign > 0 && maxSign > 0) { + // move the bottom down to 0 + me.min = 0; + } + } + + var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; + var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; + + if (tickOpts.min !== undefined) { + me.min = tickOpts.min; + } else if (tickOpts.suggestedMin !== undefined) { + if (me.min === null) { + me.min = tickOpts.suggestedMin; + } else { + me.min = Math.min(me.min, tickOpts.suggestedMin); + } + } + + if (tickOpts.max !== undefined) { + me.max = tickOpts.max; + } else if (tickOpts.suggestedMax !== undefined) { + if (me.max === null) { + me.max = tickOpts.suggestedMax; + } else { + me.max = Math.max(me.max, tickOpts.suggestedMax); + } + } + + if (setMin !== setMax) { + // We set the min or the max but not both. + // So ensure that our range is good + // Inverted or 0 length range can happen when + // ticks.min is set, and no datasets are visible + if (me.min >= me.max) { + if (setMin) { + me.max = me.min + 1; + } else { + me.min = me.max - 1; + } + } + } + + if (me.min === me.max) { + me.max++; + + if (!tickOpts.beginAtZero) { + me.min--; + } + } + }, + + getTickLimit: function() { + var me = this; + var tickOpts = me.options.ticks; + var stepSize = tickOpts.stepSize; + var maxTicksLimit = tickOpts.maxTicksLimit; + var maxTicks; + + if (stepSize) { + maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1; + } else { + maxTicks = me._computeTickLimit(); + maxTicksLimit = maxTicksLimit || 11; + } + + if (maxTicksLimit) { + maxTicks = Math.min(maxTicksLimit, maxTicks); + } + + return maxTicks; + }, + + _computeTickLimit: function() { + return Number.POSITIVE_INFINITY; + }, + + handleDirectionalChanges: noop, + + buildTicks: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // Figure out what the max number of ticks we can support it is based on the size of + // the axis area. For now, we say that the minimum tick spacing in pixels must be 40 + // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on + // the graph. Make sure we always have at least 2 ticks + var maxTicks = me.getTickLimit(); + maxTicks = Math.max(2, maxTicks); + + var numericGeneratorOptions = { + maxTicks: maxTicks, + min: tickOpts.min, + max: tickOpts.max, + precision: tickOpts.precision, + stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) + }; + var ticks = me.ticks = generateTicks(numericGeneratorOptions, me); + + me.handleDirectionalChanges(); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + ticks.reverse(); + + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + }, + + convertTicksToLabels: function() { + var me = this; + me.ticksAsNumbers = me.ticks.slice(); + me.zeroLineIndex = me.ticks.indexOf(0); + + core_scale.prototype.convertTicksToLabels.call(me); + } +}); + +var defaultConfig$1 = { + position: 'left', + ticks: { + callback: core_ticks.formatters.linear + } +}; + +var scale_linear = scale_linearbase.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + var DEFAULT_MIN = 0; + var DEFAULT_MAX = 1; + + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // First Calculate the range + me.min = null; + me.max = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = { + positiveValues: [], + negativeValues: [] + }; + } + + // Store these per type + var positiveValues = valuesPerStack[key].positiveValues; + var negativeValues = valuesPerStack[key].negativeValues; + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + positiveValues[index] = positiveValues[index] || 0; + negativeValues[index] = negativeValues[index] || 0; + + if (opts.relativePoints) { + positiveValues[index] = 100; + } else if (value < 0) { + negativeValues[index] += value; + } else { + positiveValues[index] += value; + } + }); + } + }); + + helpers$1.each(valuesPerStack, function(valuesForType) { + var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); + var minVal = helpers$1.min(values); + var maxVal = helpers$1.max(values); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + }); + + } else { + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + }); + } + }); + } + + me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; + me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + this.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function() { + var me = this; + var tickFont; + + if (me.isHorizontal()) { + return Math.ceil(me.width / 40); + } + tickFont = helpers$1.options._parseFont(me.options.ticks); + return Math.ceil(me.height / tickFont.lineHeight); + }, + + // Called after the ticks are built. We need + handleDirectionalChanges: function() { + if (!this.isHorizontal()) { + // We are in a vertical orientation. The top value is the highest. So reverse the array + this.ticks.reverse(); + } + }, + + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + // Utils + getPixelForValue: function(value) { + // This must be called after fit has been run so that + // this.left, this.top, this.right, and this.bottom have been defined + var me = this; + var start = me.start; + + var rightValue = +me.getRightValue(value); + var pixel; + var range = me.end - start; + + if (me.isHorizontal()) { + pixel = me.left + (me.width / range * (rightValue - start)); + } else { + pixel = me.bottom - (me.height / range * (rightValue - start)); + } + return pixel; + }, + + getValueForPixel: function(pixel) { + var me = this; + var isHorizontal = me.isHorizontal(); + var innerDimension = isHorizontal ? me.width : me.height; + var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; + return me.start + ((me.end - me.start) * offset); + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticksAsNumbers[index]); + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$1 = defaultConfig$1; +scale_linear._defaults = _defaults$1; + +var valueOrDefault$a = helpers$1.valueOrDefault; + +/** + * Generate a set of logarithmic ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ +function generateTicks$1(generationOptions, dataRange) { + var ticks = []; + + var tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min)))); + + var endExp = Math.floor(helpers$1.log10(dataRange.max)); + var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); + var exp, significand; + + if (tickVal === 0) { + exp = Math.floor(helpers$1.log10(dataRange.minNotZero)); + significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); + + ticks.push(tickVal); + tickVal = significand * Math.pow(10, exp); + } else { + exp = Math.floor(helpers$1.log10(tickVal)); + significand = Math.floor(tickVal / Math.pow(10, exp)); + } + var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; + + do { + ticks.push(tickVal); + + ++significand; + if (significand === 10) { + significand = 1; + ++exp; + precision = exp >= 0 ? 1 : precision; + } + + tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision; + } while (exp < endExp || (exp === endExp && significand < endSignificand)); + + var lastTick = valueOrDefault$a(generationOptions.max, tickVal); + ticks.push(lastTick); + + return ticks; +} + +var defaultConfig$2 = { + position: 'left', + + // label settings + ticks: { + callback: core_ticks.formatters.logarithmic + } +}; + +// TODO(v3): change this to positiveOrDefault +function nonNegativeOrDefault(value, defaultValue) { + return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue; +} + +var scale_logarithmic = core_scale.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // Calculate Range + me.min = null; + me.max = null; + me.minNotZero = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = []; + } + + helpers$1.each(dataset.data, function(rawValue, index) { + var values = valuesPerStack[key]; + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + values[index] = values[index] || 0; + values[index] += value; + }); + } + }); + + helpers$1.each(valuesPerStack, function(valuesForType) { + if (valuesForType.length > 0) { + var minVal = helpers$1.min(valuesForType); + var maxVal = helpers$1.max(valuesForType); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + } + }); + + } else { + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + + if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { + me.minNotZero = value; + } + }); + } + }); + } + + // Common base implementation to handle ticks.min, ticks.max + this.handleTickRangeOptions(); + }, + + handleTickRangeOptions: function() { + var me = this; + var tickOpts = me.options.ticks; + var DEFAULT_MIN = 1; + var DEFAULT_MAX = 10; + + me.min = nonNegativeOrDefault(tickOpts.min, me.min); + me.max = nonNegativeOrDefault(tickOpts.max, me.max); + + if (me.min === me.max) { + if (me.min !== 0 && me.min !== null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1); + me.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1); + } else { + me.min = DEFAULT_MIN; + me.max = DEFAULT_MAX; + } + } + if (me.min === null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1); + } + if (me.max === null) { + me.max = me.min !== 0 + ? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1) + : DEFAULT_MAX; + } + if (me.minNotZero === null) { + if (me.min > 0) { + me.minNotZero = me.min; + } else if (me.max < 1) { + me.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max))); + } else { + me.minNotZero = DEFAULT_MIN; + } + } + }, + + buildTicks: function() { + var me = this; + var tickOpts = me.options.ticks; + var reverse = !me.isHorizontal(); + + var generationOptions = { + min: nonNegativeOrDefault(tickOpts.min), + max: nonNegativeOrDefault(tickOpts.max) + }; + var ticks = me.ticks = generateTicks$1(generationOptions, me); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + reverse = !reverse; + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + if (reverse) { + ticks.reverse(); + } + }, + + convertTicksToLabels: function() { + this.tickValues = this.ticks.slice(); + + core_scale.prototype.convertTicksToLabels.call(this); + }, + + // Get the correct tooltip label + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.tickValues[index]); + }, + + /** + * Returns the value of the first tick. + * @param {number} value - The minimum not zero value. + * @return {number} The first tick value. + * @private + */ + _getFirstTickValue: function(value) { + var exp = Math.floor(helpers$1.log10(value)); + var significand = Math.floor(value / Math.pow(10, exp)); + + return significand * Math.pow(10, exp); + }, + + getPixelForValue: function(value) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var offset = 0; + var innerDimension, pixel, start, end, sign; + + value = +me.getRightValue(value); + if (reverse) { + start = me.end; + end = me.start; + sign = -1; + } else { + start = me.start; + end = me.end; + sign = 1; + } + if (me.isHorizontal()) { + innerDimension = me.width; + pixel = reverse ? me.right : me.left; + } else { + innerDimension = me.height; + sign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0) + pixel = reverse ? me.top : me.bottom; + } + if (value !== start) { + if (start === 0) { // include zero tick + offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + innerDimension -= offset; + start = firstTickValue; + } + if (value !== 0) { + offset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start)); + } + pixel += sign * offset; + } + return pixel; + }, + + getValueForPixel: function(pixel) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var innerDimension, start, end, value; + + if (reverse) { + start = me.end; + end = me.start; + } else { + start = me.start; + end = me.end; + } + if (me.isHorizontal()) { + innerDimension = me.width; + value = reverse ? me.right - pixel : pixel - me.left; + } else { + innerDimension = me.height; + value = reverse ? pixel - me.top : me.bottom - pixel; + } + if (value !== start) { + if (start === 0) { // include zero tick + var offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + value -= offset; + innerDimension -= offset; + start = firstTickValue; + } + value *= log10(end) - log10(start); + value /= innerDimension; + value = Math.pow(10, log10(start) + value); + } + return value; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$2 = defaultConfig$2; +scale_logarithmic._defaults = _defaults$2; + +var valueOrDefault$b = helpers$1.valueOrDefault; +var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault; +var resolve$7 = helpers$1.options.resolve; + +var defaultConfig$3 = { + display: true, + + // Boolean - Whether to animate scaling the chart from the centre + animate: true, + position: 'chartArea', + + angleLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + borderDash: [], + borderDashOffset: 0.0 + }, + + gridLines: { + circular: false + }, + + // label settings + ticks: { + // Boolean - Show a backdrop to the scale label + showLabelBackdrop: true, + + // String - The colour of the label backdrop + backdropColor: 'rgba(255,255,255,0.75)', + + // Number - The backdrop padding above & below the label in pixels + backdropPaddingY: 2, + + // Number - The backdrop padding to the side of the label in pixels + backdropPaddingX: 2, + + callback: core_ticks.formatters.linear + }, + + pointLabels: { + // Boolean - if true, show point labels + display: true, + + // Number - Point label font size in pixels + fontSize: 10, + + // Function - Used to convert point labels + callback: function(label) { + return label; + } + } +}; + +function getValueCount(scale) { + var opts = scale.options; + return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; +} + +function getTickBackdropHeight(opts) { + var tickOpts = opts.ticks; + + if (tickOpts.display && opts.display) { + return valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2; + } + return 0; +} + +function measureLabelSize(ctx, lineHeight, label) { + if (helpers$1.isArray(label)) { + return { + w: helpers$1.longestText(ctx, ctx.font, label), + h: label.length * lineHeight + }; + } + + return { + w: ctx.measureText(label).width, + h: lineHeight + }; +} + +function determineLimits(angle, pos, size, min, max) { + if (angle === min || angle === max) { + return { + start: pos - (size / 2), + end: pos + (size / 2) + }; + } else if (angle < min || angle > max) { + return { + start: pos - size, + end: pos + }; + } + + return { + start: pos, + end: pos + size + }; +} + +/** + * Helper function to fit a radial linear scale with point labels + */ +function fitWithPointLabels(scale) { + + // Right, this is really confusing and there is a lot of maths going on here + // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + // + // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + // + // Solution: + // + // We assume the radius of the polygon is half the size of the canvas at first + // at each index we check if the text overlaps. + // + // Where it does, we store that angle and that index. + // + // After finding the largest index and angle we calculate how much we need to remove + // from the shape radius to move the point inwards by that x. + // + // We average the left and right distances to get the maximum shape radius that can fit in the box + // along with labels. + // + // Once we have that, we can find the centre point for the chart, by taking the x text protrusion + // on each side, removing that from the size, halving it and adding the left x protrusion width. + // + // This will mean we have a shape fitted to the canvas, as large as it can be with the labels + // and position it in the most space efficient manner + // + // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + + var plFont = helpers$1.options._parseFont(scale.options.pointLabels); + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var furthestLimits = { + l: 0, + r: scale.width, + t: 0, + b: scale.height - scale.paddingTop + }; + var furthestAngles = {}; + var i, textSize, pointPosition; + + scale.ctx.font = plFont.string; + scale._pointLabelSizes = []; + + var valueCount = getValueCount(scale); + for (i = 0; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, scale.drawingArea + 5); + textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || ''); + scale._pointLabelSizes[i] = textSize; + + // Add quarter circle to make degree 0 mean top of circle + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians) % 360; + var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); + var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); + + if (hLimits.start < furthestLimits.l) { + furthestLimits.l = hLimits.start; + furthestAngles.l = angleRadians; + } + + if (hLimits.end > furthestLimits.r) { + furthestLimits.r = hLimits.end; + furthestAngles.r = angleRadians; + } + + if (vLimits.start < furthestLimits.t) { + furthestLimits.t = vLimits.start; + furthestAngles.t = angleRadians; + } + + if (vLimits.end > furthestLimits.b) { + furthestLimits.b = vLimits.end; + furthestAngles.b = angleRadians; + } + } + + scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles); +} + +function getTextAlignForAngle(angle) { + if (angle === 0 || angle === 180) { + return 'center'; + } else if (angle < 180) { + return 'left'; + } + + return 'right'; +} + +function fillText(ctx, text, position, lineHeight) { + var y = position.y + lineHeight / 2; + var i, ilen; + + if (helpers$1.isArray(text)) { + for (i = 0, ilen = text.length; i < ilen; ++i) { + ctx.fillText(text[i], position.x, y); + y += lineHeight; + } + } else { + ctx.fillText(text, position.x, y); + } +} + +function adjustPointPositionForLabelHeight(angle, textSize, position) { + if (angle === 90 || angle === 270) { + position.y -= (textSize.h / 2); + } else if (angle > 270 || angle < 90) { + position.y -= textSize.h; + } +} + +function drawPointLabels(scale) { + var ctx = scale.ctx; + var opts = scale.options; + var angleLineOpts = opts.angleLines; + var gridLineOpts = opts.gridLines; + var pointLabelOpts = opts.pointLabels; + var lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth); + var lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color); + var tickBackdropHeight = getTickBackdropHeight(opts); + + ctx.save(); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = lineColor; + if (ctx.setLineDash) { + ctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []])); + ctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]); + } + + var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); + + // Point Label Font + var plFont = helpers$1.options._parseFont(pointLabelOpts); + + ctx.font = plFont.string; + ctx.textBaseline = 'middle'; + + for (var i = getValueCount(scale) - 1; i >= 0; i--) { + if (angleLineOpts.display && lineWidth && lineColor) { + var outerPosition = scale.getPointPosition(i, outerDistance); + ctx.beginPath(); + ctx.moveTo(scale.xCenter, scale.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + } + + if (pointLabelOpts.display) { + // Extra pixels out for some label spacing + var extra = (i === 0 ? tickBackdropHeight / 2 : 0); + var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5); + + // Keep this in loop since we may support array properties here + var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor); + ctx.fillStyle = pointLabelFontColor; + + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians); + ctx.textAlign = getTextAlignForAngle(angle); + adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); + fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight); + } + } + ctx.restore(); +} + +function drawRadiusLine(scale, gridLineOpts, radius, index) { + var ctx = scale.ctx; + var circular = gridLineOpts.circular; + var valueCount = getValueCount(scale); + var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1); + var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1); + var pointPosition; + + if ((!circular && !valueCount) || !lineColor || !lineWidth) { + return; + } + + ctx.save(); + ctx.strokeStyle = lineColor; + ctx.lineWidth = lineWidth; + if (ctx.setLineDash) { + ctx.setLineDash(gridLineOpts.borderDash || []); + ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0; + } + + ctx.beginPath(); + if (circular) { + // Draw circular arcs between the points + ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); + } else { + // Draw straight lines connecting each index + pointPosition = scale.getPointPosition(0, radius); + ctx.moveTo(pointPosition.x, pointPosition.y); + + for (var i = 1; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, radius); + ctx.lineTo(pointPosition.x, pointPosition.y); + } + } + ctx.closePath(); + ctx.stroke(); + ctx.restore(); +} + +function numberOrZero(param) { + return helpers$1.isNumber(param) ? param : 0; +} + +var scale_radialLinear = scale_linearbase.extend({ + setDimensions: function() { + var me = this; + + // Set the unconstrained dimension before label rotation + me.width = me.maxWidth; + me.height = me.maxHeight; + me.paddingTop = getTickBackdropHeight(me.options) / 2; + me.xCenter = Math.floor(me.width / 2); + me.yCenter = Math.floor((me.height - me.paddingTop) / 2); + me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2; + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var min = Number.POSITIVE_INFINITY; + var max = Number.NEGATIVE_INFINITY; + + helpers$1.each(chart.data.datasets, function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + min = Math.min(value, min); + max = Math.max(value, max); + }); + } + }); + + me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); + me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + me.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function() { + return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); + }, + + convertTicksToLabels: function() { + var me = this; + + scale_linearbase.prototype.convertTicksToLabels.call(me); + + // Point labels + me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); + }, + + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + fit: function() { + var me = this; + var opts = me.options; + + if (opts.display && opts.pointLabels.display) { + fitWithPointLabels(me); + } else { + me.setCenterPoint(0, 0, 0, 0); + } + }, + + /** + * Set radius reductions and determine new radius and center point + * @private + */ + setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) { + var me = this; + var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); + var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); + var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); + var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b); + + radiusReductionLeft = numberOrZero(radiusReductionLeft); + radiusReductionRight = numberOrZero(radiusReductionRight); + radiusReductionTop = numberOrZero(radiusReductionTop); + radiusReductionBottom = numberOrZero(radiusReductionBottom); + + me.drawingArea = Math.min( + Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), + Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); + me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); + }, + + setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) { + var me = this; + var maxRight = me.width - rightMovement - me.drawingArea; + var maxLeft = leftMovement + me.drawingArea; + var maxTop = topMovement + me.drawingArea; + var maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea; + + me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left); + me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop); + }, + + getIndexAngle: function(index) { + var angleMultiplier = (Math.PI * 2) / getValueCount(this); + var startAngle = this.chart.options && this.chart.options.startAngle ? + this.chart.options.startAngle : + 0; + + var startAngleRadians = startAngle * Math.PI * 2 / 360; + + // Start from the top instead of right, so remove a quarter of the circle + return index * angleMultiplier + startAngleRadians; + }, + + getDistanceFromCenterForValue: function(value) { + var me = this; + + if (value === null) { + return 0; // null always in center + } + + // Take into account half font size + the yPadding of the top value + var scalingFactor = me.drawingArea / (me.max - me.min); + if (me.options.ticks.reverse) { + return (me.max - value) * scalingFactor; + } + return (value - me.min) * scalingFactor; + }, + + getPointPosition: function(index, distanceFromCenter) { + var me = this; + var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); + return { + x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter, + y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter + }; + }, + + getPointPositionForValue: function(index, value) { + return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); + }, + + getBasePosition: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.getPointPositionForValue(0, + me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0); + }, + + draw: function() { + var me = this; + var opts = me.options; + var gridLineOpts = opts.gridLines; + var tickOpts = opts.ticks; + + if (opts.display) { + var ctx = me.ctx; + var startAngle = this.getIndexAngle(0); + var tickFont = helpers$1.options._parseFont(tickOpts); + + if (opts.angleLines.display || opts.pointLabels.display) { + drawPointLabels(me); + } + + helpers$1.each(me.ticks, function(label, index) { + // Don't draw a centre value (if it is minimum) + if (index > 0 || tickOpts.reverse) { + var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); + + // Draw circular lines around the scale + if (gridLineOpts.display && index !== 0) { + drawRadiusLine(me, gridLineOpts, yCenterOffset, index); + } + + if (tickOpts.display) { + var tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor); + ctx.font = tickFont.string; + + ctx.save(); + ctx.translate(me.xCenter, me.yCenter); + ctx.rotate(startAngle); + + if (tickOpts.showLabelBackdrop) { + var labelWidth = ctx.measureText(label).width; + ctx.fillStyle = tickOpts.backdropColor; + ctx.fillRect( + -labelWidth / 2 - tickOpts.backdropPaddingX, + -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY, + labelWidth + tickOpts.backdropPaddingX * 2, + tickFont.size + tickOpts.backdropPaddingY * 2 + ); + } + + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = tickFontColor; + ctx.fillText(label, 0, -yCenterOffset); + ctx.restore(); + } + } + }); + } + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$3 = defaultConfig$3; +scale_radialLinear._defaults = _defaults$3; + +var valueOrDefault$c = helpers$1.valueOrDefault; + +// Integer constants are from the ES6 spec. +var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; +var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +var INTERVALS = { + millisecond: { + common: true, + size: 1, + steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] + }, + second: { + common: true, + size: 1000, + steps: [1, 2, 5, 10, 15, 30] + }, + minute: { + common: true, + size: 60000, + steps: [1, 2, 5, 10, 15, 30] + }, + hour: { + common: true, + size: 3600000, + steps: [1, 2, 3, 6, 12] + }, + day: { + common: true, + size: 86400000, + steps: [1, 2, 5] + }, + week: { + common: false, + size: 604800000, + steps: [1, 2, 3, 4] + }, + month: { + common: true, + size: 2.628e9, + steps: [1, 2, 3] + }, + quarter: { + common: false, + size: 7.884e9, + steps: [1, 2, 3, 4] + }, + year: { + common: true, + size: 3.154e10 + } +}; + +var UNITS = Object.keys(INTERVALS); + +function sorter(a, b) { + return a - b; +} + +function arrayUnique(items) { + var hash = {}; + var out = []; + var i, ilen, item; + + for (i = 0, ilen = items.length; i < ilen; ++i) { + item = items[i]; + if (!hash[item]) { + hash[item] = true; + out.push(item); + } + } + + return out; +} + +/** + * Returns an array of {time, pos} objects used to interpolate a specific `time` or position + * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is + * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other + * extremity (left + width or top + height). Note that it would be more optimized to directly + * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need + * to create the lookup table. The table ALWAYS contains at least two items: min and max. + * + * @param {number[]} timestamps - timestamps sorted from lowest to highest. + * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min + * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. + * If 'series', timestamps will be positioned at the same distance from each other. In this + * case, only timestamps that break the time linearity are registered, meaning that in the + * best case, all timestamps are linear, the table contains only min and max. + */ +function buildLookupTable(timestamps, min, max, distribution) { + if (distribution === 'linear' || !timestamps.length) { + return [ + {time: min, pos: 0}, + {time: max, pos: 1} + ]; + } + + var table = []; + var items = [min]; + var i, ilen, prev, curr, next; + + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + curr = timestamps[i]; + if (curr > min && curr < max) { + items.push(curr); + } + } + + items.push(max); + + for (i = 0, ilen = items.length; i < ilen; ++i) { + next = items[i + 1]; + prev = items[i - 1]; + curr = items[i]; + + // only add points that breaks the scale linearity + if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { + table.push({time: curr, pos: i / (ilen - 1)}); + } + } + + return table; +} + +// @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ +function lookup(table, key, value) { + var lo = 0; + var hi = table.length - 1; + var mid, i0, i1; + + while (lo >= 0 && lo <= hi) { + mid = (lo + hi) >> 1; + i0 = table[mid - 1] || null; + i1 = table[mid]; + + if (!i0) { + // given value is outside table (before first item) + return {lo: null, hi: i1}; + } else if (i1[key] < value) { + lo = mid + 1; + } else if (i0[key] > value) { + hi = mid - 1; + } else { + return {lo: i0, hi: i1}; + } + } + + // given value is outside table (after last item) + return {lo: i1, hi: null}; +} + +/** + * Linearly interpolates the given source `value` using the table items `skey` values and + * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') + * returns the position for a timestamp equal to 42. If value is out of bounds, values at + * index [0, 1] or [n - 1, n] are used for the interpolation. + */ +function interpolate$1(table, skey, sval, tkey) { + var range = lookup(table, skey, sval); + + // Note: the lookup table ALWAYS contains at least 2 items (min and max) + var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; + var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; + + var span = next[skey] - prev[skey]; + var ratio = span ? (sval - prev[skey]) / span : 0; + var offset = (next[tkey] - prev[tkey]) * ratio; + + return prev[tkey] + offset; +} + +function toTimestamp(scale, input) { + var adapter = scale._adapter; + var options = scale.options.time; + var parser = options.parser; + var format = parser || options.format; + var value = input; + + if (typeof parser === 'function') { + value = parser(value); + } + + // Only parse if its not a timestamp already + if (!helpers$1.isFinite(value)) { + value = typeof format === 'string' + ? adapter.parse(value, format) + : adapter.parse(value); + } + + if (value !== null) { + return +value; + } + + // Labels are in an incompatible format and no `parser` has been provided. + // The user might still use the deprecated `format` option for parsing. + if (!parser && typeof format === 'function') { + value = format(input); + + // `format` could return something else than a timestamp, if so, parse it + if (!helpers$1.isFinite(value)) { + value = adapter.parse(value); + } + } + + return value; +} + +function parse(scale, input) { + if (helpers$1.isNullOrUndef(input)) { + return null; + } + + var options = scale.options.time; + var value = toTimestamp(scale, scale.getRightValue(input)); + if (value === null) { + return value; + } + + if (options.round) { + value = +scale._adapter.startOf(value, options.round); + } + + return value; +} + +/** + * Returns the number of unit to skip to be able to display up to `capacity` number of ticks + * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. + */ +function determineStepSize(min, max, unit, capacity) { + var range = max - min; + var interval = INTERVALS[unit]; + var milliseconds = interval.size; + var steps = interval.steps; + var i, ilen, factor; + + if (!steps) { + return Math.ceil(range / (capacity * milliseconds)); + } + + for (i = 0, ilen = steps.length; i < ilen; ++i) { + factor = steps[i]; + if (Math.ceil(range / (milliseconds * factor)) <= capacity) { + break; + } + } + + return factor; +} + +/** + * Figures out what unit results in an appropriate number of auto-generated ticks + */ +function determineUnitForAutoTicks(minUnit, min, max, capacity) { + var ilen = UNITS.length; + var i, interval, factor; + + for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { + interval = INTERVALS[UNITS[i]]; + factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; + + if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { + return UNITS[i]; + } + } + + return UNITS[ilen - 1]; +} + +/** + * Figures out what unit to format a set of ticks with + */ +function determineUnitForFormatting(scale, ticks, minUnit, min, max) { + var ilen = UNITS.length; + var i, unit; + + for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { + unit = UNITS[i]; + if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) { + return unit; + } + } + + return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; +} + +function determineMajorUnit(unit) { + for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { + if (INTERVALS[UNITS[i]].common) { + return UNITS[i]; + } + } +} + +/** + * Generates a maximum of `capacity` timestamps between min and max, rounded to the + * `minor` unit, aligned on the `major` unit and using the given scale time `options`. + * Important: this method can return ticks outside the min and max range, it's the + * responsibility of the calling code to clamp values if needed. + */ +function generate(scale, min, max, capacity) { + var adapter = scale._adapter; + var options = scale.options; + var timeOpts = options.time; + var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); + var major = determineMajorUnit(minor); + var stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize); + var weekday = minor === 'week' ? timeOpts.isoWeekday : false; + var majorTicksEnabled = options.ticks.major.enabled; + var interval = INTERVALS[minor]; + var first = min; + var last = max; + var ticks = []; + var time; + + if (!stepSize) { + stepSize = determineStepSize(min, max, minor, capacity); + } + + // For 'week' unit, handle the first day of week option + if (weekday) { + first = +adapter.startOf(first, 'isoWeek', weekday); + last = +adapter.startOf(last, 'isoWeek', weekday); + } + + // Align first/last ticks on unit + first = +adapter.startOf(first, weekday ? 'day' : minor); + last = +adapter.startOf(last, weekday ? 'day' : minor); + + // Make sure that the last tick include max + if (last < max) { + last = +adapter.add(last, 1, minor); + } + + time = first; + + if (majorTicksEnabled && major && !weekday && !timeOpts.round) { + // Align the first tick on the previous `minor` unit aligned on the `major` unit: + // we first aligned time on the previous `major` unit then add the number of full + // stepSize there is between first and the previous major time. + time = +adapter.startOf(time, major); + time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor); + } + + for (; time < last; time = +adapter.add(time, stepSize, minor)) { + ticks.push(+time); + } + + ticks.push(+time); + + return ticks; +} + +/** + * Returns the start and end offsets from edges in the form of {start, end} + * where each value is a relative width to the scale and ranges between 0 and 1. + * They add extra margins on the both sides by scaling down the original scale. + * Offsets are added when the `offset` option is true. + */ +function computeOffsets(table, ticks, min, max, options) { + var start = 0; + var end = 0; + var first, last; + + if (options.offset && ticks.length) { + if (!options.time.min) { + first = interpolate$1(table, 'time', ticks[0], 'pos'); + if (ticks.length === 1) { + start = 1 - first; + } else { + start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2; + } + } + if (!options.time.max) { + last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos'); + if (ticks.length === 1) { + end = last; + } else { + end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2; + } + } + } + + return {start: start, end: end}; +} + +function ticksFromTimestamps(scale, values, majorUnit) { + var ticks = []; + var i, ilen, value, major; + + for (i = 0, ilen = values.length; i < ilen; ++i) { + value = values[i]; + major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false; + + ticks.push({ + value: value, + major: major + }); + } + + return ticks; +} + +var defaultConfig$4 = { + position: 'bottom', + + /** + * Data distribution along the scale: + * - 'linear': data are spread according to their time (distances can vary), + * - 'series': data are spread at the same distance from each other. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + distribution: 'linear', + + /** + * Scale boundary strategy (bypassed by min/max time options) + * - `data`: make sure data are fully visible, ticks outside are removed + * - `ticks`: make sure ticks are fully visible, data outside are truncated + * @see https://github.com/chartjs/Chart.js/pull/4556 + * @since 2.7.0 + */ + bounds: 'data', + + adapters: {}, + time: { + parser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment + format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/ + unit: false, // false == automatic or override with week, month, year, etc. + round: false, // none, or override with week, month, year, etc. + displayFormat: false, // DEPRECATED + isoWeekday: false, // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/ + minUnit: 'millisecond', + displayFormats: {} + }, + ticks: { + autoSkip: false, + + /** + * Ticks generation input values: + * - 'auto': generates "optimal" ticks based on scale size and time options. + * - 'data': generates ticks from data (including labels from data {t|x|y} objects). + * - 'labels': generates ticks from user given `data.labels` values ONLY. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + source: 'auto', + + major: { + enabled: false + } + } +}; + +var scale_time = core_scale.extend({ + initialize: function() { + this.mergeTicksOptions(); + core_scale.prototype.initialize.call(this); + }, + + update: function() { + var me = this; + var options = me.options; + var time = options.time || (options.time = {}); + var adapter = me._adapter = new core_adapters._date(options.adapters.date); + + // DEPRECATIONS: output a message only one time per update + if (time.format) { + console.warn('options.time.format is deprecated and replaced by options.time.parser.'); + } + + // Backward compatibility: before introducing adapter, `displayFormats` was + // supposed to contain *all* unit/string pairs but this can't be resolved + // when loading the scale (adapters are loaded afterward), so let's populate + // missing formats on update + helpers$1.mergeIf(time.displayFormats, adapter.formats()); + + return core_scale.prototype.update.apply(me, arguments); + }, + + /** + * Allows data to be referenced via 't' attribute + */ + getRightValue: function(rawValue) { + if (rawValue && rawValue.t !== undefined) { + rawValue = rawValue.t; + } + return core_scale.prototype.getRightValue.call(this, rawValue); + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var adapter = me._adapter; + var timeOpts = me.options.time; + var unit = timeOpts.unit || 'day'; + var min = MAX_INTEGER; + var max = MIN_INTEGER; + var timestamps = []; + var datasets = []; + var labels = []; + var i, j, ilen, jlen, data, timestamp; + var dataLabels = chart.data.labels || []; + + // Convert labels to timestamps + for (i = 0, ilen = dataLabels.length; i < ilen; ++i) { + labels.push(parse(me, dataLabels[i])); + } + + // Convert data to timestamps + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + data = chart.data.datasets[i].data; + + // Let's consider that all data have the same format. + if (helpers$1.isObject(data[0])) { + datasets[i] = []; + + for (j = 0, jlen = data.length; j < jlen; ++j) { + timestamp = parse(me, data[j]); + timestamps.push(timestamp); + datasets[i][j] = timestamp; + } + } else { + for (j = 0, jlen = labels.length; j < jlen; ++j) { + timestamps.push(labels[j]); + } + datasets[i] = labels.slice(0); + } + } else { + datasets[i] = []; + } + } + + if (labels.length) { + // Sort labels **after** data have been converted + labels = arrayUnique(labels).sort(sorter); + min = Math.min(min, labels[0]); + max = Math.max(max, labels[labels.length - 1]); + } + + if (timestamps.length) { + timestamps = arrayUnique(timestamps).sort(sorter); + min = Math.min(min, timestamps[0]); + max = Math.max(max, timestamps[timestamps.length - 1]); + } + + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // In case there is no valid min/max, set limits based on unit time option + min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min; + max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max; + + // Make sure that max is strictly higher than min (required by the lookup table) + me.min = Math.min(min, max); + me.max = Math.max(min + 1, max); + + // PRIVATE + me._horizontal = me.isHorizontal(); + me._table = []; + me._timestamps = { + data: timestamps, + datasets: datasets, + labels: labels + }; + }, + + buildTicks: function() { + var me = this; + var min = me.min; + var max = me.max; + var options = me.options; + var timeOpts = options.time; + var timestamps = []; + var ticks = []; + var i, ilen, timestamp; + + switch (options.ticks.source) { + case 'data': + timestamps = me._timestamps.data; + break; + case 'labels': + timestamps = me._timestamps.labels; + break; + case 'auto': + default: + timestamps = generate(me, min, max, me.getLabelCapacity(min), options); + } + + if (options.bounds === 'ticks' && timestamps.length) { + min = timestamps[0]; + max = timestamps[timestamps.length - 1]; + } + + // Enforce limits with user min/max options + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // Remove ticks outside the min/max range + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + timestamp = timestamps[i]; + if (timestamp >= min && timestamp <= max) { + ticks.push(timestamp); + } + } + + me.min = min; + me.max = max; + + // PRIVATE + me._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max); + me._majorUnit = determineMajorUnit(me._unit); + me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); + me._offsets = computeOffsets(me._table, ticks, min, max, options); + + if (options.ticks.reverse) { + ticks.reverse(); + } + + return ticksFromTimestamps(me, ticks, me._majorUnit); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var adapter = me._adapter; + var data = me.chart.data; + var timeOpts = me.options.time; + var label = data.labels && index < data.labels.length ? data.labels[index] : ''; + var value = data.datasets[datasetIndex].data[index]; + + if (helpers$1.isObject(value)) { + label = me.getRightValue(value); + } + if (timeOpts.tooltipFormat) { + return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat); + } + if (typeof label === 'string') { + return label; + } + return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime); + }, + + /** + * Function to format an individual tick mark + * @private + */ + tickFormatFunction: function(time, index, ticks, format) { + var me = this; + var adapter = me._adapter; + var options = me.options; + var formats = options.time.displayFormats; + var minorFormat = formats[me._unit]; + var majorUnit = me._majorUnit; + var majorFormat = formats[majorUnit]; + var majorTime = +adapter.startOf(time, majorUnit); + var majorTickOpts = options.ticks.major; + var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; + var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat); + var tickOpts = major ? majorTickOpts : options.ticks.minor; + var formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback); + + return formatter ? formatter(label, index, ticks) : label; + }, + + convertTicksToLabels: function(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(this.tickFormatFunction(ticks[i].value, i, ticks)); + } + + return labels; + }, + + /** + * @private + */ + getPixelForOffset: function(time) { + var me = this; + var isReverse = me.options.ticks.reverse; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top; + var pos = interpolate$1(me._table, 'time', time, 'pos'); + var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end); + + return isReverse ? start - offset : start + offset; + }, + + getPixelForValue: function(value, index, datasetIndex) { + var me = this; + var time = null; + + if (index !== undefined && datasetIndex !== undefined) { + time = me._timestamps.datasets[datasetIndex][index]; + } + + if (time === null) { + time = parse(me, value); + } + + if (time !== null) { + return me.getPixelForOffset(time); + } + }, + + getPixelForTick: function(index) { + var ticks = this.getTicks(); + return index >= 0 && index < ticks.length ? + this.getPixelForOffset(ticks[index].value) : + null; + }, + + getValueForPixel: function(pixel) { + var me = this; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? me.left : me.top; + var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end; + var time = interpolate$1(me._table, 'pos', pos, 'time'); + + // DEPRECATION, we should return time directly + return me._adapter._create(time); + }, + + /** + * Crude approximation of what the label width might be + * @private + */ + getLabelWidth: function(label) { + var me = this; + var ticksOpts = me.options.ticks; + var tickLabelWidth = me.ctx.measureText(label).width; + var angle = helpers$1.toRadians(ticksOpts.maxRotation); + var cosRotation = Math.cos(angle); + var sinRotation = Math.sin(angle); + var tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize); + + return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); + }, + + /** + * @private + */ + getLabelCapacity: function(exampleTime) { + var me = this; + + // pick the longest format (milliseconds) for guestimation + var format = me.options.time.displayFormats.millisecond; + var exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format); + var tickLabelWidth = me.getLabelWidth(exampleLabel); + var innerWidth = me.isHorizontal() ? me.width : me.height; + var capacity = Math.floor(innerWidth / tickLabelWidth); + + return capacity > 0 ? capacity : 1; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$4 = defaultConfig$4; +scale_time._defaults = _defaults$4; + +var scales = { + category: scale_category, + linear: scale_linear, + logarithmic: scale_logarithmic, + radialLinear: scale_radialLinear, + time: scale_time +}; + +var FORMATS = { + datetime: 'MMM D, YYYY, h:mm:ss a', + millisecond: 'h:mm:ss.SSS a', + second: 'h:mm:ss a', + minute: 'h:mm a', + hour: 'hA', + day: 'MMM D', + week: 'll', + month: 'MMM YYYY', + quarter: '[Q]Q - YYYY', + year: 'YYYY' +}; + +core_adapters._date.override(typeof moment === 'function' ? { + _id: 'moment', // DEBUG ONLY + + formats: function() { + return FORMATS; + }, + + parse: function(value, format) { + if (typeof value === 'string' && typeof format === 'string') { + value = moment(value, format); + } else if (!(value instanceof moment)) { + value = moment(value); + } + return value.isValid() ? value.valueOf() : null; + }, + + format: function(time, format) { + return moment(time).format(format); + }, + + add: function(time, amount, unit) { + return moment(time).add(amount, unit).valueOf(); + }, + + diff: function(max, min, unit) { + return moment.duration(moment(max).diff(moment(min))).as(unit); + }, + + startOf: function(time, unit, weekday) { + time = moment(time); + if (unit === 'isoWeek') { + return time.isoWeekday(weekday).valueOf(); + } + return time.startOf(unit).valueOf(); + }, + + endOf: function(time, unit) { + return moment(time).endOf(unit).valueOf(); + }, + + // DEPRECATIONS + + /** + * Provided for backward compatibility with scale.getValueForPixel(). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function(time) { + return moment(time); + }, +} : {}); + +core_defaults._set('global', { + plugins: { + filler: { + propagate: true + } + } +}); + +var mappers = { + dataset: function(source) { + var index = source.fill; + var chart = source.chart; + var meta = chart.getDatasetMeta(index); + var visible = meta && chart.isDatasetVisible(index); + var points = (visible && meta.dataset._children) || []; + var length = points.length || 0; + + return !length ? null : function(point, i) { + return (i < length && points[i]._view) || null; + }; + }, + + boundary: function(source) { + var boundary = source.boundary; + var x = boundary ? boundary.x : null; + var y = boundary ? boundary.y : null; + + return function(point) { + return { + x: x === null ? point.x : x, + y: y === null ? point.y : y, + }; + }; + } +}; + +// @todo if (fill[0] === '#') +function decodeFill(el, index, count) { + var model = el._model || {}; + var fill = model.fill; + var target; + + if (fill === undefined) { + fill = !!model.backgroundColor; + } + + if (fill === false || fill === null) { + return false; + } + + if (fill === true) { + return 'origin'; + } + + target = parseFloat(fill, 10); + if (isFinite(target) && Math.floor(target) === target) { + if (fill[0] === '-' || fill[0] === '+') { + target = index + target; + } + + if (target === index || target < 0 || target >= count) { + return false; + } + + return target; + } + + switch (fill) { + // compatibility + case 'bottom': + return 'start'; + case 'top': + return 'end'; + case 'zero': + return 'origin'; + // supported boundaries + case 'origin': + case 'start': + case 'end': + return fill; + // invalid fill values + default: + return false; + } +} + +function computeBoundary(source) { + var model = source.el._model || {}; + var scale = source.el._scale || {}; + var fill = source.fill; + var target = null; + var horizontal; + + if (isFinite(fill)) { + return null; + } + + // Backward compatibility: until v3, we still need to support boundary values set on + // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and + // controllers might still use it (e.g. the Smith chart). + + if (fill === 'start') { + target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; + } else if (fill === 'end') { + target = model.scaleTop === undefined ? scale.top : model.scaleTop; + } else if (model.scaleZero !== undefined) { + target = model.scaleZero; + } else if (scale.getBasePosition) { + target = scale.getBasePosition(); + } else if (scale.getBasePixel) { + target = scale.getBasePixel(); + } + + if (target !== undefined && target !== null) { + if (target.x !== undefined && target.y !== undefined) { + return target; + } + + if (helpers$1.isFinite(target)) { + horizontal = scale.isHorizontal(); + return { + x: horizontal ? target : null, + y: horizontal ? null : target + }; + } + } + + return null; +} + +function resolveTarget(sources, index, propagate) { + var source = sources[index]; + var fill = source.fill; + var visited = [index]; + var target; + + if (!propagate) { + return fill; + } + + while (fill !== false && visited.indexOf(fill) === -1) { + if (!isFinite(fill)) { + return fill; + } + + target = sources[fill]; + if (!target) { + return false; + } + + if (target.visible) { + return fill; + } + + visited.push(fill); + fill = target.fill; + } + + return false; +} + +function createMapper(source) { + var fill = source.fill; + var type = 'dataset'; + + if (fill === false) { + return null; + } + + if (!isFinite(fill)) { + type = 'boundary'; + } + + return mappers[type](source); +} + +function isDrawable(point) { + return point && !point.skip; +} + +function drawArea(ctx, curve0, curve1, len0, len1) { + var i; + + if (!len0 || !len1) { + return; + } + + // building first area curve (normal) + ctx.moveTo(curve0[0].x, curve0[0].y); + for (i = 1; i < len0; ++i) { + helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); + } + + // joining the two area curves + ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); + + // building opposite area curve (reverse) + for (i = len1 - 1; i > 0; --i) { + helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); + } +} + +function doFill(ctx, points, mapper, view, color, loop) { + var count = points.length; + var span = view.spanGaps; + var curve0 = []; + var curve1 = []; + var len0 = 0; + var len1 = 0; + var i, ilen, index, p0, p1, d0, d1; + + ctx.beginPath(); + + for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { + index = i % count; + p0 = points[index]._view; + p1 = mapper(p0, index, view); + d0 = isDrawable(p0); + d1 = isDrawable(p1); + + if (d0 && d1) { + len0 = curve0.push(p0); + len1 = curve1.push(p1); + } else if (len0 && len1) { + if (!span) { + drawArea(ctx, curve0, curve1, len0, len1); + len0 = len1 = 0; + curve0 = []; + curve1 = []; + } else { + if (d0) { + curve0.push(p0); + } + if (d1) { + curve1.push(p1); + } + } + } + } + + drawArea(ctx, curve0, curve1, len0, len1); + + ctx.closePath(); + ctx.fillStyle = color; + ctx.fill(); +} + +var plugin_filler = { + id: 'filler', + + afterDatasetsUpdate: function(chart, options) { + var count = (chart.data.datasets || []).length; + var propagate = options.propagate; + var sources = []; + var meta, i, el, source; + + for (i = 0; i < count; ++i) { + meta = chart.getDatasetMeta(i); + el = meta.dataset; + source = null; + + if (el && el._model && el instanceof elements.Line) { + source = { + visible: chart.isDatasetVisible(i), + fill: decodeFill(el, i, count), + chart: chart, + el: el + }; + } + + meta.$filler = source; + sources.push(source); + } + + for (i = 0; i < count; ++i) { + source = sources[i]; + if (!source) { + continue; + } + + source.fill = resolveTarget(sources, i, propagate); + source.boundary = computeBoundary(source); + source.mapper = createMapper(source); + } + }, + + beforeDatasetDraw: function(chart, args) { + var meta = args.meta.$filler; + if (!meta) { + return; + } + + var ctx = chart.ctx; + var el = meta.el; + var view = el._view; + var points = el._children || []; + var mapper = meta.mapper; + var color = view.backgroundColor || core_defaults.global.defaultColor; + + if (mapper && color && points.length) { + helpers$1.canvas.clipArea(ctx, chart.chartArea); + doFill(ctx, points, mapper, view, color, el._loop); + helpers$1.canvas.unclipArea(ctx); + } + } +}; + +var noop$1 = helpers$1.noop; +var valueOrDefault$d = helpers$1.valueOrDefault; + +core_defaults._set('global', { + legend: { + display: true, + position: 'top', + fullWidth: true, + reverse: false, + weight: 1000, + + // a callback that will handle + onClick: function(e, legendItem) { + var index = legendItem.datasetIndex; + var ci = this.chart; + var meta = ci.getDatasetMeta(index); + + // See controller.isDatasetVisible comment + meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; + + // We hid a dataset ... rerender the chart + ci.update(); + }, + + onHover: null, + onLeave: null, + + labels: { + boxWidth: 40, + padding: 10, + // Generates labels shown in the legend + // Valid properties to return: + // text : text to display + // fillStyle : fill of coloured box + // strokeStyle: stroke of coloured box + // hidden : if this legend item refers to a hidden item + // lineCap : cap style for line + // lineDash + // lineDashOffset : + // lineJoin : + // lineWidth : + generateLabels: function(chart) { + var data = chart.data; + return helpers$1.isArray(data.datasets) ? data.datasets.map(function(dataset, i) { + return { + text: dataset.label, + fillStyle: (!helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), + hidden: !chart.isDatasetVisible(i), + lineCap: dataset.borderCapStyle, + lineDash: dataset.borderDash, + lineDashOffset: dataset.borderDashOffset, + lineJoin: dataset.borderJoinStyle, + lineWidth: dataset.borderWidth, + strokeStyle: dataset.borderColor, + pointStyle: dataset.pointStyle, + + // Below is extra data used for toggling the datasets + datasetIndex: i + }; + }, this) : []; + } + } + }, + + legendCallback: function(chart) { + var text = []; + text.push('
    '); + for (var i = 0; i < chart.data.datasets.length; i++) { + text.push('
  • '); + if (chart.data.datasets[i].label) { + text.push(chart.data.datasets[i].label); + } + text.push('
  • '); + } + text.push('
'); + return text.join(''); + } +}); + +/** + * Helper function to get the box width based on the usePointStyle option + * @param {object} labelopts - the label options on the legend + * @param {number} fontSize - the label font size + * @return {number} width of the color box area + */ +function getBoxWidth(labelOpts, fontSize) { + return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ? + fontSize : + labelOpts.boxWidth; +} + +/** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ +var Legend = core_element.extend({ + + initialize: function(config) { + helpers$1.extend(this, config); + + // Contains hit boxes for each dataset (in dataset order) + this.legendHitBoxes = []; + + /** + * @private + */ + this._hoveredItem = null; + + // Are we in doughnut mode which has a different data type + this.doughnutMode = false; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + // Any function defined here is inherited by all legend types. + // Any function can be extended by the legend type + + beforeUpdate: noop$1, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + }, + afterUpdate: noop$1, + + // + + beforeSetDimensions: noop$1, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$1, + + // + + beforeBuildLabels: noop$1, + buildLabels: function() { + var me = this; + var labelOpts = me.options.labels || {}; + var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || []; + + if (labelOpts.filter) { + legendItems = legendItems.filter(function(item) { + return labelOpts.filter(item, me.chart.data); + }); + } + + if (me.options.reverse) { + legendItems.reverse(); + } + + me.legendItems = legendItems; + }, + afterBuildLabels: noop$1, + + // + + beforeFit: noop$1, + fit: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var display = opts.display; + + var ctx = me.ctx; + + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + + // Reset hit boxes + var hitboxes = me.legendHitBoxes = []; + + var minSize = me.minSize; + var isHorizontal = me.isHorizontal(); + + if (isHorizontal) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = display ? 10 : 0; + } else { + minSize.width = display ? 10 : 0; + minSize.height = me.maxHeight; // fill all the height + } + + // Increase sizes here + if (display) { + ctx.font = labelFont.string; + + if (isHorizontal) { + // Labels + + // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one + var lineWidths = me.lineWidths = [0]; + var totalHeight = 0; + + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + + helpers$1.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + if (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) { + totalHeight += fontSize + labelOpts.padding; + lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding; + } + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: width, + height: fontSize + }; + + lineWidths[lineWidths.length - 1] += width + labelOpts.padding; + }); + + minSize.height += totalHeight; + + } else { + var vPadding = labelOpts.padding; + var columnWidths = me.columnWidths = []; + var totalWidth = labelOpts.padding; + var currentColWidth = 0; + var currentColHeight = 0; + var itemHeight = fontSize + vPadding; + + helpers$1.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + // If too tall, go to new column + if (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) { + totalWidth += currentColWidth + labelOpts.padding; + columnWidths.push(currentColWidth); // previous column width + + currentColWidth = 0; + currentColHeight = 0; + } + + // Get max width + currentColWidth = Math.max(currentColWidth, itemWidth); + currentColHeight += itemHeight; + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: itemWidth, + height: fontSize + }; + }); + + totalWidth += currentColWidth; + columnWidths.push(currentColWidth); + minSize.width += totalWidth; + } + } + + me.width = minSize.width; + me.height = minSize.height; + }, + afterFit: noop$1, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + + // Actually draw the legend on the canvas + draw: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; + var lineDefault = globalDefaults.elements.line; + var legendWidth = me.width; + var lineWidths = me.lineWidths; + + if (opts.display) { + var ctx = me.ctx; + var fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor); + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + var cursor; + + // Canvas setup + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + ctx.lineWidth = 0.5; + ctx.strokeStyle = fontColor; // for strikethrough effect + ctx.fillStyle = fontColor; // render in correct colour + ctx.font = labelFont.string; + + var boxWidth = getBoxWidth(labelOpts, fontSize); + var hitboxes = me.legendHitBoxes; + + // current position + var drawLegendBox = function(x, y, legendItem) { + if (isNaN(boxWidth) || boxWidth <= 0) { + return; + } + + // Set the ctx for the box + ctx.save(); + + var lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth); + ctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor); + ctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle); + ctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset); + ctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor); + + if (ctx.setLineDash) { + // IE 9 and 10 do not support line dash + ctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash)); + } + + if (opts.labels && opts.labels.usePointStyle) { + // Recalculate x and y for drawPoint() because its expecting + // x and y to be center of figure (instead of top left) + var radius = boxWidth * Math.SQRT2 / 2; + var centerX = x + boxWidth / 2; + var centerY = y + fontSize / 2; + + // Draw pointStyle as legend symbol + helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); + } else { + // Draw box as legend symbol + if (lineWidth !== 0) { + ctx.strokeRect(x, y, boxWidth, fontSize); + } + ctx.fillRect(x, y, boxWidth, fontSize); + } + + ctx.restore(); + }; + var fillText = function(x, y, legendItem, textWidth) { + var halfFontSize = fontSize / 2; + var xLeft = boxWidth + halfFontSize + x; + var yMiddle = y + halfFontSize; + + ctx.fillText(legendItem.text, xLeft, yMiddle); + + if (legendItem.hidden) { + // Strikethrough the text if hidden + ctx.beginPath(); + ctx.lineWidth = 2; + ctx.moveTo(xLeft, yMiddle); + ctx.lineTo(xLeft + textWidth, yMiddle); + ctx.stroke(); + } + }; + + // Horizontal + var isHorizontal = me.isHorizontal(); + if (isHorizontal) { + cursor = { + x: me.left + ((legendWidth - lineWidths[0]) / 2) + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } else { + cursor = { + x: me.left + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } + + var itemHeight = fontSize + labelOpts.padding; + helpers$1.each(me.legendItems, function(legendItem, i) { + var textWidth = ctx.measureText(legendItem.text).width; + var width = boxWidth + (fontSize / 2) + textWidth; + var x = cursor.x; + var y = cursor.y; + + // Use (me.left + me.minSize.width) and (me.top + me.minSize.height) + // instead of me.right and me.bottom because me.width and me.height + // may have been changed since me.minSize was calculated + if (isHorizontal) { + if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) { + y = cursor.y += itemHeight; + cursor.line++; + x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2) + labelOpts.padding; + } + } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) { + x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; + y = cursor.y = me.top + labelOpts.padding; + cursor.line++; + } + + drawLegendBox(x, y, legendItem); + + hitboxes[i].left = x; + hitboxes[i].top = y; + + // Fill the actual label + fillText(x, y, legendItem, textWidth); + + if (isHorizontal) { + cursor.x += width + labelOpts.padding; + } else { + cursor.y += itemHeight; + } + + }); + } + }, + + /** + * @private + */ + _getLegendItemAt: function(x, y) { + var me = this; + var i, hitBox, lh; + + if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { + // See if we are touching one of the dataset boxes + lh = me.legendHitBoxes; + for (i = 0; i < lh.length; ++i) { + hitBox = lh[i]; + + if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { + // Touching an element + return me.legendItems[i]; + } + } + } + + return null; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + */ + handleEvent: function(e) { + var me = this; + var opts = me.options; + var type = e.type === 'mouseup' ? 'click' : e.type; + var hoveredItem; + + if (type === 'mousemove') { + if (!opts.onHover && !opts.onLeave) { + return; + } + } else if (type === 'click') { + if (!opts.onClick) { + return; + } + } else { + return; + } + + // Chart event already has relative position in it + hoveredItem = me._getLegendItemAt(e.x, e.y); + + if (type === 'click') { + if (hoveredItem && opts.onClick) { + // use e.native for backwards compatibility + opts.onClick.call(me, e.native, hoveredItem); + } + } else { + if (opts.onLeave && hoveredItem !== me._hoveredItem) { + if (me._hoveredItem) { + opts.onLeave.call(me, e.native, me._hoveredItem); + } + me._hoveredItem = hoveredItem; + } + + if (opts.onHover && hoveredItem) { + // use e.native for backwards compatibility + opts.onHover.call(me, e.native, hoveredItem); + } + } + } +}); + +function createNewLegendAndAttach(chart, legendOpts) { + var legend = new Legend({ + ctx: chart.ctx, + options: legendOpts, + chart: chart + }); + + core_layouts.configure(chart, legend, legendOpts); + core_layouts.addBox(chart, legend); + chart.legend = legend; +} + +var plugin_legend = { + id: 'legend', + + /** + * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making + * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Legend, + + beforeInit: function(chart) { + var legendOpts = chart.options.legend; + + if (legendOpts) { + createNewLegendAndAttach(chart, legendOpts); + } + }, + + beforeUpdate: function(chart) { + var legendOpts = chart.options.legend; + var legend = chart.legend; + + if (legendOpts) { + helpers$1.mergeIf(legendOpts, core_defaults.global.legend); + + if (legend) { + core_layouts.configure(chart, legend, legendOpts); + legend.options = legendOpts; + } else { + createNewLegendAndAttach(chart, legendOpts); + } + } else if (legend) { + core_layouts.removeBox(chart, legend); + delete chart.legend; + } + }, + + afterEvent: function(chart, e) { + var legend = chart.legend; + if (legend) { + legend.handleEvent(e); + } + } +}; + +var noop$2 = helpers$1.noop; + +core_defaults._set('global', { + title: { + display: false, + fontStyle: 'bold', + fullWidth: true, + padding: 10, + position: 'top', + text: '', + weight: 2000 // by default greater than legend (1000) to be above + } +}); + +/** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ +var Title = core_element.extend({ + initialize: function(config) { + var me = this; + helpers$1.extend(me, config); + + // Contains hit boxes for each dataset (in dataset order) + me.legendHitBoxes = []; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + + beforeUpdate: noop$2, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: noop$2, + + // + + beforeSetDimensions: noop$2, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$2, + + // + + beforeBuildLabels: noop$2, + buildLabels: noop$2, + afterBuildLabels: noop$2, + + // + + beforeFit: noop$2, + fit: function() { + var me = this; + var opts = me.options; + var display = opts.display; + var minSize = me.minSize; + var lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1; + var fontOpts = helpers$1.options._parseFont(opts); + var textSize = display ? (lineCount * fontOpts.lineHeight) + (opts.padding * 2) : 0; + + if (me.isHorizontal()) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = textSize; + } else { + minSize.width = textSize; + minSize.height = me.maxHeight; // fill all the height + } + + me.width = minSize.width; + me.height = minSize.height; + + }, + afterFit: noop$2, + + // Shared Methods + isHorizontal: function() { + var pos = this.options.position; + return pos === 'top' || pos === 'bottom'; + }, + + // Actually draw the title block on the canvas + draw: function() { + var me = this; + var ctx = me.ctx; + var opts = me.options; + + if (opts.display) { + var fontOpts = helpers$1.options._parseFont(opts); + var lineHeight = fontOpts.lineHeight; + var offset = lineHeight / 2 + opts.padding; + var rotation = 0; + var top = me.top; + var left = me.left; + var bottom = me.bottom; + var right = me.right; + var maxWidth, titleX, titleY; + + ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour + ctx.font = fontOpts.string; + + // Horizontal + if (me.isHorizontal()) { + titleX = left + ((right - left) / 2); // midpoint of the width + titleY = top + offset; + maxWidth = right - left; + } else { + titleX = opts.position === 'left' ? left + offset : right - offset; + titleY = top + ((bottom - top) / 2); + maxWidth = bottom - top; + rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); + } + + ctx.save(); + ctx.translate(titleX, titleY); + ctx.rotate(rotation); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + var text = opts.text; + if (helpers$1.isArray(text)) { + var y = 0; + for (var i = 0; i < text.length; ++i) { + ctx.fillText(text[i], 0, y, maxWidth); + y += lineHeight; + } + } else { + ctx.fillText(text, 0, 0, maxWidth); + } + + ctx.restore(); + } + } +}); + +function createNewTitleBlockAndAttach(chart, titleOpts) { + var title = new Title({ + ctx: chart.ctx, + options: titleOpts, + chart: chart + }); + + core_layouts.configure(chart, title, titleOpts); + core_layouts.addBox(chart, title); + chart.titleBlock = title; +} + +var plugin_title = { + id: 'title', + + /** + * Backward compatibility: since 2.1.5, the title is registered as a plugin, making + * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Title, + + beforeInit: function(chart) { + var titleOpts = chart.options.title; + + if (titleOpts) { + createNewTitleBlockAndAttach(chart, titleOpts); + } + }, + + beforeUpdate: function(chart) { + var titleOpts = chart.options.title; + var titleBlock = chart.titleBlock; + + if (titleOpts) { + helpers$1.mergeIf(titleOpts, core_defaults.global.title); + + if (titleBlock) { + core_layouts.configure(chart, titleBlock, titleOpts); + titleBlock.options = titleOpts; + } else { + createNewTitleBlockAndAttach(chart, titleOpts); + } + } else if (titleBlock) { + core_layouts.removeBox(chart, titleBlock); + delete chart.titleBlock; + } + } +}; + +var plugins = {}; +var filler = plugin_filler; +var legend = plugin_legend; +var title = plugin_title; +plugins.filler = filler; +plugins.legend = legend; +plugins.title = title; + +/** + * @namespace Chart + */ + + +core_controller.helpers = helpers$1; + +// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! +core_helpers(core_controller); + +core_controller._adapters = core_adapters; +core_controller.Animation = core_animation; +core_controller.animationService = core_animations; +core_controller.controllers = controllers; +core_controller.DatasetController = core_datasetController; +core_controller.defaults = core_defaults; +core_controller.Element = core_element; +core_controller.elements = elements; +core_controller.Interaction = core_interaction; +core_controller.layouts = core_layouts; +core_controller.platform = platform; +core_controller.plugins = core_plugins; +core_controller.Scale = core_scale; +core_controller.scaleService = core_scaleService; +core_controller.Ticks = core_ticks; +core_controller.Tooltip = core_tooltip; + +// Register built-in scales + +core_controller.helpers.each(scales, function(scale, type) { + core_controller.scaleService.registerScaleType(type, scale, scale._defaults); +}); + +// Load to register built-in adapters (as side effects) + + +// Loading built-in plugins + +for (var k in plugins) { + if (plugins.hasOwnProperty(k)) { + core_controller.plugins.register(plugins[k]); + } +} + +core_controller.platform.initialize(); + +var src = core_controller; +if (typeof window !== 'undefined') { + window.Chart = core_controller; +} + +// DEPRECATIONS + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Chart + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +core_controller.Chart = core_controller; + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Legend + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.Legend = plugins.legend._element; + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Title + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.Title = plugins.title._element; + +/** + * Provided for backward compatibility, use Chart.plugins instead + * @namespace Chart.pluginService + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.pluginService = core_controller.plugins; + +/** + * Provided for backward compatibility, inheriting from Chart.PlugingBase has no + * effect, instead simply create/register plugins via plain JavaScript objects. + * @interface Chart.PluginBase + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ +core_controller.PluginBase = core_controller.Element.extend({}); + +/** + * Provided for backward compatibility, use Chart.helpers.canvas instead. + * @namespace Chart.canvasHelpers + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +core_controller.canvasHelpers = core_controller.helpers.canvas; + +/** + * Provided for backward compatibility, use Chart.layouts instead. + * @namespace Chart.layoutService + * @deprecated since version 2.7.3 + * @todo remove at version 3 + * @private + */ +core_controller.layoutService = core_controller.layouts; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.LinearScaleBase + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ +core_controller.LinearScaleBase = scale_linearbase; + +/** + * Provided for backward compatibility, instead we should create a new Chart + * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ +core_controller.helpers.each( + [ + 'Bar', + 'Bubble', + 'Doughnut', + 'Line', + 'PolarArea', + 'Radar', + 'Scatter' + ], + function(klass) { + core_controller[klass] = function(ctx, cfg) { + return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, { + type: klass.charAt(0).toLowerCase() + klass.slice(1) + })); + }; + } +); + +return src; + +}))); diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/canvasjs.min.js b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/canvasjs.min.js new file mode 100644 index 00000000..0ef77455 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/canvasjs.min.js @@ -0,0 +1,911 @@ +/* + CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ + Copyright 2018 fenopix + + --------------------- License Information -------------------- + CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. + https://canvasjs.com/license/ + +*/ +/*eslint-disable*/ +/*jshint ignore:start*/ +(function(){function qa(k,p){k.prototype=eb(p.prototype);k.prototype.constructor=k;k.base=p.prototype}function eb(k){function p(){}p.prototype=k;return new p}function Ya(k,p,D){"millisecond"===D?k.setMilliseconds(k.getMilliseconds()+1*p):"second"===D?k.setSeconds(k.getSeconds()+1*p):"minute"===D?k.setMinutes(k.getMinutes()+1*p):"hour"===D?k.setHours(k.getHours()+1*p):"day"===D?k.setDate(k.getDate()+1*p):"week"===D?k.setDate(k.getDate()+7*p):"month"===D?k.setMonth(k.getMonth()+1*p):"year"===D&&k.setFullYear(k.getFullYear()+ +1*p);return k}function $(k,p){var D=!1;0>k&&(D=!0,k*=-1);k=""+k;for(p=p?p:1;k.length
Please right click on the image and save it to your device
"), +p.document.close()}}}function N(k){var p=((k&16711680)>>16).toString(16),D=((k&65280)>>8).toString(16);k=((k&255)>>0).toString(16);p=2>p.length?"0"+p:p;D=2>D.length?"0"+D:D;k=2>k.length?"0"+k:k;return"#"+p+D+k}function fb(k,p){var D=this.length>>>0,r=Number(p)||0,r=0>r?Math.ceil(r):Math.floor(r);for(0>r&&(r+=D);rD;D++)if(k[D]!==k[D+4]|k[D]!==k[D+8]|k[D]!==k[D+12]){p=!1;break}return p?k[0]<<16|k[1]<<8|k[2]:0}function na(k,p,D){return k in p?p[k]:D[k]}function Oa(k,p,D){if(r&&bb){var u=k.getContext("2d");Pa=u.webkitBackingStorePixelRatio|| +u.mozBackingStorePixelRatio||u.msBackingStorePixelRatio||u.oBackingStorePixelRatio||u.backingStorePixelRatio||1;W=Ua/Pa;k.width=p*W;k.height=D*W;Ua!==Pa&&(k.style.width=p+"px",k.style.height=D+"px",u.scale(W,W))}else k.width=p,k.height=D}function hb(k){if(!ib){var p=!1,D=!1;"undefined"===typeof ra.Chart.creditHref?(k.creditHref=ja("iuuqr;..b`ow`rkr/bnl."),k.creditText=ja("B`ow`rKR/bnl")):(p=k.updateOption("creditText"),D=k.updateOption("creditHref"));if(k.creditHref&&k.creditText){k._creditLink|| +(k._creditLink=document.createElement("a"),k._creditLink.setAttribute("class","canvasjs-chart-credit"),k._creditLink.setAttribute("title","JavaScript Charts"),k._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:2px;top:"+(k.height-14)+"px;color:dimgrey;text-decoration:none;font-size:11px;font-family: Calibri, Lucida Grande, Lucida Sans Unicode, Arial, sans-serif"),k._creditLink.setAttribute("tabIndex",-1),k._creditLink.setAttribute("target","_blank"));if(0===k.renderCount|| +p||D)k._creditLink.setAttribute("href",k.creditHref),k._creditLink.innerHTML=k.creditText;k._creditLink&&k.creditHref&&k.creditText?(k._creditLink.parentElement||k._canvasJSContainer.appendChild(k._creditLink),k._creditLink.style.top=k.height-14+"px"):k._creditLink.parentElement&&k._canvasJSContainer.removeChild(k._creditLink)}}}function ta(k,p){Ja&&(this.canvasCount|=0,window.console.log(++this.canvasCount));var D=document.createElement("canvas");D.setAttribute("class","canvasjs-chart-canvas");Oa(D, +k,p);r||"undefined"===typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(D);return D}function sa(k,p,D){for(var r in D)p.style[r]=D[r]}function ua(k,p,D){p.getAttribute("state")||(p.style.backgroundColor=k.toolbar.backgroundColor,p.style.color=k.toolbar.fontColor,p.style.border="none",sa(k,p,{WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",userSelect:"none"}));p.getAttribute("state")!==D&&(p.setAttribute("state",D),p.setAttribute("type","button"),sa(k,p,{padding:"5px 12px", +cursor:"pointer","float":"left",width:"40px",height:"25px",outline:"0px",verticalAlign:"baseline",lineHeight:"0"}),p.setAttribute("title",k._cultureInfo[D+"Text"]),p.innerHTML=""+k._cultureInfo[D+"Text"]+"")}function Qa(){for(var k=null,p=0;pa?"a":"p";case "tt":return 12>a?"am":"pm";case "T":return 12>a?"A": +"P";case "TT":return 12>a?"AM":"PM";case "K":return S?"UTC":(String(z).match(H)||[""]).pop().replace(F,"");case "z":return(0k?!0:!1;u&&(k*=-1);var v=r?r.decimalSeparator:".",H=r?r.digitGroupSeparator: +",",F="";p=String(p);var F=1,z=r="",E=-1,L=[],R=[],I=0,N=0,S=0,O=!1,U=0,z=p.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|\u2030|./g);p=null;for(var Q=0;z&&QE)E=Q;else{if("%"===p)F*=100;else if("\u2030"===p){F*=1E3;continue}else if(","===p[0]&&"."===p[p.length-1]){F/=Math.pow(1E3,p.length-1);E=Q+p.length-1;continue}else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||(O=!0);0>E?(L.push(p),"#"===p||"0"===p?I++:","===p&&S++):(R.push(p),"#"!==p&&"0"!==p||N++)}O&&(p=Math.floor(k), +z=-Math.floor(Math.log(k)/Math.LN10+1),U=0===k?0:0===p?-(I+z):String(p).length-I,F/=Math.pow(10,U));0>E&&(E=Q);F=(k*F).toFixed(N);p=F.split(".");F=(p[0]+"").split("");k=(p[1]+"").split("");F&&"0"===F[0]&&F.shift();for(O=z=Q=N=E=0;0U?p.replace("+","").replace("-",""):p.replace("-",""),r+=p.replace(/[0]+/,function(k){return $(U,k.length)}));H="";for(L=!1;0U?p.replace("+","").replace("-",""):p.replace("-",""),H+=p.replace(/[0]+/,function(k){return $(U,k.length)}));r+=(L?v:"")+H;return u?"-"+r:r},Ra=function(k){var p=0,r=0;k=k||window.event;k.offsetX||0===k.offsetX?(p=k.offsetX,r=k.offsetY):k.layerX||0==k.layerX?(p=k.layerX,r=k.layerY):(p=k.pageX-k.target.offsetLeft, +r=k.pageY-k.target.offsetTop);return{x:p,y:r}},bb=!0,Ua=window.devicePixelRatio||1,Pa=1,W=bb?Ua/Pa:1,ea=function(k,p,r,u,v,H,F,z,E,L,R,N,O){"undefined"===typeof O&&(O=1);F=F||0;z=z||"black";var I=15p)v=H-1;else break}r>p&&1H&&(F=p.pop(),u-=F.height,v=z)}this._wrappedText={lines:p,width:v,height:u};this.width=v+(this.leftPadding+this.rightPadding);this.height=u+(this.topPadding+this.bottomPadding);this.ctx.font=r};ka.prototype._getFontString=function(){var k;k=""+(this.fontStyle?this.fontStyle+" ":"");k+=this.fontWeight?this.fontWeight+" ":"";k+=this.fontSize?this.fontSize+"px ":"";var p=this.fontFamily?this.fontFamily+"":"";!r&&p&&(p=p.split(",")[0],"'"!==p[0]&&'"'!==p[0]&&(p="'"+p+"'"));return k+=p}; +qa(Va,V);qa(Aa,V);Aa.prototype.setLayout=function(){if(this.text){var k=this.dockInsidePlotArea?this.chart.plotArea:this.chart,p=k.layoutManager.getFreeSpace(),r=p.x1,v=p.y1,E=0,H=0,F=this.chart._menuButton&&this.chart.exportEnabled&&"top"===this.verticalAlign?22:0,z,I;"top"===this.verticalAlign||"bottom"===this.verticalAlign?(null===this.maxWidth&&(this.maxWidth=p.width-4-F*("center"===this.horizontalAlign?2:1)),H=0.5*p.height-this.margin-2,E=0):"center"===this.verticalAlign&&("left"===this.horizontalAlign|| +"right"===this.horizontalAlign?(null===this.maxWidth&&(this.maxWidth=p.height-4),H=0.5*p.width-this.margin-2):"center"===this.horizontalAlign&&(null===this.maxWidth&&(this.maxWidth=p.width-4),H=0.5*p.height-4));var L;u(this.padding)||"number"!==typeof this.padding?u(this.padding)||"object"!==typeof this.padding||(L=this.padding.top?this.padding.top:this.padding.bottom?this.padding.bottom:0,L+=this.padding.bottom?this.padding.bottom:this.padding.top?this.padding.top:0,L*=1.25):L=2.5*this.padding;this.wrap|| +(H=Math.min(H,Math.max(1.5*this.fontSize,this.fontSize+L)));H=new ka(this.ctx,{fontSize:this.fontSize,fontFamily:this.fontFamily,fontColor:this.fontColor,fontStyle:this.fontStyle,fontWeight:this.fontWeight,horizontalAlign:this.horizontalAlign,verticalAlign:this.verticalAlign,borderColor:this.borderColor,borderThickness:this.borderThickness,backgroundColor:this.backgroundColor,maxWidth:this.maxWidth,maxHeight:H,cornerRadius:this.cornerRadius,text:this.text,padding:this.padding,textBaseline:"top"}); +L=H.measureText();"top"===this.verticalAlign||"bottom"===this.verticalAlign?("top"===this.verticalAlign?(v=p.y1+2,I="top"):"bottom"===this.verticalAlign&&(v=p.y2-2-L.height,I="bottom"),"left"===this.horizontalAlign?r=p.x1+2:"center"===this.horizontalAlign?r=p.x1+p.width/2-L.width/2:"right"===this.horizontalAlign&&(r=p.x2-2-L.width-F),z=this.horizontalAlign,this.width=L.width,this.height=L.height):"center"===this.verticalAlign&&("left"===this.horizontalAlign?(r=p.x1+2,v=p.y2-2-(this.maxWidth/2-L.width/ +2),E=-90,I="left",this.width=L.height,this.height=L.width):"right"===this.horizontalAlign?(r=p.x2-2,v=p.y1+2+(this.maxWidth/2-L.width/2),E=90,I="right",this.width=L.height,this.height=L.width):"center"===this.horizontalAlign&&(v=k.y1+(k.height/2-L.height/2),r=k.x1+(k.width/2-L.width/2),I="center",this.width=L.width,this.height=L.height),z="center");H.x=r;H.y=v;H.angle=E;H.horizontalAlign=z;this._textBlock=H;k.layoutManager.registerSpace(I,{width:this.width+("left"===I||"right"===I?this.margin+2:0), +height:this.height+("top"===I||"bottom"===I?this.margin+2:0)});this.bounds={x1:r,y1:v,x2:r+this.width,y2:v+this.height};this.ctx.textBaseline="top"}};Aa.prototype.render=function(){this._textBlock&&this._textBlock.render(!0)};qa(Ka,V);Ka.prototype.setLayout=Aa.prototype.setLayout;Ka.prototype.render=Aa.prototype.render;Wa.prototype.get=function(k,p){var r=null;0a[g].x&&0w?{x:a[l].x+w/3,y:a[l].y+c/3}:{x:a[l].x,y:a[l].y+c/9};l=e;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[l].x-a[g].x?0.01:a[l].x-a[g].x))*(d- +1)/2+1;w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0w?{x:a[l].x-w/3,y:a[l].y-c/3}:{x:a[l].x,y:a[l].y-c/9};b[b.length]=a[e]}return b}function E(a,d,b,c,e,g,m,l,w,h){var s=0;h?(m.color=g,l.color=g):h=1;s=w?Math.abs(e-b):Math.abs(c-d);s=0this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360);this.options.scaleBreaks&&(this.scaleBreaks=new Q(this.chart, +this.options.scaleBreaks,++this.chart._eventManager.lastObjectId,this));this.stripLines=[];if(this.options.stripLines&&0=this._appliedBreaks[a+1].startValue&&(this._appliedBreaks[a].endValue=Math.max(this._appliedBreaks[a].endValue,this._appliedBreaks[a+1].endValue),window.console&&window.console.log("CanvasJS Error: Breaks "+a+" and "+(a+1)+" are overlapping."),this._appliedBreaks.splice(a,2),a--)}}function L(a,d,b,c,e,g){L.base.constructor.call(this,"Break",d,b,c,g);this.id=e;this.chart=a;this.ctx=this.chart.ctx;this.scaleBreaks=g;this.optionsName= +d;this.isOptionsInArray=!0;this.type=b.type?this.type:g.type;this.fillOpacity=u(b.fillOpacity)?g.fillOpacity:this.fillOpacity;this.lineThickness=u(b.lineThickness)?g.lineThickness:this.lineThickness;this.color=b.color?this.color:g.color;this.lineColor=b.lineColor?this.lineColor:g.lineColor;this.lineDashType=b.lineDashType?this.lineDashType:g.lineDashType;!u(this.startValue)&&this.startValue.getTime&&(this.startValue=this.startValue.getTime());!u(this.endValue)&&this.endValue.getTime&&(this.endValue= +this.endValue.getTime());"number"===typeof this.startValue&&("number"===typeof this.endValue&&this.endValue=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers);O(this._zoomButton,"mouseout",function(){d||(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(0%)", +filter:"invert(0%)"}))},this.allDOMEventHandlers)}this._resetButton||(d=!1,va(this._resetButton=document.createElement("button")),ua(this,this._resetButton,"reset"),this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor,this._toolBar.appendChild(this._resetButton),O(this._resetButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._resetButton,"click",function(){a.toolTip.hide();a.zoomEnabled||a.panEnabled?(a.zoomEnabled= +!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"),a._defaultCursor="default",a.overlaidCanvas.style.cursor=a._defaultCursor):(a.zoomEnabled=!1,a.panEnabled=!1);if(a.sessionVariables.axisX)for(var c=0;c=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers),O(this._resetButton,"mouseout",function(){d||(sa(a,a._resetButton, +{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers),this.overlaidCanvas.style.cursor=a._defaultCursor);this.zoomEnabled||this.panEnabled||(this._zoomButton?(a._zoomButton.getAttribute("state")===a._cultureInfo.zoomText?(this.panEnabled=!0,this.zoomEnabled=!1):(this.zoomEnabled=!0,this.panEnabled= +!1),Qa(a._zoomButton,a._resetButton)):(this.zoomEnabled=!0,this.panEnabled=!1))}else this.panEnabled=this.zoomEnabled=!1;this._menuButton?this.exportEnabled?Qa(this._menuButton):va(this._menuButton):this.exportEnabled&&r&&(d=!1,this._menuButton=document.createElement("button"),ua(this,this._menuButton,"menu"),this._toolBar.appendChild(this._menuButton),O(this._menuButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._menuButton,"click",function(){"none"!==a._dropdownMenu.style.display|| +a._dropDownCloseTime&&500>=(new Date).getTime()-a._dropDownCloseTime.getTime()||(a._dropdownMenu.style.display="block",a._menuButton.blur(),a._dropdownMenu.focus())},this.allDOMEventHandlers,!0),O(this._menuButton,"mouseover",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.fontColorOnHover}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers,!0), +O(this._menuButton,"mouseout",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers,!0));if(!this._dropdownMenu&&this.exportEnabled&&r){d=!1;this._dropdownMenu=document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);var b=-1!==this.theme.indexOf("dark")?"black":"#888888";this._dropdownMenu.style.cssText= +"position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 0px;top: 25px;min-width: 120px;outline: 0;font-size: 14px; font-family: Arial, Helvetica, sans-serif;padding: 5px 0px 5px 0px;text-align: left;line-height: 10px;background-color:"+this.toolbar.backgroundColor+";box-shadow: 2px 2px 10px "+b;a._dropdownMenu.style.display="none";this._toolBar.appendChild(this._dropdownMenu);O(this._dropdownMenu,"blur",function(){va(a._dropdownMenu); +a._dropDownCloseTime=new Date},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.printText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers, +!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){a.print();va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.saveJPGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d= +!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"jpeg",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText= +"padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.savePNGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor, +this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"png",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0)}"none"!==this._toolBar.style.display&&this._zoomButton&&(this.panEnabled?ua(a,a._zoomButton,"zoom"):ua(a,a._zoomButton,"pan"),a._resetButton.getAttribute("state")!==a._cultureInfo.resetText&&ua(a,a._resetButton,"reset"));this.options.toolTip&&this.toolTip.options!==this.options.toolTip&&(this.toolTip.options=this.options.toolTip); +for(var c in this.toolTip.options)this.toolTip.options.hasOwnProperty(c)&&this.toolTip.updateOption(c)};p.prototype._updateSize=function(){var a;a=[this.canvas,this._preRenderCanvas,this.overlaidCanvas,this._eventManager.ghostCanvas];var d=0,b=0;this.options.width?d=this.width:this.width=d=0c.linkedDataSeriesIndex||c.linkedDataSeriesIndex>=this.options.data.length||"number"!==typeof c.linkedDataSeriesIndex|| +"error"===this.options.data[c.linkedDataSeriesIndex].type)&&(c.linkedDataSeriesIndex=null);null===c.name&&(c.name="DataSeries "+a);null===c.color?1a&&"undefined"!==typeof w.startTimePercent?a>=w.startTimePercent&&w.animationCallback(w.easingFunction(a-w.startTimePercent,0,1,1-w.startTimePercent),w):w.animationCallback(w.easingFunction(a,0,1,1),w);s.dispatchEvent("dataAnimationIterationEnd",{chart:s})},function(){b=[];for(var a=0;aa.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c);ed.max&&"number"===typeof e&&(d.max=e);if(0B&&(B=1/B);b.minDiff>B&&1!==B&&(b.minDiff=B)}else B=c-l.dataPoints[w-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B);null!==e&&null!==l.dataPoints[w-1].y&&(a.axisY.logarithmic?(B=e/l.dataPoints[w-1].y,1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e-l.dataPoints[w-1].y,0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B)))}if(cf&& +!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&qd.viewPortMax&&"number"===typeof e&&(d.viewPortMax=e))}}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype._processStackedPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d= +a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=[],l=[],w=Infinity,h=-Infinity,s=0;sb.max&&(b.max=c);if(0r&&(r=1/r);b.minDiff>r&&1!==r&&(b.minDiff=r)}else r=c-q.dataPoints[n-1].x,0>r&&(r*=-1),b.minDiff>r&&0!==r&&(b.minDiff=r);null!==e&&null!==q.dataPoints[n-1].y&&(a.axisY.logarithmic?0r&&(r=1/r),d.minDiff>r&&1!==r&&(d.minDiff=r)):(r=e-q.dataPoints[n-1].y,0>r&&(r*=-1),d.minDiff>r&&0!==r&&(d.minDiff=r)))}if(ct&&!B)B=!0;else if(c>t&&B)continue;q.dataPoints[n].label&&(a.axisX.labels[c]=q.dataPoints[n].label);cb.viewPortMax&&(b.viewPortMax=c);null===q.dataPoints[n].y?b.viewPortMin===c&&kd.max&&(d.max=a),nb.viewPortMax||(ad.viewPortMax&& +(d.viewPortMax=a)));for(n in l)l.hasOwnProperty(n)&&!isNaN(n)&&(a=l[n],ad.max&&(d.max=Math.max(a,h)),nb.viewPortMax||(ad.viewPortMax&&(d.viewPortMax=Math.max(a,h))))}};p.prototype._processStacked100PlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=!1,l=!1,w=[],h=0;hb.max&&(b.max=c);if(0t&&(t=1/t);b.minDiff>t&&1!==t&&(b.minDiff=t)}else t=c-s.dataPoints[q-1].x,0>t&&(t*=-1),b.minDiff>t&&0!==t&&(b.minDiff=t);u(e)||null===s.dataPoints[q-1].y||(a.axisY.logarithmic?0t&&(t=1/t),d.minDiff>t&&1!==t&&(d.minDiff=t)):(t=e-s.dataPoints[q-1].y,0>t&&(t*=-1),d.minDiff>t&&0!==t&&(d.minDiff=t)))}if(cr&&!f)f=!0;else if(c>r&&f)continue;s.dataPoints[q].label&&(a.axisX.labels[c]=s.dataPoints[q].label); +cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&Be&&(l=!0),w[c]=w[c]?w[c]+Math.abs(e):Math.abs(e))}}s.axisX.valueType=s.xValueType=g?"dateTime":"number"}a.axisY.logarithmic?(d.max=u(d.viewPortMax)?99*Math.pow(a.axisY.logarithmBase,-0.05):Math.max(d.viewPortMax,99*Math.pow(a.axisY.logarithmBase,-0.05)),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&!l?(d.max=u(d.viewPortMax)? +99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&l?(d.max=u(d.viewPortMax)?99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99)):!m&&l&&(d.max=u(d.viewPortMax)?-1:Math.max(d.viewPortMax,-1),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99));d.viewPortMin=d.min;d.viewPortMax=d.max;a.dataPointYSums=w}};p.prototype._processMultiYPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo, +b=a.axisX.dataInfo,c,e,g,m,l=!1,w=0;wb.max&&(b.max=c);gd.max&&(d.max=m);0B&&(B=1/B),b.minDiff>B&&1!==B&&(b.minDiff=B)):(B=c-h.dataPoints[s-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B)),e&&(null!==e[0]&&h.dataPoints[s-1].y&&null!==h.dataPoints[s-1].y[0])&&(a.axisY.logarithmic?(B=e[0]/ +h.dataPoints[s-1].y[0],1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e[0]-h.dataPoints[s-1].y[0],0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B))));if(!(ct&&!n)n=!0;else if(c>t&&n)continue;h.dataPoints[s].label&&(a.axisX.labels[c]=h.dataPoints[s].label);cb.viewPortMax&&(b.viewPortMax=c);if(b.viewPortMin===c&&e)for(p=0;pd.viewPortMax&&(d.viewPortMax=m))}}h.axisX.valueType=h.xValueType=l?"dateTime":"number"}};p.prototype._processSpecificPlotUnit=function(a){if("waterfall"===a.type&&a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c),l.dataPointEOs[w].cumulativeSumd.max&&(d.max=l.dataPointEOs[w].cumulativeSum),0q&&(q=1/q),b.minDiff>q&&1!==q&&(b.minDiff=q)):(q=c-l.dataPoints[w-1].x,0>q&&(q*=-1),b.minDiff>q&&0!==q&&(b.minDiff=q)),null!==e&&null!==l.dataPoints[w- +1].y&&(a.axisY.logarithmic?(e=l.dataPointEOs[w].cumulativeSum/l.dataPointEOs[w-1].cumulativeSum,1>e&&(e=1/e),d.minDiff>e&&1!==e&&(d.minDiff=e)):(e=l.dataPointEOs[w].cumulativeSum-l.dataPointEOs[w-1].cumulativeSum,0>e&&(e*=-1),d.minDiff>e&&0!==e&&(d.minDiff=e)))),!(cf&&!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);0d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w-1].cumulativeSum));l.dataPointEOs[w].cumulativeSumd.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w].cumulativeSum)}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype.calculateAutoBreaks=function(){function a(a,c,b,e){if(e)return b= +Math.pow(Math.min(b*a/c,c/a),0.2),1>=b&&(b=Math.pow(1>a?1/a:Math.min(c/a,a),0.25)),{startValue:a*b,endValue:c/b};b=0.2*Math.min(b-c+a,c-a);0>=b&&(b=0.25*Math.min(c-a,Math.abs(a)));return{startValue:a+b,endValue:c-b}}function d(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){var c=a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<=a.axisX.scaleBreaks.maxNumberOfAutoBreaks,b=a.axisY.scaleBreaks&&a.axisY.scaleBreaks.autoCalculate&&1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks;if(c|| +b)for(var d=a.axisY.dataInfo,f=a.axisX.dataInfo,g,h=f.min,l=f.max,m=d.min,n=d.max,f=f._dataRanges,d=d._dataRanges,q,w=0,s=0;sk.dataPoints.length))for(w=0;wf[q].max&&(f[q].max=g)),b){var r= +(n+1-m)*Math.max(parseFloat(a.axisY.scaleBreaks.collapsibleThreshold)||10,10)/100;if((g="waterfall"===a.type?k.dataPointEOs[w].cumulativeSum:k.dataPoints[w].y)&&g.length)for(var p=0;pd[q].max&&(d[q].max=g[p]);else u(g)||(q=Math.floor((g-m)/r),gd[q].max&&(d[q].max=g))}}}}function b(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)&&a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<= +a.axisX.scaleBreaks.maxNumberOfAutoBreaks)for(var c=a.axisX.dataInfo,b=c.min,d=c.max,f=c._dataRanges,g,h=0,l=0;lm.dataPoints.length))for(h=0;hf[g].max&&(f[g].max=c)}}for(var c,e=this,g=!1,m=0;m< +this._axes.length;m++)if(this._axes[m].scaleBreaks&&this._axes[m].scaleBreaks.autoCalculate&&1<=this._axes[m].scaleBreaks.maxNumberOfAutoBreaks){g=!0;this._axes[m].dataInfo._dataRanges=[];for(var l=0;l<100/Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10);l++)this._axes[m].dataInfo._dataRanges.push({min:Infinity,max:-Infinity})}if(g){for(m=0;ms[f].max&&(s[f].max=q)}delete this._axes[m].dataInfo.dataPointYPositiveSums}if(this._axes[m].dataInfo.dataPointYNegativeSums){n= +this._axes[m].dataInfo.dataPointYNegativeSums;s=h;for(l in n)n.hasOwnProperty(l)&&!isNaN(l)&&(q=-1*n[l],u(q)||(f=Math.floor((q-w)/c),qs[f].max&&(s[f].max=q)));delete this._axes[m].dataInfo.dataPointYNegativeSums}for(l=0;lc&&g.push({diff:q,start:s,end:w});break}else l++;if(this._axes[m].scaleBreaks.customBreaks)for(l=0;l=e.x1&&(a<=e.x2&&d>=e.y1&&d<=e.y2)&&(c=e.id)}return c};p.prototype.getAutoFontSize=lb;p.prototype.resetOverlayedCanvas=function(){this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height)};p.prototype.clearCanvas=kb;p.prototype.attachEvent=function(a){this._events.push(a)};p.prototype._touchEventHandler=function(a){if(a.changedTouches&&this.interactivityEnabled){var d=[],b=a.changedTouches,c=b?b[0]:a,e=null;switch(a.type){case "touchstart":case "MSPointerDown":d=["mousemove","mousedown"];this._lastTouchData= +Ra(c);this._lastTouchData.time=new Date;break;case "touchmove":case "MSPointerMove":d=["mousemove"];break;case "touchend":case "MSPointerUp":var g=this._lastTouchData&&this._lastTouchData.time?new Date-this._lastTouchData.time:0,d="touchstart"===this._lastTouchEventType||"MSPointerDown"===this._lastTouchEventType||300>g?["mouseup","click"]:["mouseup"];break;default:return}if(!(b&&1g)this._lastTouchData.scroll=!0}catch(l){}this._lastTouchEventType=a.type;if(this._lastTouchData.scroll&&this.zoomEnabled)this.isDrag&&this.resetOverlayedCanvas(),this.isDrag=!1;else for(b=0;b=e.x1&&d.x<=e.x2&&d.y>=e.y1&&d.y<=e.y2){c[b].call(c.context,d.x,d.y);"mousedown"===b&&!0===c.capture?(p.capturedEventParam=c,this.overlaidCanvas.setCapture?this.overlaidCanvas.setCapture():document.documentElement.addEventListener("mouseup", +this._mouseEventHandler,!1)):"mouseup"===b&&(c.chart.overlaidCanvas.releaseCapture?c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",this._mouseEventHandler,!1));break}else c=null;a.target.style.cursor=c&&c.cursor?c.cursor:this._defaultCursor}b=this.plotArea;if(d.xb.x2||d.yb.y2)this.toolTip&&this.toolTip.enabled?this.toolTip.hide():this.resetOverlayedCanvas();this.isDrag&&this.zoomEnabled||!this._eventManager||this._eventManager.mouseEventHandler(a)}}; +p.prototype._plotAreaMouseDown=function(a,d){this.isDrag=!0;this.dragStartPoint={x:a,y:d}};p.prototype._plotAreaMouseUp=function(a,d){if(("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)&&this.isDrag){var b=d-this.dragStartPoint.y,c=a-this.dragStartPoint.x,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=!1;this.resetOverlayedCanvas();if("xySwapped"===this.plotInfo.axisPlacement)var l=g,g=e,e=l;if(this.panEnabled||this.zoomEnabled){if(this.panEnabled)for(e= +g=0;eb.maximum&&(g=b.viewportMaximum/b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum/g,b.sessionVariables.newViewportMaximum=b.viewportMaximum/g,m=!0):b.viewportMinimumb.maximum&&(g=b.viewportMaximum-b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum-g,b.sessionVariables.newViewportMaximum=b.viewportMaximum-g,m=!0);else if((!e||2Math.abs(b)&&(this.panEnabled||this.zoomEnabled)?this.toolTip.hide():this.panEnabled||this.zoomEnabled||this.toolTip.mouseMoveHandler(a, +d);if((!e||2f)var B=f,f=n,n=B;if(q.scaleBreaks)for(B=0;!g&&B=f;if(isFinite(q.dataInfo.minDiff))if(B=q.getApparentDifference(n,f,null,!0),!(g||!(this.panEnabled&&q.scaleBreaks&&q.scaleBreaks._appliedBreaks.length)&&(q.logarithmic&&Bq.maximum))w.push(q),s.push({val1:n,val2:f}),l=!0;else if(!e){l=!1;break}}return{isValid:l,axesWithValidRange:w,axesRanges:s}};p.prototype.preparePlotArea=function(){var a=this.plotArea;!r&&(0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2;a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2;a.width=a.x2-a.x1;a.height=a.y2-a.y1}this.axisY2&&0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2,a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2,a.width=a.x2-a.x1,a.height=a.y2-a.y1)}else d= +this.layoutManager.getFreeSpace(),a.x1=d.x1,a.x2=d.x2,a.y1=d.y1,a.y2=d.y2,a.width=d.width,a.height=d.height;r||(a.canvas.width=a.width,a.canvas.height=a.height,a.canvas.style.left=a.x1+"px",a.canvas.style.top=a.y1+"px",(0b.x2||h.point.yb.y2+1)continue}else if("rangearea"===s||"rangesplinearea"===s){if(h.dataPoint.xy.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("bubble")||0<=s.indexOf("scatter")){if(h.dataPoint.xy.viewportMaximum|| +h.dataPoint.yA.viewportMaximum)continue}else if(0<=s.indexOf("column")||"waterfall"===s||"error"===s&&!h.axisSwapped){if(h.dataPoint.xy.viewportMaximum||h.bounds.y1>b.y2||h.bounds.y2y.viewportMaximum||h.bounds.x1>b.x2||h.bounds.x2 +y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(h.dataPoint.xy.viewportMaximum)continue;e=m=2;"horizontal"===C?(l=f.width,w=f.height):(w=f.width,l=f.height);if("normal"===this.plotInfo.axisPlacement){if(0<=s.indexOf("line")||0<=s.indexOf("area"))t="auto",m=4;else if(0<=s.indexOf("stacked"))"auto"===t&&(t="inside");else if("bubble"===s||"scatter"===s)t="inside";q=h.point.x- +l/2;"inside"!==t?(e=b.y1,g=b.y2,0h.point.y)):(n=h.point.y+m+c,n>g-w-m-c&&(n="auto"===t?Math.min(h.point.y,g)-w-m-c:g-w-m-c,v=ng-w-m&&("bubble"===s||"scatter"===s)&&(n=Math.min(h.point.y+m,b.y2-w-m))),n=Math.min(n,g-w))}else 0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("scatter")?(t="auto",e=4):0<=s.indexOf("stacked")?"auto"===t&&(t="inside"):"bubble"===s&&(t="inside"),n=h.point.y-w/2,"inside"!==t?(m=b.x1,g=b.x2,0>ma?(q=h.point.x-l-e-c,qh.point.x)):(q=h.point.x+e+c,q>g-l-e-c&&(q="auto"=== +t?Math.min(h.point.x,g)-l-e-c:g-l-e-c,v=qma?Math.max(h.bounds.x1,b.x1)+l/2+e:Math.min(h.bounds.x2,b.x2)-l/2-e:(Math.max(h.bounds.x1,b.x1)+Math.min(h.bounds.x2,b.x2))/2,q=0>ma?Math.max(h.point.x,c)-l/2:Math.min(h.point.x,c)-l/2,q=Math.max(q,m));"vertical"===C&&(n+=w);f.x=q;f.y=n;f.render(!0);p&&("inside"!==t&&(0>s.indexOf("bar")&&("error"!==s||!h.axisSwapped)&&h.point.x>b.x1&&h.point.xs.indexOf("column")&&("error"!==s||h.axisSwapped)&&h.point.y>b.y1&&h.point.y=a.dataSeriesIndexes.length)){var c= +this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepLine=function(a){var d=a.targetCanvasCtx|| +this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&& +(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation, +easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderSpline=function(a){function d(a){a=v(a,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx;c.save();var g=this.plotArea;c.beginPath(); +c.rect(g.x1,g.y1,g.width,g.height);c.clip();for(var m=[],l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[p].y)0s[p].y===a.axisY.reversed?1:-1,color:B});u=!1}d(x)}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(g.x1,g.y1,g.width,g.height),e.beginPath());c.restore();c.beginPath();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width, +0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.dataPointWidth=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){m=a.axisX.convertValueToPixel(w);l=a.axisY.convertValueToPixel(B[g].y);m=a.axisX.reversed?m+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:m-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var k=a.axisX.reversed?m-q<<0:m+q<<0,t;0<=B[g].y?t=h:(t=l,l=h);l>t&&(c=l,l=t,t=c);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,l,k,t,c,0,null,p&&0<=B[g].y, +0>B[g].y&&p,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:m,y1:l,x2:k,y2:t};c=N(c);r&&ea(this._eventManager.ghostCtx,m,l,k,t,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"column",dataPoint:B[g],dataSeries:f,point:{x:m+(k-m)/2,y:0>B[g].y===a.axisY.reversed?l:t},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:m, +y1:Math.min(l,t),x2:k,y2:Math.max(l,t)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore(); +return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.y2?a.axisY.bounds.y2:h}}};p.prototype.renderStackedColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth? +this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q="undefined"!==typeof m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;g[c]=A+(y-q)}else A=m[c]?m[c]:0,y=q+A,q=n+A,m[c]=A+(y-q);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1, +!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedColumn",dataPoint:t[h],dataSeries:p,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q, +y)},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx, +animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderStackedColumn100=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth: +this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);q=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;q=a.axisY.convertValueToPixel(l[c]);y=g[c]?g[c]:n;g[c]=q}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=q+("undefined"!==typeof w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q=m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(q),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y1-q)&&(q=e.y1);g[c]=A+(y-q)}else A="undefined"!==typeof m[c]? +m[c]:0,y=q+A,q=n+A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y2-y)&&(y=e.y2),m[c]=A+(y-q);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&& +this._indexLabels.push({chartType:"stackedColumn100",dataPoint:t[h],dataSeries:k,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q,y)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&& +this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= +null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.options.dataPointWidth? +this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height); +b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){l=a.axisX.convertValueToPixel(w); +m=a.axisY.convertValueToPixel(B[g].y);l=a.axisX.reversed?l+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:l-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var p=a.axisX.reversed?l-q<<0:l+q<<0,t;0<=B[g].y?t=h:(t=m,m=h);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,t,l,m,p,c,0,null,k,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:t,y1:l,x2:m,y2:p};c= +N(c);r&&ea(this._eventManager.ghostCtx,t,l,m,p,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"bar",dataPoint:B[g],dataSeries:f,point:{x:0<=B[g].y?m:t,y:l+(p-l)/2},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(t,m),y1:l,x2:Math.max(t,m),y2:p},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas, +0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.x2?a.axisY.bounds.x2: +h}}};p.prototype.renderStackedBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<< +0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),s=m[c]? +m[c]:n,m[c]=y=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A=g[c]?g[c]:0;y=n+A;s+=A;g[c]=A+(s-y)}else A=m[c]?m[c]:0,y=s-A,s=n-A,m[c]=A+(s-y);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,y,x,s,v,c,0,null,u,!1,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:y,y1:x,x2:s,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,y,x,s,v,c,0,null,!1,!1,!1, +!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar",dataPoint:t[h],dataSeries:k,point:{x:0<=t[h].y?s:y,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(y,s),y1:x,x2:Math.max(y,s),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderStackedBar100=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)|| +(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save(); +b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&& +"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x;x=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var v=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,y=v+f<<0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;x=g[c]?g[c]:n;g[c]=s=a.axisY.convertValueToPixel(l[c])}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=x+(w[c]?w[c]:0),s=m[c]?m[c]: +n,m[c]=x=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(x),0<=t[h].y){var A=g[c]?g[c]:0;x=n+A;s+=A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x2-s)&&(s=e.x2);g[c]=A+(s-x)}else A=m[c]?m[c]:0,x=s-A,s=n-A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x1-x)&&(x=e.x1),m[c]=A+(s-x);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,v,s,y,c,0,null,u,!1,!1,!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k, +dataPointIndex:h,x1:x,y1:v,x2:s,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,v,s,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar100",dataPoint:t[h],dataSeries:p,point:{x:0<=t[h].y?s:x,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(x,s),y1:v,x2:Math.max(x,s),y2:y},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop", +a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!da)))if("number"!==typeof p[k].y)B.connectNullData||(da||d)||c(),da=!0;else{t=a.axisX.convertValueToPixel(x);u=a.axisY.convertValueToPixel(p[k].y);d||da?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||b===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d=t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,b=B.nullDataLineDashType,g.setLineDash(Y)),g.lineTo(t,u),r&&m.lineTo(t, +u)):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),da=d=!1):(g.lineTo(t,u),r&&m.lineTo(t,u),0==k%250&&c());q={x:t,y:u};kp[k].y===a.axisY.reversed?1:-1,color:z})}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderSplineArea=function(a){function d(){var b=v(x,2);if(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum? +t=p:0>a.axisY.viewportMaximum?t=m.y1:0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=a.axisX.lineCoordinates,m=a.axisY.lineCoordinates,l=[],w=this.plotArea;c.save();r&& +e.save();c.beginPath();c.rect(w.x1,w.y1,w.width,w.height);c.clip();r&&(e.beginPath(),e.rect(w.x1,w.y1,w.width,w.height),e.clip());for(var h=0;ha.axisX.dataInfo.viewPortMax&&(!q.connectNullData||!k)))if("number"!==typeof n[f].y)0n[f].y===a.axisY.reversed?1:-1,color:ma});k=!1}d();ia.drawMarkers(l)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(w.x1,w.y1,w.width,w.height), +this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!b))){var Z=u;"number"!==typeof k[p].y?(B.connectNullData||(b||d)||c(),b=!0):(t=a.axisX.convertValueToPixel(x),u=a.axisY.convertValueToPixel(k[p].y),d||b?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||Y===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d= +t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,Y=B.nullDataLineDashType,g.setLineDash(ca)),g.lineTo(t,Z),g.lineTo(t,u),r&&(m.lineTo(t,Z),m.lineTo(t,u))):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),b=d=!1):(g.lineTo(t,Z),r&&m.lineTo(t,Z),g.lineTo(t,u),r&&m.lineTo(t,u),0==p%250&&c()),q={x:t,y:u},pk[p].y===a.axisY.reversed?1:-1,color:z}))}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea=function(a){function d(){if(!(1>h.length)){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=[],l=this.plotArea,w=[],h=[],s=[],q=[],n=0,f,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),u=this._eventManager.ghostCtx,t,C,x;r&&u.beginPath();c.save();r&&u.save();c.beginPath();c.rect(l.x1,l.y1,l.width,l.height);c.clip();r&&(u.beginPath(),u.rect(l.x1,l.y1,l.width,l.height),u.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData||!da)))if("number"!==typeof Z.y)A.connectNullData||(da||C)||d(),da=!0;else{f=a.axisX.convertValueToPixel(g);var oa= +w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(Z.y),k-=oa;h.push({x:f,y:p-oa});w[g]=p-k;C||da?(!C&&A.connectNullData?(c.setLineDash&&(A.options.nullDataLineDashType||x===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(C=h.pop(),x=h[h.length-1],d(),c.moveTo(t.x,t.y),h.push(x),h.push(C),x=A.nullDataLineDashType, +c.setLineDash(Y)),c.lineTo(f,k),r&&u.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(u.beginPath(),u.moveTo(f,k))),da=C=!1):(c.lineTo(f,k),r&&u.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&u.moveTo(f,k),h.push({x:f,y:p-oa})));t={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&u.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(l.x1,l.y1,l.width,l.height),u.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea100=function(a){function d(){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=[],w=[],h=[],s=[],q=[],n=0,f,k,p,u,t,C=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),x=this._eventManager.ghostCtx;c.save();r&&x.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(x.beginPath(), +x.rect(m.x1,m.y1,m.width,m.height),x.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData|| +!da)))if("number"!==typeof Z.y)A.connectNullData||(da||u)||d(),da=!0;else{var oa;oa=0!==a.dataPointYSums[g]?100*(Z.y/a.dataPointYSums[g]):0;f=a.axisX.convertValueToPixel(g);var la=w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(oa),k-=la;h.push({x:f,y:C-la});w[g]=C-k;u||da?(!u&&A.connectNullData?(c.setLineDash&& +(A.options.nullDataLineDashType||t===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(u=h.pop(),t=h[h.length-1],d(),c.moveTo(p.x,p.y),h.push(t),h.push(u),t=A.nullDataLineDashType,c.setLineDash(Y)),c.lineTo(f,k),r&&x.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(x.beginPath(),x.moveTo(f,k))),da=u=!1):(c.lineTo(f,k),r&&x.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&x.moveTo(f,k),h.push({x:f,y:C-la})));p={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&x.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(l);r&&(b.drawImage(this._preRenderCanvas,0, +0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),x.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}}; +p.prototype.renderBubble=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=-Infinity,w=Infinity,h=0;ha.axisX.dataInfo.viewPortMax||"undefined"===typeof n[e].z||(f=n[e].z,f>l&&(l=f),fa.axisX.dataInfo.viewPortMax)&&"number"===typeof n[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(n[e].y);var f=n[e].z,u=2*Math.max(Math.sqrt((l===w?p/2:k+(p-k)/(l-w)*(f-w))/Math.PI)<<0,1),f=q.getMarkerProperties(e,b);f.size=u;b.globalAlpha=q.fillOpacity;ia.drawMarker(g,m,b,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;var t=q.dataPointIds[e];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:s, +dataPointIndex:e,x1:g,y1:m,size:u};u=N(t);r&&ia.drawMarker(g,m,this._eventManager.ghostCtx,f.type,f.size,u,u,f.borderThickness);(n[e].indexLabel||q.indexLabel||n[e].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"bubble",dataPoint:n[e],dataSeries:q,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/2,x2:g+f.size/2,y2:m+f.size/2},color:null})}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderScatter=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=0;la.axisX.dataInfo.viewPortMax)&&"number"===typeof s[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(s[e].y);var f=h.getMarkerProperties(e,g,m,b);b.globalAlpha=h.fillOpacity;ia.drawMarker(f.x,f.y,f.ctx,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;Math.sqrt((q-g)*(q-g)+(n-m)*(n-m))Math.min(this.plotArea.width,this.plotArea.height)||(q=h.dataPointIds[e],this._eventManager.objectMap[q]={id:q,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:e,x1:g,y1:m},q=N(q),r&&ia.drawMarker(f.x,f.y,this._eventManager.ghostCtx,f.type,f.size,q,q,f.borderThickness),(s[e].indexLabel||h.indexLabel||s[e].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"scatter",dataPoint:s[e],dataSeries:h,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/ +2,x2:g+f.size/2,y2:m+f.size/2},color:null}),q=g,n=m)}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore()); +b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderCandlestick=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=0,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,g=this.options.dataPointMaxWidth? +this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*m.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&&e>g&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,g));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&gg&&(k=g);b.save();r&&c.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(c.beginPath(),c.rect(m.x1,m.y1,m.width,m.height),c.clip());for(var p=0;pa.axisX.dataInfo.viewPortMax)&&!u(C[l].y)&&C[l].y.length&& +"number"===typeof C[l].y[0]&&"number"===typeof C[l].y[1]&&"number"===typeof C[l].y[2]&&"number"===typeof C[l].y[3]){w=a.axisX.convertValueToPixel(f);h=a.axisY.convertValueToPixel(C[l].y[0]);s=a.axisY.convertValueToPixel(C[l].y[1]);q=a.axisY.convertValueToPixel(C[l].y[2]);n=a.axisY.convertValueToPixel(C[l].y[3]);var z=w-k/2<<0,y=z+k<<0,g=t.options.fallingColor?t.fallingColor:t._colorSet[0],e=C[l].color?C[l].color:t._colorSet[0],A=Math.round(Math.max(1,0.15*k)),D=0===A%2?0:0.5,aa=t.dataPointIds[l]; +this._eventManager.objectMap[aa]={id:aa,objectType:"dataPoint",dataSeriesIndex:v,dataPointIndex:l,x1:z,y1:h,x2:y,y2:s,x3:w,y3:q,x4:w,y4:n,borderThickness:A,color:e};b.strokeStyle=e;b.beginPath();b.lineWidth=A;c.lineWidth=Math.max(A,4);"candlestick"===t.type?(b.moveTo(w-D,s),b.lineTo(w-D,Math.min(h,n)),b.stroke(),b.moveTo(w-D,Math.max(h,n)),b.lineTo(w-D,q),b.stroke(),ea(b,z,Math.min(h,n),y,Math.max(h,n),C[l].y[0]<=C[l].y[3]?t.risingColor:g,A,e,x,x,!1,!1,t.fillOpacity),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w- +D,s),c.lineTo(w-D,Math.min(h,n)),c.stroke(),c.moveTo(w-D,Math.max(h,n)),c.lineTo(w-D,q),c.stroke(),ea(c,z,Math.min(h,n),y,Math.max(h,n),e,0,null,!1,!1,!1,!1))):"ohlc"===t.type&&(b.moveTo(w-D,s),b.lineTo(w-D,q),b.stroke(),b.beginPath(),b.moveTo(w,h),b.lineTo(z,h),b.stroke(),b.beginPath(),b.moveTo(w,n),b.lineTo(y,n),b.stroke(),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w-D,s),c.lineTo(w-D,q),c.stroke(),c.beginPath(),c.moveTo(w,h),c.lineTo(z,h),c.stroke(),c.beginPath(),c.moveTo(w,n),c.lineTo(y,n),c.stroke())); +(C[l].indexLabel||t.indexLabel||C[l].indexLabelFormatter||t.indexLabelFormatter)&&this._indexLabels.push({chartType:t.type,dataPoint:C[l],dataSeries:t,point:{x:z+(y-z)/2,y:a.axisY.reversed?q:s},direction:1,bounds:{x1:z,y1:Math.min(s,q),x2:y,y2:Math.max(s,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas, +0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderBoxAndWhisker=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e= +null,g=this.plotArea,m=0,l,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*g.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&& +e>m&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(k=m);b.save();r&&c.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(c.beginPath(),c.rect(g.x1,g.y1,g.width,g.height),c.clip());for(var p=!1,p=!!a.axisY.reversed,v=0;va.axisX.dataInfo.viewPortMax)&&!u(x[m].y)&&x[m].y.length&&"number"===typeof x[m].y[0]&&"number"===typeof x[m].y[1]&&"number"===typeof x[m].y[2]&&"number"===typeof x[m].y[3]&&"number"===typeof x[m].y[4]&&5===x[m].y.length){l=a.axisX.convertValueToPixel(f);w=a.axisY.convertValueToPixel(x[m].y[0]);h=a.axisY.convertValueToPixel(x[m].y[1]);s=a.axisY.convertValueToPixel(x[m].y[2]); +q=a.axisY.convertValueToPixel(x[m].y[3]);n=a.axisY.convertValueToPixel(x[m].y[4]);var y=l-k/2<<0,A=l+k/2<<0,e=x[m].color?x[m].color:C._colorSet[0],D=Math.round(Math.max(1,0.15*k)),aa=0===D%2?0:0.5,T=x[m].whiskerColor?x[m].whiskerColor:x[m].color?C.whiskerColor?C.whiskerColor:x[m].color:C.whiskerColor?C.whiskerColor:e,Y="number"===typeof x[m].whiskerThickness?x[m].whiskerThickness:"number"===typeof C.options.whiskerThickness?C.whiskerThickness:D,ca=x[m].whiskerDashType?x[m].whiskerDashType:C.whiskerDashType, +da=u(x[m].whiskerLength)?u(C.options.whiskerLength)?k:C.whiskerLength:x[m].whiskerLength,da="number"===typeof da?0>=da?0:da>=k?k:da:"string"===typeof da?parseInt(da)*k/100>k?k:parseInt(da)*k/100:k,Z=1===Math.round(Y)%2?0.5:0,oa=x[m].stemColor?x[m].stemColor:x[m].color?C.stemColor?C.stemColor:x[m].color:C.stemColor?C.stemColor:e,la="number"===typeof x[m].stemThickness?x[m].stemThickness:"number"===typeof C.options.stemThickness?C.stemThickness:D,G=1===Math.round(la)%2?0.5:0,F=x[m].stemDashType?x[m].stemDashType: +C.stemDashType,E=x[m].lineColor?x[m].lineColor:x[m].color?C.lineColor?C.lineColor:x[m].color:C.lineColor?C.lineColor:e,H="number"===typeof x[m].lineThickness?x[m].lineThickness:"number"===typeof C.options.lineThickness?C.lineThickness:D,I=x[m].lineDashType?x[m].lineDashType:C.lineDashType,K=1===Math.round(H)%2?0.5:0,L=C.upperBoxColor,O=C.lowerBoxColor,Q=u(C.options.fillOpacity)?1:C.fillOpacity,P=C.dataPointIds[m];this._eventManager.objectMap[P]={id:P,objectType:"dataPoint",dataSeriesIndex:t,dataPointIndex:m, +x1:y,y1:w,x2:A,y2:h,x3:l,y3:s,x4:l,y4:q,y5:n,borderThickness:D,color:e,stemThickness:la,stemColor:oa,whiskerThickness:Y,whiskerLength:da,whiskerColor:T,lineThickness:H,lineColor:E};b.save();0=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth: +1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.03*this.width;var h=a.axisX.dataInfo.minDiff;isFinite(h)||(h=0.3*Math.abs(a.axisX.range));h=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(h)/Math.log(a.axisX.range):Math.abs(h)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&& +(this.dataPointMinWidth&&mm&&(h=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var s=0;sa.axisX.dataInfo.viewPortMax)&&!u(f[g].y)&&f[g].y.length&&"number"===typeof f[g].y[0]&&"number"===typeof f[g].y[1]){c=a.axisX.convertValueToPixel(w);m=a.axisY.convertValueToPixel(f[g].y[0]);l=a.axisY.convertValueToPixel(f[g].y[1]);var p=a.axisX.reversed?c+a.plotType.totalDataSeries*h/2-(a.previousDataSeriesCount+s)*h<<0:c-a.plotType.totalDataSeries*h/2+(a.previousDataSeriesCount+ +s)*h<<0,v=a.axisX.reversed?p-h<<0:p+h<<0,c=f[g].color?f[g].color:n._colorSet[g%n._colorSet.length];if(m>l){var t=m;m=l;l=t}t=n.dataPointIds[g];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:q,dataPointIndex:g,x1:p,y1:m,x2:v,y2:l};ea(b,p,m,v,l,c,0,c,k,k,!1,!1,n.fillOpacity);c=N(t);r&&ea(this._eventManager.ghostCtx,p,m,v,l,c,0,null,!1,!1,!1,!1);if(f[g].indexLabel||n.indexLabel||f[g].indexLabelFormatter||n.indexLabelFormatter)this._indexLabels.push({chartType:"rangeColumn", +dataPoint:f[g],dataSeries:n,indexKeyword:0,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?l:m},direction:f[g].y[1]>=f[g].y[0]?-1:1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c}),this._indexLabels.push({chartType:"rangeColumn",dataPoint:f[g],dataSeries:n,indexKeyword:1,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?m:l},direction:f[g].y[1]>=f[g].y[0]?1:-1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation= +"source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderError= +function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=a.axisY._position?"left"===a.axisY._position||"right"===a.axisY._position?!1:!0:!1;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=!1,m=this.plotArea,l=0,w,h,s,q,n,f,k,p=a.axisX.dataInfo.minDiff;isFinite(p)||(p=0.3*Math.abs(a.axisX.range));b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(m.x1, +m.y1,m.width,m.height),this._eventManager.ghostCtx.clip());for(var v=0,t=0;tl&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,l));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ll&&(t=l);if(0=T.length?0:T.length>=t?t:T.length:"string"===typeof T.length?parseInt(T.length)*t/100>t?t:parseInt(T.length)*t/100>t:t;T.thickness="number"===typeof T.thickness?0>T.thickness?0:Math.round(T.thickness):2;var Y={color:y[l].stemColor?y[l].stemColor:y[l].color?z.stemColor?z.stemColor:y[l].color:z.stemColor?z.stemColor:e,thickness:y[l].stemThickness?y[l].stemThickness:z.stemThickness,dashType:y[l].stemDashType? +y[l].stemDashType:z.stemDashType};Y.thickness="number"===typeof Y.thickness?0>Y.thickness?0:Math.round(Y.thickness):2;y[l].getTime?k=y[l].x.getTime():k=y[l].x;if(!(ka.axisX.dataInfo.viewPortMax)&&!u(y[l].y)&&y[l].y.length&&"number"===typeof y[l].y[0]&&"number"===typeof y[l].y[1]){var ca=a.axisX.convertValueToPixel(k);c?h=ca:w=ca;ca=a.axisY.convertValueToPixel(y[l].y[0]);c?s=ca:n=ca;ca=a.axisY.convertValueToPixel(y[l].y[1]);c?q=ca:f=ca;c?(n=a.axisX.reversed?h+(A?v: +1)*t/2-(A?D-1:0)*t<<0:h-(A?v:1)*t/2+(A?D-1:0)*t<<0,f=a.axisX.reversed?n-t<<0:n+t<<0):(s=a.axisX.reversed?w+(A?v:1)*t/2-(A?D-1:0)*t<<0:w-(A?v:1)*t/2+(A?D-1:0)*t<<0,q=a.axisX.reversed?s-t<<0:s+t<<0);!c&&n>f&&(ca=n,n=f,f=ca);c&&s>q&&(ca=s,s=q,q=ca);ca=z.dataPointIds[l];this._eventManager.objectMap[ca]={id:ca,objectType:"dataPoint",dataSeriesIndex:x,dataPointIndex:l,x1:Math.min(s,q),y1:Math.min(n,f),x2:Math.max(q,s),y2:Math.max(f,n),isXYSwapped:c,stemProperties:Y,whiskerProperties:T};E(b,Math.min(s,q), +Math.min(n,f),Math.max(q,s),Math.max(f,n),e,T,Y,c);r&&E(this._eventManager.ghostCtx,s,n,q,f,e,T,Y,c);if(y[l].indexLabel||z.indexLabel||y[l].indexLabelFormatter||z.indexLabelFormatter)this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:0,point:{x:c?y[l].y[1]>=y[l].y[0]?s:q:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?f:n},direction:y[l].y[1]>=y[l].y[0]?-1:1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c}), +this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:1,point:{x:c?y[l].y[1]>=y[l].y[0]?q:s:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?n:f},direction:y[l].y[1]>=y[l].y[0]?1:-1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height), +a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx: +d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0;var s=a.axisX.dataInfo.minDiff;isFinite(s)||(s=0.3*Math.abs(a.axisX.range));s=this.options.dataPointWidth?this.dataPointWidth:0.9* +(e.height*(a.axisX.logarithmic?Math.log(s)/Math.log(a.axisX.range):Math.abs(s)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(s=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(), +this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var q=0;qa.axisX.dataInfo.viewPortMax)&&!u(k[g].y)&&k[g].y.length&&"number"===typeof k[g].y[0]&&"number"===typeof k[g].y[1]){m=a.axisY.convertValueToPixel(k[g].y[0]); +l=a.axisY.convertValueToPixel(k[g].y[1]);w=a.axisX.convertValueToPixel(h);w=a.axisX.reversed?w+a.plotType.totalDataSeries*s/2-(a.previousDataSeriesCount+q)*s<<0:w-a.plotType.totalDataSeries*s/2+(a.previousDataSeriesCount+q)*s<<0;var v=a.axisX.reversed?w-s<<0:w+s<<0;m>l&&(c=m,m=l,l=c);c=k[g].color?k[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,w,l,v,c,0,null,p,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g, +x1:m,y1:w,x2:l,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,m,w,l,v,c,0,null,!1,!1,!1,!1);if(k[g].indexLabel||f.indexLabel||k[g].indexLabelFormatter||f.indexLabelFormatter)this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:0,point:{x:k[g].y[1]>=k[g].y[0]?m:l,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?-1:1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c}),this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:1,point:{x:k[g].y[1]>= +k[g].y[0]?l:m,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?1:-1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1, +e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeArea=function(a){function d(){if(C){var a=null;0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width,m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!s.connectNullData||!T)))if(null!==q[f].y&&q[f].y.length&&"number"===typeof q[f].y[0]&&"number"===typeof q[f].y[1]){k=a.axisX.convertValueToPixel(t);p=a.axisY.convertValueToPixel(q[f].y[0]);u=a.axisY.convertValueToPixel(q[f].y[1]);n||T?(s.connectNullData&&!n?(c.setLineDash&&(s.options.nullDataLineDashType||A===s.lineDashType&&s.lineDashType!==s.nullDataLineDashType)&&(w[w.length- +1].newLineDashArray=D,A=s.nullDataLineDashType,c.setLineDash(z)),c.lineTo(k,p),r&&e.lineTo(k,p),w.push({x:k,y:u})):(c.beginPath(),c.moveTo(k,p),C={x:k,y:p},w=[],w.push({x:k,y:u}),r&&(e.beginPath(),e.moveTo(k,p))),T=n=!1):(c.lineTo(k,p),w.push({x:k,y:u}),r&&e.lineTo(k,p),0==f%250&&d());t=s.dataPointIds[f];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:h,dataPointIndex:f,x1:k,y1:p,y2:u};fq[f].y[1]===a.axisY.reversed?-1:1,color:x}),this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:1,point:{x:k, +y:u},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?1:-1,color:x})}else T||n||d(),T=!0;d();ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1, +m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderRangeSplineArea=function(a){function d(a,b){var d=v(u,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width, +m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!f)))if(null!==k[q].y&&k[q].y.length&&"number"===typeof k[q].y[0]&&"number"===typeof k[q].y[1]){n=a.axisX.convertValueToPixel(n);f=a.axisY.convertValueToPixel(k[q].y[0]);p=a.axisY.convertValueToPixel(k[q].y[1]);var E=h.dataPointIds[q];this._eventManager.objectMap[E]={id:E,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:q, +x1:n,y1:f,y2:p};u[u.length]={x:n,y:f};z[z.length]={x:n,y:p};q=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx,e=null,g=this.plotArea,m=0,l,k,h,s,q=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),m=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;k=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width,0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0;var n= +a.axisX.dataInfo.minDiff;isFinite(n)||(n=0.3*Math.abs(a.axisX.range));n=this.options.dataPointWidth?this.dataPointWidth:0.6*(g.width*(a.axisX.logarithmic?Math.log(n)/Math.log(a.axisX.range):Math.abs(n)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&m>k&&(m=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,k));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&kk&&(n=k);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.clip());for(var f=0;fh&&(e=k,k=h,h=e);a.axisY.reversed&&(e=k,k=h,h=e);e=u.dataPointIds[m];this._eventManager.objectMap[e]={id:e,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:m,x1:l,y1:k,x2:F,y2:h}; +var T=v[m].color?v[m].color:0v[m].y===a.axisY.reversed?1:-1,bounds:{x1:l,y1:Math.min(k,h),x2:F,y2:Math.max(k,h)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height), +b.clearRect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};var ja=function(a,d,b,c,e,g,m,l,k){if(!(0>b)){"undefined"===typeof l&&(l=1);if(!r){var h=Number((m%(2*Math.PI)).toFixed(8));Number((g%(2*Math.PI)).toFixed(8))===h&&(m-=1E-4)}a.save();a.globalAlpha=l;"pie"===e?(a.beginPath(),a.moveTo(d.x,d.y),a.arc(d.x,d.y,b,g,m,!1),a.fillStyle=c,a.strokeStyle= +"white",a.lineWidth=2,a.closePath(),a.fill()):"doughnut"===e&&(a.beginPath(),a.arc(d.x,d.y,b,g,m,!1),0<=k&&a.arc(d.x,d.y,k*b,m,g,!0),a.closePath(),a.fillStyle=c,a.strokeStyle="white",a.lineWidth=2,a.fill());a.globalAlpha=1;a.restore()}};p.prototype.renderPie=function(a){function d(){if(h&&s){for(var a=0,b=0,c=0,e=0,d=0;dMath.PI/2-t&&m.midAngle +m.midAngle)c=d;a++}else if(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t){if(0===b||f[e].midAngle>m.midAngle)e=d;b++}m.hemisphere=g>Math.PI/2&&g<=3*Math.PI/2?"left":"right";m.indexLabelTextBlock=new ka(k.plotArea.ctx,{fontSize:m.indexLabelFontSize,fontFamily:m.indexLabelFontFamily,fontColor:m.indexLabelFontColor,fontStyle:m.indexLabelFontStyle,fontWeight:m.indexLabelFontWeight,horizontalAlign:"left",backgroundColor:m.indexLabelBackgroundColor,maxWidth:m.indexLabelMaxWidth,maxHeight:m.indexLabelWrap? +5*m.indexLabelFontSize:1.5*m.indexLabelFontSize,text:m.indexLabelText,padding:0,textBaseline:"top"});m.indexLabelTextBlock.measureText()}l=g=0;q=!1;for(d=0;dMath.PI/2-t&&m.midAngle3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t)&&(l<=b/2&&!q?(m.hemisphere="left",l++):(m.hemisphere="right",q=!0))}}function b(a){var b= +k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);for(b=0;bc){var d=0.07*A*Math.cos(f[b].midAngle),g=0.07*A*Math.sin(f[b].midAngle),m=!1;if(s[b].exploded){if(1E-9a.indexLabelTextBlock.y?d-e:c-f}function e(a){for(var b=null,e=1;ec(f[b],f[a])||("right"===f[a].hemisphere?f[b].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y:f[b].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y)))break;else b=null;return b}function g(a,b,d){d=(d||0)+1;if(1E3< +d)return 0;b=b||0;var m=0,h=x.y-1*r,l=x.y+1*r;if(0<=a&&ab&&n.indexLabelTextBlock.yl)return 0;var k=0,q=0,q=k=k=0;0>b?n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2>h&&n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+bl&&(b=n.indexLabelTextBlock.y+ +n.indexLabelTextBlock.height/2+b-l);b=n.indexLabelTextBlock.y+b;h=0;h="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2));q=x.x+A*Math.cos(n.midAngle);k=x.y+A*Math.sin(n.midAngle);k=Math.sqrt(Math.pow(h-q,2)+Math.pow(b-k,2));q=Math.acos(A/r);k=Math.acos((r*r+A*A-k*k)/(2*A*r));b=kc(f[h],f[a])||("right"===f[a].hemisphere?f[h].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y:f[h].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y)))break;else h=null;q=h;k=e(a);l=h=0;0>b?(l="right"===n.hemisphere?q:k,m=b,null!==l&&(q=-b,b=n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2-(f[l].indexLabelTextBlock.y+f[l].indexLabelTextBlock.height/2),b-q+h.toFixed(C)&&(m=b>p?-(b-p):-(q-(l-h)))))):0p?b-p:q-(h-l)))));m&&(d=n.indexLabelTextBlock.y+m,b=0,b="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)),n.midAngle>Math.PI/2-t&&n.midAngleh.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x-15:"right"===n.hemisphere&&("left"===a.hemisphere&&b3*Math.PI/2-t&&n.midAngle<3*Math.PI/2+t&&(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"right"===n.hemisphere&&"left"===h.hemisphere&&ba.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x- +15)),n.indexLabelTextBlock.y=d,n.indexLabelTextBlock.x=b,n.indexLabelAngle=Math.atan2(n.indexLabelTextBlock.y-x.y,n.indexLabelTextBlock.x-x.x))}return m}function m(){var a=k.plotArea.ctx;a.fillStyle="grey";a.strokeStyle="grey";a.font="16px Arial";a.textBaseline="middle";for(var b=a=0,d=0,m=!0,b=0;10>b&&(1>b||0z){for(var E=u=0,H=0;Hu?l.indexLabelText="":l.indexLabelTextBlock.maxWidth=0.85*u,0.3*l.indexLabelTextBlock.maxWidthd&&(d=y)),y=y=0,0d&&(d=y)));var K=function(a, +b,c){for(var e=[],d=0;e.push(f[b]),b!==c;b=(b+1+s.length)%s.length);e.sort(function(a,b){return a.y-b.y});for(b=0;bz){n=t.indexLabelTextBlock.x;var k=t.indexLabelTextBlock.y-t.indexLabelTextBlock.height/ +2,w=t.indexLabelTextBlock.y+t.indexLabelTextBlock.height/2,p=h.indexLabelTextBlock.y-h.indexLabelTextBlock.height/2,u=h.indexLabelTextBlock.x+h.indexLabelTextBlock.width,r=h.indexLabelTextBlock.y+h.indexLabelTextBlock.height/2;n=t.indexLabelTextBlock.x+t.indexLabelTextBlock.widthu+q||k>r+q||wa&&(a=l),m!==a&&(b=m,d+=-z),0===l%Math.max(s.length/10,3)&&(g=!0)):g=!0;g&&(0=a.dataSeriesIndexes.length)){var h= +this.data[a.dataSeriesIndexes[0]],s=h.dataPoints,q=10,n=this.plotArea,f=h.dataPointEOs,p=2,r,v=1.3,t=20/180*Math.PI,C=6,x={x:(n.x2+n.x1)/2,y:(n.y2+n.y1)/2},z=0;a=!1;for(var y=0;ya&&(e=a,d=!0);var g=s[b].color?s[b].color:h._colorSet[b%h._colorSet.length];e>c&&ja(k.plotArea.ctx, +f[b].center,f[b].radius,g,h.type,c,e,h.fillOpacity,f[b].percentInnerRadius);if(d)break}l()},function(){k.disableToolTip=!1;k._animator.animate(0,k.animatedRender?500:0,function(a){b(a);l()})})}}};var ra=function(a,d,b,c){"undefined"===typeof b&&(b=1);0>=Math.round(d.y4-d.y1)||(a.save(),a.globalAlpha=b,a.beginPath(),a.moveTo(Math.round(d.x1),Math.round(d.y1)),a.lineTo(Math.round(d.x2),Math.round(d.y2)),a.lineTo(Math.round(d.x3),Math.round(d.y3)),a.lineTo(Math.round(d.x4),Math.round(d.y4)),"undefined"!== +d.x5&&(a.lineTo(Math.round(d.x5),Math.round(d.y5)),a.lineTo(Math.round(d.x6),Math.round(d.y6))),a.closePath(),a.fillStyle=c?c:d.color,a.fill(),a.globalAplha=1,a.restore())};p.prototype.renderFunnel=function(a){function d(){for(var a=0,b=[],c=0;ck?(k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=0==k?0:a/k,h+=a/k,m=!0):(n=(Math.abs(ba)*b-Math.sqrt(k))/2,k=b-2*n/Math.abs(ba),h+=n,h>d&&(h-=n, +k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=a/k,h+=a/k,m=!0),b=k)),e.push(n);return e}function c(){if(t&&C){for(var a,b,c,e,d,g,l,h,m,n,k,q,s,w,p=[],B=[],x={percent:null,total:null},v=null,y=0;yp[y]&&(p[y]=y!==fa?t.reversed?P[y].x3-P[y].x4:P[y].x2-P[y].x1:P[y].x2-P[y].x1,p[y]/=2));s=b.indexLabelMaxWidth?b.indexLabelMaxWidth:t.options.indexLabelMaxWidth?t.indexLabelMaxWidth:p[y];if(s>p[y]||0>s)s=p[y];B[y]="inside"===t.indexLabelPlacement?P[y].height:!1;x=z.getPercentAndTotal(t,b);if(t.indexLabelFormatter||b.indexLabelFormatter)v={chart:z.options,dataSeries:t,dataPoint:b,total:x.total,percent:x.percent};b=b.indexLabelFormatter?b.indexLabelFormatter(v):b.indexLabel? +z.replaceKeywordsWithValue(b.indexLabel,b,t,y):t.indexLabelFormatter?t.indexLabelFormatter(v):t.indexLabel?z.replaceKeywordsWithValue(t.indexLabel,b,t,y):b.label?b.label:"";0>=n&&(n=0);1E3>s&&1E3-sl?l:t.indexLabelMaxWidth:l,h=J.length-1;0<=h;h--){g=C[J[h].id];c=J[h];e=c.textBlock;b=(a=n(h)b.y&&(d=!0);c=g.indexLabelMaxWidth||l;if(c>l||0>c)c=l;f.push(c)}if(d)for(h=J.length-1;0<=h;h--)a=P[h],J[h].textBlock.maxWidth= +f[f.length-(h+1)],J[h].textBlock.measureText(),J[h].textBlock.x=L-l,c=J[h].textBlock.heightpa+D&&(J[h].textBlock.y=pa+D-J[h].height),J[h].textBlock.ywa+D&&(J[h].textBlock.y=wa+D-J[h].height))}function g(){var a,b,c,e;if("inside"!==t.indexLabelPlacement)for(var d=0;dDa?f(c).x2+1:(a.x2+a.x3)/2+1:(a.x2+a.x3)/2+1:"undefined"!==typeof a.x5?cpa+D&&(J[d].textBlock.y=pa+D-J[d].height),J[d].textBlock.ywa+D&&(J[d].textBlock.y=wa+D-J[d].height)));else for(d=0;d=c?(b=d!=fa?(a.x4+a.x3)/2-e/2:(a.x5+a.x4)/2-e/2,c=d!=fa?(a.y1+a.y3)/2-c/2:(a.y1+a.y4)/2-c/2,J[d].textBlock.x=b, +J[d].textBlock.y=c):J[d].isDirty=!0)}function m(){function a(b,c){var d;if(0>b||b>=J.length)return 0;var e,f=J[b].textBlock;if(0>c){c*=-1;e=q(b);d=l(e,b);if(d>=c)return f.y-=c,c;if(0==b)return 0=c)return f.y+=c,c;if(b==P.length-1)return 0e)&&(l=n(s),!(l>=J.length-1)&&J[s].textBlock.y+J[s].height+ga>J[l].textBlock.y&&(J[s].textBlock.y=J[s].textBlock.y+J[s].height-e>e-J[s].textBlock.y?e+1:e-J[s].height-1))}for(l=P.length-1;0e&&(e=0,J[e].isDirty))break;if(J[l].textBlock.y=f){f=0;h+=J[f].height;break}e=q(f); +if(0>e){f=0;h+=J[f].height;break}}if(f!=l){g=J[f].textBlock.y;a-=g;a=h-a;g=c(a,d,f);break}}}return g}function c(a,b,d){var e=[],f=0,g=0;for(a=Math.abs(a);d<=b;d++)e.push(P[d]);e.sort(function(a,b){return a.height-b.height});for(d=0;d+m.y.toFixed(6))&&(d=g.y+d+ga-m.y,e=a(w,-d),ea?t.reversed?wa-D:pa-D:J[a].textBlock.y+J[a].height+ga)}function k(a,b,c){var d,e,f,l=[],m=D,n=[];-1!==b&&(0<=W.indexOf(b)?(e=W.indexOf(b),W.splice(e,1)):(W.push(b),W=W.sort(function(a,b){return a-b})));if(0===W.length)l= +ia;else{e=D*(1!=W.length||0!=W[0]&&W[0]!=P.length-1?2:1)/h();for(var q=0;qn&&(n*=-1),c.y1+=b-n[d],c.y2+=b-n[d],c.y3+=b-n[d],c.y4+=b-n[d],c.y5&&(c.y5+=b-n[d],c.y6+=b-n[d]),n[d]=b}};a._animator.animate(0,c,function(c){var d=a.plotArea.ctx||a.ctx;ja=!0;d.clearRect(x.x1,x.y1,x.x2-x.x1,x.y2-x.y1);d.fillStyle=a.backgroundColor;d.fillRect(x.x1,x.y1,x.width,x.height);w.changeSection(c,b);var e={};e.dataSeries=t;e.dataPoint=t.reversed?t.dataPoints[C.length-1-b]:t.dataPoints[b];e.index=t.reversed?C.length-1-b:b;a.toolTip.highlightObjects([e]); +for(e=0;ea){b=P[c];break}return b?(a=b.y6?a>b.y6?b.x3+(b.x4-b.x3)/(b.y4-b.y3)*(a-b.y3):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2), +{x1:a,x2:a}):-1}function p(a){for(var b=0;b=a.dataSeriesIndexes.length)){for(var t=this.data[a.dataSeriesIndexes[0]],C=t.dataPoints,x=this.plotArea,D=0.025*x.width,y=0.01*x.width,A=0,F=x.height-2*D,E=Math.min(x.width-2*y,2.8*x.height),H=!1,I=0;IF?N=F:0>=N&&(N=0),G>a?G=a-0.5:0>=G&&(G=0)):"pyramid"===t.type&&(G=N=0,t.reversed=t.reversed?!1:!0);var y=I+a/2,$=I,V=I+a,pa=t.reversed?Z:O,K=y-G/2,ea=y+G/2,Da=t.reversed?O+N:Z- +N,wa=t.reversed?O:Z;a=[];var y=[],P=[],E=[],X=O,fa,ba=(Da-pa)/(K-$),ha=-ba,I="area"===(t.valueRepresents?t.valueRepresents:"height")?b():d();if(-1!==I){if(t.reversed)for(E.push(X),G=I.length-1;0a&&(A=a));for(G=0;G\n');c.document.close();setTimeout(function(){c.focus();c.print();setTimeout(function(){b._canvasJSContainer.removeChild(d)},1E3)},500)};p.prototype.getPercentAndTotal=function(a,d){var b=null,c=null, +e=null;if(0<=a.type.indexOf("stacked"))c=0,b=d.x.getTime?d.x.getTime():d.x,b in a.plotUnit.yTotals&&(c=a.plotUnit.yTotals[b],e=isNaN(d.y)?0:100*(d.y/c));else if("pie"===a.type||"doughnut"===a.type||"funnel"===a.type||"pyramid"===a.type){for(b=c=0;b=m||"undefined"=== +typeof m||0>=v||"undefined"===typeof v)){if("horizontal"===this.orientation){n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:v,maxHeight:this.itemWrap?m:this.lineHeight,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"});n.textBlock.measureText();null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"=== +n.chartType?2*0.1*this.lineHeight:0)));if(!q||q.width+Math.round(n.textBlock.width+r+l+(0===q.width?0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))>g)q={items:[],width:0},h.push(q),this.height+=f,f=0;f=Math.max(f,n.textBlock.height)}else n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:x,maxHeight:!0===this.itemWrap?m:1.5*this.fontSize,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily, +fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"}),n.textBlock.measureText(),null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))),this.height>0,0),this.dataPoints.length):0):(s=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,s=0>0,0),this.dataPoints.length):0));for(;;){g=0a?c.x/a:a/c.x: +Math.abs(c.x-a);qs-e&&s+e>=this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}return d||b.dataPoint.x!==a?d&&null!==b.dataPoint?b:null:b};F.prototype.getDataPointAtXY=function(a,d,b){if(!this.dataPoints||0===this.dataPoints.length||athis.chart.plotArea.x2||dthis.chart.plotArea.y2)return null;b=b||!1;var c=[],e=0,g=0,m=1,l=!1,k=Infinity, +h=0,s=0,q=0;if("none"!==this.chart.plotInfo.axisPlacement)if(q=(this.chart.axisX[0]?this.chart.axisX[0]:this.chart.axisX2[0]).getXValueAt({x:a,y:d}),this.axisX.logarithmic)var n=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),q=1>0,0),this.dataPoints.length):0;else n=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,q=0> +0,0),this.dataPoints.length):0;for(;;){g=0=n.x1&&(a<=n.x2&&d>=n.y1&&d<=n.y2)&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1- +a),Math.abs(n.x2-a),Math.abs(n.y1-d),Math.abs(n.y2-d))}),l=!0);break;case "line":case "stepLine":case "spline":case "area":case "stepArea":case "stackedArea":case "stackedArea100":case "splineArea":case "scatter":var u=na("markerSize",f,this)||4,r=b?20:u,p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0r&&(p=Math.atan2(d-u.y,a-u.x),0>p&&(p+=2*Math.PI),p=Number(((180*(p/Math.PI)%360+360)%360).toFixed(12)),u=Number(((180*(n.startAngle/Math.PI)%360+360)%360).toFixed(12)),r=Number(((180*(n.endAngle/Math.PI)%360+360)%360).toFixed(12)),0===r&&1=r&&0!==f.y&&(r+=360,pu&&pp.y1&&dp.y6?(g=p.x6+(p.x5-p.x6)/(p.y5-p.y6)*(d-p.y6),p=p.x3+(p.x4-p.x3)/(p.y4-p.y3)*(d-p.y3)):(g=p.x1+(p.x6-p.x1)/(p.y6-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)):(g=p.x1+(p.x4-p.x1)/(p.y4-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)),a>g&&a=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y4-n.borderThickness/2&&d<=n.y1+n.borderThickness/ +2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "candlestick":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y2-n.borderThickness/2&&d<=n.y3+n.borderThickness/2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a), +Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "ohlc":if(Math.abs(n.x2-a+n.x1-a)=n.y2&&d<=n.y3||a>=n.x1&&a<=(n.x2+n.x1)/2&&d>=n.y1-n.borderThickness/2&&d<=n.y1+n.borderThickness/2||a>=(n.x1+n.x2)/2&&a<=n.x2&&d>=n.y4-n.borderThickness/2&&d<=n.y4+n.borderThickness/2)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0}if(l||1E3q-e&&q+e>= +this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}a=null;for(d=0;dq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius, +horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle",borderThickness:0}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}f=n;for(b=this.intervalStartPosition;b<=e;b=parseFloat(1E-12>this.interval?this.logarithmic&&this.equidistantInterval?b*Math.pow(this.logarithmBase,this.interval):b+this.interval:(this.logarithmic&&this.equidistantInterval? +b*Math.pow(this.logarithmBase,this.interval):b+this.interval).toFixed(12))){for(;fq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix, +horizontalAlign:"left",backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}}else for(this.intervalStartPosition=this.getLabelStartPoint(new Date(this.viewportMinimum), +this.intervalType,this.interval),e=Ya(new Date(this.viewportMaximum),this.interval,this.intervalType),f=n,b=this.intervalStartPosition;bq[f].endValue;f++);p=a;a=f=q[f].startValue&&a<=q[f].endValue;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:new Date(p),label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:Ca(p,this.valueFormatString,this.chart._cultureInfo), +a=new ka(this.ctx,{x:0,y:0,maxWidth:g,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null, +breaksLabelType:void 0}))}if("bottom"===this._position||"top"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.width*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length-2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.width/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+ +"Duration"]*this.interval,g="undefined"===typeof this.options.labelMaxWidth?0.5*this.chart.width>>0:this.options.labelMaxWidth,this.chart.panEnabled||(m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize);else if("left"===this._position||"right"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.height*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length- +2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.height/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+"Duration"]*this.interval,this.chart.panEnabled||(g="undefined"===typeof this.options.labelMaxWidth?0.3*this.chart.width>>0:this.options.labelMaxWidth),m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize; +for(c=0;cthis.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360)),"bottom"===this._position||"top"===this._position)if(g=0.9*l>>0,n=0,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize= +this.labelFontSize;this.sessionVariables.labelMaxWidth=g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=this.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;bn&&(v=b,n=p.width)}b=0;for(b=this.intervalStartPosition< +this.viewportMinimum?1:0;b>0>2*g&&(this.sessionVariables.labelAngle=-25)):(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle):u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth= +g,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p)):(this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=this.labelWrap);else{if(u(this.options.labelWrap))if(!u(this.options.labelMaxWidth))this.options.labelMaxWidth>0,f=this.labelFontSize,nq&&(q=c-2*g,c>=2*g&&c<2.2*g?(this.sessionVariables.labelMaxWidth=g,u(this.options.labelFontSize)&&12=2.2*g&&c<2.8*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=f):c>=2.8*g&&c<3.2*g?(this.sessionVariables.labelMaxWidth=Math.max(g,n),this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12=3.2*g&&c<3.6*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=this.labelFontSize):c>3.6*g&&c<5*g?(u(this.options.labelFontSize)&&125*g&&(this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelFontSize=f,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=this.labelAngle));else if(v===b&&(0===v&&n+this._labels[v+1].textBlock.measureText().width-2*g>q||v===this._labels.length-1&&n+this._labels[v-1].textBlock.measureText().width-2*g>q||0q&&n+this._labels[v-1].textBlock.measureText().width- +2*g>q))q=0===v?n+this._labels[v+1].textBlock.measureText().width-2*g:n+this._labels[v-1].textBlock.measureText().width-2*g,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p;else if(0===q)for(this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,c=0;c>0>2*g&&(this.sessionVariables.labelAngle=-25))}else(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/ +Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=0!=this.labelAngle?(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)):g,this.sessionVariables.labelMaxHeight=m=this.labelWrap?(h-p*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)):1.5*this.labelFontSize,u(this.options.labelWrap))?u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap= +this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelMaxHeight=c<0.9*l?0.9*l:c,this.sessionVariables.labelWrap=this.labelWrap)):(this.options.labelWrap?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p): +(u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelWrap=this.labelWrap),this.sessionVariables.labelMaxHeight=m)}for(c=0;c>0:this.options.labelMaxWidth,m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize=this.labelFontSize;this.sessionVariables.labelMaxWidth= +g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b>0,l-2*m>n&&(n=l-2*m,l>=2*m&&l<2.4*m?(u(this.options.labelFontSize)&&12=2.4*m&&l<2.8*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelFontSize=this.labelFontSize,this.sessionVariables.labelWrap=!0):l>=2.8*m&&l<3.2*m?(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12< +this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>=3.2*m&&l<3.6*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelFontSize=this.labelFontSize):l>3.6*m&&l<10*m?(u(this.options.labelFontSize)&& +1210*m&&l<50*m&&(u(this.options.labelFontSize)&&12this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,u(this.options.labelMaxWidth)&& +(this.sessionVariables.labelAngle=this.labelAngle))):this.options.labelWrap?(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=g):(this.sessionVariables.labelMaxHeight=m,u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap)}for(c=0;c>0:1.5*this.labelFontSize;if("left"===this._position||"right"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.width>>0:1.5*this.labelFontSize;u(g.labelBackgroundColor)&&(g.labelBackgroundColor="#EEEEEE")}else m="bottom"===this._position||"top"===this._position?0.9*this.chart.width>>0:0.9*this.chart.height>> +0,z=u(g.options.labelWrap)||g.labelWrap?"bottom"===this._position||"top"===this._position?0.8*this.chart.width>>0:0.8*this.chart.height>>0:1.5*this.labelFontSize,u(g.labelBackgroundColor)&&(u(g.startValue)&&0!==g.startValue?g.labelBackgroundColor=r?"transparent":null:g.labelBackgroundColor="#EEEEEE");a=new ka(this.ctx,{x:0,y:0,backgroundColor:g.labelBackgroundColor,borderColor:g.labelBorderColor,borderThickness:g.labelBorderThickness,cornerRadius:g.labelCornerRadius,maxWidth:g.options.labelMaxWidth? +g.options.labelMaxWidth:m,maxHeight:z,angle:this.labelAngle,text:g.labelFormatter?g.labelFormatter({chart:this.chart,axis:this,stripLine:g}):g.label,horizontalAlign:"left",fontSize:"outside"===g.labelPlacement?g.options.labelFontSize?g.labelFontSize:this.labelFontSize:g.labelFontSize,fontFamily:"outside"===g.labelPlacement?g.options.labelFontFamily?g.labelFontFamily:this.labelFontFamily:g.labelFontFamily,fontWeight:"outside"===g.labelPlacement?g.options.labelFontWeight?g.labelFontWeight:this.labelFontWeight: +g.labelFontWeight,fontColor:g.labelFontColor||g.color,fontStyle:"outside"===g.labelPlacement?g.options.labelFontStyle?g.labelFontStyle:this.fontWeight:g.labelFontStyle,textBaseline:"middle"});this._stripLineLabels.push({position:g.value,textBlock:a,effectiveHeight:null,stripLine:g})}};z.prototype.createLabelsAndCalculateWidth=function(){var a=0,d=0;this._labels=[];this._stripLineLabels=[];var b=this.chart.isNavigator?0:5;if("left"===this._position||"right"===this._position){this.createLabels();for(d= +0;d=this.viewportMinimum&&this._stripLineLabels[d].stripLine.value<=this.viewportMaximum)&& +(c=this._stripLineLabels[d].textBlock,e=c.measureText(),g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle)),a=this.viewportMinimum&&this._stripLineLabels[b].stripLine.value<=this.viewportMaximum)&&(d=this._stripLineLabels[b].textBlock,e=d.measureText(),g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)),an[f].viewportMaximum);v++)r[v].endValue=n[f].viewPortMinimum&&(n[f].scaleBreaks.lastBreakIndex=v));for(var z=v=0,t=0,C=0,x=0,D=0,y=0,A,E,F=l=0,H,I,L,r=H=I=L=!1,f=0;fv;){var G=0,R=0,S=0,U=0,W=e=0,K=0,$=0,V=0,X=0,P=0,ba=0;if(b&& +0p.width- +q?p.width-q:g.x2-ba-$);if(a&&0p.width-q?p.width-q:g.x2-ba-$),a[f]._labels&&1k&&(l+=0a[f].labelAngle?A-zk&&(l=E+t/2-k-ba),A-za[f].labelAngle&&0p.width-q?p.width-q:g.x2-ba-$),d[f].lineCoordinates.width=Math.abs(k-m),d[f]._labels&&1v;){V=U=R=S=$=K=W=e=Q=O=G=X=0;if(a&&0p.width-10?p.width-10:g.x2-V-W),b[f].labelAutoFit&&!u(C)&&(0b[f].labelAngle?Math.max(m,C):0===b[f].labelAngle? +Math.max(m,C/2):m),0c[f].chart.width-10?c[f].chart.width-10:g.x2-V-W),c[f]&& +c[f].labelAutoFit&&!u(D)&&(0b[f].chart.height-10?b[f].chart.height-10:g.y2),b[f].lineCoordinates.y1=l-(q[f]+b[f].margin+ +X),b[f].lineCoordinates.y2=l-(q[f]+b[f].margin+X),b[f].bounds={x1:m,y1:l-(q[f]+X+b[f].margin),x2:k,y2:h-(X+b[f].margin),width:k-m,height:q[f]},b[f].title&&(b[f]._titleTextBlock.maxWidth=0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0===b[K].labelAngle?k-U:m);if(c&&0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0=== +b[K].labelAngle?k-V:m);if(c&&0d[g].spacing?0:Math.abs(d[g].spacing/b),this.logarithmic&&(d[g].size=Math.pow(this.logarithmBase,d[g].size))};z.prototype.calculateBreaksInPixels=function(){if(!(this.scaleBreaks&&0>=this.scaleBreaks._appliedBreaks.length)){var a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];a.length&&(this.scaleBreaks.firstBreakIndex=this.scaleBreaks.lastBreakIndex=null);for(var d=0;dthis.conversionParameters.maximum);d++)a[d].endValue< +this.conversionParameters.minimum||(u(this.scaleBreaks.firstBreakIndex)&&(this.scaleBreaks.firstBreakIndex=d),a[d].startValue>=this.conversionParameters.minimum&&(a[d].startPixel=this.convertValueToPixel(a[d].startValue),this.scaleBreaks.lastBreakIndex=d),a[d].endValue<=this.conversionParameters.maximum&&(a[d].endPixel=this.convertValueToPixel(a[d].endValue)))}};z.prototype.renderLabelsTicksAndTitle=function(){var a=this,d=!1,b=0,c=0,e=1,g=0;0!==this.labelAngle&&360!==this.labelAngle&&(e=1.2);if("undefined"=== +typeof this.options.interval){if("bottom"===this._position||"top"===this._position)if(this.logarithmic&&!this.equidistantInterval&&this.labelAutoFit){for(var b=[],e=0!==this.labelAngle&&360!==this.labelAngle?1:1.2,m,l=this.viewportMaximum,k=this.lineCoordinates.width/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||mthis.lineCoordinates.width*e&&this.labelAutoFit&&(d=!0)}if("left"===this._position||"right"===this._position)if(this.logarithmic&& +!this.equidistantInterval&&this.labelAutoFit){for(var b=[],p,l=this.viewportMaximum,k=this.lineCoordinates.height/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||pthis.lineCoordinates.height*e&&this.labelAutoFit&&(d=!0)}}this.logarithmic&&(!this.equidistantInterval&&this.labelAutoFit)&&this._labels.sort(function(a,b){return a.position-b.position});var h=0,q,n;if("bottom"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y+this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y-(this.tickLength+q.textBlock.fontSize/2):n.y+this.tickLength+q.textBlock.fontSize/2):(n.x="inside"===this.labelPlacement?0>this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x-(0>this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0>this.labelAngle?n.y-this.tickLength-5:n.y-this.tickLength-Math.abs(q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle)+5):n.y+this.tickLength+Math.abs(0>this.labelAngle?q.textBlock.width* +Math.sin(Math.PI/180*this.labelAngle)-5:5)),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save(); +a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y-a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y2-this._titleTextBlock.height-3,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("top"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y-this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y+this.labelFontSize/2+this.tickLength+5:n.y-(this.tickLength+q.textBlock.height-q.textBlock.fontSize/2)):(n.x="inside"===this.labelPlacement?0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&& +(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y+a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y1+1,this.titleMaxWidth= +this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("left"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<< +0,c),this.ctx.lineTo(n.x-this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle?(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5):(q.textBlock.y="inside"===this.labelPlacement?n.y:n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness; +a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x+a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x1+1,this._titleTextBlock.y=this.lineCoordinates.height/2+this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("right"=== +this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<<0,c),this.ctx.lineTo(n.x+this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle? +(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width-this.tickLength-5:n.x+this.tickLength+5):(q.textBlock.y="inside"===this.labelPlacement?n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0>this.labelAngle?n.y:n.y-(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.cos(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<< +0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x-a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x2-1,this._titleTextBlock.y=this.lineCoordinates.height/2-this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}g=0;if("inside"===this.labelPlacement)this.chart.addEventListener("dataAnimationIterationEnd", +function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)||(a.ctx.save(),a.ctx.beginPath(),q.textBlock.render(!0),a.ctx.restore())},this);else for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||q.textBlock.render(!0)};z.prototype.renderInterlacedColors=function(){var a=this.chart.plotArea.ctx,d,b,c=this.chart.plotArea, +e=0;d=!0;if(("bottom"===this._position||"top"===this._position)&&this.interlacedColor)for(a.fillStyle=this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(Math.min(b.x,d.x),c.y1,Math.abs(b.x-d.x),Math.abs(c.y1-c.y2)),d=!1):d=!0;else if(("left"===this._position||"right"===this._position)&&this.interlacedColor)for(a.fillStyle= +this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(c.x1,Math.min(b.y,d.y),Math.abs(c.x1-c.x2),Math.abs(d.y-b.y)),d=!1):d=!0;a.beginPath()};z.prototype.renderStripLinesOfThicknessType=function(a){if(this.stripLines&&0this.viewportMaximum||u(h.value)||isNaN(this.range))||l.push(h))}for(c=0;cthis.viewportMaximum||isNaN(this.range))){a=this.getPixelCoordinatesOnAxis(b.position);if("outside"===b.stripLine.labelPlacement)if(h&&(this.ctx.strokeStyle= +h.color,"pixel"===h._thicknessType&&(this.ctx.lineWidth=h.thickness)),"bottom"===this._position){var p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0;this.ctx.beginPath();this.ctx.moveTo(p,a.y<<0);this.ctx.lineTo(p,a.y+this.tickLength<<0);this.ctx.stroke();0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y+=this.tickLength+b.textBlock.fontSize/2):(a.x-=0>this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0,a.y+=this.tickLength+Math.abs(0>this.labelAngle?b.textBlock.width*Math.sin(Math.PI/ +180*this.labelAngle)-5:5))}else"top"===this._position?(p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,this.ctx.beginPath(),this.ctx.moveTo(p,a.y<<0),this.ctx.lineTo(p,a.y-this.tickLength<<0),this.ctx.stroke(),0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y-=this.tickLength+b.textBlock.height):(a.x+=(b.textBlock.height-this.tickLength-this.labelFontSize/2)*Math.sin(Math.PI/180*this.labelAngle)-(0this.labelAngle?a.y:a.y-(b.textBlock.height-b.textBlock.fontSize/ +2-5)*Math.cos(Math.PI/180*this.labelAngle),a.x=0this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/ +2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+=b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y1+b.textBlock.width+3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-b.textBlock.width-3:"center"=== +b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y1+3):"top"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+= +b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+b.textBlock.width+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y2-3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y2- +b.textBlock.width-3):"left"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-b.textBlock.height>this.chart.plotArea.y1?u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3:a.y-b.textBlock.heightthis.chart.plotArea.y1? +u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2-3:a.y-b.textBlock.heightthis.viewportMaximum|| +isNaN(this.range))||a[d].render(this.maskCtx);this.maskCtx.restore()}};z.prototype.renderCrosshair=function(a,d){this.crosshair.render(a,d)};z.prototype.renderGrid=function(){if(this.gridThickness&&0this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(),d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.x<<0)+0.5:d.x<<0,a.moveTo(d,b.y1<<0),a.lineTo(d,b.y2<<0),a.stroke());else if("left"===this._position||"right"===this._position)for(var c=0;cthis.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(), +d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.y<<0)+0.5:d.y<<0,a.moveTo(b.x1<<0,d),a.lineTo(b.x2<<0,d),a.stroke());a.restore()}};z.prototype.renderAxisLine=function(){var a=this.chart.ctx,d=r?this.chart._preRenderCtx:a,b=Math.ceil(this.tickThickness/(this.reversed?-2:2)),c=Math.ceil(this.tickThickness/(this.reversed?2:-2)),e,g;d.save();if("bottom"===this._position||"top"===this._position){if(this.lineThickness){this.reversed?(e=this.lineCoordinates.x2,g=this.lineCoordinates.x1): +(e=this.lineCoordinates.x1,g=this.lineCoordinates.x2);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor?this.lineColor:"black";d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));var m=1===this.lineThickness%2?(this.lineCoordinates.y1<<0)+0.5:this.lineCoordinates.y1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+c;else for(var l= +this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(e,m),d.lineTo(this.scaleBreaks._appliedBreaks[l].startPixel+b,m),e=this.scaleBreaks._appliedBreaks[l].endPixel+c;e&&(d.moveTo(e,m),d.lineTo(g,m));d.stroke()}}else if(("left"===this._position||"right"===this._position)&&this.lineThickness){this.reversed?(e=this.lineCoordinates.y1,g=this.lineCoordinates.y2):(e=this.lineCoordinates.y2,g=this.lineCoordinates.y1);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor; +d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));m=1===this.lineThickness%2?(this.lineCoordinates.x1<<0)+0.5:this.lineCoordinates.x1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+b;else for(l=this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(m,e),d.lineTo(m,this.scaleBreaks._appliedBreaks[l].startPixel+c), +e=this.scaleBreaks._appliedBreaks[l].endPixel+b;e&&(d.moveTo(m,e),d.lineTo(m,g));d.stroke()}r&&(a.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx&&this.chart._breaksCanvasCtx.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),d.clearRect(0,0,this.chart.width,this.chart.height));d.restore()};z.prototype.getPixelCoordinatesOnAxis=function(a){var d={};if("bottom"===this._position||"top"===this._position)d.x=this.convertValueToPixel(a), +d.y=this.lineCoordinates.y1;if("left"===this._position||"right"===this._position)d.y=this.convertValueToPixel(a),d.x=this.lineCoordinates.x2;return d};z.prototype.convertPixelToValue=function(a){if("undefined"===typeof a)return null;var d=0,b=0,c,d=!0,e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b="number"===typeof a?a:"left"===this._position||"right"===this._position?a.y:a.x;if(this.logarithmic){a=c=Math.pow(this.logarithmBase,(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit); +if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;be[b].startValue/this.conversionParameters.minimum){c/=e[b].startValue/this.conversionParameters.minimum;if(ce[b].startValue/e[b-1].endValue){c/=e[b].startValue/e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum){if(1e[b].startValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].startValue/this.conversionParameters.minimum*Math.pow(e[b].size,Math.log(e[b].startValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue))*c,c*=Math.pow(e[b].size,Math.log(this.conversionParameters.minimum/e[b].startValue)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size;d=!1}else break;else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size}else break; +d=a*this.viewportMinimum}else{a=c=(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit;if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b=e[b].size?0:c*(e[b].endValue- +e[b].startValue)/e[b].size;break}else a+=e[b].endValue-this.conversionParameters.minimum-e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue),c-=e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue);d=!1}else if(c>e[b].startValue-this.conversionParameters.minimum){c-=e[b].startValue-this.conversionParameters.minimum;if(ce[b].startValue-e[b-1].endValue){c-=e[b].startValue-e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum)if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue- +e[b].startValue)/e[b].size>e[b].startValue){a=0>=e[b].size?0:c*(e[b].endValue-e[b].startValue)/e[b].size;break}else a+=e[b].startValue-this.conversionParameters.minimum+e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),c+=e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),d=!1;else if(c-1*e[b].size){a+=(e[b].endValue- +e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size;d=!1}else break;else if(c-1*e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size}else break;d=this.conversionParameters.minimum+a}return d};z.prototype.convertValueToPixel=function(a){a=this.getApparentDifference(this.conversionParameters.minimum, +a,a);return this.logarithmic?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*Math.log(a/this.conversionParameters.minimum)/this.conversionParameters.lnLogarithmBase+0.5<<0:"axisX"===this.type?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5<<0:this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5};z.prototype.getApparentDifference=function(a, +d,b,c){var e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];if(this.logarithmic){b=u(b)?d/a:b;for(var g=0;ge[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*e[g].startValue*e[g].size:a>=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*a*Math.pow(e[g].size,Math.log(e[g].endValue/a)/Math.log(e[g].endValue/e[g].startValue)):a<=e[g].startValue&&d<=e[g].endValue?b=b/d*e[g].startValue*Math.pow(e[g].size,Math.log(d/e[g].startValue)/Math.log(e[g].endValue/ +e[g].startValue)):!c&&(a>e[g].startValue&&de[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+e[g].startValue+e[g].size:a>e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+a+e[g].size*(e[g].endValue-a)/(e[g].endValue-e[g].startValue):a<=e[g].startValue&&de[g].startValue&&da[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<= +a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*this.viewportMinimum,b=0a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<=a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+this.viewportMinimum, +b=0this.maxWidth?8:6);var a=Math.max(c,Math.floor(this.maxWidth/a)),e,g,m,c=0;!u(this.options.viewportMinimum)&&(!u(this.options.viewportMaximum)&&this.options.viewportMinimum>=this.options.viewportMaximum)&& +(this.viewportMinimum=this.viewportMaximum=null);if(u(this.options.viewportMinimum)&&!u(this.sessionVariables.newViewportMinimum)&&!isNaN(this.sessionVariables.newViewportMinimum))this.viewportMinimum=this.sessionVariables.newViewportMinimum;else if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(u(this.options.viewportMaximum)&&!u(this.sessionVariables.newViewportMaximum)&&!isNaN(this.sessionVariables.newViewportMaximum))this.viewportMaximum=this.sessionVariables.newViewportMaximum; +else if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(c=0;c=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue)&& +(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue)){this.scaleBreaks._appliedBreaks.splice(c,1);break}if("axisX"===this.type){if(this.dataSeries&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g, +null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0));c=this.getApparentDifference(isNaN(this.viewportMinimum)||null===this.viewportMinimum?e:this.viewportMinimum,isNaN(this.viewportMaximum)||null===this.viewportMaximum?g:this.viewportMaximum,null, +!0);if("axisX"===this.type&&b){this.intervalType||(c/1<=a?(this.interval=1,this.intervalType="millisecond"):c/2<=a?(this.interval=2,this.intervalType="millisecond"):c/5<=a?(this.interval=5,this.intervalType="millisecond"):c/10<=a?(this.interval=10,this.intervalType="millisecond"):c/20<=a?(this.interval=20,this.intervalType="millisecond"):c/50<=a?(this.interval=50,this.intervalType="millisecond"):c/100<=a?(this.interval=100,this.intervalType="millisecond"):c/200<=a?(this.interval=200,this.intervalType= +"millisecond"):c/250<=a?(this.interval=250,this.intervalType="millisecond"):c/300<=a?(this.interval=300,this.intervalType="millisecond"):c/400<=a?(this.interval=400,this.intervalType="millisecond"):c/500<=a?(this.interval=500,this.intervalType="millisecond"):c/(1*S.secondDuration)<=a?(this.interval=1,this.intervalType="second"):c/(2*S.secondDuration)<=a?(this.interval=2,this.intervalType="second"):c/(5*S.secondDuration)<=a?(this.interval=5,this.intervalType="second"):c/(10*S.secondDuration)<=a?(this.interval= +10,this.intervalType="second"):c/(15*S.secondDuration)<=a?(this.interval=15,this.intervalType="second"):c/(20*S.secondDuration)<=a?(this.interval=20,this.intervalType="second"):c/(30*S.secondDuration)<=a?(this.interval=30,this.intervalType="second"):c/(1*S.minuteDuration)<=a?(this.interval=1,this.intervalType="minute"):c/(2*S.minuteDuration)<=a?(this.interval=2,this.intervalType="minute"):c/(5*S.minuteDuration)<=a?(this.interval=5,this.intervalType="minute"):c/(10*S.minuteDuration)<=a?(this.interval= +10,this.intervalType="minute"):c/(15*S.minuteDuration)<=a?(this.interval=15,this.intervalType="minute"):c/(20*S.minuteDuration)<=a?(this.interval=20,this.intervalType="minute"):c/(30*S.minuteDuration)<=a?(this.interval=30,this.intervalType="minute"):c/(1*S.hourDuration)<=a?(this.interval=1,this.intervalType="hour"):c/(2*S.hourDuration)<=a?(this.interval=2,this.intervalType="hour"):c/(3*S.hourDuration)<=a?(this.interval=3,this.intervalType="hour"):c/(6*S.hourDuration)<=a?(this.interval=6,this.intervalType= +"hour"):c/(1*S.dayDuration)<=a?(this.interval=1,this.intervalType="day"):c/(2*S.dayDuration)<=a?(this.interval=2,this.intervalType="day"):c/(4*S.dayDuration)<=a?(this.interval=4,this.intervalType="day"):c/(1*S.weekDuration)<=a?(this.interval=1,this.intervalType="week"):c/(2*S.weekDuration)<=a?(this.interval=2,this.intervalType="week"):c/(3*S.weekDuration)<=a?(this.interval=3,this.intervalType="week"):c/(1*S.monthDuration)<=a?(this.interval=1,this.intervalType="month"):c/(2*S.monthDuration)<=a?(this.interval= +2,this.intervalType="month"):c/(3*S.monthDuration)<=a?(this.interval=3,this.intervalType="month"):c/(6*S.monthDuration)<=a?(this.interval=6,this.intervalType="month"):(this.interval=c/(1*S.yearDuration)<=a?1:c/(2*S.yearDuration)<=a?2:c/(4*S.yearDuration)<=a?4:Math.floor(z.getNiceNumber(c/(a-1),!0)/S.yearDuration),this.intervalType="year"));if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=e-m/2;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum= +g+m/2;d?this.autoValueFormatString="MMM DD YYYY HH:mm":"year"===this.intervalType?this.autoValueFormatString="YYYY":"month"===this.intervalType?this.autoValueFormatString="MMM YYYY":"week"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"day"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"hour"===this.intervalType?this.autoValueFormatString="hh:mm TT":"minute"===this.intervalType?this.autoValueFormatString="hh:mm TT":"second"===this.intervalType?this.autoValueFormatString= +"hh:mm:ss TT":"millisecond"===this.intervalType&&(this.autoValueFormatString="fff'ms'");this.valueFormatString||(this.valueFormatString=this.autoValueFormatString)}else{this.intervalType="number";c=z.getNiceNumber(c,!1);this.interval=this.options&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g,null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)):(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0)),Math.abs(this.getApparentDifference(e,g,null,!0)),"axisX"===this.type&&b){this.valueType="dateTime";if(null===this.minimum||isNaN(this.minimum))this.minimum=e-m/2;if(null===this.maximum||isNaN(this.maximum))this.maximum=g+m/2}else this.intervalType=this.valueType="number",null===this.minimum&&(this.minimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval,this.minimum=Math.min(this.minimum, +null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?Infinity:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval,this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?-Infinity:this.sessionVariables.viewportMaximum)),0===this.maximum&&0===this.minimum&&(0===this.options.minimum?this.maximum+=10:0=== +this.options.maximum&&(this.minimum-=10));u(this.sessionVariables.newViewportMinimum)&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));u(this.sessionVariables.newViewportMaximum)&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.range=this.viewportMaximum-this.viewportMinimum;this.intervalStartPosition="axisX"===this.type&&b?this.getLabelStartPoint(new Date(this.viewportMinimum),this.intervalType,this.interval):Math.floor((this.viewportMinimum+0.2*this.interval)/ +this.interval)*this.interval;this.valueFormatString||(this.valueFormatString=z.generateValueFormatString(this.range,2))}};z.prototype.calculateLogarithmicAxisParameters=function(){var a=this.chart.layoutManager.getFreeSpace(),d=Math.log(this.logarithmBase),b;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?500>this.maxWidth?7:Math.max(7,Math.floor(this.maxWidth/100)):Math.max(Math.floor(this.maxWidth/ +50),3),c,e,g,m;m=1;if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(m=0;m=this.scaleBreaks._appliedBreaks[m].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[m].startValue|| +!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue)&&(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue)){this.scaleBreaks._appliedBreaks.splice(m,1);break}"axisX"===this.type? +(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,1===e/c&&(m=Math.pow(this.logarithmBase,"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin, +e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,0>=c&&!isFinite(e)?(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1):0>=c?c=e:isFinite(e)||(e=c),1===c&&1===e?(e*=this.logarithmBase-1/this.logarithmBase,c=1):1===e/c?(m=Math.min(e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),e*=m,c/=m):c>e?(m=Math.min(c/e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase, +0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&1e&&(e=1));m=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)/(isNaN(this.viewportMinimum)||null=== +this.viewportMinimum?c:this.viewportMinimum);var l=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)-(isNaN(this.viewportMinimum)||null===this.viewportMinimum?c:this.viewportMinimum);this.intervalType="number";m=Math.pow(this.logarithmBase,z.getNiceNumber(Math.abs(Math.log(m)/d),!1));this.options&&0this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(c)||isFinite(e)?1===c&&1===e?(e*=this.logarithmBase,c/=this.logarithmBase):1===e/c?(m=Math.pow(this.logarithmBase,this.interval),e*=m,c/=m):c>e?(m= +Math.min(0.01*(c/e),5),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)):(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.minimum||isNaN(this.minimum))&&1e&&(e=1)),this.intervalType="number",null===this.minimum&&(this.minimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval)),this.minimum=Math.min(this.minimum,null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?"undefined"===typeof this.sessionVariables.newViewportMinimum?Infinity:this.sessionVariables.newViewportMinimum:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum= +"axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval)),this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?"undefined"===typeof this.sessionVariables.newViewportMaximum?0:this.sessionVariables.newViewportMaximum:this.sessionVariables.viewportMaximum)),1===this.maximum&&1===this.minimum&&(1===this.options.minimum?this.maximum*=this.logarithmBase-1/this.logarithmBase: +1===this.options.maximum&&(this.minimum/=this.logarithmBase-1/this.logarithmBase));this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum);this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum);this.viewportMinimum>this.viewportMaximum&&(!this.options.viewportMinimum&&!this.options.minimum||this.options.viewportMaximum||this.options.maximum?this.options.viewportMinimum||this.options.minimum||!this.options.viewportMaximum&&!this.options.maximum||(this.viewportMinimum=this.minimum= +(this.options.viewportMaximum||this.options.maximum)/Math.pow(this.logarithmBase,2*Math.ceil(this.interval))):this.viewportMaximum=this.maximum=this.options.viewportMinimum||this.options.minimum);c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval);this.range=this.viewportMaximum/this.viewportMinimum;this.noTicks=a;if(!this.options.interval&&this.rangethis.viewportMaximum||3>a?2:3)){for(d=Math.floor(this.viewportMinimum/ +b+0.5)*b;dthis.interval&&(this.interval=b,c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval))),this.equidistantInterval=!0,this.intervalStartPosition=c;if(!this.valueFormatString&&(this.valueFormatString="#,##0.##",1>this.viewportMinimum)){d=Math.floor(Math.abs(Math.log(this.viewportMinimum)/ +Math.LN10))+2;if(isNaN(d)||!isFinite(d))d=2;if(2a&&(c+=Math.floor(Math.abs(Math.log(a)/Math.LN10)),isNaN(c)||!isFinite(c))&&(c=d);for(var e=0;eb?1>=c?1:5>=c?5:10:Math.max(Math.floor(c),1);return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.getNiceNumber= +function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=d?1.5>c?1:3>c?2:7>c?5:10:1>=c?1:2>=c?2:5>=c?5:10;return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.prototype.getLabelStartPoint=function(){var a=S[this.intervalType+"Duration"]*this.interval,a=new Date(Math.floor(this.viewportMinimum/a)*a);if("millisecond"!==this.intervalType)if("second"===this.intervalType)0=a||"bottom"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(c,l),this.ctx.lineTo(m,l),this.ctx.lineTo(m,e);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(l-h)/a/3;for(var n=0;n=a||"right"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(m,e),this.ctx.lineTo(m,l), +this.ctx.lineTo(c,l);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(m-k)/a/3;for(n=0;nthis.parent.range?2:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range? +1:0):50this.parent.range?2:10>this.parent.range?1:0);this.valueFormatString=z.generateValueFormatString(this.parent.range,h)}var l=null===this.opacity?1:this.opacity,h=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness),p=this.chart.overlaidCanvasCtx,q=p.globalAlpha;p.globalAlpha=l;p.beginPath();p.strokeStyle=this.color;p.lineWidth=h;p.save();this.labelFontSize= +u(this.options.labelFontSize)?this.parent.labelFontSize:this.labelFontSize;if("left"===this.parent._position||"right"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?this.parent.bounds.x2-this.parent.bounds.x1:this.labelMaxWidth,this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?3*this.chart.height:2*this.labelFontSize;else if("top"===this.parent._position||"bottom"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?3*this.chart.width:this.labelMaxWidth, +this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?this.parent.bounds.height:2*this.labelFontSize;0this.chart.bounds.x2?l.x=this.chart.bounds.x2-l.width:l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}}else if("bottom"===this.parent._position||"top"===this.parent._position){n=this.parent.convertPixelToValue({x:a});for(r=0;rthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"=== +this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}m=null;("bottom"===this.parent._position||"top"===this.parent._position)&&(b>=this.parent.convertValueToPixel(this.parent.viewportMinimum)&&c<=this.parent.convertValueToPixel(this.parent.viewportMaximum))&&(0=this.parent.convertValueToPixel(this.parent.viewportMaximum)&& +e<=this.parent.convertValueToPixel(this.parent.viewportMinimum))&&(0this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x1-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}else{if("bottom"===this.parent._position||"top"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)? +ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label,l.x=b-l.measureText().width/2,l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width),l.xthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2),"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2);0(new Date).getTime()-this._lastUpdated||(this._lastUpdated=(new Date).getTime(), +this.chart.resetOverlayedCanvas(),this._updateToolTip(a,d))};$.prototype._updateToolTip=function(a,d,b){b="undefined"===typeof b?!0:b;this.container||this._initialize();this.enabled||this.hide();if(!this.chart.disableToolTip){if("undefined"===typeof a||"undefined"===typeof d){if(isNaN(this._prevX)||isNaN(this._prevY))return;a=this._prevX;d=this._prevY}else this._prevX=a,this._prevY=d;var c=null,e=null,g=[],k=0;if(this.shared&&this.enabled&&"none"!==this.chart.plotInfo.axisPlacement){if("xySwapped"=== +this.chart.plotInfo.axisPlacement){var l=[];if(this.chart.axisX)for(var p=0;ph.dataSeries.axisY.viewportMaximum&&b++;b-h.dataPoint.y.length&&g.push(h)}else"column"===e.type||"bar"===e.type?0>h.dataPoint.y?0>h.dataSeries.axisY.viewportMinimum&&h.dataSeries.axisY.viewportMaximum>=h.dataPoint.y&&g.push(h):h.dataSeries.axisY.viewportMinimum<=h.dataPoint.y&&0<=h.dataSeries.axisY.viewportMaximum&&g.push(h):"bubble"===e.type?(b=this.chart._eventManager.objectMap[e.dataPointIds[h.index]].size/2,h.dataPoint.y>= +h.dataSeries.axisY.viewportMinimum-b&&h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum+b&&g.push(h)):"waterfall"===e.type?(b=0,h.cumulativeSumYStartValueh.dataSeries.axisY.viewportMaximum&&b++,h.cumulativeSumh.dataSeries.axisY.viewportMaximum&&b++,2>b&&-2=h.dataSeries.axisY.viewportMinimum&& +h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum)&&g.push(h);else g.push(h)}}if(0a&&(a+=this.container.clientWidth+20);a+this.container.clientWidth> +Math.max(this.chart.container.clientWidth,this.chart.width)&&(a=Math.max(0,Math.max(this.chart.container.clientWidth,this.chart.width)-this.container.clientWidth));d=1!==g.length||this.shared||"line"!==g[0].dataSeries.type&&"stepLine"!==g[0].dataSeries.type&&"spline"!==g[0].dataSeries.type&&"area"!==g[0].dataSeries.type&&"stepArea"!==g[0].dataSeries.type&&"splineArea"!==g[0].dataSeries.type?"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"=== +g[0].dataSeries.type?g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x):d:g[0].dataSeries.axisY.convertValueToPixel(g[0].dataPoint.y);d=-d+10;0":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content? +this.content:"{name}:  {y}",p=b.axisXIndex):"bubble"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y},   {z}"): +"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y[0]}, {y[1]}"):"candlestick"=== +b.type||"ohlc"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Open:   {y[0]}
High:    {y[1]}
Low:   {y[2]}
Close:   {y[3]}"):"boxAndWhisker"=== +b.type&&(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"), +null===d&&(d=""),!0===this.reversed?(d=this.chart.replaceKeywordsWithValue(g,c,b,e)+d,l"+d)):(d+=this.chart.replaceKeywordsWithValue(g,c,b,e),l")));null!==d&&(d=h+d)}else{b=a[0].dataSeries;c=a[0].dataPoint;e=a[0].index;if(null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent)return null;"line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"===b.type||"splineArea"===b.type||"column"=== +b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y}":"bubble"===b.type?g=c.toolTipContent? +c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y},   {z}":"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.name?"{name}:  ":c.label?"{label}:  ":"")+"{y}":"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+" :  {y[0]},  {y[1]}": +"candlestick"===b.type||"ohlc"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Open:   {y[0]}
High:    {y[1]}
Low:     {y[2]}
Close:   {y[3]}":"boxAndWhisker"===b.type&&(g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent: +this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"); +null===d&&(d="");d+=this.chart.replaceKeywordsWithValue(g,c,b,e)}return d};$.prototype.enableAnimation=function(){if(!this.container.style.WebkitTransition){var a=this.getContainerTransition(this.containerTransitionDuration);this.container.style.WebkitTransition=a;this.container.style.MsTransition=a;this.container.style.transition=a;this.container.style.MozTransition=this.mozContainerTransition}};$.prototype.disableAnimation=function(){this.container.style.WebkitTransition&&(this.container.style.WebkitTransition= +"",this.container.style.MozTransition="",this.container.style.MsTransition="",this.container.style.transition="")};$.prototype.hide=function(a){this.container&&(this.container.style.display="none",this.currentSeriesIndex=-1,this._prevY=this._prevX=NaN,("undefined"===typeof a||a)&&this.chart.resetOverlayedCanvas())};$.prototype.show=function(a,d,b){this._updateToolTip(a,d,"undefined"===typeof b?!1:b)};$.prototype.fixMozTransitionDelay=function(a,d){if(20c&&a.push(d),d.animationCallback(c),1<=c&&d.onComplete)d.onComplete();this.animations=a;0g;g++)for(var e=0;3>e;e++){for(var f=0,d=0;3>d;d++)f+=a[g][d]*b[d][e];c[g][e]=f}return c}function P(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX= +a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha;b.font=a.font;b.textAlign=a.textAlign;b.textBaseline=a.textBaseline;b.arcScaleX_=a.arcScaleX_;b.arcScaleY_=a.arcScaleY_;b.lineScale_=a.lineScale_}function Q(a){var b=a.indexOf("(",3),c=a.indexOf(")",b+1),b=a.substring(b+1,c).split(",");if(4!=b.length||"a"!=a.charAt(3))b[3]=1;return b}function E(a,b,c){return Math.min(c,Math.max(b,a))}function F(a,b,c){0>c&&c++;16*c?a+6*(b-a)*c: +1>2*c?b:2>3*c?a+6*(b-a)*(2/3-c):a}function G(a){if(a in H)return H[a];var b,c=1;a=String(a);if("#"==a.charAt(0))b=a;else if(/^rgb/.test(a)){c=Q(a);b="#";for(var g,e=0;3>e;e++)g=-1!=c[e].indexOf("%")?Math.floor(255*(parseFloat(c[e])/100)):+c[e],b+=v[E(g,0,255)];c=+c[3]}else if(/^hsl/.test(a)){e=c=Q(a);b=parseFloat(e[0])/360%360;0>b&&b++;g=E(parseFloat(e[1])/100,0,1);e=E(parseFloat(e[2])/100,0,1);if(0==g)g=e=b=e;else{var f=0.5>e?e*(1+g):e+g-e*g,d=2*e-f;g=F(d,f,b+1/3);e=F(d,f,b);b=F(d,f,b-1/3)}b="#"+ +v[Math.floor(255*g)]+v[Math.floor(255*e)]+v[Math.floor(255*b)];c=c[3]}else b=Z[a]||a;return H[a]={color:b,alpha:c}}function C(a){this.m_=D();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=1*q;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=a;var b="width:"+a.clientWidth+"px;height:"+a.clientHeight+"px;overflow:hidden;position:absolute", +c=a.ownerDocument.createElement("div");c.style.cssText=b;a.appendChild(c);b=c.cloneNode(!1);b.style.backgroundColor="red";b.style.filter="alpha(opacity=0)";a.appendChild(b);this.element_=c;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}function R(a,b,c,g){a.currentPath_.push({type:"bezierCurveTo",cp1x:b.x,cp1y:b.y,cp2x:c.x,cp2y:c.y,x:g.x,y:g.y});a.currentX_=g.x;a.currentY_=g.y}function S(a,b){var c=G(a.strokeStyle),g=c.color,c=c.alpha*a.globalAlpha,e=a.lineScale_*a.lineWidth;1>e&&(c*=e);b.push("')}function T(a,b,c,g){var e=a.fillStyle,f=a.arcScaleX_,d=a.arcScaleY_,k=g.x-c.x,n=g.y-c.y;if(e instanceof w){var h=0,l=g=0,u=0,m=1;if("gradient"==e.type_){h=e.x1_/f;c=e.y1_/d;var p=s(a,e.x0_/f,e.y0_/d),h=s(a,h,c),h=180*Math.atan2(h.x-p.x,h.y-p.y)/Math.PI;0>h&&(h+=360);1E-6>h&&(h=0)}else p=s(a,e.x0_,e.y0_),g=(p.x-c.x)/k,l=(p.y-c.y)/n,k/=f*q, +n/=d*q,m=x.max(k,n),u=2*e.r0_/m,m=2*e.r1_/m-u;f=e.colors_;f.sort(function(a,b){return a.offset-b.offset});d=f.length;p=f[0].color;c=f[d-1].color;k=f[0].alpha*a.globalAlpha;a=f[d-1].alpha*a.globalAlpha;for(var n=[],r=0;r')}else e instanceof +I?k&&n&&b.push("'):(e=G(a.fillStyle),b.push(''))}function s(a,b,c){a=a.m_;return{x:q*(b*a[0][0]+c*a[1][0]+a[2][0])-r,y:q*(b*a[0][1]+c*a[1][1]+a[2][1])-r}}function z(a,b,c){isFinite(b[0][0])&&(isFinite(b[0][1])&&isFinite(b[1][0])&&isFinite(b[1][1])&&isFinite(b[2][0])&&isFinite(b[2][1]))&&(a.m_=b,c&&(a.lineScale_=aa(ba(b[0][0]*b[1][1]-b[0][1]* +b[1][0]))))}function w(a){this.type_=a;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}function I(a,b){if(!a||1!=a.nodeType||"IMG"!=a.tagName)throw new A("TYPE_MISMATCH_ERR");if("complete"!=a.readyState)throw new A("INVALID_STATE_ERR");switch(b){case "repeat":case null:case "":this.repetition_="repeat";break;case "repeat-x":case "repeat-y":case "no-repeat":this.repetition_=b;break;default:throw new A("SYNTAX_ERR");}this.src_=a.src;this.width_=a.width;this.height_=a.height} +function A(a){this.code=this[a];this.message=a+": DOM Exception "+this.code}var x=Math,k=x.round,J=x.sin,K=x.cos,ba=x.abs,aa=x.sqrt,q=10,r=q/2;navigator.userAgent.match(/MSIE ([\d.]+)?/);var M=Array.prototype.slice;O(document);var U={init:function(a){a=a||document;a.createElement("canvas");a.attachEvent("onreadystatechange",W(this.init_,this,a))},init_:function(a){a=a.getElementsByTagName("canvas");for(var b=0;bd;d++)for(var B=0;16>B;B++)v[16*d+B]=d.toString(16)+B.toString(16);var Z={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC", +bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000", +darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082", +ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA", +mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5", +peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"}, +H={},L={},$={butt:"flat",round:"round"},d=C.prototype;d.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null);this.element_.innerHTML=""};d.beginPath=function(){this.currentPath_=[]};d.moveTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.lineTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.bezierCurveTo= +function(a,b,c,g,e,f){e=s(this,e,f);a=s(this,a,b);c=s(this,c,g);R(this,a,c,e)};d.quadraticCurveTo=function(a,b,c,g){a=s(this,a,b);c=s(this,c,g);g={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)};R(this,g,{x:g.x+(c.x-this.currentX_)/3,y:g.y+(c.y-this.currentY_)/3},c)};d.arc=function(a,b,c,g,e,f){c*=q;var d=f?"at":"wa",k=a+K(g)*c-r,n=b+J(g)*c-r;g=a+K(e)*c-r;e=b+J(e)*c-r;k!=g||f||(k+=0.125);a=s(this,a,b);k=s(this,k,n);g=s(this,g,e);this.currentPath_.push({type:d, +x:a.x,y:a.y,radius:c,xStart:k.x,yStart:k.y,xEnd:g.x,yEnd:g.y})};d.rect=function(a,b,c,g){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath()};d.strokeRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath();this.stroke();this.currentPath_=e};d.fillRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+ +c,b+g);this.lineTo(a,b+g);this.closePath();this.fill();this.currentPath_=e};d.createLinearGradient=function(a,b,c,g){var e=new w("gradient");e.x0_=a;e.y0_=b;e.x1_=c;e.y1_=g;return e};d.createRadialGradient=function(a,b,c,g,e,f){var d=new w("gradientradial");d.x0_=a;d.y0_=b;d.r0_=c;d.x1_=g;d.y1_=e;d.r1_=f;return d};d.drawImage=function(a,b){var c,g,e,d,r,y,n,h;e=a.runtimeStyle.width;d=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var l=a.width,u=a.height;a.runtimeStyle.width= +e;a.runtimeStyle.height=d;if(3==arguments.length)c=arguments[1],g=arguments[2],r=y=0,n=e=l,h=d=u;else if(5==arguments.length)c=arguments[1],g=arguments[2],e=arguments[3],d=arguments[4],r=y=0,n=l,h=u;else if(9==arguments.length)r=arguments[1],y=arguments[2],n=arguments[3],h=arguments[4],c=arguments[5],g=arguments[6],e=arguments[7],d=arguments[8];else throw Error("Invalid number of arguments");var m=s(this,c,g),p=[];p.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))};d.stroke=function(a){var b=[];b.push("d.x)d.x=f.x;if(null==c.y||f.yd.y)d.y=f.y}}b.push(' ">');a?T(this,b,c,d):S(this,b);b.push("");this.element_.insertAdjacentHTML("beforeEnd",b.join(""))};d.fill=function(){this.stroke(!0)};d.closePath=function(){this.currentPath_.push({type:"close"})};d.save=function(){var a= +{};P(this,a);this.aStack_.push(a);this.mStack_.push(this.m_);this.m_=t(D(),this.m_)};d.restore=function(){this.aStack_.length&&(P(this.aStack_.pop(),this),this.m_=this.mStack_.pop())};d.translate=function(a,b){z(this,t([[1,0,0],[0,1,0],[a,b,1]],this.m_),!1)};d.rotate=function(a){var b=K(a);a=J(a);z(this,t([[b,a,0],[-a,b,0],[0,0,1]],this.m_),!1)};d.scale=function(a,b){this.arcScaleX_*=a;this.arcScaleY_*=b;z(this,t([[a,0,0],[0,b,0],[0,0,1]],this.m_),!0)};d.transform=function(a,b,c,d,e,f){z(this,t([[a, +b,0],[c,d,0],[e,f,1]],this.m_),!0)};d.setTransform=function(a,b,c,d,e,f){z(this,[[a,b,0],[c,d,0],[e,f,1]],!0)};d.drawText_=function(a,b,c,d,e){var f=this.m_;d=0;var r=1E3,t=0,n=[],h;h=this.font;if(L[h])h=L[h];else{var l=document.createElement("div").style;try{l.font=h}catch(u){}h=L[h]={style:l.fontStyle||"normal",variant:l.fontVariant||"normal",weight:l.fontWeight||"normal",size:l.fontSize||10,family:l.fontFamily||"sans-serif"}}var l=h,m=this.element_;h={};for(var p in l)h[p]=l[p];p=parseFloat(m.currentStyle.fontSize); +m=parseFloat(l.size);"number"==typeof l.size?h.size=l.size:-1!=l.size.indexOf("px")?h.size=m:-1!=l.size.indexOf("em")?h.size=p*m:-1!=l.size.indexOf("%")?h.size=p/100*m:-1!=l.size.indexOf("pt")?h.size=m/0.75:h.size=p;h.size*=0.981;p=h.style+" "+h.variant+" "+h.weight+" "+h.size+"px "+h.family;m=this.element_.currentStyle;l=this.textAlign.toLowerCase();switch(l){case "left":case "center":case "right":break;case "end":l="ltr"==m.direction?"right":"left";break;case "start":l="rtl"==m.direction?"right": +"left";break;default:l="left"}switch(this.textBaseline){case "hanging":case "top":t=h.size/1.75;break;case "middle":break;default:case null:case "alphabetic":case "ideographic":case "bottom":t=-h.size/2.25}switch(l){case "right":d=1E3;r=0.05;break;case "center":d=r=500}b=s(this,b+0,c+t);n.push('');e?S(this,n):T(this,n,{x:-d,y:0}, +{x:r,y:h.size});e=f[0][0].toFixed(3)+","+f[1][0].toFixed(3)+","+f[0][1].toFixed(3)+","+f[1][1].toFixed(3)+",0,0";b=k(b.x/q)+","+k(b.y/q);n.push('','','');this.element_.insertAdjacentHTML("beforeEnd",n.join(""))};d.fillText=function(a,b,c,d){this.drawText_(a,b,c,d,!1)};d.strokeText=function(a, +b,c,d){this.drawText_(a,b,c,d,!0)};d.measureText=function(a){this.textMeasureEl_||(this.element_.insertAdjacentHTML("beforeEnd",''),this.textMeasureEl_=this.element_.lastChild);var b=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(b.createTextNode(a));return{width:this.textMeasureEl_.offsetWidth}};d.clip=function(){}; +d.arcTo=function(){};d.createPattern=function(a,b){return new I(a,b)};w.prototype.addColorStop=function(a,b){b=G(b);this.colors_.push({offset:a,color:b.color,alpha:b.alpha})};d=A.prototype=Error();d.INDEX_SIZE_ERR=1;d.DOMSTRING_SIZE_ERR=2;d.HIERARCHY_REQUEST_ERR=3;d.WRONG_DOCUMENT_ERR=4;d.INVALID_CHARACTER_ERR=5;d.NO_DATA_ALLOWED_ERR=6;d.NO_MODIFICATION_ALLOWED_ERR=7;d.NOT_FOUND_ERR=8;d.NOT_SUPPORTED_ERR=9;d.INUSE_ATTRIBUTE_ERR=10;d.INVALID_STATE_ERR=11;d.SYNTAX_ERR=12;d.INVALID_MODIFICATION_ERR= +13;d.NAMESPACE_ERR=14;d.INVALID_ACCESS_ERR=15;d.VALIDATION_ERR=16;d.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=U;CanvasRenderingContext2D=C;CanvasGradient=w;CanvasPattern=I;DOMException=A}(); +/*eslint-enable*/ +/*jshint ignore:end*/ \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/canvasjs.react.js b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/canvasjs.react.js new file mode 100644 index 00000000..69c7951e --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/canvasjs.react.js @@ -0,0 +1,48 @@ +var React = require('react'); +var CanvasJS = require('./canvasjs.min'); +CanvasJS = CanvasJS.Chart ? CanvasJS : window.CanvasJS; + +class CanvasJSChart extends React.Component { + static _cjsContainerId = 0 + constructor(props) { + super(props); + this.options = props.options ? props.options : {}; + this.containerProps = props.containerProps ? props.containerProps : {width: "100%", position: "relative"}; + this.containerProps.height = props.containerProps && props.containerProps.height ? props.containerProps.height : this.options.height ? this.options.height + "px" : "400px"; + this.chartContainerId = "canvasjs-react-chart-container-" + CanvasJSChart._cjsContainerId++; + } + componentDidMount() { + //Create Chart and Render + this.chart = new CanvasJS.Chart(this.chartContainerId, this.options); + this.chart.render(); + + if(this.props.onRef) + this.props.onRef(this.chart); + } + shouldComponentUpdate(nextProps, nextState){ + //Check if Chart-options has changed and determine if component has to be updated + return !(nextProps.options === this.options); + } + componentDidUpdate() { + //Update Chart Options & Render + this.chart.options = this.props.options; + this.chart.render(); + } + componentWillUnmount() { + //Destroy chart and remove reference + this.chart.destroy(); + if(this.props.onRef) + this.props.onRef(undefined); + } + render() { + //return React.createElement('div', { id: this.chartContainerId, style: this.containerProps }); + return
+ } +} + +var CanvasJSReact = { + CanvasJSChart: CanvasJSChart, + CanvasJS: CanvasJS +}; + +export default CanvasJSReact; \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html new file mode 100644 index 00000000..ef650afe --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html new file mode 100644 index 00000000..57e08a55 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html @@ -0,0 +1,50 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html new file mode 100644 index 00000000..3cb8789c --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html @@ -0,0 +1,51 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html new file mode 100644 index 00000000..34e46259 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html @@ -0,0 +1,72 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html new file mode 100644 index 00000000..4f6e15c6 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html @@ -0,0 +1,233 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html new file mode 100644 index 00000000..50b7d737 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html @@ -0,0 +1,108 @@ + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html new file mode 100644 index 00000000..cd5dd33e --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html @@ -0,0 +1,46 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html new file mode 100644 index 00000000..0b69ea91 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html @@ -0,0 +1,46 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html new file mode 100644 index 00000000..895c4e28 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html @@ -0,0 +1,128 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html new file mode 100644 index 00000000..4e292db0 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html @@ -0,0 +1,87 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html new file mode 100644 index 00000000..79a3d417 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html @@ -0,0 +1,40 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html new file mode 100644 index 00000000..a42de04d --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html @@ -0,0 +1,57 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html new file mode 100644 index 00000000..17505925 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html @@ -0,0 +1,115 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html new file mode 100644 index 00000000..f156e2f8 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html @@ -0,0 +1,94 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html new file mode 100644 index 00000000..2b0a5ed9 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html @@ -0,0 +1,62 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html new file mode 100644 index 00000000..7be550ab --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html new file mode 100644 index 00000000..b5b8e010 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html @@ -0,0 +1,102 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html new file mode 100644 index 00000000..9bfb56e5 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html @@ -0,0 +1,56 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html new file mode 100644 index 00000000..9a6a355b --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html @@ -0,0 +1,71 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html new file mode 100644 index 00000000..8b620e23 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html @@ -0,0 +1,53 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html new file mode 100644 index 00000000..4a3430ac --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html @@ -0,0 +1,107 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html new file mode 100644 index 00000000..e4626cc0 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html @@ -0,0 +1,125 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html new file mode 100644 index 00000000..24a15c69 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html @@ -0,0 +1,46 @@ + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html new file mode 100644 index 00000000..d21bd730 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html @@ -0,0 +1,44 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html new file mode 100644 index 00000000..c25f9ae8 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html @@ -0,0 +1,257 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html new file mode 100644 index 00000000..7c4d43d0 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html @@ -0,0 +1,171 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html new file mode 100644 index 00000000..d6d67a13 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html @@ -0,0 +1,67 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html new file mode 100644 index 00000000..34c7c5bf --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html @@ -0,0 +1,123 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html new file mode 100644 index 00000000..3cdb8259 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html @@ -0,0 +1,100 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html new file mode 100644 index 00000000..7c1afce1 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html @@ -0,0 +1,55 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html new file mode 100644 index 00000000..dc1a4b7a --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html @@ -0,0 +1,57 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html new file mode 100644 index 00000000..f721ee43 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html @@ -0,0 +1,50 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html new file mode 100644 index 00000000..5e0ce683 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html @@ -0,0 +1,73 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html new file mode 100644 index 00000000..1bd75401 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html @@ -0,0 +1,127 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html new file mode 100644 index 00000000..54e2bece --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html @@ -0,0 +1,113 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html new file mode 100644 index 00000000..e5408a62 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html @@ -0,0 +1,72 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html new file mode 100644 index 00000000..280a052a --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html @@ -0,0 +1,51 @@ + + + + + + + +
+ + + diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html new file mode 100644 index 00000000..450b4a57 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html @@ -0,0 +1,55 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html new file mode 100644 index 00000000..76483f3a --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html @@ -0,0 +1,120 @@ + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html new file mode 100644 index 00000000..7af19276 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html @@ -0,0 +1,78 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html new file mode 100644 index 00000000..90e29ed7 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html @@ -0,0 +1,68 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html new file mode 100644 index 00000000..7fb51f0a --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html @@ -0,0 +1,42 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html new file mode 100644 index 00000000..5e7f2a0b --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html new file mode 100644 index 00000000..d12b9cf5 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html new file mode 100644 index 00000000..982c84d7 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html @@ -0,0 +1,83 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html new file mode 100644 index 00000000..db126063 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html new file mode 100644 index 00000000..69e6bb35 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html @@ -0,0 +1,104 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html new file mode 100644 index 00000000..a90e357d --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html @@ -0,0 +1,89 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html new file mode 100644 index 00000000..3e473fbf --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html @@ -0,0 +1,98 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html new file mode 100644 index 00000000..4a8b95f7 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html @@ -0,0 +1,49 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html new file mode 100644 index 00000000..2482015d --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html @@ -0,0 +1,49 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html new file mode 100644 index 00000000..a0fe8f0f --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html @@ -0,0 +1,76 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html new file mode 100644 index 00000000..e53506c7 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html @@ -0,0 +1,126 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html new file mode 100644 index 00000000..39e9e1b9 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html @@ -0,0 +1,103 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html new file mode 100644 index 00000000..f377f681 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html @@ -0,0 +1,113 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html new file mode 100644 index 00000000..bed3a0ab --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html @@ -0,0 +1,51 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html new file mode 100644 index 00000000..cf00ff2b --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html @@ -0,0 +1,48 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html new file mode 100644 index 00000000..7ad45521 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html @@ -0,0 +1,40 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html new file mode 100644 index 00000000..7e9b4297 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html @@ -0,0 +1,55 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html new file mode 100644 index 00000000..b5d9fb7b --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html @@ -0,0 +1,52 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html new file mode 100644 index 00000000..8aa524e4 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html @@ -0,0 +1,52 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html new file mode 100644 index 00000000..3b475ef7 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html @@ -0,0 +1,54 @@ + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html new file mode 100644 index 00000000..770bc9dc --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html @@ -0,0 +1,51 @@ + + + + + + + +
+ +
+ + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html new file mode 100644 index 00000000..e1bd01bb --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html @@ -0,0 +1,52 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html new file mode 100644 index 00000000..7dd8a3e7 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html @@ -0,0 +1,36 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html new file mode 100644 index 00000000..c84b2a9a --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html @@ -0,0 +1,39 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html new file mode 100644 index 00000000..e39048c9 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html @@ -0,0 +1,40 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html new file mode 100644 index 00000000..b9053b27 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html @@ -0,0 +1,40 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html new file mode 100644 index 00000000..72db3b31 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html @@ -0,0 +1,108 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html new file mode 100644 index 00000000..35871f64 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html @@ -0,0 +1,90 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html new file mode 100644 index 00000000..3cca87c6 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html new file mode 100644 index 00000000..ee555661 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html @@ -0,0 +1,54 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html new file mode 100644 index 00000000..580047d0 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html @@ -0,0 +1,59 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html new file mode 100644 index 00000000..2670b874 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html @@ -0,0 +1,60 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html new file mode 100644 index 00000000..a0980da9 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html @@ -0,0 +1,69 @@ + + + + + + + +
+ + + diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html new file mode 100644 index 00000000..7a3212ee --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html @@ -0,0 +1,73 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html new file mode 100644 index 00000000..eb0a7abd --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html @@ -0,0 +1,129 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html new file mode 100644 index 00000000..39a28571 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html @@ -0,0 +1,63 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html new file mode 100644 index 00000000..c38a46af --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html new file mode 100644 index 00000000..c7a16883 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html @@ -0,0 +1,81 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html new file mode 100644 index 00000000..327b5f6e --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html @@ -0,0 +1,43 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html new file mode 100644 index 00000000..1d9c8738 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html @@ -0,0 +1,122 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html new file mode 100644 index 00000000..01b9a6aa --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html @@ -0,0 +1,54 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html new file mode 100644 index 00000000..ddb9026b --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html new file mode 100644 index 00000000..b6f1cc72 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html @@ -0,0 +1,73 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html new file mode 100644 index 00000000..24674cea --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html @@ -0,0 +1,106 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html new file mode 100644 index 00000000..fd35f556 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html @@ -0,0 +1,68 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html new file mode 100644 index 00000000..393d6af1 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html @@ -0,0 +1,66 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html new file mode 100644 index 00000000..be32272f --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html @@ -0,0 +1,108 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html new file mode 100644 index 00000000..392bb3c1 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html @@ -0,0 +1,54 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html new file mode 100644 index 00000000..988c2219 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html @@ -0,0 +1,58 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html new file mode 100644 index 00000000..2dbd00d6 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html @@ -0,0 +1,113 @@ + + + + + + + +
+ + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html new file mode 100644 index 00000000..d6d42070 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html @@ -0,0 +1,42 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html new file mode 100644 index 00000000..c139f406 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html @@ -0,0 +1,49 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html new file mode 100644 index 00000000..31523b13 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html @@ -0,0 +1,55 @@ + + + + + + + + +
+
+
+ + + + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html new file mode 100644 index 00000000..b35ebf4b --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html @@ -0,0 +1,98 @@ + + + + + + + + + +
+ +
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html new file mode 100644 index 00000000..a3e82d02 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html @@ -0,0 +1,41 @@ + + + + + + + +
+ + + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/instruction.txt b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/instruction.txt new file mode 100644 index 00000000..93eb448f --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/instruction.txt @@ -0,0 +1,4 @@ +For standalone version include canvasjs.min.js +For jQuery version include jquery.canvasjs.min.js + +** DO NOT include both the files ** \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js new file mode 100644 index 00000000..8785b495 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js @@ -0,0 +1,922 @@ +/* + CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ + Copyright 2018 fenopix + + --------------------- License Information -------------------- + CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. + https://canvasjs.com/license/ + +*/ +/*eslint-disable*/ +/*jshint ignore:start*/ +(function(){function qa(k,p){k.prototype=eb(p.prototype);k.prototype.constructor=k;k.base=p.prototype}function eb(k){function p(){}p.prototype=k;return new p}function Ya(k,p,D){"millisecond"===D?k.setMilliseconds(k.getMilliseconds()+1*p):"second"===D?k.setSeconds(k.getSeconds()+1*p):"minute"===D?k.setMinutes(k.getMinutes()+1*p):"hour"===D?k.setHours(k.getHours()+1*p):"day"===D?k.setDate(k.getDate()+1*p):"week"===D?k.setDate(k.getDate()+7*p):"month"===D?k.setMonth(k.getMonth()+1*p):"year"===D&&k.setFullYear(k.getFullYear()+ +1*p);return k}function $(k,p){var D=!1;0>k&&(D=!0,k*=-1);k=""+k;for(p=p?p:1;k.length
Please right click on the image and save it to your device
"), +p.document.close()}}}function N(k){var p=((k&16711680)>>16).toString(16),D=((k&65280)>>8).toString(16);k=((k&255)>>0).toString(16);p=2>p.length?"0"+p:p;D=2>D.length?"0"+D:D;k=2>k.length?"0"+k:k;return"#"+p+D+k}function fb(k,p){var D=this.length>>>0,r=Number(p)||0,r=0>r?Math.ceil(r):Math.floor(r);for(0>r&&(r+=D);rD;D++)if(k[D]!==k[D+4]|k[D]!==k[D+8]|k[D]!==k[D+12]){p=!1;break}return p?k[0]<<16|k[1]<<8|k[2]:0}function na(k,p,D){return k in p?p[k]:D[k]}function Oa(k,p,D){if(r&&bb){var u=k.getContext("2d");Pa=u.webkitBackingStorePixelRatio|| +u.mozBackingStorePixelRatio||u.msBackingStorePixelRatio||u.oBackingStorePixelRatio||u.backingStorePixelRatio||1;W=Ua/Pa;k.width=p*W;k.height=D*W;Ua!==Pa&&(k.style.width=p+"px",k.style.height=D+"px",u.scale(W,W))}else k.width=p,k.height=D}function hb(k){if(!ib){var p=!1,D=!1;"undefined"===typeof ra.Chart.creditHref?(k.creditHref=ja("iuuqr;..b`ow`rkr/bnl."),k.creditText=ja("B`ow`rKR/bnl")):(p=k.updateOption("creditText"),D=k.updateOption("creditHref"));if(k.creditHref&&k.creditText){k._creditLink|| +(k._creditLink=document.createElement("a"),k._creditLink.setAttribute("class","canvasjs-chart-credit"),k._creditLink.setAttribute("title","JavaScript Charts"),k._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:2px;top:"+(k.height-14)+"px;color:dimgrey;text-decoration:none;font-size:11px;font-family: Calibri, Lucida Grande, Lucida Sans Unicode, Arial, sans-serif"),k._creditLink.setAttribute("tabIndex",-1),k._creditLink.setAttribute("target","_blank"));if(0===k.renderCount|| +p||D)k._creditLink.setAttribute("href",k.creditHref),k._creditLink.innerHTML=k.creditText;k._creditLink&&k.creditHref&&k.creditText?(k._creditLink.parentElement||k._canvasJSContainer.appendChild(k._creditLink),k._creditLink.style.top=k.height-14+"px"):k._creditLink.parentElement&&k._canvasJSContainer.removeChild(k._creditLink)}}}function ta(k,p){Ja&&(this.canvasCount|=0,window.console.log(++this.canvasCount));var D=document.createElement("canvas");D.setAttribute("class","canvasjs-chart-canvas");Oa(D, +k,p);r||"undefined"===typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(D);return D}function sa(k,p,D){for(var r in D)p.style[r]=D[r]}function ua(k,p,D){p.getAttribute("state")||(p.style.backgroundColor=k.toolbar.backgroundColor,p.style.color=k.toolbar.fontColor,p.style.border="none",sa(k,p,{WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",userSelect:"none"}));p.getAttribute("state")!==D&&(p.setAttribute("state",D),p.setAttribute("type","button"),sa(k,p,{padding:"5px 12px", +cursor:"pointer","float":"left",width:"40px",height:"25px",outline:"0px",verticalAlign:"baseline",lineHeight:"0"}),p.setAttribute("title",k._cultureInfo[D+"Text"]),p.innerHTML=""+k._cultureInfo[D+"Text"]+"")}function Qa(){for(var k=null,p=0;pa?"a":"p";case "tt":return 12>a?"am":"pm";case "T":return 12>a?"A": +"P";case "TT":return 12>a?"AM":"PM";case "K":return S?"UTC":(String(z).match(H)||[""]).pop().replace(F,"");case "z":return(0k?!0:!1;u&&(k*=-1);var v=r?r.decimalSeparator:".",H=r?r.digitGroupSeparator: +",",F="";p=String(p);var F=1,z=r="",E=-1,L=[],R=[],I=0,N=0,S=0,O=!1,U=0,z=p.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|\u2030|./g);p=null;for(var Q=0;z&&QE)E=Q;else{if("%"===p)F*=100;else if("\u2030"===p){F*=1E3;continue}else if(","===p[0]&&"."===p[p.length-1]){F/=Math.pow(1E3,p.length-1);E=Q+p.length-1;continue}else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||(O=!0);0>E?(L.push(p),"#"===p||"0"===p?I++:","===p&&S++):(R.push(p),"#"!==p&&"0"!==p||N++)}O&&(p=Math.floor(k), +z=-Math.floor(Math.log(k)/Math.LN10+1),U=0===k?0:0===p?-(I+z):String(p).length-I,F/=Math.pow(10,U));0>E&&(E=Q);F=(k*F).toFixed(N);p=F.split(".");F=(p[0]+"").split("");k=(p[1]+"").split("");F&&"0"===F[0]&&F.shift();for(O=z=Q=N=E=0;0U?p.replace("+","").replace("-",""):p.replace("-",""),r+=p.replace(/[0]+/,function(k){return $(U,k.length)}));H="";for(L=!1;0U?p.replace("+","").replace("-",""):p.replace("-",""),H+=p.replace(/[0]+/,function(k){return $(U,k.length)}));r+=(L?v:"")+H;return u?"-"+r:r},Ra=function(k){var p=0,r=0;k=k||window.event;k.offsetX||0===k.offsetX?(p=k.offsetX,r=k.offsetY):k.layerX||0==k.layerX?(p=k.layerX,r=k.layerY):(p=k.pageX-k.target.offsetLeft, +r=k.pageY-k.target.offsetTop);return{x:p,y:r}},bb=!0,Ua=window.devicePixelRatio||1,Pa=1,W=bb?Ua/Pa:1,ea=function(k,p,r,u,v,H,F,z,E,L,R,N,O){"undefined"===typeof O&&(O=1);F=F||0;z=z||"black";var I=15p)v=H-1;else break}r>p&&1H&&(F=p.pop(),u-=F.height,v=z)}this._wrappedText={lines:p,width:v,height:u};this.width=v+(this.leftPadding+this.rightPadding);this.height=u+(this.topPadding+this.bottomPadding);this.ctx.font=r};ka.prototype._getFontString=function(){var k;k=""+(this.fontStyle?this.fontStyle+" ":"");k+=this.fontWeight?this.fontWeight+" ":"";k+=this.fontSize?this.fontSize+"px ":"";var p=this.fontFamily?this.fontFamily+"":"";!r&&p&&(p=p.split(",")[0],"'"!==p[0]&&'"'!==p[0]&&(p="'"+p+"'"));return k+=p}; +qa(Va,V);qa(Aa,V);Aa.prototype.setLayout=function(){if(this.text){var k=this.dockInsidePlotArea?this.chart.plotArea:this.chart,p=k.layoutManager.getFreeSpace(),r=p.x1,v=p.y1,E=0,H=0,F=this.chart._menuButton&&this.chart.exportEnabled&&"top"===this.verticalAlign?22:0,z,I;"top"===this.verticalAlign||"bottom"===this.verticalAlign?(null===this.maxWidth&&(this.maxWidth=p.width-4-F*("center"===this.horizontalAlign?2:1)),H=0.5*p.height-this.margin-2,E=0):"center"===this.verticalAlign&&("left"===this.horizontalAlign|| +"right"===this.horizontalAlign?(null===this.maxWidth&&(this.maxWidth=p.height-4),H=0.5*p.width-this.margin-2):"center"===this.horizontalAlign&&(null===this.maxWidth&&(this.maxWidth=p.width-4),H=0.5*p.height-4));var L;u(this.padding)||"number"!==typeof this.padding?u(this.padding)||"object"!==typeof this.padding||(L=this.padding.top?this.padding.top:this.padding.bottom?this.padding.bottom:0,L+=this.padding.bottom?this.padding.bottom:this.padding.top?this.padding.top:0,L*=1.25):L=2.5*this.padding;this.wrap|| +(H=Math.min(H,Math.max(1.5*this.fontSize,this.fontSize+L)));H=new ka(this.ctx,{fontSize:this.fontSize,fontFamily:this.fontFamily,fontColor:this.fontColor,fontStyle:this.fontStyle,fontWeight:this.fontWeight,horizontalAlign:this.horizontalAlign,verticalAlign:this.verticalAlign,borderColor:this.borderColor,borderThickness:this.borderThickness,backgroundColor:this.backgroundColor,maxWidth:this.maxWidth,maxHeight:H,cornerRadius:this.cornerRadius,text:this.text,padding:this.padding,textBaseline:"top"}); +L=H.measureText();"top"===this.verticalAlign||"bottom"===this.verticalAlign?("top"===this.verticalAlign?(v=p.y1+2,I="top"):"bottom"===this.verticalAlign&&(v=p.y2-2-L.height,I="bottom"),"left"===this.horizontalAlign?r=p.x1+2:"center"===this.horizontalAlign?r=p.x1+p.width/2-L.width/2:"right"===this.horizontalAlign&&(r=p.x2-2-L.width-F),z=this.horizontalAlign,this.width=L.width,this.height=L.height):"center"===this.verticalAlign&&("left"===this.horizontalAlign?(r=p.x1+2,v=p.y2-2-(this.maxWidth/2-L.width/ +2),E=-90,I="left",this.width=L.height,this.height=L.width):"right"===this.horizontalAlign?(r=p.x2-2,v=p.y1+2+(this.maxWidth/2-L.width/2),E=90,I="right",this.width=L.height,this.height=L.width):"center"===this.horizontalAlign&&(v=k.y1+(k.height/2-L.height/2),r=k.x1+(k.width/2-L.width/2),I="center",this.width=L.width,this.height=L.height),z="center");H.x=r;H.y=v;H.angle=E;H.horizontalAlign=z;this._textBlock=H;k.layoutManager.registerSpace(I,{width:this.width+("left"===I||"right"===I?this.margin+2:0), +height:this.height+("top"===I||"bottom"===I?this.margin+2:0)});this.bounds={x1:r,y1:v,x2:r+this.width,y2:v+this.height};this.ctx.textBaseline="top"}};Aa.prototype.render=function(){this._textBlock&&this._textBlock.render(!0)};qa(Ka,V);Ka.prototype.setLayout=Aa.prototype.setLayout;Ka.prototype.render=Aa.prototype.render;Wa.prototype.get=function(k,p){var r=null;0a[g].x&&0w?{x:a[l].x+w/3,y:a[l].y+c/3}:{x:a[l].x,y:a[l].y+c/9};l=e;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[l].x-a[g].x?0.01:a[l].x-a[g].x))*(d- +1)/2+1;w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0w?{x:a[l].x-w/3,y:a[l].y-c/3}:{x:a[l].x,y:a[l].y-c/9};b[b.length]=a[e]}return b}function E(a,d,b,c,e,g,m,l,w,h){var s=0;h?(m.color=g,l.color=g):h=1;s=w?Math.abs(e-b):Math.abs(c-d);s=0this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360);this.options.scaleBreaks&&(this.scaleBreaks=new Q(this.chart, +this.options.scaleBreaks,++this.chart._eventManager.lastObjectId,this));this.stripLines=[];if(this.options.stripLines&&0=this._appliedBreaks[a+1].startValue&&(this._appliedBreaks[a].endValue=Math.max(this._appliedBreaks[a].endValue,this._appliedBreaks[a+1].endValue),window.console&&window.console.log("CanvasJS Error: Breaks "+a+" and "+(a+1)+" are overlapping."),this._appliedBreaks.splice(a,2),a--)}}function L(a,d,b,c,e,g){L.base.constructor.call(this,"Break",d,b,c,g);this.id=e;this.chart=a;this.ctx=this.chart.ctx;this.scaleBreaks=g;this.optionsName= +d;this.isOptionsInArray=!0;this.type=b.type?this.type:g.type;this.fillOpacity=u(b.fillOpacity)?g.fillOpacity:this.fillOpacity;this.lineThickness=u(b.lineThickness)?g.lineThickness:this.lineThickness;this.color=b.color?this.color:g.color;this.lineColor=b.lineColor?this.lineColor:g.lineColor;this.lineDashType=b.lineDashType?this.lineDashType:g.lineDashType;!u(this.startValue)&&this.startValue.getTime&&(this.startValue=this.startValue.getTime());!u(this.endValue)&&this.endValue.getTime&&(this.endValue= +this.endValue.getTime());"number"===typeof this.startValue&&("number"===typeof this.endValue&&this.endValue=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers);O(this._zoomButton,"mouseout",function(){d||(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(0%)", +filter:"invert(0%)"}))},this.allDOMEventHandlers)}this._resetButton||(d=!1,va(this._resetButton=document.createElement("button")),ua(this,this._resetButton,"reset"),this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor,this._toolBar.appendChild(this._resetButton),O(this._resetButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._resetButton,"click",function(){a.toolTip.hide();a.zoomEnabled||a.panEnabled?(a.zoomEnabled= +!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"),a._defaultCursor="default",a.overlaidCanvas.style.cursor=a._defaultCursor):(a.zoomEnabled=!1,a.panEnabled=!1);if(a.sessionVariables.axisX)for(var c=0;c=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers),O(this._resetButton,"mouseout",function(){d||(sa(a,a._resetButton, +{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers),this.overlaidCanvas.style.cursor=a._defaultCursor);this.zoomEnabled||this.panEnabled||(this._zoomButton?(a._zoomButton.getAttribute("state")===a._cultureInfo.zoomText?(this.panEnabled=!0,this.zoomEnabled=!1):(this.zoomEnabled=!0,this.panEnabled= +!1),Qa(a._zoomButton,a._resetButton)):(this.zoomEnabled=!0,this.panEnabled=!1))}else this.panEnabled=this.zoomEnabled=!1;this._menuButton?this.exportEnabled?Qa(this._menuButton):va(this._menuButton):this.exportEnabled&&r&&(d=!1,this._menuButton=document.createElement("button"),ua(this,this._menuButton,"menu"),this._toolBar.appendChild(this._menuButton),O(this._menuButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._menuButton,"click",function(){"none"!==a._dropdownMenu.style.display|| +a._dropDownCloseTime&&500>=(new Date).getTime()-a._dropDownCloseTime.getTime()||(a._dropdownMenu.style.display="block",a._menuButton.blur(),a._dropdownMenu.focus())},this.allDOMEventHandlers,!0),O(this._menuButton,"mouseover",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.fontColorOnHover}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers,!0), +O(this._menuButton,"mouseout",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers,!0));if(!this._dropdownMenu&&this.exportEnabled&&r){d=!1;this._dropdownMenu=document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);var b=-1!==this.theme.indexOf("dark")?"black":"#888888";this._dropdownMenu.style.cssText= +"position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 0px;top: 25px;min-width: 120px;outline: 0;font-size: 14px; font-family: Arial, Helvetica, sans-serif;padding: 5px 0px 5px 0px;text-align: left;line-height: 10px;background-color:"+this.toolbar.backgroundColor+";box-shadow: 2px 2px 10px "+b;a._dropdownMenu.style.display="none";this._toolBar.appendChild(this._dropdownMenu);O(this._dropdownMenu,"blur",function(){va(a._dropdownMenu); +a._dropDownCloseTime=new Date},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.printText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers, +!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){a.print();va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.saveJPGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d= +!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"jpeg",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText= +"padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.savePNGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor, +this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"png",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0)}"none"!==this._toolBar.style.display&&this._zoomButton&&(this.panEnabled?ua(a,a._zoomButton,"zoom"):ua(a,a._zoomButton,"pan"),a._resetButton.getAttribute("state")!==a._cultureInfo.resetText&&ua(a,a._resetButton,"reset"));this.options.toolTip&&this.toolTip.options!==this.options.toolTip&&(this.toolTip.options=this.options.toolTip); +for(var c in this.toolTip.options)this.toolTip.options.hasOwnProperty(c)&&this.toolTip.updateOption(c)};p.prototype._updateSize=function(){var a;a=[this.canvas,this._preRenderCanvas,this.overlaidCanvas,this._eventManager.ghostCanvas];var d=0,b=0;this.options.width?d=this.width:this.width=d=0c.linkedDataSeriesIndex||c.linkedDataSeriesIndex>=this.options.data.length||"number"!==typeof c.linkedDataSeriesIndex|| +"error"===this.options.data[c.linkedDataSeriesIndex].type)&&(c.linkedDataSeriesIndex=null);null===c.name&&(c.name="DataSeries "+a);null===c.color?1a&&"undefined"!==typeof w.startTimePercent?a>=w.startTimePercent&&w.animationCallback(w.easingFunction(a-w.startTimePercent,0,1,1-w.startTimePercent),w):w.animationCallback(w.easingFunction(a,0,1,1),w);s.dispatchEvent("dataAnimationIterationEnd",{chart:s})},function(){b=[];for(var a=0;aa.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c);ed.max&&"number"===typeof e&&(d.max=e);if(0B&&(B=1/B);b.minDiff>B&&1!==B&&(b.minDiff=B)}else B=c-l.dataPoints[w-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B);null!==e&&null!==l.dataPoints[w-1].y&&(a.axisY.logarithmic?(B=e/l.dataPoints[w-1].y,1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e-l.dataPoints[w-1].y,0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B)))}if(cf&& +!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&qd.viewPortMax&&"number"===typeof e&&(d.viewPortMax=e))}}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype._processStackedPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d= +a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=[],l=[],w=Infinity,h=-Infinity,s=0;sb.max&&(b.max=c);if(0r&&(r=1/r);b.minDiff>r&&1!==r&&(b.minDiff=r)}else r=c-q.dataPoints[n-1].x,0>r&&(r*=-1),b.minDiff>r&&0!==r&&(b.minDiff=r);null!==e&&null!==q.dataPoints[n-1].y&&(a.axisY.logarithmic?0r&&(r=1/r),d.minDiff>r&&1!==r&&(d.minDiff=r)):(r=e-q.dataPoints[n-1].y,0>r&&(r*=-1),d.minDiff>r&&0!==r&&(d.minDiff=r)))}if(ct&&!B)B=!0;else if(c>t&&B)continue;q.dataPoints[n].label&&(a.axisX.labels[c]=q.dataPoints[n].label);cb.viewPortMax&&(b.viewPortMax=c);null===q.dataPoints[n].y?b.viewPortMin===c&&kd.max&&(d.max=a),nb.viewPortMax||(ad.viewPortMax&& +(d.viewPortMax=a)));for(n in l)l.hasOwnProperty(n)&&!isNaN(n)&&(a=l[n],ad.max&&(d.max=Math.max(a,h)),nb.viewPortMax||(ad.viewPortMax&&(d.viewPortMax=Math.max(a,h))))}};p.prototype._processStacked100PlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=!1,l=!1,w=[],h=0;hb.max&&(b.max=c);if(0t&&(t=1/t);b.minDiff>t&&1!==t&&(b.minDiff=t)}else t=c-s.dataPoints[q-1].x,0>t&&(t*=-1),b.minDiff>t&&0!==t&&(b.minDiff=t);u(e)||null===s.dataPoints[q-1].y||(a.axisY.logarithmic?0t&&(t=1/t),d.minDiff>t&&1!==t&&(d.minDiff=t)):(t=e-s.dataPoints[q-1].y,0>t&&(t*=-1),d.minDiff>t&&0!==t&&(d.minDiff=t)))}if(cr&&!f)f=!0;else if(c>r&&f)continue;s.dataPoints[q].label&&(a.axisX.labels[c]=s.dataPoints[q].label); +cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&Be&&(l=!0),w[c]=w[c]?w[c]+Math.abs(e):Math.abs(e))}}s.axisX.valueType=s.xValueType=g?"dateTime":"number"}a.axisY.logarithmic?(d.max=u(d.viewPortMax)?99*Math.pow(a.axisY.logarithmBase,-0.05):Math.max(d.viewPortMax,99*Math.pow(a.axisY.logarithmBase,-0.05)),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&!l?(d.max=u(d.viewPortMax)? +99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&l?(d.max=u(d.viewPortMax)?99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99)):!m&&l&&(d.max=u(d.viewPortMax)?-1:Math.max(d.viewPortMax,-1),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99));d.viewPortMin=d.min;d.viewPortMax=d.max;a.dataPointYSums=w}};p.prototype._processMultiYPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo, +b=a.axisX.dataInfo,c,e,g,m,l=!1,w=0;wb.max&&(b.max=c);gd.max&&(d.max=m);0B&&(B=1/B),b.minDiff>B&&1!==B&&(b.minDiff=B)):(B=c-h.dataPoints[s-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B)),e&&(null!==e[0]&&h.dataPoints[s-1].y&&null!==h.dataPoints[s-1].y[0])&&(a.axisY.logarithmic?(B=e[0]/ +h.dataPoints[s-1].y[0],1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e[0]-h.dataPoints[s-1].y[0],0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B))));if(!(ct&&!n)n=!0;else if(c>t&&n)continue;h.dataPoints[s].label&&(a.axisX.labels[c]=h.dataPoints[s].label);cb.viewPortMax&&(b.viewPortMax=c);if(b.viewPortMin===c&&e)for(p=0;pd.viewPortMax&&(d.viewPortMax=m))}}h.axisX.valueType=h.xValueType=l?"dateTime":"number"}};p.prototype._processSpecificPlotUnit=function(a){if("waterfall"===a.type&&a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c),l.dataPointEOs[w].cumulativeSumd.max&&(d.max=l.dataPointEOs[w].cumulativeSum),0q&&(q=1/q),b.minDiff>q&&1!==q&&(b.minDiff=q)):(q=c-l.dataPoints[w-1].x,0>q&&(q*=-1),b.minDiff>q&&0!==q&&(b.minDiff=q)),null!==e&&null!==l.dataPoints[w- +1].y&&(a.axisY.logarithmic?(e=l.dataPointEOs[w].cumulativeSum/l.dataPointEOs[w-1].cumulativeSum,1>e&&(e=1/e),d.minDiff>e&&1!==e&&(d.minDiff=e)):(e=l.dataPointEOs[w].cumulativeSum-l.dataPointEOs[w-1].cumulativeSum,0>e&&(e*=-1),d.minDiff>e&&0!==e&&(d.minDiff=e)))),!(cf&&!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);0d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w-1].cumulativeSum));l.dataPointEOs[w].cumulativeSumd.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w].cumulativeSum)}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype.calculateAutoBreaks=function(){function a(a,c,b,e){if(e)return b= +Math.pow(Math.min(b*a/c,c/a),0.2),1>=b&&(b=Math.pow(1>a?1/a:Math.min(c/a,a),0.25)),{startValue:a*b,endValue:c/b};b=0.2*Math.min(b-c+a,c-a);0>=b&&(b=0.25*Math.min(c-a,Math.abs(a)));return{startValue:a+b,endValue:c-b}}function d(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){var c=a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<=a.axisX.scaleBreaks.maxNumberOfAutoBreaks,b=a.axisY.scaleBreaks&&a.axisY.scaleBreaks.autoCalculate&&1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks;if(c|| +b)for(var d=a.axisY.dataInfo,f=a.axisX.dataInfo,g,h=f.min,l=f.max,m=d.min,n=d.max,f=f._dataRanges,d=d._dataRanges,q,w=0,s=0;sk.dataPoints.length))for(w=0;wf[q].max&&(f[q].max=g)),b){var r= +(n+1-m)*Math.max(parseFloat(a.axisY.scaleBreaks.collapsibleThreshold)||10,10)/100;if((g="waterfall"===a.type?k.dataPointEOs[w].cumulativeSum:k.dataPoints[w].y)&&g.length)for(var p=0;pd[q].max&&(d[q].max=g[p]);else u(g)||(q=Math.floor((g-m)/r),gd[q].max&&(d[q].max=g))}}}}function b(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)&&a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<= +a.axisX.scaleBreaks.maxNumberOfAutoBreaks)for(var c=a.axisX.dataInfo,b=c.min,d=c.max,f=c._dataRanges,g,h=0,l=0;lm.dataPoints.length))for(h=0;hf[g].max&&(f[g].max=c)}}for(var c,e=this,g=!1,m=0;m< +this._axes.length;m++)if(this._axes[m].scaleBreaks&&this._axes[m].scaleBreaks.autoCalculate&&1<=this._axes[m].scaleBreaks.maxNumberOfAutoBreaks){g=!0;this._axes[m].dataInfo._dataRanges=[];for(var l=0;l<100/Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10);l++)this._axes[m].dataInfo._dataRanges.push({min:Infinity,max:-Infinity})}if(g){for(m=0;ms[f].max&&(s[f].max=q)}delete this._axes[m].dataInfo.dataPointYPositiveSums}if(this._axes[m].dataInfo.dataPointYNegativeSums){n= +this._axes[m].dataInfo.dataPointYNegativeSums;s=h;for(l in n)n.hasOwnProperty(l)&&!isNaN(l)&&(q=-1*n[l],u(q)||(f=Math.floor((q-w)/c),qs[f].max&&(s[f].max=q)));delete this._axes[m].dataInfo.dataPointYNegativeSums}for(l=0;lc&&g.push({diff:q,start:s,end:w});break}else l++;if(this._axes[m].scaleBreaks.customBreaks)for(l=0;l=e.x1&&(a<=e.x2&&d>=e.y1&&d<=e.y2)&&(c=e.id)}return c};p.prototype.getAutoFontSize=lb;p.prototype.resetOverlayedCanvas=function(){this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height)};p.prototype.clearCanvas=kb;p.prototype.attachEvent=function(a){this._events.push(a)};p.prototype._touchEventHandler=function(a){if(a.changedTouches&&this.interactivityEnabled){var d=[],b=a.changedTouches,c=b?b[0]:a,e=null;switch(a.type){case "touchstart":case "MSPointerDown":d=["mousemove","mousedown"];this._lastTouchData= +Ra(c);this._lastTouchData.time=new Date;break;case "touchmove":case "MSPointerMove":d=["mousemove"];break;case "touchend":case "MSPointerUp":var g=this._lastTouchData&&this._lastTouchData.time?new Date-this._lastTouchData.time:0,d="touchstart"===this._lastTouchEventType||"MSPointerDown"===this._lastTouchEventType||300>g?["mouseup","click"]:["mouseup"];break;default:return}if(!(b&&1g)this._lastTouchData.scroll=!0}catch(l){}this._lastTouchEventType=a.type;if(this._lastTouchData.scroll&&this.zoomEnabled)this.isDrag&&this.resetOverlayedCanvas(),this.isDrag=!1;else for(b=0;b=e.x1&&d.x<=e.x2&&d.y>=e.y1&&d.y<=e.y2){c[b].call(c.context,d.x,d.y);"mousedown"===b&&!0===c.capture?(p.capturedEventParam=c,this.overlaidCanvas.setCapture?this.overlaidCanvas.setCapture():document.documentElement.addEventListener("mouseup", +this._mouseEventHandler,!1)):"mouseup"===b&&(c.chart.overlaidCanvas.releaseCapture?c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",this._mouseEventHandler,!1));break}else c=null;a.target.style.cursor=c&&c.cursor?c.cursor:this._defaultCursor}b=this.plotArea;if(d.xb.x2||d.yb.y2)this.toolTip&&this.toolTip.enabled?this.toolTip.hide():this.resetOverlayedCanvas();this.isDrag&&this.zoomEnabled||!this._eventManager||this._eventManager.mouseEventHandler(a)}}; +p.prototype._plotAreaMouseDown=function(a,d){this.isDrag=!0;this.dragStartPoint={x:a,y:d}};p.prototype._plotAreaMouseUp=function(a,d){if(("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)&&this.isDrag){var b=d-this.dragStartPoint.y,c=a-this.dragStartPoint.x,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=!1;this.resetOverlayedCanvas();if("xySwapped"===this.plotInfo.axisPlacement)var l=g,g=e,e=l;if(this.panEnabled||this.zoomEnabled){if(this.panEnabled)for(e= +g=0;eb.maximum&&(g=b.viewportMaximum/b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum/g,b.sessionVariables.newViewportMaximum=b.viewportMaximum/g,m=!0):b.viewportMinimumb.maximum&&(g=b.viewportMaximum-b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum-g,b.sessionVariables.newViewportMaximum=b.viewportMaximum-g,m=!0);else if((!e||2Math.abs(b)&&(this.panEnabled||this.zoomEnabled)?this.toolTip.hide():this.panEnabled||this.zoomEnabled||this.toolTip.mouseMoveHandler(a, +d);if((!e||2f)var B=f,f=n,n=B;if(q.scaleBreaks)for(B=0;!g&&B=f;if(isFinite(q.dataInfo.minDiff))if(B=q.getApparentDifference(n,f,null,!0),!(g||!(this.panEnabled&&q.scaleBreaks&&q.scaleBreaks._appliedBreaks.length)&&(q.logarithmic&&Bq.maximum))w.push(q),s.push({val1:n,val2:f}),l=!0;else if(!e){l=!1;break}}return{isValid:l,axesWithValidRange:w,axesRanges:s}};p.prototype.preparePlotArea=function(){var a=this.plotArea;!r&&(0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2;a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2;a.width=a.x2-a.x1;a.height=a.y2-a.y1}this.axisY2&&0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2,a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2,a.width=a.x2-a.x1,a.height=a.y2-a.y1)}else d= +this.layoutManager.getFreeSpace(),a.x1=d.x1,a.x2=d.x2,a.y1=d.y1,a.y2=d.y2,a.width=d.width,a.height=d.height;r||(a.canvas.width=a.width,a.canvas.height=a.height,a.canvas.style.left=a.x1+"px",a.canvas.style.top=a.y1+"px",(0b.x2||h.point.yb.y2+1)continue}else if("rangearea"===s||"rangesplinearea"===s){if(h.dataPoint.xy.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("bubble")||0<=s.indexOf("scatter")){if(h.dataPoint.xy.viewportMaximum|| +h.dataPoint.yA.viewportMaximum)continue}else if(0<=s.indexOf("column")||"waterfall"===s||"error"===s&&!h.axisSwapped){if(h.dataPoint.xy.viewportMaximum||h.bounds.y1>b.y2||h.bounds.y2y.viewportMaximum||h.bounds.x1>b.x2||h.bounds.x2 +y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(h.dataPoint.xy.viewportMaximum)continue;e=m=2;"horizontal"===C?(l=f.width,w=f.height):(w=f.width,l=f.height);if("normal"===this.plotInfo.axisPlacement){if(0<=s.indexOf("line")||0<=s.indexOf("area"))t="auto",m=4;else if(0<=s.indexOf("stacked"))"auto"===t&&(t="inside");else if("bubble"===s||"scatter"===s)t="inside";q=h.point.x- +l/2;"inside"!==t?(e=b.y1,g=b.y2,0h.point.y)):(n=h.point.y+m+c,n>g-w-m-c&&(n="auto"===t?Math.min(h.point.y,g)-w-m-c:g-w-m-c,v=ng-w-m&&("bubble"===s||"scatter"===s)&&(n=Math.min(h.point.y+m,b.y2-w-m))),n=Math.min(n,g-w))}else 0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("scatter")?(t="auto",e=4):0<=s.indexOf("stacked")?"auto"===t&&(t="inside"):"bubble"===s&&(t="inside"),n=h.point.y-w/2,"inside"!==t?(m=b.x1,g=b.x2,0>ma?(q=h.point.x-l-e-c,qh.point.x)):(q=h.point.x+e+c,q>g-l-e-c&&(q="auto"=== +t?Math.min(h.point.x,g)-l-e-c:g-l-e-c,v=qma?Math.max(h.bounds.x1,b.x1)+l/2+e:Math.min(h.bounds.x2,b.x2)-l/2-e:(Math.max(h.bounds.x1,b.x1)+Math.min(h.bounds.x2,b.x2))/2,q=0>ma?Math.max(h.point.x,c)-l/2:Math.min(h.point.x,c)-l/2,q=Math.max(q,m));"vertical"===C&&(n+=w);f.x=q;f.y=n;f.render(!0);p&&("inside"!==t&&(0>s.indexOf("bar")&&("error"!==s||!h.axisSwapped)&&h.point.x>b.x1&&h.point.xs.indexOf("column")&&("error"!==s||h.axisSwapped)&&h.point.y>b.y1&&h.point.y=a.dataSeriesIndexes.length)){var c= +this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepLine=function(a){var d=a.targetCanvasCtx|| +this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&& +(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation, +easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderSpline=function(a){function d(a){a=v(a,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx;c.save();var g=this.plotArea;c.beginPath(); +c.rect(g.x1,g.y1,g.width,g.height);c.clip();for(var m=[],l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[p].y)0s[p].y===a.axisY.reversed?1:-1,color:B});u=!1}d(x)}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(g.x1,g.y1,g.width,g.height),e.beginPath());c.restore();c.beginPath();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width, +0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.dataPointWidth=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){m=a.axisX.convertValueToPixel(w);l=a.axisY.convertValueToPixel(B[g].y);m=a.axisX.reversed?m+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:m-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var k=a.axisX.reversed?m-q<<0:m+q<<0,t;0<=B[g].y?t=h:(t=l,l=h);l>t&&(c=l,l=t,t=c);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,l,k,t,c,0,null,p&&0<=B[g].y, +0>B[g].y&&p,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:m,y1:l,x2:k,y2:t};c=N(c);r&&ea(this._eventManager.ghostCtx,m,l,k,t,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"column",dataPoint:B[g],dataSeries:f,point:{x:m+(k-m)/2,y:0>B[g].y===a.axisY.reversed?l:t},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:m, +y1:Math.min(l,t),x2:k,y2:Math.max(l,t)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore(); +return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.y2?a.axisY.bounds.y2:h}}};p.prototype.renderStackedColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth? +this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q="undefined"!==typeof m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;g[c]=A+(y-q)}else A=m[c]?m[c]:0,y=q+A,q=n+A,m[c]=A+(y-q);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1, +!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedColumn",dataPoint:t[h],dataSeries:p,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q, +y)},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx, +animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderStackedColumn100=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth: +this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);q=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;q=a.axisY.convertValueToPixel(l[c]);y=g[c]?g[c]:n;g[c]=q}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=q+("undefined"!==typeof w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q=m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(q),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y1-q)&&(q=e.y1);g[c]=A+(y-q)}else A="undefined"!==typeof m[c]? +m[c]:0,y=q+A,q=n+A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y2-y)&&(y=e.y2),m[c]=A+(y-q);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&& +this._indexLabels.push({chartType:"stackedColumn100",dataPoint:t[h],dataSeries:k,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q,y)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&& +this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= +null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.options.dataPointWidth? +this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height); +b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){l=a.axisX.convertValueToPixel(w); +m=a.axisY.convertValueToPixel(B[g].y);l=a.axisX.reversed?l+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:l-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var p=a.axisX.reversed?l-q<<0:l+q<<0,t;0<=B[g].y?t=h:(t=m,m=h);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,t,l,m,p,c,0,null,k,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:t,y1:l,x2:m,y2:p};c= +N(c);r&&ea(this._eventManager.ghostCtx,t,l,m,p,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"bar",dataPoint:B[g],dataSeries:f,point:{x:0<=B[g].y?m:t,y:l+(p-l)/2},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(t,m),y1:l,x2:Math.max(t,m),y2:p},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas, +0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.x2?a.axisY.bounds.x2: +h}}};p.prototype.renderStackedBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<< +0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),s=m[c]? +m[c]:n,m[c]=y=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A=g[c]?g[c]:0;y=n+A;s+=A;g[c]=A+(s-y)}else A=m[c]?m[c]:0,y=s-A,s=n-A,m[c]=A+(s-y);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,y,x,s,v,c,0,null,u,!1,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:y,y1:x,x2:s,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,y,x,s,v,c,0,null,!1,!1,!1, +!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar",dataPoint:t[h],dataSeries:k,point:{x:0<=t[h].y?s:y,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(y,s),y1:x,x2:Math.max(y,s),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderStackedBar100=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)|| +(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save(); +b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&& +"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x;x=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var v=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,y=v+f<<0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;x=g[c]?g[c]:n;g[c]=s=a.axisY.convertValueToPixel(l[c])}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=x+(w[c]?w[c]:0),s=m[c]?m[c]: +n,m[c]=x=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(x),0<=t[h].y){var A=g[c]?g[c]:0;x=n+A;s+=A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x2-s)&&(s=e.x2);g[c]=A+(s-x)}else A=m[c]?m[c]:0,x=s-A,s=n-A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x1-x)&&(x=e.x1),m[c]=A+(s-x);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,v,s,y,c,0,null,u,!1,!1,!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k, +dataPointIndex:h,x1:x,y1:v,x2:s,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,v,s,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar100",dataPoint:t[h],dataSeries:p,point:{x:0<=t[h].y?s:x,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(x,s),y1:v,x2:Math.max(x,s),y2:y},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop", +a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!da)))if("number"!==typeof p[k].y)B.connectNullData||(da||d)||c(),da=!0;else{t=a.axisX.convertValueToPixel(x);u=a.axisY.convertValueToPixel(p[k].y);d||da?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||b===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d=t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,b=B.nullDataLineDashType,g.setLineDash(Y)),g.lineTo(t,u),r&&m.lineTo(t, +u)):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),da=d=!1):(g.lineTo(t,u),r&&m.lineTo(t,u),0==k%250&&c());q={x:t,y:u};kp[k].y===a.axisY.reversed?1:-1,color:z})}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderSplineArea=function(a){function d(){var b=v(x,2);if(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum? +t=p:0>a.axisY.viewportMaximum?t=m.y1:0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=a.axisX.lineCoordinates,m=a.axisY.lineCoordinates,l=[],w=this.plotArea;c.save();r&& +e.save();c.beginPath();c.rect(w.x1,w.y1,w.width,w.height);c.clip();r&&(e.beginPath(),e.rect(w.x1,w.y1,w.width,w.height),e.clip());for(var h=0;ha.axisX.dataInfo.viewPortMax&&(!q.connectNullData||!k)))if("number"!==typeof n[f].y)0n[f].y===a.axisY.reversed?1:-1,color:ma});k=!1}d();ia.drawMarkers(l)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(w.x1,w.y1,w.width,w.height), +this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!b))){var Z=u;"number"!==typeof k[p].y?(B.connectNullData||(b||d)||c(),b=!0):(t=a.axisX.convertValueToPixel(x),u=a.axisY.convertValueToPixel(k[p].y),d||b?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||Y===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d= +t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,Y=B.nullDataLineDashType,g.setLineDash(ca)),g.lineTo(t,Z),g.lineTo(t,u),r&&(m.lineTo(t,Z),m.lineTo(t,u))):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),b=d=!1):(g.lineTo(t,Z),r&&m.lineTo(t,Z),g.lineTo(t,u),r&&m.lineTo(t,u),0==p%250&&c()),q={x:t,y:u},pk[p].y===a.axisY.reversed?1:-1,color:z}))}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea=function(a){function d(){if(!(1>h.length)){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=[],l=this.plotArea,w=[],h=[],s=[],q=[],n=0,f,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),u=this._eventManager.ghostCtx,t,C,x;r&&u.beginPath();c.save();r&&u.save();c.beginPath();c.rect(l.x1,l.y1,l.width,l.height);c.clip();r&&(u.beginPath(),u.rect(l.x1,l.y1,l.width,l.height),u.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData||!da)))if("number"!==typeof Z.y)A.connectNullData||(da||C)||d(),da=!0;else{f=a.axisX.convertValueToPixel(g);var oa= +w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(Z.y),k-=oa;h.push({x:f,y:p-oa});w[g]=p-k;C||da?(!C&&A.connectNullData?(c.setLineDash&&(A.options.nullDataLineDashType||x===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(C=h.pop(),x=h[h.length-1],d(),c.moveTo(t.x,t.y),h.push(x),h.push(C),x=A.nullDataLineDashType, +c.setLineDash(Y)),c.lineTo(f,k),r&&u.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(u.beginPath(),u.moveTo(f,k))),da=C=!1):(c.lineTo(f,k),r&&u.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&u.moveTo(f,k),h.push({x:f,y:p-oa})));t={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&u.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(l.x1,l.y1,l.width,l.height),u.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea100=function(a){function d(){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=[],w=[],h=[],s=[],q=[],n=0,f,k,p,u,t,C=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),x=this._eventManager.ghostCtx;c.save();r&&x.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(x.beginPath(), +x.rect(m.x1,m.y1,m.width,m.height),x.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData|| +!da)))if("number"!==typeof Z.y)A.connectNullData||(da||u)||d(),da=!0;else{var oa;oa=0!==a.dataPointYSums[g]?100*(Z.y/a.dataPointYSums[g]):0;f=a.axisX.convertValueToPixel(g);var la=w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(oa),k-=la;h.push({x:f,y:C-la});w[g]=C-k;u||da?(!u&&A.connectNullData?(c.setLineDash&& +(A.options.nullDataLineDashType||t===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(u=h.pop(),t=h[h.length-1],d(),c.moveTo(p.x,p.y),h.push(t),h.push(u),t=A.nullDataLineDashType,c.setLineDash(Y)),c.lineTo(f,k),r&&x.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(x.beginPath(),x.moveTo(f,k))),da=u=!1):(c.lineTo(f,k),r&&x.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&x.moveTo(f,k),h.push({x:f,y:C-la})));p={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&x.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(l);r&&(b.drawImage(this._preRenderCanvas,0, +0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),x.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}}; +p.prototype.renderBubble=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=-Infinity,w=Infinity,h=0;ha.axisX.dataInfo.viewPortMax||"undefined"===typeof n[e].z||(f=n[e].z,f>l&&(l=f),fa.axisX.dataInfo.viewPortMax)&&"number"===typeof n[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(n[e].y);var f=n[e].z,u=2*Math.max(Math.sqrt((l===w?p/2:k+(p-k)/(l-w)*(f-w))/Math.PI)<<0,1),f=q.getMarkerProperties(e,b);f.size=u;b.globalAlpha=q.fillOpacity;ia.drawMarker(g,m,b,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;var t=q.dataPointIds[e];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:s, +dataPointIndex:e,x1:g,y1:m,size:u};u=N(t);r&&ia.drawMarker(g,m,this._eventManager.ghostCtx,f.type,f.size,u,u,f.borderThickness);(n[e].indexLabel||q.indexLabel||n[e].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"bubble",dataPoint:n[e],dataSeries:q,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/2,x2:g+f.size/2,y2:m+f.size/2},color:null})}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderScatter=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=0;la.axisX.dataInfo.viewPortMax)&&"number"===typeof s[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(s[e].y);var f=h.getMarkerProperties(e,g,m,b);b.globalAlpha=h.fillOpacity;ia.drawMarker(f.x,f.y,f.ctx,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;Math.sqrt((q-g)*(q-g)+(n-m)*(n-m))Math.min(this.plotArea.width,this.plotArea.height)||(q=h.dataPointIds[e],this._eventManager.objectMap[q]={id:q,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:e,x1:g,y1:m},q=N(q),r&&ia.drawMarker(f.x,f.y,this._eventManager.ghostCtx,f.type,f.size,q,q,f.borderThickness),(s[e].indexLabel||h.indexLabel||s[e].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"scatter",dataPoint:s[e],dataSeries:h,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/ +2,x2:g+f.size/2,y2:m+f.size/2},color:null}),q=g,n=m)}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore()); +b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderCandlestick=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=0,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,g=this.options.dataPointMaxWidth? +this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*m.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&&e>g&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,g));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&gg&&(k=g);b.save();r&&c.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(c.beginPath(),c.rect(m.x1,m.y1,m.width,m.height),c.clip());for(var p=0;pa.axisX.dataInfo.viewPortMax)&&!u(C[l].y)&&C[l].y.length&& +"number"===typeof C[l].y[0]&&"number"===typeof C[l].y[1]&&"number"===typeof C[l].y[2]&&"number"===typeof C[l].y[3]){w=a.axisX.convertValueToPixel(f);h=a.axisY.convertValueToPixel(C[l].y[0]);s=a.axisY.convertValueToPixel(C[l].y[1]);q=a.axisY.convertValueToPixel(C[l].y[2]);n=a.axisY.convertValueToPixel(C[l].y[3]);var z=w-k/2<<0,y=z+k<<0,g=t.options.fallingColor?t.fallingColor:t._colorSet[0],e=C[l].color?C[l].color:t._colorSet[0],A=Math.round(Math.max(1,0.15*k)),D=0===A%2?0:0.5,aa=t.dataPointIds[l]; +this._eventManager.objectMap[aa]={id:aa,objectType:"dataPoint",dataSeriesIndex:v,dataPointIndex:l,x1:z,y1:h,x2:y,y2:s,x3:w,y3:q,x4:w,y4:n,borderThickness:A,color:e};b.strokeStyle=e;b.beginPath();b.lineWidth=A;c.lineWidth=Math.max(A,4);"candlestick"===t.type?(b.moveTo(w-D,s),b.lineTo(w-D,Math.min(h,n)),b.stroke(),b.moveTo(w-D,Math.max(h,n)),b.lineTo(w-D,q),b.stroke(),ea(b,z,Math.min(h,n),y,Math.max(h,n),C[l].y[0]<=C[l].y[3]?t.risingColor:g,A,e,x,x,!1,!1,t.fillOpacity),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w- +D,s),c.lineTo(w-D,Math.min(h,n)),c.stroke(),c.moveTo(w-D,Math.max(h,n)),c.lineTo(w-D,q),c.stroke(),ea(c,z,Math.min(h,n),y,Math.max(h,n),e,0,null,!1,!1,!1,!1))):"ohlc"===t.type&&(b.moveTo(w-D,s),b.lineTo(w-D,q),b.stroke(),b.beginPath(),b.moveTo(w,h),b.lineTo(z,h),b.stroke(),b.beginPath(),b.moveTo(w,n),b.lineTo(y,n),b.stroke(),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w-D,s),c.lineTo(w-D,q),c.stroke(),c.beginPath(),c.moveTo(w,h),c.lineTo(z,h),c.stroke(),c.beginPath(),c.moveTo(w,n),c.lineTo(y,n),c.stroke())); +(C[l].indexLabel||t.indexLabel||C[l].indexLabelFormatter||t.indexLabelFormatter)&&this._indexLabels.push({chartType:t.type,dataPoint:C[l],dataSeries:t,point:{x:z+(y-z)/2,y:a.axisY.reversed?q:s},direction:1,bounds:{x1:z,y1:Math.min(s,q),x2:y,y2:Math.max(s,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas, +0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderBoxAndWhisker=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e= +null,g=this.plotArea,m=0,l,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*g.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&& +e>m&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(k=m);b.save();r&&c.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(c.beginPath(),c.rect(g.x1,g.y1,g.width,g.height),c.clip());for(var p=!1,p=!!a.axisY.reversed,v=0;va.axisX.dataInfo.viewPortMax)&&!u(x[m].y)&&x[m].y.length&&"number"===typeof x[m].y[0]&&"number"===typeof x[m].y[1]&&"number"===typeof x[m].y[2]&&"number"===typeof x[m].y[3]&&"number"===typeof x[m].y[4]&&5===x[m].y.length){l=a.axisX.convertValueToPixel(f);w=a.axisY.convertValueToPixel(x[m].y[0]);h=a.axisY.convertValueToPixel(x[m].y[1]);s=a.axisY.convertValueToPixel(x[m].y[2]); +q=a.axisY.convertValueToPixel(x[m].y[3]);n=a.axisY.convertValueToPixel(x[m].y[4]);var y=l-k/2<<0,A=l+k/2<<0,e=x[m].color?x[m].color:C._colorSet[0],D=Math.round(Math.max(1,0.15*k)),aa=0===D%2?0:0.5,T=x[m].whiskerColor?x[m].whiskerColor:x[m].color?C.whiskerColor?C.whiskerColor:x[m].color:C.whiskerColor?C.whiskerColor:e,Y="number"===typeof x[m].whiskerThickness?x[m].whiskerThickness:"number"===typeof C.options.whiskerThickness?C.whiskerThickness:D,ca=x[m].whiskerDashType?x[m].whiskerDashType:C.whiskerDashType, +da=u(x[m].whiskerLength)?u(C.options.whiskerLength)?k:C.whiskerLength:x[m].whiskerLength,da="number"===typeof da?0>=da?0:da>=k?k:da:"string"===typeof da?parseInt(da)*k/100>k?k:parseInt(da)*k/100:k,Z=1===Math.round(Y)%2?0.5:0,oa=x[m].stemColor?x[m].stemColor:x[m].color?C.stemColor?C.stemColor:x[m].color:C.stemColor?C.stemColor:e,la="number"===typeof x[m].stemThickness?x[m].stemThickness:"number"===typeof C.options.stemThickness?C.stemThickness:D,G=1===Math.round(la)%2?0.5:0,F=x[m].stemDashType?x[m].stemDashType: +C.stemDashType,E=x[m].lineColor?x[m].lineColor:x[m].color?C.lineColor?C.lineColor:x[m].color:C.lineColor?C.lineColor:e,H="number"===typeof x[m].lineThickness?x[m].lineThickness:"number"===typeof C.options.lineThickness?C.lineThickness:D,I=x[m].lineDashType?x[m].lineDashType:C.lineDashType,K=1===Math.round(H)%2?0.5:0,L=C.upperBoxColor,O=C.lowerBoxColor,Q=u(C.options.fillOpacity)?1:C.fillOpacity,P=C.dataPointIds[m];this._eventManager.objectMap[P]={id:P,objectType:"dataPoint",dataSeriesIndex:t,dataPointIndex:m, +x1:y,y1:w,x2:A,y2:h,x3:l,y3:s,x4:l,y4:q,y5:n,borderThickness:D,color:e,stemThickness:la,stemColor:oa,whiskerThickness:Y,whiskerLength:da,whiskerColor:T,lineThickness:H,lineColor:E};b.save();0=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth: +1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.03*this.width;var h=a.axisX.dataInfo.minDiff;isFinite(h)||(h=0.3*Math.abs(a.axisX.range));h=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(h)/Math.log(a.axisX.range):Math.abs(h)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&& +(this.dataPointMinWidth&&mm&&(h=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var s=0;sa.axisX.dataInfo.viewPortMax)&&!u(f[g].y)&&f[g].y.length&&"number"===typeof f[g].y[0]&&"number"===typeof f[g].y[1]){c=a.axisX.convertValueToPixel(w);m=a.axisY.convertValueToPixel(f[g].y[0]);l=a.axisY.convertValueToPixel(f[g].y[1]);var p=a.axisX.reversed?c+a.plotType.totalDataSeries*h/2-(a.previousDataSeriesCount+s)*h<<0:c-a.plotType.totalDataSeries*h/2+(a.previousDataSeriesCount+ +s)*h<<0,v=a.axisX.reversed?p-h<<0:p+h<<0,c=f[g].color?f[g].color:n._colorSet[g%n._colorSet.length];if(m>l){var t=m;m=l;l=t}t=n.dataPointIds[g];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:q,dataPointIndex:g,x1:p,y1:m,x2:v,y2:l};ea(b,p,m,v,l,c,0,c,k,k,!1,!1,n.fillOpacity);c=N(t);r&&ea(this._eventManager.ghostCtx,p,m,v,l,c,0,null,!1,!1,!1,!1);if(f[g].indexLabel||n.indexLabel||f[g].indexLabelFormatter||n.indexLabelFormatter)this._indexLabels.push({chartType:"rangeColumn", +dataPoint:f[g],dataSeries:n,indexKeyword:0,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?l:m},direction:f[g].y[1]>=f[g].y[0]?-1:1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c}),this._indexLabels.push({chartType:"rangeColumn",dataPoint:f[g],dataSeries:n,indexKeyword:1,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?m:l},direction:f[g].y[1]>=f[g].y[0]?1:-1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation= +"source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderError= +function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=a.axisY._position?"left"===a.axisY._position||"right"===a.axisY._position?!1:!0:!1;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=!1,m=this.plotArea,l=0,w,h,s,q,n,f,k,p=a.axisX.dataInfo.minDiff;isFinite(p)||(p=0.3*Math.abs(a.axisX.range));b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(m.x1, +m.y1,m.width,m.height),this._eventManager.ghostCtx.clip());for(var v=0,t=0;tl&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,l));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ll&&(t=l);if(0=T.length?0:T.length>=t?t:T.length:"string"===typeof T.length?parseInt(T.length)*t/100>t?t:parseInt(T.length)*t/100>t:t;T.thickness="number"===typeof T.thickness?0>T.thickness?0:Math.round(T.thickness):2;var Y={color:y[l].stemColor?y[l].stemColor:y[l].color?z.stemColor?z.stemColor:y[l].color:z.stemColor?z.stemColor:e,thickness:y[l].stemThickness?y[l].stemThickness:z.stemThickness,dashType:y[l].stemDashType? +y[l].stemDashType:z.stemDashType};Y.thickness="number"===typeof Y.thickness?0>Y.thickness?0:Math.round(Y.thickness):2;y[l].getTime?k=y[l].x.getTime():k=y[l].x;if(!(ka.axisX.dataInfo.viewPortMax)&&!u(y[l].y)&&y[l].y.length&&"number"===typeof y[l].y[0]&&"number"===typeof y[l].y[1]){var ca=a.axisX.convertValueToPixel(k);c?h=ca:w=ca;ca=a.axisY.convertValueToPixel(y[l].y[0]);c?s=ca:n=ca;ca=a.axisY.convertValueToPixel(y[l].y[1]);c?q=ca:f=ca;c?(n=a.axisX.reversed?h+(A?v: +1)*t/2-(A?D-1:0)*t<<0:h-(A?v:1)*t/2+(A?D-1:0)*t<<0,f=a.axisX.reversed?n-t<<0:n+t<<0):(s=a.axisX.reversed?w+(A?v:1)*t/2-(A?D-1:0)*t<<0:w-(A?v:1)*t/2+(A?D-1:0)*t<<0,q=a.axisX.reversed?s-t<<0:s+t<<0);!c&&n>f&&(ca=n,n=f,f=ca);c&&s>q&&(ca=s,s=q,q=ca);ca=z.dataPointIds[l];this._eventManager.objectMap[ca]={id:ca,objectType:"dataPoint",dataSeriesIndex:x,dataPointIndex:l,x1:Math.min(s,q),y1:Math.min(n,f),x2:Math.max(q,s),y2:Math.max(f,n),isXYSwapped:c,stemProperties:Y,whiskerProperties:T};E(b,Math.min(s,q), +Math.min(n,f),Math.max(q,s),Math.max(f,n),e,T,Y,c);r&&E(this._eventManager.ghostCtx,s,n,q,f,e,T,Y,c);if(y[l].indexLabel||z.indexLabel||y[l].indexLabelFormatter||z.indexLabelFormatter)this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:0,point:{x:c?y[l].y[1]>=y[l].y[0]?s:q:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?f:n},direction:y[l].y[1]>=y[l].y[0]?-1:1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c}), +this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:1,point:{x:c?y[l].y[1]>=y[l].y[0]?q:s:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?n:f},direction:y[l].y[1]>=y[l].y[0]?1:-1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height), +a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx: +d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0;var s=a.axisX.dataInfo.minDiff;isFinite(s)||(s=0.3*Math.abs(a.axisX.range));s=this.options.dataPointWidth?this.dataPointWidth:0.9* +(e.height*(a.axisX.logarithmic?Math.log(s)/Math.log(a.axisX.range):Math.abs(s)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(s=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(), +this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var q=0;qa.axisX.dataInfo.viewPortMax)&&!u(k[g].y)&&k[g].y.length&&"number"===typeof k[g].y[0]&&"number"===typeof k[g].y[1]){m=a.axisY.convertValueToPixel(k[g].y[0]); +l=a.axisY.convertValueToPixel(k[g].y[1]);w=a.axisX.convertValueToPixel(h);w=a.axisX.reversed?w+a.plotType.totalDataSeries*s/2-(a.previousDataSeriesCount+q)*s<<0:w-a.plotType.totalDataSeries*s/2+(a.previousDataSeriesCount+q)*s<<0;var v=a.axisX.reversed?w-s<<0:w+s<<0;m>l&&(c=m,m=l,l=c);c=k[g].color?k[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,w,l,v,c,0,null,p,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g, +x1:m,y1:w,x2:l,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,m,w,l,v,c,0,null,!1,!1,!1,!1);if(k[g].indexLabel||f.indexLabel||k[g].indexLabelFormatter||f.indexLabelFormatter)this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:0,point:{x:k[g].y[1]>=k[g].y[0]?m:l,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?-1:1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c}),this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:1,point:{x:k[g].y[1]>= +k[g].y[0]?l:m,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?1:-1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1, +e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeArea=function(a){function d(){if(C){var a=null;0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width,m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!s.connectNullData||!T)))if(null!==q[f].y&&q[f].y.length&&"number"===typeof q[f].y[0]&&"number"===typeof q[f].y[1]){k=a.axisX.convertValueToPixel(t);p=a.axisY.convertValueToPixel(q[f].y[0]);u=a.axisY.convertValueToPixel(q[f].y[1]);n||T?(s.connectNullData&&!n?(c.setLineDash&&(s.options.nullDataLineDashType||A===s.lineDashType&&s.lineDashType!==s.nullDataLineDashType)&&(w[w.length- +1].newLineDashArray=D,A=s.nullDataLineDashType,c.setLineDash(z)),c.lineTo(k,p),r&&e.lineTo(k,p),w.push({x:k,y:u})):(c.beginPath(),c.moveTo(k,p),C={x:k,y:p},w=[],w.push({x:k,y:u}),r&&(e.beginPath(),e.moveTo(k,p))),T=n=!1):(c.lineTo(k,p),w.push({x:k,y:u}),r&&e.lineTo(k,p),0==f%250&&d());t=s.dataPointIds[f];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:h,dataPointIndex:f,x1:k,y1:p,y2:u};fq[f].y[1]===a.axisY.reversed?-1:1,color:x}),this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:1,point:{x:k, +y:u},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?1:-1,color:x})}else T||n||d(),T=!0;d();ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1, +m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderRangeSplineArea=function(a){function d(a,b){var d=v(u,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width, +m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!f)))if(null!==k[q].y&&k[q].y.length&&"number"===typeof k[q].y[0]&&"number"===typeof k[q].y[1]){n=a.axisX.convertValueToPixel(n);f=a.axisY.convertValueToPixel(k[q].y[0]);p=a.axisY.convertValueToPixel(k[q].y[1]);var E=h.dataPointIds[q];this._eventManager.objectMap[E]={id:E,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:q, +x1:n,y1:f,y2:p};u[u.length]={x:n,y:f};z[z.length]={x:n,y:p};q=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx,e=null,g=this.plotArea,m=0,l,k,h,s,q=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),m=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;k=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width,0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0;var n= +a.axisX.dataInfo.minDiff;isFinite(n)||(n=0.3*Math.abs(a.axisX.range));n=this.options.dataPointWidth?this.dataPointWidth:0.6*(g.width*(a.axisX.logarithmic?Math.log(n)/Math.log(a.axisX.range):Math.abs(n)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&m>k&&(m=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,k));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&kk&&(n=k);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.clip());for(var f=0;fh&&(e=k,k=h,h=e);a.axisY.reversed&&(e=k,k=h,h=e);e=u.dataPointIds[m];this._eventManager.objectMap[e]={id:e,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:m,x1:l,y1:k,x2:F,y2:h}; +var T=v[m].color?v[m].color:0v[m].y===a.axisY.reversed?1:-1,bounds:{x1:l,y1:Math.min(k,h),x2:F,y2:Math.max(k,h)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height), +b.clearRect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};var ja=function(a,d,b,c,e,g,m,l,k){if(!(0>b)){"undefined"===typeof l&&(l=1);if(!r){var h=Number((m%(2*Math.PI)).toFixed(8));Number((g%(2*Math.PI)).toFixed(8))===h&&(m-=1E-4)}a.save();a.globalAlpha=l;"pie"===e?(a.beginPath(),a.moveTo(d.x,d.y),a.arc(d.x,d.y,b,g,m,!1),a.fillStyle=c,a.strokeStyle= +"white",a.lineWidth=2,a.closePath(),a.fill()):"doughnut"===e&&(a.beginPath(),a.arc(d.x,d.y,b,g,m,!1),0<=k&&a.arc(d.x,d.y,k*b,m,g,!0),a.closePath(),a.fillStyle=c,a.strokeStyle="white",a.lineWidth=2,a.fill());a.globalAlpha=1;a.restore()}};p.prototype.renderPie=function(a){function d(){if(h&&s){for(var a=0,b=0,c=0,e=0,d=0;dMath.PI/2-t&&m.midAngle +m.midAngle)c=d;a++}else if(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t){if(0===b||f[e].midAngle>m.midAngle)e=d;b++}m.hemisphere=g>Math.PI/2&&g<=3*Math.PI/2?"left":"right";m.indexLabelTextBlock=new ka(k.plotArea.ctx,{fontSize:m.indexLabelFontSize,fontFamily:m.indexLabelFontFamily,fontColor:m.indexLabelFontColor,fontStyle:m.indexLabelFontStyle,fontWeight:m.indexLabelFontWeight,horizontalAlign:"left",backgroundColor:m.indexLabelBackgroundColor,maxWidth:m.indexLabelMaxWidth,maxHeight:m.indexLabelWrap? +5*m.indexLabelFontSize:1.5*m.indexLabelFontSize,text:m.indexLabelText,padding:0,textBaseline:"top"});m.indexLabelTextBlock.measureText()}l=g=0;q=!1;for(d=0;dMath.PI/2-t&&m.midAngle3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t)&&(l<=b/2&&!q?(m.hemisphere="left",l++):(m.hemisphere="right",q=!0))}}function b(a){var b= +k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);for(b=0;bc){var d=0.07*A*Math.cos(f[b].midAngle),g=0.07*A*Math.sin(f[b].midAngle),m=!1;if(s[b].exploded){if(1E-9a.indexLabelTextBlock.y?d-e:c-f}function e(a){for(var b=null,e=1;ec(f[b],f[a])||("right"===f[a].hemisphere?f[b].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y:f[b].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y)))break;else b=null;return b}function g(a,b,d){d=(d||0)+1;if(1E3< +d)return 0;b=b||0;var m=0,h=x.y-1*r,l=x.y+1*r;if(0<=a&&ab&&n.indexLabelTextBlock.yl)return 0;var k=0,q=0,q=k=k=0;0>b?n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2>h&&n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+bl&&(b=n.indexLabelTextBlock.y+ +n.indexLabelTextBlock.height/2+b-l);b=n.indexLabelTextBlock.y+b;h=0;h="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2));q=x.x+A*Math.cos(n.midAngle);k=x.y+A*Math.sin(n.midAngle);k=Math.sqrt(Math.pow(h-q,2)+Math.pow(b-k,2));q=Math.acos(A/r);k=Math.acos((r*r+A*A-k*k)/(2*A*r));b=kc(f[h],f[a])||("right"===f[a].hemisphere?f[h].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y:f[h].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y)))break;else h=null;q=h;k=e(a);l=h=0;0>b?(l="right"===n.hemisphere?q:k,m=b,null!==l&&(q=-b,b=n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2-(f[l].indexLabelTextBlock.y+f[l].indexLabelTextBlock.height/2),b-q+h.toFixed(C)&&(m=b>p?-(b-p):-(q-(l-h)))))):0p?b-p:q-(h-l)))));m&&(d=n.indexLabelTextBlock.y+m,b=0,b="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)),n.midAngle>Math.PI/2-t&&n.midAngleh.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x-15:"right"===n.hemisphere&&("left"===a.hemisphere&&b3*Math.PI/2-t&&n.midAngle<3*Math.PI/2+t&&(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"right"===n.hemisphere&&"left"===h.hemisphere&&ba.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x- +15)),n.indexLabelTextBlock.y=d,n.indexLabelTextBlock.x=b,n.indexLabelAngle=Math.atan2(n.indexLabelTextBlock.y-x.y,n.indexLabelTextBlock.x-x.x))}return m}function m(){var a=k.plotArea.ctx;a.fillStyle="grey";a.strokeStyle="grey";a.font="16px Arial";a.textBaseline="middle";for(var b=a=0,d=0,m=!0,b=0;10>b&&(1>b||0z){for(var E=u=0,H=0;Hu?l.indexLabelText="":l.indexLabelTextBlock.maxWidth=0.85*u,0.3*l.indexLabelTextBlock.maxWidthd&&(d=y)),y=y=0,0d&&(d=y)));var K=function(a, +b,c){for(var e=[],d=0;e.push(f[b]),b!==c;b=(b+1+s.length)%s.length);e.sort(function(a,b){return a.y-b.y});for(b=0;bz){n=t.indexLabelTextBlock.x;var k=t.indexLabelTextBlock.y-t.indexLabelTextBlock.height/ +2,w=t.indexLabelTextBlock.y+t.indexLabelTextBlock.height/2,p=h.indexLabelTextBlock.y-h.indexLabelTextBlock.height/2,u=h.indexLabelTextBlock.x+h.indexLabelTextBlock.width,r=h.indexLabelTextBlock.y+h.indexLabelTextBlock.height/2;n=t.indexLabelTextBlock.x+t.indexLabelTextBlock.widthu+q||k>r+q||wa&&(a=l),m!==a&&(b=m,d+=-z),0===l%Math.max(s.length/10,3)&&(g=!0)):g=!0;g&&(0=a.dataSeriesIndexes.length)){var h= +this.data[a.dataSeriesIndexes[0]],s=h.dataPoints,q=10,n=this.plotArea,f=h.dataPointEOs,p=2,r,v=1.3,t=20/180*Math.PI,C=6,x={x:(n.x2+n.x1)/2,y:(n.y2+n.y1)/2},z=0;a=!1;for(var y=0;ya&&(e=a,d=!0);var g=s[b].color?s[b].color:h._colorSet[b%h._colorSet.length];e>c&&ja(k.plotArea.ctx, +f[b].center,f[b].radius,g,h.type,c,e,h.fillOpacity,f[b].percentInnerRadius);if(d)break}l()},function(){k.disableToolTip=!1;k._animator.animate(0,k.animatedRender?500:0,function(a){b(a);l()})})}}};var ra=function(a,d,b,c){"undefined"===typeof b&&(b=1);0>=Math.round(d.y4-d.y1)||(a.save(),a.globalAlpha=b,a.beginPath(),a.moveTo(Math.round(d.x1),Math.round(d.y1)),a.lineTo(Math.round(d.x2),Math.round(d.y2)),a.lineTo(Math.round(d.x3),Math.round(d.y3)),a.lineTo(Math.round(d.x4),Math.round(d.y4)),"undefined"!== +d.x5&&(a.lineTo(Math.round(d.x5),Math.round(d.y5)),a.lineTo(Math.round(d.x6),Math.round(d.y6))),a.closePath(),a.fillStyle=c?c:d.color,a.fill(),a.globalAplha=1,a.restore())};p.prototype.renderFunnel=function(a){function d(){for(var a=0,b=[],c=0;ck?(k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=0==k?0:a/k,h+=a/k,m=!0):(n=(Math.abs(ba)*b-Math.sqrt(k))/2,k=b-2*n/Math.abs(ba),h+=n,h>d&&(h-=n, +k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=a/k,h+=a/k,m=!0),b=k)),e.push(n);return e}function c(){if(t&&C){for(var a,b,c,e,d,g,l,h,m,n,k,q,s,w,p=[],B=[],x={percent:null,total:null},v=null,y=0;yp[y]&&(p[y]=y!==fa?t.reversed?P[y].x3-P[y].x4:P[y].x2-P[y].x1:P[y].x2-P[y].x1,p[y]/=2));s=b.indexLabelMaxWidth?b.indexLabelMaxWidth:t.options.indexLabelMaxWidth?t.indexLabelMaxWidth:p[y];if(s>p[y]||0>s)s=p[y];B[y]="inside"===t.indexLabelPlacement?P[y].height:!1;x=z.getPercentAndTotal(t,b);if(t.indexLabelFormatter||b.indexLabelFormatter)v={chart:z.options,dataSeries:t,dataPoint:b,total:x.total,percent:x.percent};b=b.indexLabelFormatter?b.indexLabelFormatter(v):b.indexLabel? +z.replaceKeywordsWithValue(b.indexLabel,b,t,y):t.indexLabelFormatter?t.indexLabelFormatter(v):t.indexLabel?z.replaceKeywordsWithValue(t.indexLabel,b,t,y):b.label?b.label:"";0>=n&&(n=0);1E3>s&&1E3-sl?l:t.indexLabelMaxWidth:l,h=J.length-1;0<=h;h--){g=C[J[h].id];c=J[h];e=c.textBlock;b=(a=n(h)b.y&&(d=!0);c=g.indexLabelMaxWidth||l;if(c>l||0>c)c=l;f.push(c)}if(d)for(h=J.length-1;0<=h;h--)a=P[h],J[h].textBlock.maxWidth= +f[f.length-(h+1)],J[h].textBlock.measureText(),J[h].textBlock.x=L-l,c=J[h].textBlock.heightpa+D&&(J[h].textBlock.y=pa+D-J[h].height),J[h].textBlock.ywa+D&&(J[h].textBlock.y=wa+D-J[h].height))}function g(){var a,b,c,e;if("inside"!==t.indexLabelPlacement)for(var d=0;dDa?f(c).x2+1:(a.x2+a.x3)/2+1:(a.x2+a.x3)/2+1:"undefined"!==typeof a.x5?cpa+D&&(J[d].textBlock.y=pa+D-J[d].height),J[d].textBlock.ywa+D&&(J[d].textBlock.y=wa+D-J[d].height)));else for(d=0;d=c?(b=d!=fa?(a.x4+a.x3)/2-e/2:(a.x5+a.x4)/2-e/2,c=d!=fa?(a.y1+a.y3)/2-c/2:(a.y1+a.y4)/2-c/2,J[d].textBlock.x=b, +J[d].textBlock.y=c):J[d].isDirty=!0)}function m(){function a(b,c){var d;if(0>b||b>=J.length)return 0;var e,f=J[b].textBlock;if(0>c){c*=-1;e=q(b);d=l(e,b);if(d>=c)return f.y-=c,c;if(0==b)return 0=c)return f.y+=c,c;if(b==P.length-1)return 0e)&&(l=n(s),!(l>=J.length-1)&&J[s].textBlock.y+J[s].height+ga>J[l].textBlock.y&&(J[s].textBlock.y=J[s].textBlock.y+J[s].height-e>e-J[s].textBlock.y?e+1:e-J[s].height-1))}for(l=P.length-1;0e&&(e=0,J[e].isDirty))break;if(J[l].textBlock.y=f){f=0;h+=J[f].height;break}e=q(f); +if(0>e){f=0;h+=J[f].height;break}}if(f!=l){g=J[f].textBlock.y;a-=g;a=h-a;g=c(a,d,f);break}}}return g}function c(a,b,d){var e=[],f=0,g=0;for(a=Math.abs(a);d<=b;d++)e.push(P[d]);e.sort(function(a,b){return a.height-b.height});for(d=0;d+m.y.toFixed(6))&&(d=g.y+d+ga-m.y,e=a(w,-d),ea?t.reversed?wa-D:pa-D:J[a].textBlock.y+J[a].height+ga)}function k(a,b,c){var d,e,f,l=[],m=D,n=[];-1!==b&&(0<=W.indexOf(b)?(e=W.indexOf(b),W.splice(e,1)):(W.push(b),W=W.sort(function(a,b){return a-b})));if(0===W.length)l= +ia;else{e=D*(1!=W.length||0!=W[0]&&W[0]!=P.length-1?2:1)/h();for(var q=0;qn&&(n*=-1),c.y1+=b-n[d],c.y2+=b-n[d],c.y3+=b-n[d],c.y4+=b-n[d],c.y5&&(c.y5+=b-n[d],c.y6+=b-n[d]),n[d]=b}};a._animator.animate(0,c,function(c){var d=a.plotArea.ctx||a.ctx;ja=!0;d.clearRect(x.x1,x.y1,x.x2-x.x1,x.y2-x.y1);d.fillStyle=a.backgroundColor;d.fillRect(x.x1,x.y1,x.width,x.height);w.changeSection(c,b);var e={};e.dataSeries=t;e.dataPoint=t.reversed?t.dataPoints[C.length-1-b]:t.dataPoints[b];e.index=t.reversed?C.length-1-b:b;a.toolTip.highlightObjects([e]); +for(e=0;ea){b=P[c];break}return b?(a=b.y6?a>b.y6?b.x3+(b.x4-b.x3)/(b.y4-b.y3)*(a-b.y3):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2), +{x1:a,x2:a}):-1}function p(a){for(var b=0;b=a.dataSeriesIndexes.length)){for(var t=this.data[a.dataSeriesIndexes[0]],C=t.dataPoints,x=this.plotArea,D=0.025*x.width,y=0.01*x.width,A=0,F=x.height-2*D,E=Math.min(x.width-2*y,2.8*x.height),H=!1,I=0;IF?N=F:0>=N&&(N=0),G>a?G=a-0.5:0>=G&&(G=0)):"pyramid"===t.type&&(G=N=0,t.reversed=t.reversed?!1:!0);var y=I+a/2,$=I,V=I+a,pa=t.reversed?Z:O,K=y-G/2,ea=y+G/2,Da=t.reversed?O+N:Z- +N,wa=t.reversed?O:Z;a=[];var y=[],P=[],E=[],X=O,fa,ba=(Da-pa)/(K-$),ha=-ba,I="area"===(t.valueRepresents?t.valueRepresents:"height")?b():d();if(-1!==I){if(t.reversed)for(E.push(X),G=I.length-1;0a&&(A=a));for(G=0;G\n');c.document.close();setTimeout(function(){c.focus();c.print();setTimeout(function(){b._canvasJSContainer.removeChild(d)},1E3)},500)};p.prototype.getPercentAndTotal=function(a,d){var b=null,c=null, +e=null;if(0<=a.type.indexOf("stacked"))c=0,b=d.x.getTime?d.x.getTime():d.x,b in a.plotUnit.yTotals&&(c=a.plotUnit.yTotals[b],e=isNaN(d.y)?0:100*(d.y/c));else if("pie"===a.type||"doughnut"===a.type||"funnel"===a.type||"pyramid"===a.type){for(b=c=0;b=m||"undefined"=== +typeof m||0>=v||"undefined"===typeof v)){if("horizontal"===this.orientation){n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:v,maxHeight:this.itemWrap?m:this.lineHeight,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"});n.textBlock.measureText();null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"=== +n.chartType?2*0.1*this.lineHeight:0)));if(!q||q.width+Math.round(n.textBlock.width+r+l+(0===q.width?0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))>g)q={items:[],width:0},h.push(q),this.height+=f,f=0;f=Math.max(f,n.textBlock.height)}else n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:x,maxHeight:!0===this.itemWrap?m:1.5*this.fontSize,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily, +fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"}),n.textBlock.measureText(),null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))),this.height>0,0),this.dataPoints.length):0):(s=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,s=0>0,0),this.dataPoints.length):0));for(;;){g=0a?c.x/a:a/c.x: +Math.abs(c.x-a);qs-e&&s+e>=this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}return d||b.dataPoint.x!==a?d&&null!==b.dataPoint?b:null:b};F.prototype.getDataPointAtXY=function(a,d,b){if(!this.dataPoints||0===this.dataPoints.length||athis.chart.plotArea.x2||dthis.chart.plotArea.y2)return null;b=b||!1;var c=[],e=0,g=0,m=1,l=!1,k=Infinity, +h=0,s=0,q=0;if("none"!==this.chart.plotInfo.axisPlacement)if(q=(this.chart.axisX[0]?this.chart.axisX[0]:this.chart.axisX2[0]).getXValueAt({x:a,y:d}),this.axisX.logarithmic)var n=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),q=1>0,0),this.dataPoints.length):0;else n=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,q=0> +0,0),this.dataPoints.length):0;for(;;){g=0=n.x1&&(a<=n.x2&&d>=n.y1&&d<=n.y2)&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1- +a),Math.abs(n.x2-a),Math.abs(n.y1-d),Math.abs(n.y2-d))}),l=!0);break;case "line":case "stepLine":case "spline":case "area":case "stepArea":case "stackedArea":case "stackedArea100":case "splineArea":case "scatter":var u=na("markerSize",f,this)||4,r=b?20:u,p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0r&&(p=Math.atan2(d-u.y,a-u.x),0>p&&(p+=2*Math.PI),p=Number(((180*(p/Math.PI)%360+360)%360).toFixed(12)),u=Number(((180*(n.startAngle/Math.PI)%360+360)%360).toFixed(12)),r=Number(((180*(n.endAngle/Math.PI)%360+360)%360).toFixed(12)),0===r&&1=r&&0!==f.y&&(r+=360,pu&&pp.y1&&dp.y6?(g=p.x6+(p.x5-p.x6)/(p.y5-p.y6)*(d-p.y6),p=p.x3+(p.x4-p.x3)/(p.y4-p.y3)*(d-p.y3)):(g=p.x1+(p.x6-p.x1)/(p.y6-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)):(g=p.x1+(p.x4-p.x1)/(p.y4-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)),a>g&&a=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y4-n.borderThickness/2&&d<=n.y1+n.borderThickness/ +2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "candlestick":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y2-n.borderThickness/2&&d<=n.y3+n.borderThickness/2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a), +Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "ohlc":if(Math.abs(n.x2-a+n.x1-a)=n.y2&&d<=n.y3||a>=n.x1&&a<=(n.x2+n.x1)/2&&d>=n.y1-n.borderThickness/2&&d<=n.y1+n.borderThickness/2||a>=(n.x1+n.x2)/2&&a<=n.x2&&d>=n.y4-n.borderThickness/2&&d<=n.y4+n.borderThickness/2)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0}if(l||1E3q-e&&q+e>= +this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}a=null;for(d=0;dq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius, +horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle",borderThickness:0}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}f=n;for(b=this.intervalStartPosition;b<=e;b=parseFloat(1E-12>this.interval?this.logarithmic&&this.equidistantInterval?b*Math.pow(this.logarithmBase,this.interval):b+this.interval:(this.logarithmic&&this.equidistantInterval? +b*Math.pow(this.logarithmBase,this.interval):b+this.interval).toFixed(12))){for(;fq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix, +horizontalAlign:"left",backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}}else for(this.intervalStartPosition=this.getLabelStartPoint(new Date(this.viewportMinimum), +this.intervalType,this.interval),e=Ya(new Date(this.viewportMaximum),this.interval,this.intervalType),f=n,b=this.intervalStartPosition;bq[f].endValue;f++);p=a;a=f=q[f].startValue&&a<=q[f].endValue;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:new Date(p),label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:Ca(p,this.valueFormatString,this.chart._cultureInfo), +a=new ka(this.ctx,{x:0,y:0,maxWidth:g,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null, +breaksLabelType:void 0}))}if("bottom"===this._position||"top"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.width*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length-2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.width/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+ +"Duration"]*this.interval,g="undefined"===typeof this.options.labelMaxWidth?0.5*this.chart.width>>0:this.options.labelMaxWidth,this.chart.panEnabled||(m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize);else if("left"===this._position||"right"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.height*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length- +2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.height/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+"Duration"]*this.interval,this.chart.panEnabled||(g="undefined"===typeof this.options.labelMaxWidth?0.3*this.chart.width>>0:this.options.labelMaxWidth),m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize; +for(c=0;cthis.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360)),"bottom"===this._position||"top"===this._position)if(g=0.9*l>>0,n=0,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize= +this.labelFontSize;this.sessionVariables.labelMaxWidth=g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=this.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;bn&&(v=b,n=p.width)}b=0;for(b=this.intervalStartPosition< +this.viewportMinimum?1:0;b>0>2*g&&(this.sessionVariables.labelAngle=-25)):(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle):u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth= +g,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p)):(this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=this.labelWrap);else{if(u(this.options.labelWrap))if(!u(this.options.labelMaxWidth))this.options.labelMaxWidth>0,f=this.labelFontSize,nq&&(q=c-2*g,c>=2*g&&c<2.2*g?(this.sessionVariables.labelMaxWidth=g,u(this.options.labelFontSize)&&12=2.2*g&&c<2.8*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=f):c>=2.8*g&&c<3.2*g?(this.sessionVariables.labelMaxWidth=Math.max(g,n),this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12=3.2*g&&c<3.6*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=this.labelFontSize):c>3.6*g&&c<5*g?(u(this.options.labelFontSize)&&125*g&&(this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelFontSize=f,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=this.labelAngle));else if(v===b&&(0===v&&n+this._labels[v+1].textBlock.measureText().width-2*g>q||v===this._labels.length-1&&n+this._labels[v-1].textBlock.measureText().width-2*g>q||0q&&n+this._labels[v-1].textBlock.measureText().width- +2*g>q))q=0===v?n+this._labels[v+1].textBlock.measureText().width-2*g:n+this._labels[v-1].textBlock.measureText().width-2*g,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p;else if(0===q)for(this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,c=0;c>0>2*g&&(this.sessionVariables.labelAngle=-25))}else(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/ +Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=0!=this.labelAngle?(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)):g,this.sessionVariables.labelMaxHeight=m=this.labelWrap?(h-p*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)):1.5*this.labelFontSize,u(this.options.labelWrap))?u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap= +this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelMaxHeight=c<0.9*l?0.9*l:c,this.sessionVariables.labelWrap=this.labelWrap)):(this.options.labelWrap?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p): +(u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelWrap=this.labelWrap),this.sessionVariables.labelMaxHeight=m)}for(c=0;c>0:this.options.labelMaxWidth,m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize=this.labelFontSize;this.sessionVariables.labelMaxWidth= +g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b>0,l-2*m>n&&(n=l-2*m,l>=2*m&&l<2.4*m?(u(this.options.labelFontSize)&&12=2.4*m&&l<2.8*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelFontSize=this.labelFontSize,this.sessionVariables.labelWrap=!0):l>=2.8*m&&l<3.2*m?(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12< +this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>=3.2*m&&l<3.6*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelFontSize=this.labelFontSize):l>3.6*m&&l<10*m?(u(this.options.labelFontSize)&& +1210*m&&l<50*m&&(u(this.options.labelFontSize)&&12this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,u(this.options.labelMaxWidth)&& +(this.sessionVariables.labelAngle=this.labelAngle))):this.options.labelWrap?(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=g):(this.sessionVariables.labelMaxHeight=m,u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap)}for(c=0;c>0:1.5*this.labelFontSize;if("left"===this._position||"right"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.width>>0:1.5*this.labelFontSize;u(g.labelBackgroundColor)&&(g.labelBackgroundColor="#EEEEEE")}else m="bottom"===this._position||"top"===this._position?0.9*this.chart.width>>0:0.9*this.chart.height>> +0,z=u(g.options.labelWrap)||g.labelWrap?"bottom"===this._position||"top"===this._position?0.8*this.chart.width>>0:0.8*this.chart.height>>0:1.5*this.labelFontSize,u(g.labelBackgroundColor)&&(u(g.startValue)&&0!==g.startValue?g.labelBackgroundColor=r?"transparent":null:g.labelBackgroundColor="#EEEEEE");a=new ka(this.ctx,{x:0,y:0,backgroundColor:g.labelBackgroundColor,borderColor:g.labelBorderColor,borderThickness:g.labelBorderThickness,cornerRadius:g.labelCornerRadius,maxWidth:g.options.labelMaxWidth? +g.options.labelMaxWidth:m,maxHeight:z,angle:this.labelAngle,text:g.labelFormatter?g.labelFormatter({chart:this.chart,axis:this,stripLine:g}):g.label,horizontalAlign:"left",fontSize:"outside"===g.labelPlacement?g.options.labelFontSize?g.labelFontSize:this.labelFontSize:g.labelFontSize,fontFamily:"outside"===g.labelPlacement?g.options.labelFontFamily?g.labelFontFamily:this.labelFontFamily:g.labelFontFamily,fontWeight:"outside"===g.labelPlacement?g.options.labelFontWeight?g.labelFontWeight:this.labelFontWeight: +g.labelFontWeight,fontColor:g.labelFontColor||g.color,fontStyle:"outside"===g.labelPlacement?g.options.labelFontStyle?g.labelFontStyle:this.fontWeight:g.labelFontStyle,textBaseline:"middle"});this._stripLineLabels.push({position:g.value,textBlock:a,effectiveHeight:null,stripLine:g})}};z.prototype.createLabelsAndCalculateWidth=function(){var a=0,d=0;this._labels=[];this._stripLineLabels=[];var b=this.chart.isNavigator?0:5;if("left"===this._position||"right"===this._position){this.createLabels();for(d= +0;d=this.viewportMinimum&&this._stripLineLabels[d].stripLine.value<=this.viewportMaximum)&& +(c=this._stripLineLabels[d].textBlock,e=c.measureText(),g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle)),a=this.viewportMinimum&&this._stripLineLabels[b].stripLine.value<=this.viewportMaximum)&&(d=this._stripLineLabels[b].textBlock,e=d.measureText(),g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)),an[f].viewportMaximum);v++)r[v].endValue=n[f].viewPortMinimum&&(n[f].scaleBreaks.lastBreakIndex=v));for(var z=v=0,t=0,C=0,x=0,D=0,y=0,A,E,F=l=0,H,I,L,r=H=I=L=!1,f=0;fv;){var G=0,R=0,S=0,U=0,W=e=0,K=0,$=0,V=0,X=0,P=0,ba=0;if(b&& +0p.width- +q?p.width-q:g.x2-ba-$);if(a&&0p.width-q?p.width-q:g.x2-ba-$),a[f]._labels&&1k&&(l+=0a[f].labelAngle?A-zk&&(l=E+t/2-k-ba),A-za[f].labelAngle&&0p.width-q?p.width-q:g.x2-ba-$),d[f].lineCoordinates.width=Math.abs(k-m),d[f]._labels&&1v;){V=U=R=S=$=K=W=e=Q=O=G=X=0;if(a&&0p.width-10?p.width-10:g.x2-V-W),b[f].labelAutoFit&&!u(C)&&(0b[f].labelAngle?Math.max(m,C):0===b[f].labelAngle? +Math.max(m,C/2):m),0c[f].chart.width-10?c[f].chart.width-10:g.x2-V-W),c[f]&& +c[f].labelAutoFit&&!u(D)&&(0b[f].chart.height-10?b[f].chart.height-10:g.y2),b[f].lineCoordinates.y1=l-(q[f]+b[f].margin+ +X),b[f].lineCoordinates.y2=l-(q[f]+b[f].margin+X),b[f].bounds={x1:m,y1:l-(q[f]+X+b[f].margin),x2:k,y2:h-(X+b[f].margin),width:k-m,height:q[f]},b[f].title&&(b[f]._titleTextBlock.maxWidth=0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0===b[K].labelAngle?k-U:m);if(c&&0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0=== +b[K].labelAngle?k-V:m);if(c&&0d[g].spacing?0:Math.abs(d[g].spacing/b),this.logarithmic&&(d[g].size=Math.pow(this.logarithmBase,d[g].size))};z.prototype.calculateBreaksInPixels=function(){if(!(this.scaleBreaks&&0>=this.scaleBreaks._appliedBreaks.length)){var a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];a.length&&(this.scaleBreaks.firstBreakIndex=this.scaleBreaks.lastBreakIndex=null);for(var d=0;dthis.conversionParameters.maximum);d++)a[d].endValue< +this.conversionParameters.minimum||(u(this.scaleBreaks.firstBreakIndex)&&(this.scaleBreaks.firstBreakIndex=d),a[d].startValue>=this.conversionParameters.minimum&&(a[d].startPixel=this.convertValueToPixel(a[d].startValue),this.scaleBreaks.lastBreakIndex=d),a[d].endValue<=this.conversionParameters.maximum&&(a[d].endPixel=this.convertValueToPixel(a[d].endValue)))}};z.prototype.renderLabelsTicksAndTitle=function(){var a=this,d=!1,b=0,c=0,e=1,g=0;0!==this.labelAngle&&360!==this.labelAngle&&(e=1.2);if("undefined"=== +typeof this.options.interval){if("bottom"===this._position||"top"===this._position)if(this.logarithmic&&!this.equidistantInterval&&this.labelAutoFit){for(var b=[],e=0!==this.labelAngle&&360!==this.labelAngle?1:1.2,m,l=this.viewportMaximum,k=this.lineCoordinates.width/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||mthis.lineCoordinates.width*e&&this.labelAutoFit&&(d=!0)}if("left"===this._position||"right"===this._position)if(this.logarithmic&& +!this.equidistantInterval&&this.labelAutoFit){for(var b=[],p,l=this.viewportMaximum,k=this.lineCoordinates.height/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||pthis.lineCoordinates.height*e&&this.labelAutoFit&&(d=!0)}}this.logarithmic&&(!this.equidistantInterval&&this.labelAutoFit)&&this._labels.sort(function(a,b){return a.position-b.position});var h=0,q,n;if("bottom"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y+this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y-(this.tickLength+q.textBlock.fontSize/2):n.y+this.tickLength+q.textBlock.fontSize/2):(n.x="inside"===this.labelPlacement?0>this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x-(0>this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0>this.labelAngle?n.y-this.tickLength-5:n.y-this.tickLength-Math.abs(q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle)+5):n.y+this.tickLength+Math.abs(0>this.labelAngle?q.textBlock.width* +Math.sin(Math.PI/180*this.labelAngle)-5:5)),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save(); +a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y-a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y2-this._titleTextBlock.height-3,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("top"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y-this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y+this.labelFontSize/2+this.tickLength+5:n.y-(this.tickLength+q.textBlock.height-q.textBlock.fontSize/2)):(n.x="inside"===this.labelPlacement?0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&& +(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y+a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y1+1,this.titleMaxWidth= +this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("left"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<< +0,c),this.ctx.lineTo(n.x-this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle?(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5):(q.textBlock.y="inside"===this.labelPlacement?n.y:n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness; +a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x+a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x1+1,this._titleTextBlock.y=this.lineCoordinates.height/2+this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("right"=== +this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<<0,c),this.ctx.lineTo(n.x+this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle? +(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width-this.tickLength-5:n.x+this.tickLength+5):(q.textBlock.y="inside"===this.labelPlacement?n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0>this.labelAngle?n.y:n.y-(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.cos(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<< +0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x-a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x2-1,this._titleTextBlock.y=this.lineCoordinates.height/2-this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}g=0;if("inside"===this.labelPlacement)this.chart.addEventListener("dataAnimationIterationEnd", +function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)||(a.ctx.save(),a.ctx.beginPath(),q.textBlock.render(!0),a.ctx.restore())},this);else for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||q.textBlock.render(!0)};z.prototype.renderInterlacedColors=function(){var a=this.chart.plotArea.ctx,d,b,c=this.chart.plotArea, +e=0;d=!0;if(("bottom"===this._position||"top"===this._position)&&this.interlacedColor)for(a.fillStyle=this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(Math.min(b.x,d.x),c.y1,Math.abs(b.x-d.x),Math.abs(c.y1-c.y2)),d=!1):d=!0;else if(("left"===this._position||"right"===this._position)&&this.interlacedColor)for(a.fillStyle= +this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(c.x1,Math.min(b.y,d.y),Math.abs(c.x1-c.x2),Math.abs(d.y-b.y)),d=!1):d=!0;a.beginPath()};z.prototype.renderStripLinesOfThicknessType=function(a){if(this.stripLines&&0this.viewportMaximum||u(h.value)||isNaN(this.range))||l.push(h))}for(c=0;cthis.viewportMaximum||isNaN(this.range))){a=this.getPixelCoordinatesOnAxis(b.position);if("outside"===b.stripLine.labelPlacement)if(h&&(this.ctx.strokeStyle= +h.color,"pixel"===h._thicknessType&&(this.ctx.lineWidth=h.thickness)),"bottom"===this._position){var p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0;this.ctx.beginPath();this.ctx.moveTo(p,a.y<<0);this.ctx.lineTo(p,a.y+this.tickLength<<0);this.ctx.stroke();0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y+=this.tickLength+b.textBlock.fontSize/2):(a.x-=0>this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0,a.y+=this.tickLength+Math.abs(0>this.labelAngle?b.textBlock.width*Math.sin(Math.PI/ +180*this.labelAngle)-5:5))}else"top"===this._position?(p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,this.ctx.beginPath(),this.ctx.moveTo(p,a.y<<0),this.ctx.lineTo(p,a.y-this.tickLength<<0),this.ctx.stroke(),0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y-=this.tickLength+b.textBlock.height):(a.x+=(b.textBlock.height-this.tickLength-this.labelFontSize/2)*Math.sin(Math.PI/180*this.labelAngle)-(0this.labelAngle?a.y:a.y-(b.textBlock.height-b.textBlock.fontSize/ +2-5)*Math.cos(Math.PI/180*this.labelAngle),a.x=0this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/ +2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+=b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y1+b.textBlock.width+3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-b.textBlock.width-3:"center"=== +b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y1+3):"top"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+= +b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+b.textBlock.width+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y2-3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y2- +b.textBlock.width-3):"left"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-b.textBlock.height>this.chart.plotArea.y1?u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3:a.y-b.textBlock.heightthis.chart.plotArea.y1? +u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2-3:a.y-b.textBlock.heightthis.viewportMaximum|| +isNaN(this.range))||a[d].render(this.maskCtx);this.maskCtx.restore()}};z.prototype.renderCrosshair=function(a,d){this.crosshair.render(a,d)};z.prototype.renderGrid=function(){if(this.gridThickness&&0this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(),d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.x<<0)+0.5:d.x<<0,a.moveTo(d,b.y1<<0),a.lineTo(d,b.y2<<0),a.stroke());else if("left"===this._position||"right"===this._position)for(var c=0;cthis.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(), +d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.y<<0)+0.5:d.y<<0,a.moveTo(b.x1<<0,d),a.lineTo(b.x2<<0,d),a.stroke());a.restore()}};z.prototype.renderAxisLine=function(){var a=this.chart.ctx,d=r?this.chart._preRenderCtx:a,b=Math.ceil(this.tickThickness/(this.reversed?-2:2)),c=Math.ceil(this.tickThickness/(this.reversed?2:-2)),e,g;d.save();if("bottom"===this._position||"top"===this._position){if(this.lineThickness){this.reversed?(e=this.lineCoordinates.x2,g=this.lineCoordinates.x1): +(e=this.lineCoordinates.x1,g=this.lineCoordinates.x2);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor?this.lineColor:"black";d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));var m=1===this.lineThickness%2?(this.lineCoordinates.y1<<0)+0.5:this.lineCoordinates.y1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+c;else for(var l= +this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(e,m),d.lineTo(this.scaleBreaks._appliedBreaks[l].startPixel+b,m),e=this.scaleBreaks._appliedBreaks[l].endPixel+c;e&&(d.moveTo(e,m),d.lineTo(g,m));d.stroke()}}else if(("left"===this._position||"right"===this._position)&&this.lineThickness){this.reversed?(e=this.lineCoordinates.y1,g=this.lineCoordinates.y2):(e=this.lineCoordinates.y2,g=this.lineCoordinates.y1);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor; +d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));m=1===this.lineThickness%2?(this.lineCoordinates.x1<<0)+0.5:this.lineCoordinates.x1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+b;else for(l=this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(m,e),d.lineTo(m,this.scaleBreaks._appliedBreaks[l].startPixel+c), +e=this.scaleBreaks._appliedBreaks[l].endPixel+b;e&&(d.moveTo(m,e),d.lineTo(m,g));d.stroke()}r&&(a.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx&&this.chart._breaksCanvasCtx.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),d.clearRect(0,0,this.chart.width,this.chart.height));d.restore()};z.prototype.getPixelCoordinatesOnAxis=function(a){var d={};if("bottom"===this._position||"top"===this._position)d.x=this.convertValueToPixel(a), +d.y=this.lineCoordinates.y1;if("left"===this._position||"right"===this._position)d.y=this.convertValueToPixel(a),d.x=this.lineCoordinates.x2;return d};z.prototype.convertPixelToValue=function(a){if("undefined"===typeof a)return null;var d=0,b=0,c,d=!0,e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b="number"===typeof a?a:"left"===this._position||"right"===this._position?a.y:a.x;if(this.logarithmic){a=c=Math.pow(this.logarithmBase,(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit); +if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;be[b].startValue/this.conversionParameters.minimum){c/=e[b].startValue/this.conversionParameters.minimum;if(ce[b].startValue/e[b-1].endValue){c/=e[b].startValue/e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum){if(1e[b].startValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].startValue/this.conversionParameters.minimum*Math.pow(e[b].size,Math.log(e[b].startValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue))*c,c*=Math.pow(e[b].size,Math.log(this.conversionParameters.minimum/e[b].startValue)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size;d=!1}else break;else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size}else break; +d=a*this.viewportMinimum}else{a=c=(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit;if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b=e[b].size?0:c*(e[b].endValue- +e[b].startValue)/e[b].size;break}else a+=e[b].endValue-this.conversionParameters.minimum-e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue),c-=e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue);d=!1}else if(c>e[b].startValue-this.conversionParameters.minimum){c-=e[b].startValue-this.conversionParameters.minimum;if(ce[b].startValue-e[b-1].endValue){c-=e[b].startValue-e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum)if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue- +e[b].startValue)/e[b].size>e[b].startValue){a=0>=e[b].size?0:c*(e[b].endValue-e[b].startValue)/e[b].size;break}else a+=e[b].startValue-this.conversionParameters.minimum+e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),c+=e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),d=!1;else if(c-1*e[b].size){a+=(e[b].endValue- +e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size;d=!1}else break;else if(c-1*e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size}else break;d=this.conversionParameters.minimum+a}return d};z.prototype.convertValueToPixel=function(a){a=this.getApparentDifference(this.conversionParameters.minimum, +a,a);return this.logarithmic?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*Math.log(a/this.conversionParameters.minimum)/this.conversionParameters.lnLogarithmBase+0.5<<0:"axisX"===this.type?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5<<0:this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5};z.prototype.getApparentDifference=function(a, +d,b,c){var e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];if(this.logarithmic){b=u(b)?d/a:b;for(var g=0;ge[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*e[g].startValue*e[g].size:a>=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*a*Math.pow(e[g].size,Math.log(e[g].endValue/a)/Math.log(e[g].endValue/e[g].startValue)):a<=e[g].startValue&&d<=e[g].endValue?b=b/d*e[g].startValue*Math.pow(e[g].size,Math.log(d/e[g].startValue)/Math.log(e[g].endValue/ +e[g].startValue)):!c&&(a>e[g].startValue&&de[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+e[g].startValue+e[g].size:a>e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+a+e[g].size*(e[g].endValue-a)/(e[g].endValue-e[g].startValue):a<=e[g].startValue&&de[g].startValue&&da[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<= +a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*this.viewportMinimum,b=0a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<=a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+this.viewportMinimum, +b=0this.maxWidth?8:6);var a=Math.max(c,Math.floor(this.maxWidth/a)),e,g,m,c=0;!u(this.options.viewportMinimum)&&(!u(this.options.viewportMaximum)&&this.options.viewportMinimum>=this.options.viewportMaximum)&& +(this.viewportMinimum=this.viewportMaximum=null);if(u(this.options.viewportMinimum)&&!u(this.sessionVariables.newViewportMinimum)&&!isNaN(this.sessionVariables.newViewportMinimum))this.viewportMinimum=this.sessionVariables.newViewportMinimum;else if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(u(this.options.viewportMaximum)&&!u(this.sessionVariables.newViewportMaximum)&&!isNaN(this.sessionVariables.newViewportMaximum))this.viewportMaximum=this.sessionVariables.newViewportMaximum; +else if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(c=0;c=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue)&& +(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue)){this.scaleBreaks._appliedBreaks.splice(c,1);break}if("axisX"===this.type){if(this.dataSeries&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g, +null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0));c=this.getApparentDifference(isNaN(this.viewportMinimum)||null===this.viewportMinimum?e:this.viewportMinimum,isNaN(this.viewportMaximum)||null===this.viewportMaximum?g:this.viewportMaximum,null, +!0);if("axisX"===this.type&&b){this.intervalType||(c/1<=a?(this.interval=1,this.intervalType="millisecond"):c/2<=a?(this.interval=2,this.intervalType="millisecond"):c/5<=a?(this.interval=5,this.intervalType="millisecond"):c/10<=a?(this.interval=10,this.intervalType="millisecond"):c/20<=a?(this.interval=20,this.intervalType="millisecond"):c/50<=a?(this.interval=50,this.intervalType="millisecond"):c/100<=a?(this.interval=100,this.intervalType="millisecond"):c/200<=a?(this.interval=200,this.intervalType= +"millisecond"):c/250<=a?(this.interval=250,this.intervalType="millisecond"):c/300<=a?(this.interval=300,this.intervalType="millisecond"):c/400<=a?(this.interval=400,this.intervalType="millisecond"):c/500<=a?(this.interval=500,this.intervalType="millisecond"):c/(1*S.secondDuration)<=a?(this.interval=1,this.intervalType="second"):c/(2*S.secondDuration)<=a?(this.interval=2,this.intervalType="second"):c/(5*S.secondDuration)<=a?(this.interval=5,this.intervalType="second"):c/(10*S.secondDuration)<=a?(this.interval= +10,this.intervalType="second"):c/(15*S.secondDuration)<=a?(this.interval=15,this.intervalType="second"):c/(20*S.secondDuration)<=a?(this.interval=20,this.intervalType="second"):c/(30*S.secondDuration)<=a?(this.interval=30,this.intervalType="second"):c/(1*S.minuteDuration)<=a?(this.interval=1,this.intervalType="minute"):c/(2*S.minuteDuration)<=a?(this.interval=2,this.intervalType="minute"):c/(5*S.minuteDuration)<=a?(this.interval=5,this.intervalType="minute"):c/(10*S.minuteDuration)<=a?(this.interval= +10,this.intervalType="minute"):c/(15*S.minuteDuration)<=a?(this.interval=15,this.intervalType="minute"):c/(20*S.minuteDuration)<=a?(this.interval=20,this.intervalType="minute"):c/(30*S.minuteDuration)<=a?(this.interval=30,this.intervalType="minute"):c/(1*S.hourDuration)<=a?(this.interval=1,this.intervalType="hour"):c/(2*S.hourDuration)<=a?(this.interval=2,this.intervalType="hour"):c/(3*S.hourDuration)<=a?(this.interval=3,this.intervalType="hour"):c/(6*S.hourDuration)<=a?(this.interval=6,this.intervalType= +"hour"):c/(1*S.dayDuration)<=a?(this.interval=1,this.intervalType="day"):c/(2*S.dayDuration)<=a?(this.interval=2,this.intervalType="day"):c/(4*S.dayDuration)<=a?(this.interval=4,this.intervalType="day"):c/(1*S.weekDuration)<=a?(this.interval=1,this.intervalType="week"):c/(2*S.weekDuration)<=a?(this.interval=2,this.intervalType="week"):c/(3*S.weekDuration)<=a?(this.interval=3,this.intervalType="week"):c/(1*S.monthDuration)<=a?(this.interval=1,this.intervalType="month"):c/(2*S.monthDuration)<=a?(this.interval= +2,this.intervalType="month"):c/(3*S.monthDuration)<=a?(this.interval=3,this.intervalType="month"):c/(6*S.monthDuration)<=a?(this.interval=6,this.intervalType="month"):(this.interval=c/(1*S.yearDuration)<=a?1:c/(2*S.yearDuration)<=a?2:c/(4*S.yearDuration)<=a?4:Math.floor(z.getNiceNumber(c/(a-1),!0)/S.yearDuration),this.intervalType="year"));if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=e-m/2;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum= +g+m/2;d?this.autoValueFormatString="MMM DD YYYY HH:mm":"year"===this.intervalType?this.autoValueFormatString="YYYY":"month"===this.intervalType?this.autoValueFormatString="MMM YYYY":"week"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"day"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"hour"===this.intervalType?this.autoValueFormatString="hh:mm TT":"minute"===this.intervalType?this.autoValueFormatString="hh:mm TT":"second"===this.intervalType?this.autoValueFormatString= +"hh:mm:ss TT":"millisecond"===this.intervalType&&(this.autoValueFormatString="fff'ms'");this.valueFormatString||(this.valueFormatString=this.autoValueFormatString)}else{this.intervalType="number";c=z.getNiceNumber(c,!1);this.interval=this.options&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g,null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)):(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0)),Math.abs(this.getApparentDifference(e,g,null,!0)),"axisX"===this.type&&b){this.valueType="dateTime";if(null===this.minimum||isNaN(this.minimum))this.minimum=e-m/2;if(null===this.maximum||isNaN(this.maximum))this.maximum=g+m/2}else this.intervalType=this.valueType="number",null===this.minimum&&(this.minimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval,this.minimum=Math.min(this.minimum, +null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?Infinity:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval,this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?-Infinity:this.sessionVariables.viewportMaximum)),0===this.maximum&&0===this.minimum&&(0===this.options.minimum?this.maximum+=10:0=== +this.options.maximum&&(this.minimum-=10));u(this.sessionVariables.newViewportMinimum)&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));u(this.sessionVariables.newViewportMaximum)&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.range=this.viewportMaximum-this.viewportMinimum;this.intervalStartPosition="axisX"===this.type&&b?this.getLabelStartPoint(new Date(this.viewportMinimum),this.intervalType,this.interval):Math.floor((this.viewportMinimum+0.2*this.interval)/ +this.interval)*this.interval;this.valueFormatString||(this.valueFormatString=z.generateValueFormatString(this.range,2))}};z.prototype.calculateLogarithmicAxisParameters=function(){var a=this.chart.layoutManager.getFreeSpace(),d=Math.log(this.logarithmBase),b;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?500>this.maxWidth?7:Math.max(7,Math.floor(this.maxWidth/100)):Math.max(Math.floor(this.maxWidth/ +50),3),c,e,g,m;m=1;if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(m=0;m=this.scaleBreaks._appliedBreaks[m].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[m].startValue|| +!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue)&&(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue)){this.scaleBreaks._appliedBreaks.splice(m,1);break}"axisX"===this.type? +(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,1===e/c&&(m=Math.pow(this.logarithmBase,"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin, +e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,0>=c&&!isFinite(e)?(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1):0>=c?c=e:isFinite(e)||(e=c),1===c&&1===e?(e*=this.logarithmBase-1/this.logarithmBase,c=1):1===e/c?(m=Math.min(e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),e*=m,c/=m):c>e?(m=Math.min(c/e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase, +0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&1e&&(e=1));m=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)/(isNaN(this.viewportMinimum)||null=== +this.viewportMinimum?c:this.viewportMinimum);var l=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)-(isNaN(this.viewportMinimum)||null===this.viewportMinimum?c:this.viewportMinimum);this.intervalType="number";m=Math.pow(this.logarithmBase,z.getNiceNumber(Math.abs(Math.log(m)/d),!1));this.options&&0this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(c)||isFinite(e)?1===c&&1===e?(e*=this.logarithmBase,c/=this.logarithmBase):1===e/c?(m=Math.pow(this.logarithmBase,this.interval),e*=m,c/=m):c>e?(m= +Math.min(0.01*(c/e),5),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)):(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.minimum||isNaN(this.minimum))&&1e&&(e=1)),this.intervalType="number",null===this.minimum&&(this.minimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval)),this.minimum=Math.min(this.minimum,null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?"undefined"===typeof this.sessionVariables.newViewportMinimum?Infinity:this.sessionVariables.newViewportMinimum:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum= +"axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval)),this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?"undefined"===typeof this.sessionVariables.newViewportMaximum?0:this.sessionVariables.newViewportMaximum:this.sessionVariables.viewportMaximum)),1===this.maximum&&1===this.minimum&&(1===this.options.minimum?this.maximum*=this.logarithmBase-1/this.logarithmBase: +1===this.options.maximum&&(this.minimum/=this.logarithmBase-1/this.logarithmBase));this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum);this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum);this.viewportMinimum>this.viewportMaximum&&(!this.options.viewportMinimum&&!this.options.minimum||this.options.viewportMaximum||this.options.maximum?this.options.viewportMinimum||this.options.minimum||!this.options.viewportMaximum&&!this.options.maximum||(this.viewportMinimum=this.minimum= +(this.options.viewportMaximum||this.options.maximum)/Math.pow(this.logarithmBase,2*Math.ceil(this.interval))):this.viewportMaximum=this.maximum=this.options.viewportMinimum||this.options.minimum);c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval);this.range=this.viewportMaximum/this.viewportMinimum;this.noTicks=a;if(!this.options.interval&&this.rangethis.viewportMaximum||3>a?2:3)){for(d=Math.floor(this.viewportMinimum/ +b+0.5)*b;dthis.interval&&(this.interval=b,c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval))),this.equidistantInterval=!0,this.intervalStartPosition=c;if(!this.valueFormatString&&(this.valueFormatString="#,##0.##",1>this.viewportMinimum)){d=Math.floor(Math.abs(Math.log(this.viewportMinimum)/ +Math.LN10))+2;if(isNaN(d)||!isFinite(d))d=2;if(2a&&(c+=Math.floor(Math.abs(Math.log(a)/Math.LN10)),isNaN(c)||!isFinite(c))&&(c=d);for(var e=0;eb?1>=c?1:5>=c?5:10:Math.max(Math.floor(c),1);return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.getNiceNumber= +function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=d?1.5>c?1:3>c?2:7>c?5:10:1>=c?1:2>=c?2:5>=c?5:10;return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.prototype.getLabelStartPoint=function(){var a=S[this.intervalType+"Duration"]*this.interval,a=new Date(Math.floor(this.viewportMinimum/a)*a);if("millisecond"!==this.intervalType)if("second"===this.intervalType)0=a||"bottom"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(c,l),this.ctx.lineTo(m,l),this.ctx.lineTo(m,e);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(l-h)/a/3;for(var n=0;n=a||"right"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(m,e),this.ctx.lineTo(m,l), +this.ctx.lineTo(c,l);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(m-k)/a/3;for(n=0;nthis.parent.range?2:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range? +1:0):50this.parent.range?2:10>this.parent.range?1:0);this.valueFormatString=z.generateValueFormatString(this.parent.range,h)}var l=null===this.opacity?1:this.opacity,h=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness),p=this.chart.overlaidCanvasCtx,q=p.globalAlpha;p.globalAlpha=l;p.beginPath();p.strokeStyle=this.color;p.lineWidth=h;p.save();this.labelFontSize= +u(this.options.labelFontSize)?this.parent.labelFontSize:this.labelFontSize;if("left"===this.parent._position||"right"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?this.parent.bounds.x2-this.parent.bounds.x1:this.labelMaxWidth,this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?3*this.chart.height:2*this.labelFontSize;else if("top"===this.parent._position||"bottom"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?3*this.chart.width:this.labelMaxWidth, +this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?this.parent.bounds.height:2*this.labelFontSize;0this.chart.bounds.x2?l.x=this.chart.bounds.x2-l.width:l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}}else if("bottom"===this.parent._position||"top"===this.parent._position){n=this.parent.convertPixelToValue({x:a});for(r=0;rthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"=== +this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}m=null;("bottom"===this.parent._position||"top"===this.parent._position)&&(b>=this.parent.convertValueToPixel(this.parent.viewportMinimum)&&c<=this.parent.convertValueToPixel(this.parent.viewportMaximum))&&(0=this.parent.convertValueToPixel(this.parent.viewportMaximum)&& +e<=this.parent.convertValueToPixel(this.parent.viewportMinimum))&&(0this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x1-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}else{if("bottom"===this.parent._position||"top"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)? +ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label,l.x=b-l.measureText().width/2,l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width),l.xthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2),"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2);0(new Date).getTime()-this._lastUpdated||(this._lastUpdated=(new Date).getTime(), +this.chart.resetOverlayedCanvas(),this._updateToolTip(a,d))};$.prototype._updateToolTip=function(a,d,b){b="undefined"===typeof b?!0:b;this.container||this._initialize();this.enabled||this.hide();if(!this.chart.disableToolTip){if("undefined"===typeof a||"undefined"===typeof d){if(isNaN(this._prevX)||isNaN(this._prevY))return;a=this._prevX;d=this._prevY}else this._prevX=a,this._prevY=d;var c=null,e=null,g=[],k=0;if(this.shared&&this.enabled&&"none"!==this.chart.plotInfo.axisPlacement){if("xySwapped"=== +this.chart.plotInfo.axisPlacement){var l=[];if(this.chart.axisX)for(var p=0;ph.dataSeries.axisY.viewportMaximum&&b++;b-h.dataPoint.y.length&&g.push(h)}else"column"===e.type||"bar"===e.type?0>h.dataPoint.y?0>h.dataSeries.axisY.viewportMinimum&&h.dataSeries.axisY.viewportMaximum>=h.dataPoint.y&&g.push(h):h.dataSeries.axisY.viewportMinimum<=h.dataPoint.y&&0<=h.dataSeries.axisY.viewportMaximum&&g.push(h):"bubble"===e.type?(b=this.chart._eventManager.objectMap[e.dataPointIds[h.index]].size/2,h.dataPoint.y>= +h.dataSeries.axisY.viewportMinimum-b&&h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum+b&&g.push(h)):"waterfall"===e.type?(b=0,h.cumulativeSumYStartValueh.dataSeries.axisY.viewportMaximum&&b++,h.cumulativeSumh.dataSeries.axisY.viewportMaximum&&b++,2>b&&-2=h.dataSeries.axisY.viewportMinimum&& +h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum)&&g.push(h);else g.push(h)}}if(0a&&(a+=this.container.clientWidth+20);a+this.container.clientWidth> +Math.max(this.chart.container.clientWidth,this.chart.width)&&(a=Math.max(0,Math.max(this.chart.container.clientWidth,this.chart.width)-this.container.clientWidth));d=1!==g.length||this.shared||"line"!==g[0].dataSeries.type&&"stepLine"!==g[0].dataSeries.type&&"spline"!==g[0].dataSeries.type&&"area"!==g[0].dataSeries.type&&"stepArea"!==g[0].dataSeries.type&&"splineArea"!==g[0].dataSeries.type?"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"=== +g[0].dataSeries.type?g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x):d:g[0].dataSeries.axisY.convertValueToPixel(g[0].dataPoint.y);d=-d+10;0":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content? +this.content:"{name}:  {y}",p=b.axisXIndex):"bubble"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y},   {z}"): +"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y[0]}, {y[1]}"):"candlestick"=== +b.type||"ohlc"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Open:   {y[0]}
High:    {y[1]}
Low:   {y[2]}
Close:   {y[3]}"):"boxAndWhisker"=== +b.type&&(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"), +null===d&&(d=""),!0===this.reversed?(d=this.chart.replaceKeywordsWithValue(g,c,b,e)+d,l"+d)):(d+=this.chart.replaceKeywordsWithValue(g,c,b,e),l")));null!==d&&(d=h+d)}else{b=a[0].dataSeries;c=a[0].dataPoint;e=a[0].index;if(null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent)return null;"line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"===b.type||"splineArea"===b.type||"column"=== +b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y}":"bubble"===b.type?g=c.toolTipContent? +c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y},   {z}":"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.name?"{name}:  ":c.label?"{label}:  ":"")+"{y}":"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+" :  {y[0]},  {y[1]}": +"candlestick"===b.type||"ohlc"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Open:   {y[0]}
High:    {y[1]}
Low:     {y[2]}
Close:   {y[3]}":"boxAndWhisker"===b.type&&(g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent: +this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"); +null===d&&(d="");d+=this.chart.replaceKeywordsWithValue(g,c,b,e)}return d};$.prototype.enableAnimation=function(){if(!this.container.style.WebkitTransition){var a=this.getContainerTransition(this.containerTransitionDuration);this.container.style.WebkitTransition=a;this.container.style.MsTransition=a;this.container.style.transition=a;this.container.style.MozTransition=this.mozContainerTransition}};$.prototype.disableAnimation=function(){this.container.style.WebkitTransition&&(this.container.style.WebkitTransition= +"",this.container.style.MozTransition="",this.container.style.MsTransition="",this.container.style.transition="")};$.prototype.hide=function(a){this.container&&(this.container.style.display="none",this.currentSeriesIndex=-1,this._prevY=this._prevX=NaN,("undefined"===typeof a||a)&&this.chart.resetOverlayedCanvas())};$.prototype.show=function(a,d,b){this._updateToolTip(a,d,"undefined"===typeof b?!1:b)};$.prototype.fixMozTransitionDelay=function(a,d){if(20c&&a.push(d),d.animationCallback(c),1<=c&&d.onComplete)d.onComplete();this.animations=a;0g;g++)for(var e=0;3>e;e++){for(var f=0,d=0;3>d;d++)f+=a[g][d]*b[d][e];c[g][e]=f}return c}function P(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX= +a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha;b.font=a.font;b.textAlign=a.textAlign;b.textBaseline=a.textBaseline;b.arcScaleX_=a.arcScaleX_;b.arcScaleY_=a.arcScaleY_;b.lineScale_=a.lineScale_}function Q(a){var b=a.indexOf("(",3),c=a.indexOf(")",b+1),b=a.substring(b+1,c).split(",");if(4!=b.length||"a"!=a.charAt(3))b[3]=1;return b}function E(a,b,c){return Math.min(c,Math.max(b,a))}function F(a,b,c){0>c&&c++;16*c?a+6*(b-a)*c: +1>2*c?b:2>3*c?a+6*(b-a)*(2/3-c):a}function G(a){if(a in H)return H[a];var b,c=1;a=String(a);if("#"==a.charAt(0))b=a;else if(/^rgb/.test(a)){c=Q(a);b="#";for(var g,e=0;3>e;e++)g=-1!=c[e].indexOf("%")?Math.floor(255*(parseFloat(c[e])/100)):+c[e],b+=v[E(g,0,255)];c=+c[3]}else if(/^hsl/.test(a)){e=c=Q(a);b=parseFloat(e[0])/360%360;0>b&&b++;g=E(parseFloat(e[1])/100,0,1);e=E(parseFloat(e[2])/100,0,1);if(0==g)g=e=b=e;else{var f=0.5>e?e*(1+g):e+g-e*g,d=2*e-f;g=F(d,f,b+1/3);e=F(d,f,b);b=F(d,f,b-1/3)}b="#"+ +v[Math.floor(255*g)]+v[Math.floor(255*e)]+v[Math.floor(255*b)];c=c[3]}else b=Z[a]||a;return H[a]={color:b,alpha:c}}function C(a){this.m_=D();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=1*q;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=a;var b="width:"+a.clientWidth+"px;height:"+a.clientHeight+"px;overflow:hidden;position:absolute", +c=a.ownerDocument.createElement("div");c.style.cssText=b;a.appendChild(c);b=c.cloneNode(!1);b.style.backgroundColor="red";b.style.filter="alpha(opacity=0)";a.appendChild(b);this.element_=c;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}function R(a,b,c,g){a.currentPath_.push({type:"bezierCurveTo",cp1x:b.x,cp1y:b.y,cp2x:c.x,cp2y:c.y,x:g.x,y:g.y});a.currentX_=g.x;a.currentY_=g.y}function S(a,b){var c=G(a.strokeStyle),g=c.color,c=c.alpha*a.globalAlpha,e=a.lineScale_*a.lineWidth;1>e&&(c*=e);b.push("')}function T(a,b,c,g){var e=a.fillStyle,f=a.arcScaleX_,d=a.arcScaleY_,k=g.x-c.x,n=g.y-c.y;if(e instanceof w){var h=0,l=g=0,u=0,m=1;if("gradient"==e.type_){h=e.x1_/f;c=e.y1_/d;var p=s(a,e.x0_/f,e.y0_/d),h=s(a,h,c),h=180*Math.atan2(h.x-p.x,h.y-p.y)/Math.PI;0>h&&(h+=360);1E-6>h&&(h=0)}else p=s(a,e.x0_,e.y0_),g=(p.x-c.x)/k,l=(p.y-c.y)/n,k/=f*q, +n/=d*q,m=x.max(k,n),u=2*e.r0_/m,m=2*e.r1_/m-u;f=e.colors_;f.sort(function(a,b){return a.offset-b.offset});d=f.length;p=f[0].color;c=f[d-1].color;k=f[0].alpha*a.globalAlpha;a=f[d-1].alpha*a.globalAlpha;for(var n=[],r=0;r')}else e instanceof +I?k&&n&&b.push("'):(e=G(a.fillStyle),b.push(''))}function s(a,b,c){a=a.m_;return{x:q*(b*a[0][0]+c*a[1][0]+a[2][0])-r,y:q*(b*a[0][1]+c*a[1][1]+a[2][1])-r}}function z(a,b,c){isFinite(b[0][0])&&(isFinite(b[0][1])&&isFinite(b[1][0])&&isFinite(b[1][1])&&isFinite(b[2][0])&&isFinite(b[2][1]))&&(a.m_=b,c&&(a.lineScale_=aa(ba(b[0][0]*b[1][1]-b[0][1]* +b[1][0]))))}function w(a){this.type_=a;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}function I(a,b){if(!a||1!=a.nodeType||"IMG"!=a.tagName)throw new A("TYPE_MISMATCH_ERR");if("complete"!=a.readyState)throw new A("INVALID_STATE_ERR");switch(b){case "repeat":case null:case "":this.repetition_="repeat";break;case "repeat-x":case "repeat-y":case "no-repeat":this.repetition_=b;break;default:throw new A("SYNTAX_ERR");}this.src_=a.src;this.width_=a.width;this.height_=a.height} +function A(a){this.code=this[a];this.message=a+": DOM Exception "+this.code}var x=Math,k=x.round,J=x.sin,K=x.cos,ba=x.abs,aa=x.sqrt,q=10,r=q/2;navigator.userAgent.match(/MSIE ([\d.]+)?/);var M=Array.prototype.slice;O(document);var U={init:function(a){a=a||document;a.createElement("canvas");a.attachEvent("onreadystatechange",W(this.init_,this,a))},init_:function(a){a=a.getElementsByTagName("canvas");for(var b=0;bd;d++)for(var B=0;16>B;B++)v[16*d+B]=d.toString(16)+B.toString(16);var Z={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC", +bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000", +darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082", +ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA", +mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5", +peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"}, +H={},L={},$={butt:"flat",round:"round"},d=C.prototype;d.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null);this.element_.innerHTML=""};d.beginPath=function(){this.currentPath_=[]};d.moveTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.lineTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.bezierCurveTo= +function(a,b,c,g,e,f){e=s(this,e,f);a=s(this,a,b);c=s(this,c,g);R(this,a,c,e)};d.quadraticCurveTo=function(a,b,c,g){a=s(this,a,b);c=s(this,c,g);g={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)};R(this,g,{x:g.x+(c.x-this.currentX_)/3,y:g.y+(c.y-this.currentY_)/3},c)};d.arc=function(a,b,c,g,e,f){c*=q;var d=f?"at":"wa",k=a+K(g)*c-r,n=b+J(g)*c-r;g=a+K(e)*c-r;e=b+J(e)*c-r;k!=g||f||(k+=0.125);a=s(this,a,b);k=s(this,k,n);g=s(this,g,e);this.currentPath_.push({type:d, +x:a.x,y:a.y,radius:c,xStart:k.x,yStart:k.y,xEnd:g.x,yEnd:g.y})};d.rect=function(a,b,c,g){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath()};d.strokeRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath();this.stroke();this.currentPath_=e};d.fillRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+ +c,b+g);this.lineTo(a,b+g);this.closePath();this.fill();this.currentPath_=e};d.createLinearGradient=function(a,b,c,g){var e=new w("gradient");e.x0_=a;e.y0_=b;e.x1_=c;e.y1_=g;return e};d.createRadialGradient=function(a,b,c,g,e,f){var d=new w("gradientradial");d.x0_=a;d.y0_=b;d.r0_=c;d.x1_=g;d.y1_=e;d.r1_=f;return d};d.drawImage=function(a,b){var c,g,e,d,r,y,n,h;e=a.runtimeStyle.width;d=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var l=a.width,u=a.height;a.runtimeStyle.width= +e;a.runtimeStyle.height=d;if(3==arguments.length)c=arguments[1],g=arguments[2],r=y=0,n=e=l,h=d=u;else if(5==arguments.length)c=arguments[1],g=arguments[2],e=arguments[3],d=arguments[4],r=y=0,n=l,h=u;else if(9==arguments.length)r=arguments[1],y=arguments[2],n=arguments[3],h=arguments[4],c=arguments[5],g=arguments[6],e=arguments[7],d=arguments[8];else throw Error("Invalid number of arguments");var m=s(this,c,g),p=[];p.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))};d.stroke=function(a){var b=[];b.push("d.x)d.x=f.x;if(null==c.y||f.yd.y)d.y=f.y}}b.push(' ">');a?T(this,b,c,d):S(this,b);b.push("");this.element_.insertAdjacentHTML("beforeEnd",b.join(""))};d.fill=function(){this.stroke(!0)};d.closePath=function(){this.currentPath_.push({type:"close"})};d.save=function(){var a= +{};P(this,a);this.aStack_.push(a);this.mStack_.push(this.m_);this.m_=t(D(),this.m_)};d.restore=function(){this.aStack_.length&&(P(this.aStack_.pop(),this),this.m_=this.mStack_.pop())};d.translate=function(a,b){z(this,t([[1,0,0],[0,1,0],[a,b,1]],this.m_),!1)};d.rotate=function(a){var b=K(a);a=J(a);z(this,t([[b,a,0],[-a,b,0],[0,0,1]],this.m_),!1)};d.scale=function(a,b){this.arcScaleX_*=a;this.arcScaleY_*=b;z(this,t([[a,0,0],[0,b,0],[0,0,1]],this.m_),!0)};d.transform=function(a,b,c,d,e,f){z(this,t([[a, +b,0],[c,d,0],[e,f,1]],this.m_),!0)};d.setTransform=function(a,b,c,d,e,f){z(this,[[a,b,0],[c,d,0],[e,f,1]],!0)};d.drawText_=function(a,b,c,d,e){var f=this.m_;d=0;var r=1E3,t=0,n=[],h;h=this.font;if(L[h])h=L[h];else{var l=document.createElement("div").style;try{l.font=h}catch(u){}h=L[h]={style:l.fontStyle||"normal",variant:l.fontVariant||"normal",weight:l.fontWeight||"normal",size:l.fontSize||10,family:l.fontFamily||"sans-serif"}}var l=h,m=this.element_;h={};for(var p in l)h[p]=l[p];p=parseFloat(m.currentStyle.fontSize); +m=parseFloat(l.size);"number"==typeof l.size?h.size=l.size:-1!=l.size.indexOf("px")?h.size=m:-1!=l.size.indexOf("em")?h.size=p*m:-1!=l.size.indexOf("%")?h.size=p/100*m:-1!=l.size.indexOf("pt")?h.size=m/0.75:h.size=p;h.size*=0.981;p=h.style+" "+h.variant+" "+h.weight+" "+h.size+"px "+h.family;m=this.element_.currentStyle;l=this.textAlign.toLowerCase();switch(l){case "left":case "center":case "right":break;case "end":l="ltr"==m.direction?"right":"left";break;case "start":l="rtl"==m.direction?"right": +"left";break;default:l="left"}switch(this.textBaseline){case "hanging":case "top":t=h.size/1.75;break;case "middle":break;default:case null:case "alphabetic":case "ideographic":case "bottom":t=-h.size/2.25}switch(l){case "right":d=1E3;r=0.05;break;case "center":d=r=500}b=s(this,b+0,c+t);n.push('');e?S(this,n):T(this,n,{x:-d,y:0}, +{x:r,y:h.size});e=f[0][0].toFixed(3)+","+f[1][0].toFixed(3)+","+f[0][1].toFixed(3)+","+f[1][1].toFixed(3)+",0,0";b=k(b.x/q)+","+k(b.y/q);n.push('','','');this.element_.insertAdjacentHTML("beforeEnd",n.join(""))};d.fillText=function(a,b,c,d){this.drawText_(a,b,c,d,!1)};d.strokeText=function(a, +b,c,d){this.drawText_(a,b,c,d,!0)};d.measureText=function(a){this.textMeasureEl_||(this.element_.insertAdjacentHTML("beforeEnd",''),this.textMeasureEl_=this.element_.lastChild);var b=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(b.createTextNode(a));return{width:this.textMeasureEl_.offsetWidth}};d.clip=function(){}; +d.arcTo=function(){};d.createPattern=function(a,b){return new I(a,b)};w.prototype.addColorStop=function(a,b){b=G(b);this.colors_.push({offset:a,color:b.color,alpha:b.alpha})};d=A.prototype=Error();d.INDEX_SIZE_ERR=1;d.DOMSTRING_SIZE_ERR=2;d.HIERARCHY_REQUEST_ERR=3;d.WRONG_DOCUMENT_ERR=4;d.INVALID_CHARACTER_ERR=5;d.NO_DATA_ALLOWED_ERR=6;d.NO_MODIFICATION_ALLOWED_ERR=7;d.NOT_FOUND_ERR=8;d.NOT_SUPPORTED_ERR=9;d.INUSE_ATTRIBUTE_ERR=10;d.INVALID_STATE_ERR=11;d.SYNTAX_ERR=12;d.INVALID_MODIFICATION_ERR= +13;d.NAMESPACE_ERR=14;d.INVALID_ACCESS_ERR=15;d.VALIDATION_ERR=16;d.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=U;CanvasRenderingContext2D=C;CanvasGradient=w;CanvasPattern=I;DOMException=A}(); + +/* + CanvasJS jQuery Charting Plugin - https://canvasjs.com/ + Copyright 2017 fenopix + + --------------------- License Information -------------------- + CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. + https://canvasjs.com/license/ + +*/ +(function(b,c,d,e){b.fn.CanvasJSChart=function(a){if(a){var b=this.first();a=new CanvasJS.Chart(this[0],a);b.children(".canvasjs-chart-container").data("canvasjsChartRef",a);a.render();return this}return this.first().children(".canvasjs-chart-container").data("canvasjsChartRef")}})(jQuery,window,document); +/*eslint-enable*/ +/*jshint ignore:end*/ \ No newline at end of file diff --git a/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/license.txt b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/license.txt new file mode 100644 index 00000000..f9882a14 --- /dev/null +++ b/Project-3 Issue Number 241/Libraries/canvasjs-2.3.1/license.txt @@ -0,0 +1,9 @@ +* +* @preserve CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ +* Copyright 2018 fenopix +* +* --------------------- License Information -------------------- +* CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. +* https://canvasjs.com/license/ +* +* \ No newline at end of file diff --git a/SRIP/Libraries/svm/.npmignore b/Project-3 Issue Number 241/Libraries/svm/.npmignore similarity index 100% rename from SRIP/Libraries/svm/.npmignore rename to Project-3 Issue Number 241/Libraries/svm/.npmignore diff --git a/SRIP/Libraries/svm/README.md b/Project-3 Issue Number 241/Libraries/svm/README.md similarity index 100% rename from SRIP/Libraries/svm/README.md rename to Project-3 Issue Number 241/Libraries/svm/README.md diff --git a/SRIP/Libraries/svm/lib/svm.js b/Project-3 Issue Number 241/Libraries/svm/lib/svm.js similarity index 100% rename from SRIP/Libraries/svm/lib/svm.js rename to Project-3 Issue Number 241/Libraries/svm/lib/svm.js diff --git a/SRIP/Libraries/svm/package.json b/Project-3 Issue Number 241/Libraries/svm/package.json similarity index 100% rename from SRIP/Libraries/svm/package.json rename to Project-3 Issue Number 241/Libraries/svm/package.json diff --git a/Project-3 Issue Number 241/Quiz/JSONquestions.js b/Project-3 Issue Number 241/Quiz/JSONquestions.js new file mode 100644 index 00000000..2bf68f59 --- /dev/null +++ b/Project-3 Issue Number 241/Quiz/JSONquestions.js @@ -0,0 +1,41 @@ +var questions = [ +["Probability distribution of discrete random variable is classified as", "probability mass function" , "posterior mass function", "interior mass function", "continuous mass function", "1"], +["The appropriate graph of probability density function is: ", "Curve", "Histogram", "Polygon", "All","1"], +["A discrete probability distribution may be represented by: ", "Table", "Graph", "Mathematical equation", "All","4"], +["If the random variable takes negative values, then the negative values will have: ", "Positive Probabilities", "Negative Probabilities", "Negative Probabilities", "All","1"], +["Total area under the curve of a continuous probability density function is always equal to: ", "0", "1", "-1", "None of the above","2"], +["A quantity resulting from an experiment that, by chance, can assume different values is called: ", "Random experiment", "Random sample", "Random variable", "Random process","3"], +["In a discrete probability distribution the sum of all the probabilities is always equal to: ", " 0", "1", "Minimum", "Maximum","2"], +["Numbers selected by a random process and are equally distributed in a table are called: " , "Attributes", "Random variables", "Random numbers", "Quantitative variables","3"], +["Which one is not an example of random experiment?", "A coin is tossed and the outcome is either a head or a tail ", " A six-sided die is rolled ", "Some number of persons will be admitted to a hospital emergency room during any hour. ", "All medical insurance claims received by a company in a given year. ","4"], +["A basketball player makes 80 percent of his free throws during the season. What is the probability that he will make exactly 6 of his next 8 free throws?", "0.1468", "0.3355", "0.1678", "0.2936","4"], +["The covariance of two random variables", "does not have an upper or lower bound", "does not provide an indication of the direction of the relationship between the variables", "is greatly influenced by the scaling of the numbers.", "both Answer 1 and 3","4"], +["The sum of the product of each value of a discrete random variable X times its probability is referred to as its ", "expected value", "Variance", "Mean", "Both a and c","4"], +["Difference between highest and lowest observation is 20 and coefficient of range is 0.077 then sum of highest and lowest value is", "210", "220", "260", "240", "3"], +["What is Euclidean distance?", "technique used to find the distance among objects", "technique used to find the dissimilarity among objects", "Both 1 and 2", "None of the above", "3"], +["Find the distance of the point (-6, 8) from the origin", "8", "11", "10", "9", "3"], +["Find the value of p for which the points (-5, 1), (1, p) and (4, -2) are collinear.", "-3", "-2", "0", "-1", "4"], +["What is the basic operation of closest pair algorithm using brute force technique?", "Euclidean distance", "Radius", "Area", "Manhattan distance", "1"], +["Which of the following is similar to Euclidean distance?", "Manhattan distance", "Pythagoras metric", "Chebyshev distance", "Heuristic distance", "2"], +["Which of the following areas do closest pair problem arise?", "computational geometry", "graph colouring problems", "numerical problems", "string matching", "1"], +["Which approach is based on computing the distance between each pair of distinct points and finding a pair with the smallest distance?", "Brute force", "Exhaustive search", "Divide and conquer", "Branch and bound", "1"], +["The most important condition for which closest pair is calculated for the points (pi, pj) is?", "i>j", "i!=j", "i=j", "i + + + + QUIZ + + + +
+

Quiz on Experiment: Generation of Random Variables

+

+
+
+ + + + + +
+ + + + + + + \ No newline at end of file diff --git a/Project-3 Issue Number 241/Quiz/quiz.js b/Project-3 Issue Number 241/Quiz/quiz.js new file mode 100644 index 00000000..d89861ea --- /dev/null +++ b/Project-3 Issue Number 241/Quiz/quiz.js @@ -0,0 +1,61 @@ +var quiz = document.getElementById("quiz"); +var ques = document.getElementById("question"); +var opt1 = document.getElementById("option1"); +var opt2 = document.getElementById("option2"); +var opt3 = document.getElementById("option3"); +var opt4 = document.getElementById("option4"); +var res = document.getElementById("result"); +var nextbutton = document.getElementById("next"); +var q = document.getElementById("quit"); + +var tques = questions.length; +var score = 0; +var quesindex = 0; + +//finish the quiz +function quit(){ + quiz.style.display = "none"; + result.style.display = ""; + var f = score / tques; + result.textContent = "SCORE = " + score; + q.style.display = "none"; +} + +//start the quiz +function giveQues(quesindex){ + ques.textContent = quesindex + 1 + ". " + questions[quesindex][0]; + opt1.textContent = questions[quesindex][1]; + opt2.textContent = questions[quesindex][2]; + opt3.textContent = questions[quesindex][3]; + opt4.textContent = questions[quesindex][4]; + return; +} + +giveQues(0); + +//next question +function nextques(){ + var selectedAns = document.querySelector("input[type=radio]:checked"); + if(!selectedAns){ + alert("SELECT AN OPTION"); + return; + } + + if(selectedAns.value == questions[quesindex][5]){ + score = score + 1; + } + selectedAns.checked = false; + quesindex++; + if(quesindex == tques - 1){ + nextbutton.textContent = "Finish"; + } + var f = score / tques; + if(quesindex == tques){ + q.style.display = "none"; + quiz.style.display = "none"; + result.style.display = ""; + result.textContent = "SCORED: " + score + " out of 25 " + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973); + return; + } + giveQues(quesindex); +} diff --git a/Project-3 Issue Number 241/README.txt b/Project-3 Issue Number 241/README.txt new file mode 100644 index 00000000..a4b10dfd --- /dev/null +++ b/Project-3 Issue Number 241/README.txt @@ -0,0 +1,15 @@ +This is Readme file containing instruction for running the experiment: Generation of Random Variables + +TO RUN THE EXPERIMENT: +1. Download the SRIP folder +2. Go to Codes folder +3. Run the .html file + +HTML file will open in the browser and all functionalities will run from the HTML file. + + +TAKE A QUIZ OF THE EXPERIMENT: +1. Go to Quiz folder +2. Run quiz.html +3. Quiz will open in the browser +4. Give the quiz diff --git a/SRIP/SRIP Project 3 Documentation.pdf b/Project-3 Issue Number 241/SRIP Project 3 Documentation.pdf similarity index 100% rename from SRIP/SRIP Project 3 Documentation.pdf rename to Project-3 Issue Number 241/SRIP Project 3 Documentation.pdf diff --git a/SRIP/Test Cases for Project 3.pdf b/Project-3 Issue Number 241/Test Cases for Project 3.pdf similarity index 100% rename from SRIP/Test Cases for Project 3.pdf rename to Project-3 Issue Number 241/Test Cases for Project 3.pdf diff --git a/SRIP/Quiz/JSONquestions.js b/SRIP/Quiz/JSONquestions.js index 2bf68f59..7c4b6fec 100644 --- a/SRIP/Quiz/JSONquestions.js +++ b/SRIP/Quiz/JSONquestions.js @@ -1,30 +1,4 @@ -var questions = [ -["Probability distribution of discrete random variable is classified as", "probability mass function" , "posterior mass function", "interior mass function", "continuous mass function", "1"], -["The appropriate graph of probability density function is: ", "Curve", "Histogram", "Polygon", "All","1"], -["A discrete probability distribution may be represented by: ", "Table", "Graph", "Mathematical equation", "All","4"], -["If the random variable takes negative values, then the negative values will have: ", "Positive Probabilities", "Negative Probabilities", "Negative Probabilities", "All","1"], -["Total area under the curve of a continuous probability density function is always equal to: ", "0", "1", "-1", "None of the above","2"], -["A quantity resulting from an experiment that, by chance, can assume different values is called: ", "Random experiment", "Random sample", "Random variable", "Random process","3"], -["In a discrete probability distribution the sum of all the probabilities is always equal to: ", " 0", "1", "Minimum", "Maximum","2"], -["Numbers selected by a random process and are equally distributed in a table are called: " , "Attributes", "Random variables", "Random numbers", "Quantitative variables","3"], -["Which one is not an example of random experiment?", "A coin is tossed and the outcome is either a head or a tail ", " A six-sided die is rolled ", "Some number of persons will be admitted to a hospital emergency room during any hour. ", "All medical insurance claims received by a company in a given year. ","4"], -["A basketball player makes 80 percent of his free throws during the season. What is the probability that he will make exactly 6 of his next 8 free throws?", "0.1468", "0.3355", "0.1678", "0.2936","4"], -["The covariance of two random variables", "does not have an upper or lower bound", "does not provide an indication of the direction of the relationship between the variables", "is greatly influenced by the scaling of the numbers.", "both Answer 1 and 3","4"], -["The sum of the product of each value of a discrete random variable X times its probability is referred to as its ", "expected value", "Variance", "Mean", "Both a and c","4"], -["Difference between highest and lowest observation is 20 and coefficient of range is 0.077 then sum of highest and lowest value is", "210", "220", "260", "240", "3"], -["What is Euclidean distance?", "technique used to find the distance among objects", "technique used to find the dissimilarity among objects", "Both 1 and 2", "None of the above", "3"], -["Find the distance of the point (-6, 8) from the origin", "8", "11", "10", "9", "3"], -["Find the value of p for which the points (-5, 1), (1, p) and (4, -2) are collinear.", "-3", "-2", "0", "-1", "4"], -["What is the basic operation of closest pair algorithm using brute force technique?", "Euclidean distance", "Radius", "Area", "Manhattan distance", "1"], -["Which of the following is similar to Euclidean distance?", "Manhattan distance", "Pythagoras metric", "Chebyshev distance", "Heuristic distance", "2"], -["Which of the following areas do closest pair problem arise?", "computational geometry", "graph colouring problems", "numerical problems", "string matching", "1"], -["Which approach is based on computing the distance between each pair of distinct points and finding a pair with the smallest distance?", "Brute force", "Exhaustive search", "Divide and conquer", "Branch and bound", "1"], -["The most important condition for which closest pair is calculated for the points (pi, pj) is?", "i>j", "i!=j", "i=j", "i Date: Fri, 28 Jun 2019 09:49:44 +0530 Subject: [PATCH 150/166] srip --- SRIP/Libraries/Chart.js | 14680 ---------------- SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js | 911 - .../canvasjs-2.3.1/canvasjs.react.js | 48 - .../examples/01-overview/animated-chart.html | 43 - .../01-overview/chart-from-json-data.html | 50 - .../chart-with-axis-scale-breaks.html | 51 - .../01-overview/chart-with-crosshair.html | 72 - .../chart-with-custom-legend-chart.html | 233 - .../01-overview/chart-with-image-overlay.html | 108 - .../chart-with-index-data-label.html | 46 - .../chart-with-inverted-reversed-axis.html | 46 - .../chart-with-logarithmic-axis.html | 128 - .../chart-with-secondary-axis.html | 87 - .../01-overview/chart-with-zoom-pan.html | 40 - .../examples/01-overview/dynamic-chart.html | 57 - .../interactive-draggable-chart.html | 115 - .../01-overview/multi-series-chart.html | 94 - .../examples/01-overview/null-data-chart.html | 62 - .../01-overview/performance-demo.html | 43 - .../dashed-line-chart.html | 102 - .../dynamic-spline-chart.html | 56 - .../line-chart-with-axis-scale-breaks.html | 71 - .../line-chart-with-data-markers.html | 53 - .../line-chart-with-logarithmic-axis.html | 107 - .../line-chart-with-multiple-axis.html | 125 - .../line-chart-with-zoom-pan.html | 46 - .../line-chart.html | 44 - .../multi-series-line-chart.html | 257 - .../multi-series-spline-chart.html | 171 - .../multi-series-step-line-chart.html | 67 - .../spline-chart-with-legends.html | 123 - .../spline-chart-with-secondary-axis.html | 100 - .../spline-chart.html | 55 - .../step-line-chart.html | 57 - .../area-chart.html | 50 - .../multi-series-area-chart.html | 73 - .../multi-series-range-area-chart.html | 127 - .../multi-series-spline-area-chart.html | 113 - .../range-area-chart.html | 72 - .../range-spline-area-chart.html | 51 - .../spline-area-chart.html | 55 - ...ed-area-100-chart-with-date-time-axis.html | 120 - .../stacked-area-100-chart.html | 78 - .../stacked-area-chart.html | 68 - .../step-area-chart.html | 42 - .../bar-chart-with-axis-scale-break.html | 58 - .../bar-chart.html | 58 - .../column-chart-with-multiple-axis.html | 83 - .../column-chart.html | 43 - .../multi-series-bar-chart.html | 104 - .../multi-series-range-column-chart.html | 89 - .../multi-series-waterfall-chart.html | 98 - .../range-bar-chart.html | 49 - .../range-column-chart.html | 49 - .../stacked-bar-100-chart.html | 76 - .../stacked-bar-chart.html | 126 - .../stacked-column-100-chart.html | 103 - .../stacked-column-chart.html | 113 - .../waterfall-chart-with-custom-color.html | 51 - .../waterfall-chart.html | 48 - .../doughnut-Chart.html | 40 - ...ughnut-chart-with-custom-inner-radius.html | 55 - .../funnel-chart-with-custom-neck.html | 52 - .../funnel-chart.html | 52 - .../inverted-reversed-funnel-chart.html | 54 - .../pie-chart-with-custom-radius.html | 51 - .../pie-chart-with-legends.html | 52 - .../pie-chart.html | 36 - ...mid-chart-where-area-represents-value.html | 39 - ...-chart-with-index-label-placed-Inside.html | 40 - .../pyramid-chart.html | 40 - .../candlestick-line-chart.html | 108 - .../multi-series-candlestick-chart.html | 90 - .../ohlc-chart-from-json-data.html | 58 - .../ohlc-stock-chart.html | 54 - .../bubble-chart-with-data-marker.html | 59 - .../bubble-chart-with-zoom-pan.html | 60 - .../bubble-chart.html | 69 - .../multi-series-scatter-point-chart.html | 73 - ...catter-point-chart-with-custom-marker.html | 129 - .../scatter-point-chart.html | 63 - ...x-and-whisker-chart-with-custom-color.html | 43 - .../box-and-whisker-chart-with-outliers.html | 81 - .../box-and-whisker-chart.html | 43 - .../column-line-area-chart.html | 122 - .../error-bar-chart.html | 54 - .../09-combination-charts/error-chart.html | 58 - .../error-line-chart.html | 73 - .../ohlc-line-chart.html | 106 - .../pareto-chart-with-index-data-label.html | 68 - .../09-combination-charts/pareto-chart.html | 66 - .../range-area-line-chart.html | 108 - .../dynamic-column-chart.html | 54 - .../10-dynamic-charts/dynamic-line-chart.html | 58 - .../dynamic-multi-series-chart.html | 113 - .../11-integration/jquery-charts.html | 42 - .../jquery-line-chart-with-zoom-pan.html | 49 - .../jquery-resizable-chart.html | 55 - .../jquery-spline-area-chart-in-tab.html | 98 - ...jquery-spline-chart-with-image-export.html | 41 - SRIP/Libraries/canvasjs-2.3.1/instruction.txt | 4 - .../canvasjs-2.3.1/jquery.canvasjs.min.js | 922 - SRIP/Libraries/canvasjs-2.3.1/license.txt | 9 - SRIP/Quiz/JSONquestions.js | 15 - SRIP/Quiz/quiz.css | 190 - SRIP/Quiz/quiz.html | 27 - SRIP/Quiz/quiz.js | 61 - SRIP/README.txt | 15 - 108 files changed, 24194 deletions(-) delete mode 100644 SRIP/Libraries/Chart.js delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/instruction.txt delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/license.txt delete mode 100644 SRIP/Quiz/JSONquestions.js delete mode 100644 SRIP/Quiz/quiz.css delete mode 100644 SRIP/Quiz/quiz.html delete mode 100644 SRIP/Quiz/quiz.js delete mode 100644 SRIP/README.txt diff --git a/SRIP/Libraries/Chart.js b/SRIP/Libraries/Chart.js deleted file mode 100644 index 4c50e09b..00000000 --- a/SRIP/Libraries/Chart.js +++ /dev/null @@ -1,14680 +0,0 @@ -/*! - * Chart.js v2.8.0 - * https://www.chartjs.org - * (c) 2019 Chart.js Contributors - * Released under the MIT License - */ -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(function() { try { return require('moment'); } catch(e) { } }()) : -typeof define === 'function' && define.amd ? define(['require'], function(require) { return factory(function() { try { return require('moment'); } catch(e) { } }()); }) : -(global.Chart = factory(global.moment)); -}(this, (function (moment) { 'use strict'; - -moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment; - -/* MIT license */ - -var conversions = { - rgb2hsl: rgb2hsl, - rgb2hsv: rgb2hsv, - rgb2hwb: rgb2hwb, - rgb2cmyk: rgb2cmyk, - rgb2keyword: rgb2keyword, - rgb2xyz: rgb2xyz, - rgb2lab: rgb2lab, - rgb2lch: rgb2lch, - - hsl2rgb: hsl2rgb, - hsl2hsv: hsl2hsv, - hsl2hwb: hsl2hwb, - hsl2cmyk: hsl2cmyk, - hsl2keyword: hsl2keyword, - - hsv2rgb: hsv2rgb, - hsv2hsl: hsv2hsl, - hsv2hwb: hsv2hwb, - hsv2cmyk: hsv2cmyk, - hsv2keyword: hsv2keyword, - - hwb2rgb: hwb2rgb, - hwb2hsl: hwb2hsl, - hwb2hsv: hwb2hsv, - hwb2cmyk: hwb2cmyk, - hwb2keyword: hwb2keyword, - - cmyk2rgb: cmyk2rgb, - cmyk2hsl: cmyk2hsl, - cmyk2hsv: cmyk2hsv, - cmyk2hwb: cmyk2hwb, - cmyk2keyword: cmyk2keyword, - - keyword2rgb: keyword2rgb, - keyword2hsl: keyword2hsl, - keyword2hsv: keyword2hsv, - keyword2hwb: keyword2hwb, - keyword2cmyk: keyword2cmyk, - keyword2lab: keyword2lab, - keyword2xyz: keyword2xyz, - - xyz2rgb: xyz2rgb, - xyz2lab: xyz2lab, - xyz2lch: xyz2lch, - - lab2xyz: lab2xyz, - lab2rgb: lab2rgb, - lab2lch: lab2lch, - - lch2lab: lch2lab, - lch2xyz: lch2xyz, - lch2rgb: lch2rgb -}; - - -function rgb2hsl(rgb) { - var r = rgb[0]/255, - g = rgb[1]/255, - b = rgb[2]/255, - min = Math.min(r, g, b), - max = Math.max(r, g, b), - delta = max - min, - h, s, l; - - if (max == min) - h = 0; - else if (r == max) - h = (g - b) / delta; - else if (g == max) - h = 2 + (b - r) / delta; - else if (b == max) - h = 4 + (r - g)/ delta; - - h = Math.min(h * 60, 360); - - if (h < 0) - h += 360; - - l = (min + max) / 2; - - if (max == min) - s = 0; - else if (l <= 0.5) - s = delta / (max + min); - else - s = delta / (2 - max - min); - - return [h, s * 100, l * 100]; -} - -function rgb2hsv(rgb) { - var r = rgb[0], - g = rgb[1], - b = rgb[2], - min = Math.min(r, g, b), - max = Math.max(r, g, b), - delta = max - min, - h, s, v; - - if (max == 0) - s = 0; - else - s = (delta/max * 1000)/10; - - if (max == min) - h = 0; - else if (r == max) - h = (g - b) / delta; - else if (g == max) - h = 2 + (b - r) / delta; - else if (b == max) - h = 4 + (r - g) / delta; - - h = Math.min(h * 60, 360); - - if (h < 0) - h += 360; - - v = ((max / 255) * 1000) / 10; - - return [h, s, v]; -} - -function rgb2hwb(rgb) { - var r = rgb[0], - g = rgb[1], - b = rgb[2], - h = rgb2hsl(rgb)[0], - w = 1/255 * Math.min(r, Math.min(g, b)), - b = 1 - 1/255 * Math.max(r, Math.max(g, b)); - - return [h, w * 100, b * 100]; -} - -function rgb2cmyk(rgb) { - var r = rgb[0] / 255, - g = rgb[1] / 255, - b = rgb[2] / 255, - c, m, y, k; - - k = Math.min(1 - r, 1 - g, 1 - b); - c = (1 - r - k) / (1 - k) || 0; - m = (1 - g - k) / (1 - k) || 0; - y = (1 - b - k) / (1 - k) || 0; - return [c * 100, m * 100, y * 100, k * 100]; -} - -function rgb2keyword(rgb) { - return reverseKeywords[JSON.stringify(rgb)]; -} - -function rgb2xyz(rgb) { - var r = rgb[0] / 255, - g = rgb[1] / 255, - b = rgb[2] / 255; - - // assume sRGB - r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); - g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); - b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); - - var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); - var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); - var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); - - return [x * 100, y *100, z * 100]; -} - -function rgb2lab(rgb) { - var xyz = rgb2xyz(rgb), - x = xyz[0], - y = xyz[1], - z = xyz[2], - l, a, b; - - x /= 95.047; - y /= 100; - z /= 108.883; - - x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); - - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); - - return [l, a, b]; -} - -function rgb2lch(args) { - return lab2lch(rgb2lab(args)); -} - -function hsl2rgb(hsl) { - var h = hsl[0] / 360, - s = hsl[1] / 100, - l = hsl[2] / 100, - t1, t2, t3, rgb, val; - - if (s == 0) { - val = l * 255; - return [val, val, val]; - } - - if (l < 0.5) - t2 = l * (1 + s); - else - t2 = l + s - l * s; - t1 = 2 * l - t2; - - rgb = [0, 0, 0]; - for (var i = 0; i < 3; i++) { - t3 = h + 1 / 3 * - (i - 1); - t3 < 0 && t3++; - t3 > 1 && t3--; - - if (6 * t3 < 1) - val = t1 + (t2 - t1) * 6 * t3; - else if (2 * t3 < 1) - val = t2; - else if (3 * t3 < 2) - val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; - else - val = t1; - - rgb[i] = val * 255; - } - - return rgb; -} - -function hsl2hsv(hsl) { - var h = hsl[0], - s = hsl[1] / 100, - l = hsl[2] / 100, - sv, v; - - if(l === 0) { - // no need to do calc on black - // also avoids divide by 0 error - return [0, 0, 0]; - } - - l *= 2; - s *= (l <= 1) ? l : 2 - l; - v = (l + s) / 2; - sv = (2 * s) / (l + s); - return [h, sv * 100, v * 100]; -} - -function hsl2hwb(args) { - return rgb2hwb(hsl2rgb(args)); -} - -function hsl2cmyk(args) { - return rgb2cmyk(hsl2rgb(args)); -} - -function hsl2keyword(args) { - return rgb2keyword(hsl2rgb(args)); -} - - -function hsv2rgb(hsv) { - var h = hsv[0] / 60, - s = hsv[1] / 100, - v = hsv[2] / 100, - hi = Math.floor(h) % 6; - - var f = h - Math.floor(h), - p = 255 * v * (1 - s), - q = 255 * v * (1 - (s * f)), - t = 255 * v * (1 - (s * (1 - f))), - v = 255 * v; - - switch(hi) { - case 0: - return [v, t, p]; - case 1: - return [q, v, p]; - case 2: - return [p, v, t]; - case 3: - return [p, q, v]; - case 4: - return [t, p, v]; - case 5: - return [v, p, q]; - } -} - -function hsv2hsl(hsv) { - var h = hsv[0], - s = hsv[1] / 100, - v = hsv[2] / 100, - sl, l; - - l = (2 - s) * v; - sl = s * v; - sl /= (l <= 1) ? l : 2 - l; - sl = sl || 0; - l /= 2; - return [h, sl * 100, l * 100]; -} - -function hsv2hwb(args) { - return rgb2hwb(hsv2rgb(args)) -} - -function hsv2cmyk(args) { - return rgb2cmyk(hsv2rgb(args)); -} - -function hsv2keyword(args) { - return rgb2keyword(hsv2rgb(args)); -} - -// http://dev.w3.org/csswg/css-color/#hwb-to-rgb -function hwb2rgb(hwb) { - var h = hwb[0] / 360, - wh = hwb[1] / 100, - bl = hwb[2] / 100, - ratio = wh + bl, - i, v, f, n; - - // wh + bl cant be > 1 - if (ratio > 1) { - wh /= ratio; - bl /= ratio; - } - - i = Math.floor(6 * h); - v = 1 - bl; - f = 6 * h - i; - if ((i & 0x01) != 0) { - f = 1 - f; - } - n = wh + f * (v - wh); // linear interpolation - - switch (i) { - default: - case 6: - case 0: r = v; g = n; b = wh; break; - case 1: r = n; g = v; b = wh; break; - case 2: r = wh; g = v; b = n; break; - case 3: r = wh; g = n; b = v; break; - case 4: r = n; g = wh; b = v; break; - case 5: r = v; g = wh; b = n; break; - } - - return [r * 255, g * 255, b * 255]; -} - -function hwb2hsl(args) { - return rgb2hsl(hwb2rgb(args)); -} - -function hwb2hsv(args) { - return rgb2hsv(hwb2rgb(args)); -} - -function hwb2cmyk(args) { - return rgb2cmyk(hwb2rgb(args)); -} - -function hwb2keyword(args) { - return rgb2keyword(hwb2rgb(args)); -} - -function cmyk2rgb(cmyk) { - var c = cmyk[0] / 100, - m = cmyk[1] / 100, - y = cmyk[2] / 100, - k = cmyk[3] / 100, - r, g, b; - - r = 1 - Math.min(1, c * (1 - k) + k); - g = 1 - Math.min(1, m * (1 - k) + k); - b = 1 - Math.min(1, y * (1 - k) + k); - return [r * 255, g * 255, b * 255]; -} - -function cmyk2hsl(args) { - return rgb2hsl(cmyk2rgb(args)); -} - -function cmyk2hsv(args) { - return rgb2hsv(cmyk2rgb(args)); -} - -function cmyk2hwb(args) { - return rgb2hwb(cmyk2rgb(args)); -} - -function cmyk2keyword(args) { - return rgb2keyword(cmyk2rgb(args)); -} - - -function xyz2rgb(xyz) { - var x = xyz[0] / 100, - y = xyz[1] / 100, - z = xyz[2] / 100, - r, g, b; - - r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); - g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); - b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); - - // assume sRGB - r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) - : r = (r * 12.92); - - g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) - : g = (g * 12.92); - - b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) - : b = (b * 12.92); - - r = Math.min(Math.max(0, r), 1); - g = Math.min(Math.max(0, g), 1); - b = Math.min(Math.max(0, b), 1); - - return [r * 255, g * 255, b * 255]; -} - -function xyz2lab(xyz) { - var x = xyz[0], - y = xyz[1], - z = xyz[2], - l, a, b; - - x /= 95.047; - y /= 100; - z /= 108.883; - - x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); - - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); - - return [l, a, b]; -} - -function xyz2lch(args) { - return lab2lch(xyz2lab(args)); -} - -function lab2xyz(lab) { - var l = lab[0], - a = lab[1], - b = lab[2], - x, y, z, y2; - - if (l <= 8) { - y = (l * 100) / 903.3; - y2 = (7.787 * (y / 100)) + (16 / 116); - } else { - y = 100 * Math.pow((l + 16) / 116, 3); - y2 = Math.pow(y / 100, 1/3); - } - - x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); - - z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); - - return [x, y, z]; -} - -function lab2lch(lab) { - var l = lab[0], - a = lab[1], - b = lab[2], - hr, h, c; - - hr = Math.atan2(b, a); - h = hr * 360 / 2 / Math.PI; - if (h < 0) { - h += 360; - } - c = Math.sqrt(a * a + b * b); - return [l, c, h]; -} - -function lab2rgb(args) { - return xyz2rgb(lab2xyz(args)); -} - -function lch2lab(lch) { - var l = lch[0], - c = lch[1], - h = lch[2], - a, b, hr; - - hr = h / 360 * 2 * Math.PI; - a = c * Math.cos(hr); - b = c * Math.sin(hr); - return [l, a, b]; -} - -function lch2xyz(args) { - return lab2xyz(lch2lab(args)); -} - -function lch2rgb(args) { - return lab2rgb(lch2lab(args)); -} - -function keyword2rgb(keyword) { - return cssKeywords[keyword]; -} - -function keyword2hsl(args) { - return rgb2hsl(keyword2rgb(args)); -} - -function keyword2hsv(args) { - return rgb2hsv(keyword2rgb(args)); -} - -function keyword2hwb(args) { - return rgb2hwb(keyword2rgb(args)); -} - -function keyword2cmyk(args) { - return rgb2cmyk(keyword2rgb(args)); -} - -function keyword2lab(args) { - return rgb2lab(keyword2rgb(args)); -} - -function keyword2xyz(args) { - return rgb2xyz(keyword2rgb(args)); -} - -var cssKeywords = { - aliceblue: [240,248,255], - antiquewhite: [250,235,215], - aqua: [0,255,255], - aquamarine: [127,255,212], - azure: [240,255,255], - beige: [245,245,220], - bisque: [255,228,196], - black: [0,0,0], - blanchedalmond: [255,235,205], - blue: [0,0,255], - blueviolet: [138,43,226], - brown: [165,42,42], - burlywood: [222,184,135], - cadetblue: [95,158,160], - chartreuse: [127,255,0], - chocolate: [210,105,30], - coral: [255,127,80], - cornflowerblue: [100,149,237], - cornsilk: [255,248,220], - crimson: [220,20,60], - cyan: [0,255,255], - darkblue: [0,0,139], - darkcyan: [0,139,139], - darkgoldenrod: [184,134,11], - darkgray: [169,169,169], - darkgreen: [0,100,0], - darkgrey: [169,169,169], - darkkhaki: [189,183,107], - darkmagenta: [139,0,139], - darkolivegreen: [85,107,47], - darkorange: [255,140,0], - darkorchid: [153,50,204], - darkred: [139,0,0], - darksalmon: [233,150,122], - darkseagreen: [143,188,143], - darkslateblue: [72,61,139], - darkslategray: [47,79,79], - darkslategrey: [47,79,79], - darkturquoise: [0,206,209], - darkviolet: [148,0,211], - deeppink: [255,20,147], - deepskyblue: [0,191,255], - dimgray: [105,105,105], - dimgrey: [105,105,105], - dodgerblue: [30,144,255], - firebrick: [178,34,34], - floralwhite: [255,250,240], - forestgreen: [34,139,34], - fuchsia: [255,0,255], - gainsboro: [220,220,220], - ghostwhite: [248,248,255], - gold: [255,215,0], - goldenrod: [218,165,32], - gray: [128,128,128], - green: [0,128,0], - greenyellow: [173,255,47], - grey: [128,128,128], - honeydew: [240,255,240], - hotpink: [255,105,180], - indianred: [205,92,92], - indigo: [75,0,130], - ivory: [255,255,240], - khaki: [240,230,140], - lavender: [230,230,250], - lavenderblush: [255,240,245], - lawngreen: [124,252,0], - lemonchiffon: [255,250,205], - lightblue: [173,216,230], - lightcoral: [240,128,128], - lightcyan: [224,255,255], - lightgoldenrodyellow: [250,250,210], - lightgray: [211,211,211], - lightgreen: [144,238,144], - lightgrey: [211,211,211], - lightpink: [255,182,193], - lightsalmon: [255,160,122], - lightseagreen: [32,178,170], - lightskyblue: [135,206,250], - lightslategray: [119,136,153], - lightslategrey: [119,136,153], - lightsteelblue: [176,196,222], - lightyellow: [255,255,224], - lime: [0,255,0], - limegreen: [50,205,50], - linen: [250,240,230], - magenta: [255,0,255], - maroon: [128,0,0], - mediumaquamarine: [102,205,170], - mediumblue: [0,0,205], - mediumorchid: [186,85,211], - mediumpurple: [147,112,219], - mediumseagreen: [60,179,113], - mediumslateblue: [123,104,238], - mediumspringgreen: [0,250,154], - mediumturquoise: [72,209,204], - mediumvioletred: [199,21,133], - midnightblue: [25,25,112], - mintcream: [245,255,250], - mistyrose: [255,228,225], - moccasin: [255,228,181], - navajowhite: [255,222,173], - navy: [0,0,128], - oldlace: [253,245,230], - olive: [128,128,0], - olivedrab: [107,142,35], - orange: [255,165,0], - orangered: [255,69,0], - orchid: [218,112,214], - palegoldenrod: [238,232,170], - palegreen: [152,251,152], - paleturquoise: [175,238,238], - palevioletred: [219,112,147], - papayawhip: [255,239,213], - peachpuff: [255,218,185], - peru: [205,133,63], - pink: [255,192,203], - plum: [221,160,221], - powderblue: [176,224,230], - purple: [128,0,128], - rebeccapurple: [102, 51, 153], - red: [255,0,0], - rosybrown: [188,143,143], - royalblue: [65,105,225], - saddlebrown: [139,69,19], - salmon: [250,128,114], - sandybrown: [244,164,96], - seagreen: [46,139,87], - seashell: [255,245,238], - sienna: [160,82,45], - silver: [192,192,192], - skyblue: [135,206,235], - slateblue: [106,90,205], - slategray: [112,128,144], - slategrey: [112,128,144], - snow: [255,250,250], - springgreen: [0,255,127], - steelblue: [70,130,180], - tan: [210,180,140], - teal: [0,128,128], - thistle: [216,191,216], - tomato: [255,99,71], - turquoise: [64,224,208], - violet: [238,130,238], - wheat: [245,222,179], - white: [255,255,255], - whitesmoke: [245,245,245], - yellow: [255,255,0], - yellowgreen: [154,205,50] -}; - -var reverseKeywords = {}; -for (var key in cssKeywords) { - reverseKeywords[JSON.stringify(cssKeywords[key])] = key; -} - -var convert = function() { - return new Converter(); -}; - -for (var func in conversions) { - // export Raw versions - convert[func + "Raw"] = (function(func) { - // accept array or plain args - return function(arg) { - if (typeof arg == "number") - arg = Array.prototype.slice.call(arguments); - return conversions[func](arg); - } - })(func); - - var pair = /(\w+)2(\w+)/.exec(func), - from = pair[1], - to = pair[2]; - - // export rgb2hsl and ["rgb"]["hsl"] - convert[from] = convert[from] || {}; - - convert[from][to] = convert[func] = (function(func) { - return function(arg) { - if (typeof arg == "number") - arg = Array.prototype.slice.call(arguments); - - var val = conversions[func](arg); - if (typeof val == "string" || val === undefined) - return val; // keyword - - for (var i = 0; i < val.length; i++) - val[i] = Math.round(val[i]); - return val; - } - })(func); -} - - -/* Converter does lazy conversion and caching */ -var Converter = function() { - this.convs = {}; -}; - -/* Either get the values for a space or - set the values for a space, depending on args */ -Converter.prototype.routeSpace = function(space, args) { - var values = args[0]; - if (values === undefined) { - // color.rgb() - return this.getValues(space); - } - // color.rgb(10, 10, 10) - if (typeof values == "number") { - values = Array.prototype.slice.call(args); - } - - return this.setValues(space, values); -}; - -/* Set the values for a space, invalidating cache */ -Converter.prototype.setValues = function(space, values) { - this.space = space; - this.convs = {}; - this.convs[space] = values; - return this; -}; - -/* Get the values for a space. If there's already - a conversion for the space, fetch it, otherwise - compute it */ -Converter.prototype.getValues = function(space) { - var vals = this.convs[space]; - if (!vals) { - var fspace = this.space, - from = this.convs[fspace]; - vals = convert[fspace][space](from); - - this.convs[space] = vals; - } - return vals; -}; - -["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { - Converter.prototype[space] = function(vals) { - return this.routeSpace(space, arguments); - }; -}); - -var colorConvert = convert; - -var colorName = { - "aliceblue": [240, 248, 255], - "antiquewhite": [250, 235, 215], - "aqua": [0, 255, 255], - "aquamarine": [127, 255, 212], - "azure": [240, 255, 255], - "beige": [245, 245, 220], - "bisque": [255, 228, 196], - "black": [0, 0, 0], - "blanchedalmond": [255, 235, 205], - "blue": [0, 0, 255], - "blueviolet": [138, 43, 226], - "brown": [165, 42, 42], - "burlywood": [222, 184, 135], - "cadetblue": [95, 158, 160], - "chartreuse": [127, 255, 0], - "chocolate": [210, 105, 30], - "coral": [255, 127, 80], - "cornflowerblue": [100, 149, 237], - "cornsilk": [255, 248, 220], - "crimson": [220, 20, 60], - "cyan": [0, 255, 255], - "darkblue": [0, 0, 139], - "darkcyan": [0, 139, 139], - "darkgoldenrod": [184, 134, 11], - "darkgray": [169, 169, 169], - "darkgreen": [0, 100, 0], - "darkgrey": [169, 169, 169], - "darkkhaki": [189, 183, 107], - "darkmagenta": [139, 0, 139], - "darkolivegreen": [85, 107, 47], - "darkorange": [255, 140, 0], - "darkorchid": [153, 50, 204], - "darkred": [139, 0, 0], - "darksalmon": [233, 150, 122], - "darkseagreen": [143, 188, 143], - "darkslateblue": [72, 61, 139], - "darkslategray": [47, 79, 79], - "darkslategrey": [47, 79, 79], - "darkturquoise": [0, 206, 209], - "darkviolet": [148, 0, 211], - "deeppink": [255, 20, 147], - "deepskyblue": [0, 191, 255], - "dimgray": [105, 105, 105], - "dimgrey": [105, 105, 105], - "dodgerblue": [30, 144, 255], - "firebrick": [178, 34, 34], - "floralwhite": [255, 250, 240], - "forestgreen": [34, 139, 34], - "fuchsia": [255, 0, 255], - "gainsboro": [220, 220, 220], - "ghostwhite": [248, 248, 255], - "gold": [255, 215, 0], - "goldenrod": [218, 165, 32], - "gray": [128, 128, 128], - "green": [0, 128, 0], - "greenyellow": [173, 255, 47], - "grey": [128, 128, 128], - "honeydew": [240, 255, 240], - "hotpink": [255, 105, 180], - "indianred": [205, 92, 92], - "indigo": [75, 0, 130], - "ivory": [255, 255, 240], - "khaki": [240, 230, 140], - "lavender": [230, 230, 250], - "lavenderblush": [255, 240, 245], - "lawngreen": [124, 252, 0], - "lemonchiffon": [255, 250, 205], - "lightblue": [173, 216, 230], - "lightcoral": [240, 128, 128], - "lightcyan": [224, 255, 255], - "lightgoldenrodyellow": [250, 250, 210], - "lightgray": [211, 211, 211], - "lightgreen": [144, 238, 144], - "lightgrey": [211, 211, 211], - "lightpink": [255, 182, 193], - "lightsalmon": [255, 160, 122], - "lightseagreen": [32, 178, 170], - "lightskyblue": [135, 206, 250], - "lightslategray": [119, 136, 153], - "lightslategrey": [119, 136, 153], - "lightsteelblue": [176, 196, 222], - "lightyellow": [255, 255, 224], - "lime": [0, 255, 0], - "limegreen": [50, 205, 50], - "linen": [250, 240, 230], - "magenta": [255, 0, 255], - "maroon": [128, 0, 0], - "mediumaquamarine": [102, 205, 170], - "mediumblue": [0, 0, 205], - "mediumorchid": [186, 85, 211], - "mediumpurple": [147, 112, 219], - "mediumseagreen": [60, 179, 113], - "mediumslateblue": [123, 104, 238], - "mediumspringgreen": [0, 250, 154], - "mediumturquoise": [72, 209, 204], - "mediumvioletred": [199, 21, 133], - "midnightblue": [25, 25, 112], - "mintcream": [245, 255, 250], - "mistyrose": [255, 228, 225], - "moccasin": [255, 228, 181], - "navajowhite": [255, 222, 173], - "navy": [0, 0, 128], - "oldlace": [253, 245, 230], - "olive": [128, 128, 0], - "olivedrab": [107, 142, 35], - "orange": [255, 165, 0], - "orangered": [255, 69, 0], - "orchid": [218, 112, 214], - "palegoldenrod": [238, 232, 170], - "palegreen": [152, 251, 152], - "paleturquoise": [175, 238, 238], - "palevioletred": [219, 112, 147], - "papayawhip": [255, 239, 213], - "peachpuff": [255, 218, 185], - "peru": [205, 133, 63], - "pink": [255, 192, 203], - "plum": [221, 160, 221], - "powderblue": [176, 224, 230], - "purple": [128, 0, 128], - "rebeccapurple": [102, 51, 153], - "red": [255, 0, 0], - "rosybrown": [188, 143, 143], - "royalblue": [65, 105, 225], - "saddlebrown": [139, 69, 19], - "salmon": [250, 128, 114], - "sandybrown": [244, 164, 96], - "seagreen": [46, 139, 87], - "seashell": [255, 245, 238], - "sienna": [160, 82, 45], - "silver": [192, 192, 192], - "skyblue": [135, 206, 235], - "slateblue": [106, 90, 205], - "slategray": [112, 128, 144], - "slategrey": [112, 128, 144], - "snow": [255, 250, 250], - "springgreen": [0, 255, 127], - "steelblue": [70, 130, 180], - "tan": [210, 180, 140], - "teal": [0, 128, 128], - "thistle": [216, 191, 216], - "tomato": [255, 99, 71], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "wheat": [245, 222, 179], - "white": [255, 255, 255], - "whitesmoke": [245, 245, 245], - "yellow": [255, 255, 0], - "yellowgreen": [154, 205, 50] -}; - -/* MIT license */ - - -var colorString = { - getRgba: getRgba, - getHsla: getHsla, - getRgb: getRgb, - getHsl: getHsl, - getHwb: getHwb, - getAlpha: getAlpha, - - hexString: hexString, - rgbString: rgbString, - rgbaString: rgbaString, - percentString: percentString, - percentaString: percentaString, - hslString: hslString, - hslaString: hslaString, - hwbString: hwbString, - keyword: keyword -}; - -function getRgba(string) { - if (!string) { - return; - } - var abbr = /^#([a-fA-F0-9]{3,4})$/i, - hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i, - rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, - per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, - keyword = /(\w+)/; - - var rgb = [0, 0, 0], - a = 1, - match = string.match(abbr), - hexAlpha = ""; - if (match) { - match = match[1]; - hexAlpha = match[3]; - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match[i] + match[i], 16); - } - if (hexAlpha) { - a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100; - } - } - else if (match = string.match(hex)) { - hexAlpha = match[2]; - match = match[1]; - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); - } - if (hexAlpha) { - a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100; - } - } - else if (match = string.match(rgba)) { - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match[i + 1]); - } - a = parseFloat(match[4]); - } - else if (match = string.match(per)) { - for (var i = 0; i < rgb.length; i++) { - rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); - } - a = parseFloat(match[4]); - } - else if (match = string.match(keyword)) { - if (match[1] == "transparent") { - return [0, 0, 0, 0]; - } - rgb = colorName[match[1]]; - if (!rgb) { - return; - } - } - - for (var i = 0; i < rgb.length; i++) { - rgb[i] = scale(rgb[i], 0, 255); - } - if (!a && a != 0) { - a = 1; - } - else { - a = scale(a, 0, 1); - } - rgb[3] = a; - return rgb; -} - -function getHsla(string) { - if (!string) { - return; - } - var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; - var match = string.match(hsl); - if (match) { - var alpha = parseFloat(match[4]); - var h = scale(parseInt(match[1]), 0, 360), - s = scale(parseFloat(match[2]), 0, 100), - l = scale(parseFloat(match[3]), 0, 100), - a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); - return [h, s, l, a]; - } -} - -function getHwb(string) { - if (!string) { - return; - } - var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; - var match = string.match(hwb); - if (match) { - var alpha = parseFloat(match[4]); - var h = scale(parseInt(match[1]), 0, 360), - w = scale(parseFloat(match[2]), 0, 100), - b = scale(parseFloat(match[3]), 0, 100), - a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); - return [h, w, b, a]; - } -} - -function getRgb(string) { - var rgba = getRgba(string); - return rgba && rgba.slice(0, 3); -} - -function getHsl(string) { - var hsla = getHsla(string); - return hsla && hsla.slice(0, 3); -} - -function getAlpha(string) { - var vals = getRgba(string); - if (vals) { - return vals[3]; - } - else if (vals = getHsla(string)) { - return vals[3]; - } - else if (vals = getHwb(string)) { - return vals[3]; - } -} - -// generators -function hexString(rgba, a) { - var a = (a !== undefined && rgba.length === 3) ? a : rgba[3]; - return "#" + hexDouble(rgba[0]) - + hexDouble(rgba[1]) - + hexDouble(rgba[2]) - + ( - (a >= 0 && a < 1) - ? hexDouble(Math.round(a * 255)) - : "" - ); -} - -function rgbString(rgba, alpha) { - if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { - return rgbaString(rgba, alpha); - } - return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; -} - -function rgbaString(rgba, alpha) { - if (alpha === undefined) { - alpha = (rgba[3] !== undefined ? rgba[3] : 1); - } - return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] - + ", " + alpha + ")"; -} - -function percentString(rgba, alpha) { - if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { - return percentaString(rgba, alpha); - } - var r = Math.round(rgba[0]/255 * 100), - g = Math.round(rgba[1]/255 * 100), - b = Math.round(rgba[2]/255 * 100); - - return "rgb(" + r + "%, " + g + "%, " + b + "%)"; -} - -function percentaString(rgba, alpha) { - var r = Math.round(rgba[0]/255 * 100), - g = Math.round(rgba[1]/255 * 100), - b = Math.round(rgba[2]/255 * 100); - return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; -} - -function hslString(hsla, alpha) { - if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { - return hslaString(hsla, alpha); - } - return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; -} - -function hslaString(hsla, alpha) { - if (alpha === undefined) { - alpha = (hsla[3] !== undefined ? hsla[3] : 1); - } - return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " - + alpha + ")"; -} - -// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax -// (hwb have alpha optional & 1 is default value) -function hwbString(hwb, alpha) { - if (alpha === undefined) { - alpha = (hwb[3] !== undefined ? hwb[3] : 1); - } - return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" - + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; -} - -function keyword(rgb) { - return reverseNames[rgb.slice(0, 3)]; -} - -// helpers -function scale(num, min, max) { - return Math.min(Math.max(min, num), max); -} - -function hexDouble(num) { - var str = num.toString(16).toUpperCase(); - return (str.length < 2) ? "0" + str : str; -} - - -//create a list of reverse color names -var reverseNames = {}; -for (var name in colorName) { - reverseNames[colorName[name]] = name; -} - -/* MIT license */ - - - -var Color = function (obj) { - if (obj instanceof Color) { - return obj; - } - if (!(this instanceof Color)) { - return new Color(obj); - } - - this.valid = false; - this.values = { - rgb: [0, 0, 0], - hsl: [0, 0, 0], - hsv: [0, 0, 0], - hwb: [0, 0, 0], - cmyk: [0, 0, 0, 0], - alpha: 1 - }; - - // parse Color() argument - var vals; - if (typeof obj === 'string') { - vals = colorString.getRgba(obj); - if (vals) { - this.setValues('rgb', vals); - } else if (vals = colorString.getHsla(obj)) { - this.setValues('hsl', vals); - } else if (vals = colorString.getHwb(obj)) { - this.setValues('hwb', vals); - } - } else if (typeof obj === 'object') { - vals = obj; - if (vals.r !== undefined || vals.red !== undefined) { - this.setValues('rgb', vals); - } else if (vals.l !== undefined || vals.lightness !== undefined) { - this.setValues('hsl', vals); - } else if (vals.v !== undefined || vals.value !== undefined) { - this.setValues('hsv', vals); - } else if (vals.w !== undefined || vals.whiteness !== undefined) { - this.setValues('hwb', vals); - } else if (vals.c !== undefined || vals.cyan !== undefined) { - this.setValues('cmyk', vals); - } - } -}; - -Color.prototype = { - isValid: function () { - return this.valid; - }, - rgb: function () { - return this.setSpace('rgb', arguments); - }, - hsl: function () { - return this.setSpace('hsl', arguments); - }, - hsv: function () { - return this.setSpace('hsv', arguments); - }, - hwb: function () { - return this.setSpace('hwb', arguments); - }, - cmyk: function () { - return this.setSpace('cmyk', arguments); - }, - - rgbArray: function () { - return this.values.rgb; - }, - hslArray: function () { - return this.values.hsl; - }, - hsvArray: function () { - return this.values.hsv; - }, - hwbArray: function () { - var values = this.values; - if (values.alpha !== 1) { - return values.hwb.concat([values.alpha]); - } - return values.hwb; - }, - cmykArray: function () { - return this.values.cmyk; - }, - rgbaArray: function () { - var values = this.values; - return values.rgb.concat([values.alpha]); - }, - hslaArray: function () { - var values = this.values; - return values.hsl.concat([values.alpha]); - }, - alpha: function (val) { - if (val === undefined) { - return this.values.alpha; - } - this.setValues('alpha', val); - return this; - }, - - red: function (val) { - return this.setChannel('rgb', 0, val); - }, - green: function (val) { - return this.setChannel('rgb', 1, val); - }, - blue: function (val) { - return this.setChannel('rgb', 2, val); - }, - hue: function (val) { - if (val) { - val %= 360; - val = val < 0 ? 360 + val : val; - } - return this.setChannel('hsl', 0, val); - }, - saturation: function (val) { - return this.setChannel('hsl', 1, val); - }, - lightness: function (val) { - return this.setChannel('hsl', 2, val); - }, - saturationv: function (val) { - return this.setChannel('hsv', 1, val); - }, - whiteness: function (val) { - return this.setChannel('hwb', 1, val); - }, - blackness: function (val) { - return this.setChannel('hwb', 2, val); - }, - value: function (val) { - return this.setChannel('hsv', 2, val); - }, - cyan: function (val) { - return this.setChannel('cmyk', 0, val); - }, - magenta: function (val) { - return this.setChannel('cmyk', 1, val); - }, - yellow: function (val) { - return this.setChannel('cmyk', 2, val); - }, - black: function (val) { - return this.setChannel('cmyk', 3, val); - }, - - hexString: function () { - return colorString.hexString(this.values.rgb); - }, - rgbString: function () { - return colorString.rgbString(this.values.rgb, this.values.alpha); - }, - rgbaString: function () { - return colorString.rgbaString(this.values.rgb, this.values.alpha); - }, - percentString: function () { - return colorString.percentString(this.values.rgb, this.values.alpha); - }, - hslString: function () { - return colorString.hslString(this.values.hsl, this.values.alpha); - }, - hslaString: function () { - return colorString.hslaString(this.values.hsl, this.values.alpha); - }, - hwbString: function () { - return colorString.hwbString(this.values.hwb, this.values.alpha); - }, - keyword: function () { - return colorString.keyword(this.values.rgb, this.values.alpha); - }, - - rgbNumber: function () { - var rgb = this.values.rgb; - return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; - }, - - luminosity: function () { - // http://www.w3.org/TR/WCAG20/#relativeluminancedef - var rgb = this.values.rgb; - var lum = []; - for (var i = 0; i < rgb.length; i++) { - var chan = rgb[i] / 255; - lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); - } - return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; - }, - - contrast: function (color2) { - // http://www.w3.org/TR/WCAG20/#contrast-ratiodef - var lum1 = this.luminosity(); - var lum2 = color2.luminosity(); - if (lum1 > lum2) { - return (lum1 + 0.05) / (lum2 + 0.05); - } - return (lum2 + 0.05) / (lum1 + 0.05); - }, - - level: function (color2) { - var contrastRatio = this.contrast(color2); - if (contrastRatio >= 7.1) { - return 'AAA'; - } - - return (contrastRatio >= 4.5) ? 'AA' : ''; - }, - - dark: function () { - // YIQ equation from http://24ways.org/2010/calculating-color-contrast - var rgb = this.values.rgb; - var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; - return yiq < 128; - }, - - light: function () { - return !this.dark(); - }, - - negate: function () { - var rgb = []; - for (var i = 0; i < 3; i++) { - rgb[i] = 255 - this.values.rgb[i]; - } - this.setValues('rgb', rgb); - return this; - }, - - lighten: function (ratio) { - var hsl = this.values.hsl; - hsl[2] += hsl[2] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - darken: function (ratio) { - var hsl = this.values.hsl; - hsl[2] -= hsl[2] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - saturate: function (ratio) { - var hsl = this.values.hsl; - hsl[1] += hsl[1] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - desaturate: function (ratio) { - var hsl = this.values.hsl; - hsl[1] -= hsl[1] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - whiten: function (ratio) { - var hwb = this.values.hwb; - hwb[1] += hwb[1] * ratio; - this.setValues('hwb', hwb); - return this; - }, - - blacken: function (ratio) { - var hwb = this.values.hwb; - hwb[2] += hwb[2] * ratio; - this.setValues('hwb', hwb); - return this; - }, - - greyscale: function () { - var rgb = this.values.rgb; - // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale - var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; - this.setValues('rgb', [val, val, val]); - return this; - }, - - clearer: function (ratio) { - var alpha = this.values.alpha; - this.setValues('alpha', alpha - (alpha * ratio)); - return this; - }, - - opaquer: function (ratio) { - var alpha = this.values.alpha; - this.setValues('alpha', alpha + (alpha * ratio)); - return this; - }, - - rotate: function (degrees) { - var hsl = this.values.hsl; - var hue = (hsl[0] + degrees) % 360; - hsl[0] = hue < 0 ? 360 + hue : hue; - this.setValues('hsl', hsl); - return this; - }, - - /** - * Ported from sass implementation in C - * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 - */ - mix: function (mixinColor, weight) { - var color1 = this; - var color2 = mixinColor; - var p = weight === undefined ? 0.5 : weight; - - var w = 2 * p - 1; - var a = color1.alpha() - color2.alpha(); - - var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; - var w2 = 1 - w1; - - return this - .rgb( - w1 * color1.red() + w2 * color2.red(), - w1 * color1.green() + w2 * color2.green(), - w1 * color1.blue() + w2 * color2.blue() - ) - .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); - }, - - toJSON: function () { - return this.rgb(); - }, - - clone: function () { - // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, - // making the final build way to big to embed in Chart.js. So let's do it manually, - // assuming that values to clone are 1 dimension arrays containing only numbers, - // except 'alpha' which is a number. - var result = new Color(); - var source = this.values; - var target = result.values; - var value, type; - - for (var prop in source) { - if (source.hasOwnProperty(prop)) { - value = source[prop]; - type = ({}).toString.call(value); - if (type === '[object Array]') { - target[prop] = value.slice(0); - } else if (type === '[object Number]') { - target[prop] = value; - } else { - console.error('unexpected color value:', value); - } - } - } - - return result; - } -}; - -Color.prototype.spaces = { - rgb: ['red', 'green', 'blue'], - hsl: ['hue', 'saturation', 'lightness'], - hsv: ['hue', 'saturation', 'value'], - hwb: ['hue', 'whiteness', 'blackness'], - cmyk: ['cyan', 'magenta', 'yellow', 'black'] -}; - -Color.prototype.maxes = { - rgb: [255, 255, 255], - hsl: [360, 100, 100], - hsv: [360, 100, 100], - hwb: [360, 100, 100], - cmyk: [100, 100, 100, 100] -}; - -Color.prototype.getValues = function (space) { - var values = this.values; - var vals = {}; - - for (var i = 0; i < space.length; i++) { - vals[space.charAt(i)] = values[space][i]; - } - - if (values.alpha !== 1) { - vals.a = values.alpha; - } - - // {r: 255, g: 255, b: 255, a: 0.4} - return vals; -}; - -Color.prototype.setValues = function (space, vals) { - var values = this.values; - var spaces = this.spaces; - var maxes = this.maxes; - var alpha = 1; - var i; - - this.valid = true; - - if (space === 'alpha') { - alpha = vals; - } else if (vals.length) { - // [10, 10, 10] - values[space] = vals.slice(0, space.length); - alpha = vals[space.length]; - } else if (vals[space.charAt(0)] !== undefined) { - // {r: 10, g: 10, b: 10} - for (i = 0; i < space.length; i++) { - values[space][i] = vals[space.charAt(i)]; - } - - alpha = vals.a; - } else if (vals[spaces[space][0]] !== undefined) { - // {red: 10, green: 10, blue: 10} - var chans = spaces[space]; - - for (i = 0; i < space.length; i++) { - values[space][i] = vals[chans[i]]; - } - - alpha = vals.alpha; - } - - values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); - - if (space === 'alpha') { - return false; - } - - var capped; - - // cap values of the space prior converting all values - for (i = 0; i < space.length; i++) { - capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); - values[space][i] = Math.round(capped); - } - - // convert to all the other color spaces - for (var sname in spaces) { - if (sname !== space) { - values[sname] = colorConvert[space][sname](values[space]); - } - } - - return true; -}; - -Color.prototype.setSpace = function (space, args) { - var vals = args[0]; - - if (vals === undefined) { - // color.rgb() - return this.getValues(space); - } - - // color.rgb(10, 10, 10) - if (typeof vals === 'number') { - vals = Array.prototype.slice.call(args); - } - - this.setValues(space, vals); - return this; -}; - -Color.prototype.setChannel = function (space, index, val) { - var svalues = this.values[space]; - if (val === undefined) { - // color.red() - return svalues[index]; - } else if (val === svalues[index]) { - // color.red(color.red()) - return this; - } - - // color.red(100) - svalues[index] = val; - this.setValues(space, svalues); - - return this; -}; - -if (typeof window !== 'undefined') { - window.Color = Color; -} - -var chartjsColor = Color; - -/** - * @namespace Chart.helpers - */ -var helpers = { - /** - * An empty function that can be used, for example, for optional callback. - */ - noop: function() {}, - - /** - * Returns a unique id, sequentially generated from a global variable. - * @returns {number} - * @function - */ - uid: (function() { - var id = 0; - return function() { - return id++; - }; - }()), - - /** - * Returns true if `value` is neither null nor undefined, else returns false. - * @param {*} value - The value to test. - * @returns {boolean} - * @since 2.7.0 - */ - isNullOrUndef: function(value) { - return value === null || typeof value === 'undefined'; - }, - - /** - * Returns true if `value` is an array (including typed arrays), else returns false. - * @param {*} value - The value to test. - * @returns {boolean} - * @function - */ - isArray: function(value) { - if (Array.isArray && Array.isArray(value)) { - return true; - } - var type = Object.prototype.toString.call(value); - if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { - return true; - } - return false; - }, - - /** - * Returns true if `value` is an object (excluding null), else returns false. - * @param {*} value - The value to test. - * @returns {boolean} - * @since 2.7.0 - */ - isObject: function(value) { - return value !== null && Object.prototype.toString.call(value) === '[object Object]'; - }, - - /** - * Returns true if `value` is a finite number, else returns false - * @param {*} value - The value to test. - * @returns {boolean} - */ - isFinite: function(value) { - return (typeof value === 'number' || value instanceof Number) && isFinite(value); - }, - - /** - * Returns `value` if defined, else returns `defaultValue`. - * @param {*} value - The value to return if defined. - * @param {*} defaultValue - The value to return if `value` is undefined. - * @returns {*} - */ - valueOrDefault: function(value, defaultValue) { - return typeof value === 'undefined' ? defaultValue : value; - }, - - /** - * Returns value at the given `index` in array if defined, else returns `defaultValue`. - * @param {Array} value - The array to lookup for value at `index`. - * @param {number} index - The index in `value` to lookup for value. - * @param {*} defaultValue - The value to return if `value[index]` is undefined. - * @returns {*} - */ - valueAtIndexOrDefault: function(value, index, defaultValue) { - return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); - }, - - /** - * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the - * value returned by `fn`. If `fn` is not a function, this method returns undefined. - * @param {function} fn - The function to call. - * @param {Array|undefined|null} args - The arguments with which `fn` should be called. - * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. - * @returns {*} - */ - callback: function(fn, args, thisArg) { - if (fn && typeof fn.call === 'function') { - return fn.apply(thisArg, args); - } - }, - - /** - * Note(SB) for performance sake, this method should only be used when loopable type - * is unknown or in none intensive code (not called often and small loopable). Else - * it's preferable to use a regular for() loop and save extra function calls. - * @param {object|Array} loopable - The object or array to be iterated. - * @param {function} fn - The function to call for each item. - * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. - * @param {boolean} [reverse] - If true, iterates backward on the loopable. - */ - each: function(loopable, fn, thisArg, reverse) { - var i, len, keys; - if (helpers.isArray(loopable)) { - len = loopable.length; - if (reverse) { - for (i = len - 1; i >= 0; i--) { - fn.call(thisArg, loopable[i], i); - } - } else { - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[i], i); - } - } - } else if (helpers.isObject(loopable)) { - keys = Object.keys(loopable); - len = keys.length; - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[keys[i]], keys[i]); - } - } - }, - - /** - * Returns true if the `a0` and `a1` arrays have the same content, else returns false. - * @see https://stackoverflow.com/a/14853974 - * @param {Array} a0 - The array to compare - * @param {Array} a1 - The array to compare - * @returns {boolean} - */ - arrayEquals: function(a0, a1) { - var i, ilen, v0, v1; - - if (!a0 || !a1 || a0.length !== a1.length) { - return false; - } - - for (i = 0, ilen = a0.length; i < ilen; ++i) { - v0 = a0[i]; - v1 = a1[i]; - - if (v0 instanceof Array && v1 instanceof Array) { - if (!helpers.arrayEquals(v0, v1)) { - return false; - } - } else if (v0 !== v1) { - // NOTE: two different object instances will never be equal: {x:20} != {x:20} - return false; - } - } - - return true; - }, - - /** - * Returns a deep copy of `source` without keeping references on objects and arrays. - * @param {*} source - The value to clone. - * @returns {*} - */ - clone: function(source) { - if (helpers.isArray(source)) { - return source.map(helpers.clone); - } - - if (helpers.isObject(source)) { - var target = {}; - var keys = Object.keys(source); - var klen = keys.length; - var k = 0; - - for (; k < klen; ++k) { - target[keys[k]] = helpers.clone(source[keys[k]]); - } - - return target; - } - - return source; - }, - - /** - * The default merger when Chart.helpers.merge is called without merger option. - * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. - * @private - */ - _merger: function(key, target, source, options) { - var tval = target[key]; - var sval = source[key]; - - if (helpers.isObject(tval) && helpers.isObject(sval)) { - helpers.merge(tval, sval, options); - } else { - target[key] = helpers.clone(sval); - } - }, - - /** - * Merges source[key] in target[key] only if target[key] is undefined. - * @private - */ - _mergerIf: function(key, target, source) { - var tval = target[key]; - var sval = source[key]; - - if (helpers.isObject(tval) && helpers.isObject(sval)) { - helpers.mergeIf(tval, sval); - } else if (!target.hasOwnProperty(key)) { - target[key] = helpers.clone(sval); - } - }, - - /** - * Recursively deep copies `source` properties into `target` with the given `options`. - * IMPORTANT: `target` is not cloned and will be updated with `source` properties. - * @param {object} target - The target object in which all sources are merged into. - * @param {object|object[]} source - Object(s) to merge into `target`. - * @param {object} [options] - Merging options: - * @param {function} [options.merger] - The merge method (key, target, source, options) - * @returns {object} The `target` object. - */ - merge: function(target, source, options) { - var sources = helpers.isArray(source) ? source : [source]; - var ilen = sources.length; - var merge, i, keys, klen, k; - - if (!helpers.isObject(target)) { - return target; - } - - options = options || {}; - merge = options.merger || helpers._merger; - - for (i = 0; i < ilen; ++i) { - source = sources[i]; - if (!helpers.isObject(source)) { - continue; - } - - keys = Object.keys(source); - for (k = 0, klen = keys.length; k < klen; ++k) { - merge(keys[k], target, source, options); - } - } - - return target; - }, - - /** - * Recursively deep copies `source` properties into `target` *only* if not defined in target. - * IMPORTANT: `target` is not cloned and will be updated with `source` properties. - * @param {object} target - The target object in which all sources are merged into. - * @param {object|object[]} source - Object(s) to merge into `target`. - * @returns {object} The `target` object. - */ - mergeIf: function(target, source) { - return helpers.merge(target, source, {merger: helpers._mergerIf}); - }, - - /** - * Applies the contents of two or more objects together into the first object. - * @param {object} target - The target object in which all objects are merged into. - * @param {object} arg1 - Object containing additional properties to merge in target. - * @param {object} argN - Additional objects containing properties to merge in target. - * @returns {object} The `target` object. - */ - extend: function(target) { - var setFn = function(value, key) { - target[key] = value; - }; - for (var i = 1, ilen = arguments.length; i < ilen; ++i) { - helpers.each(arguments[i], setFn); - } - return target; - }, - - /** - * Basic javascript inheritance based on the model created in Backbone.js - */ - inherits: function(extensions) { - var me = this; - var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { - return me.apply(this, arguments); - }; - - var Surrogate = function() { - this.constructor = ChartElement; - }; - - Surrogate.prototype = me.prototype; - ChartElement.prototype = new Surrogate(); - ChartElement.extend = helpers.inherits; - - if (extensions) { - helpers.extend(ChartElement.prototype, extensions); - } - - ChartElement.__super__ = me.prototype; - return ChartElement; - } -}; - -var helpers_core = helpers; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.helpers.callback instead. - * @function Chart.helpers.callCallback - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ -helpers.callCallback = helpers.callback; - -/** - * Provided for backward compatibility, use Array.prototype.indexOf instead. - * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ - * @function Chart.helpers.indexOf - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers.indexOf = function(array, item, fromIndex) { - return Array.prototype.indexOf.call(array, item, fromIndex); -}; - -/** - * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. - * @function Chart.helpers.getValueOrDefault - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers.getValueOrDefault = helpers.valueOrDefault; - -/** - * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. - * @function Chart.helpers.getValueAtIndexOrDefault - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; - -/** - * Easing functions adapted from Robert Penner's easing equations. - * @namespace Chart.helpers.easingEffects - * @see http://www.robertpenner.com/easing/ - */ -var effects = { - linear: function(t) { - return t; - }, - - easeInQuad: function(t) { - return t * t; - }, - - easeOutQuad: function(t) { - return -t * (t - 2); - }, - - easeInOutQuad: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t; - } - return -0.5 * ((--t) * (t - 2) - 1); - }, - - easeInCubic: function(t) { - return t * t * t; - }, - - easeOutCubic: function(t) { - return (t = t - 1) * t * t + 1; - }, - - easeInOutCubic: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t; - } - return 0.5 * ((t -= 2) * t * t + 2); - }, - - easeInQuart: function(t) { - return t * t * t * t; - }, - - easeOutQuart: function(t) { - return -((t = t - 1) * t * t * t - 1); - }, - - easeInOutQuart: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t * t; - } - return -0.5 * ((t -= 2) * t * t * t - 2); - }, - - easeInQuint: function(t) { - return t * t * t * t * t; - }, - - easeOutQuint: function(t) { - return (t = t - 1) * t * t * t * t + 1; - }, - - easeInOutQuint: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t * t * t; - } - return 0.5 * ((t -= 2) * t * t * t * t + 2); - }, - - easeInSine: function(t) { - return -Math.cos(t * (Math.PI / 2)) + 1; - }, - - easeOutSine: function(t) { - return Math.sin(t * (Math.PI / 2)); - }, - - easeInOutSine: function(t) { - return -0.5 * (Math.cos(Math.PI * t) - 1); - }, - - easeInExpo: function(t) { - return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); - }, - - easeOutExpo: function(t) { - return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; - }, - - easeInOutExpo: function(t) { - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if ((t /= 0.5) < 1) { - return 0.5 * Math.pow(2, 10 * (t - 1)); - } - return 0.5 * (-Math.pow(2, -10 * --t) + 2); - }, - - easeInCirc: function(t) { - if (t >= 1) { - return t; - } - return -(Math.sqrt(1 - t * t) - 1); - }, - - easeOutCirc: function(t) { - return Math.sqrt(1 - (t = t - 1) * t); - }, - - easeInOutCirc: function(t) { - if ((t /= 0.5) < 1) { - return -0.5 * (Math.sqrt(1 - t * t) - 1); - } - return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); - }, - - easeInElastic: function(t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if (!p) { - p = 0.3; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); - }, - - easeOutElastic: function(t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if (!p) { - p = 0.3; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; - }, - - easeInOutElastic: function(t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if ((t /= 0.5) === 2) { - return 1; - } - if (!p) { - p = 0.45; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - if (t < 1) { - return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); - } - return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; - }, - easeInBack: function(t) { - var s = 1.70158; - return t * t * ((s + 1) * t - s); - }, - - easeOutBack: function(t) { - var s = 1.70158; - return (t = t - 1) * t * ((s + 1) * t + s) + 1; - }, - - easeInOutBack: function(t) { - var s = 1.70158; - if ((t /= 0.5) < 1) { - return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); - } - return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); - }, - - easeInBounce: function(t) { - return 1 - effects.easeOutBounce(1 - t); - }, - - easeOutBounce: function(t) { - if (t < (1 / 2.75)) { - return 7.5625 * t * t; - } - if (t < (2 / 2.75)) { - return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; - } - if (t < (2.5 / 2.75)) { - return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; - } - return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; - }, - - easeInOutBounce: function(t) { - if (t < 0.5) { - return effects.easeInBounce(t * 2) * 0.5; - } - return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; - } -}; - -var helpers_easing = { - effects: effects -}; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.helpers.easing.effects instead. - * @function Chart.helpers.easingEffects - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers_core.easingEffects = effects; - -var PI = Math.PI; -var RAD_PER_DEG = PI / 180; -var DOUBLE_PI = PI * 2; -var HALF_PI = PI / 2; -var QUARTER_PI = PI / 4; -var TWO_THIRDS_PI = PI * 2 / 3; - -/** - * @namespace Chart.helpers.canvas - */ -var exports$1 = { - /** - * Clears the entire canvas associated to the given `chart`. - * @param {Chart} chart - The chart for which to clear the canvas. - */ - clear: function(chart) { - chart.ctx.clearRect(0, 0, chart.width, chart.height); - }, - - /** - * Creates a "path" for a rectangle with rounded corners at position (x, y) with a - * given size (width, height) and the same `radius` for all corners. - * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. - * @param {number} x - The x axis of the coordinate for the rectangle starting point. - * @param {number} y - The y axis of the coordinate for the rectangle starting point. - * @param {number} width - The rectangle's width. - * @param {number} height - The rectangle's height. - * @param {number} radius - The rounded amount (in pixels) for the four corners. - * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? - */ - roundedRect: function(ctx, x, y, width, height, radius) { - if (radius) { - var r = Math.min(radius, height / 2, width / 2); - var left = x + r; - var top = y + r; - var right = x + width - r; - var bottom = y + height - r; - - ctx.moveTo(x, top); - if (left < right && top < bottom) { - ctx.arc(left, top, r, -PI, -HALF_PI); - ctx.arc(right, top, r, -HALF_PI, 0); - ctx.arc(right, bottom, r, 0, HALF_PI); - ctx.arc(left, bottom, r, HALF_PI, PI); - } else if (left < right) { - ctx.moveTo(left, y); - ctx.arc(right, top, r, -HALF_PI, HALF_PI); - ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); - } else if (top < bottom) { - ctx.arc(left, top, r, -PI, 0); - ctx.arc(left, bottom, r, 0, PI); - } else { - ctx.arc(left, top, r, -PI, PI); - } - ctx.closePath(); - ctx.moveTo(x, y); - } else { - ctx.rect(x, y, width, height); - } - }, - - drawPoint: function(ctx, style, radius, x, y, rotation) { - var type, xOffset, yOffset, size, cornerRadius; - var rad = (rotation || 0) * RAD_PER_DEG; - - if (style && typeof style === 'object') { - type = style.toString(); - if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { - ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); - return; - } - } - - if (isNaN(radius) || radius <= 0) { - return; - } - - ctx.beginPath(); - - switch (style) { - // Default includes circle - default: - ctx.arc(x, y, radius, 0, DOUBLE_PI); - ctx.closePath(); - break; - case 'triangle': - ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); - rad += TWO_THIRDS_PI; - ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); - rad += TWO_THIRDS_PI; - ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); - ctx.closePath(); - break; - case 'rectRounded': - // NOTE: the rounded rect implementation changed to use `arc` instead of - // `quadraticCurveTo` since it generates better results when rect is - // almost a circle. 0.516 (instead of 0.5) produces results with visually - // closer proportion to the previous impl and it is inscribed in the - // circle with `radius`. For more details, see the following PRs: - // https://github.com/chartjs/Chart.js/issues/5597 - // https://github.com/chartjs/Chart.js/issues/5858 - cornerRadius = radius * 0.516; - size = radius - cornerRadius; - xOffset = Math.cos(rad + QUARTER_PI) * size; - yOffset = Math.sin(rad + QUARTER_PI) * size; - ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); - ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); - ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); - ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); - ctx.closePath(); - break; - case 'rect': - if (!rotation) { - size = Math.SQRT1_2 * radius; - ctx.rect(x - size, y - size, 2 * size, 2 * size); - break; - } - rad += QUARTER_PI; - /* falls through */ - case 'rectRot': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + yOffset, y - xOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.lineTo(x - yOffset, y + xOffset); - ctx.closePath(); - break; - case 'crossRot': - rad += QUARTER_PI; - /* falls through */ - case 'cross': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); - break; - case 'star': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); - rad += QUARTER_PI; - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); - break; - case 'line': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - break; - case 'dash': - ctx.moveTo(x, y); - ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); - break; - } - - ctx.fill(); - ctx.stroke(); - }, - - /** - * Returns true if the point is inside the rectangle - * @param {object} point - The point to test - * @param {object} area - The rectangle - * @returns {boolean} - * @private - */ - _isPointInArea: function(point, area) { - var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error. - - return point.x > area.left - epsilon && point.x < area.right + epsilon && - point.y > area.top - epsilon && point.y < area.bottom + epsilon; - }, - - clipArea: function(ctx, area) { - ctx.save(); - ctx.beginPath(); - ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); - ctx.clip(); - }, - - unclipArea: function(ctx) { - ctx.restore(); - }, - - lineTo: function(ctx, previous, target, flip) { - var stepped = target.steppedLine; - if (stepped) { - if (stepped === 'middle') { - var midpoint = (previous.x + target.x) / 2.0; - ctx.lineTo(midpoint, flip ? target.y : previous.y); - ctx.lineTo(midpoint, flip ? previous.y : target.y); - } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) { - ctx.lineTo(previous.x, target.y); - } else { - ctx.lineTo(target.x, previous.y); - } - ctx.lineTo(target.x, target.y); - return; - } - - if (!target.tension) { - ctx.lineTo(target.x, target.y); - return; - } - - ctx.bezierCurveTo( - flip ? previous.controlPointPreviousX : previous.controlPointNextX, - flip ? previous.controlPointPreviousY : previous.controlPointNextY, - flip ? target.controlPointNextX : target.controlPointPreviousX, - flip ? target.controlPointNextY : target.controlPointPreviousY, - target.x, - target.y); - } -}; - -var helpers_canvas = exports$1; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. - * @namespace Chart.helpers.clear - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers_core.clear = exports$1.clear; - -/** - * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. - * @namespace Chart.helpers.drawRoundedRectangle - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers_core.drawRoundedRectangle = function(ctx) { - ctx.beginPath(); - exports$1.roundedRect.apply(exports$1, arguments); -}; - -var defaults = { - /** - * @private - */ - _set: function(scope, values) { - return helpers_core.merge(this[scope] || (this[scope] = {}), values); - } -}; - -defaults._set('global', { - defaultColor: 'rgba(0,0,0,0.1)', - defaultFontColor: '#666', - defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", - defaultFontSize: 12, - defaultFontStyle: 'normal', - defaultLineHeight: 1.2, - showLines: true -}); - -var core_defaults = defaults; - -var valueOrDefault = helpers_core.valueOrDefault; - -/** - * Converts the given font object into a CSS font string. - * @param {object} font - A font object. - * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font - * @private - */ -function toFontString(font) { - if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) { - return null; - } - - return (font.style ? font.style + ' ' : '') - + (font.weight ? font.weight + ' ' : '') - + font.size + 'px ' - + font.family; -} - -/** - * @alias Chart.helpers.options - * @namespace - */ -var helpers_options = { - /** - * Converts the given line height `value` in pixels for a specific font `size`. - * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). - * @param {number} size - The font size (in pixels) used to resolve relative `value`. - * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid). - * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height - * @since 2.7.0 - */ - toLineHeight: function(value, size) { - var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); - if (!matches || matches[1] === 'normal') { - return size * 1.2; - } - - value = +matches[2]; - - switch (matches[3]) { - case 'px': - return value; - case '%': - value /= 100; - break; - default: - break; - } - - return size * value; - }, - - /** - * Converts the given value into a padding object with pre-computed width/height. - * @param {number|object} value - If a number, set the value to all TRBL component, - * else, if and object, use defined properties and sets undefined ones to 0. - * @returns {object} The padding values (top, right, bottom, left, width, height) - * @since 2.7.0 - */ - toPadding: function(value) { - var t, r, b, l; - - if (helpers_core.isObject(value)) { - t = +value.top || 0; - r = +value.right || 0; - b = +value.bottom || 0; - l = +value.left || 0; - } else { - t = r = b = l = +value || 0; - } - - return { - top: t, - right: r, - bottom: b, - left: l, - height: t + b, - width: l + r - }; - }, - - /** - * Parses font options and returns the font object. - * @param {object} options - A object that contains font options to be parsed. - * @return {object} The font object. - * @todo Support font.* options and renamed to toFont(). - * @private - */ - _parseFont: function(options) { - var globalDefaults = core_defaults.global; - var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); - var font = { - family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily), - lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size), - size: size, - style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle), - weight: null, - string: '' - }; - - font.string = toFontString(font); - return font; - }, - - /** - * Evaluates the given `inputs` sequentially and returns the first defined value. - * @param {Array} inputs - An array of values, falling back to the last value. - * @param {object} [context] - If defined and the current value is a function, the value - * is called with `context` as first argument and the result becomes the new input. - * @param {number} [index] - If defined and the current value is an array, the value - * at `index` become the new input. - * @since 2.7.0 - */ - resolve: function(inputs, context, index) { - var i, ilen, value; - - for (i = 0, ilen = inputs.length; i < ilen; ++i) { - value = inputs[i]; - if (value === undefined) { - continue; - } - if (context !== undefined && typeof value === 'function') { - value = value(context); - } - if (index !== undefined && helpers_core.isArray(value)) { - value = value[index]; - } - if (value !== undefined) { - return value; - } - } - } -}; - -var helpers$1 = helpers_core; -var easing = helpers_easing; -var canvas = helpers_canvas; -var options = helpers_options; -helpers$1.easing = easing; -helpers$1.canvas = canvas; -helpers$1.options = options; - -function interpolate(start, view, model, ease) { - var keys = Object.keys(model); - var i, ilen, key, actual, origin, target, type, c0, c1; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - - target = model[key]; - - // if a value is added to the model after pivot() has been called, the view - // doesn't contain it, so let's initialize the view to the target value. - if (!view.hasOwnProperty(key)) { - view[key] = target; - } - - actual = view[key]; - - if (actual === target || key[0] === '_') { - continue; - } - - if (!start.hasOwnProperty(key)) { - start[key] = actual; - } - - origin = start[key]; - - type = typeof target; - - if (type === typeof origin) { - if (type === 'string') { - c0 = chartjsColor(origin); - if (c0.valid) { - c1 = chartjsColor(target); - if (c1.valid) { - view[key] = c1.mix(c0, ease).rgbString(); - continue; - } - } - } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) { - view[key] = origin + (target - origin) * ease; - continue; - } - } - - view[key] = target; - } -} - -var Element = function(configuration) { - helpers$1.extend(this, configuration); - this.initialize.apply(this, arguments); -}; - -helpers$1.extend(Element.prototype, { - - initialize: function() { - this.hidden = false; - }, - - pivot: function() { - var me = this; - if (!me._view) { - me._view = helpers$1.clone(me._model); - } - me._start = {}; - return me; - }, - - transition: function(ease) { - var me = this; - var model = me._model; - var start = me._start; - var view = me._view; - - // No animation -> No Transition - if (!model || ease === 1) { - me._view = model; - me._start = null; - return me; - } - - if (!view) { - view = me._view = {}; - } - - if (!start) { - start = me._start = {}; - } - - interpolate(start, view, model, ease); - - return me; - }, - - tooltipPosition: function() { - return { - x: this._model.x, - y: this._model.y - }; - }, - - hasValue: function() { - return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y); - } -}); - -Element.extend = helpers$1.inherits; - -var core_element = Element; - -var exports$2 = core_element.extend({ - chart: null, // the animation associated chart instance - currentStep: 0, // the current animation step - numSteps: 60, // default number of steps - easing: '', // the easing to use for this animation - render: null, // render function used by the animation service - - onAnimationProgress: null, // user specified callback to fire on each step of the animation - onAnimationComplete: null, // user specified callback to fire when the animation finishes -}); - -var core_animation = exports$2; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.Animation instead - * @prop Chart.Animation#animationObject - * @deprecated since version 2.6.0 - * @todo remove at version 3 - */ -Object.defineProperty(exports$2.prototype, 'animationObject', { - get: function() { - return this; - } -}); - -/** - * Provided for backward compatibility, use Chart.Animation#chart instead - * @prop Chart.Animation#chartInstance - * @deprecated since version 2.6.0 - * @todo remove at version 3 - */ -Object.defineProperty(exports$2.prototype, 'chartInstance', { - get: function() { - return this.chart; - }, - set: function(value) { - this.chart = value; - } -}); - -core_defaults._set('global', { - animation: { - duration: 1000, - easing: 'easeOutQuart', - onProgress: helpers$1.noop, - onComplete: helpers$1.noop - } -}); - -var core_animations = { - animations: [], - request: null, - - /** - * @param {Chart} chart - The chart to animate. - * @param {Chart.Animation} animation - The animation that we will animate. - * @param {number} duration - The animation duration in ms. - * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions - */ - addAnimation: function(chart, animation, duration, lazy) { - var animations = this.animations; - var i, ilen; - - animation.chart = chart; - animation.startTime = Date.now(); - animation.duration = duration; - - if (!lazy) { - chart.animating = true; - } - - for (i = 0, ilen = animations.length; i < ilen; ++i) { - if (animations[i].chart === chart) { - animations[i] = animation; - return; - } - } - - animations.push(animation); - - // If there are no animations queued, manually kickstart a digest, for lack of a better word - if (animations.length === 1) { - this.requestAnimationFrame(); - } - }, - - cancelAnimation: function(chart) { - var index = helpers$1.findIndex(this.animations, function(animation) { - return animation.chart === chart; - }); - - if (index !== -1) { - this.animations.splice(index, 1); - chart.animating = false; - } - }, - - requestAnimationFrame: function() { - var me = this; - if (me.request === null) { - // Skip animation frame requests until the active one is executed. - // This can happen when processing mouse events, e.g. 'mousemove' - // and 'mouseout' events will trigger multiple renders. - me.request = helpers$1.requestAnimFrame.call(window, function() { - me.request = null; - me.startDigest(); - }); - } - }, - - /** - * @private - */ - startDigest: function() { - var me = this; - - me.advance(); - - // Do we have more stuff to animate? - if (me.animations.length > 0) { - me.requestAnimationFrame(); - } - }, - - /** - * @private - */ - advance: function() { - var animations = this.animations; - var animation, chart, numSteps, nextStep; - var i = 0; - - // 1 animation per chart, so we are looping charts here - while (i < animations.length) { - animation = animations[i]; - chart = animation.chart; - numSteps = animation.numSteps; - - // Make sure that currentStep starts at 1 - // https://github.com/chartjs/Chart.js/issues/6104 - nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1; - animation.currentStep = Math.min(nextStep, numSteps); - - helpers$1.callback(animation.render, [chart, animation], chart); - helpers$1.callback(animation.onAnimationProgress, [animation], chart); - - if (animation.currentStep >= numSteps) { - helpers$1.callback(animation.onAnimationComplete, [animation], chart); - chart.animating = false; - animations.splice(i, 1); - } else { - ++i; - } - } - } -}; - -var resolve = helpers$1.options.resolve; - -var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; - -/** - * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', - * 'unshift') and notify the listener AFTER the array has been altered. Listeners are - * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. - */ -function listenArrayEvents(array, listener) { - if (array._chartjs) { - array._chartjs.listeners.push(listener); - return; - } - - Object.defineProperty(array, '_chartjs', { - configurable: true, - enumerable: false, - value: { - listeners: [listener] - } - }); - - arrayEvents.forEach(function(key) { - var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); - var base = array[key]; - - Object.defineProperty(array, key, { - configurable: true, - enumerable: false, - value: function() { - var args = Array.prototype.slice.call(arguments); - var res = base.apply(this, args); - - helpers$1.each(array._chartjs.listeners, function(object) { - if (typeof object[method] === 'function') { - object[method].apply(object, args); - } - }); - - return res; - } - }); - }); -} - -/** - * Removes the given array event listener and cleanup extra attached properties (such as - * the _chartjs stub and overridden methods) if array doesn't have any more listeners. - */ -function unlistenArrayEvents(array, listener) { - var stub = array._chartjs; - if (!stub) { - return; - } - - var listeners = stub.listeners; - var index = listeners.indexOf(listener); - if (index !== -1) { - listeners.splice(index, 1); - } - - if (listeners.length > 0) { - return; - } - - arrayEvents.forEach(function(key) { - delete array[key]; - }); - - delete array._chartjs; -} - -// Base class for all dataset controllers (line, bar, etc) -var DatasetController = function(chart, datasetIndex) { - this.initialize(chart, datasetIndex); -}; - -helpers$1.extend(DatasetController.prototype, { - - /** - * Element type used to generate a meta dataset (e.g. Chart.element.Line). - * @type {Chart.core.element} - */ - datasetElementType: null, - - /** - * Element type used to generate a meta data (e.g. Chart.element.Point). - * @type {Chart.core.element} - */ - dataElementType: null, - - initialize: function(chart, datasetIndex) { - var me = this; - me.chart = chart; - me.index = datasetIndex; - me.linkScales(); - me.addElements(); - }, - - updateIndex: function(datasetIndex) { - this.index = datasetIndex; - }, - - linkScales: function() { - var me = this; - var meta = me.getMeta(); - var dataset = me.getDataset(); - - if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) { - meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; - } - if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) { - meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; - } - }, - - getDataset: function() { - return this.chart.data.datasets[this.index]; - }, - - getMeta: function() { - return this.chart.getDatasetMeta(this.index); - }, - - getScaleForId: function(scaleID) { - return this.chart.scales[scaleID]; - }, - - /** - * @private - */ - _getValueScaleId: function() { - return this.getMeta().yAxisID; - }, - - /** - * @private - */ - _getIndexScaleId: function() { - return this.getMeta().xAxisID; - }, - - /** - * @private - */ - _getValueScale: function() { - return this.getScaleForId(this._getValueScaleId()); - }, - - /** - * @private - */ - _getIndexScale: function() { - return this.getScaleForId(this._getIndexScaleId()); - }, - - reset: function() { - this.update(true); - }, - - /** - * @private - */ - destroy: function() { - if (this._data) { - unlistenArrayEvents(this._data, this); - } - }, - - createMetaDataset: function() { - var me = this; - var type = me.datasetElementType; - return type && new type({ - _chart: me.chart, - _datasetIndex: me.index - }); - }, - - createMetaData: function(index) { - var me = this; - var type = me.dataElementType; - return type && new type({ - _chart: me.chart, - _datasetIndex: me.index, - _index: index - }); - }, - - addElements: function() { - var me = this; - var meta = me.getMeta(); - var data = me.getDataset().data || []; - var metaData = meta.data; - var i, ilen; - - for (i = 0, ilen = data.length; i < ilen; ++i) { - metaData[i] = metaData[i] || me.createMetaData(i); - } - - meta.dataset = meta.dataset || me.createMetaDataset(); - }, - - addElementAndReset: function(index) { - var element = this.createMetaData(index); - this.getMeta().data.splice(index, 0, element); - this.updateElement(element, index, true); - }, - - buildOrUpdateElements: function() { - var me = this; - var dataset = me.getDataset(); - var data = dataset.data || (dataset.data = []); - - // In order to correctly handle data addition/deletion animation (an thus simulate - // real-time charts), we need to monitor these data modifications and synchronize - // the internal meta data accordingly. - if (me._data !== data) { - if (me._data) { - // This case happens when the user replaced the data array instance. - unlistenArrayEvents(me._data, me); - } - - if (data && Object.isExtensible(data)) { - listenArrayEvents(data, me); - } - me._data = data; - } - - // Re-sync meta data in case the user replaced the data array or if we missed - // any updates and so make sure that we handle number of datapoints changing. - me.resyncElements(); - }, - - update: helpers$1.noop, - - transition: function(easingValue) { - var meta = this.getMeta(); - var elements = meta.data || []; - var ilen = elements.length; - var i = 0; - - for (; i < ilen; ++i) { - elements[i].transition(easingValue); - } - - if (meta.dataset) { - meta.dataset.transition(easingValue); - } - }, - - draw: function() { - var meta = this.getMeta(); - var elements = meta.data || []; - var ilen = elements.length; - var i = 0; - - if (meta.dataset) { - meta.dataset.draw(); - } - - for (; i < ilen; ++i) { - elements[i].draw(); - } - }, - - removeHoverStyle: function(element) { - helpers$1.merge(element._model, element.$previousStyle || {}); - delete element.$previousStyle; - }, - - setHoverStyle: function(element) { - var dataset = this.chart.data.datasets[element._datasetIndex]; - var index = element._index; - var custom = element.custom || {}; - var model = element._model; - var getHoverColor = helpers$1.getHoverColor; - - element.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth - }; - - model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index); - model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index); - model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index); - }, - - /** - * @private - */ - resyncElements: function() { - var me = this; - var meta = me.getMeta(); - var data = me.getDataset().data; - var numMeta = meta.data.length; - var numData = data.length; - - if (numData < numMeta) { - meta.data.splice(numData, numMeta - numData); - } else if (numData > numMeta) { - me.insertElements(numMeta, numData - numMeta); - } - }, - - /** - * @private - */ - insertElements: function(start, count) { - for (var i = 0; i < count; ++i) { - this.addElementAndReset(start + i); - } - }, - - /** - * @private - */ - onDataPush: function() { - var count = arguments.length; - this.insertElements(this.getDataset().data.length - count, count); - }, - - /** - * @private - */ - onDataPop: function() { - this.getMeta().data.pop(); - }, - - /** - * @private - */ - onDataShift: function() { - this.getMeta().data.shift(); - }, - - /** - * @private - */ - onDataSplice: function(start, count) { - this.getMeta().data.splice(start, count); - this.insertElements(start, arguments.length - 2); - }, - - /** - * @private - */ - onDataUnshift: function() { - this.insertElements(0, arguments.length); - } -}); - -DatasetController.extend = helpers$1.inherits; - -var core_datasetController = DatasetController; - -core_defaults._set('global', { - elements: { - arc: { - backgroundColor: core_defaults.global.defaultColor, - borderColor: '#fff', - borderWidth: 2, - borderAlign: 'center' - } - } -}); - -var element_arc = core_element.extend({ - inLabelRange: function(mouseX) { - var vm = this._view; - - if (vm) { - return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); - } - return false; - }, - - inRange: function(chartX, chartY) { - var vm = this._view; - - if (vm) { - var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY}); - var angle = pointRelativePosition.angle; - var distance = pointRelativePosition.distance; - - // Sanitise angle range - var startAngle = vm.startAngle; - var endAngle = vm.endAngle; - while (endAngle < startAngle) { - endAngle += 2.0 * Math.PI; - } - while (angle > endAngle) { - angle -= 2.0 * Math.PI; - } - while (angle < startAngle) { - angle += 2.0 * Math.PI; - } - - // Check if within the range of the open/close angle - var betweenAngles = (angle >= startAngle && angle <= endAngle); - var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); - - return (betweenAngles && withinRadius); - } - return false; - }, - - getCenterPoint: function() { - var vm = this._view; - var halfAngle = (vm.startAngle + vm.endAngle) / 2; - var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; - return { - x: vm.x + Math.cos(halfAngle) * halfRadius, - y: vm.y + Math.sin(halfAngle) * halfRadius - }; - }, - - getArea: function() { - var vm = this._view; - return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); - }, - - tooltipPosition: function() { - var vm = this._view; - var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); - var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; - - return { - x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), - y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) - }; - }, - - draw: function() { - var ctx = this._chart.ctx; - var vm = this._view; - var sA = vm.startAngle; - var eA = vm.endAngle; - var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0; - var angleMargin; - - ctx.save(); - - ctx.beginPath(); - ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA); - ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); - ctx.closePath(); - - ctx.fillStyle = vm.backgroundColor; - ctx.fill(); - - if (vm.borderWidth) { - if (vm.borderAlign === 'inner') { - // Draw an inner border by cliping the arc and drawing a double-width border - // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders - ctx.beginPath(); - angleMargin = pixelMargin / vm.outerRadius; - ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin); - if (vm.innerRadius > pixelMargin) { - angleMargin = pixelMargin / vm.innerRadius; - ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true); - } else { - ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2); - } - ctx.closePath(); - ctx.clip(); - - ctx.beginPath(); - ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); - ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); - ctx.closePath(); - - ctx.lineWidth = vm.borderWidth * 2; - ctx.lineJoin = 'round'; - } else { - ctx.lineWidth = vm.borderWidth; - ctx.lineJoin = 'bevel'; - } - - ctx.strokeStyle = vm.borderColor; - ctx.stroke(); - } - - ctx.restore(); - } -}); - -var valueOrDefault$1 = helpers$1.valueOrDefault; - -var defaultColor = core_defaults.global.defaultColor; - -core_defaults._set('global', { - elements: { - line: { - tension: 0.4, - backgroundColor: defaultColor, - borderWidth: 3, - borderColor: defaultColor, - borderCapStyle: 'butt', - borderDash: [], - borderDashOffset: 0.0, - borderJoinStyle: 'miter', - capBezierPoints: true, - fill: true, // do we fill in the area between the line and its base axis - } - } -}); - -var element_line = core_element.extend({ - draw: function() { - var me = this; - var vm = me._view; - var ctx = me._chart.ctx; - var spanGaps = vm.spanGaps; - var points = me._children.slice(); // clone array - var globalDefaults = core_defaults.global; - var globalOptionLineElements = globalDefaults.elements.line; - var lastDrawnIndex = -1; - var index, current, previous, currentVM; - - // If we are looping, adding the first point again - if (me._loop && points.length) { - points.push(points[0]); - } - - ctx.save(); - - // Stroke Line Options - ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; - - // IE 9 and 10 do not support line dash - if (ctx.setLineDash) { - ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); - } - - ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset); - ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; - ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth); - ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; - - // Stroke Line - ctx.beginPath(); - lastDrawnIndex = -1; - - for (index = 0; index < points.length; ++index) { - current = points[index]; - previous = helpers$1.previousItem(points, index); - currentVM = current._view; - - // First point moves to it's starting position no matter what - if (index === 0) { - if (!currentVM.skip) { - ctx.moveTo(currentVM.x, currentVM.y); - lastDrawnIndex = index; - } - } else { - previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; - - if (!currentVM.skip) { - if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { - // There was a gap and this is the first point after the gap - ctx.moveTo(currentVM.x, currentVM.y); - } else { - // Line to next point - helpers$1.canvas.lineTo(ctx, previous._view, current._view); - } - lastDrawnIndex = index; - } - } - } - - ctx.stroke(); - ctx.restore(); - } -}); - -var valueOrDefault$2 = helpers$1.valueOrDefault; - -var defaultColor$1 = core_defaults.global.defaultColor; - -core_defaults._set('global', { - elements: { - point: { - radius: 3, - pointStyle: 'circle', - backgroundColor: defaultColor$1, - borderColor: defaultColor$1, - borderWidth: 1, - // Hover - hitRadius: 1, - hoverRadius: 4, - hoverBorderWidth: 1 - } - } -}); - -function xRange(mouseX) { - var vm = this._view; - return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false; -} - -function yRange(mouseY) { - var vm = this._view; - return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false; -} - -var element_point = core_element.extend({ - inRange: function(mouseX, mouseY) { - var vm = this._view; - return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; - }, - - inLabelRange: xRange, - inXRange: xRange, - inYRange: yRange, - - getCenterPoint: function() { - var vm = this._view; - return { - x: vm.x, - y: vm.y - }; - }, - - getArea: function() { - return Math.PI * Math.pow(this._view.radius, 2); - }, - - tooltipPosition: function() { - var vm = this._view; - return { - x: vm.x, - y: vm.y, - padding: vm.radius + vm.borderWidth - }; - }, - - draw: function(chartArea) { - var vm = this._view; - var ctx = this._chart.ctx; - var pointStyle = vm.pointStyle; - var rotation = vm.rotation; - var radius = vm.radius; - var x = vm.x; - var y = vm.y; - var globalDefaults = core_defaults.global; - var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow - - if (vm.skip) { - return; - } - - // Clipping for Points. - if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) { - ctx.strokeStyle = vm.borderColor || defaultColor; - ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth); - ctx.fillStyle = vm.backgroundColor || defaultColor; - helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation); - } - } -}); - -var defaultColor$2 = core_defaults.global.defaultColor; - -core_defaults._set('global', { - elements: { - rectangle: { - backgroundColor: defaultColor$2, - borderColor: defaultColor$2, - borderSkipped: 'bottom', - borderWidth: 0 - } - } -}); - -function isVertical(vm) { - return vm && vm.width !== undefined; -} - -/** - * Helper function to get the bounds of the bar regardless of the orientation - * @param bar {Chart.Element.Rectangle} the bar - * @return {Bounds} bounds of the bar - * @private - */ -function getBarBounds(vm) { - var x1, x2, y1, y2, half; - - if (isVertical(vm)) { - half = vm.width / 2; - x1 = vm.x - half; - x2 = vm.x + half; - y1 = Math.min(vm.y, vm.base); - y2 = Math.max(vm.y, vm.base); - } else { - half = vm.height / 2; - x1 = Math.min(vm.x, vm.base); - x2 = Math.max(vm.x, vm.base); - y1 = vm.y - half; - y2 = vm.y + half; - } - - return { - left: x1, - top: y1, - right: x2, - bottom: y2 - }; -} - -function swap(orig, v1, v2) { - return orig === v1 ? v2 : orig === v2 ? v1 : orig; -} - -function parseBorderSkipped(vm) { - var edge = vm.borderSkipped; - var res = {}; - - if (!edge) { - return res; - } - - if (vm.horizontal) { - if (vm.base > vm.x) { - edge = swap(edge, 'left', 'right'); - } - } else if (vm.base < vm.y) { - edge = swap(edge, 'bottom', 'top'); - } - - res[edge] = true; - return res; -} - -function parseBorderWidth(vm, maxW, maxH) { - var value = vm.borderWidth; - var skip = parseBorderSkipped(vm); - var t, r, b, l; - - if (helpers$1.isObject(value)) { - t = +value.top || 0; - r = +value.right || 0; - b = +value.bottom || 0; - l = +value.left || 0; - } else { - t = r = b = l = +value || 0; - } - - return { - t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t, - r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r, - b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b, - l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l - }; -} - -function boundingRects(vm) { - var bounds = getBarBounds(vm); - var width = bounds.right - bounds.left; - var height = bounds.bottom - bounds.top; - var border = parseBorderWidth(vm, width / 2, height / 2); - - return { - outer: { - x: bounds.left, - y: bounds.top, - w: width, - h: height - }, - inner: { - x: bounds.left + border.l, - y: bounds.top + border.t, - w: width - border.l - border.r, - h: height - border.t - border.b - } - }; -} - -function inRange(vm, x, y) { - var skipX = x === null; - var skipY = y === null; - var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm); - - return bounds - && (skipX || x >= bounds.left && x <= bounds.right) - && (skipY || y >= bounds.top && y <= bounds.bottom); -} - -var element_rectangle = core_element.extend({ - draw: function() { - var ctx = this._chart.ctx; - var vm = this._view; - var rects = boundingRects(vm); - var outer = rects.outer; - var inner = rects.inner; - - ctx.fillStyle = vm.backgroundColor; - ctx.fillRect(outer.x, outer.y, outer.w, outer.h); - - if (outer.w === inner.w && outer.h === inner.h) { - return; - } - - ctx.save(); - ctx.beginPath(); - ctx.rect(outer.x, outer.y, outer.w, outer.h); - ctx.clip(); - ctx.fillStyle = vm.borderColor; - ctx.rect(inner.x, inner.y, inner.w, inner.h); - ctx.fill('evenodd'); - ctx.restore(); - }, - - height: function() { - var vm = this._view; - return vm.base - vm.y; - }, - - inRange: function(mouseX, mouseY) { - return inRange(this._view, mouseX, mouseY); - }, - - inLabelRange: function(mouseX, mouseY) { - var vm = this._view; - return isVertical(vm) - ? inRange(vm, mouseX, null) - : inRange(vm, null, mouseY); - }, - - inXRange: function(mouseX) { - return inRange(this._view, mouseX, null); - }, - - inYRange: function(mouseY) { - return inRange(this._view, null, mouseY); - }, - - getCenterPoint: function() { - var vm = this._view; - var x, y; - if (isVertical(vm)) { - x = vm.x; - y = (vm.y + vm.base) / 2; - } else { - x = (vm.x + vm.base) / 2; - y = vm.y; - } - - return {x: x, y: y}; - }, - - getArea: function() { - var vm = this._view; - - return isVertical(vm) - ? vm.width * Math.abs(vm.y - vm.base) - : vm.height * Math.abs(vm.x - vm.base); - }, - - tooltipPosition: function() { - var vm = this._view; - return { - x: vm.x, - y: vm.y - }; - } -}); - -var elements = {}; -var Arc = element_arc; -var Line = element_line; -var Point = element_point; -var Rectangle = element_rectangle; -elements.Arc = Arc; -elements.Line = Line; -elements.Point = Point; -elements.Rectangle = Rectangle; - -var resolve$1 = helpers$1.options.resolve; - -core_defaults._set('bar', { - hover: { - mode: 'label' - }, - - scales: { - xAxes: [{ - type: 'category', - categoryPercentage: 0.8, - barPercentage: 0.9, - offset: true, - gridLines: { - offsetGridLines: true - } - }], - - yAxes: [{ - type: 'linear' - }] - } -}); - -/** - * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. - * @private - */ -function computeMinSampleSize(scale, pixels) { - var min = scale.isHorizontal() ? scale.width : scale.height; - var ticks = scale.getTicks(); - var prev, curr, i, ilen; - - for (i = 1, ilen = pixels.length; i < ilen; ++i) { - min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1])); - } - - for (i = 0, ilen = ticks.length; i < ilen; ++i) { - curr = scale.getPixelForTick(i); - min = i > 0 ? Math.min(min, curr - prev) : min; - prev = curr; - } - - return min; -} - -/** - * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, - * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This - * mode currently always generates bars equally sized (until we introduce scriptable options?). - * @private - */ -function computeFitCategoryTraits(index, ruler, options) { - var thickness = options.barThickness; - var count = ruler.stackCount; - var curr = ruler.pixels[index]; - var size, ratio; - - if (helpers$1.isNullOrUndef(thickness)) { - size = ruler.min * options.categoryPercentage; - ratio = options.barPercentage; - } else { - // When bar thickness is enforced, category and bar percentages are ignored. - // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') - // and deprecate barPercentage since this value is ignored when thickness is absolute. - size = thickness * count; - ratio = 1; - } - - return { - chunk: size / count, - ratio: ratio, - start: curr - (size / 2) - }; -} - -/** - * Computes an "optimal" category that globally arranges bars side by side (no gap when - * percentage options are 1), based on the previous and following categories. This mode - * generates bars with different widths when data are not evenly spaced. - * @private - */ -function computeFlexCategoryTraits(index, ruler, options) { - var pixels = ruler.pixels; - var curr = pixels[index]; - var prev = index > 0 ? pixels[index - 1] : null; - var next = index < pixels.length - 1 ? pixels[index + 1] : null; - var percent = options.categoryPercentage; - var start, size; - - if (prev === null) { - // first data: its size is double based on the next point or, - // if it's also the last data, we use the scale size. - prev = curr - (next === null ? ruler.end - ruler.start : next - curr); - } - - if (next === null) { - // last data: its size is also double based on the previous point. - next = curr + curr - prev; - } - - start = curr - (curr - Math.min(prev, next)) / 2 * percent; - size = Math.abs(next - prev) / 2 * percent; - - return { - chunk: size / ruler.stackCount, - ratio: options.barPercentage, - start: start - }; -} - -var controller_bar = core_datasetController.extend({ - - dataElementType: elements.Rectangle, - - initialize: function() { - var me = this; - var meta; - - core_datasetController.prototype.initialize.apply(me, arguments); - - meta = me.getMeta(); - meta.stack = me.getDataset().stack; - meta.bar = true; - }, - - update: function(reset) { - var me = this; - var rects = me.getMeta().data; - var i, ilen; - - me._ruler = me.getRuler(); - - for (i = 0, ilen = rects.length; i < ilen; ++i) { - me.updateElement(rects[i], i, reset); - } - }, - - updateElement: function(rectangle, index, reset) { - var me = this; - var meta = me.getMeta(); - var dataset = me.getDataset(); - var options = me._resolveElementOptions(rectangle, index); - - rectangle._xScale = me.getScaleForId(meta.xAxisID); - rectangle._yScale = me.getScaleForId(meta.yAxisID); - rectangle._datasetIndex = me.index; - rectangle._index = index; - rectangle._model = { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderSkipped: options.borderSkipped, - borderWidth: options.borderWidth, - datasetLabel: dataset.label, - label: me.chart.data.labels[index] - }; - - me._updateElementGeometry(rectangle, index, reset); - - rectangle.pivot(); - }, - - /** - * @private - */ - _updateElementGeometry: function(rectangle, index, reset) { - var me = this; - var model = rectangle._model; - var vscale = me._getValueScale(); - var base = vscale.getBasePixel(); - var horizontal = vscale.isHorizontal(); - var ruler = me._ruler || me.getRuler(); - var vpixels = me.calculateBarValuePixels(me.index, index); - var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); - - model.horizontal = horizontal; - model.base = reset ? base : vpixels.base; - model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; - model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; - model.height = horizontal ? ipixels.size : undefined; - model.width = horizontal ? undefined : ipixels.size; - }, - - /** - * Returns the stacks based on groups and bar visibility. - * @param {number} [last] - The dataset index - * @returns {string[]} The list of stack IDs - * @private - */ - _getStacks: function(last) { - var me = this; - var chart = me.chart; - var scale = me._getIndexScale(); - var stacked = scale.options.stacked; - var ilen = last === undefined ? chart.data.datasets.length : last + 1; - var stacks = []; - var i, meta; - - for (i = 0; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - if (meta.bar && chart.isDatasetVisible(i) && - (stacked === false || - (stacked === true && stacks.indexOf(meta.stack) === -1) || - (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { - stacks.push(meta.stack); - } - } - - return stacks; - }, - - /** - * Returns the effective number of stacks based on groups and bar visibility. - * @private - */ - getStackCount: function() { - return this._getStacks().length; - }, - - /** - * Returns the stack index for the given dataset based on groups and bar visibility. - * @param {number} [datasetIndex] - The dataset index - * @param {string} [name] - The stack name to find - * @returns {number} The stack index - * @private - */ - getStackIndex: function(datasetIndex, name) { - var stacks = this._getStacks(datasetIndex); - var index = (name !== undefined) - ? stacks.indexOf(name) - : -1; // indexOf returns -1 if element is not present - - return (index === -1) - ? stacks.length - 1 - : index; - }, - - /** - * @private - */ - getRuler: function() { - var me = this; - var scale = me._getIndexScale(); - var stackCount = me.getStackCount(); - var datasetIndex = me.index; - var isHorizontal = scale.isHorizontal(); - var start = isHorizontal ? scale.left : scale.top; - var end = start + (isHorizontal ? scale.width : scale.height); - var pixels = []; - var i, ilen, min; - - for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { - pixels.push(scale.getPixelForValue(null, i, datasetIndex)); - } - - min = helpers$1.isNullOrUndef(scale.options.barThickness) - ? computeMinSampleSize(scale, pixels) - : -1; - - return { - min: min, - pixels: pixels, - start: start, - end: end, - stackCount: stackCount, - scale: scale - }; - }, - - /** - * Note: pixel values are not clamped to the scale area. - * @private - */ - calculateBarValuePixels: function(datasetIndex, index) { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var scale = me._getValueScale(); - var isHorizontal = scale.isHorizontal(); - var datasets = chart.data.datasets; - var value = +scale.getRightValue(datasets[datasetIndex].data[index]); - var minBarLength = scale.options.minBarLength; - var stacked = scale.options.stacked; - var stack = meta.stack; - var start = 0; - var i, imeta, ivalue, base, head, size; - - if (stacked || (stacked === undefined && stack !== undefined)) { - for (i = 0; i < datasetIndex; ++i) { - imeta = chart.getDatasetMeta(i); - - if (imeta.bar && - imeta.stack === stack && - imeta.controller._getValueScaleId() === scale.id && - chart.isDatasetVisible(i)) { - - ivalue = +scale.getRightValue(datasets[i].data[index]); - if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { - start += ivalue; - } - } - } - } - - base = scale.getPixelForValue(start); - head = scale.getPixelForValue(start + value); - size = head - base; - - if (minBarLength !== undefined && Math.abs(size) < minBarLength) { - size = minBarLength; - if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) { - head = base - minBarLength; - } else { - head = base + minBarLength; - } - } - - return { - size: size, - base: base, - head: head, - center: head + size / 2 - }; - }, - - /** - * @private - */ - calculateBarIndexPixels: function(datasetIndex, index, ruler) { - var me = this; - var options = ruler.scale.options; - var range = options.barThickness === 'flex' - ? computeFlexCategoryTraits(index, ruler, options) - : computeFitCategoryTraits(index, ruler, options); - - var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); - var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); - var size = Math.min( - helpers$1.valueOrDefault(options.maxBarThickness, Infinity), - range.chunk * range.ratio); - - return { - base: center - size / 2, - head: center + size / 2, - center: center, - size: size - }; - }, - - draw: function() { - var me = this; - var chart = me.chart; - var scale = me._getValueScale(); - var rects = me.getMeta().data; - var dataset = me.getDataset(); - var ilen = rects.length; - var i = 0; - - helpers$1.canvas.clipArea(chart.ctx, chart.chartArea); - - for (; i < ilen; ++i) { - if (!isNaN(scale.getRightValue(dataset.data[i]))) { - rects[i].draw(); - } - } - - helpers$1.canvas.unclipArea(chart.ctx); - }, - - /** - * @private - */ - _resolveElementOptions: function(rectangle, index) { - var me = this; - var chart = me.chart; - var datasets = chart.data.datasets; - var dataset = datasets[me.index]; - var custom = rectangle.custom || {}; - var options = chart.options.elements.rectangle; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var keys = [ - 'backgroundColor', - 'borderColor', - 'borderSkipped', - 'borderWidth' - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$1([ - custom[key], - dataset[key], - options[key] - ], context, index); - } - - return values; - } -}); - -var valueOrDefault$3 = helpers$1.valueOrDefault; -var resolve$2 = helpers$1.options.resolve; - -core_defaults._set('bubble', { - hover: { - mode: 'single' - }, - - scales: { - xAxes: [{ - type: 'linear', // bubble should probably use a linear scale by default - position: 'bottom', - id: 'x-axis-0' // need an ID so datasets can reference the scale - }], - yAxes: [{ - type: 'linear', - position: 'left', - id: 'y-axis-0' - }] - }, - - tooltips: { - callbacks: { - title: function() { - // Title doesn't make sense for scatter since we format the data as a point - return ''; - }, - label: function(item, data) { - var datasetLabel = data.datasets[item.datasetIndex].label || ''; - var dataPoint = data.datasets[item.datasetIndex].data[item.index]; - return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; - } - } - } -}); - -var controller_bubble = core_datasetController.extend({ - /** - * @protected - */ - dataElementType: elements.Point, - - /** - * @protected - */ - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var points = meta.data; - - // Update Points - helpers$1.each(points, function(point, index) { - me.updateElement(point, index, reset); - }); - }, - - /** - * @protected - */ - updateElement: function(point, index, reset) { - var me = this; - var meta = me.getMeta(); - var custom = point.custom || {}; - var xScale = me.getScaleForId(meta.xAxisID); - var yScale = me.getScaleForId(meta.yAxisID); - var options = me._resolveElementOptions(point, index); - var data = me.getDataset().data[index]; - var dsIndex = me.index; - - var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); - var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); - - point._xScale = xScale; - point._yScale = yScale; - point._options = options; - point._datasetIndex = dsIndex; - point._index = index; - point._model = { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - hitRadius: options.hitRadius, - pointStyle: options.pointStyle, - rotation: options.rotation, - radius: reset ? 0 : options.radius, - skip: custom.skip || isNaN(x) || isNaN(y), - x: x, - y: y, - }; - - point.pivot(); - }, - - /** - * @protected - */ - setHoverStyle: function(point) { - var model = point._model; - var options = point._options; - var getHoverColor = helpers$1.getHoverColor; - - point.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - radius: model.radius - }; - - model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth); - model.radius = options.radius + options.hoverRadius; - }, - - /** - * @private - */ - _resolveElementOptions: function(point, index) { - var me = this; - var chart = me.chart; - var datasets = chart.data.datasets; - var dataset = datasets[me.index]; - var custom = point.custom || {}; - var options = chart.options.elements.point; - var data = dataset.data[index]; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var keys = [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'hoverBackgroundColor', - 'hoverBorderColor', - 'hoverBorderWidth', - 'hoverRadius', - 'hitRadius', - 'pointStyle', - 'rotation' - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$2([ - custom[key], - dataset[key], - options[key] - ], context, index); - } - - // Custom radius resolution - values.radius = resolve$2([ - custom.radius, - data ? data.r : undefined, - dataset.radius, - options.radius - ], context, index); - - return values; - } -}); - -var resolve$3 = helpers$1.options.resolve; -var valueOrDefault$4 = helpers$1.valueOrDefault; - -core_defaults._set('doughnut', { - animation: { - // Boolean - Whether we animate the rotation of the Doughnut - animateRotate: true, - // Boolean - Whether we animate scaling the Doughnut from the centre - animateScale: false - }, - hover: { - mode: 'single' - }, - legendCallback: function(chart) { - var text = []; - text.push('
    '); - - var data = chart.data; - var datasets = data.datasets; - var labels = data.labels; - - if (datasets.length) { - for (var i = 0; i < datasets[0].data.length; ++i) { - text.push('
  • '); - if (labels[i]) { - text.push(labels[i]); - } - text.push('
  • '); - } - } - - text.push('
'); - return text.join(''); - }, - legend: { - labels: { - generateLabels: function(chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function(label, i) { - var meta = chart.getDatasetMeta(0); - var ds = data.datasets[0]; - var arc = meta.data[i]; - var custom = arc && arc.custom || {}; - var arcOpts = chart.options.elements.arc; - var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); - var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); - var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); - - return { - text: label, - fillStyle: fill, - strokeStyle: stroke, - lineWidth: bw, - hidden: isNaN(ds.data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }); - } - return []; - } - }, - - onClick: function(e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - // toggle visibility of index if exists - if (meta.data[index]) { - meta.data[index].hidden = !meta.data[index].hidden; - } - } - - chart.update(); - } - }, - - // The percentage of the chart that we cut out of the middle. - cutoutPercentage: 50, - - // The rotation of the chart, where the first data arc begins. - rotation: Math.PI * -0.5, - - // The total circumference of the chart. - circumference: Math.PI * 2.0, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function() { - return ''; - }, - label: function(tooltipItem, data) { - var dataLabel = data.labels[tooltipItem.index]; - var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; - - if (helpers$1.isArray(dataLabel)) { - // show value on first line of multiline label - // need to clone because we are changing the value - dataLabel = dataLabel.slice(); - dataLabel[0] += value; - } else { - dataLabel += value; - } - - return dataLabel; - } - } - } -}); - -var controller_doughnut = core_datasetController.extend({ - - dataElementType: elements.Arc, - - linkScales: helpers$1.noop, - - // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly - getRingIndex: function(datasetIndex) { - var ringIndex = 0; - - for (var j = 0; j < datasetIndex; ++j) { - if (this.chart.isDatasetVisible(j)) { - ++ringIndex; - } - } - - return ringIndex; - }, - - update: function(reset) { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var availableWidth = chartArea.right - chartArea.left; - var availableHeight = chartArea.bottom - chartArea.top; - var minSize = Math.min(availableWidth, availableHeight); - var offset = {x: 0, y: 0}; - var meta = me.getMeta(); - var arcs = meta.data; - var cutoutPercentage = opts.cutoutPercentage; - var circumference = opts.circumference; - var chartWeight = me._getRingWeight(me.index); - var i, ilen; - - // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc - if (circumference < Math.PI * 2.0) { - var startAngle = opts.rotation % (Math.PI * 2.0); - startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); - var endAngle = startAngle + circumference; - var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; - var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; - var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); - var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); - var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); - var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); - var cutout = cutoutPercentage / 100.0; - var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; - var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; - var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; - minSize = Math.min(availableWidth / size.width, availableHeight / size.height); - offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; - } - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - arcs[i]._options = me._resolveElementOptions(arcs[i], i); - } - - chart.borderWidth = me.getMaxBorderWidth(); - chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); - chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); - chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1); - chart.offsetX = offset.x * chart.outerRadius; - chart.offsetY = offset.y * chart.outerRadius; - - meta.total = me.calculateTotal(); - - me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index); - me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0); - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - me.updateElement(arcs[i], i, reset); - } - }, - - updateElement: function(arc, index, reset) { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var animationOpts = opts.animation; - var centerX = (chartArea.left + chartArea.right) / 2; - var centerY = (chartArea.top + chartArea.bottom) / 2; - var startAngle = opts.rotation; // non reset case handled later - var endAngle = opts.rotation; // non reset case handled later - var dataset = me.getDataset(); - var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); - var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; - var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; - var options = arc._options || {}; - - helpers$1.extend(arc, { - // Utility - _datasetIndex: me.index, - _index: index, - - // Desired view properties - _model: { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - borderAlign: options.borderAlign, - x: centerX + chart.offsetX, - y: centerY + chart.offsetY, - startAngle: startAngle, - endAngle: endAngle, - circumference: circumference, - outerRadius: outerRadius, - innerRadius: innerRadius, - label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) - } - }); - - var model = arc._model; - - // Set correct angles if not resetting - if (!reset || !animationOpts.animateRotate) { - if (index === 0) { - model.startAngle = opts.rotation; - } else { - model.startAngle = me.getMeta().data[index - 1]._model.endAngle; - } - - model.endAngle = model.startAngle + model.circumference; - } - - arc.pivot(); - }, - - calculateTotal: function() { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var total = 0; - var value; - - helpers$1.each(meta.data, function(element, index) { - value = dataset.data[index]; - if (!isNaN(value) && !element.hidden) { - total += Math.abs(value); - } - }); - - /* if (total === 0) { - total = NaN; - }*/ - - return total; - }, - - calculateCircumference: function(value) { - var total = this.getMeta().total; - if (total > 0 && !isNaN(value)) { - return (Math.PI * 2.0) * (Math.abs(value) / total); - } - return 0; - }, - - // gets the max border or hover width to properly scale pie charts - getMaxBorderWidth: function(arcs) { - var me = this; - var max = 0; - var chart = me.chart; - var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth; - - if (!arcs) { - // Find the outmost visible dataset - for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { - if (chart.isDatasetVisible(i)) { - meta = chart.getDatasetMeta(i); - arcs = meta.data; - if (i !== me.index) { - controller = meta.controller; - } - break; - } - } - } - - if (!arcs) { - return 0; - } - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - arc = arcs[i]; - options = controller ? controller._resolveElementOptions(arc, i) : arc._options; - if (options.borderAlign !== 'inner') { - borderWidth = options.borderWidth; - hoverWidth = options.hoverBorderWidth; - - max = borderWidth > max ? borderWidth : max; - max = hoverWidth > max ? hoverWidth : max; - } - } - return max; - }, - - /** - * @protected - */ - setHoverStyle: function(arc) { - var model = arc._model; - var options = arc._options; - var getHoverColor = helpers$1.getHoverColor; - - arc.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - }; - - model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth); - }, - - /** - * @private - */ - _resolveElementOptions: function(arc, index) { - var me = this; - var chart = me.chart; - var dataset = me.getDataset(); - var custom = arc.custom || {}; - var options = chart.options.elements.arc; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var keys = [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'borderAlign', - 'hoverBackgroundColor', - 'hoverBorderColor', - 'hoverBorderWidth', - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$3([ - custom[key], - dataset[key], - options[key] - ], context, index); - } - - return values; - }, - - /** - * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly - * @private - */ - _getRingWeightOffset: function(datasetIndex) { - var ringWeightOffset = 0; - - for (var i = 0; i < datasetIndex; ++i) { - if (this.chart.isDatasetVisible(i)) { - ringWeightOffset += this._getRingWeight(i); - } - } - - return ringWeightOffset; - }, - - /** - * @private - */ - _getRingWeight: function(dataSetIndex) { - return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0); - }, - - /** - * Returns the sum of all visibile data set weights. This value can be 0. - * @private - */ - _getVisibleDatasetWeightTotal: function() { - return this._getRingWeightOffset(this.chart.data.datasets.length); - } -}); - -core_defaults._set('horizontalBar', { - hover: { - mode: 'index', - axis: 'y' - }, - - scales: { - xAxes: [{ - type: 'linear', - position: 'bottom' - }], - - yAxes: [{ - type: 'category', - position: 'left', - categoryPercentage: 0.8, - barPercentage: 0.9, - offset: true, - gridLines: { - offsetGridLines: true - } - }] - }, - - elements: { - rectangle: { - borderSkipped: 'left' - } - }, - - tooltips: { - mode: 'index', - axis: 'y' - } -}); - -var controller_horizontalBar = controller_bar.extend({ - /** - * @private - */ - _getValueScaleId: function() { - return this.getMeta().xAxisID; - }, - - /** - * @private - */ - _getIndexScaleId: function() { - return this.getMeta().yAxisID; - } -}); - -var valueOrDefault$5 = helpers$1.valueOrDefault; -var resolve$4 = helpers$1.options.resolve; -var isPointInArea = helpers$1.canvas._isPointInArea; - -core_defaults._set('line', { - showLines: true, - spanGaps: false, - - hover: { - mode: 'label' - }, - - scales: { - xAxes: [{ - type: 'category', - id: 'x-axis-0' - }], - yAxes: [{ - type: 'linear', - id: 'y-axis-0' - }] - } -}); - -function lineEnabled(dataset, options) { - return valueOrDefault$5(dataset.showLine, options.showLines); -} - -var controller_line = core_datasetController.extend({ - - datasetElementType: elements.Line, - - dataElementType: elements.Point, - - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var line = meta.dataset; - var points = meta.data || []; - var scale = me.getScaleForId(meta.yAxisID); - var dataset = me.getDataset(); - var showLine = lineEnabled(dataset, me.chart.options); - var i, ilen; - - // Update Line - if (showLine) { - // Compatibility: If the properties are defined with only the old name, use those values - if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { - dataset.lineTension = dataset.tension; - } - - // Utility - line._scale = scale; - line._datasetIndex = me.index; - // Data - line._children = points; - // Model - line._model = me._resolveLineOptions(line); - - line.pivot(); - } - - // Update Points - for (i = 0, ilen = points.length; i < ilen; ++i) { - me.updateElement(points[i], i, reset); - } - - if (showLine && line._model.tension !== 0) { - me.updateBezierControlPoints(); - } - - // Now pivot the point for animation - for (i = 0, ilen = points.length; i < ilen; ++i) { - points[i].pivot(); - } - }, - - updateElement: function(point, index, reset) { - var me = this; - var meta = me.getMeta(); - var custom = point.custom || {}; - var dataset = me.getDataset(); - var datasetIndex = me.index; - var value = dataset.data[index]; - var yScale = me.getScaleForId(meta.yAxisID); - var xScale = me.getScaleForId(meta.xAxisID); - var lineModel = meta.dataset._model; - var x, y; - - var options = me._resolvePointOptions(point, index); - - x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); - y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); - - // Utility - point._xScale = xScale; - point._yScale = yScale; - point._options = options; - point._datasetIndex = datasetIndex; - point._index = index; - - // Desired view properties - point._model = { - x: x, - y: y, - skip: custom.skip || isNaN(x) || isNaN(y), - // Appearance - radius: options.radius, - pointStyle: options.pointStyle, - rotation: options.rotation, - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0), - steppedLine: lineModel ? lineModel.steppedLine : false, - // Tooltip - hitRadius: options.hitRadius - }; - }, - - /** - * @private - */ - _resolvePointOptions: function(element, index) { - var me = this; - var chart = me.chart; - var dataset = chart.data.datasets[me.index]; - var custom = element.custom || {}; - var options = chart.options.elements.point; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var ELEMENT_OPTIONS = { - backgroundColor: 'pointBackgroundColor', - borderColor: 'pointBorderColor', - borderWidth: 'pointBorderWidth', - hitRadius: 'pointHitRadius', - hoverBackgroundColor: 'pointHoverBackgroundColor', - hoverBorderColor: 'pointHoverBorderColor', - hoverBorderWidth: 'pointHoverBorderWidth', - hoverRadius: 'pointHoverRadius', - pointStyle: 'pointStyle', - radius: 'pointRadius', - rotation: 'pointRotation' - }; - var keys = Object.keys(ELEMENT_OPTIONS); - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$4([ - custom[key], - dataset[ELEMENT_OPTIONS[key]], - dataset[key], - options[key] - ], context, index); - } - - return values; - }, - - /** - * @private - */ - _resolveLineOptions: function(element) { - var me = this; - var chart = me.chart; - var dataset = chart.data.datasets[me.index]; - var custom = element.custom || {}; - var options = chart.options; - var elementOptions = options.elements.line; - var values = {}; - var i, ilen, key; - - var keys = [ - 'backgroundColor', - 'borderWidth', - 'borderColor', - 'borderCapStyle', - 'borderDash', - 'borderDashOffset', - 'borderJoinStyle', - 'fill', - 'cubicInterpolationMode' - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$4([ - custom[key], - dataset[key], - elementOptions[key] - ]); - } - - // The default behavior of lines is to break at null values, according - // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 - // This option gives lines the ability to span gaps - values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps); - values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension); - values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]); - - return values; - }, - - calculatePointY: function(value, index, datasetIndex) { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var yScale = me.getScaleForId(meta.yAxisID); - var sumPos = 0; - var sumNeg = 0; - var i, ds, dsMeta; - - if (yScale.options.stacked) { - for (i = 0; i < datasetIndex; i++) { - ds = chart.data.datasets[i]; - dsMeta = chart.getDatasetMeta(i); - if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { - var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); - if (stackedRightValue < 0) { - sumNeg += stackedRightValue || 0; - } else { - sumPos += stackedRightValue || 0; - } - } - } - - var rightValue = Number(yScale.getRightValue(value)); - if (rightValue < 0) { - return yScale.getPixelForValue(sumNeg + rightValue); - } - return yScale.getPixelForValue(sumPos + rightValue); - } - - return yScale.getPixelForValue(value); - }, - - updateBezierControlPoints: function() { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var lineModel = meta.dataset._model; - var area = chart.chartArea; - var points = meta.data || []; - var i, ilen, model, controlPoints; - - // Only consider points that are drawn in case the spanGaps option is used - if (lineModel.spanGaps) { - points = points.filter(function(pt) { - return !pt._model.skip; - }); - } - - function capControlPoint(pt, min, max) { - return Math.max(Math.min(pt, max), min); - } - - if (lineModel.cubicInterpolationMode === 'monotone') { - helpers$1.splineCurveMonotone(points); - } else { - for (i = 0, ilen = points.length; i < ilen; ++i) { - model = points[i]._model; - controlPoints = helpers$1.splineCurve( - helpers$1.previousItem(points, i)._model, - model, - helpers$1.nextItem(points, i)._model, - lineModel.tension - ); - model.controlPointPreviousX = controlPoints.previous.x; - model.controlPointPreviousY = controlPoints.previous.y; - model.controlPointNextX = controlPoints.next.x; - model.controlPointNextY = controlPoints.next.y; - } - } - - if (chart.options.elements.line.capBezierPoints) { - for (i = 0, ilen = points.length; i < ilen; ++i) { - model = points[i]._model; - if (isPointInArea(model, area)) { - if (i > 0 && isPointInArea(points[i - 1]._model, area)) { - model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); - model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); - } - if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) { - model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); - model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); - } - } - } - } - }, - - draw: function() { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var points = meta.data || []; - var area = chart.chartArea; - var ilen = points.length; - var halfBorderWidth; - var i = 0; - - if (lineEnabled(me.getDataset(), chart.options)) { - halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2; - - helpers$1.canvas.clipArea(chart.ctx, { - left: area.left, - right: area.right, - top: area.top - halfBorderWidth, - bottom: area.bottom + halfBorderWidth - }); - - meta.dataset.draw(); - - helpers$1.canvas.unclipArea(chart.ctx); - } - - // Draw the points - for (; i < ilen; ++i) { - points[i].draw(area); - } - }, - - /** - * @protected - */ - setHoverStyle: function(point) { - var model = point._model; - var options = point._options; - var getHoverColor = helpers$1.getHoverColor; - - point.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - radius: model.radius - }; - - model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth); - model.radius = valueOrDefault$5(options.hoverRadius, options.radius); - }, -}); - -var resolve$5 = helpers$1.options.resolve; - -core_defaults._set('polarArea', { - scale: { - type: 'radialLinear', - angleLines: { - display: false - }, - gridLines: { - circular: true - }, - pointLabels: { - display: false - }, - ticks: { - beginAtZero: true - } - }, - - // Boolean - Whether to animate the rotation of the chart - animation: { - animateRotate: true, - animateScale: true - }, - - startAngle: -0.5 * Math.PI, - legendCallback: function(chart) { - var text = []; - text.push('
    '); - - var data = chart.data; - var datasets = data.datasets; - var labels = data.labels; - - if (datasets.length) { - for (var i = 0; i < datasets[0].data.length; ++i) { - text.push('
  • '); - if (labels[i]) { - text.push(labels[i]); - } - text.push('
  • '); - } - } - - text.push('
'); - return text.join(''); - }, - legend: { - labels: { - generateLabels: function(chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function(label, i) { - var meta = chart.getDatasetMeta(0); - var ds = data.datasets[0]; - var arc = meta.data[i]; - var custom = arc.custom || {}; - var arcOpts = chart.options.elements.arc; - var fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); - var stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); - var bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); - - return { - text: label, - fillStyle: fill, - strokeStyle: stroke, - lineWidth: bw, - hidden: isNaN(ds.data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }); - } - return []; - } - }, - - onClick: function(e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - meta.data[index].hidden = !meta.data[index].hidden; - } - - chart.update(); - } - }, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function() { - return ''; - }, - label: function(item, data) { - return data.labels[item.index] + ': ' + item.yLabel; - } - } - } -}); - -var controller_polarArea = core_datasetController.extend({ - - dataElementType: elements.Arc, - - linkScales: helpers$1.noop, - - update: function(reset) { - var me = this; - var dataset = me.getDataset(); - var meta = me.getMeta(); - var start = me.chart.options.startAngle || 0; - var starts = me._starts = []; - var angles = me._angles = []; - var arcs = meta.data; - var i, ilen, angle; - - me._updateRadius(); - - meta.count = me.countVisibleElements(); - - for (i = 0, ilen = dataset.data.length; i < ilen; i++) { - starts[i] = start; - angle = me._computeAngle(i); - angles[i] = angle; - start += angle; - } - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - arcs[i]._options = me._resolveElementOptions(arcs[i], i); - me.updateElement(arcs[i], i, reset); - } - }, - - /** - * @private - */ - _updateRadius: function() { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); - - chart.outerRadius = Math.max(minSize / 2, 0); - chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); - chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); - - me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); - me.innerRadius = me.outerRadius - chart.radiusLength; - }, - - updateElement: function(arc, index, reset) { - var me = this; - var chart = me.chart; - var dataset = me.getDataset(); - var opts = chart.options; - var animationOpts = opts.animation; - var scale = chart.scale; - var labels = chart.data.labels; - - var centerX = scale.xCenter; - var centerY = scale.yCenter; - - // var negHalfPI = -0.5 * Math.PI; - var datasetStartAngle = opts.startAngle; - var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); - var startAngle = me._starts[index]; - var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]); - - var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); - var options = arc._options || {}; - - helpers$1.extend(arc, { - // Utility - _datasetIndex: me.index, - _index: index, - _scale: scale, - - // Desired view properties - _model: { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - borderAlign: options.borderAlign, - x: centerX, - y: centerY, - innerRadius: 0, - outerRadius: reset ? resetRadius : distance, - startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, - endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, - label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index]) - } - }); - - arc.pivot(); - }, - - countVisibleElements: function() { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var count = 0; - - helpers$1.each(meta.data, function(element, index) { - if (!isNaN(dataset.data[index]) && !element.hidden) { - count++; - } - }); - - return count; - }, - - /** - * @protected - */ - setHoverStyle: function(arc) { - var model = arc._model; - var options = arc._options; - var getHoverColor = helpers$1.getHoverColor; - var valueOrDefault = helpers$1.valueOrDefault; - - arc.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - }; - - model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth); - }, - - /** - * @private - */ - _resolveElementOptions: function(arc, index) { - var me = this; - var chart = me.chart; - var dataset = me.getDataset(); - var custom = arc.custom || {}; - var options = chart.options.elements.arc; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var keys = [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'borderAlign', - 'hoverBackgroundColor', - 'hoverBorderColor', - 'hoverBorderWidth', - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$5([ - custom[key], - dataset[key], - options[key] - ], context, index); - } - - return values; - }, - - /** - * @private - */ - _computeAngle: function(index) { - var me = this; - var count = this.getMeta().count; - var dataset = me.getDataset(); - var meta = me.getMeta(); - - if (isNaN(dataset.data[index]) || meta.data[index].hidden) { - return 0; - } - - // Scriptable options - var context = { - chart: me.chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - return resolve$5([ - me.chart.options.elements.arc.angle, - (2 * Math.PI) / count - ], context, index); - } -}); - -core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut)); -core_defaults._set('pie', { - cutoutPercentage: 0 -}); - -// Pie charts are Doughnut chart with different defaults -var controller_pie = controller_doughnut; - -var valueOrDefault$6 = helpers$1.valueOrDefault; -var resolve$6 = helpers$1.options.resolve; - -core_defaults._set('radar', { - scale: { - type: 'radialLinear' - }, - elements: { - line: { - tension: 0 // no bezier in radar - } - } -}); - -var controller_radar = core_datasetController.extend({ - - datasetElementType: elements.Line, - - dataElementType: elements.Point, - - linkScales: helpers$1.noop, - - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var line = meta.dataset; - var points = meta.data || []; - var scale = me.chart.scale; - var dataset = me.getDataset(); - var i, ilen; - - // Compatibility: If the properties are defined with only the old name, use those values - if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { - dataset.lineTension = dataset.tension; - } - - // Utility - line._scale = scale; - line._datasetIndex = me.index; - // Data - line._children = points; - line._loop = true; - // Model - line._model = me._resolveLineOptions(line); - - line.pivot(); - - // Update Points - for (i = 0, ilen = points.length; i < ilen; ++i) { - me.updateElement(points[i], i, reset); - } - - // Update bezier control points - me.updateBezierControlPoints(); - - // Now pivot the point for animation - for (i = 0, ilen = points.length; i < ilen; ++i) { - points[i].pivot(); - } - }, - - updateElement: function(point, index, reset) { - var me = this; - var custom = point.custom || {}; - var dataset = me.getDataset(); - var scale = me.chart.scale; - var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); - var options = me._resolvePointOptions(point, index); - var lineModel = me.getMeta().dataset._model; - var x = reset ? scale.xCenter : pointPosition.x; - var y = reset ? scale.yCenter : pointPosition.y; - - // Utility - point._scale = scale; - point._options = options; - point._datasetIndex = me.index; - point._index = index; - - // Desired view properties - point._model = { - x: x, // value not used in dataset scale, but we want a consistent API between scales - y: y, - skip: custom.skip || isNaN(x) || isNaN(y), - // Appearance - radius: options.radius, - pointStyle: options.pointStyle, - rotation: options.rotation, - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0), - - // Tooltip - hitRadius: options.hitRadius - }; - }, - - /** - * @private - */ - _resolvePointOptions: function(element, index) { - var me = this; - var chart = me.chart; - var dataset = chart.data.datasets[me.index]; - var custom = element.custom || {}; - var options = chart.options.elements.point; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var ELEMENT_OPTIONS = { - backgroundColor: 'pointBackgroundColor', - borderColor: 'pointBorderColor', - borderWidth: 'pointBorderWidth', - hitRadius: 'pointHitRadius', - hoverBackgroundColor: 'pointHoverBackgroundColor', - hoverBorderColor: 'pointHoverBorderColor', - hoverBorderWidth: 'pointHoverBorderWidth', - hoverRadius: 'pointHoverRadius', - pointStyle: 'pointStyle', - radius: 'pointRadius', - rotation: 'pointRotation' - }; - var keys = Object.keys(ELEMENT_OPTIONS); - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$6([ - custom[key], - dataset[ELEMENT_OPTIONS[key]], - dataset[key], - options[key] - ], context, index); - } - - return values; - }, - - /** - * @private - */ - _resolveLineOptions: function(element) { - var me = this; - var chart = me.chart; - var dataset = chart.data.datasets[me.index]; - var custom = element.custom || {}; - var options = chart.options.elements.line; - var values = {}; - var i, ilen, key; - - var keys = [ - 'backgroundColor', - 'borderWidth', - 'borderColor', - 'borderCapStyle', - 'borderDash', - 'borderDashOffset', - 'borderJoinStyle', - 'fill' - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$6([ - custom[key], - dataset[key], - options[key] - ]); - } - - values.tension = valueOrDefault$6(dataset.lineTension, options.tension); - - return values; - }, - - updateBezierControlPoints: function() { - var me = this; - var meta = me.getMeta(); - var area = me.chart.chartArea; - var points = meta.data || []; - var i, ilen, model, controlPoints; - - function capControlPoint(pt, min, max) { - return Math.max(Math.min(pt, max), min); - } - - for (i = 0, ilen = points.length; i < ilen; ++i) { - model = points[i]._model; - controlPoints = helpers$1.splineCurve( - helpers$1.previousItem(points, i, true)._model, - model, - helpers$1.nextItem(points, i, true)._model, - model.tension - ); - - // Prevent the bezier going outside of the bounds of the graph - model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right); - model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom); - model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right); - model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom); - } - }, - - setHoverStyle: function(point) { - var model = point._model; - var options = point._options; - var getHoverColor = helpers$1.getHoverColor; - - point.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - radius: model.radius - }; - - model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth); - model.radius = valueOrDefault$6(options.hoverRadius, options.radius); - } -}); - -core_defaults._set('scatter', { - hover: { - mode: 'single' - }, - - scales: { - xAxes: [{ - id: 'x-axis-1', // need an ID so datasets can reference the scale - type: 'linear', // scatter should not use a category axis - position: 'bottom' - }], - yAxes: [{ - id: 'y-axis-1', - type: 'linear', - position: 'left' - }] - }, - - showLines: false, - - tooltips: { - callbacks: { - title: function() { - return ''; // doesn't make sense for scatter since data are formatted as a point - }, - label: function(item) { - return '(' + item.xLabel + ', ' + item.yLabel + ')'; - } - } - } -}); - -// Scatter charts use line controllers -var controller_scatter = controller_line; - -// NOTE export a map in which the key represents the controller type, not -// the class, and so must be CamelCase in order to be correctly retrieved -// by the controller in core.controller.js (`controllers[meta.type]`). - -var controllers = { - bar: controller_bar, - bubble: controller_bubble, - doughnut: controller_doughnut, - horizontalBar: controller_horizontalBar, - line: controller_line, - polarArea: controller_polarArea, - pie: controller_pie, - radar: controller_radar, - scatter: controller_scatter -}; - -/** - * Helper function to get relative position for an event - * @param {Event|IEvent} event - The event to get the position for - * @param {Chart} chart - The chart - * @returns {object} the event position - */ -function getRelativePosition(e, chart) { - if (e.native) { - return { - x: e.x, - y: e.y - }; - } - - return helpers$1.getRelativePosition(e, chart); -} - -/** - * Helper function to traverse all of the visible elements in the chart - * @param {Chart} chart - the chart - * @param {function} handler - the callback to execute for each visible item - */ -function parseVisibleItems(chart, handler) { - var datasets = chart.data.datasets; - var meta, i, j, ilen, jlen; - - for (i = 0, ilen = datasets.length; i < ilen; ++i) { - if (!chart.isDatasetVisible(i)) { - continue; - } - - meta = chart.getDatasetMeta(i); - for (j = 0, jlen = meta.data.length; j < jlen; ++j) { - var element = meta.data[j]; - if (!element._view.skip) { - handler(element); - } - } - } -} - -/** - * Helper function to get the items that intersect the event position - * @param {ChartElement[]} items - elements to filter - * @param {object} position - the point to be nearest to - * @return {ChartElement[]} the nearest items - */ -function getIntersectItems(chart, position) { - var elements = []; - - parseVisibleItems(chart, function(element) { - if (element.inRange(position.x, position.y)) { - elements.push(element); - } - }); - - return elements; -} - -/** - * Helper function to get the items nearest to the event position considering all visible items in teh chart - * @param {Chart} chart - the chart to look at elements from - * @param {object} position - the point to be nearest to - * @param {boolean} intersect - if true, only consider items that intersect the position - * @param {function} distanceMetric - function to provide the distance between points - * @return {ChartElement[]} the nearest items - */ -function getNearestItems(chart, position, intersect, distanceMetric) { - var minDistance = Number.POSITIVE_INFINITY; - var nearestItems = []; - - parseVisibleItems(chart, function(element) { - if (intersect && !element.inRange(position.x, position.y)) { - return; - } - - var center = element.getCenterPoint(); - var distance = distanceMetric(position, center); - if (distance < minDistance) { - nearestItems = [element]; - minDistance = distance; - } else if (distance === minDistance) { - // Can have multiple items at the same distance in which case we sort by size - nearestItems.push(element); - } - }); - - return nearestItems; -} - -/** - * Get a distance metric function for two points based on the - * axis mode setting - * @param {string} axis - the axis mode. x|y|xy - */ -function getDistanceMetricForAxis(axis) { - var useX = axis.indexOf('x') !== -1; - var useY = axis.indexOf('y') !== -1; - - return function(pt1, pt2) { - var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; - var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; - return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); - }; -} - -function indexMode(chart, e, options) { - var position = getRelativePosition(e, chart); - // Default axis for index mode is 'x' to match old behaviour - options.axis = options.axis || 'x'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); - var elements = []; - - if (!items.length) { - return []; - } - - chart.data.datasets.forEach(function(dataset, datasetIndex) { - if (chart.isDatasetVisible(datasetIndex)) { - var meta = chart.getDatasetMeta(datasetIndex); - var element = meta.data[items[0]._index]; - - // don't count items that are skipped (null data) - if (element && !element._view.skip) { - elements.push(element); - } - } - }); - - return elements; -} - -/** - * @interface IInteractionOptions - */ -/** - * If true, only consider items that intersect the point - * @name IInterfaceOptions#boolean - * @type Boolean - */ - -/** - * Contains interaction related functions - * @namespace Chart.Interaction - */ -var core_interaction = { - // Helper function for different modes - modes: { - single: function(chart, e) { - var position = getRelativePosition(e, chart); - var elements = []; - - parseVisibleItems(chart, function(element) { - if (element.inRange(position.x, position.y)) { - elements.push(element); - return elements; - } - }); - - return elements.slice(0, 1); - }, - - /** - * @function Chart.Interaction.modes.label - * @deprecated since version 2.4.0 - * @todo remove at version 3 - * @private - */ - label: indexMode, - - /** - * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something - * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item - * @function Chart.Interaction.modes.index - * @since v2.4.0 - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use during interaction - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - index: indexMode, - - /** - * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something - * If the options.intersect is false, we find the nearest item and return the items in that dataset - * @function Chart.Interaction.modes.dataset - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use during interaction - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - dataset: function(chart, e, options) { - var position = getRelativePosition(e, chart); - options.axis = options.axis || 'xy'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); - - if (items.length > 0) { - items = chart.getDatasetMeta(items[0]._datasetIndex).data; - } - - return items; - }, - - /** - * @function Chart.Interaction.modes.x-axis - * @deprecated since version 2.4.0. Use index mode and intersect == true - * @todo remove at version 3 - * @private - */ - 'x-axis': function(chart, e) { - return indexMode(chart, e, {intersect: false}); - }, - - /** - * Point mode returns all elements that hit test based on the event position - * of the event - * @function Chart.Interaction.modes.intersect - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - point: function(chart, e) { - var position = getRelativePosition(e, chart); - return getIntersectItems(chart, position); - }, - - /** - * nearest mode returns the element closest to the point - * @function Chart.Interaction.modes.intersect - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - nearest: function(chart, e, options) { - var position = getRelativePosition(e, chart); - options.axis = options.axis || 'xy'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - return getNearestItems(chart, position, options.intersect, distanceMetric); - }, - - /** - * x mode returns the elements that hit-test at the current x coordinate - * @function Chart.Interaction.modes.x - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - x: function(chart, e, options) { - var position = getRelativePosition(e, chart); - var items = []; - var intersectsItem = false; - - parseVisibleItems(chart, function(element) { - if (element.inXRange(position.x)) { - items.push(element); - } - - if (element.inRange(position.x, position.y)) { - intersectsItem = true; - } - }); - - // If we want to trigger on an intersect and we don't have any items - // that intersect the position, return nothing - if (options.intersect && !intersectsItem) { - items = []; - } - return items; - }, - - /** - * y mode returns the elements that hit-test at the current y coordinate - * @function Chart.Interaction.modes.y - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - y: function(chart, e, options) { - var position = getRelativePosition(e, chart); - var items = []; - var intersectsItem = false; - - parseVisibleItems(chart, function(element) { - if (element.inYRange(position.y)) { - items.push(element); - } - - if (element.inRange(position.x, position.y)) { - intersectsItem = true; - } - }); - - // If we want to trigger on an intersect and we don't have any items - // that intersect the position, return nothing - if (options.intersect && !intersectsItem) { - items = []; - } - return items; - } - } -}; - -function filterByPosition(array, position) { - return helpers$1.where(array, function(v) { - return v.position === position; - }); -} - -function sortByWeight(array, reverse) { - array.forEach(function(v, i) { - v._tmpIndex_ = i; - return v; - }); - array.sort(function(a, b) { - var v0 = reverse ? b : a; - var v1 = reverse ? a : b; - return v0.weight === v1.weight ? - v0._tmpIndex_ - v1._tmpIndex_ : - v0.weight - v1.weight; - }); - array.forEach(function(v) { - delete v._tmpIndex_; - }); -} - -function findMaxPadding(boxes) { - var top = 0; - var left = 0; - var bottom = 0; - var right = 0; - helpers$1.each(boxes, function(box) { - if (box.getPadding) { - var boxPadding = box.getPadding(); - top = Math.max(top, boxPadding.top); - left = Math.max(left, boxPadding.left); - bottom = Math.max(bottom, boxPadding.bottom); - right = Math.max(right, boxPadding.right); - } - }); - return { - top: top, - left: left, - bottom: bottom, - right: right - }; -} - -function addSizeByPosition(boxes, size) { - helpers$1.each(boxes, function(box) { - size[box.position] += box.isHorizontal() ? box.height : box.width; - }); -} - -core_defaults._set('global', { - layout: { - padding: { - top: 0, - right: 0, - bottom: 0, - left: 0 - } - } -}); - -/** - * @interface ILayoutItem - * @prop {string} position - The position of the item in the chart layout. Possible values are - * 'left', 'top', 'right', 'bottom', and 'chartArea' - * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area - * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down - * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) - * @prop {function} update - Takes two parameters: width and height. Returns size of item - * @prop {function} getPadding - Returns an object with padding on the edges - * @prop {number} width - Width of item. Must be valid after update() - * @prop {number} height - Height of item. Must be valid after update() - * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update - * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update - * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update - * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update - */ - -// The layout service is very self explanatory. It's responsible for the layout within a chart. -// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need -// It is this service's responsibility of carrying out that layout. -var core_layouts = { - defaults: {}, - - /** - * Register a box to a chart. - * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. - * @param {Chart} chart - the chart to use - * @param {ILayoutItem} item - the item to add to be layed out - */ - addBox: function(chart, item) { - if (!chart.boxes) { - chart.boxes = []; - } - - // initialize item with default values - item.fullWidth = item.fullWidth || false; - item.position = item.position || 'top'; - item.weight = item.weight || 0; - - chart.boxes.push(item); - }, - - /** - * Remove a layoutItem from a chart - * @param {Chart} chart - the chart to remove the box from - * @param {ILayoutItem} layoutItem - the item to remove from the layout - */ - removeBox: function(chart, layoutItem) { - var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; - if (index !== -1) { - chart.boxes.splice(index, 1); - } - }, - - /** - * Sets (or updates) options on the given `item`. - * @param {Chart} chart - the chart in which the item lives (or will be added to) - * @param {ILayoutItem} item - the item to configure with the given options - * @param {object} options - the new item options. - */ - configure: function(chart, item, options) { - var props = ['fullWidth', 'position', 'weight']; - var ilen = props.length; - var i = 0; - var prop; - - for (; i < ilen; ++i) { - prop = props[i]; - if (options.hasOwnProperty(prop)) { - item[prop] = options[prop]; - } - } - }, - - /** - * Fits boxes of the given chart into the given size by having each box measure itself - * then running a fitting algorithm - * @param {Chart} chart - the chart - * @param {number} width - the width to fit into - * @param {number} height - the height to fit into - */ - update: function(chart, width, height) { - if (!chart) { - return; - } - - var layoutOptions = chart.options.layout || {}; - var padding = helpers$1.options.toPadding(layoutOptions.padding); - var leftPadding = padding.left; - var rightPadding = padding.right; - var topPadding = padding.top; - var bottomPadding = padding.bottom; - - var leftBoxes = filterByPosition(chart.boxes, 'left'); - var rightBoxes = filterByPosition(chart.boxes, 'right'); - var topBoxes = filterByPosition(chart.boxes, 'top'); - var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); - var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); - - // Sort boxes by weight. A higher weight is further away from the chart area - sortByWeight(leftBoxes, true); - sortByWeight(rightBoxes, false); - sortByWeight(topBoxes, true); - sortByWeight(bottomBoxes, false); - - var verticalBoxes = leftBoxes.concat(rightBoxes); - var horizontalBoxes = topBoxes.concat(bottomBoxes); - var outerBoxes = verticalBoxes.concat(horizontalBoxes); - - // Essentially we now have any number of boxes on each of the 4 sides. - // Our canvas looks like the following. - // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and - // B1 is the bottom axis - // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays - // These locations are single-box locations only, when trying to register a chartArea location that is already taken, - // an error will be thrown. - // - // |----------------------------------------------------| - // | T1 (Full Width) | - // |----------------------------------------------------| - // | | | T2 | | - // | |----|-------------------------------------|----| - // | | | C1 | | C2 | | - // | | |----| |----| | - // | | | | | - // | L1 | L2 | ChartArea (C0) | R1 | - // | | | | | - // | | |----| |----| | - // | | | C3 | | C4 | | - // | |----|-------------------------------------|----| - // | | | B1 | | - // |----------------------------------------------------| - // | B2 (Full Width) | - // |----------------------------------------------------| - // - // What we do to find the best sizing, we do the following - // 1. Determine the minimum size of the chart area. - // 2. Split the remaining width equally between each vertical axis - // 3. Split the remaining height equally between each horizontal axis - // 4. Give each layout the maximum size it can be. The layout will return it's minimum size - // 5. Adjust the sizes of each axis based on it's minimum reported size. - // 6. Refit each axis - // 7. Position each axis in the final location - // 8. Tell the chart the final location of the chart area - // 9. Tell any axes that overlay the chart area the positions of the chart area - - // Step 1 - var chartWidth = width - leftPadding - rightPadding; - var chartHeight = height - topPadding - bottomPadding; - var chartAreaWidth = chartWidth / 2; // min 50% - - // Step 2 - var verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length; - - // Step 3 - // TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837) - // var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length; - - // Step 4 - var maxChartAreaWidth = chartWidth; - var maxChartAreaHeight = chartHeight; - var outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; - var minBoxSizes = []; - var maxPadding; - - function getMinimumBoxSize(box) { - var minSize; - var isHorizontal = box.isHorizontal(); - - if (isHorizontal) { - minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2); - maxChartAreaHeight -= minSize.height; - } else { - minSize = box.update(verticalBoxWidth, maxChartAreaHeight); - maxChartAreaWidth -= minSize.width; - } - - minBoxSizes.push({ - horizontal: isHorizontal, - width: minSize.width, - box: box, - }); - } - - helpers$1.each(outerBoxes, getMinimumBoxSize); - - // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) - maxPadding = findMaxPadding(outerBoxes); - - // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could - // be if the axes are drawn at their minimum sizes. - // Steps 5 & 6 - - // Function to fit a box - function fitBox(box) { - var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minBox) { - return minBox.box === box; - }); - - if (minBoxSize) { - if (minBoxSize.horizontal) { - var scaleMargin = { - left: Math.max(outerBoxSizes.left, maxPadding.left), - right: Math.max(outerBoxSizes.right, maxPadding.right), - top: 0, - bottom: 0 - }; - - // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends - // on the margin. Sometimes they need to increase in size slightly - box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); - } else { - box.update(minBoxSize.width, maxChartAreaHeight); - } - } - } - - // Update, and calculate the left and right margins for the horizontal boxes - helpers$1.each(verticalBoxes, fitBox); - addSizeByPosition(verticalBoxes, outerBoxSizes); - - // Set the Left and Right margins for the horizontal boxes - helpers$1.each(horizontalBoxes, fitBox); - addSizeByPosition(horizontalBoxes, outerBoxSizes); - - function finalFitVerticalBox(box) { - var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minSize) { - return minSize.box === box; - }); - - var scaleMargin = { - left: 0, - right: 0, - top: outerBoxSizes.top, - bottom: outerBoxSizes.bottom - }; - - if (minBoxSize) { - box.update(minBoxSize.width, maxChartAreaHeight, scaleMargin); - } - } - - // Let the left layout know the final margin - helpers$1.each(verticalBoxes, finalFitVerticalBox); - - // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) - outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; - addSizeByPosition(outerBoxes, outerBoxSizes); - - // We may be adding some padding to account for rotated x axis labels - var leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0); - outerBoxSizes.left += leftPaddingAddition; - outerBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0); - - var topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0); - outerBoxSizes.top += topPaddingAddition; - outerBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 0); - - // Figure out if our chart area changed. This would occur if the dataset layout label rotation - // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do - // without calling `fit` again - var newMaxChartAreaHeight = height - outerBoxSizes.top - outerBoxSizes.bottom; - var newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right; - - if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { - helpers$1.each(verticalBoxes, function(box) { - box.height = newMaxChartAreaHeight; - }); - - helpers$1.each(horizontalBoxes, function(box) { - if (!box.fullWidth) { - box.width = newMaxChartAreaWidth; - } - }); - - maxChartAreaHeight = newMaxChartAreaHeight; - maxChartAreaWidth = newMaxChartAreaWidth; - } - - // Step 7 - Position the boxes - var left = leftPadding + leftPaddingAddition; - var top = topPadding + topPaddingAddition; - - function placeBox(box) { - if (box.isHorizontal()) { - box.left = box.fullWidth ? leftPadding : outerBoxSizes.left; - box.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + maxChartAreaWidth; - box.top = top; - box.bottom = top + box.height; - - // Move to next point - top = box.bottom; - - } else { - - box.left = left; - box.right = left + box.width; - box.top = outerBoxSizes.top; - box.bottom = outerBoxSizes.top + maxChartAreaHeight; - - // Move to next point - left = box.right; - } - } - - helpers$1.each(leftBoxes.concat(topBoxes), placeBox); - - // Account for chart width and height - left += maxChartAreaWidth; - top += maxChartAreaHeight; - - helpers$1.each(rightBoxes, placeBox); - helpers$1.each(bottomBoxes, placeBox); - - // Step 8 - chart.chartArea = { - left: outerBoxSizes.left, - top: outerBoxSizes.top, - right: outerBoxSizes.left + maxChartAreaWidth, - bottom: outerBoxSizes.top + maxChartAreaHeight - }; - - // Step 9 - helpers$1.each(chartAreaBoxes, function(box) { - box.left = chart.chartArea.left; - box.top = chart.chartArea.top; - box.right = chart.chartArea.right; - box.bottom = chart.chartArea.bottom; - - box.update(maxChartAreaWidth, maxChartAreaHeight); - }); - } -}; - -/** - * Platform fallback implementation (minimal). - * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 - */ - -var platform_basic = { - acquireContext: function(item) { - if (item && item.canvas) { - // Support for any object associated to a canvas (including a context2d) - item = item.canvas; - } - - return item && item.getContext('2d') || null; - } -}; - -var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n"; - -var platform_dom$1 = /*#__PURE__*/Object.freeze({ -default: platform_dom -}); - -function getCjsExportFromNamespace (n) { - return n && n.default || n; -} - -var stylesheet = getCjsExportFromNamespace(platform_dom$1); - -var EXPANDO_KEY = '$chartjs'; -var CSS_PREFIX = 'chartjs-'; -var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor'; -var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; -var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; -var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; - -/** - * DOM event types -> Chart.js event types. - * Note: only events with different types are mapped. - * @see https://developer.mozilla.org/en-US/docs/Web/Events - */ -var EVENT_TYPES = { - touchstart: 'mousedown', - touchmove: 'mousemove', - touchend: 'mouseup', - pointerenter: 'mouseenter', - pointerdown: 'mousedown', - pointermove: 'mousemove', - pointerup: 'mouseup', - pointerleave: 'mouseout', - pointerout: 'mouseout' -}; - -/** - * The "used" size is the final value of a dimension property after all calculations have - * been performed. This method uses the computed style of `element` but returns undefined - * if the computed style is not expressed in pixels. That can happen in some cases where - * `element` has a size relative to its parent and this last one is not yet displayed, - * for example because of `display: none` on a parent node. - * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value - * @returns {number} Size in pixels or undefined if unknown. - */ -function readUsedSize(element, property) { - var value = helpers$1.getStyle(element, property); - var matches = value && value.match(/^(\d+)(\.\d+)?px$/); - return matches ? Number(matches[1]) : undefined; -} - -/** - * Initializes the canvas style and render size without modifying the canvas display size, - * since responsiveness is handled by the controller.resize() method. The config is used - * to determine the aspect ratio to apply in case no explicit height has been specified. - */ -function initCanvas(canvas, config) { - var style = canvas.style; - - // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it - // returns null or '' if no explicit value has been set to the canvas attribute. - var renderHeight = canvas.getAttribute('height'); - var renderWidth = canvas.getAttribute('width'); - - // Chart.js modifies some canvas values that we want to restore on destroy - canvas[EXPANDO_KEY] = { - initial: { - height: renderHeight, - width: renderWidth, - style: { - display: style.display, - height: style.height, - width: style.width - } - } - }; - - // Force canvas to display as block to avoid extra space caused by inline - // elements, which would interfere with the responsive resize process. - // https://github.com/chartjs/Chart.js/issues/2538 - style.display = style.display || 'block'; - - if (renderWidth === null || renderWidth === '') { - var displayWidth = readUsedSize(canvas, 'width'); - if (displayWidth !== undefined) { - canvas.width = displayWidth; - } - } - - if (renderHeight === null || renderHeight === '') { - if (canvas.style.height === '') { - // If no explicit render height and style height, let's apply the aspect ratio, - // which one can be specified by the user but also by charts as default option - // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. - canvas.height = canvas.width / (config.options.aspectRatio || 2); - } else { - var displayHeight = readUsedSize(canvas, 'height'); - if (displayWidth !== undefined) { - canvas.height = displayHeight; - } - } - } - - return canvas; -} - -/** - * Detects support for options object argument in addEventListener. - * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support - * @private - */ -var supportsEventListenerOptions = (function() { - var supports = false; - try { - var options = Object.defineProperty({}, 'passive', { - // eslint-disable-next-line getter-return - get: function() { - supports = true; - } - }); - window.addEventListener('e', null, options); - } catch (e) { - // continue regardless of error - } - return supports; -}()); - -// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. -// https://github.com/chartjs/Chart.js/issues/4287 -var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; - -function addListener(node, type, listener) { - node.addEventListener(type, listener, eventListenerOptions); -} - -function removeListener(node, type, listener) { - node.removeEventListener(type, listener, eventListenerOptions); -} - -function createEvent(type, chart, x, y, nativeEvent) { - return { - type: type, - chart: chart, - native: nativeEvent || null, - x: x !== undefined ? x : null, - y: y !== undefined ? y : null, - }; -} - -function fromNativeEvent(event, chart) { - var type = EVENT_TYPES[event.type] || event.type; - var pos = helpers$1.getRelativePosition(event, chart); - return createEvent(type, chart, pos.x, pos.y, event); -} - -function throttled(fn, thisArg) { - var ticking = false; - var args = []; - - return function() { - args = Array.prototype.slice.call(arguments); - thisArg = thisArg || this; - - if (!ticking) { - ticking = true; - helpers$1.requestAnimFrame.call(window, function() { - ticking = false; - fn.apply(thisArg, args); - }); - } - }; -} - -function createDiv(cls) { - var el = document.createElement('div'); - el.className = cls || ''; - return el; -} - -// Implementation based on https://github.com/marcj/css-element-queries -function createResizer(handler) { - var maxSize = 1000000; - - // NOTE(SB) Don't use innerHTML because it could be considered unsafe. - // https://github.com/chartjs/Chart.js/issues/5902 - var resizer = createDiv(CSS_SIZE_MONITOR); - var expand = createDiv(CSS_SIZE_MONITOR + '-expand'); - var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink'); - - expand.appendChild(createDiv()); - shrink.appendChild(createDiv()); - - resizer.appendChild(expand); - resizer.appendChild(shrink); - resizer._reset = function() { - expand.scrollLeft = maxSize; - expand.scrollTop = maxSize; - shrink.scrollLeft = maxSize; - shrink.scrollTop = maxSize; - }; - - var onScroll = function() { - resizer._reset(); - handler(); - }; - - addListener(expand, 'scroll', onScroll.bind(expand, 'expand')); - addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); - - return resizer; -} - -// https://davidwalsh.name/detect-node-insertion -function watchForRender(node, handler) { - var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); - var proxy = expando.renderProxy = function(e) { - if (e.animationName === CSS_RENDER_ANIMATION) { - handler(); - } - }; - - helpers$1.each(ANIMATION_START_EVENTS, function(type) { - addListener(node, type, proxy); - }); - - // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class - // is removed then added back immediately (same animation frame?). Accessing the - // `offsetParent` property will force a reflow and re-evaluate the CSS animation. - // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics - // https://github.com/chartjs/Chart.js/issues/4737 - expando.reflow = !!node.offsetParent; - - node.classList.add(CSS_RENDER_MONITOR); -} - -function unwatchForRender(node) { - var expando = node[EXPANDO_KEY] || {}; - var proxy = expando.renderProxy; - - if (proxy) { - helpers$1.each(ANIMATION_START_EVENTS, function(type) { - removeListener(node, type, proxy); - }); - - delete expando.renderProxy; - } - - node.classList.remove(CSS_RENDER_MONITOR); -} - -function addResizeListener(node, listener, chart) { - var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); - - // Let's keep track of this added resizer and thus avoid DOM query when removing it. - var resizer = expando.resizer = createResizer(throttled(function() { - if (expando.resizer) { - var container = chart.options.maintainAspectRatio && node.parentNode; - var w = container ? container.clientWidth : 0; - listener(createEvent('resize', chart)); - if (container && container.clientWidth < w && chart.canvas) { - // If the container size shrank during chart resize, let's assume - // scrollbar appeared. So we resize again with the scrollbar visible - - // effectively making chart smaller and the scrollbar hidden again. - // Because we are inside `throttled`, and currently `ticking`, scroll - // events are ignored during this whole 2 resize process. - // If we assumed wrong and something else happened, we are resizing - // twice in a frame (potential performance issue) - listener(createEvent('resize', chart)); - } - } - })); - - // The resizer needs to be attached to the node parent, so we first need to be - // sure that `node` is attached to the DOM before injecting the resizer element. - watchForRender(node, function() { - if (expando.resizer) { - var container = node.parentNode; - if (container && container !== resizer.parentNode) { - container.insertBefore(resizer, container.firstChild); - } - - // The container size might have changed, let's reset the resizer state. - resizer._reset(); - } - }); -} - -function removeResizeListener(node) { - var expando = node[EXPANDO_KEY] || {}; - var resizer = expando.resizer; - - delete expando.resizer; - unwatchForRender(node); - - if (resizer && resizer.parentNode) { - resizer.parentNode.removeChild(resizer); - } -} - -function injectCSS(platform, css) { - // https://stackoverflow.com/q/3922139 - var style = platform._style || document.createElement('style'); - if (!platform._style) { - platform._style = style; - css = '/* Chart.js */\n' + css; - style.setAttribute('type', 'text/css'); - document.getElementsByTagName('head')[0].appendChild(style); - } - - style.appendChild(document.createTextNode(css)); -} - -var platform_dom$2 = { - /** - * When `true`, prevents the automatic injection of the stylesheet required to - * correctly detect when the chart is added to the DOM and then resized. This - * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`) - * to be manually imported to make this library compatible with any CSP. - * See https://github.com/chartjs/Chart.js/issues/5208 - */ - disableCSSInjection: false, - - /** - * This property holds whether this platform is enabled for the current environment. - * Currently used by platform.js to select the proper implementation. - * @private - */ - _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', - - /** - * @private - */ - _ensureLoaded: function() { - if (this._loaded) { - return; - } - - this._loaded = true; - - // https://github.com/chartjs/Chart.js/issues/5208 - if (!this.disableCSSInjection) { - injectCSS(this, stylesheet); - } - }, - - acquireContext: function(item, config) { - if (typeof item === 'string') { - item = document.getElementById(item); - } else if (item.length) { - // Support for array based queries (such as jQuery) - item = item[0]; - } - - if (item && item.canvas) { - // Support for any object associated to a canvas (including a context2d) - item = item.canvas; - } - - // To prevent canvas fingerprinting, some add-ons undefine the getContext - // method, for example: https://github.com/kkapsner/CanvasBlocker - // https://github.com/chartjs/Chart.js/issues/2807 - var context = item && item.getContext && item.getContext('2d'); - - // Load platform resources on first chart creation, to make possible to change - // platform options after importing the library (e.g. `disableCSSInjection`). - this._ensureLoaded(); - - // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is - // inside an iframe or when running in a protected environment. We could guess the - // types from their toString() value but let's keep things flexible and assume it's - // a sufficient condition if the item has a context2D which has item as `canvas`. - // https://github.com/chartjs/Chart.js/issues/3887 - // https://github.com/chartjs/Chart.js/issues/4102 - // https://github.com/chartjs/Chart.js/issues/4152 - if (context && context.canvas === item) { - initCanvas(item, config); - return context; - } - - return null; - }, - - releaseContext: function(context) { - var canvas = context.canvas; - if (!canvas[EXPANDO_KEY]) { - return; - } - - var initial = canvas[EXPANDO_KEY].initial; - ['height', 'width'].forEach(function(prop) { - var value = initial[prop]; - if (helpers$1.isNullOrUndef(value)) { - canvas.removeAttribute(prop); - } else { - canvas.setAttribute(prop, value); - } - }); - - helpers$1.each(initial.style || {}, function(value, key) { - canvas.style[key] = value; - }); - - // The canvas render size might have been changed (and thus the state stack discarded), - // we can't use save() and restore() to restore the initial state. So make sure that at - // least the canvas context is reset to the default state by setting the canvas width. - // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html - // eslint-disable-next-line no-self-assign - canvas.width = canvas.width; - - delete canvas[EXPANDO_KEY]; - }, - - addEventListener: function(chart, type, listener) { - var canvas = chart.canvas; - if (type === 'resize') { - // Note: the resize event is not supported on all browsers. - addResizeListener(canvas, listener, chart); - return; - } - - var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); - var proxies = expando.proxies || (expando.proxies = {}); - var proxy = proxies[chart.id + '_' + type] = function(event) { - listener(fromNativeEvent(event, chart)); - }; - - addListener(canvas, type, proxy); - }, - - removeEventListener: function(chart, type, listener) { - var canvas = chart.canvas; - if (type === 'resize') { - // Note: the resize event is not supported on all browsers. - removeResizeListener(canvas); - return; - } - - var expando = listener[EXPANDO_KEY] || {}; - var proxies = expando.proxies || {}; - var proxy = proxies[chart.id + '_' + type]; - if (!proxy) { - return; - } - - removeListener(canvas, type, proxy); - } -}; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use EventTarget.addEventListener instead. - * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ - * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener - * @function Chart.helpers.addEvent - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers$1.addEvent = addListener; - -/** - * Provided for backward compatibility, use EventTarget.removeEventListener instead. - * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ - * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener - * @function Chart.helpers.removeEvent - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers$1.removeEvent = removeListener; - -// @TODO Make possible to select another platform at build time. -var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic; - -/** - * @namespace Chart.platform - * @see https://chartjs.gitbooks.io/proposals/content/Platform.html - * @since 2.4.0 - */ -var platform = helpers$1.extend({ - /** - * @since 2.7.0 - */ - initialize: function() {}, - - /** - * Called at chart construction time, returns a context2d instance implementing - * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. - * @param {*} item - The native item from which to acquire context (platform specific) - * @param {object} options - The chart options - * @returns {CanvasRenderingContext2D} context2d instance - */ - acquireContext: function() {}, - - /** - * Called at chart destruction time, releases any resources associated to the context - * previously returned by the acquireContext() method. - * @param {CanvasRenderingContext2D} context - The context2d instance - * @returns {boolean} true if the method succeeded, else false - */ - releaseContext: function() {}, - - /** - * Registers the specified listener on the given chart. - * @param {Chart} chart - Chart from which to listen for event - * @param {string} type - The ({@link IEvent}) type to listen for - * @param {function} listener - Receives a notification (an object that implements - * the {@link IEvent} interface) when an event of the specified type occurs. - */ - addEventListener: function() {}, - - /** - * Removes the specified listener previously registered with addEventListener. - * @param {Chart} chart - Chart from which to remove the listener - * @param {string} type - The ({@link IEvent}) type to remove - * @param {function} listener - The listener function to remove from the event target. - */ - removeEventListener: function() {} - -}, implementation); - -core_defaults._set('global', { - plugins: {} -}); - -/** - * The plugin service singleton - * @namespace Chart.plugins - * @since 2.1.0 - */ -var core_plugins = { - /** - * Globally registered plugins. - * @private - */ - _plugins: [], - - /** - * This identifier is used to invalidate the descriptors cache attached to each chart - * when a global plugin is registered or unregistered. In this case, the cache ID is - * incremented and descriptors are regenerated during following API calls. - * @private - */ - _cacheId: 0, - - /** - * Registers the given plugin(s) if not already registered. - * @param {IPlugin[]|IPlugin} plugins plugin instance(s). - */ - register: function(plugins) { - var p = this._plugins; - ([]).concat(plugins).forEach(function(plugin) { - if (p.indexOf(plugin) === -1) { - p.push(plugin); - } - }); - - this._cacheId++; - }, - - /** - * Unregisters the given plugin(s) only if registered. - * @param {IPlugin[]|IPlugin} plugins plugin instance(s). - */ - unregister: function(plugins) { - var p = this._plugins; - ([]).concat(plugins).forEach(function(plugin) { - var idx = p.indexOf(plugin); - if (idx !== -1) { - p.splice(idx, 1); - } - }); - - this._cacheId++; - }, - - /** - * Remove all registered plugins. - * @since 2.1.5 - */ - clear: function() { - this._plugins = []; - this._cacheId++; - }, - - /** - * Returns the number of registered plugins? - * @returns {number} - * @since 2.1.5 - */ - count: function() { - return this._plugins.length; - }, - - /** - * Returns all registered plugin instances. - * @returns {IPlugin[]} array of plugin objects. - * @since 2.1.5 - */ - getAll: function() { - return this._plugins; - }, - - /** - * Calls enabled plugins for `chart` on the specified hook and with the given args. - * This method immediately returns as soon as a plugin explicitly returns false. The - * returned value can be used, for instance, to interrupt the current action. - * @param {Chart} chart - The chart instance for which plugins should be called. - * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). - * @param {Array} [args] - Extra arguments to apply to the hook call. - * @returns {boolean} false if any of the plugins return false, else returns true. - */ - notify: function(chart, hook, args) { - var descriptors = this.descriptors(chart); - var ilen = descriptors.length; - var i, descriptor, plugin, params, method; - - for (i = 0; i < ilen; ++i) { - descriptor = descriptors[i]; - plugin = descriptor.plugin; - method = plugin[hook]; - if (typeof method === 'function') { - params = [chart].concat(args || []); - params.push(descriptor.options); - if (method.apply(plugin, params) === false) { - return false; - } - } - } - - return true; - }, - - /** - * Returns descriptors of enabled plugins for the given chart. - * @returns {object[]} [{ plugin, options }] - * @private - */ - descriptors: function(chart) { - var cache = chart.$plugins || (chart.$plugins = {}); - if (cache.id === this._cacheId) { - return cache.descriptors; - } - - var plugins = []; - var descriptors = []; - var config = (chart && chart.config) || {}; - var options = (config.options && config.options.plugins) || {}; - - this._plugins.concat(config.plugins || []).forEach(function(plugin) { - var idx = plugins.indexOf(plugin); - if (idx !== -1) { - return; - } - - var id = plugin.id; - var opts = options[id]; - if (opts === false) { - return; - } - - if (opts === true) { - opts = helpers$1.clone(core_defaults.global.plugins[id]); - } - - plugins.push(plugin); - descriptors.push({ - plugin: plugin, - options: opts || {} - }); - }); - - cache.descriptors = descriptors; - cache.id = this._cacheId; - return descriptors; - }, - - /** - * Invalidates cache for the given chart: descriptors hold a reference on plugin option, - * but in some cases, this reference can be changed by the user when updating options. - * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 - * @private - */ - _invalidate: function(chart) { - delete chart.$plugins; - } -}; - -var core_scaleService = { - // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then - // use the new chart options to grab the correct scale - constructors: {}, - // Use a registration function so that we can move to an ES6 map when we no longer need to support - // old browsers - - // Scale config defaults - defaults: {}, - registerScaleType: function(type, scaleConstructor, scaleDefaults) { - this.constructors[type] = scaleConstructor; - this.defaults[type] = helpers$1.clone(scaleDefaults); - }, - getScaleConstructor: function(type) { - return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; - }, - getScaleDefaults: function(type) { - // Return the scale defaults merged with the global settings so that we always use the latest ones - return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {}; - }, - updateScaleDefaults: function(type, additions) { - var me = this; - if (me.defaults.hasOwnProperty(type)) { - me.defaults[type] = helpers$1.extend(me.defaults[type], additions); - } - }, - addScalesToLayout: function(chart) { - // Adds each scale to the chart.boxes array to be sized accordingly - helpers$1.each(chart.scales, function(scale) { - // Set ILayoutItem parameters for backwards compatibility - scale.fullWidth = scale.options.fullWidth; - scale.position = scale.options.position; - scale.weight = scale.options.weight; - core_layouts.addBox(chart, scale); - }); - } -}; - -var valueOrDefault$7 = helpers$1.valueOrDefault; - -core_defaults._set('global', { - tooltips: { - enabled: true, - custom: null, - mode: 'nearest', - position: 'average', - intersect: true, - backgroundColor: 'rgba(0,0,0,0.8)', - titleFontStyle: 'bold', - titleSpacing: 2, - titleMarginBottom: 6, - titleFontColor: '#fff', - titleAlign: 'left', - bodySpacing: 2, - bodyFontColor: '#fff', - bodyAlign: 'left', - footerFontStyle: 'bold', - footerSpacing: 2, - footerMarginTop: 6, - footerFontColor: '#fff', - footerAlign: 'left', - yPadding: 6, - xPadding: 6, - caretPadding: 2, - caretSize: 5, - cornerRadius: 6, - multiKeyBackground: '#fff', - displayColors: true, - borderColor: 'rgba(0,0,0,0)', - borderWidth: 0, - callbacks: { - // Args are: (tooltipItems, data) - beforeTitle: helpers$1.noop, - title: function(tooltipItems, data) { - var title = ''; - var labels = data.labels; - var labelCount = labels ? labels.length : 0; - - if (tooltipItems.length > 0) { - var item = tooltipItems[0]; - if (item.label) { - title = item.label; - } else if (item.xLabel) { - title = item.xLabel; - } else if (labelCount > 0 && item.index < labelCount) { - title = labels[item.index]; - } - } - - return title; - }, - afterTitle: helpers$1.noop, - - // Args are: (tooltipItems, data) - beforeBody: helpers$1.noop, - - // Args are: (tooltipItem, data) - beforeLabel: helpers$1.noop, - label: function(tooltipItem, data) { - var label = data.datasets[tooltipItem.datasetIndex].label || ''; - - if (label) { - label += ': '; - } - if (!helpers$1.isNullOrUndef(tooltipItem.value)) { - label += tooltipItem.value; - } else { - label += tooltipItem.yLabel; - } - return label; - }, - labelColor: function(tooltipItem, chart) { - var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); - var activeElement = meta.data[tooltipItem.index]; - var view = activeElement._view; - return { - borderColor: view.borderColor, - backgroundColor: view.backgroundColor - }; - }, - labelTextColor: function() { - return this._options.bodyFontColor; - }, - afterLabel: helpers$1.noop, - - // Args are: (tooltipItems, data) - afterBody: helpers$1.noop, - - // Args are: (tooltipItems, data) - beforeFooter: helpers$1.noop, - footer: helpers$1.noop, - afterFooter: helpers$1.noop - } - } -}); - -var positioners = { - /** - * Average mode places the tooltip at the average position of the elements shown - * @function Chart.Tooltip.positioners.average - * @param elements {ChartElement[]} the elements being displayed in the tooltip - * @returns {object} tooltip position - */ - average: function(elements) { - if (!elements.length) { - return false; - } - - var i, len; - var x = 0; - var y = 0; - var count = 0; - - for (i = 0, len = elements.length; i < len; ++i) { - var el = elements[i]; - if (el && el.hasValue()) { - var pos = el.tooltipPosition(); - x += pos.x; - y += pos.y; - ++count; - } - } - - return { - x: x / count, - y: y / count - }; - }, - - /** - * Gets the tooltip position nearest of the item nearest to the event position - * @function Chart.Tooltip.positioners.nearest - * @param elements {Chart.Element[]} the tooltip elements - * @param eventPosition {object} the position of the event in canvas coordinates - * @returns {object} the tooltip position - */ - nearest: function(elements, eventPosition) { - var x = eventPosition.x; - var y = eventPosition.y; - var minDistance = Number.POSITIVE_INFINITY; - var i, len, nearestElement; - - for (i = 0, len = elements.length; i < len; ++i) { - var el = elements[i]; - if (el && el.hasValue()) { - var center = el.getCenterPoint(); - var d = helpers$1.distanceBetweenPoints(eventPosition, center); - - if (d < minDistance) { - minDistance = d; - nearestElement = el; - } - } - } - - if (nearestElement) { - var tp = nearestElement.tooltipPosition(); - x = tp.x; - y = tp.y; - } - - return { - x: x, - y: y - }; - } -}; - -// Helper to push or concat based on if the 2nd parameter is an array or not -function pushOrConcat(base, toPush) { - if (toPush) { - if (helpers$1.isArray(toPush)) { - // base = base.concat(toPush); - Array.prototype.push.apply(base, toPush); - } else { - base.push(toPush); - } - } - - return base; -} - -/** - * Returns array of strings split by newline - * @param {string} value - The value to split by newline. - * @returns {string[]} value if newline present - Returned from String split() method - * @function - */ -function splitNewlines(str) { - if ((typeof str === 'string' || str instanceof String) && str.indexOf('\n') > -1) { - return str.split('\n'); - } - return str; -} - - -/** - * Private helper to create a tooltip item model - * @param element - the chart element (point, arc, bar) to create the tooltip item for - * @return new tooltip item - */ -function createTooltipItem(element) { - var xScale = element._xScale; - var yScale = element._yScale || element._scale; // handle radar || polarArea charts - var index = element._index; - var datasetIndex = element._datasetIndex; - var controller = element._chart.getDatasetMeta(datasetIndex).controller; - var indexScale = controller._getIndexScale(); - var valueScale = controller._getValueScale(); - - return { - xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', - yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', - label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '', - value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '', - index: index, - datasetIndex: datasetIndex, - x: element._model.x, - y: element._model.y - }; -} - -/** - * Helper to get the reset model for the tooltip - * @param tooltipOpts {object} the tooltip options - */ -function getBaseModel(tooltipOpts) { - var globalDefaults = core_defaults.global; - - return { - // Positioning - xPadding: tooltipOpts.xPadding, - yPadding: tooltipOpts.yPadding, - xAlign: tooltipOpts.xAlign, - yAlign: tooltipOpts.yAlign, - - // Body - bodyFontColor: tooltipOpts.bodyFontColor, - _bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), - _bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), - _bodyAlign: tooltipOpts.bodyAlign, - bodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), - bodySpacing: tooltipOpts.bodySpacing, - - // Title - titleFontColor: tooltipOpts.titleFontColor, - _titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), - _titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), - titleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), - _titleAlign: tooltipOpts.titleAlign, - titleSpacing: tooltipOpts.titleSpacing, - titleMarginBottom: tooltipOpts.titleMarginBottom, - - // Footer - footerFontColor: tooltipOpts.footerFontColor, - _footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), - _footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), - footerFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), - _footerAlign: tooltipOpts.footerAlign, - footerSpacing: tooltipOpts.footerSpacing, - footerMarginTop: tooltipOpts.footerMarginTop, - - // Appearance - caretSize: tooltipOpts.caretSize, - cornerRadius: tooltipOpts.cornerRadius, - backgroundColor: tooltipOpts.backgroundColor, - opacity: 0, - legendColorBackground: tooltipOpts.multiKeyBackground, - displayColors: tooltipOpts.displayColors, - borderColor: tooltipOpts.borderColor, - borderWidth: tooltipOpts.borderWidth - }; -} - -/** - * Get the size of the tooltip - */ -function getTooltipSize(tooltip, model) { - var ctx = tooltip._chart.ctx; - - var height = model.yPadding * 2; // Tooltip Padding - var width = 0; - - // Count of all lines in the body - var body = model.body; - var combinedBodyLength = body.reduce(function(count, bodyItem) { - return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; - }, 0); - combinedBodyLength += model.beforeBody.length + model.afterBody.length; - - var titleLineCount = model.title.length; - var footerLineCount = model.footer.length; - var titleFontSize = model.titleFontSize; - var bodyFontSize = model.bodyFontSize; - var footerFontSize = model.footerFontSize; - - height += titleLineCount * titleFontSize; // Title Lines - height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing - height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin - height += combinedBodyLength * bodyFontSize; // Body Lines - height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing - height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin - height += footerLineCount * (footerFontSize); // Footer Lines - height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing - - // Title width - var widthPadding = 0; - var maxLineWidth = function(line) { - width = Math.max(width, ctx.measureText(line).width + widthPadding); - }; - - ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); - helpers$1.each(model.title, maxLineWidth); - - // Body width - ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); - helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth); - - // Body lines may include some extra width due to the color box - widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; - helpers$1.each(body, function(bodyItem) { - helpers$1.each(bodyItem.before, maxLineWidth); - helpers$1.each(bodyItem.lines, maxLineWidth); - helpers$1.each(bodyItem.after, maxLineWidth); - }); - - // Reset back to 0 - widthPadding = 0; - - // Footer width - ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); - helpers$1.each(model.footer, maxLineWidth); - - // Add padding - width += 2 * model.xPadding; - - return { - width: width, - height: height - }; -} - -/** - * Helper to get the alignment of a tooltip given the size - */ -function determineAlignment(tooltip, size) { - var model = tooltip._model; - var chart = tooltip._chart; - var chartArea = tooltip._chart.chartArea; - var xAlign = 'center'; - var yAlign = 'center'; - - if (model.y < size.height) { - yAlign = 'top'; - } else if (model.y > (chart.height - size.height)) { - yAlign = 'bottom'; - } - - var lf, rf; // functions to determine left, right alignment - var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart - var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges - var midX = (chartArea.left + chartArea.right) / 2; - var midY = (chartArea.top + chartArea.bottom) / 2; - - if (yAlign === 'center') { - lf = function(x) { - return x <= midX; - }; - rf = function(x) { - return x > midX; - }; - } else { - lf = function(x) { - return x <= (size.width / 2); - }; - rf = function(x) { - return x >= (chart.width - (size.width / 2)); - }; - } - - olf = function(x) { - return x + size.width + model.caretSize + model.caretPadding > chart.width; - }; - orf = function(x) { - return x - size.width - model.caretSize - model.caretPadding < 0; - }; - yf = function(y) { - return y <= midY ? 'top' : 'bottom'; - }; - - if (lf(model.x)) { - xAlign = 'left'; - - // Is tooltip too wide and goes over the right side of the chart.? - if (olf(model.x)) { - xAlign = 'center'; - yAlign = yf(model.y); - } - } else if (rf(model.x)) { - xAlign = 'right'; - - // Is tooltip too wide and goes outside left edge of canvas? - if (orf(model.x)) { - xAlign = 'center'; - yAlign = yf(model.y); - } - } - - var opts = tooltip._options; - return { - xAlign: opts.xAlign ? opts.xAlign : xAlign, - yAlign: opts.yAlign ? opts.yAlign : yAlign - }; -} - -/** - * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment - */ -function getBackgroundPoint(vm, size, alignment, chart) { - // Background Position - var x = vm.x; - var y = vm.y; - - var caretSize = vm.caretSize; - var caretPadding = vm.caretPadding; - var cornerRadius = vm.cornerRadius; - var xAlign = alignment.xAlign; - var yAlign = alignment.yAlign; - var paddingAndSize = caretSize + caretPadding; - var radiusAndPadding = cornerRadius + caretPadding; - - if (xAlign === 'right') { - x -= size.width; - } else if (xAlign === 'center') { - x -= (size.width / 2); - if (x + size.width > chart.width) { - x = chart.width - size.width; - } - if (x < 0) { - x = 0; - } - } - - if (yAlign === 'top') { - y += paddingAndSize; - } else if (yAlign === 'bottom') { - y -= size.height + paddingAndSize; - } else { - y -= (size.height / 2); - } - - if (yAlign === 'center') { - if (xAlign === 'left') { - x += paddingAndSize; - } else if (xAlign === 'right') { - x -= paddingAndSize; - } - } else if (xAlign === 'left') { - x -= radiusAndPadding; - } else if (xAlign === 'right') { - x += radiusAndPadding; - } - - return { - x: x, - y: y - }; -} - -function getAlignedX(vm, align) { - return align === 'center' - ? vm.x + vm.width / 2 - : align === 'right' - ? vm.x + vm.width - vm.xPadding - : vm.x + vm.xPadding; -} - -/** - * Helper to build before and after body lines - */ -function getBeforeAfterBodyLines(callback) { - return pushOrConcat([], splitNewlines(callback)); -} - -var exports$3 = core_element.extend({ - initialize: function() { - this._model = getBaseModel(this._options); - this._lastActive = []; - }, - - // Get the title - // Args are: (tooltipItem, data) - getTitle: function() { - var me = this; - var opts = me._options; - var callbacks = opts.callbacks; - - var beforeTitle = callbacks.beforeTitle.apply(me, arguments); - var title = callbacks.title.apply(me, arguments); - var afterTitle = callbacks.afterTitle.apply(me, arguments); - - var lines = []; - lines = pushOrConcat(lines, splitNewlines(beforeTitle)); - lines = pushOrConcat(lines, splitNewlines(title)); - lines = pushOrConcat(lines, splitNewlines(afterTitle)); - - return lines; - }, - - // Args are: (tooltipItem, data) - getBeforeBody: function() { - return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments)); - }, - - // Args are: (tooltipItem, data) - getBody: function(tooltipItems, data) { - var me = this; - var callbacks = me._options.callbacks; - var bodyItems = []; - - helpers$1.each(tooltipItems, function(tooltipItem) { - var bodyItem = { - before: [], - lines: [], - after: [] - }; - pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data))); - pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); - pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data))); - - bodyItems.push(bodyItem); - }); - - return bodyItems; - }, - - // Args are: (tooltipItem, data) - getAfterBody: function() { - return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments)); - }, - - // Get the footer and beforeFooter and afterFooter lines - // Args are: (tooltipItem, data) - getFooter: function() { - var me = this; - var callbacks = me._options.callbacks; - - var beforeFooter = callbacks.beforeFooter.apply(me, arguments); - var footer = callbacks.footer.apply(me, arguments); - var afterFooter = callbacks.afterFooter.apply(me, arguments); - - var lines = []; - lines = pushOrConcat(lines, splitNewlines(beforeFooter)); - lines = pushOrConcat(lines, splitNewlines(footer)); - lines = pushOrConcat(lines, splitNewlines(afterFooter)); - - return lines; - }, - - update: function(changed) { - var me = this; - var opts = me._options; - - // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition - // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time - // which breaks any animations. - var existingModel = me._model; - var model = me._model = getBaseModel(opts); - var active = me._active; - - var data = me._data; - - // In the case where active.length === 0 we need to keep these at existing values for good animations - var alignment = { - xAlign: existingModel.xAlign, - yAlign: existingModel.yAlign - }; - var backgroundPoint = { - x: existingModel.x, - y: existingModel.y - }; - var tooltipSize = { - width: existingModel.width, - height: existingModel.height - }; - var tooltipPosition = { - x: existingModel.caretX, - y: existingModel.caretY - }; - - var i, len; - - if (active.length) { - model.opacity = 1; - - var labelColors = []; - var labelTextColors = []; - tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition); - - var tooltipItems = []; - for (i = 0, len = active.length; i < len; ++i) { - tooltipItems.push(createTooltipItem(active[i])); - } - - // If the user provided a filter function, use it to modify the tooltip items - if (opts.filter) { - tooltipItems = tooltipItems.filter(function(a) { - return opts.filter(a, data); - }); - } - - // If the user provided a sorting function, use it to modify the tooltip items - if (opts.itemSort) { - tooltipItems = tooltipItems.sort(function(a, b) { - return opts.itemSort(a, b, data); - }); - } - - // Determine colors for boxes - helpers$1.each(tooltipItems, function(tooltipItem) { - labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); - labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); - }); - - - // Build the Text Lines - model.title = me.getTitle(tooltipItems, data); - model.beforeBody = me.getBeforeBody(tooltipItems, data); - model.body = me.getBody(tooltipItems, data); - model.afterBody = me.getAfterBody(tooltipItems, data); - model.footer = me.getFooter(tooltipItems, data); - - // Initial positioning and colors - model.x = tooltipPosition.x; - model.y = tooltipPosition.y; - model.caretPadding = opts.caretPadding; - model.labelColors = labelColors; - model.labelTextColors = labelTextColors; - - // data points - model.dataPoints = tooltipItems; - - // We need to determine alignment of the tooltip - tooltipSize = getTooltipSize(this, model); - alignment = determineAlignment(this, tooltipSize); - // Final Size and Position - backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart); - } else { - model.opacity = 0; - } - - model.xAlign = alignment.xAlign; - model.yAlign = alignment.yAlign; - model.x = backgroundPoint.x; - model.y = backgroundPoint.y; - model.width = tooltipSize.width; - model.height = tooltipSize.height; - - // Point where the caret on the tooltip points to - model.caretX = tooltipPosition.x; - model.caretY = tooltipPosition.y; - - me._model = model; - - if (changed && opts.custom) { - opts.custom.call(me, model); - } - - return me; - }, - - drawCaret: function(tooltipPoint, size) { - var ctx = this._chart.ctx; - var vm = this._view; - var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); - - ctx.lineTo(caretPosition.x1, caretPosition.y1); - ctx.lineTo(caretPosition.x2, caretPosition.y2); - ctx.lineTo(caretPosition.x3, caretPosition.y3); - }, - getCaretPosition: function(tooltipPoint, size, vm) { - var x1, x2, x3, y1, y2, y3; - var caretSize = vm.caretSize; - var cornerRadius = vm.cornerRadius; - var xAlign = vm.xAlign; - var yAlign = vm.yAlign; - var ptX = tooltipPoint.x; - var ptY = tooltipPoint.y; - var width = size.width; - var height = size.height; - - if (yAlign === 'center') { - y2 = ptY + (height / 2); - - if (xAlign === 'left') { - x1 = ptX; - x2 = x1 - caretSize; - x3 = x1; - - y1 = y2 + caretSize; - y3 = y2 - caretSize; - } else { - x1 = ptX + width; - x2 = x1 + caretSize; - x3 = x1; - - y1 = y2 - caretSize; - y3 = y2 + caretSize; - } - } else { - if (xAlign === 'left') { - x2 = ptX + cornerRadius + (caretSize); - x1 = x2 - caretSize; - x3 = x2 + caretSize; - } else if (xAlign === 'right') { - x2 = ptX + width - cornerRadius - caretSize; - x1 = x2 - caretSize; - x3 = x2 + caretSize; - } else { - x2 = vm.caretX; - x1 = x2 - caretSize; - x3 = x2 + caretSize; - } - if (yAlign === 'top') { - y1 = ptY; - y2 = y1 - caretSize; - y3 = y1; - } else { - y1 = ptY + height; - y2 = y1 + caretSize; - y3 = y1; - // invert drawing order - var tmp = x3; - x3 = x1; - x1 = tmp; - } - } - return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; - }, - - drawTitle: function(pt, vm, ctx) { - var title = vm.title; - - if (title.length) { - pt.x = getAlignedX(vm, vm._titleAlign); - - ctx.textAlign = vm._titleAlign; - ctx.textBaseline = 'top'; - - var titleFontSize = vm.titleFontSize; - var titleSpacing = vm.titleSpacing; - - ctx.fillStyle = vm.titleFontColor; - ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); - - var i, len; - for (i = 0, len = title.length; i < len; ++i) { - ctx.fillText(title[i], pt.x, pt.y); - pt.y += titleFontSize + titleSpacing; // Line Height and spacing - - if (i + 1 === title.length) { - pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing - } - } - } - }, - - drawBody: function(pt, vm, ctx) { - var bodyFontSize = vm.bodyFontSize; - var bodySpacing = vm.bodySpacing; - var bodyAlign = vm._bodyAlign; - var body = vm.body; - var drawColorBoxes = vm.displayColors; - var labelColors = vm.labelColors; - var xLinePadding = 0; - var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0; - var textColor; - - ctx.textAlign = bodyAlign; - ctx.textBaseline = 'top'; - ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); - - pt.x = getAlignedX(vm, bodyAlign); - - // Before Body - var fillLineOfText = function(line) { - ctx.fillText(line, pt.x + xLinePadding, pt.y); - pt.y += bodyFontSize + bodySpacing; - }; - - // Before body lines - ctx.fillStyle = vm.bodyFontColor; - helpers$1.each(vm.beforeBody, fillLineOfText); - - xLinePadding = drawColorBoxes && bodyAlign !== 'right' - ? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2) - : 0; - - // Draw body lines now - helpers$1.each(body, function(bodyItem, i) { - textColor = vm.labelTextColors[i]; - ctx.fillStyle = textColor; - helpers$1.each(bodyItem.before, fillLineOfText); - - helpers$1.each(bodyItem.lines, function(line) { - // Draw Legend-like boxes if needed - if (drawColorBoxes) { - // Fill a white rect so that colours merge nicely if the opacity is < 1 - ctx.fillStyle = vm.legendColorBackground; - ctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize); - - // Border - ctx.lineWidth = 1; - ctx.strokeStyle = labelColors[i].borderColor; - ctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize); - - // Inner square - ctx.fillStyle = labelColors[i].backgroundColor; - ctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); - ctx.fillStyle = textColor; - } - - fillLineOfText(line); - }); - - helpers$1.each(bodyItem.after, fillLineOfText); - }); - - // Reset back to 0 for after body - xLinePadding = 0; - - // After body lines - helpers$1.each(vm.afterBody, fillLineOfText); - pt.y -= bodySpacing; // Remove last body spacing - }, - - drawFooter: function(pt, vm, ctx) { - var footer = vm.footer; - - if (footer.length) { - pt.x = getAlignedX(vm, vm._footerAlign); - pt.y += vm.footerMarginTop; - - ctx.textAlign = vm._footerAlign; - ctx.textBaseline = 'top'; - - ctx.fillStyle = vm.footerFontColor; - ctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); - - helpers$1.each(footer, function(line) { - ctx.fillText(line, pt.x, pt.y); - pt.y += vm.footerFontSize + vm.footerSpacing; - }); - } - }, - - drawBackground: function(pt, vm, ctx, tooltipSize) { - ctx.fillStyle = vm.backgroundColor; - ctx.strokeStyle = vm.borderColor; - ctx.lineWidth = vm.borderWidth; - var xAlign = vm.xAlign; - var yAlign = vm.yAlign; - var x = pt.x; - var y = pt.y; - var width = tooltipSize.width; - var height = tooltipSize.height; - var radius = vm.cornerRadius; - - ctx.beginPath(); - ctx.moveTo(x + radius, y); - if (yAlign === 'top') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x + width - radius, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + radius); - if (yAlign === 'center' && xAlign === 'right') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x + width, y + height - radius); - ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); - if (yAlign === 'bottom') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x + radius, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - radius); - if (yAlign === 'center' && xAlign === 'left') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x, y + radius); - ctx.quadraticCurveTo(x, y, x + radius, y); - ctx.closePath(); - - ctx.fill(); - - if (vm.borderWidth > 0) { - ctx.stroke(); - } - }, - - draw: function() { - var ctx = this._chart.ctx; - var vm = this._view; - - if (vm.opacity === 0) { - return; - } - - var tooltipSize = { - width: vm.width, - height: vm.height - }; - var pt = { - x: vm.x, - y: vm.y - }; - - // IE11/Edge does not like very small opacities, so snap to 0 - var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; - - // Truthy/falsey value for empty tooltip - var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; - - if (this._options.enabled && hasTooltipContent) { - ctx.save(); - ctx.globalAlpha = opacity; - - // Draw Background - this.drawBackground(pt, vm, ctx, tooltipSize); - - // Draw Title, Body, and Footer - pt.y += vm.yPadding; - - // Titles - this.drawTitle(pt, vm, ctx); - - // Body - this.drawBody(pt, vm, ctx); - - // Footer - this.drawFooter(pt, vm, ctx); - - ctx.restore(); - } - }, - - /** - * Handle an event - * @private - * @param {IEvent} event - The event to handle - * @returns {boolean} true if the tooltip changed - */ - handleEvent: function(e) { - var me = this; - var options = me._options; - var changed = false; - - me._lastActive = me._lastActive || []; - - // Find Active Elements for tooltips - if (e.type === 'mouseout') { - me._active = []; - } else { - me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); - } - - // Remember Last Actives - changed = !helpers$1.arrayEquals(me._active, me._lastActive); - - // Only handle target event on tooltip change - if (changed) { - me._lastActive = me._active; - - if (options.enabled || options.custom) { - me._eventPosition = { - x: e.x, - y: e.y - }; - - me.update(true); - me.pivot(); - } - } - - return changed; - } -}); - -/** - * @namespace Chart.Tooltip.positioners - */ -var positioners_1 = positioners; - -var core_tooltip = exports$3; -core_tooltip.positioners = positioners_1; - -var valueOrDefault$8 = helpers$1.valueOrDefault; - -core_defaults._set('global', { - elements: {}, - events: [ - 'mousemove', - 'mouseout', - 'click', - 'touchstart', - 'touchmove' - ], - hover: { - onHover: null, - mode: 'nearest', - intersect: true, - animationDuration: 400 - }, - onClick: null, - maintainAspectRatio: true, - responsive: true, - responsiveAnimationDuration: 0 -}); - -/** - * Recursively merge the given config objects representing the `scales` option - * by incorporating scale defaults in `xAxes` and `yAxes` array items, then - * returns a deep copy of the result, thus doesn't alter inputs. - */ -function mergeScaleConfig(/* config objects ... */) { - return helpers$1.merge({}, [].slice.call(arguments), { - merger: function(key, target, source, options) { - if (key === 'xAxes' || key === 'yAxes') { - var slen = source[key].length; - var i, type, scale; - - if (!target[key]) { - target[key] = []; - } - - for (i = 0; i < slen; ++i) { - scale = source[key][i]; - type = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear'); - - if (i >= target[key].length) { - target[key].push({}); - } - - if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { - // new/untyped scale or type changed: let's apply the new defaults - // then merge source scale to correctly overwrite the defaults. - helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]); - } else { - // scales type are the same - helpers$1.merge(target[key][i], scale); - } - } - } else { - helpers$1._merger(key, target, source, options); - } - } - }); -} - -/** - * Recursively merge the given config objects as the root options by handling - * default scale options for the `scales` and `scale` properties, then returns - * a deep copy of the result, thus doesn't alter inputs. - */ -function mergeConfig(/* config objects ... */) { - return helpers$1.merge({}, [].slice.call(arguments), { - merger: function(key, target, source, options) { - var tval = target[key] || {}; - var sval = source[key]; - - if (key === 'scales') { - // scale config merging is complex. Add our own function here for that - target[key] = mergeScaleConfig(tval, sval); - } else if (key === 'scale') { - // used in polar area & radar charts since there is only one scale - target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]); - } else { - helpers$1._merger(key, target, source, options); - } - } - }); -} - -function initConfig(config) { - config = config || {}; - - // Do NOT use mergeConfig for the data object because this method merges arrays - // and so would change references to labels and datasets, preventing data updates. - var data = config.data = config.data || {}; - data.datasets = data.datasets || []; - data.labels = data.labels || []; - - config.options = mergeConfig( - core_defaults.global, - core_defaults[config.type], - config.options || {}); - - return config; -} - -function updateConfig(chart) { - var newOptions = chart.options; - - helpers$1.each(chart.scales, function(scale) { - core_layouts.removeBox(chart, scale); - }); - - newOptions = mergeConfig( - core_defaults.global, - core_defaults[chart.config.type], - newOptions); - - chart.options = chart.config.options = newOptions; - chart.ensureScalesHaveIDs(); - chart.buildOrUpdateScales(); - - // Tooltip - chart.tooltip._options = newOptions.tooltips; - chart.tooltip.initialize(); -} - -function positionIsHorizontal(position) { - return position === 'top' || position === 'bottom'; -} - -var Chart = function(item, config) { - this.construct(item, config); - return this; -}; - -helpers$1.extend(Chart.prototype, /** @lends Chart */ { - /** - * @private - */ - construct: function(item, config) { - var me = this; - - config = initConfig(config); - - var context = platform.acquireContext(item, config); - var canvas = context && context.canvas; - var height = canvas && canvas.height; - var width = canvas && canvas.width; - - me.id = helpers$1.uid(); - me.ctx = context; - me.canvas = canvas; - me.config = config; - me.width = width; - me.height = height; - me.aspectRatio = height ? width / height : null; - me.options = config.options; - me._bufferedRender = false; - - /** - * Provided for backward compatibility, Chart and Chart.Controller have been merged, - * the "instance" still need to be defined since it might be called from plugins. - * @prop Chart#chart - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ - me.chart = me; - me.controller = me; // chart.chart.controller #inception - - // Add the chart instance to the global namespace - Chart.instances[me.id] = me; - - // Define alias to the config data: `chart.data === chart.config.data` - Object.defineProperty(me, 'data', { - get: function() { - return me.config.data; - }, - set: function(value) { - me.config.data = value; - } - }); - - if (!context || !canvas) { - // The given item is not a compatible context2d element, let's return before finalizing - // the chart initialization but after setting basic chart / controller properties that - // can help to figure out that the chart is not valid (e.g chart.canvas !== null); - // https://github.com/chartjs/Chart.js/issues/2807 - console.error("Failed to create chart: can't acquire context from the given item"); - return; - } - - me.initialize(); - me.update(); - }, - - /** - * @private - */ - initialize: function() { - var me = this; - - // Before init plugin notification - core_plugins.notify(me, 'beforeInit'); - - helpers$1.retinaScale(me, me.options.devicePixelRatio); - - me.bindEvents(); - - if (me.options.responsive) { - // Initial resize before chart draws (must be silent to preserve initial animations). - me.resize(true); - } - - // Make sure scales have IDs and are built before we build any controllers. - me.ensureScalesHaveIDs(); - me.buildOrUpdateScales(); - me.initToolTip(); - - // After init plugin notification - core_plugins.notify(me, 'afterInit'); - - return me; - }, - - clear: function() { - helpers$1.canvas.clear(this); - return this; - }, - - stop: function() { - // Stops any current animation loop occurring - core_animations.cancelAnimation(this); - return this; - }, - - resize: function(silent) { - var me = this; - var options = me.options; - var canvas = me.canvas; - var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; - - // the canvas render width and height will be casted to integers so make sure that - // the canvas display style uses the same integer values to avoid blurring effect. - - // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed - var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas))); - var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas))); - - if (me.width === newWidth && me.height === newHeight) { - return; - } - - canvas.width = me.width = newWidth; - canvas.height = me.height = newHeight; - canvas.style.width = newWidth + 'px'; - canvas.style.height = newHeight + 'px'; - - helpers$1.retinaScale(me, options.devicePixelRatio); - - if (!silent) { - // Notify any plugins about the resize - var newSize = {width: newWidth, height: newHeight}; - core_plugins.notify(me, 'resize', [newSize]); - - // Notify of resize - if (options.onResize) { - options.onResize(me, newSize); - } - - me.stop(); - me.update({ - duration: options.responsiveAnimationDuration - }); - } - }, - - ensureScalesHaveIDs: function() { - var options = this.options; - var scalesOptions = options.scales || {}; - var scaleOptions = options.scale; - - helpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) { - xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); - }); - - helpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) { - yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); - }); - - if (scaleOptions) { - scaleOptions.id = scaleOptions.id || 'scale'; - } - }, - - /** - * Builds a map of scale ID to scale object for future lookup. - */ - buildOrUpdateScales: function() { - var me = this; - var options = me.options; - var scales = me.scales || {}; - var items = []; - var updated = Object.keys(scales).reduce(function(obj, id) { - obj[id] = false; - return obj; - }, {}); - - if (options.scales) { - items = items.concat( - (options.scales.xAxes || []).map(function(xAxisOptions) { - return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; - }), - (options.scales.yAxes || []).map(function(yAxisOptions) { - return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; - }) - ); - } - - if (options.scale) { - items.push({ - options: options.scale, - dtype: 'radialLinear', - isDefault: true, - dposition: 'chartArea' - }); - } - - helpers$1.each(items, function(item) { - var scaleOptions = item.options; - var id = scaleOptions.id; - var scaleType = valueOrDefault$8(scaleOptions.type, item.dtype); - - if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { - scaleOptions.position = item.dposition; - } - - updated[id] = true; - var scale = null; - if (id in scales && scales[id].type === scaleType) { - scale = scales[id]; - scale.options = scaleOptions; - scale.ctx = me.ctx; - scale.chart = me; - } else { - var scaleClass = core_scaleService.getScaleConstructor(scaleType); - if (!scaleClass) { - return; - } - scale = new scaleClass({ - id: id, - type: scaleType, - options: scaleOptions, - ctx: me.ctx, - chart: me - }); - scales[scale.id] = scale; - } - - scale.mergeTicksOptions(); - - // TODO(SB): I think we should be able to remove this custom case (options.scale) - // and consider it as a regular scale part of the "scales"" map only! This would - // make the logic easier and remove some useless? custom code. - if (item.isDefault) { - me.scale = scale; - } - }); - // clear up discarded scales - helpers$1.each(updated, function(hasUpdated, id) { - if (!hasUpdated) { - delete scales[id]; - } - }); - - me.scales = scales; - - core_scaleService.addScalesToLayout(this); - }, - - buildOrUpdateControllers: function() { - var me = this; - var newControllers = []; - - helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { - var meta = me.getDatasetMeta(datasetIndex); - var type = dataset.type || me.config.type; - - if (meta.type && meta.type !== type) { - me.destroyDatasetMeta(datasetIndex); - meta = me.getDatasetMeta(datasetIndex); - } - meta.type = type; - - if (meta.controller) { - meta.controller.updateIndex(datasetIndex); - meta.controller.linkScales(); - } else { - var ControllerClass = controllers[meta.type]; - if (ControllerClass === undefined) { - throw new Error('"' + meta.type + '" is not a chart type.'); - } - - meta.controller = new ControllerClass(me, datasetIndex); - newControllers.push(meta.controller); - } - }, me); - - return newControllers; - }, - - /** - * Reset the elements of all datasets - * @private - */ - resetElements: function() { - var me = this; - helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { - me.getDatasetMeta(datasetIndex).controller.reset(); - }, me); - }, - - /** - * Resets the chart back to it's state before the initial animation - */ - reset: function() { - this.resetElements(); - this.tooltip.initialize(); - }, - - update: function(config) { - var me = this; - - if (!config || typeof config !== 'object') { - // backwards compatibility - config = { - duration: config, - lazy: arguments[1] - }; - } - - updateConfig(me); - - // plugins options references might have change, let's invalidate the cache - // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 - core_plugins._invalidate(me); - - if (core_plugins.notify(me, 'beforeUpdate') === false) { - return; - } - - // In case the entire data object changed - me.tooltip._data = me.data; - - // Make sure dataset controllers are updated and new controllers are reset - var newControllers = me.buildOrUpdateControllers(); - - // Make sure all dataset controllers have correct meta data counts - helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { - me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); - }, me); - - me.updateLayout(); - - // Can only reset the new controllers after the scales have been updated - if (me.options.animation && me.options.animation.duration) { - helpers$1.each(newControllers, function(controller) { - controller.reset(); - }); - } - - me.updateDatasets(); - - // Need to reset tooltip in case it is displayed with elements that are removed - // after update. - me.tooltip.initialize(); - - // Last active contains items that were previously in the tooltip. - // When we reset the tooltip, we need to clear it - me.lastActive = []; - - // Do this before render so that any plugins that need final scale updates can use it - core_plugins.notify(me, 'afterUpdate'); - - if (me._bufferedRender) { - me._bufferedRequest = { - duration: config.duration, - easing: config.easing, - lazy: config.lazy - }; - } else { - me.render(config); - } - }, - - /** - * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` - * hook, in which case, plugins will not be called on `afterLayout`. - * @private - */ - updateLayout: function() { - var me = this; - - if (core_plugins.notify(me, 'beforeLayout') === false) { - return; - } - - core_layouts.update(this, this.width, this.height); - - /** - * Provided for backward compatibility, use `afterLayout` instead. - * @method IPlugin#afterScaleUpdate - * @deprecated since version 2.5.0 - * @todo remove at version 3 - * @private - */ - core_plugins.notify(me, 'afterScaleUpdate'); - core_plugins.notify(me, 'afterLayout'); - }, - - /** - * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` - * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. - * @private - */ - updateDatasets: function() { - var me = this; - - if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) { - return; - } - - for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { - me.updateDataset(i); - } - - core_plugins.notify(me, 'afterDatasetsUpdate'); - }, - - /** - * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` - * hook, in which case, plugins will not be called on `afterDatasetUpdate`. - * @private - */ - updateDataset: function(index) { - var me = this; - var meta = me.getDatasetMeta(index); - var args = { - meta: meta, - index: index - }; - - if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { - return; - } - - meta.controller.update(); - - core_plugins.notify(me, 'afterDatasetUpdate', [args]); - }, - - render: function(config) { - var me = this; - - if (!config || typeof config !== 'object') { - // backwards compatibility - config = { - duration: config, - lazy: arguments[1] - }; - } - - var animationOptions = me.options.animation; - var duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration); - var lazy = config.lazy; - - if (core_plugins.notify(me, 'beforeRender') === false) { - return; - } - - var onComplete = function(animation) { - core_plugins.notify(me, 'afterRender'); - helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me); - }; - - if (animationOptions && duration) { - var animation = new core_animation({ - numSteps: duration / 16.66, // 60 fps - easing: config.easing || animationOptions.easing, - - render: function(chart, animationObject) { - var easingFunction = helpers$1.easing.effects[animationObject.easing]; - var currentStep = animationObject.currentStep; - var stepDecimal = currentStep / animationObject.numSteps; - - chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); - }, - - onAnimationProgress: animationOptions.onProgress, - onAnimationComplete: onComplete - }); - - core_animations.addAnimation(me, animation, duration, lazy); - } else { - me.draw(); - - // See https://github.com/chartjs/Chart.js/issues/3781 - onComplete(new core_animation({numSteps: 0, chart: me})); - } - - return me; - }, - - draw: function(easingValue) { - var me = this; - - me.clear(); - - if (helpers$1.isNullOrUndef(easingValue)) { - easingValue = 1; - } - - me.transition(easingValue); - - if (me.width <= 0 || me.height <= 0) { - return; - } - - if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) { - return; - } - - // Draw all the scales - helpers$1.each(me.boxes, function(box) { - box.draw(me.chartArea); - }, me); - - me.drawDatasets(easingValue); - me._drawTooltip(easingValue); - - core_plugins.notify(me, 'afterDraw', [easingValue]); - }, - - /** - * @private - */ - transition: function(easingValue) { - var me = this; - - for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { - if (me.isDatasetVisible(i)) { - me.getDatasetMeta(i).controller.transition(easingValue); - } - } - - me.tooltip.transition(easingValue); - }, - - /** - * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` - * hook, in which case, plugins will not be called on `afterDatasetsDraw`. - * @private - */ - drawDatasets: function(easingValue) { - var me = this; - - if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { - return; - } - - // Draw datasets reversed to support proper line stacking - for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { - if (me.isDatasetVisible(i)) { - me.drawDataset(i, easingValue); - } - } - - core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]); - }, - - /** - * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` - * hook, in which case, plugins will not be called on `afterDatasetDraw`. - * @private - */ - drawDataset: function(index, easingValue) { - var me = this; - var meta = me.getDatasetMeta(index); - var args = { - meta: meta, - index: index, - easingValue: easingValue - }; - - if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { - return; - } - - meta.controller.draw(easingValue); - - core_plugins.notify(me, 'afterDatasetDraw', [args]); - }, - - /** - * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` - * hook, in which case, plugins will not be called on `afterTooltipDraw`. - * @private - */ - _drawTooltip: function(easingValue) { - var me = this; - var tooltip = me.tooltip; - var args = { - tooltip: tooltip, - easingValue: easingValue - }; - - if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { - return; - } - - tooltip.draw(); - - core_plugins.notify(me, 'afterTooltipDraw', [args]); - }, - - /** - * Get the single element that was clicked on - * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw - */ - getElementAtEvent: function(e) { - return core_interaction.modes.single(this, e); - }, - - getElementsAtEvent: function(e) { - return core_interaction.modes.label(this, e, {intersect: true}); - }, - - getElementsAtXAxis: function(e) { - return core_interaction.modes['x-axis'](this, e, {intersect: true}); - }, - - getElementsAtEventForMode: function(e, mode, options) { - var method = core_interaction.modes[mode]; - if (typeof method === 'function') { - return method(this, e, options); - } - - return []; - }, - - getDatasetAtEvent: function(e) { - return core_interaction.modes.dataset(this, e, {intersect: true}); - }, - - getDatasetMeta: function(datasetIndex) { - var me = this; - var dataset = me.data.datasets[datasetIndex]; - if (!dataset._meta) { - dataset._meta = {}; - } - - var meta = dataset._meta[me.id]; - if (!meta) { - meta = dataset._meta[me.id] = { - type: null, - data: [], - dataset: null, - controller: null, - hidden: null, // See isDatasetVisible() comment - xAxisID: null, - yAxisID: null - }; - } - - return meta; - }, - - getVisibleDatasetCount: function() { - var count = 0; - for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { - if (this.isDatasetVisible(i)) { - count++; - } - } - return count; - }, - - isDatasetVisible: function(datasetIndex) { - var meta = this.getDatasetMeta(datasetIndex); - - // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, - // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. - return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; - }, - - generateLegend: function() { - return this.options.legendCallback(this); - }, - - /** - * @private - */ - destroyDatasetMeta: function(datasetIndex) { - var id = this.id; - var dataset = this.data.datasets[datasetIndex]; - var meta = dataset._meta && dataset._meta[id]; - - if (meta) { - meta.controller.destroy(); - delete dataset._meta[id]; - } - }, - - destroy: function() { - var me = this; - var canvas = me.canvas; - var i, ilen; - - me.stop(); - - // dataset controllers need to cleanup associated data - for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { - me.destroyDatasetMeta(i); - } - - if (canvas) { - me.unbindEvents(); - helpers$1.canvas.clear(me); - platform.releaseContext(me.ctx); - me.canvas = null; - me.ctx = null; - } - - core_plugins.notify(me, 'destroy'); - - delete Chart.instances[me.id]; - }, - - toBase64Image: function() { - return this.canvas.toDataURL.apply(this.canvas, arguments); - }, - - initToolTip: function() { - var me = this; - me.tooltip = new core_tooltip({ - _chart: me, - _chartInstance: me, // deprecated, backward compatibility - _data: me.data, - _options: me.options.tooltips - }, me); - }, - - /** - * @private - */ - bindEvents: function() { - var me = this; - var listeners = me._listeners = {}; - var listener = function() { - me.eventHandler.apply(me, arguments); - }; - - helpers$1.each(me.options.events, function(type) { - platform.addEventListener(me, type, listener); - listeners[type] = listener; - }); - - // Elements used to detect size change should not be injected for non responsive charts. - // See https://github.com/chartjs/Chart.js/issues/2210 - if (me.options.responsive) { - listener = function() { - me.resize(); - }; - - platform.addEventListener(me, 'resize', listener); - listeners.resize = listener; - } - }, - - /** - * @private - */ - unbindEvents: function() { - var me = this; - var listeners = me._listeners; - if (!listeners) { - return; - } - - delete me._listeners; - helpers$1.each(listeners, function(listener, type) { - platform.removeEventListener(me, type, listener); - }); - }, - - updateHoverStyle: function(elements, mode, enabled) { - var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; - var element, i, ilen; - - for (i = 0, ilen = elements.length; i < ilen; ++i) { - element = elements[i]; - if (element) { - this.getDatasetMeta(element._datasetIndex).controller[method](element); - } - } - }, - - /** - * @private - */ - eventHandler: function(e) { - var me = this; - var tooltip = me.tooltip; - - if (core_plugins.notify(me, 'beforeEvent', [e]) === false) { - return; - } - - // Buffer any update calls so that renders do not occur - me._bufferedRender = true; - me._bufferedRequest = null; - - var changed = me.handleEvent(e); - // for smooth tooltip animations issue #4989 - // the tooltip should be the source of change - // Animation check workaround: - // tooltip._start will be null when tooltip isn't animating - if (tooltip) { - changed = tooltip._start - ? tooltip.handleEvent(e) - : changed | tooltip.handleEvent(e); - } - - core_plugins.notify(me, 'afterEvent', [e]); - - var bufferedRequest = me._bufferedRequest; - if (bufferedRequest) { - // If we have an update that was triggered, we need to do a normal render - me.render(bufferedRequest); - } else if (changed && !me.animating) { - // If entering, leaving, or changing elements, animate the change via pivot - me.stop(); - - // We only need to render at this point. Updating will cause scales to be - // recomputed generating flicker & using more memory than necessary. - me.render({ - duration: me.options.hover.animationDuration, - lazy: true - }); - } - - me._bufferedRender = false; - me._bufferedRequest = null; - - return me; - }, - - /** - * Handle an event - * @private - * @param {IEvent} event the event to handle - * @return {boolean} true if the chart needs to re-render - */ - handleEvent: function(e) { - var me = this; - var options = me.options || {}; - var hoverOptions = options.hover; - var changed = false; - - me.lastActive = me.lastActive || []; - - // Find Active Elements for hover and tooltips - if (e.type === 'mouseout') { - me.active = []; - } else { - me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); - } - - // Invoke onHover hook - // Need to call with native event here to not break backwards compatibility - helpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); - - if (e.type === 'mouseup' || e.type === 'click') { - if (options.onClick) { - // Use e.native here for backwards compatibility - options.onClick.call(me, e.native, me.active); - } - } - - // Remove styling for last active (even if it may still be active) - if (me.lastActive.length) { - me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); - } - - // Built in hover styling - if (me.active.length && hoverOptions.mode) { - me.updateHoverStyle(me.active, hoverOptions.mode, true); - } - - changed = !helpers$1.arrayEquals(me.active, me.lastActive); - - // Remember Last Actives - me.lastActive = me.active; - - return changed; - } -}); - -/** - * NOTE(SB) We actually don't use this container anymore but we need to keep it - * for backward compatibility. Though, it can still be useful for plugins that - * would need to work on multiple charts?! - */ -Chart.instances = {}; - -var core_controller = Chart; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart instead. - * @class Chart.Controller - * @deprecated since version 2.6 - * @todo remove at version 3 - * @private - */ -Chart.Controller = Chart; - -/** - * Provided for backward compatibility, not available anymore. - * @namespace Chart - * @deprecated since version 2.8 - * @todo remove at version 3 - * @private - */ -Chart.types = {}; - -/** - * Provided for backward compatibility, not available anymore. - * @namespace Chart.helpers.configMerge - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ -helpers$1.configMerge = mergeConfig; - -/** - * Provided for backward compatibility, not available anymore. - * @namespace Chart.helpers.scaleMerge - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ -helpers$1.scaleMerge = mergeScaleConfig; - -var core_helpers = function() { - - // -- Basic js utility methods - - helpers$1.where = function(collection, filterCallback) { - if (helpers$1.isArray(collection) && Array.prototype.filter) { - return collection.filter(filterCallback); - } - var filtered = []; - - helpers$1.each(collection, function(item) { - if (filterCallback(item)) { - filtered.push(item); - } - }); - - return filtered; - }; - helpers$1.findIndex = Array.prototype.findIndex ? - function(array, callback, scope) { - return array.findIndex(callback, scope); - } : - function(array, callback, scope) { - scope = scope === undefined ? array : scope; - for (var i = 0, ilen = array.length; i < ilen; ++i) { - if (callback.call(scope, array[i], i, array)) { - return i; - } - } - return -1; - }; - helpers$1.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { - // Default to start of the array - if (helpers$1.isNullOrUndef(startIndex)) { - startIndex = -1; - } - for (var i = startIndex + 1; i < arrayToSearch.length; i++) { - var currentItem = arrayToSearch[i]; - if (filterCallback(currentItem)) { - return currentItem; - } - } - }; - helpers$1.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { - // Default to end of the array - if (helpers$1.isNullOrUndef(startIndex)) { - startIndex = arrayToSearch.length; - } - for (var i = startIndex - 1; i >= 0; i--) { - var currentItem = arrayToSearch[i]; - if (filterCallback(currentItem)) { - return currentItem; - } - } - }; - - // -- Math methods - helpers$1.isNumber = function(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - }; - helpers$1.almostEquals = function(x, y, epsilon) { - return Math.abs(x - y) < epsilon; - }; - helpers$1.almostWhole = function(x, epsilon) { - var rounded = Math.round(x); - return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); - }; - helpers$1.max = function(array) { - return array.reduce(function(max, value) { - if (!isNaN(value)) { - return Math.max(max, value); - } - return max; - }, Number.NEGATIVE_INFINITY); - }; - helpers$1.min = function(array) { - return array.reduce(function(min, value) { - if (!isNaN(value)) { - return Math.min(min, value); - } - return min; - }, Number.POSITIVE_INFINITY); - }; - helpers$1.sign = Math.sign ? - function(x) { - return Math.sign(x); - } : - function(x) { - x = +x; // convert to a number - if (x === 0 || isNaN(x)) { - return x; - } - return x > 0 ? 1 : -1; - }; - helpers$1.log10 = Math.log10 ? - function(x) { - return Math.log10(x); - } : - function(x) { - var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. - // Check for whole powers of 10, - // which due to floating point rounding error should be corrected. - var powerOf10 = Math.round(exponent); - var isPowerOf10 = x === Math.pow(10, powerOf10); - - return isPowerOf10 ? powerOf10 : exponent; - }; - helpers$1.toRadians = function(degrees) { - return degrees * (Math.PI / 180); - }; - helpers$1.toDegrees = function(radians) { - return radians * (180 / Math.PI); - }; - - /** - * Returns the number of decimal places - * i.e. the number of digits after the decimal point, of the value of this Number. - * @param {number} x - A number. - * @returns {number} The number of decimal places. - * @private - */ - helpers$1._decimalPlaces = function(x) { - if (!helpers$1.isFinite(x)) { - return; - } - var e = 1; - var p = 0; - while (Math.round(x * e) / e !== x) { - e *= 10; - p++; - } - return p; - }; - - // Gets the angle from vertical upright to the point about a centre. - helpers$1.getAngleFromPoint = function(centrePoint, anglePoint) { - var distanceFromXCenter = anglePoint.x - centrePoint.x; - var distanceFromYCenter = anglePoint.y - centrePoint.y; - var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); - - var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); - - if (angle < (-0.5 * Math.PI)) { - angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] - } - - return { - angle: angle, - distance: radialDistanceFromCenter - }; - }; - helpers$1.distanceBetweenPoints = function(pt1, pt2) { - return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); - }; - - /** - * Provided for backward compatibility, not available anymore - * @function Chart.helpers.aliasPixel - * @deprecated since version 2.8.0 - * @todo remove at version 3 - */ - helpers$1.aliasPixel = function(pixelWidth) { - return (pixelWidth % 2 === 0) ? 0 : 0.5; - }; - - /** - * Returns the aligned pixel value to avoid anti-aliasing blur - * @param {Chart} chart - The chart instance. - * @param {number} pixel - A pixel value. - * @param {number} width - The width of the element. - * @returns {number} The aligned pixel value. - * @private - */ - helpers$1._alignPixel = function(chart, pixel, width) { - var devicePixelRatio = chart.currentDevicePixelRatio; - var halfWidth = width / 2; - return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; - }; - - helpers$1.splineCurve = function(firstPoint, middlePoint, afterPoint, t) { - // Props to Rob Spencer at scaled innovation for his post on splining between points - // http://scaledinnovation.com/analytics/splines/aboutSplines.html - - // This function must also respect "skipped" points - - var previous = firstPoint.skip ? middlePoint : firstPoint; - var current = middlePoint; - var next = afterPoint.skip ? middlePoint : afterPoint; - - var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); - var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); - - var s01 = d01 / (d01 + d12); - var s12 = d12 / (d01 + d12); - - // If all points are the same, s01 & s02 will be inf - s01 = isNaN(s01) ? 0 : s01; - s12 = isNaN(s12) ? 0 : s12; - - var fa = t * s01; // scaling factor for triangle Ta - var fb = t * s12; - - return { - previous: { - x: current.x - fa * (next.x - previous.x), - y: current.y - fa * (next.y - previous.y) - }, - next: { - x: current.x + fb * (next.x - previous.x), - y: current.y + fb * (next.y - previous.y) - } - }; - }; - helpers$1.EPSILON = Number.EPSILON || 1e-14; - helpers$1.splineCurveMonotone = function(points) { - // This function calculates Bézier control points in a similar way than |splineCurve|, - // but preserves monotonicity of the provided data and ensures no local extremums are added - // between the dataset discrete points due to the interpolation. - // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation - - var pointsWithTangents = (points || []).map(function(point) { - return { - model: point._model, - deltaK: 0, - mK: 0 - }; - }); - - // Calculate slopes (deltaK) and initialize tangents (mK) - var pointsLen = pointsWithTangents.length; - var i, pointBefore, pointCurrent, pointAfter; - for (i = 0; i < pointsLen; ++i) { - pointCurrent = pointsWithTangents[i]; - if (pointCurrent.model.skip) { - continue; - } - - pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; - pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; - if (pointAfter && !pointAfter.model.skip) { - var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); - - // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 - pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; - } - - if (!pointBefore || pointBefore.model.skip) { - pointCurrent.mK = pointCurrent.deltaK; - } else if (!pointAfter || pointAfter.model.skip) { - pointCurrent.mK = pointBefore.deltaK; - } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { - pointCurrent.mK = 0; - } else { - pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; - } - } - - // Adjust tangents to ensure monotonic properties - var alphaK, betaK, tauK, squaredMagnitude; - for (i = 0; i < pointsLen - 1; ++i) { - pointCurrent = pointsWithTangents[i]; - pointAfter = pointsWithTangents[i + 1]; - if (pointCurrent.model.skip || pointAfter.model.skip) { - continue; - } - - if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { - pointCurrent.mK = pointAfter.mK = 0; - continue; - } - - alphaK = pointCurrent.mK / pointCurrent.deltaK; - betaK = pointAfter.mK / pointCurrent.deltaK; - squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); - if (squaredMagnitude <= 9) { - continue; - } - - tauK = 3 / Math.sqrt(squaredMagnitude); - pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; - pointAfter.mK = betaK * tauK * pointCurrent.deltaK; - } - - // Compute control points - var deltaX; - for (i = 0; i < pointsLen; ++i) { - pointCurrent = pointsWithTangents[i]; - if (pointCurrent.model.skip) { - continue; - } - - pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; - pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; - if (pointBefore && !pointBefore.model.skip) { - deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; - pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; - pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; - } - if (pointAfter && !pointAfter.model.skip) { - deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; - pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; - pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; - } - } - }; - helpers$1.nextItem = function(collection, index, loop) { - if (loop) { - return index >= collection.length - 1 ? collection[0] : collection[index + 1]; - } - return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; - }; - helpers$1.previousItem = function(collection, index, loop) { - if (loop) { - return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; - } - return index <= 0 ? collection[0] : collection[index - 1]; - }; - // Implementation of the nice number algorithm used in determining where axis labels will go - helpers$1.niceNum = function(range, round) { - var exponent = Math.floor(helpers$1.log10(range)); - var fraction = range / Math.pow(10, exponent); - var niceFraction; - - if (round) { - if (fraction < 1.5) { - niceFraction = 1; - } else if (fraction < 3) { - niceFraction = 2; - } else if (fraction < 7) { - niceFraction = 5; - } else { - niceFraction = 10; - } - } else if (fraction <= 1.0) { - niceFraction = 1; - } else if (fraction <= 2) { - niceFraction = 2; - } else if (fraction <= 5) { - niceFraction = 5; - } else { - niceFraction = 10; - } - - return niceFraction * Math.pow(10, exponent); - }; - // Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ - helpers$1.requestAnimFrame = (function() { - if (typeof window === 'undefined') { - return function(callback) { - callback(); - }; - } - return window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || - function(callback) { - return window.setTimeout(callback, 1000 / 60); - }; - }()); - // -- DOM methods - helpers$1.getRelativePosition = function(evt, chart) { - var mouseX, mouseY; - var e = evt.originalEvent || evt; - var canvas = evt.target || evt.srcElement; - var boundingRect = canvas.getBoundingClientRect(); - - var touches = e.touches; - if (touches && touches.length > 0) { - mouseX = touches[0].clientX; - mouseY = touches[0].clientY; - - } else { - mouseX = e.clientX; - mouseY = e.clientY; - } - - // Scale mouse coordinates into canvas coordinates - // by following the pattern laid out by 'jerryj' in the comments of - // https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ - var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left')); - var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top')); - var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right')); - var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom')); - var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; - var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; - - // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However - // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here - mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); - mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); - - return { - x: mouseX, - y: mouseY - }; - - }; - - // Private helper function to convert max-width/max-height values that may be percentages into a number - function parseMaxStyle(styleValue, node, parentProperty) { - var valueInPixels; - if (typeof styleValue === 'string') { - valueInPixels = parseInt(styleValue, 10); - - if (styleValue.indexOf('%') !== -1) { - // percentage * size in dimension - valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; - } - } else { - valueInPixels = styleValue; - } - - return valueInPixels; - } - - /** - * Returns if the given value contains an effective constraint. - * @private - */ - function isConstrainedValue(value) { - return value !== undefined && value !== null && value !== 'none'; - } - - /** - * Returns the max width or height of the given DOM node in a cross-browser compatible fashion - * @param {HTMLElement} domNode - the node to check the constraint on - * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height') - * @param {string} percentageProperty - property of parent to use when calculating width as a percentage - * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser} - */ - function getConstraintDimension(domNode, maxStyle, percentageProperty) { - var view = document.defaultView; - var parentNode = helpers$1._getParentNode(domNode); - var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; - var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; - var hasCNode = isConstrainedValue(constrainedNode); - var hasCContainer = isConstrainedValue(constrainedContainer); - var infinity = Number.POSITIVE_INFINITY; - - if (hasCNode || hasCContainer) { - return Math.min( - hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, - hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); - } - - return 'none'; - } - // returns Number or undefined if no constraint - helpers$1.getConstraintWidth = function(domNode) { - return getConstraintDimension(domNode, 'max-width', 'clientWidth'); - }; - // returns Number or undefined if no constraint - helpers$1.getConstraintHeight = function(domNode) { - return getConstraintDimension(domNode, 'max-height', 'clientHeight'); - }; - /** - * @private - */ - helpers$1._calculatePadding = function(container, padding, parentDimension) { - padding = helpers$1.getStyle(container, padding); - - return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10); - }; - /** - * @private - */ - helpers$1._getParentNode = function(domNode) { - var parent = domNode.parentNode; - if (parent && parent.toString() === '[object ShadowRoot]') { - parent = parent.host; - } - return parent; - }; - helpers$1.getMaximumWidth = function(domNode) { - var container = helpers$1._getParentNode(domNode); - if (!container) { - return domNode.clientWidth; - } - - var clientWidth = container.clientWidth; - var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth); - var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth); - - var w = clientWidth - paddingLeft - paddingRight; - var cw = helpers$1.getConstraintWidth(domNode); - return isNaN(cw) ? w : Math.min(w, cw); - }; - helpers$1.getMaximumHeight = function(domNode) { - var container = helpers$1._getParentNode(domNode); - if (!container) { - return domNode.clientHeight; - } - - var clientHeight = container.clientHeight; - var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight); - var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight); - - var h = clientHeight - paddingTop - paddingBottom; - var ch = helpers$1.getConstraintHeight(domNode); - return isNaN(ch) ? h : Math.min(h, ch); - }; - helpers$1.getStyle = function(el, property) { - return el.currentStyle ? - el.currentStyle[property] : - document.defaultView.getComputedStyle(el, null).getPropertyValue(property); - }; - helpers$1.retinaScale = function(chart, forceRatio) { - var pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && window.devicePixelRatio) || 1; - if (pixelRatio === 1) { - return; - } - - var canvas = chart.canvas; - var height = chart.height; - var width = chart.width; - - canvas.height = height * pixelRatio; - canvas.width = width * pixelRatio; - chart.ctx.scale(pixelRatio, pixelRatio); - - // If no style has been set on the canvas, the render size is used as display size, - // making the chart visually bigger, so let's enforce it to the "correct" values. - // See https://github.com/chartjs/Chart.js/issues/3575 - if (!canvas.style.height && !canvas.style.width) { - canvas.style.height = height + 'px'; - canvas.style.width = width + 'px'; - } - }; - // -- Canvas methods - helpers$1.fontString = function(pixelSize, fontStyle, fontFamily) { - return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; - }; - helpers$1.longestText = function(ctx, font, arrayOfThings, cache) { - cache = cache || {}; - var data = cache.data = cache.data || {}; - var gc = cache.garbageCollect = cache.garbageCollect || []; - - if (cache.font !== font) { - data = cache.data = {}; - gc = cache.garbageCollect = []; - cache.font = font; - } - - ctx.font = font; - var longest = 0; - helpers$1.each(arrayOfThings, function(thing) { - // Undefined strings and arrays should not be measured - if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) { - longest = helpers$1.measureText(ctx, data, gc, longest, thing); - } else if (helpers$1.isArray(thing)) { - // if it is an array lets measure each element - // to do maybe simplify this function a bit so we can do this more recursively? - helpers$1.each(thing, function(nestedThing) { - // Undefined strings and arrays should not be measured - if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) { - longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing); - } - }); - } - }); - - var gcLen = gc.length / 2; - if (gcLen > arrayOfThings.length) { - for (var i = 0; i < gcLen; i++) { - delete data[gc[i]]; - } - gc.splice(0, gcLen); - } - return longest; - }; - helpers$1.measureText = function(ctx, data, gc, longest, string) { - var textWidth = data[string]; - if (!textWidth) { - textWidth = data[string] = ctx.measureText(string).width; - gc.push(string); - } - if (textWidth > longest) { - longest = textWidth; - } - return longest; - }; - helpers$1.numberOfLabelLines = function(arrayOfThings) { - var numberOfLines = 1; - helpers$1.each(arrayOfThings, function(thing) { - if (helpers$1.isArray(thing)) { - if (thing.length > numberOfLines) { - numberOfLines = thing.length; - } - } - }); - return numberOfLines; - }; - - helpers$1.color = !chartjsColor ? - function(value) { - console.error('Color.js not found!'); - return value; - } : - function(value) { - /* global CanvasGradient */ - if (value instanceof CanvasGradient) { - value = core_defaults.global.defaultColor; - } - - return chartjsColor(value); - }; - - helpers$1.getHoverColor = function(colorValue) { - /* global CanvasPattern */ - return (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ? - colorValue : - helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString(); - }; -}; - -function abstract() { - throw new Error( - 'This method is not implemented: either no adapter can ' + - 'be found or an incomplete integration was provided.' - ); -} - -/** - * Date adapter (current used by the time scale) - * @namespace Chart._adapters._date - * @memberof Chart._adapters - * @private - */ - -/** - * Currently supported unit string values. - * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')} - * @memberof Chart._adapters._date - * @name Unit - */ - -/** - * @class - */ -function DateAdapter(options) { - this.options = options || {}; -} - -helpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */ { - /** - * Returns a map of time formats for the supported formatting units defined - * in Unit as well as 'datetime' representing a detailed date/time string. - * @returns {{string: string}} - */ - formats: abstract, - - /** - * Parses the given `value` and return the associated timestamp. - * @param {any} value - the value to parse (usually comes from the data) - * @param {string} [format] - the expected data format - * @returns {(number|null)} - * @function - */ - parse: abstract, - - /** - * Returns the formatted date in the specified `format` for a given `timestamp`. - * @param {number} timestamp - the timestamp to format - * @param {string} format - the date/time token - * @return {string} - * @function - */ - format: abstract, - - /** - * Adds the specified `amount` of `unit` to the given `timestamp`. - * @param {number} timestamp - the input timestamp - * @param {number} amount - the amount to add - * @param {Unit} unit - the unit as string - * @return {number} - * @function - */ - add: abstract, - - /** - * Returns the number of `unit` between the given timestamps. - * @param {number} max - the input timestamp (reference) - * @param {number} min - the timestamp to substract - * @param {Unit} unit - the unit as string - * @return {number} - * @function - */ - diff: abstract, - - /** - * Returns start of `unit` for the given `timestamp`. - * @param {number} timestamp - the input timestamp - * @param {Unit} unit - the unit as string - * @param {number} [weekday] - the ISO day of the week with 1 being Monday - * and 7 being Sunday (only needed if param *unit* is `isoWeek`). - * @function - */ - startOf: abstract, - - /** - * Returns end of `unit` for the given `timestamp`. - * @param {number} timestamp - the input timestamp - * @param {Unit} unit - the unit as string - * @function - */ - endOf: abstract, - - // DEPRECATIONS - - /** - * Provided for backward compatibility for scale.getValueForPixel(), - * this method should be overridden only by the moment adapter. - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ - _create: function(value) { - return value; - } -}); - -DateAdapter.override = function(members) { - helpers$1.extend(DateAdapter.prototype, members); -}; - -var _date = DateAdapter; - -var core_adapters = { - _date: _date -}; - -/** - * Namespace to hold static tick generation functions - * @namespace Chart.Ticks - */ -var core_ticks = { - /** - * Namespace to hold formatters for different types of ticks - * @namespace Chart.Ticks.formatters - */ - formatters: { - /** - * Formatter for value labels - * @method Chart.Ticks.formatters.values - * @param value the value to display - * @return {string|string[]} the label to display - */ - values: function(value) { - return helpers$1.isArray(value) ? value : '' + value; - }, - - /** - * Formatter for linear numeric ticks - * @method Chart.Ticks.formatters.linear - * @param tickValue {number} the value to be formatted - * @param index {number} the position of the tickValue parameter in the ticks array - * @param ticks {number[]} the list of ticks being converted - * @return {string} string representation of the tickValue parameter - */ - linear: function(tickValue, index, ticks) { - // If we have lots of ticks, don't use the ones - var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; - - // If we have a number like 2.5 as the delta, figure out how many decimal places we need - if (Math.abs(delta) > 1) { - if (tickValue !== Math.floor(tickValue)) { - // not an integer - delta = tickValue - Math.floor(tickValue); - } - } - - var logDelta = helpers$1.log10(Math.abs(delta)); - var tickString = ''; - - if (tickValue !== 0) { - var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1])); - if (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation - var logTick = helpers$1.log10(Math.abs(tickValue)); - tickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta)); - } else { - var numDecimal = -1 * Math.floor(logDelta); - numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places - tickString = tickValue.toFixed(numDecimal); - } - } else { - tickString = '0'; // never show decimal places for 0 - } - - return tickString; - }, - - logarithmic: function(tickValue, index, ticks) { - var remain = tickValue / (Math.pow(10, Math.floor(helpers$1.log10(tickValue)))); - - if (tickValue === 0) { - return '0'; - } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { - return tickValue.toExponential(); - } - return ''; - } - } -}; - -var valueOrDefault$9 = helpers$1.valueOrDefault; -var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault; - -core_defaults._set('scale', { - display: true, - position: 'left', - offset: false, - - // grid line settings - gridLines: { - display: true, - color: 'rgba(0, 0, 0, 0.1)', - lineWidth: 1, - drawBorder: true, - drawOnChartArea: true, - drawTicks: true, - tickMarkLength: 10, - zeroLineWidth: 1, - zeroLineColor: 'rgba(0,0,0,0.25)', - zeroLineBorderDash: [], - zeroLineBorderDashOffset: 0.0, - offsetGridLines: false, - borderDash: [], - borderDashOffset: 0.0 - }, - - // scale label - scaleLabel: { - // display property - display: false, - - // actual label - labelString: '', - - // top/bottom padding - padding: { - top: 4, - bottom: 4 - } - }, - - // label settings - ticks: { - beginAtZero: false, - minRotation: 0, - maxRotation: 50, - mirror: false, - padding: 0, - reverse: false, - display: true, - autoSkip: true, - autoSkipPadding: 0, - labelOffset: 0, - // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. - callback: core_ticks.formatters.values, - minor: {}, - major: {} - } -}); - -function labelsFromTicks(ticks) { - var labels = []; - var i, ilen; - - for (i = 0, ilen = ticks.length; i < ilen; ++i) { - labels.push(ticks[i].label); - } - - return labels; -} - -function getPixelForGridLine(scale, index, offsetGridLines) { - var lineValue = scale.getPixelForTick(index); - - if (offsetGridLines) { - if (scale.getTicks().length === 1) { - lineValue -= scale.isHorizontal() ? - Math.max(lineValue - scale.left, scale.right - lineValue) : - Math.max(lineValue - scale.top, scale.bottom - lineValue); - } else if (index === 0) { - lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; - } else { - lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; - } - } - return lineValue; -} - -function computeTextSize(context, tick, font) { - return helpers$1.isArray(tick) ? - helpers$1.longestText(context, font, tick) : - context.measureText(tick).width; -} - -var core_scale = core_element.extend({ - /** - * Get the padding needed for the scale - * @method getPadding - * @private - * @returns {Padding} the necessary padding - */ - getPadding: function() { - var me = this; - return { - left: me.paddingLeft || 0, - top: me.paddingTop || 0, - right: me.paddingRight || 0, - bottom: me.paddingBottom || 0 - }; - }, - - /** - * Returns the scale tick objects ({label, major}) - * @since 2.7 - */ - getTicks: function() { - return this._ticks; - }, - - // These methods are ordered by lifecyle. Utilities then follow. - // Any function defined here is inherited by all scale types. - // Any function can be extended by the scale type - - mergeTicksOptions: function() { - var ticks = this.options.ticks; - if (ticks.minor === false) { - ticks.minor = { - display: false - }; - } - if (ticks.major === false) { - ticks.major = { - display: false - }; - } - for (var key in ticks) { - if (key !== 'major' && key !== 'minor') { - if (typeof ticks.minor[key] === 'undefined') { - ticks.minor[key] = ticks[key]; - } - if (typeof ticks.major[key] === 'undefined') { - ticks.major[key] = ticks[key]; - } - } - } - }, - beforeUpdate: function() { - helpers$1.callback(this.options.beforeUpdate, [this]); - }, - - update: function(maxWidth, maxHeight, margins) { - var me = this; - var i, ilen, labels, label, ticks, tick; - - // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) - me.beforeUpdate(); - - // Absorb the master measurements - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me.margins = helpers$1.extend({ - left: 0, - right: 0, - top: 0, - bottom: 0 - }, margins); - - me._maxLabelLines = 0; - me.longestLabelWidth = 0; - me.longestTextCache = me.longestTextCache || {}; - - // Dimensions - me.beforeSetDimensions(); - me.setDimensions(); - me.afterSetDimensions(); - - // Data min/max - me.beforeDataLimits(); - me.determineDataLimits(); - me.afterDataLimits(); - - // Ticks - `this.ticks` is now DEPRECATED! - // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member - // and must not be accessed directly from outside this class. `this.ticks` being - // around for long time and not marked as private, we can't change its structure - // without unexpected breaking changes. If you need to access the scale ticks, - // use scale.getTicks() instead. - - me.beforeBuildTicks(); - - // New implementations should return an array of objects but for BACKWARD COMPAT, - // we still support no return (`this.ticks` internally set by calling this method). - ticks = me.buildTicks() || []; - - // Allow modification of ticks in callback. - ticks = me.afterBuildTicks(ticks) || ticks; - - me.beforeTickToLabelConversion(); - - // New implementations should return the formatted tick labels but for BACKWARD - // COMPAT, we still support no return (`this.ticks` internally changed by calling - // this method and supposed to contain only string values). - labels = me.convertTicksToLabels(ticks) || me.ticks; - - me.afterTickToLabelConversion(); - - me.ticks = labels; // BACKWARD COMPATIBILITY - - // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! - - // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) - for (i = 0, ilen = labels.length; i < ilen; ++i) { - label = labels[i]; - tick = ticks[i]; - if (!tick) { - ticks.push(tick = { - label: label, - major: false - }); - } else { - tick.label = label; - } - } - - me._ticks = ticks; - - // Tick Rotation - me.beforeCalculateTickRotation(); - me.calculateTickRotation(); - me.afterCalculateTickRotation(); - // Fit - me.beforeFit(); - me.fit(); - me.afterFit(); - // - me.afterUpdate(); - - return me.minSize; - - }, - afterUpdate: function() { - helpers$1.callback(this.options.afterUpdate, [this]); - }, - - // - - beforeSetDimensions: function() { - helpers$1.callback(this.options.beforeSetDimensions, [this]); - }, - setDimensions: function() { - var me = this; - // Set the unconstrained dimension before label rotation - if (me.isHorizontal()) { - // Reset position before calculating rotation - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; - } else { - me.height = me.maxHeight; - - // Reset position before calculating rotation - me.top = 0; - me.bottom = me.height; - } - - // Reset padding - me.paddingLeft = 0; - me.paddingTop = 0; - me.paddingRight = 0; - me.paddingBottom = 0; - }, - afterSetDimensions: function() { - helpers$1.callback(this.options.afterSetDimensions, [this]); - }, - - // Data limits - beforeDataLimits: function() { - helpers$1.callback(this.options.beforeDataLimits, [this]); - }, - determineDataLimits: helpers$1.noop, - afterDataLimits: function() { - helpers$1.callback(this.options.afterDataLimits, [this]); - }, - - // - beforeBuildTicks: function() { - helpers$1.callback(this.options.beforeBuildTicks, [this]); - }, - buildTicks: helpers$1.noop, - afterBuildTicks: function(ticks) { - var me = this; - // ticks is empty for old axis implementations here - if (helpers$1.isArray(ticks) && ticks.length) { - return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]); - } - // Support old implementations (that modified `this.ticks` directly in buildTicks) - me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks; - return ticks; - }, - - beforeTickToLabelConversion: function() { - helpers$1.callback(this.options.beforeTickToLabelConversion, [this]); - }, - convertTicksToLabels: function() { - var me = this; - // Convert ticks to strings - var tickOpts = me.options.ticks; - me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); - }, - afterTickToLabelConversion: function() { - helpers$1.callback(this.options.afterTickToLabelConversion, [this]); - }, - - // - - beforeCalculateTickRotation: function() { - helpers$1.callback(this.options.beforeCalculateTickRotation, [this]); - }, - calculateTickRotation: function() { - var me = this; - var context = me.ctx; - var tickOpts = me.options.ticks; - var labels = labelsFromTicks(me._ticks); - - // Get the width of each grid by calculating the difference - // between x offsets between 0 and 1. - var tickFont = helpers$1.options._parseFont(tickOpts); - context.font = tickFont.string; - - var labelRotation = tickOpts.minRotation || 0; - - if (labels.length && me.options.display && me.isHorizontal()) { - var originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache); - var labelWidth = originalLabelWidth; - var cosRotation, sinRotation; - - // Allow 3 pixels x2 padding either side for label readability - var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; - - // Max label rotation can be set or default to 90 - also act as a loop counter - while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { - var angleRadians = helpers$1.toRadians(labelRotation); - cosRotation = Math.cos(angleRadians); - sinRotation = Math.sin(angleRadians); - - if (sinRotation * originalLabelWidth > me.maxHeight) { - // go back one step - labelRotation--; - break; - } - - labelRotation++; - labelWidth = cosRotation * originalLabelWidth; - } - } - - me.labelRotation = labelRotation; - }, - afterCalculateTickRotation: function() { - helpers$1.callback(this.options.afterCalculateTickRotation, [this]); - }, - - // - - beforeFit: function() { - helpers$1.callback(this.options.beforeFit, [this]); - }, - fit: function() { - var me = this; - // Reset - var minSize = me.minSize = { - width: 0, - height: 0 - }; - - var labels = labelsFromTicks(me._ticks); - - var opts = me.options; - var tickOpts = opts.ticks; - var scaleLabelOpts = opts.scaleLabel; - var gridLineOpts = opts.gridLines; - var display = me._isVisible(); - var position = opts.position; - var isHorizontal = me.isHorizontal(); - - var parseFont = helpers$1.options._parseFont; - var tickFont = parseFont(tickOpts); - var tickMarkLength = opts.gridLines.tickMarkLength; - - // Width - if (isHorizontal) { - // subtract the margins to line up with the chartArea if we are a full width scale - minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; - } else { - minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; - } - - // height - if (isHorizontal) { - minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; - } else { - minSize.height = me.maxHeight; // fill all the height - } - - // Are we showing a title for the scale? - if (scaleLabelOpts.display && display) { - var scaleLabelFont = parseFont(scaleLabelOpts); - var scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding); - var deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height; - - if (isHorizontal) { - minSize.height += deltaHeight; - } else { - minSize.width += deltaHeight; - } - } - - // Don't bother fitting the ticks if we are not showing the labels - if (tickOpts.display && display) { - var largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache); - var tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels); - var lineSpace = tickFont.size * 0.5; - var tickPadding = me.options.ticks.padding; - - // Store max number of lines and widest label for _autoSkip - me._maxLabelLines = tallestLabelHeightInLines; - me.longestLabelWidth = largestTextWidth; - - if (isHorizontal) { - var angleRadians = helpers$1.toRadians(me.labelRotation); - var cosRotation = Math.cos(angleRadians); - var sinRotation = Math.sin(angleRadians); - - // TODO - improve this calculation - var labelHeight = (sinRotation * largestTextWidth) - + (tickFont.lineHeight * tallestLabelHeightInLines) - + lineSpace; // padding - - minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); - - me.ctx.font = tickFont.string; - var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string); - var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string); - var offsetLeft = me.getPixelForTick(0) - me.left; - var offsetRight = me.right - me.getPixelForTick(labels.length - 1); - var paddingLeft, paddingRight; - - // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned - // which means that the right padding is dominated by the font height - if (me.labelRotation !== 0) { - paddingLeft = position === 'bottom' ? (cosRotation * firstLabelWidth) : (cosRotation * lineSpace); - paddingRight = position === 'bottom' ? (cosRotation * lineSpace) : (cosRotation * lastLabelWidth); - } else { - paddingLeft = firstLabelWidth / 2; - paddingRight = lastLabelWidth / 2; - } - me.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges - me.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3; - } else { - // A vertical axis is more constrained by the width. Labels are the - // dominant factor here, so get that length first and account for padding - if (tickOpts.mirror) { - largestTextWidth = 0; - } else { - // use lineSpace for consistency with horizontal axis - // tickPadding is not implemented for horizontal - largestTextWidth += tickPadding + lineSpace; - } - - minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); - - me.paddingTop = tickFont.size / 2; - me.paddingBottom = tickFont.size / 2; - } - } - - me.handleMargins(); - - me.width = minSize.width; - me.height = minSize.height; - }, - - /** - * Handle margins and padding interactions - * @private - */ - handleMargins: function() { - var me = this; - if (me.margins) { - me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); - me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); - me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); - me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); - } - }, - - afterFit: function() { - helpers$1.callback(this.options.afterFit, [this]); - }, - - // Shared Methods - isHorizontal: function() { - return this.options.position === 'top' || this.options.position === 'bottom'; - }, - isFullWidth: function() { - return (this.options.fullWidth); - }, - - // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not - getRightValue: function(rawValue) { - // Null and undefined values first - if (helpers$1.isNullOrUndef(rawValue)) { - return NaN; - } - // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values - if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) { - return NaN; - } - // If it is in fact an object, dive in one more level - if (rawValue) { - if (this.isHorizontal()) { - if (rawValue.x !== undefined) { - return this.getRightValue(rawValue.x); - } - } else if (rawValue.y !== undefined) { - return this.getRightValue(rawValue.y); - } - } - - // Value is good, return it - return rawValue; - }, - - /** - * Used to get the value to display in the tooltip for the data at the given index - * @param index - * @param datasetIndex - */ - getLabelForIndex: helpers$1.noop, - - /** - * Returns the location of the given data point. Value can either be an index or a numerical value - * The coordinate (0, 0) is at the upper-left corner of the canvas - * @param value - * @param index - * @param datasetIndex - */ - getPixelForValue: helpers$1.noop, - - /** - * Used to get the data value from a given pixel. This is the inverse of getPixelForValue - * The coordinate (0, 0) is at the upper-left corner of the canvas - * @param pixel - */ - getValueForPixel: helpers$1.noop, - - /** - * Returns the location of the tick at the given index - * The coordinate (0, 0) is at the upper-left corner of the canvas - */ - getPixelForTick: function(index) { - var me = this; - var offset = me.options.offset; - if (me.isHorizontal()) { - var innerWidth = me.width - (me.paddingLeft + me.paddingRight); - var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); - var pixel = (tickWidth * index) + me.paddingLeft; - - if (offset) { - pixel += tickWidth / 2; - } - - var finalVal = me.left + pixel; - finalVal += me.isFullWidth() ? me.margins.left : 0; - return finalVal; - } - var innerHeight = me.height - (me.paddingTop + me.paddingBottom); - return me.top + (index * (innerHeight / (me._ticks.length - 1))); - }, - - /** - * Utility for getting the pixel location of a percentage of scale - * The coordinate (0, 0) is at the upper-left corner of the canvas - */ - getPixelForDecimal: function(decimal) { - var me = this; - if (me.isHorizontal()) { - var innerWidth = me.width - (me.paddingLeft + me.paddingRight); - var valueOffset = (innerWidth * decimal) + me.paddingLeft; - - var finalVal = me.left + valueOffset; - finalVal += me.isFullWidth() ? me.margins.left : 0; - return finalVal; - } - return me.top + (decimal * me.height); - }, - - /** - * Returns the pixel for the minimum chart value - * The coordinate (0, 0) is at the upper-left corner of the canvas - */ - getBasePixel: function() { - return this.getPixelForValue(this.getBaseValue()); - }, - - getBaseValue: function() { - var me = this; - var min = me.min; - var max = me.max; - - return me.beginAtZero ? 0 : - min < 0 && max < 0 ? max : - min > 0 && max > 0 ? min : - 0; - }, - - /** - * Returns a subset of ticks to be plotted to avoid overlapping labels. - * @private - */ - _autoSkip: function(ticks) { - var me = this; - var isHorizontal = me.isHorizontal(); - var optionTicks = me.options.ticks.minor; - var tickCount = ticks.length; - var skipRatio = false; - var maxTicks = optionTicks.maxTicksLimit; - - // Total space needed to display all ticks. First and last ticks are - // drawn as their center at end of axis, so tickCount-1 - var ticksLength = me._tickSize() * (tickCount - 1); - - // Axis length - var axisLength = isHorizontal - ? me.width - (me.paddingLeft + me.paddingRight) - : me.height - (me.paddingTop + me.PaddingBottom); - - var result = []; - var i, tick; - - if (ticksLength > axisLength) { - skipRatio = 1 + Math.floor(ticksLength / axisLength); - } - - // if they defined a max number of optionTicks, - // increase skipRatio until that number is met - if (tickCount > maxTicks) { - skipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks)); - } - - for (i = 0; i < tickCount; i++) { - tick = ticks[i]; - - if (skipRatio > 1 && i % skipRatio > 0) { - // leave tick in place but make sure it's not displayed (#4635) - delete tick.label; - } - result.push(tick); - } - return result; - }, - - /** - * @private - */ - _tickSize: function() { - var me = this; - var isHorizontal = me.isHorizontal(); - var optionTicks = me.options.ticks.minor; - - // Calculate space needed by label in axis direction. - var rot = helpers$1.toRadians(me.labelRotation); - var cos = Math.abs(Math.cos(rot)); - var sin = Math.abs(Math.sin(rot)); - - var padding = optionTicks.autoSkipPadding || 0; - var w = (me.longestLabelWidth + padding) || 0; - - var tickFont = helpers$1.options._parseFont(optionTicks); - var h = (me._maxLabelLines * tickFont.lineHeight + padding) || 0; - - // Calculate space needed for 1 tick in axis direction. - return isHorizontal - ? h * cos > w * sin ? w / cos : h / sin - : h * sin < w * cos ? h / cos : w / sin; - }, - - /** - * @private - */ - _isVisible: function() { - var me = this; - var chart = me.chart; - var display = me.options.display; - var i, ilen, meta; - - if (display !== 'auto') { - return !!display; - } - - // When 'auto', the scale is visible if at least one associated dataset is visible. - for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { - if (chart.isDatasetVisible(i)) { - meta = chart.getDatasetMeta(i); - if (meta.xAxisID === me.id || meta.yAxisID === me.id) { - return true; - } - } - } - - return false; - }, - - /** - * Actually draw the scale on the canvas - * @param {object} chartArea - the area of the chart to draw full grid lines on - */ - draw: function(chartArea) { - var me = this; - var options = me.options; - - if (!me._isVisible()) { - return; - } - - var chart = me.chart; - var context = me.ctx; - var globalDefaults = core_defaults.global; - var defaultFontColor = globalDefaults.defaultFontColor; - var optionTicks = options.ticks.minor; - var optionMajorTicks = options.ticks.major || optionTicks; - var gridLines = options.gridLines; - var scaleLabel = options.scaleLabel; - var position = options.position; - - var isRotated = me.labelRotation !== 0; - var isMirrored = optionTicks.mirror; - var isHorizontal = me.isHorizontal(); - - var parseFont = helpers$1.options._parseFont; - var ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); - var tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor); - var tickFont = parseFont(optionTicks); - var lineHeight = tickFont.lineHeight; - var majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor); - var majorTickFont = parseFont(optionMajorTicks); - var tickPadding = optionTicks.padding; - var labelOffset = optionTicks.labelOffset; - - var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; - - var scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor); - var scaleLabelFont = parseFont(scaleLabel); - var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding); - var labelRotationRadians = helpers$1.toRadians(me.labelRotation); - - var itemsToDraw = []; - - var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0; - var alignPixel = helpers$1._alignPixel; - var borderValue, tickStart, tickEnd; - - if (position === 'top') { - borderValue = alignPixel(chart, me.bottom, axisWidth); - tickStart = me.bottom - tl; - tickEnd = borderValue - axisWidth / 2; - } else if (position === 'bottom') { - borderValue = alignPixel(chart, me.top, axisWidth); - tickStart = borderValue + axisWidth / 2; - tickEnd = me.top + tl; - } else if (position === 'left') { - borderValue = alignPixel(chart, me.right, axisWidth); - tickStart = me.right - tl; - tickEnd = borderValue - axisWidth / 2; - } else { - borderValue = alignPixel(chart, me.left, axisWidth); - tickStart = borderValue + axisWidth / 2; - tickEnd = me.left + tl; - } - - var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error. - - helpers$1.each(ticks, function(tick, index) { - // autoskipper skipped this tick (#4635) - if (helpers$1.isNullOrUndef(tick.label)) { - return; - } - - var label = tick.label; - var lineWidth, lineColor, borderDash, borderDashOffset; - if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { - // Draw the first index specially - lineWidth = gridLines.zeroLineWidth; - lineColor = gridLines.zeroLineColor; - borderDash = gridLines.zeroLineBorderDash || []; - borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0; - } else { - lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index); - lineColor = valueAtIndexOrDefault(gridLines.color, index); - borderDash = gridLines.borderDash || []; - borderDashOffset = gridLines.borderDashOffset || 0.0; - } - - // Common properties - var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign; - var labelCount = helpers$1.isArray(label) ? label.length : 1; - var lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines); - - if (isHorizontal) { - var labelYOffset = tl + tickPadding; - - if (lineValue < me.left - epsilon) { - lineColor = 'rgba(0,0,0,0)'; - } - - tx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth); - ty1 = tickStart; - ty2 = tickEnd; - labelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option) - - if (position === 'top') { - y1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2; - y2 = chartArea.bottom; - textOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight; - textAlign = !isRotated ? 'center' : 'left'; - labelY = me.bottom - labelYOffset; - } else { - y1 = chartArea.top; - y2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2; - textOffset = (!isRotated ? 0.5 : 0) * lineHeight; - textAlign = !isRotated ? 'center' : 'right'; - labelY = me.top + labelYOffset; - } - } else { - var labelXOffset = (isMirrored ? 0 : tl) + tickPadding; - - if (lineValue < me.top - epsilon) { - lineColor = 'rgba(0,0,0,0)'; - } - - tx1 = tickStart; - tx2 = tickEnd; - ty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth); - labelY = me.getPixelForTick(index) + labelOffset; - textOffset = (1 - labelCount) * lineHeight / 2; - - if (position === 'left') { - x1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2; - x2 = chartArea.right; - textAlign = isMirrored ? 'left' : 'right'; - labelX = me.right - labelXOffset; - } else { - x1 = chartArea.left; - x2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2; - textAlign = isMirrored ? 'right' : 'left'; - labelX = me.left + labelXOffset; - } - } - - itemsToDraw.push({ - tx1: tx1, - ty1: ty1, - tx2: tx2, - ty2: ty2, - x1: x1, - y1: y1, - x2: x2, - y2: y2, - labelX: labelX, - labelY: labelY, - glWidth: lineWidth, - glColor: lineColor, - glBorderDash: borderDash, - glBorderDashOffset: borderDashOffset, - rotation: -1 * labelRotationRadians, - label: label, - major: tick.major, - textOffset: textOffset, - textAlign: textAlign - }); - }); - - // Draw all of the tick labels, tick marks, and grid lines at the correct places - helpers$1.each(itemsToDraw, function(itemToDraw) { - var glWidth = itemToDraw.glWidth; - var glColor = itemToDraw.glColor; - - if (gridLines.display && glWidth && glColor) { - context.save(); - context.lineWidth = glWidth; - context.strokeStyle = glColor; - if (context.setLineDash) { - context.setLineDash(itemToDraw.glBorderDash); - context.lineDashOffset = itemToDraw.glBorderDashOffset; - } - - context.beginPath(); - - if (gridLines.drawTicks) { - context.moveTo(itemToDraw.tx1, itemToDraw.ty1); - context.lineTo(itemToDraw.tx2, itemToDraw.ty2); - } - - if (gridLines.drawOnChartArea) { - context.moveTo(itemToDraw.x1, itemToDraw.y1); - context.lineTo(itemToDraw.x2, itemToDraw.y2); - } - - context.stroke(); - context.restore(); - } - - if (optionTicks.display) { - // Make sure we draw text in the correct color and font - context.save(); - context.translate(itemToDraw.labelX, itemToDraw.labelY); - context.rotate(itemToDraw.rotation); - context.font = itemToDraw.major ? majorTickFont.string : tickFont.string; - context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; - context.textBaseline = 'middle'; - context.textAlign = itemToDraw.textAlign; - - var label = itemToDraw.label; - var y = itemToDraw.textOffset; - if (helpers$1.isArray(label)) { - for (var i = 0; i < label.length; ++i) { - // We just make sure the multiline element is a string here.. - context.fillText('' + label[i], 0, y); - y += lineHeight; - } - } else { - context.fillText(label, 0, y); - } - context.restore(); - } - }); - - if (scaleLabel.display) { - // Draw the scale label - var scaleLabelX; - var scaleLabelY; - var rotation = 0; - var halfLineHeight = scaleLabelFont.lineHeight / 2; - - if (isHorizontal) { - scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width - scaleLabelY = position === 'bottom' - ? me.bottom - halfLineHeight - scaleLabelPadding.bottom - : me.top + halfLineHeight + scaleLabelPadding.top; - } else { - var isLeft = position === 'left'; - scaleLabelX = isLeft - ? me.left + halfLineHeight + scaleLabelPadding.top - : me.right - halfLineHeight - scaleLabelPadding.top; - scaleLabelY = me.top + ((me.bottom - me.top) / 2); - rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; - } - - context.save(); - context.translate(scaleLabelX, scaleLabelY); - context.rotate(rotation); - context.textAlign = 'center'; - context.textBaseline = 'middle'; - context.fillStyle = scaleLabelFontColor; // render in correct colour - context.font = scaleLabelFont.string; - context.fillText(scaleLabel.labelString, 0, 0); - context.restore(); - } - - if (axisWidth) { - // Draw the line at the edge of the axis - var firstLineWidth = axisWidth; - var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0); - var x1, x2, y1, y2; - - if (isHorizontal) { - x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2; - x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2; - y1 = y2 = borderValue; - } else { - y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2; - y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2; - x1 = x2 = borderValue; - } - - context.lineWidth = axisWidth; - context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0); - context.beginPath(); - context.moveTo(x1, y1); - context.lineTo(x2, y2); - context.stroke(); - } - } -}); - -var defaultConfig = { - position: 'bottom' -}; - -var scale_category = core_scale.extend({ - /** - * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those - * else fall back to data.labels - * @private - */ - getLabels: function() { - var data = this.chart.data; - return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; - }, - - determineDataLimits: function() { - var me = this; - var labels = me.getLabels(); - me.minIndex = 0; - me.maxIndex = labels.length - 1; - var findIndex; - - if (me.options.ticks.min !== undefined) { - // user specified min value - findIndex = labels.indexOf(me.options.ticks.min); - me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; - } - - if (me.options.ticks.max !== undefined) { - // user specified max value - findIndex = labels.indexOf(me.options.ticks.max); - me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; - } - - me.min = labels[me.minIndex]; - me.max = labels[me.maxIndex]; - }, - - buildTicks: function() { - var me = this; - var labels = me.getLabels(); - // If we are viewing some subset of labels, slice the original array - me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); - }, - - getLabelForIndex: function(index, datasetIndex) { - var me = this; - var chart = me.chart; - - if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) { - return me.getRightValue(chart.data.datasets[datasetIndex].data[index]); - } - - return me.ticks[index - me.minIndex]; - }, - - // Used to get data value locations. Value can either be an index or a numerical value - getPixelForValue: function(value, index) { - var me = this; - var offset = me.options.offset; - // 1 is added because we need the length but we have the indexes - var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); - - // If value is a data object, then index is the index in the data array, - // not the index of the scale. We need to change that. - var valueCategory; - if (value !== undefined && value !== null) { - valueCategory = me.isHorizontal() ? value.x : value.y; - } - if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { - var labels = me.getLabels(); - value = valueCategory || value; - var idx = labels.indexOf(value); - index = idx !== -1 ? idx : index; - } - - if (me.isHorizontal()) { - var valueWidth = me.width / offsetAmt; - var widthOffset = (valueWidth * (index - me.minIndex)); - - if (offset) { - widthOffset += (valueWidth / 2); - } - - return me.left + widthOffset; - } - var valueHeight = me.height / offsetAmt; - var heightOffset = (valueHeight * (index - me.minIndex)); - - if (offset) { - heightOffset += (valueHeight / 2); - } - - return me.top + heightOffset; - }, - - getPixelForTick: function(index) { - return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); - }, - - getValueForPixel: function(pixel) { - var me = this; - var offset = me.options.offset; - var value; - var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); - var horz = me.isHorizontal(); - var valueDimension = (horz ? me.width : me.height) / offsetAmt; - - pixel -= horz ? me.left : me.top; - - if (offset) { - pixel -= (valueDimension / 2); - } - - if (pixel <= 0) { - value = 0; - } else { - value = Math.round(pixel / valueDimension); - } - - return value + me.minIndex; - }, - - getBasePixel: function() { - return this.bottom; - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults = defaultConfig; -scale_category._defaults = _defaults; - -var noop = helpers$1.noop; -var isNullOrUndef = helpers$1.isNullOrUndef; - -/** - * Generate a set of linear ticks - * @param generationOptions the options used to generate the ticks - * @param dataRange the range of the data - * @returns {number[]} array of tick values - */ -function generateTicks(generationOptions, dataRange) { - var ticks = []; - // To get a "nice" value for the tick spacing, we will use the appropriately named - // "nice number" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks - // for details. - - var MIN_SPACING = 1e-14; - var stepSize = generationOptions.stepSize; - var unit = stepSize || 1; - var maxNumSpaces = generationOptions.maxTicks - 1; - var min = generationOptions.min; - var max = generationOptions.max; - var precision = generationOptions.precision; - var rmin = dataRange.min; - var rmax = dataRange.max; - var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit; - var factor, niceMin, niceMax, numSpaces; - - // Beyond MIN_SPACING floating point numbers being to lose precision - // such that we can't do the math necessary to generate ticks - if (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) { - return [rmin, rmax]; - } - - numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); - if (numSpaces > maxNumSpaces) { - // If the calculated num of spaces exceeds maxNumSpaces, recalculate it - spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit; - } - - if (stepSize || isNullOrUndef(precision)) { - // If a precision is not specified, calculate factor based on spacing - factor = Math.pow(10, helpers$1._decimalPlaces(spacing)); - } else { - // If the user specified a precision, round to that number of decimal places - factor = Math.pow(10, precision); - spacing = Math.ceil(spacing * factor) / factor; - } - - niceMin = Math.floor(rmin / spacing) * spacing; - niceMax = Math.ceil(rmax / spacing) * spacing; - - // If min, max and stepSize is set and they make an evenly spaced scale use it. - if (stepSize) { - // If very close to our whole number, use it. - if (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) { - niceMin = min; - } - if (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) { - niceMax = max; - } - } - - numSpaces = (niceMax - niceMin) / spacing; - // If very close to our rounded value, use it. - if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { - numSpaces = Math.round(numSpaces); - } else { - numSpaces = Math.ceil(numSpaces); - } - - niceMin = Math.round(niceMin * factor) / factor; - niceMax = Math.round(niceMax * factor) / factor; - ticks.push(isNullOrUndef(min) ? niceMin : min); - for (var j = 1; j < numSpaces; ++j) { - ticks.push(Math.round((niceMin + j * spacing) * factor) / factor); - } - ticks.push(isNullOrUndef(max) ? niceMax : max); - - return ticks; -} - -var scale_linearbase = core_scale.extend({ - getRightValue: function(value) { - if (typeof value === 'string') { - return +value; - } - return core_scale.prototype.getRightValue.call(this, value); - }, - - handleTickRangeOptions: function() { - var me = this; - var opts = me.options; - var tickOpts = opts.ticks; - - // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, - // do nothing since that would make the chart weird. If the user really wants a weird chart - // axis, they can manually override it - if (tickOpts.beginAtZero) { - var minSign = helpers$1.sign(me.min); - var maxSign = helpers$1.sign(me.max); - - if (minSign < 0 && maxSign < 0) { - // move the top up to 0 - me.max = 0; - } else if (minSign > 0 && maxSign > 0) { - // move the bottom down to 0 - me.min = 0; - } - } - - var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; - var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; - - if (tickOpts.min !== undefined) { - me.min = tickOpts.min; - } else if (tickOpts.suggestedMin !== undefined) { - if (me.min === null) { - me.min = tickOpts.suggestedMin; - } else { - me.min = Math.min(me.min, tickOpts.suggestedMin); - } - } - - if (tickOpts.max !== undefined) { - me.max = tickOpts.max; - } else if (tickOpts.suggestedMax !== undefined) { - if (me.max === null) { - me.max = tickOpts.suggestedMax; - } else { - me.max = Math.max(me.max, tickOpts.suggestedMax); - } - } - - if (setMin !== setMax) { - // We set the min or the max but not both. - // So ensure that our range is good - // Inverted or 0 length range can happen when - // ticks.min is set, and no datasets are visible - if (me.min >= me.max) { - if (setMin) { - me.max = me.min + 1; - } else { - me.min = me.max - 1; - } - } - } - - if (me.min === me.max) { - me.max++; - - if (!tickOpts.beginAtZero) { - me.min--; - } - } - }, - - getTickLimit: function() { - var me = this; - var tickOpts = me.options.ticks; - var stepSize = tickOpts.stepSize; - var maxTicksLimit = tickOpts.maxTicksLimit; - var maxTicks; - - if (stepSize) { - maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1; - } else { - maxTicks = me._computeTickLimit(); - maxTicksLimit = maxTicksLimit || 11; - } - - if (maxTicksLimit) { - maxTicks = Math.min(maxTicksLimit, maxTicks); - } - - return maxTicks; - }, - - _computeTickLimit: function() { - return Number.POSITIVE_INFINITY; - }, - - handleDirectionalChanges: noop, - - buildTicks: function() { - var me = this; - var opts = me.options; - var tickOpts = opts.ticks; - - // Figure out what the max number of ticks we can support it is based on the size of - // the axis area. For now, we say that the minimum tick spacing in pixels must be 40 - // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on - // the graph. Make sure we always have at least 2 ticks - var maxTicks = me.getTickLimit(); - maxTicks = Math.max(2, maxTicks); - - var numericGeneratorOptions = { - maxTicks: maxTicks, - min: tickOpts.min, - max: tickOpts.max, - precision: tickOpts.precision, - stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) - }; - var ticks = me.ticks = generateTicks(numericGeneratorOptions, me); - - me.handleDirectionalChanges(); - - // At this point, we need to update our max and min given the tick values since we have expanded the - // range of the scale - me.max = helpers$1.max(ticks); - me.min = helpers$1.min(ticks); - - if (tickOpts.reverse) { - ticks.reverse(); - - me.start = me.max; - me.end = me.min; - } else { - me.start = me.min; - me.end = me.max; - } - }, - - convertTicksToLabels: function() { - var me = this; - me.ticksAsNumbers = me.ticks.slice(); - me.zeroLineIndex = me.ticks.indexOf(0); - - core_scale.prototype.convertTicksToLabels.call(me); - } -}); - -var defaultConfig$1 = { - position: 'left', - ticks: { - callback: core_ticks.formatters.linear - } -}; - -var scale_linear = scale_linearbase.extend({ - determineDataLimits: function() { - var me = this; - var opts = me.options; - var chart = me.chart; - var data = chart.data; - var datasets = data.datasets; - var isHorizontal = me.isHorizontal(); - var DEFAULT_MIN = 0; - var DEFAULT_MAX = 1; - - function IDMatches(meta) { - return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; - } - - // First Calculate the range - me.min = null; - me.max = null; - - var hasStacks = opts.stacked; - if (hasStacks === undefined) { - helpers$1.each(datasets, function(dataset, datasetIndex) { - if (hasStacks) { - return; - } - - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && - meta.stack !== undefined) { - hasStacks = true; - } - }); - } - - if (opts.stacked || hasStacks) { - var valuesPerStack = {}; - - helpers$1.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - var key = [ - meta.type, - // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined - ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), - meta.stack - ].join('.'); - - if (valuesPerStack[key] === undefined) { - valuesPerStack[key] = { - positiveValues: [], - negativeValues: [] - }; - } - - // Store these per type - var positiveValues = valuesPerStack[key].positiveValues; - var negativeValues = valuesPerStack[key].negativeValues; - - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers$1.each(dataset.data, function(rawValue, index) { - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - positiveValues[index] = positiveValues[index] || 0; - negativeValues[index] = negativeValues[index] || 0; - - if (opts.relativePoints) { - positiveValues[index] = 100; - } else if (value < 0) { - negativeValues[index] += value; - } else { - positiveValues[index] += value; - } - }); - } - }); - - helpers$1.each(valuesPerStack, function(valuesForType) { - var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); - var minVal = helpers$1.min(values); - var maxVal = helpers$1.max(values); - me.min = me.min === null ? minVal : Math.min(me.min, minVal); - me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); - }); - - } else { - helpers$1.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers$1.each(dataset.data, function(rawValue, index) { - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - if (me.min === null) { - me.min = value; - } else if (value < me.min) { - me.min = value; - } - - if (me.max === null) { - me.max = value; - } else if (value > me.max) { - me.max = value; - } - }); - } - }); - } - - me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; - me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; - - // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero - this.handleTickRangeOptions(); - }, - - // Returns the maximum number of ticks based on the scale dimension - _computeTickLimit: function() { - var me = this; - var tickFont; - - if (me.isHorizontal()) { - return Math.ceil(me.width / 40); - } - tickFont = helpers$1.options._parseFont(me.options.ticks); - return Math.ceil(me.height / tickFont.lineHeight); - }, - - // Called after the ticks are built. We need - handleDirectionalChanges: function() { - if (!this.isHorizontal()) { - // We are in a vertical orientation. The top value is the highest. So reverse the array - this.ticks.reverse(); - } - }, - - getLabelForIndex: function(index, datasetIndex) { - return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); - }, - - // Utils - getPixelForValue: function(value) { - // This must be called after fit has been run so that - // this.left, this.top, this.right, and this.bottom have been defined - var me = this; - var start = me.start; - - var rightValue = +me.getRightValue(value); - var pixel; - var range = me.end - start; - - if (me.isHorizontal()) { - pixel = me.left + (me.width / range * (rightValue - start)); - } else { - pixel = me.bottom - (me.height / range * (rightValue - start)); - } - return pixel; - }, - - getValueForPixel: function(pixel) { - var me = this; - var isHorizontal = me.isHorizontal(); - var innerDimension = isHorizontal ? me.width : me.height; - var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; - return me.start + ((me.end - me.start) * offset); - }, - - getPixelForTick: function(index) { - return this.getPixelForValue(this.ticksAsNumbers[index]); - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults$1 = defaultConfig$1; -scale_linear._defaults = _defaults$1; - -var valueOrDefault$a = helpers$1.valueOrDefault; - -/** - * Generate a set of logarithmic ticks - * @param generationOptions the options used to generate the ticks - * @param dataRange the range of the data - * @returns {number[]} array of tick values - */ -function generateTicks$1(generationOptions, dataRange) { - var ticks = []; - - var tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min)))); - - var endExp = Math.floor(helpers$1.log10(dataRange.max)); - var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); - var exp, significand; - - if (tickVal === 0) { - exp = Math.floor(helpers$1.log10(dataRange.minNotZero)); - significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); - - ticks.push(tickVal); - tickVal = significand * Math.pow(10, exp); - } else { - exp = Math.floor(helpers$1.log10(tickVal)); - significand = Math.floor(tickVal / Math.pow(10, exp)); - } - var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; - - do { - ticks.push(tickVal); - - ++significand; - if (significand === 10) { - significand = 1; - ++exp; - precision = exp >= 0 ? 1 : precision; - } - - tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision; - } while (exp < endExp || (exp === endExp && significand < endSignificand)); - - var lastTick = valueOrDefault$a(generationOptions.max, tickVal); - ticks.push(lastTick); - - return ticks; -} - -var defaultConfig$2 = { - position: 'left', - - // label settings - ticks: { - callback: core_ticks.formatters.logarithmic - } -}; - -// TODO(v3): change this to positiveOrDefault -function nonNegativeOrDefault(value, defaultValue) { - return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue; -} - -var scale_logarithmic = core_scale.extend({ - determineDataLimits: function() { - var me = this; - var opts = me.options; - var chart = me.chart; - var data = chart.data; - var datasets = data.datasets; - var isHorizontal = me.isHorizontal(); - function IDMatches(meta) { - return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; - } - - // Calculate Range - me.min = null; - me.max = null; - me.minNotZero = null; - - var hasStacks = opts.stacked; - if (hasStacks === undefined) { - helpers$1.each(datasets, function(dataset, datasetIndex) { - if (hasStacks) { - return; - } - - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && - meta.stack !== undefined) { - hasStacks = true; - } - }); - } - - if (opts.stacked || hasStacks) { - var valuesPerStack = {}; - - helpers$1.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - var key = [ - meta.type, - // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined - ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), - meta.stack - ].join('.'); - - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - if (valuesPerStack[key] === undefined) { - valuesPerStack[key] = []; - } - - helpers$1.each(dataset.data, function(rawValue, index) { - var values = valuesPerStack[key]; - var value = +me.getRightValue(rawValue); - // invalid, hidden and negative values are ignored - if (isNaN(value) || meta.data[index].hidden || value < 0) { - return; - } - values[index] = values[index] || 0; - values[index] += value; - }); - } - }); - - helpers$1.each(valuesPerStack, function(valuesForType) { - if (valuesForType.length > 0) { - var minVal = helpers$1.min(valuesForType); - var maxVal = helpers$1.max(valuesForType); - me.min = me.min === null ? minVal : Math.min(me.min, minVal); - me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); - } - }); - - } else { - helpers$1.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers$1.each(dataset.data, function(rawValue, index) { - var value = +me.getRightValue(rawValue); - // invalid, hidden and negative values are ignored - if (isNaN(value) || meta.data[index].hidden || value < 0) { - return; - } - - if (me.min === null) { - me.min = value; - } else if (value < me.min) { - me.min = value; - } - - if (me.max === null) { - me.max = value; - } else if (value > me.max) { - me.max = value; - } - - if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { - me.minNotZero = value; - } - }); - } - }); - } - - // Common base implementation to handle ticks.min, ticks.max - this.handleTickRangeOptions(); - }, - - handleTickRangeOptions: function() { - var me = this; - var tickOpts = me.options.ticks; - var DEFAULT_MIN = 1; - var DEFAULT_MAX = 10; - - me.min = nonNegativeOrDefault(tickOpts.min, me.min); - me.max = nonNegativeOrDefault(tickOpts.max, me.max); - - if (me.min === me.max) { - if (me.min !== 0 && me.min !== null) { - me.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1); - me.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1); - } else { - me.min = DEFAULT_MIN; - me.max = DEFAULT_MAX; - } - } - if (me.min === null) { - me.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1); - } - if (me.max === null) { - me.max = me.min !== 0 - ? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1) - : DEFAULT_MAX; - } - if (me.minNotZero === null) { - if (me.min > 0) { - me.minNotZero = me.min; - } else if (me.max < 1) { - me.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max))); - } else { - me.minNotZero = DEFAULT_MIN; - } - } - }, - - buildTicks: function() { - var me = this; - var tickOpts = me.options.ticks; - var reverse = !me.isHorizontal(); - - var generationOptions = { - min: nonNegativeOrDefault(tickOpts.min), - max: nonNegativeOrDefault(tickOpts.max) - }; - var ticks = me.ticks = generateTicks$1(generationOptions, me); - - // At this point, we need to update our max and min given the tick values since we have expanded the - // range of the scale - me.max = helpers$1.max(ticks); - me.min = helpers$1.min(ticks); - - if (tickOpts.reverse) { - reverse = !reverse; - me.start = me.max; - me.end = me.min; - } else { - me.start = me.min; - me.end = me.max; - } - if (reverse) { - ticks.reverse(); - } - }, - - convertTicksToLabels: function() { - this.tickValues = this.ticks.slice(); - - core_scale.prototype.convertTicksToLabels.call(this); - }, - - // Get the correct tooltip label - getLabelForIndex: function(index, datasetIndex) { - return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); - }, - - getPixelForTick: function(index) { - return this.getPixelForValue(this.tickValues[index]); - }, - - /** - * Returns the value of the first tick. - * @param {number} value - The minimum not zero value. - * @return {number} The first tick value. - * @private - */ - _getFirstTickValue: function(value) { - var exp = Math.floor(helpers$1.log10(value)); - var significand = Math.floor(value / Math.pow(10, exp)); - - return significand * Math.pow(10, exp); - }, - - getPixelForValue: function(value) { - var me = this; - var tickOpts = me.options.ticks; - var reverse = tickOpts.reverse; - var log10 = helpers$1.log10; - var firstTickValue = me._getFirstTickValue(me.minNotZero); - var offset = 0; - var innerDimension, pixel, start, end, sign; - - value = +me.getRightValue(value); - if (reverse) { - start = me.end; - end = me.start; - sign = -1; - } else { - start = me.start; - end = me.end; - sign = 1; - } - if (me.isHorizontal()) { - innerDimension = me.width; - pixel = reverse ? me.right : me.left; - } else { - innerDimension = me.height; - sign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0) - pixel = reverse ? me.top : me.bottom; - } - if (value !== start) { - if (start === 0) { // include zero tick - offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); - innerDimension -= offset; - start = firstTickValue; - } - if (value !== 0) { - offset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start)); - } - pixel += sign * offset; - } - return pixel; - }, - - getValueForPixel: function(pixel) { - var me = this; - var tickOpts = me.options.ticks; - var reverse = tickOpts.reverse; - var log10 = helpers$1.log10; - var firstTickValue = me._getFirstTickValue(me.minNotZero); - var innerDimension, start, end, value; - - if (reverse) { - start = me.end; - end = me.start; - } else { - start = me.start; - end = me.end; - } - if (me.isHorizontal()) { - innerDimension = me.width; - value = reverse ? me.right - pixel : pixel - me.left; - } else { - innerDimension = me.height; - value = reverse ? pixel - me.top : me.bottom - pixel; - } - if (value !== start) { - if (start === 0) { // include zero tick - var offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); - value -= offset; - innerDimension -= offset; - start = firstTickValue; - } - value *= log10(end) - log10(start); - value /= innerDimension; - value = Math.pow(10, log10(start) + value); - } - return value; - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults$2 = defaultConfig$2; -scale_logarithmic._defaults = _defaults$2; - -var valueOrDefault$b = helpers$1.valueOrDefault; -var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault; -var resolve$7 = helpers$1.options.resolve; - -var defaultConfig$3 = { - display: true, - - // Boolean - Whether to animate scaling the chart from the centre - animate: true, - position: 'chartArea', - - angleLines: { - display: true, - color: 'rgba(0, 0, 0, 0.1)', - lineWidth: 1, - borderDash: [], - borderDashOffset: 0.0 - }, - - gridLines: { - circular: false - }, - - // label settings - ticks: { - // Boolean - Show a backdrop to the scale label - showLabelBackdrop: true, - - // String - The colour of the label backdrop - backdropColor: 'rgba(255,255,255,0.75)', - - // Number - The backdrop padding above & below the label in pixels - backdropPaddingY: 2, - - // Number - The backdrop padding to the side of the label in pixels - backdropPaddingX: 2, - - callback: core_ticks.formatters.linear - }, - - pointLabels: { - // Boolean - if true, show point labels - display: true, - - // Number - Point label font size in pixels - fontSize: 10, - - // Function - Used to convert point labels - callback: function(label) { - return label; - } - } -}; - -function getValueCount(scale) { - var opts = scale.options; - return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; -} - -function getTickBackdropHeight(opts) { - var tickOpts = opts.ticks; - - if (tickOpts.display && opts.display) { - return valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2; - } - return 0; -} - -function measureLabelSize(ctx, lineHeight, label) { - if (helpers$1.isArray(label)) { - return { - w: helpers$1.longestText(ctx, ctx.font, label), - h: label.length * lineHeight - }; - } - - return { - w: ctx.measureText(label).width, - h: lineHeight - }; -} - -function determineLimits(angle, pos, size, min, max) { - if (angle === min || angle === max) { - return { - start: pos - (size / 2), - end: pos + (size / 2) - }; - } else if (angle < min || angle > max) { - return { - start: pos - size, - end: pos - }; - } - - return { - start: pos, - end: pos + size - }; -} - -/** - * Helper function to fit a radial linear scale with point labels - */ -function fitWithPointLabels(scale) { - - // Right, this is really confusing and there is a lot of maths going on here - // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 - // - // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif - // - // Solution: - // - // We assume the radius of the polygon is half the size of the canvas at first - // at each index we check if the text overlaps. - // - // Where it does, we store that angle and that index. - // - // After finding the largest index and angle we calculate how much we need to remove - // from the shape radius to move the point inwards by that x. - // - // We average the left and right distances to get the maximum shape radius that can fit in the box - // along with labels. - // - // Once we have that, we can find the centre point for the chart, by taking the x text protrusion - // on each side, removing that from the size, halving it and adding the left x protrusion width. - // - // This will mean we have a shape fitted to the canvas, as large as it can be with the labels - // and position it in the most space efficient manner - // - // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif - - var plFont = helpers$1.options._parseFont(scale.options.pointLabels); - - // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. - // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points - var furthestLimits = { - l: 0, - r: scale.width, - t: 0, - b: scale.height - scale.paddingTop - }; - var furthestAngles = {}; - var i, textSize, pointPosition; - - scale.ctx.font = plFont.string; - scale._pointLabelSizes = []; - - var valueCount = getValueCount(scale); - for (i = 0; i < valueCount; i++) { - pointPosition = scale.getPointPosition(i, scale.drawingArea + 5); - textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || ''); - scale._pointLabelSizes[i] = textSize; - - // Add quarter circle to make degree 0 mean top of circle - var angleRadians = scale.getIndexAngle(i); - var angle = helpers$1.toDegrees(angleRadians) % 360; - var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); - var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); - - if (hLimits.start < furthestLimits.l) { - furthestLimits.l = hLimits.start; - furthestAngles.l = angleRadians; - } - - if (hLimits.end > furthestLimits.r) { - furthestLimits.r = hLimits.end; - furthestAngles.r = angleRadians; - } - - if (vLimits.start < furthestLimits.t) { - furthestLimits.t = vLimits.start; - furthestAngles.t = angleRadians; - } - - if (vLimits.end > furthestLimits.b) { - furthestLimits.b = vLimits.end; - furthestAngles.b = angleRadians; - } - } - - scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles); -} - -function getTextAlignForAngle(angle) { - if (angle === 0 || angle === 180) { - return 'center'; - } else if (angle < 180) { - return 'left'; - } - - return 'right'; -} - -function fillText(ctx, text, position, lineHeight) { - var y = position.y + lineHeight / 2; - var i, ilen; - - if (helpers$1.isArray(text)) { - for (i = 0, ilen = text.length; i < ilen; ++i) { - ctx.fillText(text[i], position.x, y); - y += lineHeight; - } - } else { - ctx.fillText(text, position.x, y); - } -} - -function adjustPointPositionForLabelHeight(angle, textSize, position) { - if (angle === 90 || angle === 270) { - position.y -= (textSize.h / 2); - } else if (angle > 270 || angle < 90) { - position.y -= textSize.h; - } -} - -function drawPointLabels(scale) { - var ctx = scale.ctx; - var opts = scale.options; - var angleLineOpts = opts.angleLines; - var gridLineOpts = opts.gridLines; - var pointLabelOpts = opts.pointLabels; - var lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth); - var lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color); - var tickBackdropHeight = getTickBackdropHeight(opts); - - ctx.save(); - ctx.lineWidth = lineWidth; - ctx.strokeStyle = lineColor; - if (ctx.setLineDash) { - ctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []])); - ctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]); - } - - var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); - - // Point Label Font - var plFont = helpers$1.options._parseFont(pointLabelOpts); - - ctx.font = plFont.string; - ctx.textBaseline = 'middle'; - - for (var i = getValueCount(scale) - 1; i >= 0; i--) { - if (angleLineOpts.display && lineWidth && lineColor) { - var outerPosition = scale.getPointPosition(i, outerDistance); - ctx.beginPath(); - ctx.moveTo(scale.xCenter, scale.yCenter); - ctx.lineTo(outerPosition.x, outerPosition.y); - ctx.stroke(); - } - - if (pointLabelOpts.display) { - // Extra pixels out for some label spacing - var extra = (i === 0 ? tickBackdropHeight / 2 : 0); - var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5); - - // Keep this in loop since we may support array properties here - var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor); - ctx.fillStyle = pointLabelFontColor; - - var angleRadians = scale.getIndexAngle(i); - var angle = helpers$1.toDegrees(angleRadians); - ctx.textAlign = getTextAlignForAngle(angle); - adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); - fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight); - } - } - ctx.restore(); -} - -function drawRadiusLine(scale, gridLineOpts, radius, index) { - var ctx = scale.ctx; - var circular = gridLineOpts.circular; - var valueCount = getValueCount(scale); - var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1); - var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1); - var pointPosition; - - if ((!circular && !valueCount) || !lineColor || !lineWidth) { - return; - } - - ctx.save(); - ctx.strokeStyle = lineColor; - ctx.lineWidth = lineWidth; - if (ctx.setLineDash) { - ctx.setLineDash(gridLineOpts.borderDash || []); - ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0; - } - - ctx.beginPath(); - if (circular) { - // Draw circular arcs between the points - ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); - } else { - // Draw straight lines connecting each index - pointPosition = scale.getPointPosition(0, radius); - ctx.moveTo(pointPosition.x, pointPosition.y); - - for (var i = 1; i < valueCount; i++) { - pointPosition = scale.getPointPosition(i, radius); - ctx.lineTo(pointPosition.x, pointPosition.y); - } - } - ctx.closePath(); - ctx.stroke(); - ctx.restore(); -} - -function numberOrZero(param) { - return helpers$1.isNumber(param) ? param : 0; -} - -var scale_radialLinear = scale_linearbase.extend({ - setDimensions: function() { - var me = this; - - // Set the unconstrained dimension before label rotation - me.width = me.maxWidth; - me.height = me.maxHeight; - me.paddingTop = getTickBackdropHeight(me.options) / 2; - me.xCenter = Math.floor(me.width / 2); - me.yCenter = Math.floor((me.height - me.paddingTop) / 2); - me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2; - }, - - determineDataLimits: function() { - var me = this; - var chart = me.chart; - var min = Number.POSITIVE_INFINITY; - var max = Number.NEGATIVE_INFINITY; - - helpers$1.each(chart.data.datasets, function(dataset, datasetIndex) { - if (chart.isDatasetVisible(datasetIndex)) { - var meta = chart.getDatasetMeta(datasetIndex); - - helpers$1.each(dataset.data, function(rawValue, index) { - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - min = Math.min(value, min); - max = Math.max(value, max); - }); - } - }); - - me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); - me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); - - // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero - me.handleTickRangeOptions(); - }, - - // Returns the maximum number of ticks based on the scale dimension - _computeTickLimit: function() { - return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); - }, - - convertTicksToLabels: function() { - var me = this; - - scale_linearbase.prototype.convertTicksToLabels.call(me); - - // Point labels - me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); - }, - - getLabelForIndex: function(index, datasetIndex) { - return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); - }, - - fit: function() { - var me = this; - var opts = me.options; - - if (opts.display && opts.pointLabels.display) { - fitWithPointLabels(me); - } else { - me.setCenterPoint(0, 0, 0, 0); - } - }, - - /** - * Set radius reductions and determine new radius and center point - * @private - */ - setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) { - var me = this; - var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); - var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); - var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); - var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b); - - radiusReductionLeft = numberOrZero(radiusReductionLeft); - radiusReductionRight = numberOrZero(radiusReductionRight); - radiusReductionTop = numberOrZero(radiusReductionTop); - radiusReductionBottom = numberOrZero(radiusReductionBottom); - - me.drawingArea = Math.min( - Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), - Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); - me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); - }, - - setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) { - var me = this; - var maxRight = me.width - rightMovement - me.drawingArea; - var maxLeft = leftMovement + me.drawingArea; - var maxTop = topMovement + me.drawingArea; - var maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea; - - me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left); - me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop); - }, - - getIndexAngle: function(index) { - var angleMultiplier = (Math.PI * 2) / getValueCount(this); - var startAngle = this.chart.options && this.chart.options.startAngle ? - this.chart.options.startAngle : - 0; - - var startAngleRadians = startAngle * Math.PI * 2 / 360; - - // Start from the top instead of right, so remove a quarter of the circle - return index * angleMultiplier + startAngleRadians; - }, - - getDistanceFromCenterForValue: function(value) { - var me = this; - - if (value === null) { - return 0; // null always in center - } - - // Take into account half font size + the yPadding of the top value - var scalingFactor = me.drawingArea / (me.max - me.min); - if (me.options.ticks.reverse) { - return (me.max - value) * scalingFactor; - } - return (value - me.min) * scalingFactor; - }, - - getPointPosition: function(index, distanceFromCenter) { - var me = this; - var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); - return { - x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter, - y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter - }; - }, - - getPointPositionForValue: function(index, value) { - return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); - }, - - getBasePosition: function() { - var me = this; - var min = me.min; - var max = me.max; - - return me.getPointPositionForValue(0, - me.beginAtZero ? 0 : - min < 0 && max < 0 ? max : - min > 0 && max > 0 ? min : - 0); - }, - - draw: function() { - var me = this; - var opts = me.options; - var gridLineOpts = opts.gridLines; - var tickOpts = opts.ticks; - - if (opts.display) { - var ctx = me.ctx; - var startAngle = this.getIndexAngle(0); - var tickFont = helpers$1.options._parseFont(tickOpts); - - if (opts.angleLines.display || opts.pointLabels.display) { - drawPointLabels(me); - } - - helpers$1.each(me.ticks, function(label, index) { - // Don't draw a centre value (if it is minimum) - if (index > 0 || tickOpts.reverse) { - var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); - - // Draw circular lines around the scale - if (gridLineOpts.display && index !== 0) { - drawRadiusLine(me, gridLineOpts, yCenterOffset, index); - } - - if (tickOpts.display) { - var tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor); - ctx.font = tickFont.string; - - ctx.save(); - ctx.translate(me.xCenter, me.yCenter); - ctx.rotate(startAngle); - - if (tickOpts.showLabelBackdrop) { - var labelWidth = ctx.measureText(label).width; - ctx.fillStyle = tickOpts.backdropColor; - ctx.fillRect( - -labelWidth / 2 - tickOpts.backdropPaddingX, - -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY, - labelWidth + tickOpts.backdropPaddingX * 2, - tickFont.size + tickOpts.backdropPaddingY * 2 - ); - } - - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = tickFontColor; - ctx.fillText(label, 0, -yCenterOffset); - ctx.restore(); - } - } - }); - } - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults$3 = defaultConfig$3; -scale_radialLinear._defaults = _defaults$3; - -var valueOrDefault$c = helpers$1.valueOrDefault; - -// Integer constants are from the ES6 spec. -var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; -var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; - -var INTERVALS = { - millisecond: { - common: true, - size: 1, - steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] - }, - second: { - common: true, - size: 1000, - steps: [1, 2, 5, 10, 15, 30] - }, - minute: { - common: true, - size: 60000, - steps: [1, 2, 5, 10, 15, 30] - }, - hour: { - common: true, - size: 3600000, - steps: [1, 2, 3, 6, 12] - }, - day: { - common: true, - size: 86400000, - steps: [1, 2, 5] - }, - week: { - common: false, - size: 604800000, - steps: [1, 2, 3, 4] - }, - month: { - common: true, - size: 2.628e9, - steps: [1, 2, 3] - }, - quarter: { - common: false, - size: 7.884e9, - steps: [1, 2, 3, 4] - }, - year: { - common: true, - size: 3.154e10 - } -}; - -var UNITS = Object.keys(INTERVALS); - -function sorter(a, b) { - return a - b; -} - -function arrayUnique(items) { - var hash = {}; - var out = []; - var i, ilen, item; - - for (i = 0, ilen = items.length; i < ilen; ++i) { - item = items[i]; - if (!hash[item]) { - hash[item] = true; - out.push(item); - } - } - - return out; -} - -/** - * Returns an array of {time, pos} objects used to interpolate a specific `time` or position - * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is - * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other - * extremity (left + width or top + height). Note that it would be more optimized to directly - * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need - * to create the lookup table. The table ALWAYS contains at least two items: min and max. - * - * @param {number[]} timestamps - timestamps sorted from lowest to highest. - * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min - * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. - * If 'series', timestamps will be positioned at the same distance from each other. In this - * case, only timestamps that break the time linearity are registered, meaning that in the - * best case, all timestamps are linear, the table contains only min and max. - */ -function buildLookupTable(timestamps, min, max, distribution) { - if (distribution === 'linear' || !timestamps.length) { - return [ - {time: min, pos: 0}, - {time: max, pos: 1} - ]; - } - - var table = []; - var items = [min]; - var i, ilen, prev, curr, next; - - for (i = 0, ilen = timestamps.length; i < ilen; ++i) { - curr = timestamps[i]; - if (curr > min && curr < max) { - items.push(curr); - } - } - - items.push(max); - - for (i = 0, ilen = items.length; i < ilen; ++i) { - next = items[i + 1]; - prev = items[i - 1]; - curr = items[i]; - - // only add points that breaks the scale linearity - if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { - table.push({time: curr, pos: i / (ilen - 1)}); - } - } - - return table; -} - -// @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ -function lookup(table, key, value) { - var lo = 0; - var hi = table.length - 1; - var mid, i0, i1; - - while (lo >= 0 && lo <= hi) { - mid = (lo + hi) >> 1; - i0 = table[mid - 1] || null; - i1 = table[mid]; - - if (!i0) { - // given value is outside table (before first item) - return {lo: null, hi: i1}; - } else if (i1[key] < value) { - lo = mid + 1; - } else if (i0[key] > value) { - hi = mid - 1; - } else { - return {lo: i0, hi: i1}; - } - } - - // given value is outside table (after last item) - return {lo: i1, hi: null}; -} - -/** - * Linearly interpolates the given source `value` using the table items `skey` values and - * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') - * returns the position for a timestamp equal to 42. If value is out of bounds, values at - * index [0, 1] or [n - 1, n] are used for the interpolation. - */ -function interpolate$1(table, skey, sval, tkey) { - var range = lookup(table, skey, sval); - - // Note: the lookup table ALWAYS contains at least 2 items (min and max) - var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; - var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; - - var span = next[skey] - prev[skey]; - var ratio = span ? (sval - prev[skey]) / span : 0; - var offset = (next[tkey] - prev[tkey]) * ratio; - - return prev[tkey] + offset; -} - -function toTimestamp(scale, input) { - var adapter = scale._adapter; - var options = scale.options.time; - var parser = options.parser; - var format = parser || options.format; - var value = input; - - if (typeof parser === 'function') { - value = parser(value); - } - - // Only parse if its not a timestamp already - if (!helpers$1.isFinite(value)) { - value = typeof format === 'string' - ? adapter.parse(value, format) - : adapter.parse(value); - } - - if (value !== null) { - return +value; - } - - // Labels are in an incompatible format and no `parser` has been provided. - // The user might still use the deprecated `format` option for parsing. - if (!parser && typeof format === 'function') { - value = format(input); - - // `format` could return something else than a timestamp, if so, parse it - if (!helpers$1.isFinite(value)) { - value = adapter.parse(value); - } - } - - return value; -} - -function parse(scale, input) { - if (helpers$1.isNullOrUndef(input)) { - return null; - } - - var options = scale.options.time; - var value = toTimestamp(scale, scale.getRightValue(input)); - if (value === null) { - return value; - } - - if (options.round) { - value = +scale._adapter.startOf(value, options.round); - } - - return value; -} - -/** - * Returns the number of unit to skip to be able to display up to `capacity` number of ticks - * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. - */ -function determineStepSize(min, max, unit, capacity) { - var range = max - min; - var interval = INTERVALS[unit]; - var milliseconds = interval.size; - var steps = interval.steps; - var i, ilen, factor; - - if (!steps) { - return Math.ceil(range / (capacity * milliseconds)); - } - - for (i = 0, ilen = steps.length; i < ilen; ++i) { - factor = steps[i]; - if (Math.ceil(range / (milliseconds * factor)) <= capacity) { - break; - } - } - - return factor; -} - -/** - * Figures out what unit results in an appropriate number of auto-generated ticks - */ -function determineUnitForAutoTicks(minUnit, min, max, capacity) { - var ilen = UNITS.length; - var i, interval, factor; - - for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { - interval = INTERVALS[UNITS[i]]; - factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; - - if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { - return UNITS[i]; - } - } - - return UNITS[ilen - 1]; -} - -/** - * Figures out what unit to format a set of ticks with - */ -function determineUnitForFormatting(scale, ticks, minUnit, min, max) { - var ilen = UNITS.length; - var i, unit; - - for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { - unit = UNITS[i]; - if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) { - return unit; - } - } - - return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; -} - -function determineMajorUnit(unit) { - for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { - if (INTERVALS[UNITS[i]].common) { - return UNITS[i]; - } - } -} - -/** - * Generates a maximum of `capacity` timestamps between min and max, rounded to the - * `minor` unit, aligned on the `major` unit and using the given scale time `options`. - * Important: this method can return ticks outside the min and max range, it's the - * responsibility of the calling code to clamp values if needed. - */ -function generate(scale, min, max, capacity) { - var adapter = scale._adapter; - var options = scale.options; - var timeOpts = options.time; - var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); - var major = determineMajorUnit(minor); - var stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize); - var weekday = minor === 'week' ? timeOpts.isoWeekday : false; - var majorTicksEnabled = options.ticks.major.enabled; - var interval = INTERVALS[minor]; - var first = min; - var last = max; - var ticks = []; - var time; - - if (!stepSize) { - stepSize = determineStepSize(min, max, minor, capacity); - } - - // For 'week' unit, handle the first day of week option - if (weekday) { - first = +adapter.startOf(first, 'isoWeek', weekday); - last = +adapter.startOf(last, 'isoWeek', weekday); - } - - // Align first/last ticks on unit - first = +adapter.startOf(first, weekday ? 'day' : minor); - last = +adapter.startOf(last, weekday ? 'day' : minor); - - // Make sure that the last tick include max - if (last < max) { - last = +adapter.add(last, 1, minor); - } - - time = first; - - if (majorTicksEnabled && major && !weekday && !timeOpts.round) { - // Align the first tick on the previous `minor` unit aligned on the `major` unit: - // we first aligned time on the previous `major` unit then add the number of full - // stepSize there is between first and the previous major time. - time = +adapter.startOf(time, major); - time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor); - } - - for (; time < last; time = +adapter.add(time, stepSize, minor)) { - ticks.push(+time); - } - - ticks.push(+time); - - return ticks; -} - -/** - * Returns the start and end offsets from edges in the form of {start, end} - * where each value is a relative width to the scale and ranges between 0 and 1. - * They add extra margins on the both sides by scaling down the original scale. - * Offsets are added when the `offset` option is true. - */ -function computeOffsets(table, ticks, min, max, options) { - var start = 0; - var end = 0; - var first, last; - - if (options.offset && ticks.length) { - if (!options.time.min) { - first = interpolate$1(table, 'time', ticks[0], 'pos'); - if (ticks.length === 1) { - start = 1 - first; - } else { - start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2; - } - } - if (!options.time.max) { - last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos'); - if (ticks.length === 1) { - end = last; - } else { - end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2; - } - } - } - - return {start: start, end: end}; -} - -function ticksFromTimestamps(scale, values, majorUnit) { - var ticks = []; - var i, ilen, value, major; - - for (i = 0, ilen = values.length; i < ilen; ++i) { - value = values[i]; - major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false; - - ticks.push({ - value: value, - major: major - }); - } - - return ticks; -} - -var defaultConfig$4 = { - position: 'bottom', - - /** - * Data distribution along the scale: - * - 'linear': data are spread according to their time (distances can vary), - * - 'series': data are spread at the same distance from each other. - * @see https://github.com/chartjs/Chart.js/pull/4507 - * @since 2.7.0 - */ - distribution: 'linear', - - /** - * Scale boundary strategy (bypassed by min/max time options) - * - `data`: make sure data are fully visible, ticks outside are removed - * - `ticks`: make sure ticks are fully visible, data outside are truncated - * @see https://github.com/chartjs/Chart.js/pull/4556 - * @since 2.7.0 - */ - bounds: 'data', - - adapters: {}, - time: { - parser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment - format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/ - unit: false, // false == automatic or override with week, month, year, etc. - round: false, // none, or override with week, month, year, etc. - displayFormat: false, // DEPRECATED - isoWeekday: false, // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/ - minUnit: 'millisecond', - displayFormats: {} - }, - ticks: { - autoSkip: false, - - /** - * Ticks generation input values: - * - 'auto': generates "optimal" ticks based on scale size and time options. - * - 'data': generates ticks from data (including labels from data {t|x|y} objects). - * - 'labels': generates ticks from user given `data.labels` values ONLY. - * @see https://github.com/chartjs/Chart.js/pull/4507 - * @since 2.7.0 - */ - source: 'auto', - - major: { - enabled: false - } - } -}; - -var scale_time = core_scale.extend({ - initialize: function() { - this.mergeTicksOptions(); - core_scale.prototype.initialize.call(this); - }, - - update: function() { - var me = this; - var options = me.options; - var time = options.time || (options.time = {}); - var adapter = me._adapter = new core_adapters._date(options.adapters.date); - - // DEPRECATIONS: output a message only one time per update - if (time.format) { - console.warn('options.time.format is deprecated and replaced by options.time.parser.'); - } - - // Backward compatibility: before introducing adapter, `displayFormats` was - // supposed to contain *all* unit/string pairs but this can't be resolved - // when loading the scale (adapters are loaded afterward), so let's populate - // missing formats on update - helpers$1.mergeIf(time.displayFormats, adapter.formats()); - - return core_scale.prototype.update.apply(me, arguments); - }, - - /** - * Allows data to be referenced via 't' attribute - */ - getRightValue: function(rawValue) { - if (rawValue && rawValue.t !== undefined) { - rawValue = rawValue.t; - } - return core_scale.prototype.getRightValue.call(this, rawValue); - }, - - determineDataLimits: function() { - var me = this; - var chart = me.chart; - var adapter = me._adapter; - var timeOpts = me.options.time; - var unit = timeOpts.unit || 'day'; - var min = MAX_INTEGER; - var max = MIN_INTEGER; - var timestamps = []; - var datasets = []; - var labels = []; - var i, j, ilen, jlen, data, timestamp; - var dataLabels = chart.data.labels || []; - - // Convert labels to timestamps - for (i = 0, ilen = dataLabels.length; i < ilen; ++i) { - labels.push(parse(me, dataLabels[i])); - } - - // Convert data to timestamps - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - if (chart.isDatasetVisible(i)) { - data = chart.data.datasets[i].data; - - // Let's consider that all data have the same format. - if (helpers$1.isObject(data[0])) { - datasets[i] = []; - - for (j = 0, jlen = data.length; j < jlen; ++j) { - timestamp = parse(me, data[j]); - timestamps.push(timestamp); - datasets[i][j] = timestamp; - } - } else { - for (j = 0, jlen = labels.length; j < jlen; ++j) { - timestamps.push(labels[j]); - } - datasets[i] = labels.slice(0); - } - } else { - datasets[i] = []; - } - } - - if (labels.length) { - // Sort labels **after** data have been converted - labels = arrayUnique(labels).sort(sorter); - min = Math.min(min, labels[0]); - max = Math.max(max, labels[labels.length - 1]); - } - - if (timestamps.length) { - timestamps = arrayUnique(timestamps).sort(sorter); - min = Math.min(min, timestamps[0]); - max = Math.max(max, timestamps[timestamps.length - 1]); - } - - min = parse(me, timeOpts.min) || min; - max = parse(me, timeOpts.max) || max; - - // In case there is no valid min/max, set limits based on unit time option - min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min; - max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max; - - // Make sure that max is strictly higher than min (required by the lookup table) - me.min = Math.min(min, max); - me.max = Math.max(min + 1, max); - - // PRIVATE - me._horizontal = me.isHorizontal(); - me._table = []; - me._timestamps = { - data: timestamps, - datasets: datasets, - labels: labels - }; - }, - - buildTicks: function() { - var me = this; - var min = me.min; - var max = me.max; - var options = me.options; - var timeOpts = options.time; - var timestamps = []; - var ticks = []; - var i, ilen, timestamp; - - switch (options.ticks.source) { - case 'data': - timestamps = me._timestamps.data; - break; - case 'labels': - timestamps = me._timestamps.labels; - break; - case 'auto': - default: - timestamps = generate(me, min, max, me.getLabelCapacity(min), options); - } - - if (options.bounds === 'ticks' && timestamps.length) { - min = timestamps[0]; - max = timestamps[timestamps.length - 1]; - } - - // Enforce limits with user min/max options - min = parse(me, timeOpts.min) || min; - max = parse(me, timeOpts.max) || max; - - // Remove ticks outside the min/max range - for (i = 0, ilen = timestamps.length; i < ilen; ++i) { - timestamp = timestamps[i]; - if (timestamp >= min && timestamp <= max) { - ticks.push(timestamp); - } - } - - me.min = min; - me.max = max; - - // PRIVATE - me._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max); - me._majorUnit = determineMajorUnit(me._unit); - me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); - me._offsets = computeOffsets(me._table, ticks, min, max, options); - - if (options.ticks.reverse) { - ticks.reverse(); - } - - return ticksFromTimestamps(me, ticks, me._majorUnit); - }, - - getLabelForIndex: function(index, datasetIndex) { - var me = this; - var adapter = me._adapter; - var data = me.chart.data; - var timeOpts = me.options.time; - var label = data.labels && index < data.labels.length ? data.labels[index] : ''; - var value = data.datasets[datasetIndex].data[index]; - - if (helpers$1.isObject(value)) { - label = me.getRightValue(value); - } - if (timeOpts.tooltipFormat) { - return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat); - } - if (typeof label === 'string') { - return label; - } - return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime); - }, - - /** - * Function to format an individual tick mark - * @private - */ - tickFormatFunction: function(time, index, ticks, format) { - var me = this; - var adapter = me._adapter; - var options = me.options; - var formats = options.time.displayFormats; - var minorFormat = formats[me._unit]; - var majorUnit = me._majorUnit; - var majorFormat = formats[majorUnit]; - var majorTime = +adapter.startOf(time, majorUnit); - var majorTickOpts = options.ticks.major; - var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; - var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat); - var tickOpts = major ? majorTickOpts : options.ticks.minor; - var formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback); - - return formatter ? formatter(label, index, ticks) : label; - }, - - convertTicksToLabels: function(ticks) { - var labels = []; - var i, ilen; - - for (i = 0, ilen = ticks.length; i < ilen; ++i) { - labels.push(this.tickFormatFunction(ticks[i].value, i, ticks)); - } - - return labels; - }, - - /** - * @private - */ - getPixelForOffset: function(time) { - var me = this; - var isReverse = me.options.ticks.reverse; - var size = me._horizontal ? me.width : me.height; - var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top; - var pos = interpolate$1(me._table, 'time', time, 'pos'); - var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end); - - return isReverse ? start - offset : start + offset; - }, - - getPixelForValue: function(value, index, datasetIndex) { - var me = this; - var time = null; - - if (index !== undefined && datasetIndex !== undefined) { - time = me._timestamps.datasets[datasetIndex][index]; - } - - if (time === null) { - time = parse(me, value); - } - - if (time !== null) { - return me.getPixelForOffset(time); - } - }, - - getPixelForTick: function(index) { - var ticks = this.getTicks(); - return index >= 0 && index < ticks.length ? - this.getPixelForOffset(ticks[index].value) : - null; - }, - - getValueForPixel: function(pixel) { - var me = this; - var size = me._horizontal ? me.width : me.height; - var start = me._horizontal ? me.left : me.top; - var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end; - var time = interpolate$1(me._table, 'pos', pos, 'time'); - - // DEPRECATION, we should return time directly - return me._adapter._create(time); - }, - - /** - * Crude approximation of what the label width might be - * @private - */ - getLabelWidth: function(label) { - var me = this; - var ticksOpts = me.options.ticks; - var tickLabelWidth = me.ctx.measureText(label).width; - var angle = helpers$1.toRadians(ticksOpts.maxRotation); - var cosRotation = Math.cos(angle); - var sinRotation = Math.sin(angle); - var tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize); - - return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); - }, - - /** - * @private - */ - getLabelCapacity: function(exampleTime) { - var me = this; - - // pick the longest format (milliseconds) for guestimation - var format = me.options.time.displayFormats.millisecond; - var exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format); - var tickLabelWidth = me.getLabelWidth(exampleLabel); - var innerWidth = me.isHorizontal() ? me.width : me.height; - var capacity = Math.floor(innerWidth / tickLabelWidth); - - return capacity > 0 ? capacity : 1; - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults$4 = defaultConfig$4; -scale_time._defaults = _defaults$4; - -var scales = { - category: scale_category, - linear: scale_linear, - logarithmic: scale_logarithmic, - radialLinear: scale_radialLinear, - time: scale_time -}; - -var FORMATS = { - datetime: 'MMM D, YYYY, h:mm:ss a', - millisecond: 'h:mm:ss.SSS a', - second: 'h:mm:ss a', - minute: 'h:mm a', - hour: 'hA', - day: 'MMM D', - week: 'll', - month: 'MMM YYYY', - quarter: '[Q]Q - YYYY', - year: 'YYYY' -}; - -core_adapters._date.override(typeof moment === 'function' ? { - _id: 'moment', // DEBUG ONLY - - formats: function() { - return FORMATS; - }, - - parse: function(value, format) { - if (typeof value === 'string' && typeof format === 'string') { - value = moment(value, format); - } else if (!(value instanceof moment)) { - value = moment(value); - } - return value.isValid() ? value.valueOf() : null; - }, - - format: function(time, format) { - return moment(time).format(format); - }, - - add: function(time, amount, unit) { - return moment(time).add(amount, unit).valueOf(); - }, - - diff: function(max, min, unit) { - return moment.duration(moment(max).diff(moment(min))).as(unit); - }, - - startOf: function(time, unit, weekday) { - time = moment(time); - if (unit === 'isoWeek') { - return time.isoWeekday(weekday).valueOf(); - } - return time.startOf(unit).valueOf(); - }, - - endOf: function(time, unit) { - return moment(time).endOf(unit).valueOf(); - }, - - // DEPRECATIONS - - /** - * Provided for backward compatibility with scale.getValueForPixel(). - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ - _create: function(time) { - return moment(time); - }, -} : {}); - -core_defaults._set('global', { - plugins: { - filler: { - propagate: true - } - } -}); - -var mappers = { - dataset: function(source) { - var index = source.fill; - var chart = source.chart; - var meta = chart.getDatasetMeta(index); - var visible = meta && chart.isDatasetVisible(index); - var points = (visible && meta.dataset._children) || []; - var length = points.length || 0; - - return !length ? null : function(point, i) { - return (i < length && points[i]._view) || null; - }; - }, - - boundary: function(source) { - var boundary = source.boundary; - var x = boundary ? boundary.x : null; - var y = boundary ? boundary.y : null; - - return function(point) { - return { - x: x === null ? point.x : x, - y: y === null ? point.y : y, - }; - }; - } -}; - -// @todo if (fill[0] === '#') -function decodeFill(el, index, count) { - var model = el._model || {}; - var fill = model.fill; - var target; - - if (fill === undefined) { - fill = !!model.backgroundColor; - } - - if (fill === false || fill === null) { - return false; - } - - if (fill === true) { - return 'origin'; - } - - target = parseFloat(fill, 10); - if (isFinite(target) && Math.floor(target) === target) { - if (fill[0] === '-' || fill[0] === '+') { - target = index + target; - } - - if (target === index || target < 0 || target >= count) { - return false; - } - - return target; - } - - switch (fill) { - // compatibility - case 'bottom': - return 'start'; - case 'top': - return 'end'; - case 'zero': - return 'origin'; - // supported boundaries - case 'origin': - case 'start': - case 'end': - return fill; - // invalid fill values - default: - return false; - } -} - -function computeBoundary(source) { - var model = source.el._model || {}; - var scale = source.el._scale || {}; - var fill = source.fill; - var target = null; - var horizontal; - - if (isFinite(fill)) { - return null; - } - - // Backward compatibility: until v3, we still need to support boundary values set on - // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and - // controllers might still use it (e.g. the Smith chart). - - if (fill === 'start') { - target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; - } else if (fill === 'end') { - target = model.scaleTop === undefined ? scale.top : model.scaleTop; - } else if (model.scaleZero !== undefined) { - target = model.scaleZero; - } else if (scale.getBasePosition) { - target = scale.getBasePosition(); - } else if (scale.getBasePixel) { - target = scale.getBasePixel(); - } - - if (target !== undefined && target !== null) { - if (target.x !== undefined && target.y !== undefined) { - return target; - } - - if (helpers$1.isFinite(target)) { - horizontal = scale.isHorizontal(); - return { - x: horizontal ? target : null, - y: horizontal ? null : target - }; - } - } - - return null; -} - -function resolveTarget(sources, index, propagate) { - var source = sources[index]; - var fill = source.fill; - var visited = [index]; - var target; - - if (!propagate) { - return fill; - } - - while (fill !== false && visited.indexOf(fill) === -1) { - if (!isFinite(fill)) { - return fill; - } - - target = sources[fill]; - if (!target) { - return false; - } - - if (target.visible) { - return fill; - } - - visited.push(fill); - fill = target.fill; - } - - return false; -} - -function createMapper(source) { - var fill = source.fill; - var type = 'dataset'; - - if (fill === false) { - return null; - } - - if (!isFinite(fill)) { - type = 'boundary'; - } - - return mappers[type](source); -} - -function isDrawable(point) { - return point && !point.skip; -} - -function drawArea(ctx, curve0, curve1, len0, len1) { - var i; - - if (!len0 || !len1) { - return; - } - - // building first area curve (normal) - ctx.moveTo(curve0[0].x, curve0[0].y); - for (i = 1; i < len0; ++i) { - helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); - } - - // joining the two area curves - ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); - - // building opposite area curve (reverse) - for (i = len1 - 1; i > 0; --i) { - helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); - } -} - -function doFill(ctx, points, mapper, view, color, loop) { - var count = points.length; - var span = view.spanGaps; - var curve0 = []; - var curve1 = []; - var len0 = 0; - var len1 = 0; - var i, ilen, index, p0, p1, d0, d1; - - ctx.beginPath(); - - for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { - index = i % count; - p0 = points[index]._view; - p1 = mapper(p0, index, view); - d0 = isDrawable(p0); - d1 = isDrawable(p1); - - if (d0 && d1) { - len0 = curve0.push(p0); - len1 = curve1.push(p1); - } else if (len0 && len1) { - if (!span) { - drawArea(ctx, curve0, curve1, len0, len1); - len0 = len1 = 0; - curve0 = []; - curve1 = []; - } else { - if (d0) { - curve0.push(p0); - } - if (d1) { - curve1.push(p1); - } - } - } - } - - drawArea(ctx, curve0, curve1, len0, len1); - - ctx.closePath(); - ctx.fillStyle = color; - ctx.fill(); -} - -var plugin_filler = { - id: 'filler', - - afterDatasetsUpdate: function(chart, options) { - var count = (chart.data.datasets || []).length; - var propagate = options.propagate; - var sources = []; - var meta, i, el, source; - - for (i = 0; i < count; ++i) { - meta = chart.getDatasetMeta(i); - el = meta.dataset; - source = null; - - if (el && el._model && el instanceof elements.Line) { - source = { - visible: chart.isDatasetVisible(i), - fill: decodeFill(el, i, count), - chart: chart, - el: el - }; - } - - meta.$filler = source; - sources.push(source); - } - - for (i = 0; i < count; ++i) { - source = sources[i]; - if (!source) { - continue; - } - - source.fill = resolveTarget(sources, i, propagate); - source.boundary = computeBoundary(source); - source.mapper = createMapper(source); - } - }, - - beforeDatasetDraw: function(chart, args) { - var meta = args.meta.$filler; - if (!meta) { - return; - } - - var ctx = chart.ctx; - var el = meta.el; - var view = el._view; - var points = el._children || []; - var mapper = meta.mapper; - var color = view.backgroundColor || core_defaults.global.defaultColor; - - if (mapper && color && points.length) { - helpers$1.canvas.clipArea(ctx, chart.chartArea); - doFill(ctx, points, mapper, view, color, el._loop); - helpers$1.canvas.unclipArea(ctx); - } - } -}; - -var noop$1 = helpers$1.noop; -var valueOrDefault$d = helpers$1.valueOrDefault; - -core_defaults._set('global', { - legend: { - display: true, - position: 'top', - fullWidth: true, - reverse: false, - weight: 1000, - - // a callback that will handle - onClick: function(e, legendItem) { - var index = legendItem.datasetIndex; - var ci = this.chart; - var meta = ci.getDatasetMeta(index); - - // See controller.isDatasetVisible comment - meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; - - // We hid a dataset ... rerender the chart - ci.update(); - }, - - onHover: null, - onLeave: null, - - labels: { - boxWidth: 40, - padding: 10, - // Generates labels shown in the legend - // Valid properties to return: - // text : text to display - // fillStyle : fill of coloured box - // strokeStyle: stroke of coloured box - // hidden : if this legend item refers to a hidden item - // lineCap : cap style for line - // lineDash - // lineDashOffset : - // lineJoin : - // lineWidth : - generateLabels: function(chart) { - var data = chart.data; - return helpers$1.isArray(data.datasets) ? data.datasets.map(function(dataset, i) { - return { - text: dataset.label, - fillStyle: (!helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), - hidden: !chart.isDatasetVisible(i), - lineCap: dataset.borderCapStyle, - lineDash: dataset.borderDash, - lineDashOffset: dataset.borderDashOffset, - lineJoin: dataset.borderJoinStyle, - lineWidth: dataset.borderWidth, - strokeStyle: dataset.borderColor, - pointStyle: dataset.pointStyle, - - // Below is extra data used for toggling the datasets - datasetIndex: i - }; - }, this) : []; - } - } - }, - - legendCallback: function(chart) { - var text = []; - text.push('
    '); - for (var i = 0; i < chart.data.datasets.length; i++) { - text.push('
  • '); - if (chart.data.datasets[i].label) { - text.push(chart.data.datasets[i].label); - } - text.push('
  • '); - } - text.push('
'); - return text.join(''); - } -}); - -/** - * Helper function to get the box width based on the usePointStyle option - * @param {object} labelopts - the label options on the legend - * @param {number} fontSize - the label font size - * @return {number} width of the color box area - */ -function getBoxWidth(labelOpts, fontSize) { - return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ? - fontSize : - labelOpts.boxWidth; -} - -/** - * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! - */ -var Legend = core_element.extend({ - - initialize: function(config) { - helpers$1.extend(this, config); - - // Contains hit boxes for each dataset (in dataset order) - this.legendHitBoxes = []; - - /** - * @private - */ - this._hoveredItem = null; - - // Are we in doughnut mode which has a different data type - this.doughnutMode = false; - }, - - // These methods are ordered by lifecycle. Utilities then follow. - // Any function defined here is inherited by all legend types. - // Any function can be extended by the legend type - - beforeUpdate: noop$1, - update: function(maxWidth, maxHeight, margins) { - var me = this; - - // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) - me.beforeUpdate(); - - // Absorb the master measurements - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me.margins = margins; - - // Dimensions - me.beforeSetDimensions(); - me.setDimensions(); - me.afterSetDimensions(); - // Labels - me.beforeBuildLabels(); - me.buildLabels(); - me.afterBuildLabels(); - - // Fit - me.beforeFit(); - me.fit(); - me.afterFit(); - // - me.afterUpdate(); - - return me.minSize; - }, - afterUpdate: noop$1, - - // - - beforeSetDimensions: noop$1, - setDimensions: function() { - var me = this; - // Set the unconstrained dimension before label rotation - if (me.isHorizontal()) { - // Reset position before calculating rotation - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; - } else { - me.height = me.maxHeight; - - // Reset position before calculating rotation - me.top = 0; - me.bottom = me.height; - } - - // Reset padding - me.paddingLeft = 0; - me.paddingTop = 0; - me.paddingRight = 0; - me.paddingBottom = 0; - - // Reset minSize - me.minSize = { - width: 0, - height: 0 - }; - }, - afterSetDimensions: noop$1, - - // - - beforeBuildLabels: noop$1, - buildLabels: function() { - var me = this; - var labelOpts = me.options.labels || {}; - var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || []; - - if (labelOpts.filter) { - legendItems = legendItems.filter(function(item) { - return labelOpts.filter(item, me.chart.data); - }); - } - - if (me.options.reverse) { - legendItems.reverse(); - } - - me.legendItems = legendItems; - }, - afterBuildLabels: noop$1, - - // - - beforeFit: noop$1, - fit: function() { - var me = this; - var opts = me.options; - var labelOpts = opts.labels; - var display = opts.display; - - var ctx = me.ctx; - - var labelFont = helpers$1.options._parseFont(labelOpts); - var fontSize = labelFont.size; - - // Reset hit boxes - var hitboxes = me.legendHitBoxes = []; - - var minSize = me.minSize; - var isHorizontal = me.isHorizontal(); - - if (isHorizontal) { - minSize.width = me.maxWidth; // fill all the width - minSize.height = display ? 10 : 0; - } else { - minSize.width = display ? 10 : 0; - minSize.height = me.maxHeight; // fill all the height - } - - // Increase sizes here - if (display) { - ctx.font = labelFont.string; - - if (isHorizontal) { - // Labels - - // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one - var lineWidths = me.lineWidths = [0]; - var totalHeight = 0; - - ctx.textAlign = 'left'; - ctx.textBaseline = 'top'; - - helpers$1.each(me.legendItems, function(legendItem, i) { - var boxWidth = getBoxWidth(labelOpts, fontSize); - var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; - - if (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) { - totalHeight += fontSize + labelOpts.padding; - lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding; - } - - // Store the hitbox width and height here. Final position will be updated in `draw` - hitboxes[i] = { - left: 0, - top: 0, - width: width, - height: fontSize - }; - - lineWidths[lineWidths.length - 1] += width + labelOpts.padding; - }); - - minSize.height += totalHeight; - - } else { - var vPadding = labelOpts.padding; - var columnWidths = me.columnWidths = []; - var totalWidth = labelOpts.padding; - var currentColWidth = 0; - var currentColHeight = 0; - var itemHeight = fontSize + vPadding; - - helpers$1.each(me.legendItems, function(legendItem, i) { - var boxWidth = getBoxWidth(labelOpts, fontSize); - var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; - - // If too tall, go to new column - if (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) { - totalWidth += currentColWidth + labelOpts.padding; - columnWidths.push(currentColWidth); // previous column width - - currentColWidth = 0; - currentColHeight = 0; - } - - // Get max width - currentColWidth = Math.max(currentColWidth, itemWidth); - currentColHeight += itemHeight; - - // Store the hitbox width and height here. Final position will be updated in `draw` - hitboxes[i] = { - left: 0, - top: 0, - width: itemWidth, - height: fontSize - }; - }); - - totalWidth += currentColWidth; - columnWidths.push(currentColWidth); - minSize.width += totalWidth; - } - } - - me.width = minSize.width; - me.height = minSize.height; - }, - afterFit: noop$1, - - // Shared Methods - isHorizontal: function() { - return this.options.position === 'top' || this.options.position === 'bottom'; - }, - - // Actually draw the legend on the canvas - draw: function() { - var me = this; - var opts = me.options; - var labelOpts = opts.labels; - var globalDefaults = core_defaults.global; - var defaultColor = globalDefaults.defaultColor; - var lineDefault = globalDefaults.elements.line; - var legendWidth = me.width; - var lineWidths = me.lineWidths; - - if (opts.display) { - var ctx = me.ctx; - var fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor); - var labelFont = helpers$1.options._parseFont(labelOpts); - var fontSize = labelFont.size; - var cursor; - - // Canvas setup - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; - ctx.lineWidth = 0.5; - ctx.strokeStyle = fontColor; // for strikethrough effect - ctx.fillStyle = fontColor; // render in correct colour - ctx.font = labelFont.string; - - var boxWidth = getBoxWidth(labelOpts, fontSize); - var hitboxes = me.legendHitBoxes; - - // current position - var drawLegendBox = function(x, y, legendItem) { - if (isNaN(boxWidth) || boxWidth <= 0) { - return; - } - - // Set the ctx for the box - ctx.save(); - - var lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth); - ctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor); - ctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle); - ctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset); - ctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle); - ctx.lineWidth = lineWidth; - ctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor); - - if (ctx.setLineDash) { - // IE 9 and 10 do not support line dash - ctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash)); - } - - if (opts.labels && opts.labels.usePointStyle) { - // Recalculate x and y for drawPoint() because its expecting - // x and y to be center of figure (instead of top left) - var radius = boxWidth * Math.SQRT2 / 2; - var centerX = x + boxWidth / 2; - var centerY = y + fontSize / 2; - - // Draw pointStyle as legend symbol - helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); - } else { - // Draw box as legend symbol - if (lineWidth !== 0) { - ctx.strokeRect(x, y, boxWidth, fontSize); - } - ctx.fillRect(x, y, boxWidth, fontSize); - } - - ctx.restore(); - }; - var fillText = function(x, y, legendItem, textWidth) { - var halfFontSize = fontSize / 2; - var xLeft = boxWidth + halfFontSize + x; - var yMiddle = y + halfFontSize; - - ctx.fillText(legendItem.text, xLeft, yMiddle); - - if (legendItem.hidden) { - // Strikethrough the text if hidden - ctx.beginPath(); - ctx.lineWidth = 2; - ctx.moveTo(xLeft, yMiddle); - ctx.lineTo(xLeft + textWidth, yMiddle); - ctx.stroke(); - } - }; - - // Horizontal - var isHorizontal = me.isHorizontal(); - if (isHorizontal) { - cursor = { - x: me.left + ((legendWidth - lineWidths[0]) / 2) + labelOpts.padding, - y: me.top + labelOpts.padding, - line: 0 - }; - } else { - cursor = { - x: me.left + labelOpts.padding, - y: me.top + labelOpts.padding, - line: 0 - }; - } - - var itemHeight = fontSize + labelOpts.padding; - helpers$1.each(me.legendItems, function(legendItem, i) { - var textWidth = ctx.measureText(legendItem.text).width; - var width = boxWidth + (fontSize / 2) + textWidth; - var x = cursor.x; - var y = cursor.y; - - // Use (me.left + me.minSize.width) and (me.top + me.minSize.height) - // instead of me.right and me.bottom because me.width and me.height - // may have been changed since me.minSize was calculated - if (isHorizontal) { - if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) { - y = cursor.y += itemHeight; - cursor.line++; - x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2) + labelOpts.padding; - } - } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) { - x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; - y = cursor.y = me.top + labelOpts.padding; - cursor.line++; - } - - drawLegendBox(x, y, legendItem); - - hitboxes[i].left = x; - hitboxes[i].top = y; - - // Fill the actual label - fillText(x, y, legendItem, textWidth); - - if (isHorizontal) { - cursor.x += width + labelOpts.padding; - } else { - cursor.y += itemHeight; - } - - }); - } - }, - - /** - * @private - */ - _getLegendItemAt: function(x, y) { - var me = this; - var i, hitBox, lh; - - if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { - // See if we are touching one of the dataset boxes - lh = me.legendHitBoxes; - for (i = 0; i < lh.length; ++i) { - hitBox = lh[i]; - - if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { - // Touching an element - return me.legendItems[i]; - } - } - } - - return null; - }, - - /** - * Handle an event - * @private - * @param {IEvent} event - The event to handle - */ - handleEvent: function(e) { - var me = this; - var opts = me.options; - var type = e.type === 'mouseup' ? 'click' : e.type; - var hoveredItem; - - if (type === 'mousemove') { - if (!opts.onHover && !opts.onLeave) { - return; - } - } else if (type === 'click') { - if (!opts.onClick) { - return; - } - } else { - return; - } - - // Chart event already has relative position in it - hoveredItem = me._getLegendItemAt(e.x, e.y); - - if (type === 'click') { - if (hoveredItem && opts.onClick) { - // use e.native for backwards compatibility - opts.onClick.call(me, e.native, hoveredItem); - } - } else { - if (opts.onLeave && hoveredItem !== me._hoveredItem) { - if (me._hoveredItem) { - opts.onLeave.call(me, e.native, me._hoveredItem); - } - me._hoveredItem = hoveredItem; - } - - if (opts.onHover && hoveredItem) { - // use e.native for backwards compatibility - opts.onHover.call(me, e.native, hoveredItem); - } - } - } -}); - -function createNewLegendAndAttach(chart, legendOpts) { - var legend = new Legend({ - ctx: chart.ctx, - options: legendOpts, - chart: chart - }); - - core_layouts.configure(chart, legend, legendOpts); - core_layouts.addBox(chart, legend); - chart.legend = legend; -} - -var plugin_legend = { - id: 'legend', - - /** - * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making - * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of - * the plugin, which one will be re-exposed in the chart.js file. - * https://github.com/chartjs/Chart.js/pull/2640 - * @private - */ - _element: Legend, - - beforeInit: function(chart) { - var legendOpts = chart.options.legend; - - if (legendOpts) { - createNewLegendAndAttach(chart, legendOpts); - } - }, - - beforeUpdate: function(chart) { - var legendOpts = chart.options.legend; - var legend = chart.legend; - - if (legendOpts) { - helpers$1.mergeIf(legendOpts, core_defaults.global.legend); - - if (legend) { - core_layouts.configure(chart, legend, legendOpts); - legend.options = legendOpts; - } else { - createNewLegendAndAttach(chart, legendOpts); - } - } else if (legend) { - core_layouts.removeBox(chart, legend); - delete chart.legend; - } - }, - - afterEvent: function(chart, e) { - var legend = chart.legend; - if (legend) { - legend.handleEvent(e); - } - } -}; - -var noop$2 = helpers$1.noop; - -core_defaults._set('global', { - title: { - display: false, - fontStyle: 'bold', - fullWidth: true, - padding: 10, - position: 'top', - text: '', - weight: 2000 // by default greater than legend (1000) to be above - } -}); - -/** - * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! - */ -var Title = core_element.extend({ - initialize: function(config) { - var me = this; - helpers$1.extend(me, config); - - // Contains hit boxes for each dataset (in dataset order) - me.legendHitBoxes = []; - }, - - // These methods are ordered by lifecycle. Utilities then follow. - - beforeUpdate: noop$2, - update: function(maxWidth, maxHeight, margins) { - var me = this; - - // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) - me.beforeUpdate(); - - // Absorb the master measurements - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me.margins = margins; - - // Dimensions - me.beforeSetDimensions(); - me.setDimensions(); - me.afterSetDimensions(); - // Labels - me.beforeBuildLabels(); - me.buildLabels(); - me.afterBuildLabels(); - - // Fit - me.beforeFit(); - me.fit(); - me.afterFit(); - // - me.afterUpdate(); - - return me.minSize; - - }, - afterUpdate: noop$2, - - // - - beforeSetDimensions: noop$2, - setDimensions: function() { - var me = this; - // Set the unconstrained dimension before label rotation - if (me.isHorizontal()) { - // Reset position before calculating rotation - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; - } else { - me.height = me.maxHeight; - - // Reset position before calculating rotation - me.top = 0; - me.bottom = me.height; - } - - // Reset padding - me.paddingLeft = 0; - me.paddingTop = 0; - me.paddingRight = 0; - me.paddingBottom = 0; - - // Reset minSize - me.minSize = { - width: 0, - height: 0 - }; - }, - afterSetDimensions: noop$2, - - // - - beforeBuildLabels: noop$2, - buildLabels: noop$2, - afterBuildLabels: noop$2, - - // - - beforeFit: noop$2, - fit: function() { - var me = this; - var opts = me.options; - var display = opts.display; - var minSize = me.minSize; - var lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1; - var fontOpts = helpers$1.options._parseFont(opts); - var textSize = display ? (lineCount * fontOpts.lineHeight) + (opts.padding * 2) : 0; - - if (me.isHorizontal()) { - minSize.width = me.maxWidth; // fill all the width - minSize.height = textSize; - } else { - minSize.width = textSize; - minSize.height = me.maxHeight; // fill all the height - } - - me.width = minSize.width; - me.height = minSize.height; - - }, - afterFit: noop$2, - - // Shared Methods - isHorizontal: function() { - var pos = this.options.position; - return pos === 'top' || pos === 'bottom'; - }, - - // Actually draw the title block on the canvas - draw: function() { - var me = this; - var ctx = me.ctx; - var opts = me.options; - - if (opts.display) { - var fontOpts = helpers$1.options._parseFont(opts); - var lineHeight = fontOpts.lineHeight; - var offset = lineHeight / 2 + opts.padding; - var rotation = 0; - var top = me.top; - var left = me.left; - var bottom = me.bottom; - var right = me.right; - var maxWidth, titleX, titleY; - - ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour - ctx.font = fontOpts.string; - - // Horizontal - if (me.isHorizontal()) { - titleX = left + ((right - left) / 2); // midpoint of the width - titleY = top + offset; - maxWidth = right - left; - } else { - titleX = opts.position === 'left' ? left + offset : right - offset; - titleY = top + ((bottom - top) / 2); - maxWidth = bottom - top; - rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); - } - - ctx.save(); - ctx.translate(titleX, titleY); - ctx.rotate(rotation); - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - - var text = opts.text; - if (helpers$1.isArray(text)) { - var y = 0; - for (var i = 0; i < text.length; ++i) { - ctx.fillText(text[i], 0, y, maxWidth); - y += lineHeight; - } - } else { - ctx.fillText(text, 0, 0, maxWidth); - } - - ctx.restore(); - } - } -}); - -function createNewTitleBlockAndAttach(chart, titleOpts) { - var title = new Title({ - ctx: chart.ctx, - options: titleOpts, - chart: chart - }); - - core_layouts.configure(chart, title, titleOpts); - core_layouts.addBox(chart, title); - chart.titleBlock = title; -} - -var plugin_title = { - id: 'title', - - /** - * Backward compatibility: since 2.1.5, the title is registered as a plugin, making - * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of - * the plugin, which one will be re-exposed in the chart.js file. - * https://github.com/chartjs/Chart.js/pull/2640 - * @private - */ - _element: Title, - - beforeInit: function(chart) { - var titleOpts = chart.options.title; - - if (titleOpts) { - createNewTitleBlockAndAttach(chart, titleOpts); - } - }, - - beforeUpdate: function(chart) { - var titleOpts = chart.options.title; - var titleBlock = chart.titleBlock; - - if (titleOpts) { - helpers$1.mergeIf(titleOpts, core_defaults.global.title); - - if (titleBlock) { - core_layouts.configure(chart, titleBlock, titleOpts); - titleBlock.options = titleOpts; - } else { - createNewTitleBlockAndAttach(chart, titleOpts); - } - } else if (titleBlock) { - core_layouts.removeBox(chart, titleBlock); - delete chart.titleBlock; - } - } -}; - -var plugins = {}; -var filler = plugin_filler; -var legend = plugin_legend; -var title = plugin_title; -plugins.filler = filler; -plugins.legend = legend; -plugins.title = title; - -/** - * @namespace Chart - */ - - -core_controller.helpers = helpers$1; - -// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! -core_helpers(core_controller); - -core_controller._adapters = core_adapters; -core_controller.Animation = core_animation; -core_controller.animationService = core_animations; -core_controller.controllers = controllers; -core_controller.DatasetController = core_datasetController; -core_controller.defaults = core_defaults; -core_controller.Element = core_element; -core_controller.elements = elements; -core_controller.Interaction = core_interaction; -core_controller.layouts = core_layouts; -core_controller.platform = platform; -core_controller.plugins = core_plugins; -core_controller.Scale = core_scale; -core_controller.scaleService = core_scaleService; -core_controller.Ticks = core_ticks; -core_controller.Tooltip = core_tooltip; - -// Register built-in scales - -core_controller.helpers.each(scales, function(scale, type) { - core_controller.scaleService.registerScaleType(type, scale, scale._defaults); -}); - -// Load to register built-in adapters (as side effects) - - -// Loading built-in plugins - -for (var k in plugins) { - if (plugins.hasOwnProperty(k)) { - core_controller.plugins.register(plugins[k]); - } -} - -core_controller.platform.initialize(); - -var src = core_controller; -if (typeof window !== 'undefined') { - window.Chart = core_controller; -} - -// DEPRECATIONS - -/** - * Provided for backward compatibility, not available anymore - * @namespace Chart.Chart - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ -core_controller.Chart = core_controller; - -/** - * Provided for backward compatibility, not available anymore - * @namespace Chart.Legend - * @deprecated since version 2.1.5 - * @todo remove at version 3 - * @private - */ -core_controller.Legend = plugins.legend._element; - -/** - * Provided for backward compatibility, not available anymore - * @namespace Chart.Title - * @deprecated since version 2.1.5 - * @todo remove at version 3 - * @private - */ -core_controller.Title = plugins.title._element; - -/** - * Provided for backward compatibility, use Chart.plugins instead - * @namespace Chart.pluginService - * @deprecated since version 2.1.5 - * @todo remove at version 3 - * @private - */ -core_controller.pluginService = core_controller.plugins; - -/** - * Provided for backward compatibility, inheriting from Chart.PlugingBase has no - * effect, instead simply create/register plugins via plain JavaScript objects. - * @interface Chart.PluginBase - * @deprecated since version 2.5.0 - * @todo remove at version 3 - * @private - */ -core_controller.PluginBase = core_controller.Element.extend({}); - -/** - * Provided for backward compatibility, use Chart.helpers.canvas instead. - * @namespace Chart.canvasHelpers - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ -core_controller.canvasHelpers = core_controller.helpers.canvas; - -/** - * Provided for backward compatibility, use Chart.layouts instead. - * @namespace Chart.layoutService - * @deprecated since version 2.7.3 - * @todo remove at version 3 - * @private - */ -core_controller.layoutService = core_controller.layouts; - -/** - * Provided for backward compatibility, not available anymore. - * @namespace Chart.LinearScaleBase - * @deprecated since version 2.8 - * @todo remove at version 3 - * @private - */ -core_controller.LinearScaleBase = scale_linearbase; - -/** - * Provided for backward compatibility, instead we should create a new Chart - * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`). - * @deprecated since version 2.8.0 - * @todo remove at version 3 - */ -core_controller.helpers.each( - [ - 'Bar', - 'Bubble', - 'Doughnut', - 'Line', - 'PolarArea', - 'Radar', - 'Scatter' - ], - function(klass) { - core_controller[klass] = function(ctx, cfg) { - return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, { - type: klass.charAt(0).toLowerCase() + klass.slice(1) - })); - }; - } -); - -return src; - -}))); diff --git a/SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js b/SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js deleted file mode 100644 index 0ef77455..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js +++ /dev/null @@ -1,911 +0,0 @@ -/* - CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ - Copyright 2018 fenopix - - --------------------- License Information -------------------- - CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. - https://canvasjs.com/license/ - -*/ -/*eslint-disable*/ -/*jshint ignore:start*/ -(function(){function qa(k,p){k.prototype=eb(p.prototype);k.prototype.constructor=k;k.base=p.prototype}function eb(k){function p(){}p.prototype=k;return new p}function Ya(k,p,D){"millisecond"===D?k.setMilliseconds(k.getMilliseconds()+1*p):"second"===D?k.setSeconds(k.getSeconds()+1*p):"minute"===D?k.setMinutes(k.getMinutes()+1*p):"hour"===D?k.setHours(k.getHours()+1*p):"day"===D?k.setDate(k.getDate()+1*p):"week"===D?k.setDate(k.getDate()+7*p):"month"===D?k.setMonth(k.getMonth()+1*p):"year"===D&&k.setFullYear(k.getFullYear()+ -1*p);return k}function $(k,p){var D=!1;0>k&&(D=!0,k*=-1);k=""+k;for(p=p?p:1;k.length
Please right click on the image and save it to your device
"), -p.document.close()}}}function N(k){var p=((k&16711680)>>16).toString(16),D=((k&65280)>>8).toString(16);k=((k&255)>>0).toString(16);p=2>p.length?"0"+p:p;D=2>D.length?"0"+D:D;k=2>k.length?"0"+k:k;return"#"+p+D+k}function fb(k,p){var D=this.length>>>0,r=Number(p)||0,r=0>r?Math.ceil(r):Math.floor(r);for(0>r&&(r+=D);rD;D++)if(k[D]!==k[D+4]|k[D]!==k[D+8]|k[D]!==k[D+12]){p=!1;break}return p?k[0]<<16|k[1]<<8|k[2]:0}function na(k,p,D){return k in p?p[k]:D[k]}function Oa(k,p,D){if(r&&bb){var u=k.getContext("2d");Pa=u.webkitBackingStorePixelRatio|| -u.mozBackingStorePixelRatio||u.msBackingStorePixelRatio||u.oBackingStorePixelRatio||u.backingStorePixelRatio||1;W=Ua/Pa;k.width=p*W;k.height=D*W;Ua!==Pa&&(k.style.width=p+"px",k.style.height=D+"px",u.scale(W,W))}else k.width=p,k.height=D}function hb(k){if(!ib){var p=!1,D=!1;"undefined"===typeof ra.Chart.creditHref?(k.creditHref=ja("iuuqr;..b`ow`rkr/bnl."),k.creditText=ja("B`ow`rKR/bnl")):(p=k.updateOption("creditText"),D=k.updateOption("creditHref"));if(k.creditHref&&k.creditText){k._creditLink|| -(k._creditLink=document.createElement("a"),k._creditLink.setAttribute("class","canvasjs-chart-credit"),k._creditLink.setAttribute("title","JavaScript Charts"),k._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:2px;top:"+(k.height-14)+"px;color:dimgrey;text-decoration:none;font-size:11px;font-family: Calibri, Lucida Grande, Lucida Sans Unicode, Arial, sans-serif"),k._creditLink.setAttribute("tabIndex",-1),k._creditLink.setAttribute("target","_blank"));if(0===k.renderCount|| -p||D)k._creditLink.setAttribute("href",k.creditHref),k._creditLink.innerHTML=k.creditText;k._creditLink&&k.creditHref&&k.creditText?(k._creditLink.parentElement||k._canvasJSContainer.appendChild(k._creditLink),k._creditLink.style.top=k.height-14+"px"):k._creditLink.parentElement&&k._canvasJSContainer.removeChild(k._creditLink)}}}function ta(k,p){Ja&&(this.canvasCount|=0,window.console.log(++this.canvasCount));var D=document.createElement("canvas");D.setAttribute("class","canvasjs-chart-canvas");Oa(D, -k,p);r||"undefined"===typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(D);return D}function sa(k,p,D){for(var r in D)p.style[r]=D[r]}function ua(k,p,D){p.getAttribute("state")||(p.style.backgroundColor=k.toolbar.backgroundColor,p.style.color=k.toolbar.fontColor,p.style.border="none",sa(k,p,{WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",userSelect:"none"}));p.getAttribute("state")!==D&&(p.setAttribute("state",D),p.setAttribute("type","button"),sa(k,p,{padding:"5px 12px", -cursor:"pointer","float":"left",width:"40px",height:"25px",outline:"0px",verticalAlign:"baseline",lineHeight:"0"}),p.setAttribute("title",k._cultureInfo[D+"Text"]),p.innerHTML=""+k._cultureInfo[D+"Text"]+"")}function Qa(){for(var k=null,p=0;pa?"a":"p";case "tt":return 12>a?"am":"pm";case "T":return 12>a?"A": -"P";case "TT":return 12>a?"AM":"PM";case "K":return S?"UTC":(String(z).match(H)||[""]).pop().replace(F,"");case "z":return(0k?!0:!1;u&&(k*=-1);var v=r?r.decimalSeparator:".",H=r?r.digitGroupSeparator: -",",F="";p=String(p);var F=1,z=r="",E=-1,L=[],R=[],I=0,N=0,S=0,O=!1,U=0,z=p.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|\u2030|./g);p=null;for(var Q=0;z&&QE)E=Q;else{if("%"===p)F*=100;else if("\u2030"===p){F*=1E3;continue}else if(","===p[0]&&"."===p[p.length-1]){F/=Math.pow(1E3,p.length-1);E=Q+p.length-1;continue}else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||(O=!0);0>E?(L.push(p),"#"===p||"0"===p?I++:","===p&&S++):(R.push(p),"#"!==p&&"0"!==p||N++)}O&&(p=Math.floor(k), -z=-Math.floor(Math.log(k)/Math.LN10+1),U=0===k?0:0===p?-(I+z):String(p).length-I,F/=Math.pow(10,U));0>E&&(E=Q);F=(k*F).toFixed(N);p=F.split(".");F=(p[0]+"").split("");k=(p[1]+"").split("");F&&"0"===F[0]&&F.shift();for(O=z=Q=N=E=0;0U?p.replace("+","").replace("-",""):p.replace("-",""),r+=p.replace(/[0]+/,function(k){return $(U,k.length)}));H="";for(L=!1;0U?p.replace("+","").replace("-",""):p.replace("-",""),H+=p.replace(/[0]+/,function(k){return $(U,k.length)}));r+=(L?v:"")+H;return u?"-"+r:r},Ra=function(k){var p=0,r=0;k=k||window.event;k.offsetX||0===k.offsetX?(p=k.offsetX,r=k.offsetY):k.layerX||0==k.layerX?(p=k.layerX,r=k.layerY):(p=k.pageX-k.target.offsetLeft, -r=k.pageY-k.target.offsetTop);return{x:p,y:r}},bb=!0,Ua=window.devicePixelRatio||1,Pa=1,W=bb?Ua/Pa:1,ea=function(k,p,r,u,v,H,F,z,E,L,R,N,O){"undefined"===typeof O&&(O=1);F=F||0;z=z||"black";var I=15p)v=H-1;else break}r>p&&1H&&(F=p.pop(),u-=F.height,v=z)}this._wrappedText={lines:p,width:v,height:u};this.width=v+(this.leftPadding+this.rightPadding);this.height=u+(this.topPadding+this.bottomPadding);this.ctx.font=r};ka.prototype._getFontString=function(){var k;k=""+(this.fontStyle?this.fontStyle+" ":"");k+=this.fontWeight?this.fontWeight+" ":"";k+=this.fontSize?this.fontSize+"px ":"";var p=this.fontFamily?this.fontFamily+"":"";!r&&p&&(p=p.split(",")[0],"'"!==p[0]&&'"'!==p[0]&&(p="'"+p+"'"));return k+=p}; -qa(Va,V);qa(Aa,V);Aa.prototype.setLayout=function(){if(this.text){var k=this.dockInsidePlotArea?this.chart.plotArea:this.chart,p=k.layoutManager.getFreeSpace(),r=p.x1,v=p.y1,E=0,H=0,F=this.chart._menuButton&&this.chart.exportEnabled&&"top"===this.verticalAlign?22:0,z,I;"top"===this.verticalAlign||"bottom"===this.verticalAlign?(null===this.maxWidth&&(this.maxWidth=p.width-4-F*("center"===this.horizontalAlign?2:1)),H=0.5*p.height-this.margin-2,E=0):"center"===this.verticalAlign&&("left"===this.horizontalAlign|| -"right"===this.horizontalAlign?(null===this.maxWidth&&(this.maxWidth=p.height-4),H=0.5*p.width-this.margin-2):"center"===this.horizontalAlign&&(null===this.maxWidth&&(this.maxWidth=p.width-4),H=0.5*p.height-4));var L;u(this.padding)||"number"!==typeof this.padding?u(this.padding)||"object"!==typeof this.padding||(L=this.padding.top?this.padding.top:this.padding.bottom?this.padding.bottom:0,L+=this.padding.bottom?this.padding.bottom:this.padding.top?this.padding.top:0,L*=1.25):L=2.5*this.padding;this.wrap|| -(H=Math.min(H,Math.max(1.5*this.fontSize,this.fontSize+L)));H=new ka(this.ctx,{fontSize:this.fontSize,fontFamily:this.fontFamily,fontColor:this.fontColor,fontStyle:this.fontStyle,fontWeight:this.fontWeight,horizontalAlign:this.horizontalAlign,verticalAlign:this.verticalAlign,borderColor:this.borderColor,borderThickness:this.borderThickness,backgroundColor:this.backgroundColor,maxWidth:this.maxWidth,maxHeight:H,cornerRadius:this.cornerRadius,text:this.text,padding:this.padding,textBaseline:"top"}); -L=H.measureText();"top"===this.verticalAlign||"bottom"===this.verticalAlign?("top"===this.verticalAlign?(v=p.y1+2,I="top"):"bottom"===this.verticalAlign&&(v=p.y2-2-L.height,I="bottom"),"left"===this.horizontalAlign?r=p.x1+2:"center"===this.horizontalAlign?r=p.x1+p.width/2-L.width/2:"right"===this.horizontalAlign&&(r=p.x2-2-L.width-F),z=this.horizontalAlign,this.width=L.width,this.height=L.height):"center"===this.verticalAlign&&("left"===this.horizontalAlign?(r=p.x1+2,v=p.y2-2-(this.maxWidth/2-L.width/ -2),E=-90,I="left",this.width=L.height,this.height=L.width):"right"===this.horizontalAlign?(r=p.x2-2,v=p.y1+2+(this.maxWidth/2-L.width/2),E=90,I="right",this.width=L.height,this.height=L.width):"center"===this.horizontalAlign&&(v=k.y1+(k.height/2-L.height/2),r=k.x1+(k.width/2-L.width/2),I="center",this.width=L.width,this.height=L.height),z="center");H.x=r;H.y=v;H.angle=E;H.horizontalAlign=z;this._textBlock=H;k.layoutManager.registerSpace(I,{width:this.width+("left"===I||"right"===I?this.margin+2:0), -height:this.height+("top"===I||"bottom"===I?this.margin+2:0)});this.bounds={x1:r,y1:v,x2:r+this.width,y2:v+this.height};this.ctx.textBaseline="top"}};Aa.prototype.render=function(){this._textBlock&&this._textBlock.render(!0)};qa(Ka,V);Ka.prototype.setLayout=Aa.prototype.setLayout;Ka.prototype.render=Aa.prototype.render;Wa.prototype.get=function(k,p){var r=null;0a[g].x&&0w?{x:a[l].x+w/3,y:a[l].y+c/3}:{x:a[l].x,y:a[l].y+c/9};l=e;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[l].x-a[g].x?0.01:a[l].x-a[g].x))*(d- -1)/2+1;w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0w?{x:a[l].x-w/3,y:a[l].y-c/3}:{x:a[l].x,y:a[l].y-c/9};b[b.length]=a[e]}return b}function E(a,d,b,c,e,g,m,l,w,h){var s=0;h?(m.color=g,l.color=g):h=1;s=w?Math.abs(e-b):Math.abs(c-d);s=0this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360);this.options.scaleBreaks&&(this.scaleBreaks=new Q(this.chart, -this.options.scaleBreaks,++this.chart._eventManager.lastObjectId,this));this.stripLines=[];if(this.options.stripLines&&0=this._appliedBreaks[a+1].startValue&&(this._appliedBreaks[a].endValue=Math.max(this._appliedBreaks[a].endValue,this._appliedBreaks[a+1].endValue),window.console&&window.console.log("CanvasJS Error: Breaks "+a+" and "+(a+1)+" are overlapping."),this._appliedBreaks.splice(a,2),a--)}}function L(a,d,b,c,e,g){L.base.constructor.call(this,"Break",d,b,c,g);this.id=e;this.chart=a;this.ctx=this.chart.ctx;this.scaleBreaks=g;this.optionsName= -d;this.isOptionsInArray=!0;this.type=b.type?this.type:g.type;this.fillOpacity=u(b.fillOpacity)?g.fillOpacity:this.fillOpacity;this.lineThickness=u(b.lineThickness)?g.lineThickness:this.lineThickness;this.color=b.color?this.color:g.color;this.lineColor=b.lineColor?this.lineColor:g.lineColor;this.lineDashType=b.lineDashType?this.lineDashType:g.lineDashType;!u(this.startValue)&&this.startValue.getTime&&(this.startValue=this.startValue.getTime());!u(this.endValue)&&this.endValue.getTime&&(this.endValue= -this.endValue.getTime());"number"===typeof this.startValue&&("number"===typeof this.endValue&&this.endValue=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers);O(this._zoomButton,"mouseout",function(){d||(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(0%)", -filter:"invert(0%)"}))},this.allDOMEventHandlers)}this._resetButton||(d=!1,va(this._resetButton=document.createElement("button")),ua(this,this._resetButton,"reset"),this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor,this._toolBar.appendChild(this._resetButton),O(this._resetButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._resetButton,"click",function(){a.toolTip.hide();a.zoomEnabled||a.panEnabled?(a.zoomEnabled= -!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"),a._defaultCursor="default",a.overlaidCanvas.style.cursor=a._defaultCursor):(a.zoomEnabled=!1,a.panEnabled=!1);if(a.sessionVariables.axisX)for(var c=0;c=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers),O(this._resetButton,"mouseout",function(){d||(sa(a,a._resetButton, -{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers),this.overlaidCanvas.style.cursor=a._defaultCursor);this.zoomEnabled||this.panEnabled||(this._zoomButton?(a._zoomButton.getAttribute("state")===a._cultureInfo.zoomText?(this.panEnabled=!0,this.zoomEnabled=!1):(this.zoomEnabled=!0,this.panEnabled= -!1),Qa(a._zoomButton,a._resetButton)):(this.zoomEnabled=!0,this.panEnabled=!1))}else this.panEnabled=this.zoomEnabled=!1;this._menuButton?this.exportEnabled?Qa(this._menuButton):va(this._menuButton):this.exportEnabled&&r&&(d=!1,this._menuButton=document.createElement("button"),ua(this,this._menuButton,"menu"),this._toolBar.appendChild(this._menuButton),O(this._menuButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._menuButton,"click",function(){"none"!==a._dropdownMenu.style.display|| -a._dropDownCloseTime&&500>=(new Date).getTime()-a._dropDownCloseTime.getTime()||(a._dropdownMenu.style.display="block",a._menuButton.blur(),a._dropdownMenu.focus())},this.allDOMEventHandlers,!0),O(this._menuButton,"mouseover",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.fontColorOnHover}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers,!0), -O(this._menuButton,"mouseout",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers,!0));if(!this._dropdownMenu&&this.exportEnabled&&r){d=!1;this._dropdownMenu=document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);var b=-1!==this.theme.indexOf("dark")?"black":"#888888";this._dropdownMenu.style.cssText= -"position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 0px;top: 25px;min-width: 120px;outline: 0;font-size: 14px; font-family: Arial, Helvetica, sans-serif;padding: 5px 0px 5px 0px;text-align: left;line-height: 10px;background-color:"+this.toolbar.backgroundColor+";box-shadow: 2px 2px 10px "+b;a._dropdownMenu.style.display="none";this._toolBar.appendChild(this._dropdownMenu);O(this._dropdownMenu,"blur",function(){va(a._dropdownMenu); -a._dropDownCloseTime=new Date},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.printText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers, -!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){a.print();va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.saveJPGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d= -!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"jpeg",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText= -"padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.savePNGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor, -this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"png",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0)}"none"!==this._toolBar.style.display&&this._zoomButton&&(this.panEnabled?ua(a,a._zoomButton,"zoom"):ua(a,a._zoomButton,"pan"),a._resetButton.getAttribute("state")!==a._cultureInfo.resetText&&ua(a,a._resetButton,"reset"));this.options.toolTip&&this.toolTip.options!==this.options.toolTip&&(this.toolTip.options=this.options.toolTip); -for(var c in this.toolTip.options)this.toolTip.options.hasOwnProperty(c)&&this.toolTip.updateOption(c)};p.prototype._updateSize=function(){var a;a=[this.canvas,this._preRenderCanvas,this.overlaidCanvas,this._eventManager.ghostCanvas];var d=0,b=0;this.options.width?d=this.width:this.width=d=0c.linkedDataSeriesIndex||c.linkedDataSeriesIndex>=this.options.data.length||"number"!==typeof c.linkedDataSeriesIndex|| -"error"===this.options.data[c.linkedDataSeriesIndex].type)&&(c.linkedDataSeriesIndex=null);null===c.name&&(c.name="DataSeries "+a);null===c.color?1a&&"undefined"!==typeof w.startTimePercent?a>=w.startTimePercent&&w.animationCallback(w.easingFunction(a-w.startTimePercent,0,1,1-w.startTimePercent),w):w.animationCallback(w.easingFunction(a,0,1,1),w);s.dispatchEvent("dataAnimationIterationEnd",{chart:s})},function(){b=[];for(var a=0;aa.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c);ed.max&&"number"===typeof e&&(d.max=e);if(0B&&(B=1/B);b.minDiff>B&&1!==B&&(b.minDiff=B)}else B=c-l.dataPoints[w-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B);null!==e&&null!==l.dataPoints[w-1].y&&(a.axisY.logarithmic?(B=e/l.dataPoints[w-1].y,1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e-l.dataPoints[w-1].y,0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B)))}if(cf&& -!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&qd.viewPortMax&&"number"===typeof e&&(d.viewPortMax=e))}}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype._processStackedPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d= -a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=[],l=[],w=Infinity,h=-Infinity,s=0;sb.max&&(b.max=c);if(0r&&(r=1/r);b.minDiff>r&&1!==r&&(b.minDiff=r)}else r=c-q.dataPoints[n-1].x,0>r&&(r*=-1),b.minDiff>r&&0!==r&&(b.minDiff=r);null!==e&&null!==q.dataPoints[n-1].y&&(a.axisY.logarithmic?0r&&(r=1/r),d.minDiff>r&&1!==r&&(d.minDiff=r)):(r=e-q.dataPoints[n-1].y,0>r&&(r*=-1),d.minDiff>r&&0!==r&&(d.minDiff=r)))}if(ct&&!B)B=!0;else if(c>t&&B)continue;q.dataPoints[n].label&&(a.axisX.labels[c]=q.dataPoints[n].label);cb.viewPortMax&&(b.viewPortMax=c);null===q.dataPoints[n].y?b.viewPortMin===c&&kd.max&&(d.max=a),nb.viewPortMax||(ad.viewPortMax&& -(d.viewPortMax=a)));for(n in l)l.hasOwnProperty(n)&&!isNaN(n)&&(a=l[n],ad.max&&(d.max=Math.max(a,h)),nb.viewPortMax||(ad.viewPortMax&&(d.viewPortMax=Math.max(a,h))))}};p.prototype._processStacked100PlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=!1,l=!1,w=[],h=0;hb.max&&(b.max=c);if(0t&&(t=1/t);b.minDiff>t&&1!==t&&(b.minDiff=t)}else t=c-s.dataPoints[q-1].x,0>t&&(t*=-1),b.minDiff>t&&0!==t&&(b.minDiff=t);u(e)||null===s.dataPoints[q-1].y||(a.axisY.logarithmic?0t&&(t=1/t),d.minDiff>t&&1!==t&&(d.minDiff=t)):(t=e-s.dataPoints[q-1].y,0>t&&(t*=-1),d.minDiff>t&&0!==t&&(d.minDiff=t)))}if(cr&&!f)f=!0;else if(c>r&&f)continue;s.dataPoints[q].label&&(a.axisX.labels[c]=s.dataPoints[q].label); -cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&Be&&(l=!0),w[c]=w[c]?w[c]+Math.abs(e):Math.abs(e))}}s.axisX.valueType=s.xValueType=g?"dateTime":"number"}a.axisY.logarithmic?(d.max=u(d.viewPortMax)?99*Math.pow(a.axisY.logarithmBase,-0.05):Math.max(d.viewPortMax,99*Math.pow(a.axisY.logarithmBase,-0.05)),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&!l?(d.max=u(d.viewPortMax)? -99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&l?(d.max=u(d.viewPortMax)?99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99)):!m&&l&&(d.max=u(d.viewPortMax)?-1:Math.max(d.viewPortMax,-1),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99));d.viewPortMin=d.min;d.viewPortMax=d.max;a.dataPointYSums=w}};p.prototype._processMultiYPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo, -b=a.axisX.dataInfo,c,e,g,m,l=!1,w=0;wb.max&&(b.max=c);gd.max&&(d.max=m);0B&&(B=1/B),b.minDiff>B&&1!==B&&(b.minDiff=B)):(B=c-h.dataPoints[s-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B)),e&&(null!==e[0]&&h.dataPoints[s-1].y&&null!==h.dataPoints[s-1].y[0])&&(a.axisY.logarithmic?(B=e[0]/ -h.dataPoints[s-1].y[0],1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e[0]-h.dataPoints[s-1].y[0],0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B))));if(!(ct&&!n)n=!0;else if(c>t&&n)continue;h.dataPoints[s].label&&(a.axisX.labels[c]=h.dataPoints[s].label);cb.viewPortMax&&(b.viewPortMax=c);if(b.viewPortMin===c&&e)for(p=0;pd.viewPortMax&&(d.viewPortMax=m))}}h.axisX.valueType=h.xValueType=l?"dateTime":"number"}};p.prototype._processSpecificPlotUnit=function(a){if("waterfall"===a.type&&a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c),l.dataPointEOs[w].cumulativeSumd.max&&(d.max=l.dataPointEOs[w].cumulativeSum),0q&&(q=1/q),b.minDiff>q&&1!==q&&(b.minDiff=q)):(q=c-l.dataPoints[w-1].x,0>q&&(q*=-1),b.minDiff>q&&0!==q&&(b.minDiff=q)),null!==e&&null!==l.dataPoints[w- -1].y&&(a.axisY.logarithmic?(e=l.dataPointEOs[w].cumulativeSum/l.dataPointEOs[w-1].cumulativeSum,1>e&&(e=1/e),d.minDiff>e&&1!==e&&(d.minDiff=e)):(e=l.dataPointEOs[w].cumulativeSum-l.dataPointEOs[w-1].cumulativeSum,0>e&&(e*=-1),d.minDiff>e&&0!==e&&(d.minDiff=e)))),!(cf&&!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);0d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w-1].cumulativeSum));l.dataPointEOs[w].cumulativeSumd.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w].cumulativeSum)}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype.calculateAutoBreaks=function(){function a(a,c,b,e){if(e)return b= -Math.pow(Math.min(b*a/c,c/a),0.2),1>=b&&(b=Math.pow(1>a?1/a:Math.min(c/a,a),0.25)),{startValue:a*b,endValue:c/b};b=0.2*Math.min(b-c+a,c-a);0>=b&&(b=0.25*Math.min(c-a,Math.abs(a)));return{startValue:a+b,endValue:c-b}}function d(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){var c=a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<=a.axisX.scaleBreaks.maxNumberOfAutoBreaks,b=a.axisY.scaleBreaks&&a.axisY.scaleBreaks.autoCalculate&&1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks;if(c|| -b)for(var d=a.axisY.dataInfo,f=a.axisX.dataInfo,g,h=f.min,l=f.max,m=d.min,n=d.max,f=f._dataRanges,d=d._dataRanges,q,w=0,s=0;sk.dataPoints.length))for(w=0;wf[q].max&&(f[q].max=g)),b){var r= -(n+1-m)*Math.max(parseFloat(a.axisY.scaleBreaks.collapsibleThreshold)||10,10)/100;if((g="waterfall"===a.type?k.dataPointEOs[w].cumulativeSum:k.dataPoints[w].y)&&g.length)for(var p=0;pd[q].max&&(d[q].max=g[p]);else u(g)||(q=Math.floor((g-m)/r),gd[q].max&&(d[q].max=g))}}}}function b(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)&&a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<= -a.axisX.scaleBreaks.maxNumberOfAutoBreaks)for(var c=a.axisX.dataInfo,b=c.min,d=c.max,f=c._dataRanges,g,h=0,l=0;lm.dataPoints.length))for(h=0;hf[g].max&&(f[g].max=c)}}for(var c,e=this,g=!1,m=0;m< -this._axes.length;m++)if(this._axes[m].scaleBreaks&&this._axes[m].scaleBreaks.autoCalculate&&1<=this._axes[m].scaleBreaks.maxNumberOfAutoBreaks){g=!0;this._axes[m].dataInfo._dataRanges=[];for(var l=0;l<100/Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10);l++)this._axes[m].dataInfo._dataRanges.push({min:Infinity,max:-Infinity})}if(g){for(m=0;ms[f].max&&(s[f].max=q)}delete this._axes[m].dataInfo.dataPointYPositiveSums}if(this._axes[m].dataInfo.dataPointYNegativeSums){n= -this._axes[m].dataInfo.dataPointYNegativeSums;s=h;for(l in n)n.hasOwnProperty(l)&&!isNaN(l)&&(q=-1*n[l],u(q)||(f=Math.floor((q-w)/c),qs[f].max&&(s[f].max=q)));delete this._axes[m].dataInfo.dataPointYNegativeSums}for(l=0;lc&&g.push({diff:q,start:s,end:w});break}else l++;if(this._axes[m].scaleBreaks.customBreaks)for(l=0;l=e.x1&&(a<=e.x2&&d>=e.y1&&d<=e.y2)&&(c=e.id)}return c};p.prototype.getAutoFontSize=lb;p.prototype.resetOverlayedCanvas=function(){this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height)};p.prototype.clearCanvas=kb;p.prototype.attachEvent=function(a){this._events.push(a)};p.prototype._touchEventHandler=function(a){if(a.changedTouches&&this.interactivityEnabled){var d=[],b=a.changedTouches,c=b?b[0]:a,e=null;switch(a.type){case "touchstart":case "MSPointerDown":d=["mousemove","mousedown"];this._lastTouchData= -Ra(c);this._lastTouchData.time=new Date;break;case "touchmove":case "MSPointerMove":d=["mousemove"];break;case "touchend":case "MSPointerUp":var g=this._lastTouchData&&this._lastTouchData.time?new Date-this._lastTouchData.time:0,d="touchstart"===this._lastTouchEventType||"MSPointerDown"===this._lastTouchEventType||300>g?["mouseup","click"]:["mouseup"];break;default:return}if(!(b&&1g)this._lastTouchData.scroll=!0}catch(l){}this._lastTouchEventType=a.type;if(this._lastTouchData.scroll&&this.zoomEnabled)this.isDrag&&this.resetOverlayedCanvas(),this.isDrag=!1;else for(b=0;b=e.x1&&d.x<=e.x2&&d.y>=e.y1&&d.y<=e.y2){c[b].call(c.context,d.x,d.y);"mousedown"===b&&!0===c.capture?(p.capturedEventParam=c,this.overlaidCanvas.setCapture?this.overlaidCanvas.setCapture():document.documentElement.addEventListener("mouseup", -this._mouseEventHandler,!1)):"mouseup"===b&&(c.chart.overlaidCanvas.releaseCapture?c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",this._mouseEventHandler,!1));break}else c=null;a.target.style.cursor=c&&c.cursor?c.cursor:this._defaultCursor}b=this.plotArea;if(d.xb.x2||d.yb.y2)this.toolTip&&this.toolTip.enabled?this.toolTip.hide():this.resetOverlayedCanvas();this.isDrag&&this.zoomEnabled||!this._eventManager||this._eventManager.mouseEventHandler(a)}}; -p.prototype._plotAreaMouseDown=function(a,d){this.isDrag=!0;this.dragStartPoint={x:a,y:d}};p.prototype._plotAreaMouseUp=function(a,d){if(("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)&&this.isDrag){var b=d-this.dragStartPoint.y,c=a-this.dragStartPoint.x,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=!1;this.resetOverlayedCanvas();if("xySwapped"===this.plotInfo.axisPlacement)var l=g,g=e,e=l;if(this.panEnabled||this.zoomEnabled){if(this.panEnabled)for(e= -g=0;eb.maximum&&(g=b.viewportMaximum/b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum/g,b.sessionVariables.newViewportMaximum=b.viewportMaximum/g,m=!0):b.viewportMinimumb.maximum&&(g=b.viewportMaximum-b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum-g,b.sessionVariables.newViewportMaximum=b.viewportMaximum-g,m=!0);else if((!e||2Math.abs(b)&&(this.panEnabled||this.zoomEnabled)?this.toolTip.hide():this.panEnabled||this.zoomEnabled||this.toolTip.mouseMoveHandler(a, -d);if((!e||2f)var B=f,f=n,n=B;if(q.scaleBreaks)for(B=0;!g&&B=f;if(isFinite(q.dataInfo.minDiff))if(B=q.getApparentDifference(n,f,null,!0),!(g||!(this.panEnabled&&q.scaleBreaks&&q.scaleBreaks._appliedBreaks.length)&&(q.logarithmic&&Bq.maximum))w.push(q),s.push({val1:n,val2:f}),l=!0;else if(!e){l=!1;break}}return{isValid:l,axesWithValidRange:w,axesRanges:s}};p.prototype.preparePlotArea=function(){var a=this.plotArea;!r&&(0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2;a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2;a.width=a.x2-a.x1;a.height=a.y2-a.y1}this.axisY2&&0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2,a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2,a.width=a.x2-a.x1,a.height=a.y2-a.y1)}else d= -this.layoutManager.getFreeSpace(),a.x1=d.x1,a.x2=d.x2,a.y1=d.y1,a.y2=d.y2,a.width=d.width,a.height=d.height;r||(a.canvas.width=a.width,a.canvas.height=a.height,a.canvas.style.left=a.x1+"px",a.canvas.style.top=a.y1+"px",(0b.x2||h.point.yb.y2+1)continue}else if("rangearea"===s||"rangesplinearea"===s){if(h.dataPoint.xy.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("bubble")||0<=s.indexOf("scatter")){if(h.dataPoint.xy.viewportMaximum|| -h.dataPoint.yA.viewportMaximum)continue}else if(0<=s.indexOf("column")||"waterfall"===s||"error"===s&&!h.axisSwapped){if(h.dataPoint.xy.viewportMaximum||h.bounds.y1>b.y2||h.bounds.y2y.viewportMaximum||h.bounds.x1>b.x2||h.bounds.x2 -y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(h.dataPoint.xy.viewportMaximum)continue;e=m=2;"horizontal"===C?(l=f.width,w=f.height):(w=f.width,l=f.height);if("normal"===this.plotInfo.axisPlacement){if(0<=s.indexOf("line")||0<=s.indexOf("area"))t="auto",m=4;else if(0<=s.indexOf("stacked"))"auto"===t&&(t="inside");else if("bubble"===s||"scatter"===s)t="inside";q=h.point.x- -l/2;"inside"!==t?(e=b.y1,g=b.y2,0h.point.y)):(n=h.point.y+m+c,n>g-w-m-c&&(n="auto"===t?Math.min(h.point.y,g)-w-m-c:g-w-m-c,v=ng-w-m&&("bubble"===s||"scatter"===s)&&(n=Math.min(h.point.y+m,b.y2-w-m))),n=Math.min(n,g-w))}else 0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("scatter")?(t="auto",e=4):0<=s.indexOf("stacked")?"auto"===t&&(t="inside"):"bubble"===s&&(t="inside"),n=h.point.y-w/2,"inside"!==t?(m=b.x1,g=b.x2,0>ma?(q=h.point.x-l-e-c,qh.point.x)):(q=h.point.x+e+c,q>g-l-e-c&&(q="auto"=== -t?Math.min(h.point.x,g)-l-e-c:g-l-e-c,v=qma?Math.max(h.bounds.x1,b.x1)+l/2+e:Math.min(h.bounds.x2,b.x2)-l/2-e:(Math.max(h.bounds.x1,b.x1)+Math.min(h.bounds.x2,b.x2))/2,q=0>ma?Math.max(h.point.x,c)-l/2:Math.min(h.point.x,c)-l/2,q=Math.max(q,m));"vertical"===C&&(n+=w);f.x=q;f.y=n;f.render(!0);p&&("inside"!==t&&(0>s.indexOf("bar")&&("error"!==s||!h.axisSwapped)&&h.point.x>b.x1&&h.point.xs.indexOf("column")&&("error"!==s||h.axisSwapped)&&h.point.y>b.y1&&h.point.y=a.dataSeriesIndexes.length)){var c= -this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& -b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepLine=function(a){var d=a.targetCanvasCtx|| -this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&& -(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation, -easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderSpline=function(a){function d(a){a=v(a,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx;c.save();var g=this.plotArea;c.beginPath(); -c.rect(g.x1,g.y1,g.width,g.height);c.clip();for(var m=[],l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[p].y)0s[p].y===a.axisY.reversed?1:-1,color:B});u=!1}d(x)}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas, -0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(g.x1,g.y1,g.width,g.height),e.beginPath());c.restore();c.beginPath();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, -animationBase:0}}};p.prototype.renderColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width, -0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.dataPointWidth=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){m=a.axisX.convertValueToPixel(w);l=a.axisY.convertValueToPixel(B[g].y);m=a.axisX.reversed?m+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:m-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var k=a.axisX.reversed?m-q<<0:m+q<<0,t;0<=B[g].y?t=h:(t=l,l=h);l>t&&(c=l,l=t,t=c);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,l,k,t,c,0,null,p&&0<=B[g].y, -0>B[g].y&&p,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:m,y1:l,x2:k,y2:t};c=N(c);r&&ea(this._eventManager.ghostCtx,m,l,k,t,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"column",dataPoint:B[g],dataSeries:f,point:{x:m+(k-m)/2,y:0>B[g].y===a.axisY.reversed?l:t},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:m, -y1:Math.min(l,t),x2:k,y2:Math.max(l,t)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore(); -return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.y2?a.axisY.bounds.y2:h}}};p.prototype.renderStackedColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth? -this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? -this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q="undefined"!==typeof m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;g[c]=A+(y-q)}else A=m[c]?m[c]:0,y=q+A,q=n+A,m[c]=A+(y-q);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1, -!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedColumn",dataPoint:t[h],dataSeries:p,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q, -y)},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx, -animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderStackedColumn100=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth: -this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? -this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);q=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;q=a.axisY.convertValueToPixel(l[c]);y=g[c]?g[c]:n;g[c]=q}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=q+("undefined"!==typeof w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q=m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(q),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y1-q)&&(q=e.y1);g[c]=A+(y-q)}else A="undefined"!==typeof m[c]? -m[c]:0,y=q+A,q=n+A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y2-y)&&(y=e.y2),m[c]=A+(y-q);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&& -this._indexLabels.push({chartType:"stackedColumn100",dataPoint:t[h],dataSeries:k,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q,y)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&& -this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= -null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.options.dataPointWidth? -this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height); -b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){l=a.axisX.convertValueToPixel(w); -m=a.axisY.convertValueToPixel(B[g].y);l=a.axisX.reversed?l+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:l-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var p=a.axisX.reversed?l-q<<0:l+q<<0,t;0<=B[g].y?t=h:(t=m,m=h);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,t,l,m,p,c,0,null,k,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:t,y1:l,x2:m,y2:p};c= -N(c);r&&ea(this._eventManager.ghostCtx,t,l,m,p,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"bar",dataPoint:B[g],dataSeries:f,point:{x:0<=B[g].y?m:t,y:l+(p-l)/2},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(t,m),y1:l,x2:Math.max(t,m),y2:p},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas, -0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.x2?a.axisY.bounds.x2: -h}}};p.prototype.renderStackedBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<< -0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),s=m[c]? -m[c]:n,m[c]=y=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A=g[c]?g[c]:0;y=n+A;s+=A;g[c]=A+(s-y)}else A=m[c]?m[c]:0,y=s-A,s=n-A,m[c]=A+(s-y);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,y,x,s,v,c,0,null,u,!1,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:y,y1:x,x2:s,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,y,x,s,v,c,0,null,!1,!1,!1, -!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar",dataPoint:t[h],dataSeries:k,point:{x:0<=t[h].y?s:y,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(y,s),y1:x,x2:Math.max(y,s),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& -b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderStackedBar100=function(a){var d= -a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)|| -(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save(); -b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&& -"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x;x=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var v=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,y=v+f<<0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;x=g[c]?g[c]:n;g[c]=s=a.axisY.convertValueToPixel(l[c])}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=x+(w[c]?w[c]:0),s=m[c]?m[c]: -n,m[c]=x=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(x),0<=t[h].y){var A=g[c]?g[c]:0;x=n+A;s+=A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x2-s)&&(s=e.x2);g[c]=A+(s-x)}else A=m[c]?m[c]:0,x=s-A,s=n-A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x1-x)&&(x=e.x1),m[c]=A+(s-x);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,v,s,y,c,0,null,u,!1,!1,!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k, -dataPointIndex:h,x1:x,y1:v,x2:s,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,v,s,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar100",dataPoint:t[h],dataSeries:p,point:{x:0<=t[h].y?s:x,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(x,s),y1:v,x2:Math.max(x,s),y2:y},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop", -a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!da)))if("number"!==typeof p[k].y)B.connectNullData||(da||d)||c(),da=!0;else{t=a.axisX.convertValueToPixel(x);u=a.axisY.convertValueToPixel(p[k].y);d||da?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||b===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d=t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,b=B.nullDataLineDashType,g.setLineDash(Y)),g.lineTo(t,u),r&&m.lineTo(t, -u)):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),da=d=!1):(g.lineTo(t,u),r&&m.lineTo(t,u),0==k%250&&c());q={x:t,y:u};kp[k].y===a.axisY.reversed?1:-1,color:z})}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas, -0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, -animationBase:0}}};p.prototype.renderSplineArea=function(a){function d(){var b=v(x,2);if(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum? -t=p:0>a.axisY.viewportMaximum?t=m.y1:0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=a.axisX.lineCoordinates,m=a.axisY.lineCoordinates,l=[],w=this.plotArea;c.save();r&& -e.save();c.beginPath();c.rect(w.x1,w.y1,w.width,w.height);c.clip();r&&(e.beginPath(),e.rect(w.x1,w.y1,w.width,w.height),e.clip());for(var h=0;ha.axisX.dataInfo.viewPortMax&&(!q.connectNullData||!k)))if("number"!==typeof n[f].y)0n[f].y===a.axisY.reversed?1:-1,color:ma});k=!1}d();ia.drawMarkers(l)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(w.x1,w.y1,w.width,w.height), -this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!b))){var Z=u;"number"!==typeof k[p].y?(B.connectNullData||(b||d)||c(),b=!0):(t=a.axisX.convertValueToPixel(x),u=a.axisY.convertValueToPixel(k[p].y),d||b?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||Y===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d= -t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,Y=B.nullDataLineDashType,g.setLineDash(ca)),g.lineTo(t,Z),g.lineTo(t,u),r&&(m.lineTo(t,Z),m.lineTo(t,u))):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),b=d=!1):(g.lineTo(t,Z),r&&m.lineTo(t,Z),g.lineTo(t,u),r&&m.lineTo(t,u),0==p%250&&c()),q={x:t,y:u},pk[p].y===a.axisY.reversed?1:-1,color:z}))}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, -0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea=function(a){function d(){if(!(1>h.length)){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=[],l=this.plotArea,w=[],h=[],s=[],q=[],n=0,f,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),u=this._eventManager.ghostCtx,t,C,x;r&&u.beginPath();c.save();r&&u.save();c.beginPath();c.rect(l.x1,l.y1,l.width,l.height);c.clip();r&&(u.beginPath(),u.rect(l.x1,l.y1,l.width,l.height),u.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData||!da)))if("number"!==typeof Z.y)A.connectNullData||(da||C)||d(),da=!0;else{f=a.axisX.convertValueToPixel(g);var oa= -w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(Z.y),k-=oa;h.push({x:f,y:p-oa});w[g]=p-k;C||da?(!C&&A.connectNullData?(c.setLineDash&&(A.options.nullDataLineDashType||x===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(C=h.pop(),x=h[h.length-1],d(),c.moveTo(t.x,t.y),h.push(x),h.push(C),x=A.nullDataLineDashType, -c.setLineDash(Y)),c.lineTo(f,k),r&&u.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(u.beginPath(),u.moveTo(f,k))),da=C=!1):(c.lineTo(f,k),r&&u.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&u.moveTo(f,k),h.push({x:f,y:p-oa})));t={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&u.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& -c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(l.x1,l.y1,l.width,l.height),u.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea100=function(a){function d(){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=[],w=[],h=[],s=[],q=[],n=0,f,k,p,u,t,C=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),x=this._eventManager.ghostCtx;c.save();r&&x.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(x.beginPath(), -x.rect(m.x1,m.y1,m.width,m.height),x.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData|| -!da)))if("number"!==typeof Z.y)A.connectNullData||(da||u)||d(),da=!0;else{var oa;oa=0!==a.dataPointYSums[g]?100*(Z.y/a.dataPointYSums[g]):0;f=a.axisX.convertValueToPixel(g);var la=w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(oa),k-=la;h.push({x:f,y:C-la});w[g]=C-k;u||da?(!u&&A.connectNullData?(c.setLineDash&& -(A.options.nullDataLineDashType||t===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(u=h.pop(),t=h[h.length-1],d(),c.moveTo(p.x,p.y),h.push(t),h.push(u),t=A.nullDataLineDashType,c.setLineDash(Y)),c.lineTo(f,k),r&&x.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(x.beginPath(),x.moveTo(f,k))),da=u=!1):(c.lineTo(f,k),r&&x.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&x.moveTo(f,k),h.push({x:f,y:C-la})));p={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&x.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(l);r&&(b.drawImage(this._preRenderCanvas,0, -0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),x.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}}; -p.prototype.renderBubble=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=-Infinity,w=Infinity,h=0;ha.axisX.dataInfo.viewPortMax||"undefined"===typeof n[e].z||(f=n[e].z,f>l&&(l=f),fa.axisX.dataInfo.viewPortMax)&&"number"===typeof n[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(n[e].y);var f=n[e].z,u=2*Math.max(Math.sqrt((l===w?p/2:k+(p-k)/(l-w)*(f-w))/Math.PI)<<0,1),f=q.getMarkerProperties(e,b);f.size=u;b.globalAlpha=q.fillOpacity;ia.drawMarker(g,m,b,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;var t=q.dataPointIds[e];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:s, -dataPointIndex:e,x1:g,y1:m,size:u};u=N(t);r&&ia.drawMarker(g,m,this._eventManager.ghostCtx,f.type,f.size,u,u,f.borderThickness);(n[e].indexLabel||q.indexLabel||n[e].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"bubble",dataPoint:n[e],dataSeries:q,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/2,x2:g+f.size/2,y2:m+f.size/2},color:null})}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& -b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderScatter=function(a){var d= -a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=0;la.axisX.dataInfo.viewPortMax)&&"number"===typeof s[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(s[e].y);var f=h.getMarkerProperties(e,g,m,b);b.globalAlpha=h.fillOpacity;ia.drawMarker(f.x,f.y,f.ctx,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;Math.sqrt((q-g)*(q-g)+(n-m)*(n-m))Math.min(this.plotArea.width,this.plotArea.height)||(q=h.dataPointIds[e],this._eventManager.objectMap[q]={id:q,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:e,x1:g,y1:m},q=N(q),r&&ia.drawMarker(f.x,f.y,this._eventManager.ghostCtx,f.type,f.size,q,q,f.borderThickness),(s[e].indexLabel||h.indexLabel||s[e].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"scatter",dataPoint:s[e],dataSeries:h,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/ -2,x2:g+f.size/2,y2:m+f.size/2},color:null}),q=g,n=m)}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore()); -b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderCandlestick=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=0,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,g=this.options.dataPointMaxWidth? -this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*m.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&&e>g&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,g));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&gg&&(k=g);b.save();r&&c.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(c.beginPath(),c.rect(m.x1,m.y1,m.width,m.height),c.clip());for(var p=0;pa.axisX.dataInfo.viewPortMax)&&!u(C[l].y)&&C[l].y.length&& -"number"===typeof C[l].y[0]&&"number"===typeof C[l].y[1]&&"number"===typeof C[l].y[2]&&"number"===typeof C[l].y[3]){w=a.axisX.convertValueToPixel(f);h=a.axisY.convertValueToPixel(C[l].y[0]);s=a.axisY.convertValueToPixel(C[l].y[1]);q=a.axisY.convertValueToPixel(C[l].y[2]);n=a.axisY.convertValueToPixel(C[l].y[3]);var z=w-k/2<<0,y=z+k<<0,g=t.options.fallingColor?t.fallingColor:t._colorSet[0],e=C[l].color?C[l].color:t._colorSet[0],A=Math.round(Math.max(1,0.15*k)),D=0===A%2?0:0.5,aa=t.dataPointIds[l]; -this._eventManager.objectMap[aa]={id:aa,objectType:"dataPoint",dataSeriesIndex:v,dataPointIndex:l,x1:z,y1:h,x2:y,y2:s,x3:w,y3:q,x4:w,y4:n,borderThickness:A,color:e};b.strokeStyle=e;b.beginPath();b.lineWidth=A;c.lineWidth=Math.max(A,4);"candlestick"===t.type?(b.moveTo(w-D,s),b.lineTo(w-D,Math.min(h,n)),b.stroke(),b.moveTo(w-D,Math.max(h,n)),b.lineTo(w-D,q),b.stroke(),ea(b,z,Math.min(h,n),y,Math.max(h,n),C[l].y[0]<=C[l].y[3]?t.risingColor:g,A,e,x,x,!1,!1,t.fillOpacity),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w- -D,s),c.lineTo(w-D,Math.min(h,n)),c.stroke(),c.moveTo(w-D,Math.max(h,n)),c.lineTo(w-D,q),c.stroke(),ea(c,z,Math.min(h,n),y,Math.max(h,n),e,0,null,!1,!1,!1,!1))):"ohlc"===t.type&&(b.moveTo(w-D,s),b.lineTo(w-D,q),b.stroke(),b.beginPath(),b.moveTo(w,h),b.lineTo(z,h),b.stroke(),b.beginPath(),b.moveTo(w,n),b.lineTo(y,n),b.stroke(),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w-D,s),c.lineTo(w-D,q),c.stroke(),c.beginPath(),c.moveTo(w,h),c.lineTo(z,h),c.stroke(),c.beginPath(),c.moveTo(w,n),c.lineTo(y,n),c.stroke())); -(C[l].indexLabel||t.indexLabel||C[l].indexLabelFormatter||t.indexLabelFormatter)&&this._indexLabels.push({chartType:t.type,dataPoint:C[l],dataSeries:t,point:{x:z+(y-z)/2,y:a.axisY.reversed?q:s},direction:1,bounds:{x1:z,y1:Math.min(s,q),x2:y,y2:Math.max(s,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas, -0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderBoxAndWhisker=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e= -null,g=this.plotArea,m=0,l,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*g.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&& -e>m&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(k=m);b.save();r&&c.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(c.beginPath(),c.rect(g.x1,g.y1,g.width,g.height),c.clip());for(var p=!1,p=!!a.axisY.reversed,v=0;va.axisX.dataInfo.viewPortMax)&&!u(x[m].y)&&x[m].y.length&&"number"===typeof x[m].y[0]&&"number"===typeof x[m].y[1]&&"number"===typeof x[m].y[2]&&"number"===typeof x[m].y[3]&&"number"===typeof x[m].y[4]&&5===x[m].y.length){l=a.axisX.convertValueToPixel(f);w=a.axisY.convertValueToPixel(x[m].y[0]);h=a.axisY.convertValueToPixel(x[m].y[1]);s=a.axisY.convertValueToPixel(x[m].y[2]); -q=a.axisY.convertValueToPixel(x[m].y[3]);n=a.axisY.convertValueToPixel(x[m].y[4]);var y=l-k/2<<0,A=l+k/2<<0,e=x[m].color?x[m].color:C._colorSet[0],D=Math.round(Math.max(1,0.15*k)),aa=0===D%2?0:0.5,T=x[m].whiskerColor?x[m].whiskerColor:x[m].color?C.whiskerColor?C.whiskerColor:x[m].color:C.whiskerColor?C.whiskerColor:e,Y="number"===typeof x[m].whiskerThickness?x[m].whiskerThickness:"number"===typeof C.options.whiskerThickness?C.whiskerThickness:D,ca=x[m].whiskerDashType?x[m].whiskerDashType:C.whiskerDashType, -da=u(x[m].whiskerLength)?u(C.options.whiskerLength)?k:C.whiskerLength:x[m].whiskerLength,da="number"===typeof da?0>=da?0:da>=k?k:da:"string"===typeof da?parseInt(da)*k/100>k?k:parseInt(da)*k/100:k,Z=1===Math.round(Y)%2?0.5:0,oa=x[m].stemColor?x[m].stemColor:x[m].color?C.stemColor?C.stemColor:x[m].color:C.stemColor?C.stemColor:e,la="number"===typeof x[m].stemThickness?x[m].stemThickness:"number"===typeof C.options.stemThickness?C.stemThickness:D,G=1===Math.round(la)%2?0.5:0,F=x[m].stemDashType?x[m].stemDashType: -C.stemDashType,E=x[m].lineColor?x[m].lineColor:x[m].color?C.lineColor?C.lineColor:x[m].color:C.lineColor?C.lineColor:e,H="number"===typeof x[m].lineThickness?x[m].lineThickness:"number"===typeof C.options.lineThickness?C.lineThickness:D,I=x[m].lineDashType?x[m].lineDashType:C.lineDashType,K=1===Math.round(H)%2?0.5:0,L=C.upperBoxColor,O=C.lowerBoxColor,Q=u(C.options.fillOpacity)?1:C.fillOpacity,P=C.dataPointIds[m];this._eventManager.objectMap[P]={id:P,objectType:"dataPoint",dataSeriesIndex:t,dataPointIndex:m, -x1:y,y1:w,x2:A,y2:h,x3:l,y3:s,x4:l,y4:q,y5:n,borderThickness:D,color:e,stemThickness:la,stemColor:oa,whiskerThickness:Y,whiskerLength:da,whiskerColor:T,lineThickness:H,lineColor:E};b.save();0=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth: -1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.03*this.width;var h=a.axisX.dataInfo.minDiff;isFinite(h)||(h=0.3*Math.abs(a.axisX.range));h=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(h)/Math.log(a.axisX.range):Math.abs(h)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&& -(this.dataPointMinWidth&&mm&&(h=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var s=0;sa.axisX.dataInfo.viewPortMax)&&!u(f[g].y)&&f[g].y.length&&"number"===typeof f[g].y[0]&&"number"===typeof f[g].y[1]){c=a.axisX.convertValueToPixel(w);m=a.axisY.convertValueToPixel(f[g].y[0]);l=a.axisY.convertValueToPixel(f[g].y[1]);var p=a.axisX.reversed?c+a.plotType.totalDataSeries*h/2-(a.previousDataSeriesCount+s)*h<<0:c-a.plotType.totalDataSeries*h/2+(a.previousDataSeriesCount+ -s)*h<<0,v=a.axisX.reversed?p-h<<0:p+h<<0,c=f[g].color?f[g].color:n._colorSet[g%n._colorSet.length];if(m>l){var t=m;m=l;l=t}t=n.dataPointIds[g];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:q,dataPointIndex:g,x1:p,y1:m,x2:v,y2:l};ea(b,p,m,v,l,c,0,c,k,k,!1,!1,n.fillOpacity);c=N(t);r&&ea(this._eventManager.ghostCtx,p,m,v,l,c,0,null,!1,!1,!1,!1);if(f[g].indexLabel||n.indexLabel||f[g].indexLabelFormatter||n.indexLabelFormatter)this._indexLabels.push({chartType:"rangeColumn", -dataPoint:f[g],dataSeries:n,indexKeyword:0,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?l:m},direction:f[g].y[1]>=f[g].y[0]?-1:1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c}),this._indexLabels.push({chartType:"rangeColumn",dataPoint:f[g],dataSeries:n,indexKeyword:1,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?m:l},direction:f[g].y[1]>=f[g].y[0]?1:-1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation= -"source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderError= -function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=a.axisY._position?"left"===a.axisY._position||"right"===a.axisY._position?!1:!0:!1;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=!1,m=this.plotArea,l=0,w,h,s,q,n,f,k,p=a.axisX.dataInfo.minDiff;isFinite(p)||(p=0.3*Math.abs(a.axisX.range));b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(m.x1, -m.y1,m.width,m.height),this._eventManager.ghostCtx.clip());for(var v=0,t=0;tl&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,l));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ll&&(t=l);if(0=T.length?0:T.length>=t?t:T.length:"string"===typeof T.length?parseInt(T.length)*t/100>t?t:parseInt(T.length)*t/100>t:t;T.thickness="number"===typeof T.thickness?0>T.thickness?0:Math.round(T.thickness):2;var Y={color:y[l].stemColor?y[l].stemColor:y[l].color?z.stemColor?z.stemColor:y[l].color:z.stemColor?z.stemColor:e,thickness:y[l].stemThickness?y[l].stemThickness:z.stemThickness,dashType:y[l].stemDashType? -y[l].stemDashType:z.stemDashType};Y.thickness="number"===typeof Y.thickness?0>Y.thickness?0:Math.round(Y.thickness):2;y[l].getTime?k=y[l].x.getTime():k=y[l].x;if(!(ka.axisX.dataInfo.viewPortMax)&&!u(y[l].y)&&y[l].y.length&&"number"===typeof y[l].y[0]&&"number"===typeof y[l].y[1]){var ca=a.axisX.convertValueToPixel(k);c?h=ca:w=ca;ca=a.axisY.convertValueToPixel(y[l].y[0]);c?s=ca:n=ca;ca=a.axisY.convertValueToPixel(y[l].y[1]);c?q=ca:f=ca;c?(n=a.axisX.reversed?h+(A?v: -1)*t/2-(A?D-1:0)*t<<0:h-(A?v:1)*t/2+(A?D-1:0)*t<<0,f=a.axisX.reversed?n-t<<0:n+t<<0):(s=a.axisX.reversed?w+(A?v:1)*t/2-(A?D-1:0)*t<<0:w-(A?v:1)*t/2+(A?D-1:0)*t<<0,q=a.axisX.reversed?s-t<<0:s+t<<0);!c&&n>f&&(ca=n,n=f,f=ca);c&&s>q&&(ca=s,s=q,q=ca);ca=z.dataPointIds[l];this._eventManager.objectMap[ca]={id:ca,objectType:"dataPoint",dataSeriesIndex:x,dataPointIndex:l,x1:Math.min(s,q),y1:Math.min(n,f),x2:Math.max(q,s),y2:Math.max(f,n),isXYSwapped:c,stemProperties:Y,whiskerProperties:T};E(b,Math.min(s,q), -Math.min(n,f),Math.max(q,s),Math.max(f,n),e,T,Y,c);r&&E(this._eventManager.ghostCtx,s,n,q,f,e,T,Y,c);if(y[l].indexLabel||z.indexLabel||y[l].indexLabelFormatter||z.indexLabelFormatter)this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:0,point:{x:c?y[l].y[1]>=y[l].y[0]?s:q:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?f:n},direction:y[l].y[1]>=y[l].y[0]?-1:1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c}), -this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:1,point:{x:c?y[l].y[1]>=y[l].y[0]?q:s:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?n:f},direction:y[l].y[1]>=y[l].y[0]?1:-1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height), -a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx: -d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0;var s=a.axisX.dataInfo.minDiff;isFinite(s)||(s=0.3*Math.abs(a.axisX.range));s=this.options.dataPointWidth?this.dataPointWidth:0.9* -(e.height*(a.axisX.logarithmic?Math.log(s)/Math.log(a.axisX.range):Math.abs(s)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(s=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(), -this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var q=0;qa.axisX.dataInfo.viewPortMax)&&!u(k[g].y)&&k[g].y.length&&"number"===typeof k[g].y[0]&&"number"===typeof k[g].y[1]){m=a.axisY.convertValueToPixel(k[g].y[0]); -l=a.axisY.convertValueToPixel(k[g].y[1]);w=a.axisX.convertValueToPixel(h);w=a.axisX.reversed?w+a.plotType.totalDataSeries*s/2-(a.previousDataSeriesCount+q)*s<<0:w-a.plotType.totalDataSeries*s/2+(a.previousDataSeriesCount+q)*s<<0;var v=a.axisX.reversed?w-s<<0:w+s<<0;m>l&&(c=m,m=l,l=c);c=k[g].color?k[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,w,l,v,c,0,null,p,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g, -x1:m,y1:w,x2:l,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,m,w,l,v,c,0,null,!1,!1,!1,!1);if(k[g].indexLabel||f.indexLabel||k[g].indexLabelFormatter||f.indexLabelFormatter)this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:0,point:{x:k[g].y[1]>=k[g].y[0]?m:l,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?-1:1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c}),this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:1,point:{x:k[g].y[1]>= -k[g].y[0]?l:m,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?1:-1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1, -e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeArea=function(a){function d(){if(C){var a=null;0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width,m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!s.connectNullData||!T)))if(null!==q[f].y&&q[f].y.length&&"number"===typeof q[f].y[0]&&"number"===typeof q[f].y[1]){k=a.axisX.convertValueToPixel(t);p=a.axisY.convertValueToPixel(q[f].y[0]);u=a.axisY.convertValueToPixel(q[f].y[1]);n||T?(s.connectNullData&&!n?(c.setLineDash&&(s.options.nullDataLineDashType||A===s.lineDashType&&s.lineDashType!==s.nullDataLineDashType)&&(w[w.length- -1].newLineDashArray=D,A=s.nullDataLineDashType,c.setLineDash(z)),c.lineTo(k,p),r&&e.lineTo(k,p),w.push({x:k,y:u})):(c.beginPath(),c.moveTo(k,p),C={x:k,y:p},w=[],w.push({x:k,y:u}),r&&(e.beginPath(),e.moveTo(k,p))),T=n=!1):(c.lineTo(k,p),w.push({x:k,y:u}),r&&e.lineTo(k,p),0==f%250&&d());t=s.dataPointIds[f];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:h,dataPointIndex:f,x1:k,y1:p,y2:u};fq[f].y[1]===a.axisY.reversed?-1:1,color:x}),this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:1,point:{x:k, -y:u},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?1:-1,color:x})}else T||n||d(),T=!0;d();ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1, -m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderRangeSplineArea=function(a){function d(a,b){var d=v(u,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width, -m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!f)))if(null!==k[q].y&&k[q].y.length&&"number"===typeof k[q].y[0]&&"number"===typeof k[q].y[1]){n=a.axisX.convertValueToPixel(n);f=a.axisY.convertValueToPixel(k[q].y[0]);p=a.axisY.convertValueToPixel(k[q].y[1]);var E=h.dataPointIds[q];this._eventManager.objectMap[E]={id:E,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:q, -x1:n,y1:f,y2:p};u[u.length]={x:n,y:f};z[z.length]={x:n,y:p};q=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx,e=null,g=this.plotArea,m=0,l,k,h,s,q=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),m=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;k=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width,0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0;var n= -a.axisX.dataInfo.minDiff;isFinite(n)||(n=0.3*Math.abs(a.axisX.range));n=this.options.dataPointWidth?this.dataPointWidth:0.6*(g.width*(a.axisX.logarithmic?Math.log(n)/Math.log(a.axisX.range):Math.abs(n)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&m>k&&(m=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,k));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&kk&&(n=k);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.clip());for(var f=0;fh&&(e=k,k=h,h=e);a.axisY.reversed&&(e=k,k=h,h=e);e=u.dataPointIds[m];this._eventManager.objectMap[e]={id:e,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:m,x1:l,y1:k,x2:F,y2:h}; -var T=v[m].color?v[m].color:0v[m].y===a.axisY.reversed?1:-1,bounds:{x1:l,y1:Math.min(k,h),x2:F,y2:Math.max(k,h)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height), -b.clearRect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};var ja=function(a,d,b,c,e,g,m,l,k){if(!(0>b)){"undefined"===typeof l&&(l=1);if(!r){var h=Number((m%(2*Math.PI)).toFixed(8));Number((g%(2*Math.PI)).toFixed(8))===h&&(m-=1E-4)}a.save();a.globalAlpha=l;"pie"===e?(a.beginPath(),a.moveTo(d.x,d.y),a.arc(d.x,d.y,b,g,m,!1),a.fillStyle=c,a.strokeStyle= -"white",a.lineWidth=2,a.closePath(),a.fill()):"doughnut"===e&&(a.beginPath(),a.arc(d.x,d.y,b,g,m,!1),0<=k&&a.arc(d.x,d.y,k*b,m,g,!0),a.closePath(),a.fillStyle=c,a.strokeStyle="white",a.lineWidth=2,a.fill());a.globalAlpha=1;a.restore()}};p.prototype.renderPie=function(a){function d(){if(h&&s){for(var a=0,b=0,c=0,e=0,d=0;dMath.PI/2-t&&m.midAngle -m.midAngle)c=d;a++}else if(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t){if(0===b||f[e].midAngle>m.midAngle)e=d;b++}m.hemisphere=g>Math.PI/2&&g<=3*Math.PI/2?"left":"right";m.indexLabelTextBlock=new ka(k.plotArea.ctx,{fontSize:m.indexLabelFontSize,fontFamily:m.indexLabelFontFamily,fontColor:m.indexLabelFontColor,fontStyle:m.indexLabelFontStyle,fontWeight:m.indexLabelFontWeight,horizontalAlign:"left",backgroundColor:m.indexLabelBackgroundColor,maxWidth:m.indexLabelMaxWidth,maxHeight:m.indexLabelWrap? -5*m.indexLabelFontSize:1.5*m.indexLabelFontSize,text:m.indexLabelText,padding:0,textBaseline:"top"});m.indexLabelTextBlock.measureText()}l=g=0;q=!1;for(d=0;dMath.PI/2-t&&m.midAngle3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t)&&(l<=b/2&&!q?(m.hemisphere="left",l++):(m.hemisphere="right",q=!0))}}function b(a){var b= -k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);for(b=0;bc){var d=0.07*A*Math.cos(f[b].midAngle),g=0.07*A*Math.sin(f[b].midAngle),m=!1;if(s[b].exploded){if(1E-9a.indexLabelTextBlock.y?d-e:c-f}function e(a){for(var b=null,e=1;ec(f[b],f[a])||("right"===f[a].hemisphere?f[b].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y:f[b].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y)))break;else b=null;return b}function g(a,b,d){d=(d||0)+1;if(1E3< -d)return 0;b=b||0;var m=0,h=x.y-1*r,l=x.y+1*r;if(0<=a&&ab&&n.indexLabelTextBlock.yl)return 0;var k=0,q=0,q=k=k=0;0>b?n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2>h&&n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+bl&&(b=n.indexLabelTextBlock.y+ -n.indexLabelTextBlock.height/2+b-l);b=n.indexLabelTextBlock.y+b;h=0;h="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2));q=x.x+A*Math.cos(n.midAngle);k=x.y+A*Math.sin(n.midAngle);k=Math.sqrt(Math.pow(h-q,2)+Math.pow(b-k,2));q=Math.acos(A/r);k=Math.acos((r*r+A*A-k*k)/(2*A*r));b=kc(f[h],f[a])||("right"===f[a].hemisphere?f[h].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y:f[h].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y)))break;else h=null;q=h;k=e(a);l=h=0;0>b?(l="right"===n.hemisphere?q:k,m=b,null!==l&&(q=-b,b=n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2-(f[l].indexLabelTextBlock.y+f[l].indexLabelTextBlock.height/2),b-q+h.toFixed(C)&&(m=b>p?-(b-p):-(q-(l-h)))))):0p?b-p:q-(h-l)))));m&&(d=n.indexLabelTextBlock.y+m,b=0,b="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)),n.midAngle>Math.PI/2-t&&n.midAngleh.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x-15:"right"===n.hemisphere&&("left"===a.hemisphere&&b3*Math.PI/2-t&&n.midAngle<3*Math.PI/2+t&&(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"right"===n.hemisphere&&"left"===h.hemisphere&&ba.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x- -15)),n.indexLabelTextBlock.y=d,n.indexLabelTextBlock.x=b,n.indexLabelAngle=Math.atan2(n.indexLabelTextBlock.y-x.y,n.indexLabelTextBlock.x-x.x))}return m}function m(){var a=k.plotArea.ctx;a.fillStyle="grey";a.strokeStyle="grey";a.font="16px Arial";a.textBaseline="middle";for(var b=a=0,d=0,m=!0,b=0;10>b&&(1>b||0z){for(var E=u=0,H=0;Hu?l.indexLabelText="":l.indexLabelTextBlock.maxWidth=0.85*u,0.3*l.indexLabelTextBlock.maxWidthd&&(d=y)),y=y=0,0d&&(d=y)));var K=function(a, -b,c){for(var e=[],d=0;e.push(f[b]),b!==c;b=(b+1+s.length)%s.length);e.sort(function(a,b){return a.y-b.y});for(b=0;bz){n=t.indexLabelTextBlock.x;var k=t.indexLabelTextBlock.y-t.indexLabelTextBlock.height/ -2,w=t.indexLabelTextBlock.y+t.indexLabelTextBlock.height/2,p=h.indexLabelTextBlock.y-h.indexLabelTextBlock.height/2,u=h.indexLabelTextBlock.x+h.indexLabelTextBlock.width,r=h.indexLabelTextBlock.y+h.indexLabelTextBlock.height/2;n=t.indexLabelTextBlock.x+t.indexLabelTextBlock.widthu+q||k>r+q||wa&&(a=l),m!==a&&(b=m,d+=-z),0===l%Math.max(s.length/10,3)&&(g=!0)):g=!0;g&&(0=a.dataSeriesIndexes.length)){var h= -this.data[a.dataSeriesIndexes[0]],s=h.dataPoints,q=10,n=this.plotArea,f=h.dataPointEOs,p=2,r,v=1.3,t=20/180*Math.PI,C=6,x={x:(n.x2+n.x1)/2,y:(n.y2+n.y1)/2},z=0;a=!1;for(var y=0;ya&&(e=a,d=!0);var g=s[b].color?s[b].color:h._colorSet[b%h._colorSet.length];e>c&&ja(k.plotArea.ctx, -f[b].center,f[b].radius,g,h.type,c,e,h.fillOpacity,f[b].percentInnerRadius);if(d)break}l()},function(){k.disableToolTip=!1;k._animator.animate(0,k.animatedRender?500:0,function(a){b(a);l()})})}}};var ra=function(a,d,b,c){"undefined"===typeof b&&(b=1);0>=Math.round(d.y4-d.y1)||(a.save(),a.globalAlpha=b,a.beginPath(),a.moveTo(Math.round(d.x1),Math.round(d.y1)),a.lineTo(Math.round(d.x2),Math.round(d.y2)),a.lineTo(Math.round(d.x3),Math.round(d.y3)),a.lineTo(Math.round(d.x4),Math.round(d.y4)),"undefined"!== -d.x5&&(a.lineTo(Math.round(d.x5),Math.round(d.y5)),a.lineTo(Math.round(d.x6),Math.round(d.y6))),a.closePath(),a.fillStyle=c?c:d.color,a.fill(),a.globalAplha=1,a.restore())};p.prototype.renderFunnel=function(a){function d(){for(var a=0,b=[],c=0;ck?(k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=0==k?0:a/k,h+=a/k,m=!0):(n=(Math.abs(ba)*b-Math.sqrt(k))/2,k=b-2*n/Math.abs(ba),h+=n,h>d&&(h-=n, -k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=a/k,h+=a/k,m=!0),b=k)),e.push(n);return e}function c(){if(t&&C){for(var a,b,c,e,d,g,l,h,m,n,k,q,s,w,p=[],B=[],x={percent:null,total:null},v=null,y=0;yp[y]&&(p[y]=y!==fa?t.reversed?P[y].x3-P[y].x4:P[y].x2-P[y].x1:P[y].x2-P[y].x1,p[y]/=2));s=b.indexLabelMaxWidth?b.indexLabelMaxWidth:t.options.indexLabelMaxWidth?t.indexLabelMaxWidth:p[y];if(s>p[y]||0>s)s=p[y];B[y]="inside"===t.indexLabelPlacement?P[y].height:!1;x=z.getPercentAndTotal(t,b);if(t.indexLabelFormatter||b.indexLabelFormatter)v={chart:z.options,dataSeries:t,dataPoint:b,total:x.total,percent:x.percent};b=b.indexLabelFormatter?b.indexLabelFormatter(v):b.indexLabel? -z.replaceKeywordsWithValue(b.indexLabel,b,t,y):t.indexLabelFormatter?t.indexLabelFormatter(v):t.indexLabel?z.replaceKeywordsWithValue(t.indexLabel,b,t,y):b.label?b.label:"";0>=n&&(n=0);1E3>s&&1E3-sl?l:t.indexLabelMaxWidth:l,h=J.length-1;0<=h;h--){g=C[J[h].id];c=J[h];e=c.textBlock;b=(a=n(h)b.y&&(d=!0);c=g.indexLabelMaxWidth||l;if(c>l||0>c)c=l;f.push(c)}if(d)for(h=J.length-1;0<=h;h--)a=P[h],J[h].textBlock.maxWidth= -f[f.length-(h+1)],J[h].textBlock.measureText(),J[h].textBlock.x=L-l,c=J[h].textBlock.heightpa+D&&(J[h].textBlock.y=pa+D-J[h].height),J[h].textBlock.ywa+D&&(J[h].textBlock.y=wa+D-J[h].height))}function g(){var a,b,c,e;if("inside"!==t.indexLabelPlacement)for(var d=0;dDa?f(c).x2+1:(a.x2+a.x3)/2+1:(a.x2+a.x3)/2+1:"undefined"!==typeof a.x5?cpa+D&&(J[d].textBlock.y=pa+D-J[d].height),J[d].textBlock.ywa+D&&(J[d].textBlock.y=wa+D-J[d].height)));else for(d=0;d=c?(b=d!=fa?(a.x4+a.x3)/2-e/2:(a.x5+a.x4)/2-e/2,c=d!=fa?(a.y1+a.y3)/2-c/2:(a.y1+a.y4)/2-c/2,J[d].textBlock.x=b, -J[d].textBlock.y=c):J[d].isDirty=!0)}function m(){function a(b,c){var d;if(0>b||b>=J.length)return 0;var e,f=J[b].textBlock;if(0>c){c*=-1;e=q(b);d=l(e,b);if(d>=c)return f.y-=c,c;if(0==b)return 0=c)return f.y+=c,c;if(b==P.length-1)return 0e)&&(l=n(s),!(l>=J.length-1)&&J[s].textBlock.y+J[s].height+ga>J[l].textBlock.y&&(J[s].textBlock.y=J[s].textBlock.y+J[s].height-e>e-J[s].textBlock.y?e+1:e-J[s].height-1))}for(l=P.length-1;0e&&(e=0,J[e].isDirty))break;if(J[l].textBlock.y=f){f=0;h+=J[f].height;break}e=q(f); -if(0>e){f=0;h+=J[f].height;break}}if(f!=l){g=J[f].textBlock.y;a-=g;a=h-a;g=c(a,d,f);break}}}return g}function c(a,b,d){var e=[],f=0,g=0;for(a=Math.abs(a);d<=b;d++)e.push(P[d]);e.sort(function(a,b){return a.height-b.height});for(d=0;d+m.y.toFixed(6))&&(d=g.y+d+ga-m.y,e=a(w,-d),ea?t.reversed?wa-D:pa-D:J[a].textBlock.y+J[a].height+ga)}function k(a,b,c){var d,e,f,l=[],m=D,n=[];-1!==b&&(0<=W.indexOf(b)?(e=W.indexOf(b),W.splice(e,1)):(W.push(b),W=W.sort(function(a,b){return a-b})));if(0===W.length)l= -ia;else{e=D*(1!=W.length||0!=W[0]&&W[0]!=P.length-1?2:1)/h();for(var q=0;qn&&(n*=-1),c.y1+=b-n[d],c.y2+=b-n[d],c.y3+=b-n[d],c.y4+=b-n[d],c.y5&&(c.y5+=b-n[d],c.y6+=b-n[d]),n[d]=b}};a._animator.animate(0,c,function(c){var d=a.plotArea.ctx||a.ctx;ja=!0;d.clearRect(x.x1,x.y1,x.x2-x.x1,x.y2-x.y1);d.fillStyle=a.backgroundColor;d.fillRect(x.x1,x.y1,x.width,x.height);w.changeSection(c,b);var e={};e.dataSeries=t;e.dataPoint=t.reversed?t.dataPoints[C.length-1-b]:t.dataPoints[b];e.index=t.reversed?C.length-1-b:b;a.toolTip.highlightObjects([e]); -for(e=0;ea){b=P[c];break}return b?(a=b.y6?a>b.y6?b.x3+(b.x4-b.x3)/(b.y4-b.y3)*(a-b.y3):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2), -{x1:a,x2:a}):-1}function p(a){for(var b=0;b=a.dataSeriesIndexes.length)){for(var t=this.data[a.dataSeriesIndexes[0]],C=t.dataPoints,x=this.plotArea,D=0.025*x.width,y=0.01*x.width,A=0,F=x.height-2*D,E=Math.min(x.width-2*y,2.8*x.height),H=!1,I=0;IF?N=F:0>=N&&(N=0),G>a?G=a-0.5:0>=G&&(G=0)):"pyramid"===t.type&&(G=N=0,t.reversed=t.reversed?!1:!0);var y=I+a/2,$=I,V=I+a,pa=t.reversed?Z:O,K=y-G/2,ea=y+G/2,Da=t.reversed?O+N:Z- -N,wa=t.reversed?O:Z;a=[];var y=[],P=[],E=[],X=O,fa,ba=(Da-pa)/(K-$),ha=-ba,I="area"===(t.valueRepresents?t.valueRepresents:"height")?b():d();if(-1!==I){if(t.reversed)for(E.push(X),G=I.length-1;0a&&(A=a));for(G=0;G\n');c.document.close();setTimeout(function(){c.focus();c.print();setTimeout(function(){b._canvasJSContainer.removeChild(d)},1E3)},500)};p.prototype.getPercentAndTotal=function(a,d){var b=null,c=null, -e=null;if(0<=a.type.indexOf("stacked"))c=0,b=d.x.getTime?d.x.getTime():d.x,b in a.plotUnit.yTotals&&(c=a.plotUnit.yTotals[b],e=isNaN(d.y)?0:100*(d.y/c));else if("pie"===a.type||"doughnut"===a.type||"funnel"===a.type||"pyramid"===a.type){for(b=c=0;b=m||"undefined"=== -typeof m||0>=v||"undefined"===typeof v)){if("horizontal"===this.orientation){n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:v,maxHeight:this.itemWrap?m:this.lineHeight,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"});n.textBlock.measureText();null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"=== -n.chartType?2*0.1*this.lineHeight:0)));if(!q||q.width+Math.round(n.textBlock.width+r+l+(0===q.width?0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))>g)q={items:[],width:0},h.push(q),this.height+=f,f=0;f=Math.max(f,n.textBlock.height)}else n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:x,maxHeight:!0===this.itemWrap?m:1.5*this.fontSize,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily, -fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"}),n.textBlock.measureText(),null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))),this.height>0,0),this.dataPoints.length):0):(s=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,s=0>0,0),this.dataPoints.length):0));for(;;){g=0a?c.x/a:a/c.x: -Math.abs(c.x-a);qs-e&&s+e>=this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}return d||b.dataPoint.x!==a?d&&null!==b.dataPoint?b:null:b};F.prototype.getDataPointAtXY=function(a,d,b){if(!this.dataPoints||0===this.dataPoints.length||athis.chart.plotArea.x2||dthis.chart.plotArea.y2)return null;b=b||!1;var c=[],e=0,g=0,m=1,l=!1,k=Infinity, -h=0,s=0,q=0;if("none"!==this.chart.plotInfo.axisPlacement)if(q=(this.chart.axisX[0]?this.chart.axisX[0]:this.chart.axisX2[0]).getXValueAt({x:a,y:d}),this.axisX.logarithmic)var n=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),q=1>0,0),this.dataPoints.length):0;else n=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,q=0> -0,0),this.dataPoints.length):0;for(;;){g=0=n.x1&&(a<=n.x2&&d>=n.y1&&d<=n.y2)&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1- -a),Math.abs(n.x2-a),Math.abs(n.y1-d),Math.abs(n.y2-d))}),l=!0);break;case "line":case "stepLine":case "spline":case "area":case "stepArea":case "stackedArea":case "stackedArea100":case "splineArea":case "scatter":var u=na("markerSize",f,this)||4,r=b?20:u,p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0r&&(p=Math.atan2(d-u.y,a-u.x),0>p&&(p+=2*Math.PI),p=Number(((180*(p/Math.PI)%360+360)%360).toFixed(12)),u=Number(((180*(n.startAngle/Math.PI)%360+360)%360).toFixed(12)),r=Number(((180*(n.endAngle/Math.PI)%360+360)%360).toFixed(12)),0===r&&1=r&&0!==f.y&&(r+=360,pu&&pp.y1&&dp.y6?(g=p.x6+(p.x5-p.x6)/(p.y5-p.y6)*(d-p.y6),p=p.x3+(p.x4-p.x3)/(p.y4-p.y3)*(d-p.y3)):(g=p.x1+(p.x6-p.x1)/(p.y6-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)):(g=p.x1+(p.x4-p.x1)/(p.y4-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)),a>g&&a=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y4-n.borderThickness/2&&d<=n.y1+n.borderThickness/ -2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "candlestick":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y2-n.borderThickness/2&&d<=n.y3+n.borderThickness/2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a), -Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "ohlc":if(Math.abs(n.x2-a+n.x1-a)=n.y2&&d<=n.y3||a>=n.x1&&a<=(n.x2+n.x1)/2&&d>=n.y1-n.borderThickness/2&&d<=n.y1+n.borderThickness/2||a>=(n.x1+n.x2)/2&&a<=n.x2&&d>=n.y4-n.borderThickness/2&&d<=n.y4+n.borderThickness/2)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0}if(l||1E3q-e&&q+e>= -this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}a=null;for(d=0;dq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius, -horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle",borderThickness:0}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}f=n;for(b=this.intervalStartPosition;b<=e;b=parseFloat(1E-12>this.interval?this.logarithmic&&this.equidistantInterval?b*Math.pow(this.logarithmBase,this.interval):b+this.interval:(this.logarithmic&&this.equidistantInterval? -b*Math.pow(this.logarithmBase,this.interval):b+this.interval).toFixed(12))){for(;fq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix, -horizontalAlign:"left",backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}}else for(this.intervalStartPosition=this.getLabelStartPoint(new Date(this.viewportMinimum), -this.intervalType,this.interval),e=Ya(new Date(this.viewportMaximum),this.interval,this.intervalType),f=n,b=this.intervalStartPosition;bq[f].endValue;f++);p=a;a=f=q[f].startValue&&a<=q[f].endValue;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:new Date(p),label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:Ca(p,this.valueFormatString,this.chart._cultureInfo), -a=new ka(this.ctx,{x:0,y:0,maxWidth:g,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null, -breaksLabelType:void 0}))}if("bottom"===this._position||"top"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.width*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length-2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.width/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+ -"Duration"]*this.interval,g="undefined"===typeof this.options.labelMaxWidth?0.5*this.chart.width>>0:this.options.labelMaxWidth,this.chart.panEnabled||(m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize);else if("left"===this._position||"right"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.height*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length- -2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.height/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+"Duration"]*this.interval,this.chart.panEnabled||(g="undefined"===typeof this.options.labelMaxWidth?0.3*this.chart.width>>0:this.options.labelMaxWidth),m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize; -for(c=0;cthis.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360)),"bottom"===this._position||"top"===this._position)if(g=0.9*l>>0,n=0,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize= -this.labelFontSize;this.sessionVariables.labelMaxWidth=g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=this.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;bn&&(v=b,n=p.width)}b=0;for(b=this.intervalStartPosition< -this.viewportMinimum?1:0;b>0>2*g&&(this.sessionVariables.labelAngle=-25)):(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle):u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth= -g,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p)):(this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=this.labelWrap);else{if(u(this.options.labelWrap))if(!u(this.options.labelMaxWidth))this.options.labelMaxWidth>0,f=this.labelFontSize,nq&&(q=c-2*g,c>=2*g&&c<2.2*g?(this.sessionVariables.labelMaxWidth=g,u(this.options.labelFontSize)&&12=2.2*g&&c<2.8*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=f):c>=2.8*g&&c<3.2*g?(this.sessionVariables.labelMaxWidth=Math.max(g,n),this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12=3.2*g&&c<3.6*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=this.labelFontSize):c>3.6*g&&c<5*g?(u(this.options.labelFontSize)&&125*g&&(this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelFontSize=f,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=this.labelAngle));else if(v===b&&(0===v&&n+this._labels[v+1].textBlock.measureText().width-2*g>q||v===this._labels.length-1&&n+this._labels[v-1].textBlock.measureText().width-2*g>q||0q&&n+this._labels[v-1].textBlock.measureText().width- -2*g>q))q=0===v?n+this._labels[v+1].textBlock.measureText().width-2*g:n+this._labels[v-1].textBlock.measureText().width-2*g,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p;else if(0===q)for(this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,c=0;c>0>2*g&&(this.sessionVariables.labelAngle=-25))}else(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/ -Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=0!=this.labelAngle?(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)):g,this.sessionVariables.labelMaxHeight=m=this.labelWrap?(h-p*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)):1.5*this.labelFontSize,u(this.options.labelWrap))?u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap= -this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelMaxHeight=c<0.9*l?0.9*l:c,this.sessionVariables.labelWrap=this.labelWrap)):(this.options.labelWrap?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p): -(u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelWrap=this.labelWrap),this.sessionVariables.labelMaxHeight=m)}for(c=0;c>0:this.options.labelMaxWidth,m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize=this.labelFontSize;this.sessionVariables.labelMaxWidth= -g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b>0,l-2*m>n&&(n=l-2*m,l>=2*m&&l<2.4*m?(u(this.options.labelFontSize)&&12=2.4*m&&l<2.8*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelFontSize=this.labelFontSize,this.sessionVariables.labelWrap=!0):l>=2.8*m&&l<3.2*m?(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12< -this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>=3.2*m&&l<3.6*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelFontSize=this.labelFontSize):l>3.6*m&&l<10*m?(u(this.options.labelFontSize)&& -1210*m&&l<50*m&&(u(this.options.labelFontSize)&&12this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,u(this.options.labelMaxWidth)&& -(this.sessionVariables.labelAngle=this.labelAngle))):this.options.labelWrap?(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=g):(this.sessionVariables.labelMaxHeight=m,u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap)}for(c=0;c>0:1.5*this.labelFontSize;if("left"===this._position||"right"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.width>>0:1.5*this.labelFontSize;u(g.labelBackgroundColor)&&(g.labelBackgroundColor="#EEEEEE")}else m="bottom"===this._position||"top"===this._position?0.9*this.chart.width>>0:0.9*this.chart.height>> -0,z=u(g.options.labelWrap)||g.labelWrap?"bottom"===this._position||"top"===this._position?0.8*this.chart.width>>0:0.8*this.chart.height>>0:1.5*this.labelFontSize,u(g.labelBackgroundColor)&&(u(g.startValue)&&0!==g.startValue?g.labelBackgroundColor=r?"transparent":null:g.labelBackgroundColor="#EEEEEE");a=new ka(this.ctx,{x:0,y:0,backgroundColor:g.labelBackgroundColor,borderColor:g.labelBorderColor,borderThickness:g.labelBorderThickness,cornerRadius:g.labelCornerRadius,maxWidth:g.options.labelMaxWidth? -g.options.labelMaxWidth:m,maxHeight:z,angle:this.labelAngle,text:g.labelFormatter?g.labelFormatter({chart:this.chart,axis:this,stripLine:g}):g.label,horizontalAlign:"left",fontSize:"outside"===g.labelPlacement?g.options.labelFontSize?g.labelFontSize:this.labelFontSize:g.labelFontSize,fontFamily:"outside"===g.labelPlacement?g.options.labelFontFamily?g.labelFontFamily:this.labelFontFamily:g.labelFontFamily,fontWeight:"outside"===g.labelPlacement?g.options.labelFontWeight?g.labelFontWeight:this.labelFontWeight: -g.labelFontWeight,fontColor:g.labelFontColor||g.color,fontStyle:"outside"===g.labelPlacement?g.options.labelFontStyle?g.labelFontStyle:this.fontWeight:g.labelFontStyle,textBaseline:"middle"});this._stripLineLabels.push({position:g.value,textBlock:a,effectiveHeight:null,stripLine:g})}};z.prototype.createLabelsAndCalculateWidth=function(){var a=0,d=0;this._labels=[];this._stripLineLabels=[];var b=this.chart.isNavigator?0:5;if("left"===this._position||"right"===this._position){this.createLabels();for(d= -0;d=this.viewportMinimum&&this._stripLineLabels[d].stripLine.value<=this.viewportMaximum)&& -(c=this._stripLineLabels[d].textBlock,e=c.measureText(),g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle)),a=this.viewportMinimum&&this._stripLineLabels[b].stripLine.value<=this.viewportMaximum)&&(d=this._stripLineLabels[b].textBlock,e=d.measureText(),g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)),an[f].viewportMaximum);v++)r[v].endValue=n[f].viewPortMinimum&&(n[f].scaleBreaks.lastBreakIndex=v));for(var z=v=0,t=0,C=0,x=0,D=0,y=0,A,E,F=l=0,H,I,L,r=H=I=L=!1,f=0;fv;){var G=0,R=0,S=0,U=0,W=e=0,K=0,$=0,V=0,X=0,P=0,ba=0;if(b&& -0p.width- -q?p.width-q:g.x2-ba-$);if(a&&0p.width-q?p.width-q:g.x2-ba-$),a[f]._labels&&1k&&(l+=0a[f].labelAngle?A-zk&&(l=E+t/2-k-ba),A-za[f].labelAngle&&0p.width-q?p.width-q:g.x2-ba-$),d[f].lineCoordinates.width=Math.abs(k-m),d[f]._labels&&1v;){V=U=R=S=$=K=W=e=Q=O=G=X=0;if(a&&0p.width-10?p.width-10:g.x2-V-W),b[f].labelAutoFit&&!u(C)&&(0b[f].labelAngle?Math.max(m,C):0===b[f].labelAngle? -Math.max(m,C/2):m),0c[f].chart.width-10?c[f].chart.width-10:g.x2-V-W),c[f]&& -c[f].labelAutoFit&&!u(D)&&(0b[f].chart.height-10?b[f].chart.height-10:g.y2),b[f].lineCoordinates.y1=l-(q[f]+b[f].margin+ -X),b[f].lineCoordinates.y2=l-(q[f]+b[f].margin+X),b[f].bounds={x1:m,y1:l-(q[f]+X+b[f].margin),x2:k,y2:h-(X+b[f].margin),width:k-m,height:q[f]},b[f].title&&(b[f]._titleTextBlock.maxWidth=0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0===b[K].labelAngle?k-U:m);if(c&&0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0=== -b[K].labelAngle?k-V:m);if(c&&0d[g].spacing?0:Math.abs(d[g].spacing/b),this.logarithmic&&(d[g].size=Math.pow(this.logarithmBase,d[g].size))};z.prototype.calculateBreaksInPixels=function(){if(!(this.scaleBreaks&&0>=this.scaleBreaks._appliedBreaks.length)){var a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];a.length&&(this.scaleBreaks.firstBreakIndex=this.scaleBreaks.lastBreakIndex=null);for(var d=0;dthis.conversionParameters.maximum);d++)a[d].endValue< -this.conversionParameters.minimum||(u(this.scaleBreaks.firstBreakIndex)&&(this.scaleBreaks.firstBreakIndex=d),a[d].startValue>=this.conversionParameters.minimum&&(a[d].startPixel=this.convertValueToPixel(a[d].startValue),this.scaleBreaks.lastBreakIndex=d),a[d].endValue<=this.conversionParameters.maximum&&(a[d].endPixel=this.convertValueToPixel(a[d].endValue)))}};z.prototype.renderLabelsTicksAndTitle=function(){var a=this,d=!1,b=0,c=0,e=1,g=0;0!==this.labelAngle&&360!==this.labelAngle&&(e=1.2);if("undefined"=== -typeof this.options.interval){if("bottom"===this._position||"top"===this._position)if(this.logarithmic&&!this.equidistantInterval&&this.labelAutoFit){for(var b=[],e=0!==this.labelAngle&&360!==this.labelAngle?1:1.2,m,l=this.viewportMaximum,k=this.lineCoordinates.width/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||mthis.lineCoordinates.width*e&&this.labelAutoFit&&(d=!0)}if("left"===this._position||"right"===this._position)if(this.logarithmic&& -!this.equidistantInterval&&this.labelAutoFit){for(var b=[],p,l=this.viewportMaximum,k=this.lineCoordinates.height/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||pthis.lineCoordinates.height*e&&this.labelAutoFit&&(d=!0)}}this.logarithmic&&(!this.equidistantInterval&&this.labelAutoFit)&&this._labels.sort(function(a,b){return a.position-b.position});var h=0,q,n;if("bottom"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y+this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? -n.y-(this.tickLength+q.textBlock.fontSize/2):n.y+this.tickLength+q.textBlock.fontSize/2):(n.x="inside"===this.labelPlacement?0>this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x-(0>this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0>this.labelAngle?n.y-this.tickLength-5:n.y-this.tickLength-Math.abs(q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle)+5):n.y+this.tickLength+Math.abs(0>this.labelAngle?q.textBlock.width* -Math.sin(Math.PI/180*this.labelAngle)-5:5)),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save(); -a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y-a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y2-this._titleTextBlock.height-3,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("top"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y-this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? -n.y+this.labelFontSize/2+this.tickLength+5:n.y-(this.tickLength+q.textBlock.height-q.textBlock.fontSize/2)):(n.x="inside"===this.labelPlacement?0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&& -(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y+a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y1+1,this.titleMaxWidth= -this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("left"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<< -0,c),this.ctx.lineTo(n.x-this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle?(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5):(q.textBlock.y="inside"===this.labelPlacement?n.y:n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness; -a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x+a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x1+1,this._titleTextBlock.y=this.lineCoordinates.height/2+this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("right"=== -this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<<0,c),this.ctx.lineTo(n.x+this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle? -(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width-this.tickLength-5:n.x+this.tickLength+5):(q.textBlock.y="inside"===this.labelPlacement?n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0>this.labelAngle?n.y:n.y-(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.cos(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<< -0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x-a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x2-1,this._titleTextBlock.y=this.lineCoordinates.height/2-this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}g=0;if("inside"===this.labelPlacement)this.chart.addEventListener("dataAnimationIterationEnd", -function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)||(a.ctx.save(),a.ctx.beginPath(),q.textBlock.render(!0),a.ctx.restore())},this);else for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||q.textBlock.render(!0)};z.prototype.renderInterlacedColors=function(){var a=this.chart.plotArea.ctx,d,b,c=this.chart.plotArea, -e=0;d=!0;if(("bottom"===this._position||"top"===this._position)&&this.interlacedColor)for(a.fillStyle=this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(Math.min(b.x,d.x),c.y1,Math.abs(b.x-d.x),Math.abs(c.y1-c.y2)),d=!1):d=!0;else if(("left"===this._position||"right"===this._position)&&this.interlacedColor)for(a.fillStyle= -this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(c.x1,Math.min(b.y,d.y),Math.abs(c.x1-c.x2),Math.abs(d.y-b.y)),d=!1):d=!0;a.beginPath()};z.prototype.renderStripLinesOfThicknessType=function(a){if(this.stripLines&&0this.viewportMaximum||u(h.value)||isNaN(this.range))||l.push(h))}for(c=0;cthis.viewportMaximum||isNaN(this.range))){a=this.getPixelCoordinatesOnAxis(b.position);if("outside"===b.stripLine.labelPlacement)if(h&&(this.ctx.strokeStyle= -h.color,"pixel"===h._thicknessType&&(this.ctx.lineWidth=h.thickness)),"bottom"===this._position){var p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0;this.ctx.beginPath();this.ctx.moveTo(p,a.y<<0);this.ctx.lineTo(p,a.y+this.tickLength<<0);this.ctx.stroke();0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y+=this.tickLength+b.textBlock.fontSize/2):(a.x-=0>this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0,a.y+=this.tickLength+Math.abs(0>this.labelAngle?b.textBlock.width*Math.sin(Math.PI/ -180*this.labelAngle)-5:5))}else"top"===this._position?(p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,this.ctx.beginPath(),this.ctx.moveTo(p,a.y<<0),this.ctx.lineTo(p,a.y-this.tickLength<<0),this.ctx.stroke(),0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y-=this.tickLength+b.textBlock.height):(a.x+=(b.textBlock.height-this.tickLength-this.labelFontSize/2)*Math.sin(Math.PI/180*this.labelAngle)-(0this.labelAngle?a.y:a.y-(b.textBlock.height-b.textBlock.fontSize/ -2-5)*Math.cos(Math.PI/180*this.labelAngle),a.x=0this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/ -2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+=b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y1+b.textBlock.width+3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-b.textBlock.width-3:"center"=== -b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y1+3):"top"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+= -b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+b.textBlock.width+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y2-3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y2- -b.textBlock.width-3):"left"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-b.textBlock.height>this.chart.plotArea.y1?u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3:a.y-b.textBlock.heightthis.chart.plotArea.y1? -u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2-3:a.y-b.textBlock.heightthis.viewportMaximum|| -isNaN(this.range))||a[d].render(this.maskCtx);this.maskCtx.restore()}};z.prototype.renderCrosshair=function(a,d){this.crosshair.render(a,d)};z.prototype.renderGrid=function(){if(this.gridThickness&&0this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(),d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.x<<0)+0.5:d.x<<0,a.moveTo(d,b.y1<<0),a.lineTo(d,b.y2<<0),a.stroke());else if("left"===this._position||"right"===this._position)for(var c=0;cthis.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(), -d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.y<<0)+0.5:d.y<<0,a.moveTo(b.x1<<0,d),a.lineTo(b.x2<<0,d),a.stroke());a.restore()}};z.prototype.renderAxisLine=function(){var a=this.chart.ctx,d=r?this.chart._preRenderCtx:a,b=Math.ceil(this.tickThickness/(this.reversed?-2:2)),c=Math.ceil(this.tickThickness/(this.reversed?2:-2)),e,g;d.save();if("bottom"===this._position||"top"===this._position){if(this.lineThickness){this.reversed?(e=this.lineCoordinates.x2,g=this.lineCoordinates.x1): -(e=this.lineCoordinates.x1,g=this.lineCoordinates.x2);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor?this.lineColor:"black";d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));var m=1===this.lineThickness%2?(this.lineCoordinates.y1<<0)+0.5:this.lineCoordinates.y1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+c;else for(var l= -this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(e,m),d.lineTo(this.scaleBreaks._appliedBreaks[l].startPixel+b,m),e=this.scaleBreaks._appliedBreaks[l].endPixel+c;e&&(d.moveTo(e,m),d.lineTo(g,m));d.stroke()}}else if(("left"===this._position||"right"===this._position)&&this.lineThickness){this.reversed?(e=this.lineCoordinates.y1,g=this.lineCoordinates.y2):(e=this.lineCoordinates.y2,g=this.lineCoordinates.y1);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor; -d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));m=1===this.lineThickness%2?(this.lineCoordinates.x1<<0)+0.5:this.lineCoordinates.x1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+b;else for(l=this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(m,e),d.lineTo(m,this.scaleBreaks._appliedBreaks[l].startPixel+c), -e=this.scaleBreaks._appliedBreaks[l].endPixel+b;e&&(d.moveTo(m,e),d.lineTo(m,g));d.stroke()}r&&(a.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx&&this.chart._breaksCanvasCtx.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),d.clearRect(0,0,this.chart.width,this.chart.height));d.restore()};z.prototype.getPixelCoordinatesOnAxis=function(a){var d={};if("bottom"===this._position||"top"===this._position)d.x=this.convertValueToPixel(a), -d.y=this.lineCoordinates.y1;if("left"===this._position||"right"===this._position)d.y=this.convertValueToPixel(a),d.x=this.lineCoordinates.x2;return d};z.prototype.convertPixelToValue=function(a){if("undefined"===typeof a)return null;var d=0,b=0,c,d=!0,e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b="number"===typeof a?a:"left"===this._position||"right"===this._position?a.y:a.x;if(this.logarithmic){a=c=Math.pow(this.logarithmBase,(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit); -if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;be[b].startValue/this.conversionParameters.minimum){c/=e[b].startValue/this.conversionParameters.minimum;if(ce[b].startValue/e[b-1].endValue){c/=e[b].startValue/e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum){if(1e[b].startValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].startValue/this.conversionParameters.minimum*Math.pow(e[b].size,Math.log(e[b].startValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue))*c,c*=Math.pow(e[b].size,Math.log(this.conversionParameters.minimum/e[b].startValue)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size;d=!1}else break;else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size}else break; -d=a*this.viewportMinimum}else{a=c=(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit;if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b=e[b].size?0:c*(e[b].endValue- -e[b].startValue)/e[b].size;break}else a+=e[b].endValue-this.conversionParameters.minimum-e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue),c-=e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue);d=!1}else if(c>e[b].startValue-this.conversionParameters.minimum){c-=e[b].startValue-this.conversionParameters.minimum;if(ce[b].startValue-e[b-1].endValue){c-=e[b].startValue-e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum)if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue- -e[b].startValue)/e[b].size>e[b].startValue){a=0>=e[b].size?0:c*(e[b].endValue-e[b].startValue)/e[b].size;break}else a+=e[b].startValue-this.conversionParameters.minimum+e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),c+=e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),d=!1;else if(c-1*e[b].size){a+=(e[b].endValue- -e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size;d=!1}else break;else if(c-1*e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size}else break;d=this.conversionParameters.minimum+a}return d};z.prototype.convertValueToPixel=function(a){a=this.getApparentDifference(this.conversionParameters.minimum, -a,a);return this.logarithmic?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*Math.log(a/this.conversionParameters.minimum)/this.conversionParameters.lnLogarithmBase+0.5<<0:"axisX"===this.type?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5<<0:this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5};z.prototype.getApparentDifference=function(a, -d,b,c){var e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];if(this.logarithmic){b=u(b)?d/a:b;for(var g=0;ge[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*e[g].startValue*e[g].size:a>=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*a*Math.pow(e[g].size,Math.log(e[g].endValue/a)/Math.log(e[g].endValue/e[g].startValue)):a<=e[g].startValue&&d<=e[g].endValue?b=b/d*e[g].startValue*Math.pow(e[g].size,Math.log(d/e[g].startValue)/Math.log(e[g].endValue/ -e[g].startValue)):!c&&(a>e[g].startValue&&de[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+e[g].startValue+e[g].size:a>e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+a+e[g].size*(e[g].endValue-a)/(e[g].endValue-e[g].startValue):a<=e[g].startValue&&de[g].startValue&&da[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<= -a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*this.viewportMinimum,b=0a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<=a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+this.viewportMinimum, -b=0this.maxWidth?8:6);var a=Math.max(c,Math.floor(this.maxWidth/a)),e,g,m,c=0;!u(this.options.viewportMinimum)&&(!u(this.options.viewportMaximum)&&this.options.viewportMinimum>=this.options.viewportMaximum)&& -(this.viewportMinimum=this.viewportMaximum=null);if(u(this.options.viewportMinimum)&&!u(this.sessionVariables.newViewportMinimum)&&!isNaN(this.sessionVariables.newViewportMinimum))this.viewportMinimum=this.sessionVariables.newViewportMinimum;else if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(u(this.options.viewportMaximum)&&!u(this.sessionVariables.newViewportMaximum)&&!isNaN(this.sessionVariables.newViewportMaximum))this.viewportMaximum=this.sessionVariables.newViewportMaximum; -else if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(c=0;c=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue)&& -(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue)){this.scaleBreaks._appliedBreaks.splice(c,1);break}if("axisX"===this.type){if(this.dataSeries&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g, -null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0));c=this.getApparentDifference(isNaN(this.viewportMinimum)||null===this.viewportMinimum?e:this.viewportMinimum,isNaN(this.viewportMaximum)||null===this.viewportMaximum?g:this.viewportMaximum,null, -!0);if("axisX"===this.type&&b){this.intervalType||(c/1<=a?(this.interval=1,this.intervalType="millisecond"):c/2<=a?(this.interval=2,this.intervalType="millisecond"):c/5<=a?(this.interval=5,this.intervalType="millisecond"):c/10<=a?(this.interval=10,this.intervalType="millisecond"):c/20<=a?(this.interval=20,this.intervalType="millisecond"):c/50<=a?(this.interval=50,this.intervalType="millisecond"):c/100<=a?(this.interval=100,this.intervalType="millisecond"):c/200<=a?(this.interval=200,this.intervalType= -"millisecond"):c/250<=a?(this.interval=250,this.intervalType="millisecond"):c/300<=a?(this.interval=300,this.intervalType="millisecond"):c/400<=a?(this.interval=400,this.intervalType="millisecond"):c/500<=a?(this.interval=500,this.intervalType="millisecond"):c/(1*S.secondDuration)<=a?(this.interval=1,this.intervalType="second"):c/(2*S.secondDuration)<=a?(this.interval=2,this.intervalType="second"):c/(5*S.secondDuration)<=a?(this.interval=5,this.intervalType="second"):c/(10*S.secondDuration)<=a?(this.interval= -10,this.intervalType="second"):c/(15*S.secondDuration)<=a?(this.interval=15,this.intervalType="second"):c/(20*S.secondDuration)<=a?(this.interval=20,this.intervalType="second"):c/(30*S.secondDuration)<=a?(this.interval=30,this.intervalType="second"):c/(1*S.minuteDuration)<=a?(this.interval=1,this.intervalType="minute"):c/(2*S.minuteDuration)<=a?(this.interval=2,this.intervalType="minute"):c/(5*S.minuteDuration)<=a?(this.interval=5,this.intervalType="minute"):c/(10*S.minuteDuration)<=a?(this.interval= -10,this.intervalType="minute"):c/(15*S.minuteDuration)<=a?(this.interval=15,this.intervalType="minute"):c/(20*S.minuteDuration)<=a?(this.interval=20,this.intervalType="minute"):c/(30*S.minuteDuration)<=a?(this.interval=30,this.intervalType="minute"):c/(1*S.hourDuration)<=a?(this.interval=1,this.intervalType="hour"):c/(2*S.hourDuration)<=a?(this.interval=2,this.intervalType="hour"):c/(3*S.hourDuration)<=a?(this.interval=3,this.intervalType="hour"):c/(6*S.hourDuration)<=a?(this.interval=6,this.intervalType= -"hour"):c/(1*S.dayDuration)<=a?(this.interval=1,this.intervalType="day"):c/(2*S.dayDuration)<=a?(this.interval=2,this.intervalType="day"):c/(4*S.dayDuration)<=a?(this.interval=4,this.intervalType="day"):c/(1*S.weekDuration)<=a?(this.interval=1,this.intervalType="week"):c/(2*S.weekDuration)<=a?(this.interval=2,this.intervalType="week"):c/(3*S.weekDuration)<=a?(this.interval=3,this.intervalType="week"):c/(1*S.monthDuration)<=a?(this.interval=1,this.intervalType="month"):c/(2*S.monthDuration)<=a?(this.interval= -2,this.intervalType="month"):c/(3*S.monthDuration)<=a?(this.interval=3,this.intervalType="month"):c/(6*S.monthDuration)<=a?(this.interval=6,this.intervalType="month"):(this.interval=c/(1*S.yearDuration)<=a?1:c/(2*S.yearDuration)<=a?2:c/(4*S.yearDuration)<=a?4:Math.floor(z.getNiceNumber(c/(a-1),!0)/S.yearDuration),this.intervalType="year"));if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=e-m/2;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum= -g+m/2;d?this.autoValueFormatString="MMM DD YYYY HH:mm":"year"===this.intervalType?this.autoValueFormatString="YYYY":"month"===this.intervalType?this.autoValueFormatString="MMM YYYY":"week"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"day"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"hour"===this.intervalType?this.autoValueFormatString="hh:mm TT":"minute"===this.intervalType?this.autoValueFormatString="hh:mm TT":"second"===this.intervalType?this.autoValueFormatString= -"hh:mm:ss TT":"millisecond"===this.intervalType&&(this.autoValueFormatString="fff'ms'");this.valueFormatString||(this.valueFormatString=this.autoValueFormatString)}else{this.intervalType="number";c=z.getNiceNumber(c,!1);this.interval=this.options&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g,null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)):(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0)),Math.abs(this.getApparentDifference(e,g,null,!0)),"axisX"===this.type&&b){this.valueType="dateTime";if(null===this.minimum||isNaN(this.minimum))this.minimum=e-m/2;if(null===this.maximum||isNaN(this.maximum))this.maximum=g+m/2}else this.intervalType=this.valueType="number",null===this.minimum&&(this.minimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval,this.minimum=Math.min(this.minimum, -null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?Infinity:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval,this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?-Infinity:this.sessionVariables.viewportMaximum)),0===this.maximum&&0===this.minimum&&(0===this.options.minimum?this.maximum+=10:0=== -this.options.maximum&&(this.minimum-=10));u(this.sessionVariables.newViewportMinimum)&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));u(this.sessionVariables.newViewportMaximum)&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.range=this.viewportMaximum-this.viewportMinimum;this.intervalStartPosition="axisX"===this.type&&b?this.getLabelStartPoint(new Date(this.viewportMinimum),this.intervalType,this.interval):Math.floor((this.viewportMinimum+0.2*this.interval)/ -this.interval)*this.interval;this.valueFormatString||(this.valueFormatString=z.generateValueFormatString(this.range,2))}};z.prototype.calculateLogarithmicAxisParameters=function(){var a=this.chart.layoutManager.getFreeSpace(),d=Math.log(this.logarithmBase),b;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?500>this.maxWidth?7:Math.max(7,Math.floor(this.maxWidth/100)):Math.max(Math.floor(this.maxWidth/ -50),3),c,e,g,m;m=1;if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(m=0;m=this.scaleBreaks._appliedBreaks[m].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[m].startValue|| -!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue)&&(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue)){this.scaleBreaks._appliedBreaks.splice(m,1);break}"axisX"===this.type? -(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,1===e/c&&(m=Math.pow(this.logarithmBase,"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin, -e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,0>=c&&!isFinite(e)?(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1):0>=c?c=e:isFinite(e)||(e=c),1===c&&1===e?(e*=this.logarithmBase-1/this.logarithmBase,c=1):1===e/c?(m=Math.min(e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),e*=m,c/=m):c>e?(m=Math.min(c/e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase, -0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&1e&&(e=1));m=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)/(isNaN(this.viewportMinimum)||null=== -this.viewportMinimum?c:this.viewportMinimum);var l=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)-(isNaN(this.viewportMinimum)||null===this.viewportMinimum?c:this.viewportMinimum);this.intervalType="number";m=Math.pow(this.logarithmBase,z.getNiceNumber(Math.abs(Math.log(m)/d),!1));this.options&&0this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(c)||isFinite(e)?1===c&&1===e?(e*=this.logarithmBase,c/=this.logarithmBase):1===e/c?(m=Math.pow(this.logarithmBase,this.interval),e*=m,c/=m):c>e?(m= -Math.min(0.01*(c/e),5),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)):(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.minimum||isNaN(this.minimum))&&1e&&(e=1)),this.intervalType="number",null===this.minimum&&(this.minimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval)),this.minimum=Math.min(this.minimum,null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?"undefined"===typeof this.sessionVariables.newViewportMinimum?Infinity:this.sessionVariables.newViewportMinimum:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum= -"axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval)),this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?"undefined"===typeof this.sessionVariables.newViewportMaximum?0:this.sessionVariables.newViewportMaximum:this.sessionVariables.viewportMaximum)),1===this.maximum&&1===this.minimum&&(1===this.options.minimum?this.maximum*=this.logarithmBase-1/this.logarithmBase: -1===this.options.maximum&&(this.minimum/=this.logarithmBase-1/this.logarithmBase));this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum);this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum);this.viewportMinimum>this.viewportMaximum&&(!this.options.viewportMinimum&&!this.options.minimum||this.options.viewportMaximum||this.options.maximum?this.options.viewportMinimum||this.options.minimum||!this.options.viewportMaximum&&!this.options.maximum||(this.viewportMinimum=this.minimum= -(this.options.viewportMaximum||this.options.maximum)/Math.pow(this.logarithmBase,2*Math.ceil(this.interval))):this.viewportMaximum=this.maximum=this.options.viewportMinimum||this.options.minimum);c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval);this.range=this.viewportMaximum/this.viewportMinimum;this.noTicks=a;if(!this.options.interval&&this.rangethis.viewportMaximum||3>a?2:3)){for(d=Math.floor(this.viewportMinimum/ -b+0.5)*b;dthis.interval&&(this.interval=b,c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval))),this.equidistantInterval=!0,this.intervalStartPosition=c;if(!this.valueFormatString&&(this.valueFormatString="#,##0.##",1>this.viewportMinimum)){d=Math.floor(Math.abs(Math.log(this.viewportMinimum)/ -Math.LN10))+2;if(isNaN(d)||!isFinite(d))d=2;if(2a&&(c+=Math.floor(Math.abs(Math.log(a)/Math.LN10)),isNaN(c)||!isFinite(c))&&(c=d);for(var e=0;eb?1>=c?1:5>=c?5:10:Math.max(Math.floor(c),1);return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.getNiceNumber= -function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=d?1.5>c?1:3>c?2:7>c?5:10:1>=c?1:2>=c?2:5>=c?5:10;return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.prototype.getLabelStartPoint=function(){var a=S[this.intervalType+"Duration"]*this.interval,a=new Date(Math.floor(this.viewportMinimum/a)*a);if("millisecond"!==this.intervalType)if("second"===this.intervalType)0=a||"bottom"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(c,l),this.ctx.lineTo(m,l),this.ctx.lineTo(m,e);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(l-h)/a/3;for(var n=0;n=a||"right"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(m,e),this.ctx.lineTo(m,l), -this.ctx.lineTo(c,l);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(m-k)/a/3;for(n=0;nthis.parent.range?2:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range? -1:0):50this.parent.range?2:10>this.parent.range?1:0);this.valueFormatString=z.generateValueFormatString(this.parent.range,h)}var l=null===this.opacity?1:this.opacity,h=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness),p=this.chart.overlaidCanvasCtx,q=p.globalAlpha;p.globalAlpha=l;p.beginPath();p.strokeStyle=this.color;p.lineWidth=h;p.save();this.labelFontSize= -u(this.options.labelFontSize)?this.parent.labelFontSize:this.labelFontSize;if("left"===this.parent._position||"right"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?this.parent.bounds.x2-this.parent.bounds.x1:this.labelMaxWidth,this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?3*this.chart.height:2*this.labelFontSize;else if("top"===this.parent._position||"bottom"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?3*this.chart.width:this.labelMaxWidth, -this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?this.parent.bounds.height:2*this.labelFontSize;0this.chart.bounds.x2?l.x=this.chart.bounds.x2-l.width:l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}}else if("bottom"===this.parent._position||"top"===this.parent._position){n=this.parent.convertPixelToValue({x:a});for(r=0;rthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"=== -this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}m=null;("bottom"===this.parent._position||"top"===this.parent._position)&&(b>=this.parent.convertValueToPixel(this.parent.viewportMinimum)&&c<=this.parent.convertValueToPixel(this.parent.viewportMaximum))&&(0=this.parent.convertValueToPixel(this.parent.viewportMaximum)&& -e<=this.parent.convertValueToPixel(this.parent.viewportMinimum))&&(0this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x1-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}else{if("bottom"===this.parent._position||"top"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)? -ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label,l.x=b-l.measureText().width/2,l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width),l.xthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2),"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2);0(new Date).getTime()-this._lastUpdated||(this._lastUpdated=(new Date).getTime(), -this.chart.resetOverlayedCanvas(),this._updateToolTip(a,d))};$.prototype._updateToolTip=function(a,d,b){b="undefined"===typeof b?!0:b;this.container||this._initialize();this.enabled||this.hide();if(!this.chart.disableToolTip){if("undefined"===typeof a||"undefined"===typeof d){if(isNaN(this._prevX)||isNaN(this._prevY))return;a=this._prevX;d=this._prevY}else this._prevX=a,this._prevY=d;var c=null,e=null,g=[],k=0;if(this.shared&&this.enabled&&"none"!==this.chart.plotInfo.axisPlacement){if("xySwapped"=== -this.chart.plotInfo.axisPlacement){var l=[];if(this.chart.axisX)for(var p=0;ph.dataSeries.axisY.viewportMaximum&&b++;b-h.dataPoint.y.length&&g.push(h)}else"column"===e.type||"bar"===e.type?0>h.dataPoint.y?0>h.dataSeries.axisY.viewportMinimum&&h.dataSeries.axisY.viewportMaximum>=h.dataPoint.y&&g.push(h):h.dataSeries.axisY.viewportMinimum<=h.dataPoint.y&&0<=h.dataSeries.axisY.viewportMaximum&&g.push(h):"bubble"===e.type?(b=this.chart._eventManager.objectMap[e.dataPointIds[h.index]].size/2,h.dataPoint.y>= -h.dataSeries.axisY.viewportMinimum-b&&h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum+b&&g.push(h)):"waterfall"===e.type?(b=0,h.cumulativeSumYStartValueh.dataSeries.axisY.viewportMaximum&&b++,h.cumulativeSumh.dataSeries.axisY.viewportMaximum&&b++,2>b&&-2=h.dataSeries.axisY.viewportMinimum&& -h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum)&&g.push(h);else g.push(h)}}if(0a&&(a+=this.container.clientWidth+20);a+this.container.clientWidth> -Math.max(this.chart.container.clientWidth,this.chart.width)&&(a=Math.max(0,Math.max(this.chart.container.clientWidth,this.chart.width)-this.container.clientWidth));d=1!==g.length||this.shared||"line"!==g[0].dataSeries.type&&"stepLine"!==g[0].dataSeries.type&&"spline"!==g[0].dataSeries.type&&"area"!==g[0].dataSeries.type&&"stepArea"!==g[0].dataSeries.type&&"splineArea"!==g[0].dataSeries.type?"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"=== -g[0].dataSeries.type?g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x):d:g[0].dataSeries.axisY.convertValueToPixel(g[0].dataPoint.y);d=-d+10;0":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content? -this.content:"{name}:  {y}",p=b.axisXIndex):"bubble"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y},   {z}"): -"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y[0]}, {y[1]}"):"candlestick"=== -b.type||"ohlc"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Open:   {y[0]}
High:    {y[1]}
Low:   {y[2]}
Close:   {y[3]}"):"boxAndWhisker"=== -b.type&&(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"), -null===d&&(d=""),!0===this.reversed?(d=this.chart.replaceKeywordsWithValue(g,c,b,e)+d,l"+d)):(d+=this.chart.replaceKeywordsWithValue(g,c,b,e),l")));null!==d&&(d=h+d)}else{b=a[0].dataSeries;c=a[0].dataPoint;e=a[0].index;if(null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent)return null;"line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"===b.type||"splineArea"===b.type||"column"=== -b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y}":"bubble"===b.type?g=c.toolTipContent? -c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y},   {z}":"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.name?"{name}:  ":c.label?"{label}:  ":"")+"{y}":"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+" :  {y[0]},  {y[1]}": -"candlestick"===b.type||"ohlc"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Open:   {y[0]}
High:    {y[1]}
Low:     {y[2]}
Close:   {y[3]}":"boxAndWhisker"===b.type&&(g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent: -this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"); -null===d&&(d="");d+=this.chart.replaceKeywordsWithValue(g,c,b,e)}return d};$.prototype.enableAnimation=function(){if(!this.container.style.WebkitTransition){var a=this.getContainerTransition(this.containerTransitionDuration);this.container.style.WebkitTransition=a;this.container.style.MsTransition=a;this.container.style.transition=a;this.container.style.MozTransition=this.mozContainerTransition}};$.prototype.disableAnimation=function(){this.container.style.WebkitTransition&&(this.container.style.WebkitTransition= -"",this.container.style.MozTransition="",this.container.style.MsTransition="",this.container.style.transition="")};$.prototype.hide=function(a){this.container&&(this.container.style.display="none",this.currentSeriesIndex=-1,this._prevY=this._prevX=NaN,("undefined"===typeof a||a)&&this.chart.resetOverlayedCanvas())};$.prototype.show=function(a,d,b){this._updateToolTip(a,d,"undefined"===typeof b?!1:b)};$.prototype.fixMozTransitionDelay=function(a,d){if(20c&&a.push(d),d.animationCallback(c),1<=c&&d.onComplete)d.onComplete();this.animations=a;0g;g++)for(var e=0;3>e;e++){for(var f=0,d=0;3>d;d++)f+=a[g][d]*b[d][e];c[g][e]=f}return c}function P(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX= -a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha;b.font=a.font;b.textAlign=a.textAlign;b.textBaseline=a.textBaseline;b.arcScaleX_=a.arcScaleX_;b.arcScaleY_=a.arcScaleY_;b.lineScale_=a.lineScale_}function Q(a){var b=a.indexOf("(",3),c=a.indexOf(")",b+1),b=a.substring(b+1,c).split(",");if(4!=b.length||"a"!=a.charAt(3))b[3]=1;return b}function E(a,b,c){return Math.min(c,Math.max(b,a))}function F(a,b,c){0>c&&c++;16*c?a+6*(b-a)*c: -1>2*c?b:2>3*c?a+6*(b-a)*(2/3-c):a}function G(a){if(a in H)return H[a];var b,c=1;a=String(a);if("#"==a.charAt(0))b=a;else if(/^rgb/.test(a)){c=Q(a);b="#";for(var g,e=0;3>e;e++)g=-1!=c[e].indexOf("%")?Math.floor(255*(parseFloat(c[e])/100)):+c[e],b+=v[E(g,0,255)];c=+c[3]}else if(/^hsl/.test(a)){e=c=Q(a);b=parseFloat(e[0])/360%360;0>b&&b++;g=E(parseFloat(e[1])/100,0,1);e=E(parseFloat(e[2])/100,0,1);if(0==g)g=e=b=e;else{var f=0.5>e?e*(1+g):e+g-e*g,d=2*e-f;g=F(d,f,b+1/3);e=F(d,f,b);b=F(d,f,b-1/3)}b="#"+ -v[Math.floor(255*g)]+v[Math.floor(255*e)]+v[Math.floor(255*b)];c=c[3]}else b=Z[a]||a;return H[a]={color:b,alpha:c}}function C(a){this.m_=D();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=1*q;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=a;var b="width:"+a.clientWidth+"px;height:"+a.clientHeight+"px;overflow:hidden;position:absolute", -c=a.ownerDocument.createElement("div");c.style.cssText=b;a.appendChild(c);b=c.cloneNode(!1);b.style.backgroundColor="red";b.style.filter="alpha(opacity=0)";a.appendChild(b);this.element_=c;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}function R(a,b,c,g){a.currentPath_.push({type:"bezierCurveTo",cp1x:b.x,cp1y:b.y,cp2x:c.x,cp2y:c.y,x:g.x,y:g.y});a.currentX_=g.x;a.currentY_=g.y}function S(a,b){var c=G(a.strokeStyle),g=c.color,c=c.alpha*a.globalAlpha,e=a.lineScale_*a.lineWidth;1>e&&(c*=e);b.push("')}function T(a,b,c,g){var e=a.fillStyle,f=a.arcScaleX_,d=a.arcScaleY_,k=g.x-c.x,n=g.y-c.y;if(e instanceof w){var h=0,l=g=0,u=0,m=1;if("gradient"==e.type_){h=e.x1_/f;c=e.y1_/d;var p=s(a,e.x0_/f,e.y0_/d),h=s(a,h,c),h=180*Math.atan2(h.x-p.x,h.y-p.y)/Math.PI;0>h&&(h+=360);1E-6>h&&(h=0)}else p=s(a,e.x0_,e.y0_),g=(p.x-c.x)/k,l=(p.y-c.y)/n,k/=f*q, -n/=d*q,m=x.max(k,n),u=2*e.r0_/m,m=2*e.r1_/m-u;f=e.colors_;f.sort(function(a,b){return a.offset-b.offset});d=f.length;p=f[0].color;c=f[d-1].color;k=f[0].alpha*a.globalAlpha;a=f[d-1].alpha*a.globalAlpha;for(var n=[],r=0;r')}else e instanceof -I?k&&n&&b.push("'):(e=G(a.fillStyle),b.push(''))}function s(a,b,c){a=a.m_;return{x:q*(b*a[0][0]+c*a[1][0]+a[2][0])-r,y:q*(b*a[0][1]+c*a[1][1]+a[2][1])-r}}function z(a,b,c){isFinite(b[0][0])&&(isFinite(b[0][1])&&isFinite(b[1][0])&&isFinite(b[1][1])&&isFinite(b[2][0])&&isFinite(b[2][1]))&&(a.m_=b,c&&(a.lineScale_=aa(ba(b[0][0]*b[1][1]-b[0][1]* -b[1][0]))))}function w(a){this.type_=a;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}function I(a,b){if(!a||1!=a.nodeType||"IMG"!=a.tagName)throw new A("TYPE_MISMATCH_ERR");if("complete"!=a.readyState)throw new A("INVALID_STATE_ERR");switch(b){case "repeat":case null:case "":this.repetition_="repeat";break;case "repeat-x":case "repeat-y":case "no-repeat":this.repetition_=b;break;default:throw new A("SYNTAX_ERR");}this.src_=a.src;this.width_=a.width;this.height_=a.height} -function A(a){this.code=this[a];this.message=a+": DOM Exception "+this.code}var x=Math,k=x.round,J=x.sin,K=x.cos,ba=x.abs,aa=x.sqrt,q=10,r=q/2;navigator.userAgent.match(/MSIE ([\d.]+)?/);var M=Array.prototype.slice;O(document);var U={init:function(a){a=a||document;a.createElement("canvas");a.attachEvent("onreadystatechange",W(this.init_,this,a))},init_:function(a){a=a.getElementsByTagName("canvas");for(var b=0;bd;d++)for(var B=0;16>B;B++)v[16*d+B]=d.toString(16)+B.toString(16);var Z={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC", -bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000", -darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082", -ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA", -mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5", -peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"}, -H={},L={},$={butt:"flat",round:"round"},d=C.prototype;d.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null);this.element_.innerHTML=""};d.beginPath=function(){this.currentPath_=[]};d.moveTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.lineTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.bezierCurveTo= -function(a,b,c,g,e,f){e=s(this,e,f);a=s(this,a,b);c=s(this,c,g);R(this,a,c,e)};d.quadraticCurveTo=function(a,b,c,g){a=s(this,a,b);c=s(this,c,g);g={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)};R(this,g,{x:g.x+(c.x-this.currentX_)/3,y:g.y+(c.y-this.currentY_)/3},c)};d.arc=function(a,b,c,g,e,f){c*=q;var d=f?"at":"wa",k=a+K(g)*c-r,n=b+J(g)*c-r;g=a+K(e)*c-r;e=b+J(e)*c-r;k!=g||f||(k+=0.125);a=s(this,a,b);k=s(this,k,n);g=s(this,g,e);this.currentPath_.push({type:d, -x:a.x,y:a.y,radius:c,xStart:k.x,yStart:k.y,xEnd:g.x,yEnd:g.y})};d.rect=function(a,b,c,g){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath()};d.strokeRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath();this.stroke();this.currentPath_=e};d.fillRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+ -c,b+g);this.lineTo(a,b+g);this.closePath();this.fill();this.currentPath_=e};d.createLinearGradient=function(a,b,c,g){var e=new w("gradient");e.x0_=a;e.y0_=b;e.x1_=c;e.y1_=g;return e};d.createRadialGradient=function(a,b,c,g,e,f){var d=new w("gradientradial");d.x0_=a;d.y0_=b;d.r0_=c;d.x1_=g;d.y1_=e;d.r1_=f;return d};d.drawImage=function(a,b){var c,g,e,d,r,y,n,h;e=a.runtimeStyle.width;d=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var l=a.width,u=a.height;a.runtimeStyle.width= -e;a.runtimeStyle.height=d;if(3==arguments.length)c=arguments[1],g=arguments[2],r=y=0,n=e=l,h=d=u;else if(5==arguments.length)c=arguments[1],g=arguments[2],e=arguments[3],d=arguments[4],r=y=0,n=l,h=u;else if(9==arguments.length)r=arguments[1],y=arguments[2],n=arguments[3],h=arguments[4],c=arguments[5],g=arguments[6],e=arguments[7],d=arguments[8];else throw Error("Invalid number of arguments");var m=s(this,c,g),p=[];p.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))};d.stroke=function(a){var b=[];b.push("d.x)d.x=f.x;if(null==c.y||f.yd.y)d.y=f.y}}b.push(' ">');a?T(this,b,c,d):S(this,b);b.push("");this.element_.insertAdjacentHTML("beforeEnd",b.join(""))};d.fill=function(){this.stroke(!0)};d.closePath=function(){this.currentPath_.push({type:"close"})};d.save=function(){var a= -{};P(this,a);this.aStack_.push(a);this.mStack_.push(this.m_);this.m_=t(D(),this.m_)};d.restore=function(){this.aStack_.length&&(P(this.aStack_.pop(),this),this.m_=this.mStack_.pop())};d.translate=function(a,b){z(this,t([[1,0,0],[0,1,0],[a,b,1]],this.m_),!1)};d.rotate=function(a){var b=K(a);a=J(a);z(this,t([[b,a,0],[-a,b,0],[0,0,1]],this.m_),!1)};d.scale=function(a,b){this.arcScaleX_*=a;this.arcScaleY_*=b;z(this,t([[a,0,0],[0,b,0],[0,0,1]],this.m_),!0)};d.transform=function(a,b,c,d,e,f){z(this,t([[a, -b,0],[c,d,0],[e,f,1]],this.m_),!0)};d.setTransform=function(a,b,c,d,e,f){z(this,[[a,b,0],[c,d,0],[e,f,1]],!0)};d.drawText_=function(a,b,c,d,e){var f=this.m_;d=0;var r=1E3,t=0,n=[],h;h=this.font;if(L[h])h=L[h];else{var l=document.createElement("div").style;try{l.font=h}catch(u){}h=L[h]={style:l.fontStyle||"normal",variant:l.fontVariant||"normal",weight:l.fontWeight||"normal",size:l.fontSize||10,family:l.fontFamily||"sans-serif"}}var l=h,m=this.element_;h={};for(var p in l)h[p]=l[p];p=parseFloat(m.currentStyle.fontSize); -m=parseFloat(l.size);"number"==typeof l.size?h.size=l.size:-1!=l.size.indexOf("px")?h.size=m:-1!=l.size.indexOf("em")?h.size=p*m:-1!=l.size.indexOf("%")?h.size=p/100*m:-1!=l.size.indexOf("pt")?h.size=m/0.75:h.size=p;h.size*=0.981;p=h.style+" "+h.variant+" "+h.weight+" "+h.size+"px "+h.family;m=this.element_.currentStyle;l=this.textAlign.toLowerCase();switch(l){case "left":case "center":case "right":break;case "end":l="ltr"==m.direction?"right":"left";break;case "start":l="rtl"==m.direction?"right": -"left";break;default:l="left"}switch(this.textBaseline){case "hanging":case "top":t=h.size/1.75;break;case "middle":break;default:case null:case "alphabetic":case "ideographic":case "bottom":t=-h.size/2.25}switch(l){case "right":d=1E3;r=0.05;break;case "center":d=r=500}b=s(this,b+0,c+t);n.push('');e?S(this,n):T(this,n,{x:-d,y:0}, -{x:r,y:h.size});e=f[0][0].toFixed(3)+","+f[1][0].toFixed(3)+","+f[0][1].toFixed(3)+","+f[1][1].toFixed(3)+",0,0";b=k(b.x/q)+","+k(b.y/q);n.push('','','');this.element_.insertAdjacentHTML("beforeEnd",n.join(""))};d.fillText=function(a,b,c,d){this.drawText_(a,b,c,d,!1)};d.strokeText=function(a, -b,c,d){this.drawText_(a,b,c,d,!0)};d.measureText=function(a){this.textMeasureEl_||(this.element_.insertAdjacentHTML("beforeEnd",''),this.textMeasureEl_=this.element_.lastChild);var b=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(b.createTextNode(a));return{width:this.textMeasureEl_.offsetWidth}};d.clip=function(){}; -d.arcTo=function(){};d.createPattern=function(a,b){return new I(a,b)};w.prototype.addColorStop=function(a,b){b=G(b);this.colors_.push({offset:a,color:b.color,alpha:b.alpha})};d=A.prototype=Error();d.INDEX_SIZE_ERR=1;d.DOMSTRING_SIZE_ERR=2;d.HIERARCHY_REQUEST_ERR=3;d.WRONG_DOCUMENT_ERR=4;d.INVALID_CHARACTER_ERR=5;d.NO_DATA_ALLOWED_ERR=6;d.NO_MODIFICATION_ALLOWED_ERR=7;d.NOT_FOUND_ERR=8;d.NOT_SUPPORTED_ERR=9;d.INUSE_ATTRIBUTE_ERR=10;d.INVALID_STATE_ERR=11;d.SYNTAX_ERR=12;d.INVALID_MODIFICATION_ERR= -13;d.NAMESPACE_ERR=14;d.INVALID_ACCESS_ERR=15;d.VALIDATION_ERR=16;d.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=U;CanvasRenderingContext2D=C;CanvasGradient=w;CanvasPattern=I;DOMException=A}(); -/*eslint-enable*/ -/*jshint ignore:end*/ \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js b/SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js deleted file mode 100644 index 69c7951e..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js +++ /dev/null @@ -1,48 +0,0 @@ -var React = require('react'); -var CanvasJS = require('./canvasjs.min'); -CanvasJS = CanvasJS.Chart ? CanvasJS : window.CanvasJS; - -class CanvasJSChart extends React.Component { - static _cjsContainerId = 0 - constructor(props) { - super(props); - this.options = props.options ? props.options : {}; - this.containerProps = props.containerProps ? props.containerProps : {width: "100%", position: "relative"}; - this.containerProps.height = props.containerProps && props.containerProps.height ? props.containerProps.height : this.options.height ? this.options.height + "px" : "400px"; - this.chartContainerId = "canvasjs-react-chart-container-" + CanvasJSChart._cjsContainerId++; - } - componentDidMount() { - //Create Chart and Render - this.chart = new CanvasJS.Chart(this.chartContainerId, this.options); - this.chart.render(); - - if(this.props.onRef) - this.props.onRef(this.chart); - } - shouldComponentUpdate(nextProps, nextState){ - //Check if Chart-options has changed and determine if component has to be updated - return !(nextProps.options === this.options); - } - componentDidUpdate() { - //Update Chart Options & Render - this.chart.options = this.props.options; - this.chart.render(); - } - componentWillUnmount() { - //Destroy chart and remove reference - this.chart.destroy(); - if(this.props.onRef) - this.props.onRef(undefined); - } - render() { - //return React.createElement('div', { id: this.chartContainerId, style: this.containerProps }); - return
- } -} - -var CanvasJSReact = { - CanvasJSChart: CanvasJSChart, - CanvasJS: CanvasJS -}; - -export default CanvasJSReact; \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html deleted file mode 100644 index ef650afe..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html deleted file mode 100644 index 57e08a55..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html deleted file mode 100644 index 3cb8789c..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html deleted file mode 100644 index 34e46259..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html deleted file mode 100644 index 4f6e15c6..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html deleted file mode 100644 index 50b7d737..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - -
- - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html deleted file mode 100644 index cd5dd33e..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html deleted file mode 100644 index 0b69ea91..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html deleted file mode 100644 index 895c4e28..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html deleted file mode 100644 index 4e292db0..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html deleted file mode 100644 index 79a3d417..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html deleted file mode 100644 index a42de04d..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html deleted file mode 100644 index 17505925..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html deleted file mode 100644 index f156e2f8..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html deleted file mode 100644 index 2b0a5ed9..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html deleted file mode 100644 index 7be550ab..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html deleted file mode 100644 index b5b8e010..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html deleted file mode 100644 index 9bfb56e5..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html deleted file mode 100644 index 9a6a355b..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html deleted file mode 100644 index 8b620e23..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html deleted file mode 100644 index 4a3430ac..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html deleted file mode 100644 index e4626cc0..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html deleted file mode 100644 index 24a15c69..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - -
-
- - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html deleted file mode 100644 index d21bd730..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html deleted file mode 100644 index c25f9ae8..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html deleted file mode 100644 index 7c4d43d0..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html deleted file mode 100644 index d6d67a13..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html deleted file mode 100644 index 34c7c5bf..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html deleted file mode 100644 index 3cdb8259..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html deleted file mode 100644 index 7c1afce1..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html deleted file mode 100644 index dc1a4b7a..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html deleted file mode 100644 index f721ee43..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html deleted file mode 100644 index 5e0ce683..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html deleted file mode 100644 index 1bd75401..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html deleted file mode 100644 index 54e2bece..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html deleted file mode 100644 index e5408a62..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html deleted file mode 100644 index 280a052a..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - -
- - - diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html deleted file mode 100644 index 450b4a57..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html deleted file mode 100644 index 76483f3a..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - -
-
- - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html deleted file mode 100644 index 7af19276..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html deleted file mode 100644 index 90e29ed7..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html deleted file mode 100644 index 7fb51f0a..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html deleted file mode 100644 index 5e7f2a0b..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html deleted file mode 100644 index d12b9cf5..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html deleted file mode 100644 index 982c84d7..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html deleted file mode 100644 index db126063..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html deleted file mode 100644 index 69e6bb35..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html deleted file mode 100644 index a90e357d..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html deleted file mode 100644 index 3e473fbf..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html deleted file mode 100644 index 4a8b95f7..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html deleted file mode 100644 index 2482015d..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html deleted file mode 100644 index a0fe8f0f..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html deleted file mode 100644 index e53506c7..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html deleted file mode 100644 index 39e9e1b9..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html deleted file mode 100644 index f377f681..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html deleted file mode 100644 index bed3a0ab..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html deleted file mode 100644 index cf00ff2b..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html deleted file mode 100644 index 7ad45521..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html deleted file mode 100644 index 7e9b4297..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html deleted file mode 100644 index b5d9fb7b..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html deleted file mode 100644 index 8aa524e4..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html deleted file mode 100644 index 3b475ef7..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - -
-
- - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html deleted file mode 100644 index 770bc9dc..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - -
- -
- - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html deleted file mode 100644 index e1bd01bb..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html deleted file mode 100644 index 7dd8a3e7..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html deleted file mode 100644 index c84b2a9a..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html deleted file mode 100644 index e39048c9..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html deleted file mode 100644 index b9053b27..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html deleted file mode 100644 index 72db3b31..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html deleted file mode 100644 index 35871f64..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html deleted file mode 100644 index 3cca87c6..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html deleted file mode 100644 index ee555661..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html deleted file mode 100644 index 580047d0..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html deleted file mode 100644 index 2670b874..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html deleted file mode 100644 index a0980da9..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - -
- - - diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html deleted file mode 100644 index 7a3212ee..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html deleted file mode 100644 index eb0a7abd..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html deleted file mode 100644 index 39a28571..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html deleted file mode 100644 index c38a46af..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html deleted file mode 100644 index c7a16883..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html deleted file mode 100644 index 327b5f6e..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html deleted file mode 100644 index 1d9c8738..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html deleted file mode 100644 index 01b9a6aa..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html deleted file mode 100644 index ddb9026b..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html deleted file mode 100644 index b6f1cc72..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html deleted file mode 100644 index 24674cea..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html deleted file mode 100644 index fd35f556..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html deleted file mode 100644 index 393d6af1..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html deleted file mode 100644 index be32272f..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html deleted file mode 100644 index 392bb3c1..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html deleted file mode 100644 index 988c2219..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html deleted file mode 100644 index 2dbd00d6..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html deleted file mode 100644 index d6d42070..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html deleted file mode 100644 index c139f406..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html deleted file mode 100644 index 31523b13..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - -
-
-
- - - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html deleted file mode 100644 index b35ebf4b..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - -
- -
-
-
-
-
-
-
- - - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html deleted file mode 100644 index a3e82d02..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/instruction.txt b/SRIP/Libraries/canvasjs-2.3.1/instruction.txt deleted file mode 100644 index 93eb448f..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/instruction.txt +++ /dev/null @@ -1,4 +0,0 @@ -For standalone version include canvasjs.min.js -For jQuery version include jquery.canvasjs.min.js - -** DO NOT include both the files ** \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js b/SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js deleted file mode 100644 index 8785b495..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js +++ /dev/null @@ -1,922 +0,0 @@ -/* - CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ - Copyright 2018 fenopix - - --------------------- License Information -------------------- - CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. - https://canvasjs.com/license/ - -*/ -/*eslint-disable*/ -/*jshint ignore:start*/ -(function(){function qa(k,p){k.prototype=eb(p.prototype);k.prototype.constructor=k;k.base=p.prototype}function eb(k){function p(){}p.prototype=k;return new p}function Ya(k,p,D){"millisecond"===D?k.setMilliseconds(k.getMilliseconds()+1*p):"second"===D?k.setSeconds(k.getSeconds()+1*p):"minute"===D?k.setMinutes(k.getMinutes()+1*p):"hour"===D?k.setHours(k.getHours()+1*p):"day"===D?k.setDate(k.getDate()+1*p):"week"===D?k.setDate(k.getDate()+7*p):"month"===D?k.setMonth(k.getMonth()+1*p):"year"===D&&k.setFullYear(k.getFullYear()+ -1*p);return k}function $(k,p){var D=!1;0>k&&(D=!0,k*=-1);k=""+k;for(p=p?p:1;k.length
Please right click on the image and save it to your device
"), -p.document.close()}}}function N(k){var p=((k&16711680)>>16).toString(16),D=((k&65280)>>8).toString(16);k=((k&255)>>0).toString(16);p=2>p.length?"0"+p:p;D=2>D.length?"0"+D:D;k=2>k.length?"0"+k:k;return"#"+p+D+k}function fb(k,p){var D=this.length>>>0,r=Number(p)||0,r=0>r?Math.ceil(r):Math.floor(r);for(0>r&&(r+=D);rD;D++)if(k[D]!==k[D+4]|k[D]!==k[D+8]|k[D]!==k[D+12]){p=!1;break}return p?k[0]<<16|k[1]<<8|k[2]:0}function na(k,p,D){return k in p?p[k]:D[k]}function Oa(k,p,D){if(r&&bb){var u=k.getContext("2d");Pa=u.webkitBackingStorePixelRatio|| -u.mozBackingStorePixelRatio||u.msBackingStorePixelRatio||u.oBackingStorePixelRatio||u.backingStorePixelRatio||1;W=Ua/Pa;k.width=p*W;k.height=D*W;Ua!==Pa&&(k.style.width=p+"px",k.style.height=D+"px",u.scale(W,W))}else k.width=p,k.height=D}function hb(k){if(!ib){var p=!1,D=!1;"undefined"===typeof ra.Chart.creditHref?(k.creditHref=ja("iuuqr;..b`ow`rkr/bnl."),k.creditText=ja("B`ow`rKR/bnl")):(p=k.updateOption("creditText"),D=k.updateOption("creditHref"));if(k.creditHref&&k.creditText){k._creditLink|| -(k._creditLink=document.createElement("a"),k._creditLink.setAttribute("class","canvasjs-chart-credit"),k._creditLink.setAttribute("title","JavaScript Charts"),k._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:2px;top:"+(k.height-14)+"px;color:dimgrey;text-decoration:none;font-size:11px;font-family: Calibri, Lucida Grande, Lucida Sans Unicode, Arial, sans-serif"),k._creditLink.setAttribute("tabIndex",-1),k._creditLink.setAttribute("target","_blank"));if(0===k.renderCount|| -p||D)k._creditLink.setAttribute("href",k.creditHref),k._creditLink.innerHTML=k.creditText;k._creditLink&&k.creditHref&&k.creditText?(k._creditLink.parentElement||k._canvasJSContainer.appendChild(k._creditLink),k._creditLink.style.top=k.height-14+"px"):k._creditLink.parentElement&&k._canvasJSContainer.removeChild(k._creditLink)}}}function ta(k,p){Ja&&(this.canvasCount|=0,window.console.log(++this.canvasCount));var D=document.createElement("canvas");D.setAttribute("class","canvasjs-chart-canvas");Oa(D, -k,p);r||"undefined"===typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(D);return D}function sa(k,p,D){for(var r in D)p.style[r]=D[r]}function ua(k,p,D){p.getAttribute("state")||(p.style.backgroundColor=k.toolbar.backgroundColor,p.style.color=k.toolbar.fontColor,p.style.border="none",sa(k,p,{WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",userSelect:"none"}));p.getAttribute("state")!==D&&(p.setAttribute("state",D),p.setAttribute("type","button"),sa(k,p,{padding:"5px 12px", -cursor:"pointer","float":"left",width:"40px",height:"25px",outline:"0px",verticalAlign:"baseline",lineHeight:"0"}),p.setAttribute("title",k._cultureInfo[D+"Text"]),p.innerHTML=""+k._cultureInfo[D+"Text"]+"")}function Qa(){for(var k=null,p=0;pa?"a":"p";case "tt":return 12>a?"am":"pm";case "T":return 12>a?"A": -"P";case "TT":return 12>a?"AM":"PM";case "K":return S?"UTC":(String(z).match(H)||[""]).pop().replace(F,"");case "z":return(0k?!0:!1;u&&(k*=-1);var v=r?r.decimalSeparator:".",H=r?r.digitGroupSeparator: -",",F="";p=String(p);var F=1,z=r="",E=-1,L=[],R=[],I=0,N=0,S=0,O=!1,U=0,z=p.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|\u2030|./g);p=null;for(var Q=0;z&&QE)E=Q;else{if("%"===p)F*=100;else if("\u2030"===p){F*=1E3;continue}else if(","===p[0]&&"."===p[p.length-1]){F/=Math.pow(1E3,p.length-1);E=Q+p.length-1;continue}else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||(O=!0);0>E?(L.push(p),"#"===p||"0"===p?I++:","===p&&S++):(R.push(p),"#"!==p&&"0"!==p||N++)}O&&(p=Math.floor(k), -z=-Math.floor(Math.log(k)/Math.LN10+1),U=0===k?0:0===p?-(I+z):String(p).length-I,F/=Math.pow(10,U));0>E&&(E=Q);F=(k*F).toFixed(N);p=F.split(".");F=(p[0]+"").split("");k=(p[1]+"").split("");F&&"0"===F[0]&&F.shift();for(O=z=Q=N=E=0;0U?p.replace("+","").replace("-",""):p.replace("-",""),r+=p.replace(/[0]+/,function(k){return $(U,k.length)}));H="";for(L=!1;0U?p.replace("+","").replace("-",""):p.replace("-",""),H+=p.replace(/[0]+/,function(k){return $(U,k.length)}));r+=(L?v:"")+H;return u?"-"+r:r},Ra=function(k){var p=0,r=0;k=k||window.event;k.offsetX||0===k.offsetX?(p=k.offsetX,r=k.offsetY):k.layerX||0==k.layerX?(p=k.layerX,r=k.layerY):(p=k.pageX-k.target.offsetLeft, -r=k.pageY-k.target.offsetTop);return{x:p,y:r}},bb=!0,Ua=window.devicePixelRatio||1,Pa=1,W=bb?Ua/Pa:1,ea=function(k,p,r,u,v,H,F,z,E,L,R,N,O){"undefined"===typeof O&&(O=1);F=F||0;z=z||"black";var I=15p)v=H-1;else break}r>p&&1H&&(F=p.pop(),u-=F.height,v=z)}this._wrappedText={lines:p,width:v,height:u};this.width=v+(this.leftPadding+this.rightPadding);this.height=u+(this.topPadding+this.bottomPadding);this.ctx.font=r};ka.prototype._getFontString=function(){var k;k=""+(this.fontStyle?this.fontStyle+" ":"");k+=this.fontWeight?this.fontWeight+" ":"";k+=this.fontSize?this.fontSize+"px ":"";var p=this.fontFamily?this.fontFamily+"":"";!r&&p&&(p=p.split(",")[0],"'"!==p[0]&&'"'!==p[0]&&(p="'"+p+"'"));return k+=p}; -qa(Va,V);qa(Aa,V);Aa.prototype.setLayout=function(){if(this.text){var k=this.dockInsidePlotArea?this.chart.plotArea:this.chart,p=k.layoutManager.getFreeSpace(),r=p.x1,v=p.y1,E=0,H=0,F=this.chart._menuButton&&this.chart.exportEnabled&&"top"===this.verticalAlign?22:0,z,I;"top"===this.verticalAlign||"bottom"===this.verticalAlign?(null===this.maxWidth&&(this.maxWidth=p.width-4-F*("center"===this.horizontalAlign?2:1)),H=0.5*p.height-this.margin-2,E=0):"center"===this.verticalAlign&&("left"===this.horizontalAlign|| -"right"===this.horizontalAlign?(null===this.maxWidth&&(this.maxWidth=p.height-4),H=0.5*p.width-this.margin-2):"center"===this.horizontalAlign&&(null===this.maxWidth&&(this.maxWidth=p.width-4),H=0.5*p.height-4));var L;u(this.padding)||"number"!==typeof this.padding?u(this.padding)||"object"!==typeof this.padding||(L=this.padding.top?this.padding.top:this.padding.bottom?this.padding.bottom:0,L+=this.padding.bottom?this.padding.bottom:this.padding.top?this.padding.top:0,L*=1.25):L=2.5*this.padding;this.wrap|| -(H=Math.min(H,Math.max(1.5*this.fontSize,this.fontSize+L)));H=new ka(this.ctx,{fontSize:this.fontSize,fontFamily:this.fontFamily,fontColor:this.fontColor,fontStyle:this.fontStyle,fontWeight:this.fontWeight,horizontalAlign:this.horizontalAlign,verticalAlign:this.verticalAlign,borderColor:this.borderColor,borderThickness:this.borderThickness,backgroundColor:this.backgroundColor,maxWidth:this.maxWidth,maxHeight:H,cornerRadius:this.cornerRadius,text:this.text,padding:this.padding,textBaseline:"top"}); -L=H.measureText();"top"===this.verticalAlign||"bottom"===this.verticalAlign?("top"===this.verticalAlign?(v=p.y1+2,I="top"):"bottom"===this.verticalAlign&&(v=p.y2-2-L.height,I="bottom"),"left"===this.horizontalAlign?r=p.x1+2:"center"===this.horizontalAlign?r=p.x1+p.width/2-L.width/2:"right"===this.horizontalAlign&&(r=p.x2-2-L.width-F),z=this.horizontalAlign,this.width=L.width,this.height=L.height):"center"===this.verticalAlign&&("left"===this.horizontalAlign?(r=p.x1+2,v=p.y2-2-(this.maxWidth/2-L.width/ -2),E=-90,I="left",this.width=L.height,this.height=L.width):"right"===this.horizontalAlign?(r=p.x2-2,v=p.y1+2+(this.maxWidth/2-L.width/2),E=90,I="right",this.width=L.height,this.height=L.width):"center"===this.horizontalAlign&&(v=k.y1+(k.height/2-L.height/2),r=k.x1+(k.width/2-L.width/2),I="center",this.width=L.width,this.height=L.height),z="center");H.x=r;H.y=v;H.angle=E;H.horizontalAlign=z;this._textBlock=H;k.layoutManager.registerSpace(I,{width:this.width+("left"===I||"right"===I?this.margin+2:0), -height:this.height+("top"===I||"bottom"===I?this.margin+2:0)});this.bounds={x1:r,y1:v,x2:r+this.width,y2:v+this.height};this.ctx.textBaseline="top"}};Aa.prototype.render=function(){this._textBlock&&this._textBlock.render(!0)};qa(Ka,V);Ka.prototype.setLayout=Aa.prototype.setLayout;Ka.prototype.render=Aa.prototype.render;Wa.prototype.get=function(k,p){var r=null;0a[g].x&&0w?{x:a[l].x+w/3,y:a[l].y+c/3}:{x:a[l].x,y:a[l].y+c/9};l=e;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[l].x-a[g].x?0.01:a[l].x-a[g].x))*(d- -1)/2+1;w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0w?{x:a[l].x-w/3,y:a[l].y-c/3}:{x:a[l].x,y:a[l].y-c/9};b[b.length]=a[e]}return b}function E(a,d,b,c,e,g,m,l,w,h){var s=0;h?(m.color=g,l.color=g):h=1;s=w?Math.abs(e-b):Math.abs(c-d);s=0this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360);this.options.scaleBreaks&&(this.scaleBreaks=new Q(this.chart, -this.options.scaleBreaks,++this.chart._eventManager.lastObjectId,this));this.stripLines=[];if(this.options.stripLines&&0=this._appliedBreaks[a+1].startValue&&(this._appliedBreaks[a].endValue=Math.max(this._appliedBreaks[a].endValue,this._appliedBreaks[a+1].endValue),window.console&&window.console.log("CanvasJS Error: Breaks "+a+" and "+(a+1)+" are overlapping."),this._appliedBreaks.splice(a,2),a--)}}function L(a,d,b,c,e,g){L.base.constructor.call(this,"Break",d,b,c,g);this.id=e;this.chart=a;this.ctx=this.chart.ctx;this.scaleBreaks=g;this.optionsName= -d;this.isOptionsInArray=!0;this.type=b.type?this.type:g.type;this.fillOpacity=u(b.fillOpacity)?g.fillOpacity:this.fillOpacity;this.lineThickness=u(b.lineThickness)?g.lineThickness:this.lineThickness;this.color=b.color?this.color:g.color;this.lineColor=b.lineColor?this.lineColor:g.lineColor;this.lineDashType=b.lineDashType?this.lineDashType:g.lineDashType;!u(this.startValue)&&this.startValue.getTime&&(this.startValue=this.startValue.getTime());!u(this.endValue)&&this.endValue.getTime&&(this.endValue= -this.endValue.getTime());"number"===typeof this.startValue&&("number"===typeof this.endValue&&this.endValue=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers);O(this._zoomButton,"mouseout",function(){d||(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(0%)", -filter:"invert(0%)"}))},this.allDOMEventHandlers)}this._resetButton||(d=!1,va(this._resetButton=document.createElement("button")),ua(this,this._resetButton,"reset"),this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor,this._toolBar.appendChild(this._resetButton),O(this._resetButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._resetButton,"click",function(){a.toolTip.hide();a.zoomEnabled||a.panEnabled?(a.zoomEnabled= -!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"),a._defaultCursor="default",a.overlaidCanvas.style.cursor=a._defaultCursor):(a.zoomEnabled=!1,a.panEnabled=!1);if(a.sessionVariables.axisX)for(var c=0;c=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers),O(this._resetButton,"mouseout",function(){d||(sa(a,a._resetButton, -{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers),this.overlaidCanvas.style.cursor=a._defaultCursor);this.zoomEnabled||this.panEnabled||(this._zoomButton?(a._zoomButton.getAttribute("state")===a._cultureInfo.zoomText?(this.panEnabled=!0,this.zoomEnabled=!1):(this.zoomEnabled=!0,this.panEnabled= -!1),Qa(a._zoomButton,a._resetButton)):(this.zoomEnabled=!0,this.panEnabled=!1))}else this.panEnabled=this.zoomEnabled=!1;this._menuButton?this.exportEnabled?Qa(this._menuButton):va(this._menuButton):this.exportEnabled&&r&&(d=!1,this._menuButton=document.createElement("button"),ua(this,this._menuButton,"menu"),this._toolBar.appendChild(this._menuButton),O(this._menuButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._menuButton,"click",function(){"none"!==a._dropdownMenu.style.display|| -a._dropDownCloseTime&&500>=(new Date).getTime()-a._dropDownCloseTime.getTime()||(a._dropdownMenu.style.display="block",a._menuButton.blur(),a._dropdownMenu.focus())},this.allDOMEventHandlers,!0),O(this._menuButton,"mouseover",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.fontColorOnHover}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers,!0), -O(this._menuButton,"mouseout",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers,!0));if(!this._dropdownMenu&&this.exportEnabled&&r){d=!1;this._dropdownMenu=document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);var b=-1!==this.theme.indexOf("dark")?"black":"#888888";this._dropdownMenu.style.cssText= -"position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 0px;top: 25px;min-width: 120px;outline: 0;font-size: 14px; font-family: Arial, Helvetica, sans-serif;padding: 5px 0px 5px 0px;text-align: left;line-height: 10px;background-color:"+this.toolbar.backgroundColor+";box-shadow: 2px 2px 10px "+b;a._dropdownMenu.style.display="none";this._toolBar.appendChild(this._dropdownMenu);O(this._dropdownMenu,"blur",function(){va(a._dropdownMenu); -a._dropDownCloseTime=new Date},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.printText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers, -!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){a.print();va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.saveJPGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d= -!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"jpeg",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText= -"padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.savePNGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor, -this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"png",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0)}"none"!==this._toolBar.style.display&&this._zoomButton&&(this.panEnabled?ua(a,a._zoomButton,"zoom"):ua(a,a._zoomButton,"pan"),a._resetButton.getAttribute("state")!==a._cultureInfo.resetText&&ua(a,a._resetButton,"reset"));this.options.toolTip&&this.toolTip.options!==this.options.toolTip&&(this.toolTip.options=this.options.toolTip); -for(var c in this.toolTip.options)this.toolTip.options.hasOwnProperty(c)&&this.toolTip.updateOption(c)};p.prototype._updateSize=function(){var a;a=[this.canvas,this._preRenderCanvas,this.overlaidCanvas,this._eventManager.ghostCanvas];var d=0,b=0;this.options.width?d=this.width:this.width=d=0c.linkedDataSeriesIndex||c.linkedDataSeriesIndex>=this.options.data.length||"number"!==typeof c.linkedDataSeriesIndex|| -"error"===this.options.data[c.linkedDataSeriesIndex].type)&&(c.linkedDataSeriesIndex=null);null===c.name&&(c.name="DataSeries "+a);null===c.color?1a&&"undefined"!==typeof w.startTimePercent?a>=w.startTimePercent&&w.animationCallback(w.easingFunction(a-w.startTimePercent,0,1,1-w.startTimePercent),w):w.animationCallback(w.easingFunction(a,0,1,1),w);s.dispatchEvent("dataAnimationIterationEnd",{chart:s})},function(){b=[];for(var a=0;aa.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c);ed.max&&"number"===typeof e&&(d.max=e);if(0B&&(B=1/B);b.minDiff>B&&1!==B&&(b.minDiff=B)}else B=c-l.dataPoints[w-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B);null!==e&&null!==l.dataPoints[w-1].y&&(a.axisY.logarithmic?(B=e/l.dataPoints[w-1].y,1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e-l.dataPoints[w-1].y,0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B)))}if(cf&& -!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&qd.viewPortMax&&"number"===typeof e&&(d.viewPortMax=e))}}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype._processStackedPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d= -a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=[],l=[],w=Infinity,h=-Infinity,s=0;sb.max&&(b.max=c);if(0r&&(r=1/r);b.minDiff>r&&1!==r&&(b.minDiff=r)}else r=c-q.dataPoints[n-1].x,0>r&&(r*=-1),b.minDiff>r&&0!==r&&(b.minDiff=r);null!==e&&null!==q.dataPoints[n-1].y&&(a.axisY.logarithmic?0r&&(r=1/r),d.minDiff>r&&1!==r&&(d.minDiff=r)):(r=e-q.dataPoints[n-1].y,0>r&&(r*=-1),d.minDiff>r&&0!==r&&(d.minDiff=r)))}if(ct&&!B)B=!0;else if(c>t&&B)continue;q.dataPoints[n].label&&(a.axisX.labels[c]=q.dataPoints[n].label);cb.viewPortMax&&(b.viewPortMax=c);null===q.dataPoints[n].y?b.viewPortMin===c&&kd.max&&(d.max=a),nb.viewPortMax||(ad.viewPortMax&& -(d.viewPortMax=a)));for(n in l)l.hasOwnProperty(n)&&!isNaN(n)&&(a=l[n],ad.max&&(d.max=Math.max(a,h)),nb.viewPortMax||(ad.viewPortMax&&(d.viewPortMax=Math.max(a,h))))}};p.prototype._processStacked100PlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=!1,l=!1,w=[],h=0;hb.max&&(b.max=c);if(0t&&(t=1/t);b.minDiff>t&&1!==t&&(b.minDiff=t)}else t=c-s.dataPoints[q-1].x,0>t&&(t*=-1),b.minDiff>t&&0!==t&&(b.minDiff=t);u(e)||null===s.dataPoints[q-1].y||(a.axisY.logarithmic?0t&&(t=1/t),d.minDiff>t&&1!==t&&(d.minDiff=t)):(t=e-s.dataPoints[q-1].y,0>t&&(t*=-1),d.minDiff>t&&0!==t&&(d.minDiff=t)))}if(cr&&!f)f=!0;else if(c>r&&f)continue;s.dataPoints[q].label&&(a.axisX.labels[c]=s.dataPoints[q].label); -cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&Be&&(l=!0),w[c]=w[c]?w[c]+Math.abs(e):Math.abs(e))}}s.axisX.valueType=s.xValueType=g?"dateTime":"number"}a.axisY.logarithmic?(d.max=u(d.viewPortMax)?99*Math.pow(a.axisY.logarithmBase,-0.05):Math.max(d.viewPortMax,99*Math.pow(a.axisY.logarithmBase,-0.05)),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&!l?(d.max=u(d.viewPortMax)? -99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&l?(d.max=u(d.viewPortMax)?99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99)):!m&&l&&(d.max=u(d.viewPortMax)?-1:Math.max(d.viewPortMax,-1),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99));d.viewPortMin=d.min;d.viewPortMax=d.max;a.dataPointYSums=w}};p.prototype._processMultiYPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo, -b=a.axisX.dataInfo,c,e,g,m,l=!1,w=0;wb.max&&(b.max=c);gd.max&&(d.max=m);0B&&(B=1/B),b.minDiff>B&&1!==B&&(b.minDiff=B)):(B=c-h.dataPoints[s-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B)),e&&(null!==e[0]&&h.dataPoints[s-1].y&&null!==h.dataPoints[s-1].y[0])&&(a.axisY.logarithmic?(B=e[0]/ -h.dataPoints[s-1].y[0],1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e[0]-h.dataPoints[s-1].y[0],0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B))));if(!(ct&&!n)n=!0;else if(c>t&&n)continue;h.dataPoints[s].label&&(a.axisX.labels[c]=h.dataPoints[s].label);cb.viewPortMax&&(b.viewPortMax=c);if(b.viewPortMin===c&&e)for(p=0;pd.viewPortMax&&(d.viewPortMax=m))}}h.axisX.valueType=h.xValueType=l?"dateTime":"number"}};p.prototype._processSpecificPlotUnit=function(a){if("waterfall"===a.type&&a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c),l.dataPointEOs[w].cumulativeSumd.max&&(d.max=l.dataPointEOs[w].cumulativeSum),0q&&(q=1/q),b.minDiff>q&&1!==q&&(b.minDiff=q)):(q=c-l.dataPoints[w-1].x,0>q&&(q*=-1),b.minDiff>q&&0!==q&&(b.minDiff=q)),null!==e&&null!==l.dataPoints[w- -1].y&&(a.axisY.logarithmic?(e=l.dataPointEOs[w].cumulativeSum/l.dataPointEOs[w-1].cumulativeSum,1>e&&(e=1/e),d.minDiff>e&&1!==e&&(d.minDiff=e)):(e=l.dataPointEOs[w].cumulativeSum-l.dataPointEOs[w-1].cumulativeSum,0>e&&(e*=-1),d.minDiff>e&&0!==e&&(d.minDiff=e)))),!(cf&&!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);0d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w-1].cumulativeSum));l.dataPointEOs[w].cumulativeSumd.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w].cumulativeSum)}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype.calculateAutoBreaks=function(){function a(a,c,b,e){if(e)return b= -Math.pow(Math.min(b*a/c,c/a),0.2),1>=b&&(b=Math.pow(1>a?1/a:Math.min(c/a,a),0.25)),{startValue:a*b,endValue:c/b};b=0.2*Math.min(b-c+a,c-a);0>=b&&(b=0.25*Math.min(c-a,Math.abs(a)));return{startValue:a+b,endValue:c-b}}function d(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){var c=a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<=a.axisX.scaleBreaks.maxNumberOfAutoBreaks,b=a.axisY.scaleBreaks&&a.axisY.scaleBreaks.autoCalculate&&1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks;if(c|| -b)for(var d=a.axisY.dataInfo,f=a.axisX.dataInfo,g,h=f.min,l=f.max,m=d.min,n=d.max,f=f._dataRanges,d=d._dataRanges,q,w=0,s=0;sk.dataPoints.length))for(w=0;wf[q].max&&(f[q].max=g)),b){var r= -(n+1-m)*Math.max(parseFloat(a.axisY.scaleBreaks.collapsibleThreshold)||10,10)/100;if((g="waterfall"===a.type?k.dataPointEOs[w].cumulativeSum:k.dataPoints[w].y)&&g.length)for(var p=0;pd[q].max&&(d[q].max=g[p]);else u(g)||(q=Math.floor((g-m)/r),gd[q].max&&(d[q].max=g))}}}}function b(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)&&a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<= -a.axisX.scaleBreaks.maxNumberOfAutoBreaks)for(var c=a.axisX.dataInfo,b=c.min,d=c.max,f=c._dataRanges,g,h=0,l=0;lm.dataPoints.length))for(h=0;hf[g].max&&(f[g].max=c)}}for(var c,e=this,g=!1,m=0;m< -this._axes.length;m++)if(this._axes[m].scaleBreaks&&this._axes[m].scaleBreaks.autoCalculate&&1<=this._axes[m].scaleBreaks.maxNumberOfAutoBreaks){g=!0;this._axes[m].dataInfo._dataRanges=[];for(var l=0;l<100/Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10);l++)this._axes[m].dataInfo._dataRanges.push({min:Infinity,max:-Infinity})}if(g){for(m=0;ms[f].max&&(s[f].max=q)}delete this._axes[m].dataInfo.dataPointYPositiveSums}if(this._axes[m].dataInfo.dataPointYNegativeSums){n= -this._axes[m].dataInfo.dataPointYNegativeSums;s=h;for(l in n)n.hasOwnProperty(l)&&!isNaN(l)&&(q=-1*n[l],u(q)||(f=Math.floor((q-w)/c),qs[f].max&&(s[f].max=q)));delete this._axes[m].dataInfo.dataPointYNegativeSums}for(l=0;lc&&g.push({diff:q,start:s,end:w});break}else l++;if(this._axes[m].scaleBreaks.customBreaks)for(l=0;l=e.x1&&(a<=e.x2&&d>=e.y1&&d<=e.y2)&&(c=e.id)}return c};p.prototype.getAutoFontSize=lb;p.prototype.resetOverlayedCanvas=function(){this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height)};p.prototype.clearCanvas=kb;p.prototype.attachEvent=function(a){this._events.push(a)};p.prototype._touchEventHandler=function(a){if(a.changedTouches&&this.interactivityEnabled){var d=[],b=a.changedTouches,c=b?b[0]:a,e=null;switch(a.type){case "touchstart":case "MSPointerDown":d=["mousemove","mousedown"];this._lastTouchData= -Ra(c);this._lastTouchData.time=new Date;break;case "touchmove":case "MSPointerMove":d=["mousemove"];break;case "touchend":case "MSPointerUp":var g=this._lastTouchData&&this._lastTouchData.time?new Date-this._lastTouchData.time:0,d="touchstart"===this._lastTouchEventType||"MSPointerDown"===this._lastTouchEventType||300>g?["mouseup","click"]:["mouseup"];break;default:return}if(!(b&&1g)this._lastTouchData.scroll=!0}catch(l){}this._lastTouchEventType=a.type;if(this._lastTouchData.scroll&&this.zoomEnabled)this.isDrag&&this.resetOverlayedCanvas(),this.isDrag=!1;else for(b=0;b=e.x1&&d.x<=e.x2&&d.y>=e.y1&&d.y<=e.y2){c[b].call(c.context,d.x,d.y);"mousedown"===b&&!0===c.capture?(p.capturedEventParam=c,this.overlaidCanvas.setCapture?this.overlaidCanvas.setCapture():document.documentElement.addEventListener("mouseup", -this._mouseEventHandler,!1)):"mouseup"===b&&(c.chart.overlaidCanvas.releaseCapture?c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",this._mouseEventHandler,!1));break}else c=null;a.target.style.cursor=c&&c.cursor?c.cursor:this._defaultCursor}b=this.plotArea;if(d.xb.x2||d.yb.y2)this.toolTip&&this.toolTip.enabled?this.toolTip.hide():this.resetOverlayedCanvas();this.isDrag&&this.zoomEnabled||!this._eventManager||this._eventManager.mouseEventHandler(a)}}; -p.prototype._plotAreaMouseDown=function(a,d){this.isDrag=!0;this.dragStartPoint={x:a,y:d}};p.prototype._plotAreaMouseUp=function(a,d){if(("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)&&this.isDrag){var b=d-this.dragStartPoint.y,c=a-this.dragStartPoint.x,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=!1;this.resetOverlayedCanvas();if("xySwapped"===this.plotInfo.axisPlacement)var l=g,g=e,e=l;if(this.panEnabled||this.zoomEnabled){if(this.panEnabled)for(e= -g=0;eb.maximum&&(g=b.viewportMaximum/b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum/g,b.sessionVariables.newViewportMaximum=b.viewportMaximum/g,m=!0):b.viewportMinimumb.maximum&&(g=b.viewportMaximum-b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum-g,b.sessionVariables.newViewportMaximum=b.viewportMaximum-g,m=!0);else if((!e||2Math.abs(b)&&(this.panEnabled||this.zoomEnabled)?this.toolTip.hide():this.panEnabled||this.zoomEnabled||this.toolTip.mouseMoveHandler(a, -d);if((!e||2f)var B=f,f=n,n=B;if(q.scaleBreaks)for(B=0;!g&&B=f;if(isFinite(q.dataInfo.minDiff))if(B=q.getApparentDifference(n,f,null,!0),!(g||!(this.panEnabled&&q.scaleBreaks&&q.scaleBreaks._appliedBreaks.length)&&(q.logarithmic&&Bq.maximum))w.push(q),s.push({val1:n,val2:f}),l=!0;else if(!e){l=!1;break}}return{isValid:l,axesWithValidRange:w,axesRanges:s}};p.prototype.preparePlotArea=function(){var a=this.plotArea;!r&&(0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2;a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2;a.width=a.x2-a.x1;a.height=a.y2-a.y1}this.axisY2&&0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2,a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2,a.width=a.x2-a.x1,a.height=a.y2-a.y1)}else d= -this.layoutManager.getFreeSpace(),a.x1=d.x1,a.x2=d.x2,a.y1=d.y1,a.y2=d.y2,a.width=d.width,a.height=d.height;r||(a.canvas.width=a.width,a.canvas.height=a.height,a.canvas.style.left=a.x1+"px",a.canvas.style.top=a.y1+"px",(0b.x2||h.point.yb.y2+1)continue}else if("rangearea"===s||"rangesplinearea"===s){if(h.dataPoint.xy.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("bubble")||0<=s.indexOf("scatter")){if(h.dataPoint.xy.viewportMaximum|| -h.dataPoint.yA.viewportMaximum)continue}else if(0<=s.indexOf("column")||"waterfall"===s||"error"===s&&!h.axisSwapped){if(h.dataPoint.xy.viewportMaximum||h.bounds.y1>b.y2||h.bounds.y2y.viewportMaximum||h.bounds.x1>b.x2||h.bounds.x2 -y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(h.dataPoint.xy.viewportMaximum)continue;e=m=2;"horizontal"===C?(l=f.width,w=f.height):(w=f.width,l=f.height);if("normal"===this.plotInfo.axisPlacement){if(0<=s.indexOf("line")||0<=s.indexOf("area"))t="auto",m=4;else if(0<=s.indexOf("stacked"))"auto"===t&&(t="inside");else if("bubble"===s||"scatter"===s)t="inside";q=h.point.x- -l/2;"inside"!==t?(e=b.y1,g=b.y2,0h.point.y)):(n=h.point.y+m+c,n>g-w-m-c&&(n="auto"===t?Math.min(h.point.y,g)-w-m-c:g-w-m-c,v=ng-w-m&&("bubble"===s||"scatter"===s)&&(n=Math.min(h.point.y+m,b.y2-w-m))),n=Math.min(n,g-w))}else 0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("scatter")?(t="auto",e=4):0<=s.indexOf("stacked")?"auto"===t&&(t="inside"):"bubble"===s&&(t="inside"),n=h.point.y-w/2,"inside"!==t?(m=b.x1,g=b.x2,0>ma?(q=h.point.x-l-e-c,qh.point.x)):(q=h.point.x+e+c,q>g-l-e-c&&(q="auto"=== -t?Math.min(h.point.x,g)-l-e-c:g-l-e-c,v=qma?Math.max(h.bounds.x1,b.x1)+l/2+e:Math.min(h.bounds.x2,b.x2)-l/2-e:(Math.max(h.bounds.x1,b.x1)+Math.min(h.bounds.x2,b.x2))/2,q=0>ma?Math.max(h.point.x,c)-l/2:Math.min(h.point.x,c)-l/2,q=Math.max(q,m));"vertical"===C&&(n+=w);f.x=q;f.y=n;f.render(!0);p&&("inside"!==t&&(0>s.indexOf("bar")&&("error"!==s||!h.axisSwapped)&&h.point.x>b.x1&&h.point.xs.indexOf("column")&&("error"!==s||h.axisSwapped)&&h.point.y>b.y1&&h.point.y=a.dataSeriesIndexes.length)){var c= -this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& -b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepLine=function(a){var d=a.targetCanvasCtx|| -this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&& -(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation, -easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderSpline=function(a){function d(a){a=v(a,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx;c.save();var g=this.plotArea;c.beginPath(); -c.rect(g.x1,g.y1,g.width,g.height);c.clip();for(var m=[],l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[p].y)0s[p].y===a.axisY.reversed?1:-1,color:B});u=!1}d(x)}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas, -0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(g.x1,g.y1,g.width,g.height),e.beginPath());c.restore();c.beginPath();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, -animationBase:0}}};p.prototype.renderColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width, -0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.dataPointWidth=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){m=a.axisX.convertValueToPixel(w);l=a.axisY.convertValueToPixel(B[g].y);m=a.axisX.reversed?m+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:m-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var k=a.axisX.reversed?m-q<<0:m+q<<0,t;0<=B[g].y?t=h:(t=l,l=h);l>t&&(c=l,l=t,t=c);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,l,k,t,c,0,null,p&&0<=B[g].y, -0>B[g].y&&p,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:m,y1:l,x2:k,y2:t};c=N(c);r&&ea(this._eventManager.ghostCtx,m,l,k,t,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"column",dataPoint:B[g],dataSeries:f,point:{x:m+(k-m)/2,y:0>B[g].y===a.axisY.reversed?l:t},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:m, -y1:Math.min(l,t),x2:k,y2:Math.max(l,t)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore(); -return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.y2?a.axisY.bounds.y2:h}}};p.prototype.renderStackedColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth? -this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? -this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q="undefined"!==typeof m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;g[c]=A+(y-q)}else A=m[c]?m[c]:0,y=q+A,q=n+A,m[c]=A+(y-q);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1, -!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedColumn",dataPoint:t[h],dataSeries:p,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q, -y)},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx, -animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderStackedColumn100=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth: -this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? -this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);q=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;q=a.axisY.convertValueToPixel(l[c]);y=g[c]?g[c]:n;g[c]=q}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=q+("undefined"!==typeof w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q=m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(q),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y1-q)&&(q=e.y1);g[c]=A+(y-q)}else A="undefined"!==typeof m[c]? -m[c]:0,y=q+A,q=n+A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y2-y)&&(y=e.y2),m[c]=A+(y-q);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&& -this._indexLabels.push({chartType:"stackedColumn100",dataPoint:t[h],dataSeries:k,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q,y)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&& -this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= -null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.options.dataPointWidth? -this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height); -b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){l=a.axisX.convertValueToPixel(w); -m=a.axisY.convertValueToPixel(B[g].y);l=a.axisX.reversed?l+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:l-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var p=a.axisX.reversed?l-q<<0:l+q<<0,t;0<=B[g].y?t=h:(t=m,m=h);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,t,l,m,p,c,0,null,k,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:t,y1:l,x2:m,y2:p};c= -N(c);r&&ea(this._eventManager.ghostCtx,t,l,m,p,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"bar",dataPoint:B[g],dataSeries:f,point:{x:0<=B[g].y?m:t,y:l+(p-l)/2},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(t,m),y1:l,x2:Math.max(t,m),y2:p},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas, -0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.x2?a.axisY.bounds.x2: -h}}};p.prototype.renderStackedBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<< -0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),s=m[c]? -m[c]:n,m[c]=y=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A=g[c]?g[c]:0;y=n+A;s+=A;g[c]=A+(s-y)}else A=m[c]?m[c]:0,y=s-A,s=n-A,m[c]=A+(s-y);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,y,x,s,v,c,0,null,u,!1,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:y,y1:x,x2:s,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,y,x,s,v,c,0,null,!1,!1,!1, -!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar",dataPoint:t[h],dataSeries:k,point:{x:0<=t[h].y?s:y,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(y,s),y1:x,x2:Math.max(y,s),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& -b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderStackedBar100=function(a){var d= -a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)|| -(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save(); -b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&& -"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x;x=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var v=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,y=v+f<<0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;x=g[c]?g[c]:n;g[c]=s=a.axisY.convertValueToPixel(l[c])}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=x+(w[c]?w[c]:0),s=m[c]?m[c]: -n,m[c]=x=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(x),0<=t[h].y){var A=g[c]?g[c]:0;x=n+A;s+=A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x2-s)&&(s=e.x2);g[c]=A+(s-x)}else A=m[c]?m[c]:0,x=s-A,s=n-A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x1-x)&&(x=e.x1),m[c]=A+(s-x);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,v,s,y,c,0,null,u,!1,!1,!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k, -dataPointIndex:h,x1:x,y1:v,x2:s,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,v,s,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar100",dataPoint:t[h],dataSeries:p,point:{x:0<=t[h].y?s:x,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(x,s),y1:v,x2:Math.max(x,s),y2:y},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop", -a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!da)))if("number"!==typeof p[k].y)B.connectNullData||(da||d)||c(),da=!0;else{t=a.axisX.convertValueToPixel(x);u=a.axisY.convertValueToPixel(p[k].y);d||da?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||b===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d=t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,b=B.nullDataLineDashType,g.setLineDash(Y)),g.lineTo(t,u),r&&m.lineTo(t, -u)):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),da=d=!1):(g.lineTo(t,u),r&&m.lineTo(t,u),0==k%250&&c());q={x:t,y:u};kp[k].y===a.axisY.reversed?1:-1,color:z})}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas, -0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, -animationBase:0}}};p.prototype.renderSplineArea=function(a){function d(){var b=v(x,2);if(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum? -t=p:0>a.axisY.viewportMaximum?t=m.y1:0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=a.axisX.lineCoordinates,m=a.axisY.lineCoordinates,l=[],w=this.plotArea;c.save();r&& -e.save();c.beginPath();c.rect(w.x1,w.y1,w.width,w.height);c.clip();r&&(e.beginPath(),e.rect(w.x1,w.y1,w.width,w.height),e.clip());for(var h=0;ha.axisX.dataInfo.viewPortMax&&(!q.connectNullData||!k)))if("number"!==typeof n[f].y)0n[f].y===a.axisY.reversed?1:-1,color:ma});k=!1}d();ia.drawMarkers(l)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(w.x1,w.y1,w.width,w.height), -this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!b))){var Z=u;"number"!==typeof k[p].y?(B.connectNullData||(b||d)||c(),b=!0):(t=a.axisX.convertValueToPixel(x),u=a.axisY.convertValueToPixel(k[p].y),d||b?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||Y===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d= -t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,Y=B.nullDataLineDashType,g.setLineDash(ca)),g.lineTo(t,Z),g.lineTo(t,u),r&&(m.lineTo(t,Z),m.lineTo(t,u))):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),b=d=!1):(g.lineTo(t,Z),r&&m.lineTo(t,Z),g.lineTo(t,u),r&&m.lineTo(t,u),0==p%250&&c()),q={x:t,y:u},pk[p].y===a.axisY.reversed?1:-1,color:z}))}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, -0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea=function(a){function d(){if(!(1>h.length)){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=[],l=this.plotArea,w=[],h=[],s=[],q=[],n=0,f,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),u=this._eventManager.ghostCtx,t,C,x;r&&u.beginPath();c.save();r&&u.save();c.beginPath();c.rect(l.x1,l.y1,l.width,l.height);c.clip();r&&(u.beginPath(),u.rect(l.x1,l.y1,l.width,l.height),u.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData||!da)))if("number"!==typeof Z.y)A.connectNullData||(da||C)||d(),da=!0;else{f=a.axisX.convertValueToPixel(g);var oa= -w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(Z.y),k-=oa;h.push({x:f,y:p-oa});w[g]=p-k;C||da?(!C&&A.connectNullData?(c.setLineDash&&(A.options.nullDataLineDashType||x===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(C=h.pop(),x=h[h.length-1],d(),c.moveTo(t.x,t.y),h.push(x),h.push(C),x=A.nullDataLineDashType, -c.setLineDash(Y)),c.lineTo(f,k),r&&u.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(u.beginPath(),u.moveTo(f,k))),da=C=!1):(c.lineTo(f,k),r&&u.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&u.moveTo(f,k),h.push({x:f,y:p-oa})));t={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&u.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& -c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(l.x1,l.y1,l.width,l.height),u.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea100=function(a){function d(){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=[],w=[],h=[],s=[],q=[],n=0,f,k,p,u,t,C=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),x=this._eventManager.ghostCtx;c.save();r&&x.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(x.beginPath(), -x.rect(m.x1,m.y1,m.width,m.height),x.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData|| -!da)))if("number"!==typeof Z.y)A.connectNullData||(da||u)||d(),da=!0;else{var oa;oa=0!==a.dataPointYSums[g]?100*(Z.y/a.dataPointYSums[g]):0;f=a.axisX.convertValueToPixel(g);var la=w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(oa),k-=la;h.push({x:f,y:C-la});w[g]=C-k;u||da?(!u&&A.connectNullData?(c.setLineDash&& -(A.options.nullDataLineDashType||t===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(u=h.pop(),t=h[h.length-1],d(),c.moveTo(p.x,p.y),h.push(t),h.push(u),t=A.nullDataLineDashType,c.setLineDash(Y)),c.lineTo(f,k),r&&x.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(x.beginPath(),x.moveTo(f,k))),da=u=!1):(c.lineTo(f,k),r&&x.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&x.moveTo(f,k),h.push({x:f,y:C-la})));p={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&x.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(l);r&&(b.drawImage(this._preRenderCanvas,0, -0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),x.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}}; -p.prototype.renderBubble=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=-Infinity,w=Infinity,h=0;ha.axisX.dataInfo.viewPortMax||"undefined"===typeof n[e].z||(f=n[e].z,f>l&&(l=f),fa.axisX.dataInfo.viewPortMax)&&"number"===typeof n[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(n[e].y);var f=n[e].z,u=2*Math.max(Math.sqrt((l===w?p/2:k+(p-k)/(l-w)*(f-w))/Math.PI)<<0,1),f=q.getMarkerProperties(e,b);f.size=u;b.globalAlpha=q.fillOpacity;ia.drawMarker(g,m,b,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;var t=q.dataPointIds[e];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:s, -dataPointIndex:e,x1:g,y1:m,size:u};u=N(t);r&&ia.drawMarker(g,m,this._eventManager.ghostCtx,f.type,f.size,u,u,f.borderThickness);(n[e].indexLabel||q.indexLabel||n[e].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"bubble",dataPoint:n[e],dataSeries:q,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/2,x2:g+f.size/2,y2:m+f.size/2},color:null})}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& -b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderScatter=function(a){var d= -a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=0;la.axisX.dataInfo.viewPortMax)&&"number"===typeof s[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(s[e].y);var f=h.getMarkerProperties(e,g,m,b);b.globalAlpha=h.fillOpacity;ia.drawMarker(f.x,f.y,f.ctx,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;Math.sqrt((q-g)*(q-g)+(n-m)*(n-m))Math.min(this.plotArea.width,this.plotArea.height)||(q=h.dataPointIds[e],this._eventManager.objectMap[q]={id:q,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:e,x1:g,y1:m},q=N(q),r&&ia.drawMarker(f.x,f.y,this._eventManager.ghostCtx,f.type,f.size,q,q,f.borderThickness),(s[e].indexLabel||h.indexLabel||s[e].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"scatter",dataPoint:s[e],dataSeries:h,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/ -2,x2:g+f.size/2,y2:m+f.size/2},color:null}),q=g,n=m)}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore()); -b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderCandlestick=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=0,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,g=this.options.dataPointMaxWidth? -this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*m.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&&e>g&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,g));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&gg&&(k=g);b.save();r&&c.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(c.beginPath(),c.rect(m.x1,m.y1,m.width,m.height),c.clip());for(var p=0;pa.axisX.dataInfo.viewPortMax)&&!u(C[l].y)&&C[l].y.length&& -"number"===typeof C[l].y[0]&&"number"===typeof C[l].y[1]&&"number"===typeof C[l].y[2]&&"number"===typeof C[l].y[3]){w=a.axisX.convertValueToPixel(f);h=a.axisY.convertValueToPixel(C[l].y[0]);s=a.axisY.convertValueToPixel(C[l].y[1]);q=a.axisY.convertValueToPixel(C[l].y[2]);n=a.axisY.convertValueToPixel(C[l].y[3]);var z=w-k/2<<0,y=z+k<<0,g=t.options.fallingColor?t.fallingColor:t._colorSet[0],e=C[l].color?C[l].color:t._colorSet[0],A=Math.round(Math.max(1,0.15*k)),D=0===A%2?0:0.5,aa=t.dataPointIds[l]; -this._eventManager.objectMap[aa]={id:aa,objectType:"dataPoint",dataSeriesIndex:v,dataPointIndex:l,x1:z,y1:h,x2:y,y2:s,x3:w,y3:q,x4:w,y4:n,borderThickness:A,color:e};b.strokeStyle=e;b.beginPath();b.lineWidth=A;c.lineWidth=Math.max(A,4);"candlestick"===t.type?(b.moveTo(w-D,s),b.lineTo(w-D,Math.min(h,n)),b.stroke(),b.moveTo(w-D,Math.max(h,n)),b.lineTo(w-D,q),b.stroke(),ea(b,z,Math.min(h,n),y,Math.max(h,n),C[l].y[0]<=C[l].y[3]?t.risingColor:g,A,e,x,x,!1,!1,t.fillOpacity),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w- -D,s),c.lineTo(w-D,Math.min(h,n)),c.stroke(),c.moveTo(w-D,Math.max(h,n)),c.lineTo(w-D,q),c.stroke(),ea(c,z,Math.min(h,n),y,Math.max(h,n),e,0,null,!1,!1,!1,!1))):"ohlc"===t.type&&(b.moveTo(w-D,s),b.lineTo(w-D,q),b.stroke(),b.beginPath(),b.moveTo(w,h),b.lineTo(z,h),b.stroke(),b.beginPath(),b.moveTo(w,n),b.lineTo(y,n),b.stroke(),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w-D,s),c.lineTo(w-D,q),c.stroke(),c.beginPath(),c.moveTo(w,h),c.lineTo(z,h),c.stroke(),c.beginPath(),c.moveTo(w,n),c.lineTo(y,n),c.stroke())); -(C[l].indexLabel||t.indexLabel||C[l].indexLabelFormatter||t.indexLabelFormatter)&&this._indexLabels.push({chartType:t.type,dataPoint:C[l],dataSeries:t,point:{x:z+(y-z)/2,y:a.axisY.reversed?q:s},direction:1,bounds:{x1:z,y1:Math.min(s,q),x2:y,y2:Math.max(s,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas, -0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderBoxAndWhisker=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e= -null,g=this.plotArea,m=0,l,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*g.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&& -e>m&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(k=m);b.save();r&&c.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(c.beginPath(),c.rect(g.x1,g.y1,g.width,g.height),c.clip());for(var p=!1,p=!!a.axisY.reversed,v=0;va.axisX.dataInfo.viewPortMax)&&!u(x[m].y)&&x[m].y.length&&"number"===typeof x[m].y[0]&&"number"===typeof x[m].y[1]&&"number"===typeof x[m].y[2]&&"number"===typeof x[m].y[3]&&"number"===typeof x[m].y[4]&&5===x[m].y.length){l=a.axisX.convertValueToPixel(f);w=a.axisY.convertValueToPixel(x[m].y[0]);h=a.axisY.convertValueToPixel(x[m].y[1]);s=a.axisY.convertValueToPixel(x[m].y[2]); -q=a.axisY.convertValueToPixel(x[m].y[3]);n=a.axisY.convertValueToPixel(x[m].y[4]);var y=l-k/2<<0,A=l+k/2<<0,e=x[m].color?x[m].color:C._colorSet[0],D=Math.round(Math.max(1,0.15*k)),aa=0===D%2?0:0.5,T=x[m].whiskerColor?x[m].whiskerColor:x[m].color?C.whiskerColor?C.whiskerColor:x[m].color:C.whiskerColor?C.whiskerColor:e,Y="number"===typeof x[m].whiskerThickness?x[m].whiskerThickness:"number"===typeof C.options.whiskerThickness?C.whiskerThickness:D,ca=x[m].whiskerDashType?x[m].whiskerDashType:C.whiskerDashType, -da=u(x[m].whiskerLength)?u(C.options.whiskerLength)?k:C.whiskerLength:x[m].whiskerLength,da="number"===typeof da?0>=da?0:da>=k?k:da:"string"===typeof da?parseInt(da)*k/100>k?k:parseInt(da)*k/100:k,Z=1===Math.round(Y)%2?0.5:0,oa=x[m].stemColor?x[m].stemColor:x[m].color?C.stemColor?C.stemColor:x[m].color:C.stemColor?C.stemColor:e,la="number"===typeof x[m].stemThickness?x[m].stemThickness:"number"===typeof C.options.stemThickness?C.stemThickness:D,G=1===Math.round(la)%2?0.5:0,F=x[m].stemDashType?x[m].stemDashType: -C.stemDashType,E=x[m].lineColor?x[m].lineColor:x[m].color?C.lineColor?C.lineColor:x[m].color:C.lineColor?C.lineColor:e,H="number"===typeof x[m].lineThickness?x[m].lineThickness:"number"===typeof C.options.lineThickness?C.lineThickness:D,I=x[m].lineDashType?x[m].lineDashType:C.lineDashType,K=1===Math.round(H)%2?0.5:0,L=C.upperBoxColor,O=C.lowerBoxColor,Q=u(C.options.fillOpacity)?1:C.fillOpacity,P=C.dataPointIds[m];this._eventManager.objectMap[P]={id:P,objectType:"dataPoint",dataSeriesIndex:t,dataPointIndex:m, -x1:y,y1:w,x2:A,y2:h,x3:l,y3:s,x4:l,y4:q,y5:n,borderThickness:D,color:e,stemThickness:la,stemColor:oa,whiskerThickness:Y,whiskerLength:da,whiskerColor:T,lineThickness:H,lineColor:E};b.save();0=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth: -1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.03*this.width;var h=a.axisX.dataInfo.minDiff;isFinite(h)||(h=0.3*Math.abs(a.axisX.range));h=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(h)/Math.log(a.axisX.range):Math.abs(h)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&& -(this.dataPointMinWidth&&mm&&(h=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var s=0;sa.axisX.dataInfo.viewPortMax)&&!u(f[g].y)&&f[g].y.length&&"number"===typeof f[g].y[0]&&"number"===typeof f[g].y[1]){c=a.axisX.convertValueToPixel(w);m=a.axisY.convertValueToPixel(f[g].y[0]);l=a.axisY.convertValueToPixel(f[g].y[1]);var p=a.axisX.reversed?c+a.plotType.totalDataSeries*h/2-(a.previousDataSeriesCount+s)*h<<0:c-a.plotType.totalDataSeries*h/2+(a.previousDataSeriesCount+ -s)*h<<0,v=a.axisX.reversed?p-h<<0:p+h<<0,c=f[g].color?f[g].color:n._colorSet[g%n._colorSet.length];if(m>l){var t=m;m=l;l=t}t=n.dataPointIds[g];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:q,dataPointIndex:g,x1:p,y1:m,x2:v,y2:l};ea(b,p,m,v,l,c,0,c,k,k,!1,!1,n.fillOpacity);c=N(t);r&&ea(this._eventManager.ghostCtx,p,m,v,l,c,0,null,!1,!1,!1,!1);if(f[g].indexLabel||n.indexLabel||f[g].indexLabelFormatter||n.indexLabelFormatter)this._indexLabels.push({chartType:"rangeColumn", -dataPoint:f[g],dataSeries:n,indexKeyword:0,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?l:m},direction:f[g].y[1]>=f[g].y[0]?-1:1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c}),this._indexLabels.push({chartType:"rangeColumn",dataPoint:f[g],dataSeries:n,indexKeyword:1,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?m:l},direction:f[g].y[1]>=f[g].y[0]?1:-1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation= -"source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderError= -function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=a.axisY._position?"left"===a.axisY._position||"right"===a.axisY._position?!1:!0:!1;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=!1,m=this.plotArea,l=0,w,h,s,q,n,f,k,p=a.axisX.dataInfo.minDiff;isFinite(p)||(p=0.3*Math.abs(a.axisX.range));b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(m.x1, -m.y1,m.width,m.height),this._eventManager.ghostCtx.clip());for(var v=0,t=0;tl&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,l));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ll&&(t=l);if(0=T.length?0:T.length>=t?t:T.length:"string"===typeof T.length?parseInt(T.length)*t/100>t?t:parseInt(T.length)*t/100>t:t;T.thickness="number"===typeof T.thickness?0>T.thickness?0:Math.round(T.thickness):2;var Y={color:y[l].stemColor?y[l].stemColor:y[l].color?z.stemColor?z.stemColor:y[l].color:z.stemColor?z.stemColor:e,thickness:y[l].stemThickness?y[l].stemThickness:z.stemThickness,dashType:y[l].stemDashType? -y[l].stemDashType:z.stemDashType};Y.thickness="number"===typeof Y.thickness?0>Y.thickness?0:Math.round(Y.thickness):2;y[l].getTime?k=y[l].x.getTime():k=y[l].x;if(!(ka.axisX.dataInfo.viewPortMax)&&!u(y[l].y)&&y[l].y.length&&"number"===typeof y[l].y[0]&&"number"===typeof y[l].y[1]){var ca=a.axisX.convertValueToPixel(k);c?h=ca:w=ca;ca=a.axisY.convertValueToPixel(y[l].y[0]);c?s=ca:n=ca;ca=a.axisY.convertValueToPixel(y[l].y[1]);c?q=ca:f=ca;c?(n=a.axisX.reversed?h+(A?v: -1)*t/2-(A?D-1:0)*t<<0:h-(A?v:1)*t/2+(A?D-1:0)*t<<0,f=a.axisX.reversed?n-t<<0:n+t<<0):(s=a.axisX.reversed?w+(A?v:1)*t/2-(A?D-1:0)*t<<0:w-(A?v:1)*t/2+(A?D-1:0)*t<<0,q=a.axisX.reversed?s-t<<0:s+t<<0);!c&&n>f&&(ca=n,n=f,f=ca);c&&s>q&&(ca=s,s=q,q=ca);ca=z.dataPointIds[l];this._eventManager.objectMap[ca]={id:ca,objectType:"dataPoint",dataSeriesIndex:x,dataPointIndex:l,x1:Math.min(s,q),y1:Math.min(n,f),x2:Math.max(q,s),y2:Math.max(f,n),isXYSwapped:c,stemProperties:Y,whiskerProperties:T};E(b,Math.min(s,q), -Math.min(n,f),Math.max(q,s),Math.max(f,n),e,T,Y,c);r&&E(this._eventManager.ghostCtx,s,n,q,f,e,T,Y,c);if(y[l].indexLabel||z.indexLabel||y[l].indexLabelFormatter||z.indexLabelFormatter)this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:0,point:{x:c?y[l].y[1]>=y[l].y[0]?s:q:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?f:n},direction:y[l].y[1]>=y[l].y[0]?-1:1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c}), -this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:1,point:{x:c?y[l].y[1]>=y[l].y[0]?q:s:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?n:f},direction:y[l].y[1]>=y[l].y[0]?1:-1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height), -a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx: -d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0;var s=a.axisX.dataInfo.minDiff;isFinite(s)||(s=0.3*Math.abs(a.axisX.range));s=this.options.dataPointWidth?this.dataPointWidth:0.9* -(e.height*(a.axisX.logarithmic?Math.log(s)/Math.log(a.axisX.range):Math.abs(s)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(s=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(), -this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var q=0;qa.axisX.dataInfo.viewPortMax)&&!u(k[g].y)&&k[g].y.length&&"number"===typeof k[g].y[0]&&"number"===typeof k[g].y[1]){m=a.axisY.convertValueToPixel(k[g].y[0]); -l=a.axisY.convertValueToPixel(k[g].y[1]);w=a.axisX.convertValueToPixel(h);w=a.axisX.reversed?w+a.plotType.totalDataSeries*s/2-(a.previousDataSeriesCount+q)*s<<0:w-a.plotType.totalDataSeries*s/2+(a.previousDataSeriesCount+q)*s<<0;var v=a.axisX.reversed?w-s<<0:w+s<<0;m>l&&(c=m,m=l,l=c);c=k[g].color?k[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,w,l,v,c,0,null,p,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g, -x1:m,y1:w,x2:l,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,m,w,l,v,c,0,null,!1,!1,!1,!1);if(k[g].indexLabel||f.indexLabel||k[g].indexLabelFormatter||f.indexLabelFormatter)this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:0,point:{x:k[g].y[1]>=k[g].y[0]?m:l,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?-1:1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c}),this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:1,point:{x:k[g].y[1]>= -k[g].y[0]?l:m,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?1:-1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1, -e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeArea=function(a){function d(){if(C){var a=null;0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width,m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!s.connectNullData||!T)))if(null!==q[f].y&&q[f].y.length&&"number"===typeof q[f].y[0]&&"number"===typeof q[f].y[1]){k=a.axisX.convertValueToPixel(t);p=a.axisY.convertValueToPixel(q[f].y[0]);u=a.axisY.convertValueToPixel(q[f].y[1]);n||T?(s.connectNullData&&!n?(c.setLineDash&&(s.options.nullDataLineDashType||A===s.lineDashType&&s.lineDashType!==s.nullDataLineDashType)&&(w[w.length- -1].newLineDashArray=D,A=s.nullDataLineDashType,c.setLineDash(z)),c.lineTo(k,p),r&&e.lineTo(k,p),w.push({x:k,y:u})):(c.beginPath(),c.moveTo(k,p),C={x:k,y:p},w=[],w.push({x:k,y:u}),r&&(e.beginPath(),e.moveTo(k,p))),T=n=!1):(c.lineTo(k,p),w.push({x:k,y:u}),r&&e.lineTo(k,p),0==f%250&&d());t=s.dataPointIds[f];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:h,dataPointIndex:f,x1:k,y1:p,y2:u};fq[f].y[1]===a.axisY.reversed?-1:1,color:x}),this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:1,point:{x:k, -y:u},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?1:-1,color:x})}else T||n||d(),T=!0;d();ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1, -m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderRangeSplineArea=function(a){function d(a,b){var d=v(u,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width, -m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!f)))if(null!==k[q].y&&k[q].y.length&&"number"===typeof k[q].y[0]&&"number"===typeof k[q].y[1]){n=a.axisX.convertValueToPixel(n);f=a.axisY.convertValueToPixel(k[q].y[0]);p=a.axisY.convertValueToPixel(k[q].y[1]);var E=h.dataPointIds[q];this._eventManager.objectMap[E]={id:E,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:q, -x1:n,y1:f,y2:p};u[u.length]={x:n,y:f};z[z.length]={x:n,y:p};q=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx,e=null,g=this.plotArea,m=0,l,k,h,s,q=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),m=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;k=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width,0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0;var n= -a.axisX.dataInfo.minDiff;isFinite(n)||(n=0.3*Math.abs(a.axisX.range));n=this.options.dataPointWidth?this.dataPointWidth:0.6*(g.width*(a.axisX.logarithmic?Math.log(n)/Math.log(a.axisX.range):Math.abs(n)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&m>k&&(m=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,k));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&kk&&(n=k);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.clip());for(var f=0;fh&&(e=k,k=h,h=e);a.axisY.reversed&&(e=k,k=h,h=e);e=u.dataPointIds[m];this._eventManager.objectMap[e]={id:e,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:m,x1:l,y1:k,x2:F,y2:h}; -var T=v[m].color?v[m].color:0v[m].y===a.axisY.reversed?1:-1,bounds:{x1:l,y1:Math.min(k,h),x2:F,y2:Math.max(k,h)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height), -b.clearRect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};var ja=function(a,d,b,c,e,g,m,l,k){if(!(0>b)){"undefined"===typeof l&&(l=1);if(!r){var h=Number((m%(2*Math.PI)).toFixed(8));Number((g%(2*Math.PI)).toFixed(8))===h&&(m-=1E-4)}a.save();a.globalAlpha=l;"pie"===e?(a.beginPath(),a.moveTo(d.x,d.y),a.arc(d.x,d.y,b,g,m,!1),a.fillStyle=c,a.strokeStyle= -"white",a.lineWidth=2,a.closePath(),a.fill()):"doughnut"===e&&(a.beginPath(),a.arc(d.x,d.y,b,g,m,!1),0<=k&&a.arc(d.x,d.y,k*b,m,g,!0),a.closePath(),a.fillStyle=c,a.strokeStyle="white",a.lineWidth=2,a.fill());a.globalAlpha=1;a.restore()}};p.prototype.renderPie=function(a){function d(){if(h&&s){for(var a=0,b=0,c=0,e=0,d=0;dMath.PI/2-t&&m.midAngle -m.midAngle)c=d;a++}else if(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t){if(0===b||f[e].midAngle>m.midAngle)e=d;b++}m.hemisphere=g>Math.PI/2&&g<=3*Math.PI/2?"left":"right";m.indexLabelTextBlock=new ka(k.plotArea.ctx,{fontSize:m.indexLabelFontSize,fontFamily:m.indexLabelFontFamily,fontColor:m.indexLabelFontColor,fontStyle:m.indexLabelFontStyle,fontWeight:m.indexLabelFontWeight,horizontalAlign:"left",backgroundColor:m.indexLabelBackgroundColor,maxWidth:m.indexLabelMaxWidth,maxHeight:m.indexLabelWrap? -5*m.indexLabelFontSize:1.5*m.indexLabelFontSize,text:m.indexLabelText,padding:0,textBaseline:"top"});m.indexLabelTextBlock.measureText()}l=g=0;q=!1;for(d=0;dMath.PI/2-t&&m.midAngle3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t)&&(l<=b/2&&!q?(m.hemisphere="left",l++):(m.hemisphere="right",q=!0))}}function b(a){var b= -k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);for(b=0;bc){var d=0.07*A*Math.cos(f[b].midAngle),g=0.07*A*Math.sin(f[b].midAngle),m=!1;if(s[b].exploded){if(1E-9a.indexLabelTextBlock.y?d-e:c-f}function e(a){for(var b=null,e=1;ec(f[b],f[a])||("right"===f[a].hemisphere?f[b].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y:f[b].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y)))break;else b=null;return b}function g(a,b,d){d=(d||0)+1;if(1E3< -d)return 0;b=b||0;var m=0,h=x.y-1*r,l=x.y+1*r;if(0<=a&&ab&&n.indexLabelTextBlock.yl)return 0;var k=0,q=0,q=k=k=0;0>b?n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2>h&&n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+bl&&(b=n.indexLabelTextBlock.y+ -n.indexLabelTextBlock.height/2+b-l);b=n.indexLabelTextBlock.y+b;h=0;h="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2));q=x.x+A*Math.cos(n.midAngle);k=x.y+A*Math.sin(n.midAngle);k=Math.sqrt(Math.pow(h-q,2)+Math.pow(b-k,2));q=Math.acos(A/r);k=Math.acos((r*r+A*A-k*k)/(2*A*r));b=kc(f[h],f[a])||("right"===f[a].hemisphere?f[h].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y:f[h].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y)))break;else h=null;q=h;k=e(a);l=h=0;0>b?(l="right"===n.hemisphere?q:k,m=b,null!==l&&(q=-b,b=n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2-(f[l].indexLabelTextBlock.y+f[l].indexLabelTextBlock.height/2),b-q+h.toFixed(C)&&(m=b>p?-(b-p):-(q-(l-h)))))):0p?b-p:q-(h-l)))));m&&(d=n.indexLabelTextBlock.y+m,b=0,b="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)),n.midAngle>Math.PI/2-t&&n.midAngleh.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x-15:"right"===n.hemisphere&&("left"===a.hemisphere&&b3*Math.PI/2-t&&n.midAngle<3*Math.PI/2+t&&(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"right"===n.hemisphere&&"left"===h.hemisphere&&ba.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x- -15)),n.indexLabelTextBlock.y=d,n.indexLabelTextBlock.x=b,n.indexLabelAngle=Math.atan2(n.indexLabelTextBlock.y-x.y,n.indexLabelTextBlock.x-x.x))}return m}function m(){var a=k.plotArea.ctx;a.fillStyle="grey";a.strokeStyle="grey";a.font="16px Arial";a.textBaseline="middle";for(var b=a=0,d=0,m=!0,b=0;10>b&&(1>b||0z){for(var E=u=0,H=0;Hu?l.indexLabelText="":l.indexLabelTextBlock.maxWidth=0.85*u,0.3*l.indexLabelTextBlock.maxWidthd&&(d=y)),y=y=0,0d&&(d=y)));var K=function(a, -b,c){for(var e=[],d=0;e.push(f[b]),b!==c;b=(b+1+s.length)%s.length);e.sort(function(a,b){return a.y-b.y});for(b=0;bz){n=t.indexLabelTextBlock.x;var k=t.indexLabelTextBlock.y-t.indexLabelTextBlock.height/ -2,w=t.indexLabelTextBlock.y+t.indexLabelTextBlock.height/2,p=h.indexLabelTextBlock.y-h.indexLabelTextBlock.height/2,u=h.indexLabelTextBlock.x+h.indexLabelTextBlock.width,r=h.indexLabelTextBlock.y+h.indexLabelTextBlock.height/2;n=t.indexLabelTextBlock.x+t.indexLabelTextBlock.widthu+q||k>r+q||wa&&(a=l),m!==a&&(b=m,d+=-z),0===l%Math.max(s.length/10,3)&&(g=!0)):g=!0;g&&(0=a.dataSeriesIndexes.length)){var h= -this.data[a.dataSeriesIndexes[0]],s=h.dataPoints,q=10,n=this.plotArea,f=h.dataPointEOs,p=2,r,v=1.3,t=20/180*Math.PI,C=6,x={x:(n.x2+n.x1)/2,y:(n.y2+n.y1)/2},z=0;a=!1;for(var y=0;ya&&(e=a,d=!0);var g=s[b].color?s[b].color:h._colorSet[b%h._colorSet.length];e>c&&ja(k.plotArea.ctx, -f[b].center,f[b].radius,g,h.type,c,e,h.fillOpacity,f[b].percentInnerRadius);if(d)break}l()},function(){k.disableToolTip=!1;k._animator.animate(0,k.animatedRender?500:0,function(a){b(a);l()})})}}};var ra=function(a,d,b,c){"undefined"===typeof b&&(b=1);0>=Math.round(d.y4-d.y1)||(a.save(),a.globalAlpha=b,a.beginPath(),a.moveTo(Math.round(d.x1),Math.round(d.y1)),a.lineTo(Math.round(d.x2),Math.round(d.y2)),a.lineTo(Math.round(d.x3),Math.round(d.y3)),a.lineTo(Math.round(d.x4),Math.round(d.y4)),"undefined"!== -d.x5&&(a.lineTo(Math.round(d.x5),Math.round(d.y5)),a.lineTo(Math.round(d.x6),Math.round(d.y6))),a.closePath(),a.fillStyle=c?c:d.color,a.fill(),a.globalAplha=1,a.restore())};p.prototype.renderFunnel=function(a){function d(){for(var a=0,b=[],c=0;ck?(k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=0==k?0:a/k,h+=a/k,m=!0):(n=(Math.abs(ba)*b-Math.sqrt(k))/2,k=b-2*n/Math.abs(ba),h+=n,h>d&&(h-=n, -k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=a/k,h+=a/k,m=!0),b=k)),e.push(n);return e}function c(){if(t&&C){for(var a,b,c,e,d,g,l,h,m,n,k,q,s,w,p=[],B=[],x={percent:null,total:null},v=null,y=0;yp[y]&&(p[y]=y!==fa?t.reversed?P[y].x3-P[y].x4:P[y].x2-P[y].x1:P[y].x2-P[y].x1,p[y]/=2));s=b.indexLabelMaxWidth?b.indexLabelMaxWidth:t.options.indexLabelMaxWidth?t.indexLabelMaxWidth:p[y];if(s>p[y]||0>s)s=p[y];B[y]="inside"===t.indexLabelPlacement?P[y].height:!1;x=z.getPercentAndTotal(t,b);if(t.indexLabelFormatter||b.indexLabelFormatter)v={chart:z.options,dataSeries:t,dataPoint:b,total:x.total,percent:x.percent};b=b.indexLabelFormatter?b.indexLabelFormatter(v):b.indexLabel? -z.replaceKeywordsWithValue(b.indexLabel,b,t,y):t.indexLabelFormatter?t.indexLabelFormatter(v):t.indexLabel?z.replaceKeywordsWithValue(t.indexLabel,b,t,y):b.label?b.label:"";0>=n&&(n=0);1E3>s&&1E3-sl?l:t.indexLabelMaxWidth:l,h=J.length-1;0<=h;h--){g=C[J[h].id];c=J[h];e=c.textBlock;b=(a=n(h)b.y&&(d=!0);c=g.indexLabelMaxWidth||l;if(c>l||0>c)c=l;f.push(c)}if(d)for(h=J.length-1;0<=h;h--)a=P[h],J[h].textBlock.maxWidth= -f[f.length-(h+1)],J[h].textBlock.measureText(),J[h].textBlock.x=L-l,c=J[h].textBlock.heightpa+D&&(J[h].textBlock.y=pa+D-J[h].height),J[h].textBlock.ywa+D&&(J[h].textBlock.y=wa+D-J[h].height))}function g(){var a,b,c,e;if("inside"!==t.indexLabelPlacement)for(var d=0;dDa?f(c).x2+1:(a.x2+a.x3)/2+1:(a.x2+a.x3)/2+1:"undefined"!==typeof a.x5?cpa+D&&(J[d].textBlock.y=pa+D-J[d].height),J[d].textBlock.ywa+D&&(J[d].textBlock.y=wa+D-J[d].height)));else for(d=0;d=c?(b=d!=fa?(a.x4+a.x3)/2-e/2:(a.x5+a.x4)/2-e/2,c=d!=fa?(a.y1+a.y3)/2-c/2:(a.y1+a.y4)/2-c/2,J[d].textBlock.x=b, -J[d].textBlock.y=c):J[d].isDirty=!0)}function m(){function a(b,c){var d;if(0>b||b>=J.length)return 0;var e,f=J[b].textBlock;if(0>c){c*=-1;e=q(b);d=l(e,b);if(d>=c)return f.y-=c,c;if(0==b)return 0=c)return f.y+=c,c;if(b==P.length-1)return 0e)&&(l=n(s),!(l>=J.length-1)&&J[s].textBlock.y+J[s].height+ga>J[l].textBlock.y&&(J[s].textBlock.y=J[s].textBlock.y+J[s].height-e>e-J[s].textBlock.y?e+1:e-J[s].height-1))}for(l=P.length-1;0e&&(e=0,J[e].isDirty))break;if(J[l].textBlock.y=f){f=0;h+=J[f].height;break}e=q(f); -if(0>e){f=0;h+=J[f].height;break}}if(f!=l){g=J[f].textBlock.y;a-=g;a=h-a;g=c(a,d,f);break}}}return g}function c(a,b,d){var e=[],f=0,g=0;for(a=Math.abs(a);d<=b;d++)e.push(P[d]);e.sort(function(a,b){return a.height-b.height});for(d=0;d+m.y.toFixed(6))&&(d=g.y+d+ga-m.y,e=a(w,-d),ea?t.reversed?wa-D:pa-D:J[a].textBlock.y+J[a].height+ga)}function k(a,b,c){var d,e,f,l=[],m=D,n=[];-1!==b&&(0<=W.indexOf(b)?(e=W.indexOf(b),W.splice(e,1)):(W.push(b),W=W.sort(function(a,b){return a-b})));if(0===W.length)l= -ia;else{e=D*(1!=W.length||0!=W[0]&&W[0]!=P.length-1?2:1)/h();for(var q=0;qn&&(n*=-1),c.y1+=b-n[d],c.y2+=b-n[d],c.y3+=b-n[d],c.y4+=b-n[d],c.y5&&(c.y5+=b-n[d],c.y6+=b-n[d]),n[d]=b}};a._animator.animate(0,c,function(c){var d=a.plotArea.ctx||a.ctx;ja=!0;d.clearRect(x.x1,x.y1,x.x2-x.x1,x.y2-x.y1);d.fillStyle=a.backgroundColor;d.fillRect(x.x1,x.y1,x.width,x.height);w.changeSection(c,b);var e={};e.dataSeries=t;e.dataPoint=t.reversed?t.dataPoints[C.length-1-b]:t.dataPoints[b];e.index=t.reversed?C.length-1-b:b;a.toolTip.highlightObjects([e]); -for(e=0;ea){b=P[c];break}return b?(a=b.y6?a>b.y6?b.x3+(b.x4-b.x3)/(b.y4-b.y3)*(a-b.y3):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2), -{x1:a,x2:a}):-1}function p(a){for(var b=0;b=a.dataSeriesIndexes.length)){for(var t=this.data[a.dataSeriesIndexes[0]],C=t.dataPoints,x=this.plotArea,D=0.025*x.width,y=0.01*x.width,A=0,F=x.height-2*D,E=Math.min(x.width-2*y,2.8*x.height),H=!1,I=0;IF?N=F:0>=N&&(N=0),G>a?G=a-0.5:0>=G&&(G=0)):"pyramid"===t.type&&(G=N=0,t.reversed=t.reversed?!1:!0);var y=I+a/2,$=I,V=I+a,pa=t.reversed?Z:O,K=y-G/2,ea=y+G/2,Da=t.reversed?O+N:Z- -N,wa=t.reversed?O:Z;a=[];var y=[],P=[],E=[],X=O,fa,ba=(Da-pa)/(K-$),ha=-ba,I="area"===(t.valueRepresents?t.valueRepresents:"height")?b():d();if(-1!==I){if(t.reversed)for(E.push(X),G=I.length-1;0a&&(A=a));for(G=0;G\n');c.document.close();setTimeout(function(){c.focus();c.print();setTimeout(function(){b._canvasJSContainer.removeChild(d)},1E3)},500)};p.prototype.getPercentAndTotal=function(a,d){var b=null,c=null, -e=null;if(0<=a.type.indexOf("stacked"))c=0,b=d.x.getTime?d.x.getTime():d.x,b in a.plotUnit.yTotals&&(c=a.plotUnit.yTotals[b],e=isNaN(d.y)?0:100*(d.y/c));else if("pie"===a.type||"doughnut"===a.type||"funnel"===a.type||"pyramid"===a.type){for(b=c=0;b=m||"undefined"=== -typeof m||0>=v||"undefined"===typeof v)){if("horizontal"===this.orientation){n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:v,maxHeight:this.itemWrap?m:this.lineHeight,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"});n.textBlock.measureText();null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"=== -n.chartType?2*0.1*this.lineHeight:0)));if(!q||q.width+Math.round(n.textBlock.width+r+l+(0===q.width?0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))>g)q={items:[],width:0},h.push(q),this.height+=f,f=0;f=Math.max(f,n.textBlock.height)}else n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:x,maxHeight:!0===this.itemWrap?m:1.5*this.fontSize,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily, -fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"}),n.textBlock.measureText(),null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))),this.height>0,0),this.dataPoints.length):0):(s=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,s=0>0,0),this.dataPoints.length):0));for(;;){g=0a?c.x/a:a/c.x: -Math.abs(c.x-a);qs-e&&s+e>=this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}return d||b.dataPoint.x!==a?d&&null!==b.dataPoint?b:null:b};F.prototype.getDataPointAtXY=function(a,d,b){if(!this.dataPoints||0===this.dataPoints.length||athis.chart.plotArea.x2||dthis.chart.plotArea.y2)return null;b=b||!1;var c=[],e=0,g=0,m=1,l=!1,k=Infinity, -h=0,s=0,q=0;if("none"!==this.chart.plotInfo.axisPlacement)if(q=(this.chart.axisX[0]?this.chart.axisX[0]:this.chart.axisX2[0]).getXValueAt({x:a,y:d}),this.axisX.logarithmic)var n=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),q=1>0,0),this.dataPoints.length):0;else n=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,q=0> -0,0),this.dataPoints.length):0;for(;;){g=0=n.x1&&(a<=n.x2&&d>=n.y1&&d<=n.y2)&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1- -a),Math.abs(n.x2-a),Math.abs(n.y1-d),Math.abs(n.y2-d))}),l=!0);break;case "line":case "stepLine":case "spline":case "area":case "stepArea":case "stackedArea":case "stackedArea100":case "splineArea":case "scatter":var u=na("markerSize",f,this)||4,r=b?20:u,p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0r&&(p=Math.atan2(d-u.y,a-u.x),0>p&&(p+=2*Math.PI),p=Number(((180*(p/Math.PI)%360+360)%360).toFixed(12)),u=Number(((180*(n.startAngle/Math.PI)%360+360)%360).toFixed(12)),r=Number(((180*(n.endAngle/Math.PI)%360+360)%360).toFixed(12)),0===r&&1=r&&0!==f.y&&(r+=360,pu&&pp.y1&&dp.y6?(g=p.x6+(p.x5-p.x6)/(p.y5-p.y6)*(d-p.y6),p=p.x3+(p.x4-p.x3)/(p.y4-p.y3)*(d-p.y3)):(g=p.x1+(p.x6-p.x1)/(p.y6-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)):(g=p.x1+(p.x4-p.x1)/(p.y4-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)),a>g&&a=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y4-n.borderThickness/2&&d<=n.y1+n.borderThickness/ -2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "candlestick":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y2-n.borderThickness/2&&d<=n.y3+n.borderThickness/2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a), -Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "ohlc":if(Math.abs(n.x2-a+n.x1-a)=n.y2&&d<=n.y3||a>=n.x1&&a<=(n.x2+n.x1)/2&&d>=n.y1-n.borderThickness/2&&d<=n.y1+n.borderThickness/2||a>=(n.x1+n.x2)/2&&a<=n.x2&&d>=n.y4-n.borderThickness/2&&d<=n.y4+n.borderThickness/2)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0}if(l||1E3q-e&&q+e>= -this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}a=null;for(d=0;dq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius, -horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle",borderThickness:0}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}f=n;for(b=this.intervalStartPosition;b<=e;b=parseFloat(1E-12>this.interval?this.logarithmic&&this.equidistantInterval?b*Math.pow(this.logarithmBase,this.interval):b+this.interval:(this.logarithmic&&this.equidistantInterval? -b*Math.pow(this.logarithmBase,this.interval):b+this.interval).toFixed(12))){for(;fq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix, -horizontalAlign:"left",backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}}else for(this.intervalStartPosition=this.getLabelStartPoint(new Date(this.viewportMinimum), -this.intervalType,this.interval),e=Ya(new Date(this.viewportMaximum),this.interval,this.intervalType),f=n,b=this.intervalStartPosition;bq[f].endValue;f++);p=a;a=f=q[f].startValue&&a<=q[f].endValue;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:new Date(p),label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:Ca(p,this.valueFormatString,this.chart._cultureInfo), -a=new ka(this.ctx,{x:0,y:0,maxWidth:g,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null, -breaksLabelType:void 0}))}if("bottom"===this._position||"top"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.width*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length-2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.width/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+ -"Duration"]*this.interval,g="undefined"===typeof this.options.labelMaxWidth?0.5*this.chart.width>>0:this.options.labelMaxWidth,this.chart.panEnabled||(m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize);else if("left"===this._position||"right"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.height*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length- -2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.height/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+"Duration"]*this.interval,this.chart.panEnabled||(g="undefined"===typeof this.options.labelMaxWidth?0.3*this.chart.width>>0:this.options.labelMaxWidth),m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize; -for(c=0;cthis.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360)),"bottom"===this._position||"top"===this._position)if(g=0.9*l>>0,n=0,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize= -this.labelFontSize;this.sessionVariables.labelMaxWidth=g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=this.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;bn&&(v=b,n=p.width)}b=0;for(b=this.intervalStartPosition< -this.viewportMinimum?1:0;b>0>2*g&&(this.sessionVariables.labelAngle=-25)):(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle):u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth= -g,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p)):(this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=this.labelWrap);else{if(u(this.options.labelWrap))if(!u(this.options.labelMaxWidth))this.options.labelMaxWidth>0,f=this.labelFontSize,nq&&(q=c-2*g,c>=2*g&&c<2.2*g?(this.sessionVariables.labelMaxWidth=g,u(this.options.labelFontSize)&&12=2.2*g&&c<2.8*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=f):c>=2.8*g&&c<3.2*g?(this.sessionVariables.labelMaxWidth=Math.max(g,n),this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12=3.2*g&&c<3.6*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=this.labelFontSize):c>3.6*g&&c<5*g?(u(this.options.labelFontSize)&&125*g&&(this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelFontSize=f,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=this.labelAngle));else if(v===b&&(0===v&&n+this._labels[v+1].textBlock.measureText().width-2*g>q||v===this._labels.length-1&&n+this._labels[v-1].textBlock.measureText().width-2*g>q||0q&&n+this._labels[v-1].textBlock.measureText().width- -2*g>q))q=0===v?n+this._labels[v+1].textBlock.measureText().width-2*g:n+this._labels[v-1].textBlock.measureText().width-2*g,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p;else if(0===q)for(this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,c=0;c>0>2*g&&(this.sessionVariables.labelAngle=-25))}else(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/ -Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=0!=this.labelAngle?(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)):g,this.sessionVariables.labelMaxHeight=m=this.labelWrap?(h-p*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)):1.5*this.labelFontSize,u(this.options.labelWrap))?u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap= -this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelMaxHeight=c<0.9*l?0.9*l:c,this.sessionVariables.labelWrap=this.labelWrap)):(this.options.labelWrap?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p): -(u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelWrap=this.labelWrap),this.sessionVariables.labelMaxHeight=m)}for(c=0;c>0:this.options.labelMaxWidth,m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize=this.labelFontSize;this.sessionVariables.labelMaxWidth= -g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b>0,l-2*m>n&&(n=l-2*m,l>=2*m&&l<2.4*m?(u(this.options.labelFontSize)&&12=2.4*m&&l<2.8*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelFontSize=this.labelFontSize,this.sessionVariables.labelWrap=!0):l>=2.8*m&&l<3.2*m?(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12< -this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>=3.2*m&&l<3.6*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelFontSize=this.labelFontSize):l>3.6*m&&l<10*m?(u(this.options.labelFontSize)&& -1210*m&&l<50*m&&(u(this.options.labelFontSize)&&12this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,u(this.options.labelMaxWidth)&& -(this.sessionVariables.labelAngle=this.labelAngle))):this.options.labelWrap?(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=g):(this.sessionVariables.labelMaxHeight=m,u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap)}for(c=0;c>0:1.5*this.labelFontSize;if("left"===this._position||"right"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.width>>0:1.5*this.labelFontSize;u(g.labelBackgroundColor)&&(g.labelBackgroundColor="#EEEEEE")}else m="bottom"===this._position||"top"===this._position?0.9*this.chart.width>>0:0.9*this.chart.height>> -0,z=u(g.options.labelWrap)||g.labelWrap?"bottom"===this._position||"top"===this._position?0.8*this.chart.width>>0:0.8*this.chart.height>>0:1.5*this.labelFontSize,u(g.labelBackgroundColor)&&(u(g.startValue)&&0!==g.startValue?g.labelBackgroundColor=r?"transparent":null:g.labelBackgroundColor="#EEEEEE");a=new ka(this.ctx,{x:0,y:0,backgroundColor:g.labelBackgroundColor,borderColor:g.labelBorderColor,borderThickness:g.labelBorderThickness,cornerRadius:g.labelCornerRadius,maxWidth:g.options.labelMaxWidth? -g.options.labelMaxWidth:m,maxHeight:z,angle:this.labelAngle,text:g.labelFormatter?g.labelFormatter({chart:this.chart,axis:this,stripLine:g}):g.label,horizontalAlign:"left",fontSize:"outside"===g.labelPlacement?g.options.labelFontSize?g.labelFontSize:this.labelFontSize:g.labelFontSize,fontFamily:"outside"===g.labelPlacement?g.options.labelFontFamily?g.labelFontFamily:this.labelFontFamily:g.labelFontFamily,fontWeight:"outside"===g.labelPlacement?g.options.labelFontWeight?g.labelFontWeight:this.labelFontWeight: -g.labelFontWeight,fontColor:g.labelFontColor||g.color,fontStyle:"outside"===g.labelPlacement?g.options.labelFontStyle?g.labelFontStyle:this.fontWeight:g.labelFontStyle,textBaseline:"middle"});this._stripLineLabels.push({position:g.value,textBlock:a,effectiveHeight:null,stripLine:g})}};z.prototype.createLabelsAndCalculateWidth=function(){var a=0,d=0;this._labels=[];this._stripLineLabels=[];var b=this.chart.isNavigator?0:5;if("left"===this._position||"right"===this._position){this.createLabels();for(d= -0;d=this.viewportMinimum&&this._stripLineLabels[d].stripLine.value<=this.viewportMaximum)&& -(c=this._stripLineLabels[d].textBlock,e=c.measureText(),g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle)),a=this.viewportMinimum&&this._stripLineLabels[b].stripLine.value<=this.viewportMaximum)&&(d=this._stripLineLabels[b].textBlock,e=d.measureText(),g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)),an[f].viewportMaximum);v++)r[v].endValue=n[f].viewPortMinimum&&(n[f].scaleBreaks.lastBreakIndex=v));for(var z=v=0,t=0,C=0,x=0,D=0,y=0,A,E,F=l=0,H,I,L,r=H=I=L=!1,f=0;fv;){var G=0,R=0,S=0,U=0,W=e=0,K=0,$=0,V=0,X=0,P=0,ba=0;if(b&& -0p.width- -q?p.width-q:g.x2-ba-$);if(a&&0p.width-q?p.width-q:g.x2-ba-$),a[f]._labels&&1k&&(l+=0a[f].labelAngle?A-zk&&(l=E+t/2-k-ba),A-za[f].labelAngle&&0p.width-q?p.width-q:g.x2-ba-$),d[f].lineCoordinates.width=Math.abs(k-m),d[f]._labels&&1v;){V=U=R=S=$=K=W=e=Q=O=G=X=0;if(a&&0p.width-10?p.width-10:g.x2-V-W),b[f].labelAutoFit&&!u(C)&&(0b[f].labelAngle?Math.max(m,C):0===b[f].labelAngle? -Math.max(m,C/2):m),0c[f].chart.width-10?c[f].chart.width-10:g.x2-V-W),c[f]&& -c[f].labelAutoFit&&!u(D)&&(0b[f].chart.height-10?b[f].chart.height-10:g.y2),b[f].lineCoordinates.y1=l-(q[f]+b[f].margin+ -X),b[f].lineCoordinates.y2=l-(q[f]+b[f].margin+X),b[f].bounds={x1:m,y1:l-(q[f]+X+b[f].margin),x2:k,y2:h-(X+b[f].margin),width:k-m,height:q[f]},b[f].title&&(b[f]._titleTextBlock.maxWidth=0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0===b[K].labelAngle?k-U:m);if(c&&0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0=== -b[K].labelAngle?k-V:m);if(c&&0d[g].spacing?0:Math.abs(d[g].spacing/b),this.logarithmic&&(d[g].size=Math.pow(this.logarithmBase,d[g].size))};z.prototype.calculateBreaksInPixels=function(){if(!(this.scaleBreaks&&0>=this.scaleBreaks._appliedBreaks.length)){var a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];a.length&&(this.scaleBreaks.firstBreakIndex=this.scaleBreaks.lastBreakIndex=null);for(var d=0;dthis.conversionParameters.maximum);d++)a[d].endValue< -this.conversionParameters.minimum||(u(this.scaleBreaks.firstBreakIndex)&&(this.scaleBreaks.firstBreakIndex=d),a[d].startValue>=this.conversionParameters.minimum&&(a[d].startPixel=this.convertValueToPixel(a[d].startValue),this.scaleBreaks.lastBreakIndex=d),a[d].endValue<=this.conversionParameters.maximum&&(a[d].endPixel=this.convertValueToPixel(a[d].endValue)))}};z.prototype.renderLabelsTicksAndTitle=function(){var a=this,d=!1,b=0,c=0,e=1,g=0;0!==this.labelAngle&&360!==this.labelAngle&&(e=1.2);if("undefined"=== -typeof this.options.interval){if("bottom"===this._position||"top"===this._position)if(this.logarithmic&&!this.equidistantInterval&&this.labelAutoFit){for(var b=[],e=0!==this.labelAngle&&360!==this.labelAngle?1:1.2,m,l=this.viewportMaximum,k=this.lineCoordinates.width/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||mthis.lineCoordinates.width*e&&this.labelAutoFit&&(d=!0)}if("left"===this._position||"right"===this._position)if(this.logarithmic&& -!this.equidistantInterval&&this.labelAutoFit){for(var b=[],p,l=this.viewportMaximum,k=this.lineCoordinates.height/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||pthis.lineCoordinates.height*e&&this.labelAutoFit&&(d=!0)}}this.logarithmic&&(!this.equidistantInterval&&this.labelAutoFit)&&this._labels.sort(function(a,b){return a.position-b.position});var h=0,q,n;if("bottom"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y+this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? -n.y-(this.tickLength+q.textBlock.fontSize/2):n.y+this.tickLength+q.textBlock.fontSize/2):(n.x="inside"===this.labelPlacement?0>this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x-(0>this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0>this.labelAngle?n.y-this.tickLength-5:n.y-this.tickLength-Math.abs(q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle)+5):n.y+this.tickLength+Math.abs(0>this.labelAngle?q.textBlock.width* -Math.sin(Math.PI/180*this.labelAngle)-5:5)),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save(); -a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y-a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y2-this._titleTextBlock.height-3,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("top"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y-this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? -n.y+this.labelFontSize/2+this.tickLength+5:n.y-(this.tickLength+q.textBlock.height-q.textBlock.fontSize/2)):(n.x="inside"===this.labelPlacement?0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&& -(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y+a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y1+1,this.titleMaxWidth= -this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("left"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<< -0,c),this.ctx.lineTo(n.x-this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle?(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5):(q.textBlock.y="inside"===this.labelPlacement?n.y:n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness; -a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x+a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x1+1,this._titleTextBlock.y=this.lineCoordinates.height/2+this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("right"=== -this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<<0,c),this.ctx.lineTo(n.x+this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle? -(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width-this.tickLength-5:n.x+this.tickLength+5):(q.textBlock.y="inside"===this.labelPlacement?n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0>this.labelAngle?n.y:n.y-(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.cos(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<< -0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x-a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x2-1,this._titleTextBlock.y=this.lineCoordinates.height/2-this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}g=0;if("inside"===this.labelPlacement)this.chart.addEventListener("dataAnimationIterationEnd", -function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)||(a.ctx.save(),a.ctx.beginPath(),q.textBlock.render(!0),a.ctx.restore())},this);else for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||q.textBlock.render(!0)};z.prototype.renderInterlacedColors=function(){var a=this.chart.plotArea.ctx,d,b,c=this.chart.plotArea, -e=0;d=!0;if(("bottom"===this._position||"top"===this._position)&&this.interlacedColor)for(a.fillStyle=this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(Math.min(b.x,d.x),c.y1,Math.abs(b.x-d.x),Math.abs(c.y1-c.y2)),d=!1):d=!0;else if(("left"===this._position||"right"===this._position)&&this.interlacedColor)for(a.fillStyle= -this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(c.x1,Math.min(b.y,d.y),Math.abs(c.x1-c.x2),Math.abs(d.y-b.y)),d=!1):d=!0;a.beginPath()};z.prototype.renderStripLinesOfThicknessType=function(a){if(this.stripLines&&0this.viewportMaximum||u(h.value)||isNaN(this.range))||l.push(h))}for(c=0;cthis.viewportMaximum||isNaN(this.range))){a=this.getPixelCoordinatesOnAxis(b.position);if("outside"===b.stripLine.labelPlacement)if(h&&(this.ctx.strokeStyle= -h.color,"pixel"===h._thicknessType&&(this.ctx.lineWidth=h.thickness)),"bottom"===this._position){var p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0;this.ctx.beginPath();this.ctx.moveTo(p,a.y<<0);this.ctx.lineTo(p,a.y+this.tickLength<<0);this.ctx.stroke();0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y+=this.tickLength+b.textBlock.fontSize/2):(a.x-=0>this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0,a.y+=this.tickLength+Math.abs(0>this.labelAngle?b.textBlock.width*Math.sin(Math.PI/ -180*this.labelAngle)-5:5))}else"top"===this._position?(p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,this.ctx.beginPath(),this.ctx.moveTo(p,a.y<<0),this.ctx.lineTo(p,a.y-this.tickLength<<0),this.ctx.stroke(),0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y-=this.tickLength+b.textBlock.height):(a.x+=(b.textBlock.height-this.tickLength-this.labelFontSize/2)*Math.sin(Math.PI/180*this.labelAngle)-(0this.labelAngle?a.y:a.y-(b.textBlock.height-b.textBlock.fontSize/ -2-5)*Math.cos(Math.PI/180*this.labelAngle),a.x=0this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/ -2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+=b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y1+b.textBlock.width+3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-b.textBlock.width-3:"center"=== -b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y1+3):"top"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+= -b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+b.textBlock.width+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y2-3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y2- -b.textBlock.width-3):"left"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-b.textBlock.height>this.chart.plotArea.y1?u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3:a.y-b.textBlock.heightthis.chart.plotArea.y1? -u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2-3:a.y-b.textBlock.heightthis.viewportMaximum|| -isNaN(this.range))||a[d].render(this.maskCtx);this.maskCtx.restore()}};z.prototype.renderCrosshair=function(a,d){this.crosshair.render(a,d)};z.prototype.renderGrid=function(){if(this.gridThickness&&0this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(),d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.x<<0)+0.5:d.x<<0,a.moveTo(d,b.y1<<0),a.lineTo(d,b.y2<<0),a.stroke());else if("left"===this._position||"right"===this._position)for(var c=0;cthis.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(), -d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.y<<0)+0.5:d.y<<0,a.moveTo(b.x1<<0,d),a.lineTo(b.x2<<0,d),a.stroke());a.restore()}};z.prototype.renderAxisLine=function(){var a=this.chart.ctx,d=r?this.chart._preRenderCtx:a,b=Math.ceil(this.tickThickness/(this.reversed?-2:2)),c=Math.ceil(this.tickThickness/(this.reversed?2:-2)),e,g;d.save();if("bottom"===this._position||"top"===this._position){if(this.lineThickness){this.reversed?(e=this.lineCoordinates.x2,g=this.lineCoordinates.x1): -(e=this.lineCoordinates.x1,g=this.lineCoordinates.x2);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor?this.lineColor:"black";d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));var m=1===this.lineThickness%2?(this.lineCoordinates.y1<<0)+0.5:this.lineCoordinates.y1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+c;else for(var l= -this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(e,m),d.lineTo(this.scaleBreaks._appliedBreaks[l].startPixel+b,m),e=this.scaleBreaks._appliedBreaks[l].endPixel+c;e&&(d.moveTo(e,m),d.lineTo(g,m));d.stroke()}}else if(("left"===this._position||"right"===this._position)&&this.lineThickness){this.reversed?(e=this.lineCoordinates.y1,g=this.lineCoordinates.y2):(e=this.lineCoordinates.y2,g=this.lineCoordinates.y1);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor; -d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));m=1===this.lineThickness%2?(this.lineCoordinates.x1<<0)+0.5:this.lineCoordinates.x1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+b;else for(l=this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(m,e),d.lineTo(m,this.scaleBreaks._appliedBreaks[l].startPixel+c), -e=this.scaleBreaks._appliedBreaks[l].endPixel+b;e&&(d.moveTo(m,e),d.lineTo(m,g));d.stroke()}r&&(a.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx&&this.chart._breaksCanvasCtx.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),d.clearRect(0,0,this.chart.width,this.chart.height));d.restore()};z.prototype.getPixelCoordinatesOnAxis=function(a){var d={};if("bottom"===this._position||"top"===this._position)d.x=this.convertValueToPixel(a), -d.y=this.lineCoordinates.y1;if("left"===this._position||"right"===this._position)d.y=this.convertValueToPixel(a),d.x=this.lineCoordinates.x2;return d};z.prototype.convertPixelToValue=function(a){if("undefined"===typeof a)return null;var d=0,b=0,c,d=!0,e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b="number"===typeof a?a:"left"===this._position||"right"===this._position?a.y:a.x;if(this.logarithmic){a=c=Math.pow(this.logarithmBase,(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit); -if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;be[b].startValue/this.conversionParameters.minimum){c/=e[b].startValue/this.conversionParameters.minimum;if(ce[b].startValue/e[b-1].endValue){c/=e[b].startValue/e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum){if(1e[b].startValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].startValue/this.conversionParameters.minimum*Math.pow(e[b].size,Math.log(e[b].startValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue))*c,c*=Math.pow(e[b].size,Math.log(this.conversionParameters.minimum/e[b].startValue)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size;d=!1}else break;else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size}else break; -d=a*this.viewportMinimum}else{a=c=(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit;if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b=e[b].size?0:c*(e[b].endValue- -e[b].startValue)/e[b].size;break}else a+=e[b].endValue-this.conversionParameters.minimum-e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue),c-=e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue);d=!1}else if(c>e[b].startValue-this.conversionParameters.minimum){c-=e[b].startValue-this.conversionParameters.minimum;if(ce[b].startValue-e[b-1].endValue){c-=e[b].startValue-e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum)if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue- -e[b].startValue)/e[b].size>e[b].startValue){a=0>=e[b].size?0:c*(e[b].endValue-e[b].startValue)/e[b].size;break}else a+=e[b].startValue-this.conversionParameters.minimum+e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),c+=e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),d=!1;else if(c-1*e[b].size){a+=(e[b].endValue- -e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size;d=!1}else break;else if(c-1*e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size}else break;d=this.conversionParameters.minimum+a}return d};z.prototype.convertValueToPixel=function(a){a=this.getApparentDifference(this.conversionParameters.minimum, -a,a);return this.logarithmic?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*Math.log(a/this.conversionParameters.minimum)/this.conversionParameters.lnLogarithmBase+0.5<<0:"axisX"===this.type?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5<<0:this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5};z.prototype.getApparentDifference=function(a, -d,b,c){var e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];if(this.logarithmic){b=u(b)?d/a:b;for(var g=0;ge[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*e[g].startValue*e[g].size:a>=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*a*Math.pow(e[g].size,Math.log(e[g].endValue/a)/Math.log(e[g].endValue/e[g].startValue)):a<=e[g].startValue&&d<=e[g].endValue?b=b/d*e[g].startValue*Math.pow(e[g].size,Math.log(d/e[g].startValue)/Math.log(e[g].endValue/ -e[g].startValue)):!c&&(a>e[g].startValue&&de[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+e[g].startValue+e[g].size:a>e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+a+e[g].size*(e[g].endValue-a)/(e[g].endValue-e[g].startValue):a<=e[g].startValue&&de[g].startValue&&da[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<= -a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*this.viewportMinimum,b=0a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<=a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+this.viewportMinimum, -b=0this.maxWidth?8:6);var a=Math.max(c,Math.floor(this.maxWidth/a)),e,g,m,c=0;!u(this.options.viewportMinimum)&&(!u(this.options.viewportMaximum)&&this.options.viewportMinimum>=this.options.viewportMaximum)&& -(this.viewportMinimum=this.viewportMaximum=null);if(u(this.options.viewportMinimum)&&!u(this.sessionVariables.newViewportMinimum)&&!isNaN(this.sessionVariables.newViewportMinimum))this.viewportMinimum=this.sessionVariables.newViewportMinimum;else if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(u(this.options.viewportMaximum)&&!u(this.sessionVariables.newViewportMaximum)&&!isNaN(this.sessionVariables.newViewportMaximum))this.viewportMaximum=this.sessionVariables.newViewportMaximum; -else if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(c=0;c=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue)&& -(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue)){this.scaleBreaks._appliedBreaks.splice(c,1);break}if("axisX"===this.type){if(this.dataSeries&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g, -null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0));c=this.getApparentDifference(isNaN(this.viewportMinimum)||null===this.viewportMinimum?e:this.viewportMinimum,isNaN(this.viewportMaximum)||null===this.viewportMaximum?g:this.viewportMaximum,null, -!0);if("axisX"===this.type&&b){this.intervalType||(c/1<=a?(this.interval=1,this.intervalType="millisecond"):c/2<=a?(this.interval=2,this.intervalType="millisecond"):c/5<=a?(this.interval=5,this.intervalType="millisecond"):c/10<=a?(this.interval=10,this.intervalType="millisecond"):c/20<=a?(this.interval=20,this.intervalType="millisecond"):c/50<=a?(this.interval=50,this.intervalType="millisecond"):c/100<=a?(this.interval=100,this.intervalType="millisecond"):c/200<=a?(this.interval=200,this.intervalType= -"millisecond"):c/250<=a?(this.interval=250,this.intervalType="millisecond"):c/300<=a?(this.interval=300,this.intervalType="millisecond"):c/400<=a?(this.interval=400,this.intervalType="millisecond"):c/500<=a?(this.interval=500,this.intervalType="millisecond"):c/(1*S.secondDuration)<=a?(this.interval=1,this.intervalType="second"):c/(2*S.secondDuration)<=a?(this.interval=2,this.intervalType="second"):c/(5*S.secondDuration)<=a?(this.interval=5,this.intervalType="second"):c/(10*S.secondDuration)<=a?(this.interval= -10,this.intervalType="second"):c/(15*S.secondDuration)<=a?(this.interval=15,this.intervalType="second"):c/(20*S.secondDuration)<=a?(this.interval=20,this.intervalType="second"):c/(30*S.secondDuration)<=a?(this.interval=30,this.intervalType="second"):c/(1*S.minuteDuration)<=a?(this.interval=1,this.intervalType="minute"):c/(2*S.minuteDuration)<=a?(this.interval=2,this.intervalType="minute"):c/(5*S.minuteDuration)<=a?(this.interval=5,this.intervalType="minute"):c/(10*S.minuteDuration)<=a?(this.interval= -10,this.intervalType="minute"):c/(15*S.minuteDuration)<=a?(this.interval=15,this.intervalType="minute"):c/(20*S.minuteDuration)<=a?(this.interval=20,this.intervalType="minute"):c/(30*S.minuteDuration)<=a?(this.interval=30,this.intervalType="minute"):c/(1*S.hourDuration)<=a?(this.interval=1,this.intervalType="hour"):c/(2*S.hourDuration)<=a?(this.interval=2,this.intervalType="hour"):c/(3*S.hourDuration)<=a?(this.interval=3,this.intervalType="hour"):c/(6*S.hourDuration)<=a?(this.interval=6,this.intervalType= -"hour"):c/(1*S.dayDuration)<=a?(this.interval=1,this.intervalType="day"):c/(2*S.dayDuration)<=a?(this.interval=2,this.intervalType="day"):c/(4*S.dayDuration)<=a?(this.interval=4,this.intervalType="day"):c/(1*S.weekDuration)<=a?(this.interval=1,this.intervalType="week"):c/(2*S.weekDuration)<=a?(this.interval=2,this.intervalType="week"):c/(3*S.weekDuration)<=a?(this.interval=3,this.intervalType="week"):c/(1*S.monthDuration)<=a?(this.interval=1,this.intervalType="month"):c/(2*S.monthDuration)<=a?(this.interval= -2,this.intervalType="month"):c/(3*S.monthDuration)<=a?(this.interval=3,this.intervalType="month"):c/(6*S.monthDuration)<=a?(this.interval=6,this.intervalType="month"):(this.interval=c/(1*S.yearDuration)<=a?1:c/(2*S.yearDuration)<=a?2:c/(4*S.yearDuration)<=a?4:Math.floor(z.getNiceNumber(c/(a-1),!0)/S.yearDuration),this.intervalType="year"));if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=e-m/2;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum= -g+m/2;d?this.autoValueFormatString="MMM DD YYYY HH:mm":"year"===this.intervalType?this.autoValueFormatString="YYYY":"month"===this.intervalType?this.autoValueFormatString="MMM YYYY":"week"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"day"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"hour"===this.intervalType?this.autoValueFormatString="hh:mm TT":"minute"===this.intervalType?this.autoValueFormatString="hh:mm TT":"second"===this.intervalType?this.autoValueFormatString= -"hh:mm:ss TT":"millisecond"===this.intervalType&&(this.autoValueFormatString="fff'ms'");this.valueFormatString||(this.valueFormatString=this.autoValueFormatString)}else{this.intervalType="number";c=z.getNiceNumber(c,!1);this.interval=this.options&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g,null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)):(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0)),Math.abs(this.getApparentDifference(e,g,null,!0)),"axisX"===this.type&&b){this.valueType="dateTime";if(null===this.minimum||isNaN(this.minimum))this.minimum=e-m/2;if(null===this.maximum||isNaN(this.maximum))this.maximum=g+m/2}else this.intervalType=this.valueType="number",null===this.minimum&&(this.minimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval,this.minimum=Math.min(this.minimum, -null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?Infinity:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval,this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?-Infinity:this.sessionVariables.viewportMaximum)),0===this.maximum&&0===this.minimum&&(0===this.options.minimum?this.maximum+=10:0=== -this.options.maximum&&(this.minimum-=10));u(this.sessionVariables.newViewportMinimum)&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));u(this.sessionVariables.newViewportMaximum)&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.range=this.viewportMaximum-this.viewportMinimum;this.intervalStartPosition="axisX"===this.type&&b?this.getLabelStartPoint(new Date(this.viewportMinimum),this.intervalType,this.interval):Math.floor((this.viewportMinimum+0.2*this.interval)/ -this.interval)*this.interval;this.valueFormatString||(this.valueFormatString=z.generateValueFormatString(this.range,2))}};z.prototype.calculateLogarithmicAxisParameters=function(){var a=this.chart.layoutManager.getFreeSpace(),d=Math.log(this.logarithmBase),b;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?500>this.maxWidth?7:Math.max(7,Math.floor(this.maxWidth/100)):Math.max(Math.floor(this.maxWidth/ -50),3),c,e,g,m;m=1;if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(m=0;m=this.scaleBreaks._appliedBreaks[m].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[m].startValue|| -!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue)&&(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue)){this.scaleBreaks._appliedBreaks.splice(m,1);break}"axisX"===this.type? -(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,1===e/c&&(m=Math.pow(this.logarithmBase,"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin, -e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,0>=c&&!isFinite(e)?(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1):0>=c?c=e:isFinite(e)||(e=c),1===c&&1===e?(e*=this.logarithmBase-1/this.logarithmBase,c=1):1===e/c?(m=Math.min(e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),e*=m,c/=m):c>e?(m=Math.min(c/e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase, -0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&1e&&(e=1));m=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)/(isNaN(this.viewportMinimum)||null=== -this.viewportMinimum?c:this.viewportMinimum);var l=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)-(isNaN(this.viewportMinimum)||null===this.viewportMinimum?c:this.viewportMinimum);this.intervalType="number";m=Math.pow(this.logarithmBase,z.getNiceNumber(Math.abs(Math.log(m)/d),!1));this.options&&0this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(c)||isFinite(e)?1===c&&1===e?(e*=this.logarithmBase,c/=this.logarithmBase):1===e/c?(m=Math.pow(this.logarithmBase,this.interval),e*=m,c/=m):c>e?(m= -Math.min(0.01*(c/e),5),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)):(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.minimum||isNaN(this.minimum))&&1e&&(e=1)),this.intervalType="number",null===this.minimum&&(this.minimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval)),this.minimum=Math.min(this.minimum,null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?"undefined"===typeof this.sessionVariables.newViewportMinimum?Infinity:this.sessionVariables.newViewportMinimum:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum= -"axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval)),this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?"undefined"===typeof this.sessionVariables.newViewportMaximum?0:this.sessionVariables.newViewportMaximum:this.sessionVariables.viewportMaximum)),1===this.maximum&&1===this.minimum&&(1===this.options.minimum?this.maximum*=this.logarithmBase-1/this.logarithmBase: -1===this.options.maximum&&(this.minimum/=this.logarithmBase-1/this.logarithmBase));this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum);this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum);this.viewportMinimum>this.viewportMaximum&&(!this.options.viewportMinimum&&!this.options.minimum||this.options.viewportMaximum||this.options.maximum?this.options.viewportMinimum||this.options.minimum||!this.options.viewportMaximum&&!this.options.maximum||(this.viewportMinimum=this.minimum= -(this.options.viewportMaximum||this.options.maximum)/Math.pow(this.logarithmBase,2*Math.ceil(this.interval))):this.viewportMaximum=this.maximum=this.options.viewportMinimum||this.options.minimum);c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval);this.range=this.viewportMaximum/this.viewportMinimum;this.noTicks=a;if(!this.options.interval&&this.rangethis.viewportMaximum||3>a?2:3)){for(d=Math.floor(this.viewportMinimum/ -b+0.5)*b;dthis.interval&&(this.interval=b,c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval))),this.equidistantInterval=!0,this.intervalStartPosition=c;if(!this.valueFormatString&&(this.valueFormatString="#,##0.##",1>this.viewportMinimum)){d=Math.floor(Math.abs(Math.log(this.viewportMinimum)/ -Math.LN10))+2;if(isNaN(d)||!isFinite(d))d=2;if(2a&&(c+=Math.floor(Math.abs(Math.log(a)/Math.LN10)),isNaN(c)||!isFinite(c))&&(c=d);for(var e=0;eb?1>=c?1:5>=c?5:10:Math.max(Math.floor(c),1);return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.getNiceNumber= -function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=d?1.5>c?1:3>c?2:7>c?5:10:1>=c?1:2>=c?2:5>=c?5:10;return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.prototype.getLabelStartPoint=function(){var a=S[this.intervalType+"Duration"]*this.interval,a=new Date(Math.floor(this.viewportMinimum/a)*a);if("millisecond"!==this.intervalType)if("second"===this.intervalType)0=a||"bottom"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(c,l),this.ctx.lineTo(m,l),this.ctx.lineTo(m,e);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(l-h)/a/3;for(var n=0;n=a||"right"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(m,e),this.ctx.lineTo(m,l), -this.ctx.lineTo(c,l);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(m-k)/a/3;for(n=0;nthis.parent.range?2:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range? -1:0):50this.parent.range?2:10>this.parent.range?1:0);this.valueFormatString=z.generateValueFormatString(this.parent.range,h)}var l=null===this.opacity?1:this.opacity,h=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness),p=this.chart.overlaidCanvasCtx,q=p.globalAlpha;p.globalAlpha=l;p.beginPath();p.strokeStyle=this.color;p.lineWidth=h;p.save();this.labelFontSize= -u(this.options.labelFontSize)?this.parent.labelFontSize:this.labelFontSize;if("left"===this.parent._position||"right"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?this.parent.bounds.x2-this.parent.bounds.x1:this.labelMaxWidth,this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?3*this.chart.height:2*this.labelFontSize;else if("top"===this.parent._position||"bottom"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?3*this.chart.width:this.labelMaxWidth, -this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?this.parent.bounds.height:2*this.labelFontSize;0this.chart.bounds.x2?l.x=this.chart.bounds.x2-l.width:l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}}else if("bottom"===this.parent._position||"top"===this.parent._position){n=this.parent.convertPixelToValue({x:a});for(r=0;rthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"=== -this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}m=null;("bottom"===this.parent._position||"top"===this.parent._position)&&(b>=this.parent.convertValueToPixel(this.parent.viewportMinimum)&&c<=this.parent.convertValueToPixel(this.parent.viewportMaximum))&&(0=this.parent.convertValueToPixel(this.parent.viewportMaximum)&& -e<=this.parent.convertValueToPixel(this.parent.viewportMinimum))&&(0this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x1-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}else{if("bottom"===this.parent._position||"top"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)? -ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label,l.x=b-l.measureText().width/2,l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width),l.xthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2),"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2);0(new Date).getTime()-this._lastUpdated||(this._lastUpdated=(new Date).getTime(), -this.chart.resetOverlayedCanvas(),this._updateToolTip(a,d))};$.prototype._updateToolTip=function(a,d,b){b="undefined"===typeof b?!0:b;this.container||this._initialize();this.enabled||this.hide();if(!this.chart.disableToolTip){if("undefined"===typeof a||"undefined"===typeof d){if(isNaN(this._prevX)||isNaN(this._prevY))return;a=this._prevX;d=this._prevY}else this._prevX=a,this._prevY=d;var c=null,e=null,g=[],k=0;if(this.shared&&this.enabled&&"none"!==this.chart.plotInfo.axisPlacement){if("xySwapped"=== -this.chart.plotInfo.axisPlacement){var l=[];if(this.chart.axisX)for(var p=0;ph.dataSeries.axisY.viewportMaximum&&b++;b-h.dataPoint.y.length&&g.push(h)}else"column"===e.type||"bar"===e.type?0>h.dataPoint.y?0>h.dataSeries.axisY.viewportMinimum&&h.dataSeries.axisY.viewportMaximum>=h.dataPoint.y&&g.push(h):h.dataSeries.axisY.viewportMinimum<=h.dataPoint.y&&0<=h.dataSeries.axisY.viewportMaximum&&g.push(h):"bubble"===e.type?(b=this.chart._eventManager.objectMap[e.dataPointIds[h.index]].size/2,h.dataPoint.y>= -h.dataSeries.axisY.viewportMinimum-b&&h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum+b&&g.push(h)):"waterfall"===e.type?(b=0,h.cumulativeSumYStartValueh.dataSeries.axisY.viewportMaximum&&b++,h.cumulativeSumh.dataSeries.axisY.viewportMaximum&&b++,2>b&&-2=h.dataSeries.axisY.viewportMinimum&& -h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum)&&g.push(h);else g.push(h)}}if(0a&&(a+=this.container.clientWidth+20);a+this.container.clientWidth> -Math.max(this.chart.container.clientWidth,this.chart.width)&&(a=Math.max(0,Math.max(this.chart.container.clientWidth,this.chart.width)-this.container.clientWidth));d=1!==g.length||this.shared||"line"!==g[0].dataSeries.type&&"stepLine"!==g[0].dataSeries.type&&"spline"!==g[0].dataSeries.type&&"area"!==g[0].dataSeries.type&&"stepArea"!==g[0].dataSeries.type&&"splineArea"!==g[0].dataSeries.type?"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"=== -g[0].dataSeries.type?g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x):d:g[0].dataSeries.axisY.convertValueToPixel(g[0].dataPoint.y);d=-d+10;0":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content? -this.content:"{name}:  {y}",p=b.axisXIndex):"bubble"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y},   {z}"): -"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y[0]}, {y[1]}"):"candlestick"=== -b.type||"ohlc"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Open:   {y[0]}
High:    {y[1]}
Low:   {y[2]}
Close:   {y[3]}"):"boxAndWhisker"=== -b.type&&(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"), -null===d&&(d=""),!0===this.reversed?(d=this.chart.replaceKeywordsWithValue(g,c,b,e)+d,l"+d)):(d+=this.chart.replaceKeywordsWithValue(g,c,b,e),l")));null!==d&&(d=h+d)}else{b=a[0].dataSeries;c=a[0].dataPoint;e=a[0].index;if(null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent)return null;"line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"===b.type||"splineArea"===b.type||"column"=== -b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y}":"bubble"===b.type?g=c.toolTipContent? -c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y},   {z}":"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.name?"{name}:  ":c.label?"{label}:  ":"")+"{y}":"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+" :  {y[0]},  {y[1]}": -"candlestick"===b.type||"ohlc"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Open:   {y[0]}
High:    {y[1]}
Low:     {y[2]}
Close:   {y[3]}":"boxAndWhisker"===b.type&&(g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent: -this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"); -null===d&&(d="");d+=this.chart.replaceKeywordsWithValue(g,c,b,e)}return d};$.prototype.enableAnimation=function(){if(!this.container.style.WebkitTransition){var a=this.getContainerTransition(this.containerTransitionDuration);this.container.style.WebkitTransition=a;this.container.style.MsTransition=a;this.container.style.transition=a;this.container.style.MozTransition=this.mozContainerTransition}};$.prototype.disableAnimation=function(){this.container.style.WebkitTransition&&(this.container.style.WebkitTransition= -"",this.container.style.MozTransition="",this.container.style.MsTransition="",this.container.style.transition="")};$.prototype.hide=function(a){this.container&&(this.container.style.display="none",this.currentSeriesIndex=-1,this._prevY=this._prevX=NaN,("undefined"===typeof a||a)&&this.chart.resetOverlayedCanvas())};$.prototype.show=function(a,d,b){this._updateToolTip(a,d,"undefined"===typeof b?!1:b)};$.prototype.fixMozTransitionDelay=function(a,d){if(20c&&a.push(d),d.animationCallback(c),1<=c&&d.onComplete)d.onComplete();this.animations=a;0g;g++)for(var e=0;3>e;e++){for(var f=0,d=0;3>d;d++)f+=a[g][d]*b[d][e];c[g][e]=f}return c}function P(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX= -a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha;b.font=a.font;b.textAlign=a.textAlign;b.textBaseline=a.textBaseline;b.arcScaleX_=a.arcScaleX_;b.arcScaleY_=a.arcScaleY_;b.lineScale_=a.lineScale_}function Q(a){var b=a.indexOf("(",3),c=a.indexOf(")",b+1),b=a.substring(b+1,c).split(",");if(4!=b.length||"a"!=a.charAt(3))b[3]=1;return b}function E(a,b,c){return Math.min(c,Math.max(b,a))}function F(a,b,c){0>c&&c++;16*c?a+6*(b-a)*c: -1>2*c?b:2>3*c?a+6*(b-a)*(2/3-c):a}function G(a){if(a in H)return H[a];var b,c=1;a=String(a);if("#"==a.charAt(0))b=a;else if(/^rgb/.test(a)){c=Q(a);b="#";for(var g,e=0;3>e;e++)g=-1!=c[e].indexOf("%")?Math.floor(255*(parseFloat(c[e])/100)):+c[e],b+=v[E(g,0,255)];c=+c[3]}else if(/^hsl/.test(a)){e=c=Q(a);b=parseFloat(e[0])/360%360;0>b&&b++;g=E(parseFloat(e[1])/100,0,1);e=E(parseFloat(e[2])/100,0,1);if(0==g)g=e=b=e;else{var f=0.5>e?e*(1+g):e+g-e*g,d=2*e-f;g=F(d,f,b+1/3);e=F(d,f,b);b=F(d,f,b-1/3)}b="#"+ -v[Math.floor(255*g)]+v[Math.floor(255*e)]+v[Math.floor(255*b)];c=c[3]}else b=Z[a]||a;return H[a]={color:b,alpha:c}}function C(a){this.m_=D();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=1*q;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=a;var b="width:"+a.clientWidth+"px;height:"+a.clientHeight+"px;overflow:hidden;position:absolute", -c=a.ownerDocument.createElement("div");c.style.cssText=b;a.appendChild(c);b=c.cloneNode(!1);b.style.backgroundColor="red";b.style.filter="alpha(opacity=0)";a.appendChild(b);this.element_=c;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}function R(a,b,c,g){a.currentPath_.push({type:"bezierCurveTo",cp1x:b.x,cp1y:b.y,cp2x:c.x,cp2y:c.y,x:g.x,y:g.y});a.currentX_=g.x;a.currentY_=g.y}function S(a,b){var c=G(a.strokeStyle),g=c.color,c=c.alpha*a.globalAlpha,e=a.lineScale_*a.lineWidth;1>e&&(c*=e);b.push("')}function T(a,b,c,g){var e=a.fillStyle,f=a.arcScaleX_,d=a.arcScaleY_,k=g.x-c.x,n=g.y-c.y;if(e instanceof w){var h=0,l=g=0,u=0,m=1;if("gradient"==e.type_){h=e.x1_/f;c=e.y1_/d;var p=s(a,e.x0_/f,e.y0_/d),h=s(a,h,c),h=180*Math.atan2(h.x-p.x,h.y-p.y)/Math.PI;0>h&&(h+=360);1E-6>h&&(h=0)}else p=s(a,e.x0_,e.y0_),g=(p.x-c.x)/k,l=(p.y-c.y)/n,k/=f*q, -n/=d*q,m=x.max(k,n),u=2*e.r0_/m,m=2*e.r1_/m-u;f=e.colors_;f.sort(function(a,b){return a.offset-b.offset});d=f.length;p=f[0].color;c=f[d-1].color;k=f[0].alpha*a.globalAlpha;a=f[d-1].alpha*a.globalAlpha;for(var n=[],r=0;r')}else e instanceof -I?k&&n&&b.push("'):(e=G(a.fillStyle),b.push(''))}function s(a,b,c){a=a.m_;return{x:q*(b*a[0][0]+c*a[1][0]+a[2][0])-r,y:q*(b*a[0][1]+c*a[1][1]+a[2][1])-r}}function z(a,b,c){isFinite(b[0][0])&&(isFinite(b[0][1])&&isFinite(b[1][0])&&isFinite(b[1][1])&&isFinite(b[2][0])&&isFinite(b[2][1]))&&(a.m_=b,c&&(a.lineScale_=aa(ba(b[0][0]*b[1][1]-b[0][1]* -b[1][0]))))}function w(a){this.type_=a;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}function I(a,b){if(!a||1!=a.nodeType||"IMG"!=a.tagName)throw new A("TYPE_MISMATCH_ERR");if("complete"!=a.readyState)throw new A("INVALID_STATE_ERR");switch(b){case "repeat":case null:case "":this.repetition_="repeat";break;case "repeat-x":case "repeat-y":case "no-repeat":this.repetition_=b;break;default:throw new A("SYNTAX_ERR");}this.src_=a.src;this.width_=a.width;this.height_=a.height} -function A(a){this.code=this[a];this.message=a+": DOM Exception "+this.code}var x=Math,k=x.round,J=x.sin,K=x.cos,ba=x.abs,aa=x.sqrt,q=10,r=q/2;navigator.userAgent.match(/MSIE ([\d.]+)?/);var M=Array.prototype.slice;O(document);var U={init:function(a){a=a||document;a.createElement("canvas");a.attachEvent("onreadystatechange",W(this.init_,this,a))},init_:function(a){a=a.getElementsByTagName("canvas");for(var b=0;bd;d++)for(var B=0;16>B;B++)v[16*d+B]=d.toString(16)+B.toString(16);var Z={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC", -bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000", -darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082", -ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA", -mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5", -peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"}, -H={},L={},$={butt:"flat",round:"round"},d=C.prototype;d.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null);this.element_.innerHTML=""};d.beginPath=function(){this.currentPath_=[]};d.moveTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.lineTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.bezierCurveTo= -function(a,b,c,g,e,f){e=s(this,e,f);a=s(this,a,b);c=s(this,c,g);R(this,a,c,e)};d.quadraticCurveTo=function(a,b,c,g){a=s(this,a,b);c=s(this,c,g);g={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)};R(this,g,{x:g.x+(c.x-this.currentX_)/3,y:g.y+(c.y-this.currentY_)/3},c)};d.arc=function(a,b,c,g,e,f){c*=q;var d=f?"at":"wa",k=a+K(g)*c-r,n=b+J(g)*c-r;g=a+K(e)*c-r;e=b+J(e)*c-r;k!=g||f||(k+=0.125);a=s(this,a,b);k=s(this,k,n);g=s(this,g,e);this.currentPath_.push({type:d, -x:a.x,y:a.y,radius:c,xStart:k.x,yStart:k.y,xEnd:g.x,yEnd:g.y})};d.rect=function(a,b,c,g){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath()};d.strokeRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath();this.stroke();this.currentPath_=e};d.fillRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+ -c,b+g);this.lineTo(a,b+g);this.closePath();this.fill();this.currentPath_=e};d.createLinearGradient=function(a,b,c,g){var e=new w("gradient");e.x0_=a;e.y0_=b;e.x1_=c;e.y1_=g;return e};d.createRadialGradient=function(a,b,c,g,e,f){var d=new w("gradientradial");d.x0_=a;d.y0_=b;d.r0_=c;d.x1_=g;d.y1_=e;d.r1_=f;return d};d.drawImage=function(a,b){var c,g,e,d,r,y,n,h;e=a.runtimeStyle.width;d=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var l=a.width,u=a.height;a.runtimeStyle.width= -e;a.runtimeStyle.height=d;if(3==arguments.length)c=arguments[1],g=arguments[2],r=y=0,n=e=l,h=d=u;else if(5==arguments.length)c=arguments[1],g=arguments[2],e=arguments[3],d=arguments[4],r=y=0,n=l,h=u;else if(9==arguments.length)r=arguments[1],y=arguments[2],n=arguments[3],h=arguments[4],c=arguments[5],g=arguments[6],e=arguments[7],d=arguments[8];else throw Error("Invalid number of arguments");var m=s(this,c,g),p=[];p.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))};d.stroke=function(a){var b=[];b.push("d.x)d.x=f.x;if(null==c.y||f.yd.y)d.y=f.y}}b.push(' ">');a?T(this,b,c,d):S(this,b);b.push("");this.element_.insertAdjacentHTML("beforeEnd",b.join(""))};d.fill=function(){this.stroke(!0)};d.closePath=function(){this.currentPath_.push({type:"close"})};d.save=function(){var a= -{};P(this,a);this.aStack_.push(a);this.mStack_.push(this.m_);this.m_=t(D(),this.m_)};d.restore=function(){this.aStack_.length&&(P(this.aStack_.pop(),this),this.m_=this.mStack_.pop())};d.translate=function(a,b){z(this,t([[1,0,0],[0,1,0],[a,b,1]],this.m_),!1)};d.rotate=function(a){var b=K(a);a=J(a);z(this,t([[b,a,0],[-a,b,0],[0,0,1]],this.m_),!1)};d.scale=function(a,b){this.arcScaleX_*=a;this.arcScaleY_*=b;z(this,t([[a,0,0],[0,b,0],[0,0,1]],this.m_),!0)};d.transform=function(a,b,c,d,e,f){z(this,t([[a, -b,0],[c,d,0],[e,f,1]],this.m_),!0)};d.setTransform=function(a,b,c,d,e,f){z(this,[[a,b,0],[c,d,0],[e,f,1]],!0)};d.drawText_=function(a,b,c,d,e){var f=this.m_;d=0;var r=1E3,t=0,n=[],h;h=this.font;if(L[h])h=L[h];else{var l=document.createElement("div").style;try{l.font=h}catch(u){}h=L[h]={style:l.fontStyle||"normal",variant:l.fontVariant||"normal",weight:l.fontWeight||"normal",size:l.fontSize||10,family:l.fontFamily||"sans-serif"}}var l=h,m=this.element_;h={};for(var p in l)h[p]=l[p];p=parseFloat(m.currentStyle.fontSize); -m=parseFloat(l.size);"number"==typeof l.size?h.size=l.size:-1!=l.size.indexOf("px")?h.size=m:-1!=l.size.indexOf("em")?h.size=p*m:-1!=l.size.indexOf("%")?h.size=p/100*m:-1!=l.size.indexOf("pt")?h.size=m/0.75:h.size=p;h.size*=0.981;p=h.style+" "+h.variant+" "+h.weight+" "+h.size+"px "+h.family;m=this.element_.currentStyle;l=this.textAlign.toLowerCase();switch(l){case "left":case "center":case "right":break;case "end":l="ltr"==m.direction?"right":"left";break;case "start":l="rtl"==m.direction?"right": -"left";break;default:l="left"}switch(this.textBaseline){case "hanging":case "top":t=h.size/1.75;break;case "middle":break;default:case null:case "alphabetic":case "ideographic":case "bottom":t=-h.size/2.25}switch(l){case "right":d=1E3;r=0.05;break;case "center":d=r=500}b=s(this,b+0,c+t);n.push('');e?S(this,n):T(this,n,{x:-d,y:0}, -{x:r,y:h.size});e=f[0][0].toFixed(3)+","+f[1][0].toFixed(3)+","+f[0][1].toFixed(3)+","+f[1][1].toFixed(3)+",0,0";b=k(b.x/q)+","+k(b.y/q);n.push('','','');this.element_.insertAdjacentHTML("beforeEnd",n.join(""))};d.fillText=function(a,b,c,d){this.drawText_(a,b,c,d,!1)};d.strokeText=function(a, -b,c,d){this.drawText_(a,b,c,d,!0)};d.measureText=function(a){this.textMeasureEl_||(this.element_.insertAdjacentHTML("beforeEnd",''),this.textMeasureEl_=this.element_.lastChild);var b=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(b.createTextNode(a));return{width:this.textMeasureEl_.offsetWidth}};d.clip=function(){}; -d.arcTo=function(){};d.createPattern=function(a,b){return new I(a,b)};w.prototype.addColorStop=function(a,b){b=G(b);this.colors_.push({offset:a,color:b.color,alpha:b.alpha})};d=A.prototype=Error();d.INDEX_SIZE_ERR=1;d.DOMSTRING_SIZE_ERR=2;d.HIERARCHY_REQUEST_ERR=3;d.WRONG_DOCUMENT_ERR=4;d.INVALID_CHARACTER_ERR=5;d.NO_DATA_ALLOWED_ERR=6;d.NO_MODIFICATION_ALLOWED_ERR=7;d.NOT_FOUND_ERR=8;d.NOT_SUPPORTED_ERR=9;d.INUSE_ATTRIBUTE_ERR=10;d.INVALID_STATE_ERR=11;d.SYNTAX_ERR=12;d.INVALID_MODIFICATION_ERR= -13;d.NAMESPACE_ERR=14;d.INVALID_ACCESS_ERR=15;d.VALIDATION_ERR=16;d.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=U;CanvasRenderingContext2D=C;CanvasGradient=w;CanvasPattern=I;DOMException=A}(); - -/* - CanvasJS jQuery Charting Plugin - https://canvasjs.com/ - Copyright 2017 fenopix - - --------------------- License Information -------------------- - CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. - https://canvasjs.com/license/ - -*/ -(function(b,c,d,e){b.fn.CanvasJSChart=function(a){if(a){var b=this.first();a=new CanvasJS.Chart(this[0],a);b.children(".canvasjs-chart-container").data("canvasjsChartRef",a);a.render();return this}return this.first().children(".canvasjs-chart-container").data("canvasjsChartRef")}})(jQuery,window,document); -/*eslint-enable*/ -/*jshint ignore:end*/ \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/license.txt b/SRIP/Libraries/canvasjs-2.3.1/license.txt deleted file mode 100644 index f9882a14..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/license.txt +++ /dev/null @@ -1,9 +0,0 @@ -* -* @preserve CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ -* Copyright 2018 fenopix -* -* --------------------- License Information -------------------- -* CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. -* https://canvasjs.com/license/ -* -* \ No newline at end of file diff --git a/SRIP/Quiz/JSONquestions.js b/SRIP/Quiz/JSONquestions.js deleted file mode 100644 index 7c4b6fec..00000000 --- a/SRIP/Quiz/JSONquestions.js +++ /dev/null @@ -1,15 +0,0 @@ -var questions = []; - -function shuffle(array) { - var currentIndex = array.length, temporaryValue, randomIndex; - while (0 !== currentIndex) { - randomIndex = Math.floor(Math.random() * currentIndex); - currentIndex -= 1; - temporaryValue = array[currentIndex]; - array[currentIndex] = array[randomIndex]; - array[randomIndex] = temporaryValue; - } - return array; -} - -shuffle(questions); \ No newline at end of file diff --git a/SRIP/Quiz/quiz.css b/SRIP/Quiz/quiz.css deleted file mode 100644 index c5e1ae85..00000000 --- a/SRIP/Quiz/quiz.css +++ /dev/null @@ -1,190 +0,0 @@ -body -{ - -background-repeat: no-repeat; - -background-size: 1600px 800px - -} - -#heading -{ - -position: absolute; - -left:20%; - -width: 60%; - -background: rgba(255,255,255,0.5); - -padding: 20px; - -border: 1px solid #00038c; - -box-shadow: 0 0 8px 3px #fff; - -} - -#text -{ - -text-align: center; - -} - -#quiz -{ - -height: 330px; - -width: 60%; - -position: absolute; - -left:20%; - -top: 30%; - -transform: translateX(-50) translateY(-50); - -background: rgba(255,255,255,0.5); - -padding: 20px; - -border: 1px solid #00038c; - -box-shadow: 0 0 8px 3px #fff; -} - -#question -{ - -padding: 20px; - -font-size: 22px; - -background: #08038C; - -border-radius: 10px; - -margin: 10px 0 10px 0; - -color: #f6f6f6; - -} - -.option{ - -width: 470px; - -display: inline-block; - -padding: 10px 0 10px 0; - -background: rgba(255,255,255,0.5); - -margin: 10px 0 10px 10px; - -color: #0000000; - -border: 2px solid #008CBA; - -border-radius: 5px; - -} - -.option:hover -{ - -background: #08038C; - -color: #f6f6f6; - -} - -#next -{ - -background-color: #4CAF50; - -width:10%; - -height: 4%px; - -border: 1px solid #00038c; - -box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); - -cursor: pointer; - -float: right; - -padding: 10px 10px; - -} - -#next:hover{ - -background-color:rgb(106, 90, 205); - -} - -#quit -{ - -position: absolute; - -right: 0; - -bottom: 0; - -background-color: #4CAF50; - -border: 1px solid #00038c; - -box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); - -cursor: pointer; - -float: right; - -padding: 5px 5px; - -} - -#quit:hover{ - -background-color:rgb(106, 90, 205); - -} - -#result -{ - -font-size:100px; - -text-align: center; - -height: 100px; - -width: 60%; - -position: absolute; - -left:20%; - -top: 30%; - -transform: translateX(-50) translateY(-50); - -background: rgba(255,255,255,0.5); - -padding: 20px; - -border: 1px solid #00038c; - -box-shadow: 0 0 8px 3px #fff; - -} - diff --git a/SRIP/Quiz/quiz.html b/SRIP/Quiz/quiz.html deleted file mode 100644 index e90e372c..00000000 --- a/SRIP/Quiz/quiz.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - QUIZ - - - -
-

Quiz on Experiment: Generation of Random Variables

-

-
-
- - - - - -
- - - - - - - \ No newline at end of file diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js deleted file mode 100644 index d89861ea..00000000 --- a/SRIP/Quiz/quiz.js +++ /dev/null @@ -1,61 +0,0 @@ -var quiz = document.getElementById("quiz"); -var ques = document.getElementById("question"); -var opt1 = document.getElementById("option1"); -var opt2 = document.getElementById("option2"); -var opt3 = document.getElementById("option3"); -var opt4 = document.getElementById("option4"); -var res = document.getElementById("result"); -var nextbutton = document.getElementById("next"); -var q = document.getElementById("quit"); - -var tques = questions.length; -var score = 0; -var quesindex = 0; - -//finish the quiz -function quit(){ - quiz.style.display = "none"; - result.style.display = ""; - var f = score / tques; - result.textContent = "SCORE = " + score; - q.style.display = "none"; -} - -//start the quiz -function giveQues(quesindex){ - ques.textContent = quesindex + 1 + ". " + questions[quesindex][0]; - opt1.textContent = questions[quesindex][1]; - opt2.textContent = questions[quesindex][2]; - opt3.textContent = questions[quesindex][3]; - opt4.textContent = questions[quesindex][4]; - return; -} - -giveQues(0); - -//next question -function nextques(){ - var selectedAns = document.querySelector("input[type=radio]:checked"); - if(!selectedAns){ - alert("SELECT AN OPTION"); - return; - } - - if(selectedAns.value == questions[quesindex][5]){ - score = score + 1; - } - selectedAns.checked = false; - quesindex++; - if(quesindex == tques - 1){ - nextbutton.textContent = "Finish"; - } - var f = score / tques; - if(quesindex == tques){ - q.style.display = "none"; - quiz.style.display = "none"; - result.style.display = ""; - result.textContent = "SCORED: " + score + " out of 25 " + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973); - return; - } - giveQues(quesindex); -} diff --git a/SRIP/README.txt b/SRIP/README.txt deleted file mode 100644 index bd071aa5..00000000 --- a/SRIP/README.txt +++ /dev/null @@ -1,15 +0,0 @@ -This is Readme file containing instruction for running the experiment: Hopfield model for pattern storage task - -TO RUN THE EXPERIMENT: -1. Download the SRIP folder -2. Go to Codes folder -3. Run the .html file - -HTML file will open in the browser and all functionalities will run from the HTML file. - - -TAKE A QUIZ OF THE EXPERIMENT: -1. Go to Quiz folder -2. Run quiz.html -3. Quiz will open in the browser -4. Give the quiz From 2d95854609a4c71f05118cc3b3a00f458cb1397e Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Thu, 11 Jul 2019 18:53:45 +0530 Subject: [PATCH 151/166] initial commit --- SRIP/Codes/exp1.css | 12 + SRIP/Codes/exp1.html | 14 + SRIP/Codes/exp1.js | 0 SRIP/Libraries/Chart.js | 14680 ++++++++++++++++ SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js | 911 + .../canvasjs-2.3.1/canvasjs.react.js | 48 + .../examples/01-overview/animated-chart.html | 43 + .../01-overview/chart-from-json-data.html | 50 + .../chart-with-axis-scale-breaks.html | 51 + .../01-overview/chart-with-crosshair.html | 72 + .../chart-with-custom-legend-chart.html | 233 + .../01-overview/chart-with-image-overlay.html | 108 + .../chart-with-index-data-label.html | 46 + .../chart-with-inverted-reversed-axis.html | 46 + .../chart-with-logarithmic-axis.html | 128 + .../chart-with-secondary-axis.html | 87 + .../01-overview/chart-with-zoom-pan.html | 40 + .../examples/01-overview/dynamic-chart.html | 57 + .../interactive-draggable-chart.html | 115 + .../01-overview/multi-series-chart.html | 94 + .../examples/01-overview/null-data-chart.html | 62 + .../01-overview/performance-demo.html | 43 + .../dashed-line-chart.html | 102 + .../dynamic-spline-chart.html | 56 + .../line-chart-with-axis-scale-breaks.html | 71 + .../line-chart-with-data-markers.html | 53 + .../line-chart-with-logarithmic-axis.html | 107 + .../line-chart-with-multiple-axis.html | 125 + .../line-chart-with-zoom-pan.html | 46 + .../line-chart.html | 44 + .../multi-series-line-chart.html | 257 + .../multi-series-spline-chart.html | 171 + .../multi-series-step-line-chart.html | 67 + .../spline-chart-with-legends.html | 123 + .../spline-chart-with-secondary-axis.html | 100 + .../spline-chart.html | 55 + .../step-line-chart.html | 57 + .../area-chart.html | 50 + .../multi-series-area-chart.html | 73 + .../multi-series-range-area-chart.html | 127 + .../multi-series-spline-area-chart.html | 113 + .../range-area-chart.html | 72 + .../range-spline-area-chart.html | 51 + .../spline-area-chart.html | 55 + ...ed-area-100-chart-with-date-time-axis.html | 120 + .../stacked-area-100-chart.html | 78 + .../stacked-area-chart.html | 68 + .../step-area-chart.html | 42 + .../bar-chart-with-axis-scale-break.html | 58 + .../bar-chart.html | 58 + .../column-chart-with-multiple-axis.html | 83 + .../column-chart.html | 43 + .../multi-series-bar-chart.html | 104 + .../multi-series-range-column-chart.html | 89 + .../multi-series-waterfall-chart.html | 98 + .../range-bar-chart.html | 49 + .../range-column-chart.html | 49 + .../stacked-bar-100-chart.html | 76 + .../stacked-bar-chart.html | 126 + .../stacked-column-100-chart.html | 103 + .../stacked-column-chart.html | 113 + .../waterfall-chart-with-custom-color.html | 51 + .../waterfall-chart.html | 48 + .../doughnut-Chart.html | 40 + ...ughnut-chart-with-custom-inner-radius.html | 55 + .../funnel-chart-with-custom-neck.html | 52 + .../funnel-chart.html | 52 + .../inverted-reversed-funnel-chart.html | 54 + .../pie-chart-with-custom-radius.html | 51 + .../pie-chart-with-legends.html | 52 + .../pie-chart.html | 36 + ...mid-chart-where-area-represents-value.html | 39 + ...-chart-with-index-label-placed-Inside.html | 40 + .../pyramid-chart.html | 40 + .../candlestick-line-chart.html | 108 + .../multi-series-candlestick-chart.html | 90 + .../ohlc-chart-from-json-data.html | 58 + .../ohlc-stock-chart.html | 54 + .../bubble-chart-with-data-marker.html | 59 + .../bubble-chart-with-zoom-pan.html | 60 + .../bubble-chart.html | 69 + .../multi-series-scatter-point-chart.html | 73 + ...catter-point-chart-with-custom-marker.html | 129 + .../scatter-point-chart.html | 63 + ...x-and-whisker-chart-with-custom-color.html | 43 + .../box-and-whisker-chart-with-outliers.html | 81 + .../box-and-whisker-chart.html | 43 + .../column-line-area-chart.html | 122 + .../error-bar-chart.html | 54 + .../09-combination-charts/error-chart.html | 58 + .../error-line-chart.html | 73 + .../ohlc-line-chart.html | 106 + .../pareto-chart-with-index-data-label.html | 68 + .../09-combination-charts/pareto-chart.html | 66 + .../range-area-line-chart.html | 108 + .../dynamic-column-chart.html | 54 + .../10-dynamic-charts/dynamic-line-chart.html | 58 + .../dynamic-multi-series-chart.html | 113 + .../11-integration/jquery-charts.html | 42 + .../jquery-line-chart-with-zoom-pan.html | 49 + .../jquery-resizable-chart.html | 55 + .../jquery-spline-area-chart-in-tab.html | 98 + ...jquery-spline-chart-with-image-export.html | 41 + SRIP/Libraries/canvasjs-2.3.1/instruction.txt | 4 + .../canvasjs-2.3.1/jquery.canvasjs.min.js | 922 + SRIP/Libraries/canvasjs-2.3.1/license.txt | 9 + SRIP/Quiz/JSONquestions.js | 15 + SRIP/Quiz/quiz.css | 190 + SRIP/Quiz/quiz.html | 27 + SRIP/Quiz/quiz.js | 61 + SRIP/README.txt | 15 + 111 files changed, 24220 insertions(+) create mode 100644 SRIP/Codes/exp1.css create mode 100644 SRIP/Codes/exp1.html create mode 100644 SRIP/Codes/exp1.js create mode 100644 SRIP/Libraries/Chart.js create mode 100644 SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js create mode 100644 SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html create mode 100644 SRIP/Libraries/canvasjs-2.3.1/instruction.txt create mode 100644 SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js create mode 100644 SRIP/Libraries/canvasjs-2.3.1/license.txt create mode 100644 SRIP/Quiz/JSONquestions.js create mode 100644 SRIP/Quiz/quiz.css create mode 100644 SRIP/Quiz/quiz.html create mode 100644 SRIP/Quiz/quiz.js create mode 100644 SRIP/README.txt diff --git a/SRIP/Codes/exp1.css b/SRIP/Codes/exp1.css new file mode 100644 index 00000000..3d2e7868 --- /dev/null +++ b/SRIP/Codes/exp1.css @@ -0,0 +1,12 @@ +* { + +box-sizing: border-box; + +} + + +body { + +margin: 0; + +} \ No newline at end of file diff --git a/SRIP/Codes/exp1.html b/SRIP/Codes/exp1.html new file mode 100644 index 00000000..8f7cf9d5 --- /dev/null +++ b/SRIP/Codes/exp1.html @@ -0,0 +1,14 @@ + + + + + Pattern Recognition: Experiment 1- Feature Representation<title> + <link type="text/css" href="exp1.css" rel="stylesheet"> + <script type="text/javascript" src="exp1.js"></script> + <script type="text/javascript" src="https://canvasjs.com/assets/script/canvasjs.min.js"></script> + +</head> +<body> + +</body> +</html> \ No newline at end of file diff --git a/SRIP/Codes/exp1.js b/SRIP/Codes/exp1.js new file mode 100644 index 00000000..e69de29b diff --git a/SRIP/Libraries/Chart.js b/SRIP/Libraries/Chart.js new file mode 100644 index 00000000..4c50e09b --- /dev/null +++ b/SRIP/Libraries/Chart.js @@ -0,0 +1,14680 @@ +/*! + * Chart.js v2.8.0 + * https://www.chartjs.org + * (c) 2019 Chart.js Contributors + * Released under the MIT License + */ +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(function() { try { return require('moment'); } catch(e) { } }()) : +typeof define === 'function' && define.amd ? define(['require'], function(require) { return factory(function() { try { return require('moment'); } catch(e) { } }()); }) : +(global.Chart = factory(global.moment)); +}(this, (function (moment) { 'use strict'; + +moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment; + +/* MIT license */ + +var conversions = { + rgb2hsl: rgb2hsl, + rgb2hsv: rgb2hsv, + rgb2hwb: rgb2hwb, + rgb2cmyk: rgb2cmyk, + rgb2keyword: rgb2keyword, + rgb2xyz: rgb2xyz, + rgb2lab: rgb2lab, + rgb2lch: rgb2lch, + + hsl2rgb: hsl2rgb, + hsl2hsv: hsl2hsv, + hsl2hwb: hsl2hwb, + hsl2cmyk: hsl2cmyk, + hsl2keyword: hsl2keyword, + + hsv2rgb: hsv2rgb, + hsv2hsl: hsv2hsl, + hsv2hwb: hsv2hwb, + hsv2cmyk: hsv2cmyk, + hsv2keyword: hsv2keyword, + + hwb2rgb: hwb2rgb, + hwb2hsl: hwb2hsl, + hwb2hsv: hwb2hsv, + hwb2cmyk: hwb2cmyk, + hwb2keyword: hwb2keyword, + + cmyk2rgb: cmyk2rgb, + cmyk2hsl: cmyk2hsl, + cmyk2hsv: cmyk2hsv, + cmyk2hwb: cmyk2hwb, + cmyk2keyword: cmyk2keyword, + + keyword2rgb: keyword2rgb, + keyword2hsl: keyword2hsl, + keyword2hsv: keyword2hsv, + keyword2hwb: keyword2hwb, + keyword2cmyk: keyword2cmyk, + keyword2lab: keyword2lab, + keyword2xyz: keyword2xyz, + + xyz2rgb: xyz2rgb, + xyz2lab: xyz2lab, + xyz2lch: xyz2lch, + + lab2xyz: lab2xyz, + lab2rgb: lab2rgb, + lab2lch: lab2lch, + + lch2lab: lch2lab, + lch2xyz: lch2xyz, + lch2rgb: lch2rgb +}; + + +function rgb2hsl(rgb) { + var r = rgb[0]/255, + g = rgb[1]/255, + b = rgb[2]/255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, l; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g)/ delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + l = (min + max) / 2; + + if (max == min) + s = 0; + else if (l <= 0.5) + s = delta / (max + min); + else + s = delta / (2 - max - min); + + return [h, s * 100, l * 100]; +} + +function rgb2hsv(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, v; + + if (max == 0) + s = 0; + else + s = (delta/max * 1000)/10; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g) / delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + v = ((max / 255) * 1000) / 10; + + return [h, s, v]; +} + +function rgb2hwb(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + h = rgb2hsl(rgb)[0], + w = 1/255 * Math.min(r, Math.min(g, b)), + b = 1 - 1/255 * Math.max(r, Math.max(g, b)); + + return [h, w * 100, b * 100]; +} + +function rgb2cmyk(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255, + c, m, y, k; + + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; + return [c * 100, m * 100, y * 100, k * 100]; +} + +function rgb2keyword(rgb) { + return reverseKeywords[JSON.stringify(rgb)]; +} + +function rgb2xyz(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255; + + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y *100, z * 100]; +} + +function rgb2lab(rgb) { + var xyz = rgb2xyz(rgb), + x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function rgb2lch(args) { + return lab2lch(rgb2lab(args)); +} + +function hsl2rgb(hsl) { + var h = hsl[0] / 360, + s = hsl[1] / 100, + l = hsl[2] / 100, + t1, t2, t3, rgb, val; + + if (s == 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) + t2 = l * (1 + s); + else + t2 = l + s - l * s; + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * - (i - 1); + t3 < 0 && t3++; + t3 > 1 && t3--; + + if (6 * t3 < 1) + val = t1 + (t2 - t1) * 6 * t3; + else if (2 * t3 < 1) + val = t2; + else if (3 * t3 < 2) + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + else + val = t1; + + rgb[i] = val * 255; + } + + return rgb; +} + +function hsl2hsv(hsl) { + var h = hsl[0], + s = hsl[1] / 100, + l = hsl[2] / 100, + sv, v; + + if(l === 0) { + // no need to do calc on black + // also avoids divide by 0 error + return [0, 0, 0]; + } + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + v = (l + s) / 2; + sv = (2 * s) / (l + s); + return [h, sv * 100, v * 100]; +} + +function hsl2hwb(args) { + return rgb2hwb(hsl2rgb(args)); +} + +function hsl2cmyk(args) { + return rgb2cmyk(hsl2rgb(args)); +} + +function hsl2keyword(args) { + return rgb2keyword(hsl2rgb(args)); +} + + +function hsv2rgb(hsv) { + var h = hsv[0] / 60, + s = hsv[1] / 100, + v = hsv[2] / 100, + hi = Math.floor(h) % 6; + + var f = h - Math.floor(h), + p = 255 * v * (1 - s), + q = 255 * v * (1 - (s * f)), + t = 255 * v * (1 - (s * (1 - f))), + v = 255 * v; + + switch(hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +} + +function hsv2hsl(hsv) { + var h = hsv[0], + s = hsv[1] / 100, + v = hsv[2] / 100, + sl, l; + + l = (2 - s) * v; + sl = s * v; + sl /= (l <= 1) ? l : 2 - l; + sl = sl || 0; + l /= 2; + return [h, sl * 100, l * 100]; +} + +function hsv2hwb(args) { + return rgb2hwb(hsv2rgb(args)) +} + +function hsv2cmyk(args) { + return rgb2cmyk(hsv2rgb(args)); +} + +function hsv2keyword(args) { + return rgb2keyword(hsv2rgb(args)); +} + +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +function hwb2rgb(hwb) { + var h = hwb[0] / 360, + wh = hwb[1] / 100, + bl = hwb[2] / 100, + ratio = wh + bl, + i, v, f, n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + if ((i & 0x01) != 0) { + f = 1 - f; + } + n = wh + f * (v - wh); // linear interpolation + + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + + return [r * 255, g * 255, b * 255]; +} + +function hwb2hsl(args) { + return rgb2hsl(hwb2rgb(args)); +} + +function hwb2hsv(args) { + return rgb2hsv(hwb2rgb(args)); +} + +function hwb2cmyk(args) { + return rgb2cmyk(hwb2rgb(args)); +} + +function hwb2keyword(args) { + return rgb2keyword(hwb2rgb(args)); +} + +function cmyk2rgb(cmyk) { + var c = cmyk[0] / 100, + m = cmyk[1] / 100, + y = cmyk[2] / 100, + k = cmyk[3] / 100, + r, g, b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + return [r * 255, g * 255, b * 255]; +} + +function cmyk2hsl(args) { + return rgb2hsl(cmyk2rgb(args)); +} + +function cmyk2hsv(args) { + return rgb2hsv(cmyk2rgb(args)); +} + +function cmyk2hwb(args) { + return rgb2hwb(cmyk2rgb(args)); +} + +function cmyk2keyword(args) { + return rgb2keyword(cmyk2rgb(args)); +} + + +function xyz2rgb(xyz) { + var x = xyz[0] / 100, + y = xyz[1] / 100, + z = xyz[2] / 100, + r, g, b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r = (r * 12.92); + + g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g = (g * 12.92); + + b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b = (b * 12.92); + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; +} + +function xyz2lab(xyz) { + var x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function xyz2lch(args) { + return lab2lch(xyz2lab(args)); +} + +function lab2xyz(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + x, y, z, y2; + + if (l <= 8) { + y = (l * 100) / 903.3; + y2 = (7.787 * (y / 100)) + (16 / 116); + } else { + y = 100 * Math.pow((l + 16) / 116, 3); + y2 = Math.pow(y / 100, 1/3); + } + + x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); + + z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); + + return [x, y, z]; +} + +function lab2lch(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + hr, h, c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + if (h < 0) { + h += 360; + } + c = Math.sqrt(a * a + b * b); + return [l, c, h]; +} + +function lab2rgb(args) { + return xyz2rgb(lab2xyz(args)); +} + +function lch2lab(lch) { + var l = lch[0], + c = lch[1], + h = lch[2], + a, b, hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + return [l, a, b]; +} + +function lch2xyz(args) { + return lab2xyz(lch2lab(args)); +} + +function lch2rgb(args) { + return lab2rgb(lch2lab(args)); +} + +function keyword2rgb(keyword) { + return cssKeywords[keyword]; +} + +function keyword2hsl(args) { + return rgb2hsl(keyword2rgb(args)); +} + +function keyword2hsv(args) { + return rgb2hsv(keyword2rgb(args)); +} + +function keyword2hwb(args) { + return rgb2hwb(keyword2rgb(args)); +} + +function keyword2cmyk(args) { + return rgb2cmyk(keyword2rgb(args)); +} + +function keyword2lab(args) { + return rgb2lab(keyword2rgb(args)); +} + +function keyword2xyz(args) { + return rgb2xyz(keyword2rgb(args)); +} + +var cssKeywords = { + aliceblue: [240,248,255], + antiquewhite: [250,235,215], + aqua: [0,255,255], + aquamarine: [127,255,212], + azure: [240,255,255], + beige: [245,245,220], + bisque: [255,228,196], + black: [0,0,0], + blanchedalmond: [255,235,205], + blue: [0,0,255], + blueviolet: [138,43,226], + brown: [165,42,42], + burlywood: [222,184,135], + cadetblue: [95,158,160], + chartreuse: [127,255,0], + chocolate: [210,105,30], + coral: [255,127,80], + cornflowerblue: [100,149,237], + cornsilk: [255,248,220], + crimson: [220,20,60], + cyan: [0,255,255], + darkblue: [0,0,139], + darkcyan: [0,139,139], + darkgoldenrod: [184,134,11], + darkgray: [169,169,169], + darkgreen: [0,100,0], + darkgrey: [169,169,169], + darkkhaki: [189,183,107], + darkmagenta: [139,0,139], + darkolivegreen: [85,107,47], + darkorange: [255,140,0], + darkorchid: [153,50,204], + darkred: [139,0,0], + darksalmon: [233,150,122], + darkseagreen: [143,188,143], + darkslateblue: [72,61,139], + darkslategray: [47,79,79], + darkslategrey: [47,79,79], + darkturquoise: [0,206,209], + darkviolet: [148,0,211], + deeppink: [255,20,147], + deepskyblue: [0,191,255], + dimgray: [105,105,105], + dimgrey: [105,105,105], + dodgerblue: [30,144,255], + firebrick: [178,34,34], + floralwhite: [255,250,240], + forestgreen: [34,139,34], + fuchsia: [255,0,255], + gainsboro: [220,220,220], + ghostwhite: [248,248,255], + gold: [255,215,0], + goldenrod: [218,165,32], + gray: [128,128,128], + green: [0,128,0], + greenyellow: [173,255,47], + grey: [128,128,128], + honeydew: [240,255,240], + hotpink: [255,105,180], + indianred: [205,92,92], + indigo: [75,0,130], + ivory: [255,255,240], + khaki: [240,230,140], + lavender: [230,230,250], + lavenderblush: [255,240,245], + lawngreen: [124,252,0], + lemonchiffon: [255,250,205], + lightblue: [173,216,230], + lightcoral: [240,128,128], + lightcyan: [224,255,255], + lightgoldenrodyellow: [250,250,210], + lightgray: [211,211,211], + lightgreen: [144,238,144], + lightgrey: [211,211,211], + lightpink: [255,182,193], + lightsalmon: [255,160,122], + lightseagreen: [32,178,170], + lightskyblue: [135,206,250], + lightslategray: [119,136,153], + lightslategrey: [119,136,153], + lightsteelblue: [176,196,222], + lightyellow: [255,255,224], + lime: [0,255,0], + limegreen: [50,205,50], + linen: [250,240,230], + magenta: [255,0,255], + maroon: [128,0,0], + mediumaquamarine: [102,205,170], + mediumblue: [0,0,205], + mediumorchid: [186,85,211], + mediumpurple: [147,112,219], + mediumseagreen: [60,179,113], + mediumslateblue: [123,104,238], + mediumspringgreen: [0,250,154], + mediumturquoise: [72,209,204], + mediumvioletred: [199,21,133], + midnightblue: [25,25,112], + mintcream: [245,255,250], + mistyrose: [255,228,225], + moccasin: [255,228,181], + navajowhite: [255,222,173], + navy: [0,0,128], + oldlace: [253,245,230], + olive: [128,128,0], + olivedrab: [107,142,35], + orange: [255,165,0], + orangered: [255,69,0], + orchid: [218,112,214], + palegoldenrod: [238,232,170], + palegreen: [152,251,152], + paleturquoise: [175,238,238], + palevioletred: [219,112,147], + papayawhip: [255,239,213], + peachpuff: [255,218,185], + peru: [205,133,63], + pink: [255,192,203], + plum: [221,160,221], + powderblue: [176,224,230], + purple: [128,0,128], + rebeccapurple: [102, 51, 153], + red: [255,0,0], + rosybrown: [188,143,143], + royalblue: [65,105,225], + saddlebrown: [139,69,19], + salmon: [250,128,114], + sandybrown: [244,164,96], + seagreen: [46,139,87], + seashell: [255,245,238], + sienna: [160,82,45], + silver: [192,192,192], + skyblue: [135,206,235], + slateblue: [106,90,205], + slategray: [112,128,144], + slategrey: [112,128,144], + snow: [255,250,250], + springgreen: [0,255,127], + steelblue: [70,130,180], + tan: [210,180,140], + teal: [0,128,128], + thistle: [216,191,216], + tomato: [255,99,71], + turquoise: [64,224,208], + violet: [238,130,238], + wheat: [245,222,179], + white: [255,255,255], + whitesmoke: [245,245,245], + yellow: [255,255,0], + yellowgreen: [154,205,50] +}; + +var reverseKeywords = {}; +for (var key in cssKeywords) { + reverseKeywords[JSON.stringify(cssKeywords[key])] = key; +} + +var convert = function() { + return new Converter(); +}; + +for (var func in conversions) { + // export Raw versions + convert[func + "Raw"] = (function(func) { + // accept array or plain args + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + return conversions[func](arg); + } + })(func); + + var pair = /(\w+)2(\w+)/.exec(func), + from = pair[1], + to = pair[2]; + + // export rgb2hsl and ["rgb"]["hsl"] + convert[from] = convert[from] || {}; + + convert[from][to] = convert[func] = (function(func) { + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + + var val = conversions[func](arg); + if (typeof val == "string" || val === undefined) + return val; // keyword + + for (var i = 0; i < val.length; i++) + val[i] = Math.round(val[i]); + return val; + } + })(func); +} + + +/* Converter does lazy conversion and caching */ +var Converter = function() { + this.convs = {}; +}; + +/* Either get the values for a space or + set the values for a space, depending on args */ +Converter.prototype.routeSpace = function(space, args) { + var values = args[0]; + if (values === undefined) { + // color.rgb() + return this.getValues(space); + } + // color.rgb(10, 10, 10) + if (typeof values == "number") { + values = Array.prototype.slice.call(args); + } + + return this.setValues(space, values); +}; + +/* Set the values for a space, invalidating cache */ +Converter.prototype.setValues = function(space, values) { + this.space = space; + this.convs = {}; + this.convs[space] = values; + return this; +}; + +/* Get the values for a space. If there's already + a conversion for the space, fetch it, otherwise + compute it */ +Converter.prototype.getValues = function(space) { + var vals = this.convs[space]; + if (!vals) { + var fspace = this.space, + from = this.convs[fspace]; + vals = convert[fspace][space](from); + + this.convs[space] = vals; + } + return vals; +}; + +["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { + Converter.prototype[space] = function(vals) { + return this.routeSpace(space, arguments); + }; +}); + +var colorConvert = convert; + +var colorName = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; + +/* MIT license */ + + +var colorString = { + getRgba: getRgba, + getHsla: getHsla, + getRgb: getRgb, + getHsl: getHsl, + getHwb: getHwb, + getAlpha: getAlpha, + + hexString: hexString, + rgbString: rgbString, + rgbaString: rgbaString, + percentString: percentString, + percentaString: percentaString, + hslString: hslString, + hslaString: hslaString, + hwbString: hwbString, + keyword: keyword +}; + +function getRgba(string) { + if (!string) { + return; + } + var abbr = /^#([a-fA-F0-9]{3,4})$/i, + hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i, + rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + keyword = /(\w+)/; + + var rgb = [0, 0, 0], + a = 1, + match = string.match(abbr), + hexAlpha = ""; + if (match) { + match = match[1]; + hexAlpha = match[3]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i] + match[i], 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(hex)) { + hexAlpha = match[2]; + match = match[1]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100; + } + } + else if (match = string.match(rgba)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i + 1]); + } + a = parseFloat(match[4]); + } + else if (match = string.match(per)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); + } + a = parseFloat(match[4]); + } + else if (match = string.match(keyword)) { + if (match[1] == "transparent") { + return [0, 0, 0, 0]; + } + rgb = colorName[match[1]]; + if (!rgb) { + return; + } + } + + for (var i = 0; i < rgb.length; i++) { + rgb[i] = scale(rgb[i], 0, 255); + } + if (!a && a != 0) { + a = 1; + } + else { + a = scale(a, 0, 1); + } + rgb[3] = a; + return rgb; +} + +function getHsla(string) { + if (!string) { + return; + } + var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hsl); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + s = scale(parseFloat(match[2]), 0, 100), + l = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, s, l, a]; + } +} + +function getHwb(string) { + if (!string) { + return; + } + var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hwb); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + w = scale(parseFloat(match[2]), 0, 100), + b = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, w, b, a]; + } +} + +function getRgb(string) { + var rgba = getRgba(string); + return rgba && rgba.slice(0, 3); +} + +function getHsl(string) { + var hsla = getHsla(string); + return hsla && hsla.slice(0, 3); +} + +function getAlpha(string) { + var vals = getRgba(string); + if (vals) { + return vals[3]; + } + else if (vals = getHsla(string)) { + return vals[3]; + } + else if (vals = getHwb(string)) { + return vals[3]; + } +} + +// generators +function hexString(rgba, a) { + var a = (a !== undefined && rgba.length === 3) ? a : rgba[3]; + return "#" + hexDouble(rgba[0]) + + hexDouble(rgba[1]) + + hexDouble(rgba[2]) + + ( + (a >= 0 && a < 1) + ? hexDouble(Math.round(a * 255)) + : "" + ); +} + +function rgbString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return rgbaString(rgba, alpha); + } + return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; +} + +function rgbaString(rgba, alpha) { + if (alpha === undefined) { + alpha = (rgba[3] !== undefined ? rgba[3] : 1); + } + return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + + ", " + alpha + ")"; +} + +function percentString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return percentaString(rgba, alpha); + } + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + + return "rgb(" + r + "%, " + g + "%, " + b + "%)"; +} + +function percentaString(rgba, alpha) { + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; +} + +function hslString(hsla, alpha) { + if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { + return hslaString(hsla, alpha); + } + return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; +} + +function hslaString(hsla, alpha) { + if (alpha === undefined) { + alpha = (hsla[3] !== undefined ? hsla[3] : 1); + } + return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + + alpha + ")"; +} + +// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax +// (hwb have alpha optional & 1 is default value) +function hwbString(hwb, alpha) { + if (alpha === undefined) { + alpha = (hwb[3] !== undefined ? hwb[3] : 1); + } + return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" + + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; +} + +function keyword(rgb) { + return reverseNames[rgb.slice(0, 3)]; +} + +// helpers +function scale(num, min, max) { + return Math.min(Math.max(min, num), max); +} + +function hexDouble(num) { + var str = num.toString(16).toUpperCase(); + return (str.length < 2) ? "0" + str : str; +} + + +//create a list of reverse color names +var reverseNames = {}; +for (var name in colorName) { + reverseNames[colorName[name]] = name; +} + +/* MIT license */ + + + +var Color = function (obj) { + if (obj instanceof Color) { + return obj; + } + if (!(this instanceof Color)) { + return new Color(obj); + } + + this.valid = false; + this.values = { + rgb: [0, 0, 0], + hsl: [0, 0, 0], + hsv: [0, 0, 0], + hwb: [0, 0, 0], + cmyk: [0, 0, 0, 0], + alpha: 1 + }; + + // parse Color() argument + var vals; + if (typeof obj === 'string') { + vals = colorString.getRgba(obj); + if (vals) { + this.setValues('rgb', vals); + } else if (vals = colorString.getHsla(obj)) { + this.setValues('hsl', vals); + } else if (vals = colorString.getHwb(obj)) { + this.setValues('hwb', vals); + } + } else if (typeof obj === 'object') { + vals = obj; + if (vals.r !== undefined || vals.red !== undefined) { + this.setValues('rgb', vals); + } else if (vals.l !== undefined || vals.lightness !== undefined) { + this.setValues('hsl', vals); + } else if (vals.v !== undefined || vals.value !== undefined) { + this.setValues('hsv', vals); + } else if (vals.w !== undefined || vals.whiteness !== undefined) { + this.setValues('hwb', vals); + } else if (vals.c !== undefined || vals.cyan !== undefined) { + this.setValues('cmyk', vals); + } + } +}; + +Color.prototype = { + isValid: function () { + return this.valid; + }, + rgb: function () { + return this.setSpace('rgb', arguments); + }, + hsl: function () { + return this.setSpace('hsl', arguments); + }, + hsv: function () { + return this.setSpace('hsv', arguments); + }, + hwb: function () { + return this.setSpace('hwb', arguments); + }, + cmyk: function () { + return this.setSpace('cmyk', arguments); + }, + + rgbArray: function () { + return this.values.rgb; + }, + hslArray: function () { + return this.values.hsl; + }, + hsvArray: function () { + return this.values.hsv; + }, + hwbArray: function () { + var values = this.values; + if (values.alpha !== 1) { + return values.hwb.concat([values.alpha]); + } + return values.hwb; + }, + cmykArray: function () { + return this.values.cmyk; + }, + rgbaArray: function () { + var values = this.values; + return values.rgb.concat([values.alpha]); + }, + hslaArray: function () { + var values = this.values; + return values.hsl.concat([values.alpha]); + }, + alpha: function (val) { + if (val === undefined) { + return this.values.alpha; + } + this.setValues('alpha', val); + return this; + }, + + red: function (val) { + return this.setChannel('rgb', 0, val); + }, + green: function (val) { + return this.setChannel('rgb', 1, val); + }, + blue: function (val) { + return this.setChannel('rgb', 2, val); + }, + hue: function (val) { + if (val) { + val %= 360; + val = val < 0 ? 360 + val : val; + } + return this.setChannel('hsl', 0, val); + }, + saturation: function (val) { + return this.setChannel('hsl', 1, val); + }, + lightness: function (val) { + return this.setChannel('hsl', 2, val); + }, + saturationv: function (val) { + return this.setChannel('hsv', 1, val); + }, + whiteness: function (val) { + return this.setChannel('hwb', 1, val); + }, + blackness: function (val) { + return this.setChannel('hwb', 2, val); + }, + value: function (val) { + return this.setChannel('hsv', 2, val); + }, + cyan: function (val) { + return this.setChannel('cmyk', 0, val); + }, + magenta: function (val) { + return this.setChannel('cmyk', 1, val); + }, + yellow: function (val) { + return this.setChannel('cmyk', 2, val); + }, + black: function (val) { + return this.setChannel('cmyk', 3, val); + }, + + hexString: function () { + return colorString.hexString(this.values.rgb); + }, + rgbString: function () { + return colorString.rgbString(this.values.rgb, this.values.alpha); + }, + rgbaString: function () { + return colorString.rgbaString(this.values.rgb, this.values.alpha); + }, + percentString: function () { + return colorString.percentString(this.values.rgb, this.values.alpha); + }, + hslString: function () { + return colorString.hslString(this.values.hsl, this.values.alpha); + }, + hslaString: function () { + return colorString.hslaString(this.values.hsl, this.values.alpha); + }, + hwbString: function () { + return colorString.hwbString(this.values.hwb, this.values.alpha); + }, + keyword: function () { + return colorString.keyword(this.values.rgb, this.values.alpha); + }, + + rgbNumber: function () { + var rgb = this.values.rgb; + return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + }, + + luminosity: function () { + // http://www.w3.org/TR/WCAG20/#relativeluminancedef + var rgb = this.values.rgb; + var lum = []; + for (var i = 0; i < rgb.length; i++) { + var chan = rgb[i] / 255; + lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); + } + return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; + }, + + contrast: function (color2) { + // http://www.w3.org/TR/WCAG20/#contrast-ratiodef + var lum1 = this.luminosity(); + var lum2 = color2.luminosity(); + if (lum1 > lum2) { + return (lum1 + 0.05) / (lum2 + 0.05); + } + return (lum2 + 0.05) / (lum1 + 0.05); + }, + + level: function (color2) { + var contrastRatio = this.contrast(color2); + if (contrastRatio >= 7.1) { + return 'AAA'; + } + + return (contrastRatio >= 4.5) ? 'AA' : ''; + }, + + dark: function () { + // YIQ equation from http://24ways.org/2010/calculating-color-contrast + var rgb = this.values.rgb; + var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; + return yiq < 128; + }, + + light: function () { + return !this.dark(); + }, + + negate: function () { + var rgb = []; + for (var i = 0; i < 3; i++) { + rgb[i] = 255 - this.values.rgb[i]; + } + this.setValues('rgb', rgb); + return this; + }, + + lighten: function (ratio) { + var hsl = this.values.hsl; + hsl[2] += hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + darken: function (ratio) { + var hsl = this.values.hsl; + hsl[2] -= hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + saturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] += hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + desaturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] -= hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + whiten: function (ratio) { + var hwb = this.values.hwb; + hwb[1] += hwb[1] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + blacken: function (ratio) { + var hwb = this.values.hwb; + hwb[2] += hwb[2] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + greyscale: function () { + var rgb = this.values.rgb; + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; + this.setValues('rgb', [val, val, val]); + return this; + }, + + clearer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha - (alpha * ratio)); + return this; + }, + + opaquer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha + (alpha * ratio)); + return this; + }, + + rotate: function (degrees) { + var hsl = this.values.hsl; + var hue = (hsl[0] + degrees) % 360; + hsl[0] = hue < 0 ? 360 + hue : hue; + this.setValues('hsl', hsl); + return this; + }, + + /** + * Ported from sass implementation in C + * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 + */ + mix: function (mixinColor, weight) { + var color1 = this; + var color2 = mixinColor; + var p = weight === undefined ? 0.5 : weight; + + var w = 2 * p - 1; + var a = color1.alpha() - color2.alpha(); + + var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + return this + .rgb( + w1 * color1.red() + w2 * color2.red(), + w1 * color1.green() + w2 * color2.green(), + w1 * color1.blue() + w2 * color2.blue() + ) + .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); + }, + + toJSON: function () { + return this.rgb(); + }, + + clone: function () { + // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, + // making the final build way to big to embed in Chart.js. So let's do it manually, + // assuming that values to clone are 1 dimension arrays containing only numbers, + // except 'alpha' which is a number. + var result = new Color(); + var source = this.values; + var target = result.values; + var value, type; + + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + value = source[prop]; + type = ({}).toString.call(value); + if (type === '[object Array]') { + target[prop] = value.slice(0); + } else if (type === '[object Number]') { + target[prop] = value; + } else { + console.error('unexpected color value:', value); + } + } + } + + return result; + } +}; + +Color.prototype.spaces = { + rgb: ['red', 'green', 'blue'], + hsl: ['hue', 'saturation', 'lightness'], + hsv: ['hue', 'saturation', 'value'], + hwb: ['hue', 'whiteness', 'blackness'], + cmyk: ['cyan', 'magenta', 'yellow', 'black'] +}; + +Color.prototype.maxes = { + rgb: [255, 255, 255], + hsl: [360, 100, 100], + hsv: [360, 100, 100], + hwb: [360, 100, 100], + cmyk: [100, 100, 100, 100] +}; + +Color.prototype.getValues = function (space) { + var values = this.values; + var vals = {}; + + for (var i = 0; i < space.length; i++) { + vals[space.charAt(i)] = values[space][i]; + } + + if (values.alpha !== 1) { + vals.a = values.alpha; + } + + // {r: 255, g: 255, b: 255, a: 0.4} + return vals; +}; + +Color.prototype.setValues = function (space, vals) { + var values = this.values; + var spaces = this.spaces; + var maxes = this.maxes; + var alpha = 1; + var i; + + this.valid = true; + + if (space === 'alpha') { + alpha = vals; + } else if (vals.length) { + // [10, 10, 10] + values[space] = vals.slice(0, space.length); + alpha = vals[space.length]; + } else if (vals[space.charAt(0)] !== undefined) { + // {r: 10, g: 10, b: 10} + for (i = 0; i < space.length; i++) { + values[space][i] = vals[space.charAt(i)]; + } + + alpha = vals.a; + } else if (vals[spaces[space][0]] !== undefined) { + // {red: 10, green: 10, blue: 10} + var chans = spaces[space]; + + for (i = 0; i < space.length; i++) { + values[space][i] = vals[chans[i]]; + } + + alpha = vals.alpha; + } + + values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); + + if (space === 'alpha') { + return false; + } + + var capped; + + // cap values of the space prior converting all values + for (i = 0; i < space.length; i++) { + capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); + values[space][i] = Math.round(capped); + } + + // convert to all the other color spaces + for (var sname in spaces) { + if (sname !== space) { + values[sname] = colorConvert[space][sname](values[space]); + } + } + + return true; +}; + +Color.prototype.setSpace = function (space, args) { + var vals = args[0]; + + if (vals === undefined) { + // color.rgb() + return this.getValues(space); + } + + // color.rgb(10, 10, 10) + if (typeof vals === 'number') { + vals = Array.prototype.slice.call(args); + } + + this.setValues(space, vals); + return this; +}; + +Color.prototype.setChannel = function (space, index, val) { + var svalues = this.values[space]; + if (val === undefined) { + // color.red() + return svalues[index]; + } else if (val === svalues[index]) { + // color.red(color.red()) + return this; + } + + // color.red(100) + svalues[index] = val; + this.setValues(space, svalues); + + return this; +}; + +if (typeof window !== 'undefined') { + window.Color = Color; +} + +var chartjsColor = Color; + +/** + * @namespace Chart.helpers + */ +var helpers = { + /** + * An empty function that can be used, for example, for optional callback. + */ + noop: function() {}, + + /** + * Returns a unique id, sequentially generated from a global variable. + * @returns {number} + * @function + */ + uid: (function() { + var id = 0; + return function() { + return id++; + }; + }()), + + /** + * Returns true if `value` is neither null nor undefined, else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isNullOrUndef: function(value) { + return value === null || typeof value === 'undefined'; + }, + + /** + * Returns true if `value` is an array (including typed arrays), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @function + */ + isArray: function(value) { + if (Array.isArray && Array.isArray(value)) { + return true; + } + var type = Object.prototype.toString.call(value); + if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { + return true; + } + return false; + }, + + /** + * Returns true if `value` is an object (excluding null), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isObject: function(value) { + return value !== null && Object.prototype.toString.call(value) === '[object Object]'; + }, + + /** + * Returns true if `value` is a finite number, else returns false + * @param {*} value - The value to test. + * @returns {boolean} + */ + isFinite: function(value) { + return (typeof value === 'number' || value instanceof Number) && isFinite(value); + }, + + /** + * Returns `value` if defined, else returns `defaultValue`. + * @param {*} value - The value to return if defined. + * @param {*} defaultValue - The value to return if `value` is undefined. + * @returns {*} + */ + valueOrDefault: function(value, defaultValue) { + return typeof value === 'undefined' ? defaultValue : value; + }, + + /** + * Returns value at the given `index` in array if defined, else returns `defaultValue`. + * @param {Array} value - The array to lookup for value at `index`. + * @param {number} index - The index in `value` to lookup for value. + * @param {*} defaultValue - The value to return if `value[index]` is undefined. + * @returns {*} + */ + valueAtIndexOrDefault: function(value, index, defaultValue) { + return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); + }, + + /** + * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the + * value returned by `fn`. If `fn` is not a function, this method returns undefined. + * @param {function} fn - The function to call. + * @param {Array|undefined|null} args - The arguments with which `fn` should be called. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @returns {*} + */ + callback: function(fn, args, thisArg) { + if (fn && typeof fn.call === 'function') { + return fn.apply(thisArg, args); + } + }, + + /** + * Note(SB) for performance sake, this method should only be used when loopable type + * is unknown or in none intensive code (not called often and small loopable). Else + * it's preferable to use a regular for() loop and save extra function calls. + * @param {object|Array} loopable - The object or array to be iterated. + * @param {function} fn - The function to call for each item. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @param {boolean} [reverse] - If true, iterates backward on the loopable. + */ + each: function(loopable, fn, thisArg, reverse) { + var i, len, keys; + if (helpers.isArray(loopable)) { + len = loopable.length; + if (reverse) { + for (i = len - 1; i >= 0; i--) { + fn.call(thisArg, loopable[i], i); + } + } else { + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[i], i); + } + } + } else if (helpers.isObject(loopable)) { + keys = Object.keys(loopable); + len = keys.length; + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[keys[i]], keys[i]); + } + } + }, + + /** + * Returns true if the `a0` and `a1` arrays have the same content, else returns false. + * @see https://stackoverflow.com/a/14853974 + * @param {Array} a0 - The array to compare + * @param {Array} a1 - The array to compare + * @returns {boolean} + */ + arrayEquals: function(a0, a1) { + var i, ilen, v0, v1; + + if (!a0 || !a1 || a0.length !== a1.length) { + return false; + } + + for (i = 0, ilen = a0.length; i < ilen; ++i) { + v0 = a0[i]; + v1 = a1[i]; + + if (v0 instanceof Array && v1 instanceof Array) { + if (!helpers.arrayEquals(v0, v1)) { + return false; + } + } else if (v0 !== v1) { + // NOTE: two different object instances will never be equal: {x:20} != {x:20} + return false; + } + } + + return true; + }, + + /** + * Returns a deep copy of `source` without keeping references on objects and arrays. + * @param {*} source - The value to clone. + * @returns {*} + */ + clone: function(source) { + if (helpers.isArray(source)) { + return source.map(helpers.clone); + } + + if (helpers.isObject(source)) { + var target = {}; + var keys = Object.keys(source); + var klen = keys.length; + var k = 0; + + for (; k < klen; ++k) { + target[keys[k]] = helpers.clone(source[keys[k]]); + } + + return target; + } + + return source; + }, + + /** + * The default merger when Chart.helpers.merge is called without merger option. + * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. + * @private + */ + _merger: function(key, target, source, options) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.merge(tval, sval, options); + } else { + target[key] = helpers.clone(sval); + } + }, + + /** + * Merges source[key] in target[key] only if target[key] is undefined. + * @private + */ + _mergerIf: function(key, target, source) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.mergeIf(tval, sval); + } else if (!target.hasOwnProperty(key)) { + target[key] = helpers.clone(sval); + } + }, + + /** + * Recursively deep copies `source` properties into `target` with the given `options`. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @param {object} [options] - Merging options: + * @param {function} [options.merger] - The merge method (key, target, source, options) + * @returns {object} The `target` object. + */ + merge: function(target, source, options) { + var sources = helpers.isArray(source) ? source : [source]; + var ilen = sources.length; + var merge, i, keys, klen, k; + + if (!helpers.isObject(target)) { + return target; + } + + options = options || {}; + merge = options.merger || helpers._merger; + + for (i = 0; i < ilen; ++i) { + source = sources[i]; + if (!helpers.isObject(source)) { + continue; + } + + keys = Object.keys(source); + for (k = 0, klen = keys.length; k < klen; ++k) { + merge(keys[k], target, source, options); + } + } + + return target; + }, + + /** + * Recursively deep copies `source` properties into `target` *only* if not defined in target. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @returns {object} The `target` object. + */ + mergeIf: function(target, source) { + return helpers.merge(target, source, {merger: helpers._mergerIf}); + }, + + /** + * Applies the contents of two or more objects together into the first object. + * @param {object} target - The target object in which all objects are merged into. + * @param {object} arg1 - Object containing additional properties to merge in target. + * @param {object} argN - Additional objects containing properties to merge in target. + * @returns {object} The `target` object. + */ + extend: function(target) { + var setFn = function(value, key) { + target[key] = value; + }; + for (var i = 1, ilen = arguments.length; i < ilen; ++i) { + helpers.each(arguments[i], setFn); + } + return target; + }, + + /** + * Basic javascript inheritance based on the model created in Backbone.js + */ + inherits: function(extensions) { + var me = this; + var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { + return me.apply(this, arguments); + }; + + var Surrogate = function() { + this.constructor = ChartElement; + }; + + Surrogate.prototype = me.prototype; + ChartElement.prototype = new Surrogate(); + ChartElement.extend = helpers.inherits; + + if (extensions) { + helpers.extend(ChartElement.prototype, extensions); + } + + ChartElement.__super__ = me.prototype; + return ChartElement; + } +}; + +var helpers_core = helpers; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.callback instead. + * @function Chart.helpers.callCallback + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +helpers.callCallback = helpers.callback; + +/** + * Provided for backward compatibility, use Array.prototype.indexOf instead. + * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ + * @function Chart.helpers.indexOf + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.indexOf = function(array, item, fromIndex) { + return Array.prototype.indexOf.call(array, item, fromIndex); +}; + +/** + * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. + * @function Chart.helpers.getValueOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueOrDefault = helpers.valueOrDefault; + +/** + * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. + * @function Chart.helpers.getValueAtIndexOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + +/** + * Easing functions adapted from Robert Penner's easing equations. + * @namespace Chart.helpers.easingEffects + * @see http://www.robertpenner.com/easing/ + */ +var effects = { + linear: function(t) { + return t; + }, + + easeInQuad: function(t) { + return t * t; + }, + + easeOutQuad: function(t) { + return -t * (t - 2); + }, + + easeInOutQuad: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t; + } + return -0.5 * ((--t) * (t - 2) - 1); + }, + + easeInCubic: function(t) { + return t * t * t; + }, + + easeOutCubic: function(t) { + return (t = t - 1) * t * t + 1; + }, + + easeInOutCubic: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t; + } + return 0.5 * ((t -= 2) * t * t + 2); + }, + + easeInQuart: function(t) { + return t * t * t * t; + }, + + easeOutQuart: function(t) { + return -((t = t - 1) * t * t * t - 1); + }, + + easeInOutQuart: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t; + } + return -0.5 * ((t -= 2) * t * t * t - 2); + }, + + easeInQuint: function(t) { + return t * t * t * t * t; + }, + + easeOutQuint: function(t) { + return (t = t - 1) * t * t * t * t + 1; + }, + + easeInOutQuint: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t * t; + } + return 0.5 * ((t -= 2) * t * t * t * t + 2); + }, + + easeInSine: function(t) { + return -Math.cos(t * (Math.PI / 2)) + 1; + }, + + easeOutSine: function(t) { + return Math.sin(t * (Math.PI / 2)); + }, + + easeInOutSine: function(t) { + return -0.5 * (Math.cos(Math.PI * t) - 1); + }, + + easeInExpo: function(t) { + return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); + }, + + easeOutExpo: function(t) { + return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; + }, + + easeInOutExpo: function(t) { + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if ((t /= 0.5) < 1) { + return 0.5 * Math.pow(2, 10 * (t - 1)); + } + return 0.5 * (-Math.pow(2, -10 * --t) + 2); + }, + + easeInCirc: function(t) { + if (t >= 1) { + return t; + } + return -(Math.sqrt(1 - t * t) - 1); + }, + + easeOutCirc: function(t) { + return Math.sqrt(1 - (t = t - 1) * t); + }, + + easeInOutCirc: function(t) { + if ((t /= 0.5) < 1) { + return -0.5 * (Math.sqrt(1 - t * t) - 1); + } + return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + + easeInElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + }, + + easeOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; + }, + + easeInOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if ((t /= 0.5) === 2) { + return 1; + } + if (!p) { + p = 0.45; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + if (t < 1) { + return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function(t) { + var s = 1.70158; + return t * t * ((s + 1) * t - s); + }, + + easeOutBack: function(t) { + var s = 1.70158; + return (t = t - 1) * t * ((s + 1) * t + s) + 1; + }, + + easeInOutBack: function(t) { + var s = 1.70158; + if ((t /= 0.5) < 1) { + return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); + } + return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + + easeInBounce: function(t) { + return 1 - effects.easeOutBounce(1 - t); + }, + + easeOutBounce: function(t) { + if (t < (1 / 2.75)) { + return 7.5625 * t * t; + } + if (t < (2 / 2.75)) { + return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; + } + if (t < (2.5 / 2.75)) { + return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; + } + return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; + }, + + easeInOutBounce: function(t) { + if (t < 0.5) { + return effects.easeInBounce(t * 2) * 0.5; + } + return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; + } +}; + +var helpers_easing = { + effects: effects +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.easing.effects instead. + * @function Chart.helpers.easingEffects + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.easingEffects = effects; + +var PI = Math.PI; +var RAD_PER_DEG = PI / 180; +var DOUBLE_PI = PI * 2; +var HALF_PI = PI / 2; +var QUARTER_PI = PI / 4; +var TWO_THIRDS_PI = PI * 2 / 3; + +/** + * @namespace Chart.helpers.canvas + */ +var exports$1 = { + /** + * Clears the entire canvas associated to the given `chart`. + * @param {Chart} chart - The chart for which to clear the canvas. + */ + clear: function(chart) { + chart.ctx.clearRect(0, 0, chart.width, chart.height); + }, + + /** + * Creates a "path" for a rectangle with rounded corners at position (x, y) with a + * given size (width, height) and the same `radius` for all corners. + * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. + * @param {number} x - The x axis of the coordinate for the rectangle starting point. + * @param {number} y - The y axis of the coordinate for the rectangle starting point. + * @param {number} width - The rectangle's width. + * @param {number} height - The rectangle's height. + * @param {number} radius - The rounded amount (in pixels) for the four corners. + * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? + */ + roundedRect: function(ctx, x, y, width, height, radius) { + if (radius) { + var r = Math.min(radius, height / 2, width / 2); + var left = x + r; + var top = y + r; + var right = x + width - r; + var bottom = y + height - r; + + ctx.moveTo(x, top); + if (left < right && top < bottom) { + ctx.arc(left, top, r, -PI, -HALF_PI); + ctx.arc(right, top, r, -HALF_PI, 0); + ctx.arc(right, bottom, r, 0, HALF_PI); + ctx.arc(left, bottom, r, HALF_PI, PI); + } else if (left < right) { + ctx.moveTo(left, y); + ctx.arc(right, top, r, -HALF_PI, HALF_PI); + ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); + } else if (top < bottom) { + ctx.arc(left, top, r, -PI, 0); + ctx.arc(left, bottom, r, 0, PI); + } else { + ctx.arc(left, top, r, -PI, PI); + } + ctx.closePath(); + ctx.moveTo(x, y); + } else { + ctx.rect(x, y, width, height); + } + }, + + drawPoint: function(ctx, style, radius, x, y, rotation) { + var type, xOffset, yOffset, size, cornerRadius; + var rad = (rotation || 0) * RAD_PER_DEG; + + if (style && typeof style === 'object') { + type = style.toString(); + if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { + ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); + return; + } + } + + if (isNaN(radius) || radius <= 0) { + return; + } + + ctx.beginPath(); + + switch (style) { + // Default includes circle + default: + ctx.arc(x, y, radius, 0, DOUBLE_PI); + ctx.closePath(); + break; + case 'triangle': + ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + ctx.closePath(); + break; + case 'rectRounded': + // NOTE: the rounded rect implementation changed to use `arc` instead of + // `quadraticCurveTo` since it generates better results when rect is + // almost a circle. 0.516 (instead of 0.5) produces results with visually + // closer proportion to the previous impl and it is inscribed in the + // circle with `radius`. For more details, see the following PRs: + // https://github.com/chartjs/Chart.js/issues/5597 + // https://github.com/chartjs/Chart.js/issues/5858 + cornerRadius = radius * 0.516; + size = radius - cornerRadius; + xOffset = Math.cos(rad + QUARTER_PI) * size; + yOffset = Math.sin(rad + QUARTER_PI) * size; + ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); + ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); + ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); + ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); + ctx.closePath(); + break; + case 'rect': + if (!rotation) { + size = Math.SQRT1_2 * radius; + ctx.rect(x - size, y - size, 2 * size, 2 * size); + break; + } + rad += QUARTER_PI; + /* falls through */ + case 'rectRot': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + yOffset, y - xOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.lineTo(x - yOffset, y + xOffset); + ctx.closePath(); + break; + case 'crossRot': + rad += QUARTER_PI; + /* falls through */ + case 'cross': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'star': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + rad += QUARTER_PI; + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'line': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + break; + case 'dash': + ctx.moveTo(x, y); + ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); + break; + } + + ctx.fill(); + ctx.stroke(); + }, + + /** + * Returns true if the point is inside the rectangle + * @param {object} point - The point to test + * @param {object} area - The rectangle + * @returns {boolean} + * @private + */ + _isPointInArea: function(point, area) { + var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error. + + return point.x > area.left - epsilon && point.x < area.right + epsilon && + point.y > area.top - epsilon && point.y < area.bottom + epsilon; + }, + + clipArea: function(ctx, area) { + ctx.save(); + ctx.beginPath(); + ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); + ctx.clip(); + }, + + unclipArea: function(ctx) { + ctx.restore(); + }, + + lineTo: function(ctx, previous, target, flip) { + var stepped = target.steppedLine; + if (stepped) { + if (stepped === 'middle') { + var midpoint = (previous.x + target.x) / 2.0; + ctx.lineTo(midpoint, flip ? target.y : previous.y); + ctx.lineTo(midpoint, flip ? previous.y : target.y); + } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) { + ctx.lineTo(previous.x, target.y); + } else { + ctx.lineTo(target.x, previous.y); + } + ctx.lineTo(target.x, target.y); + return; + } + + if (!target.tension) { + ctx.lineTo(target.x, target.y); + return; + } + + ctx.bezierCurveTo( + flip ? previous.controlPointPreviousX : previous.controlPointNextX, + flip ? previous.controlPointPreviousY : previous.controlPointNextY, + flip ? target.controlPointNextX : target.controlPointPreviousX, + flip ? target.controlPointNextY : target.controlPointPreviousY, + target.x, + target.y); + } +}; + +var helpers_canvas = exports$1; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. + * @namespace Chart.helpers.clear + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.clear = exports$1.clear; + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. + * @namespace Chart.helpers.drawRoundedRectangle + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers_core.drawRoundedRectangle = function(ctx) { + ctx.beginPath(); + exports$1.roundedRect.apply(exports$1, arguments); +}; + +var defaults = { + /** + * @private + */ + _set: function(scope, values) { + return helpers_core.merge(this[scope] || (this[scope] = {}), values); + } +}; + +defaults._set('global', { + defaultColor: 'rgba(0,0,0,0.1)', + defaultFontColor: '#666', + defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + defaultFontSize: 12, + defaultFontStyle: 'normal', + defaultLineHeight: 1.2, + showLines: true +}); + +var core_defaults = defaults; + +var valueOrDefault = helpers_core.valueOrDefault; + +/** + * Converts the given font object into a CSS font string. + * @param {object} font - A font object. + * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font + * @private + */ +function toFontString(font) { + if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) { + return null; + } + + return (font.style ? font.style + ' ' : '') + + (font.weight ? font.weight + ' ' : '') + + font.size + 'px ' + + font.family; +} + +/** + * @alias Chart.helpers.options + * @namespace + */ +var helpers_options = { + /** + * Converts the given line height `value` in pixels for a specific font `size`. + * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). + * @param {number} size - The font size (in pixels) used to resolve relative `value`. + * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid). + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height + * @since 2.7.0 + */ + toLineHeight: function(value, size) { + var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); + if (!matches || matches[1] === 'normal') { + return size * 1.2; + } + + value = +matches[2]; + + switch (matches[3]) { + case 'px': + return value; + case '%': + value /= 100; + break; + default: + break; + } + + return size * value; + }, + + /** + * Converts the given value into a padding object with pre-computed width/height. + * @param {number|object} value - If a number, set the value to all TRBL component, + * else, if and object, use defined properties and sets undefined ones to 0. + * @returns {object} The padding values (top, right, bottom, left, width, height) + * @since 2.7.0 + */ + toPadding: function(value) { + var t, r, b, l; + + if (helpers_core.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + top: t, + right: r, + bottom: b, + left: l, + height: t + b, + width: l + r + }; + }, + + /** + * Parses font options and returns the font object. + * @param {object} options - A object that contains font options to be parsed. + * @return {object} The font object. + * @todo Support font.* options and renamed to toFont(). + * @private + */ + _parseFont: function(options) { + var globalDefaults = core_defaults.global; + var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); + var font = { + family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily), + lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size), + size: size, + style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle), + weight: null, + string: '' + }; + + font.string = toFontString(font); + return font; + }, + + /** + * Evaluates the given `inputs` sequentially and returns the first defined value. + * @param {Array} inputs - An array of values, falling back to the last value. + * @param {object} [context] - If defined and the current value is a function, the value + * is called with `context` as first argument and the result becomes the new input. + * @param {number} [index] - If defined and the current value is an array, the value + * at `index` become the new input. + * @since 2.7.0 + */ + resolve: function(inputs, context, index) { + var i, ilen, value; + + for (i = 0, ilen = inputs.length; i < ilen; ++i) { + value = inputs[i]; + if (value === undefined) { + continue; + } + if (context !== undefined && typeof value === 'function') { + value = value(context); + } + if (index !== undefined && helpers_core.isArray(value)) { + value = value[index]; + } + if (value !== undefined) { + return value; + } + } + } +}; + +var helpers$1 = helpers_core; +var easing = helpers_easing; +var canvas = helpers_canvas; +var options = helpers_options; +helpers$1.easing = easing; +helpers$1.canvas = canvas; +helpers$1.options = options; + +function interpolate(start, view, model, ease) { + var keys = Object.keys(model); + var i, ilen, key, actual, origin, target, type, c0, c1; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + + target = model[key]; + + // if a value is added to the model after pivot() has been called, the view + // doesn't contain it, so let's initialize the view to the target value. + if (!view.hasOwnProperty(key)) { + view[key] = target; + } + + actual = view[key]; + + if (actual === target || key[0] === '_') { + continue; + } + + if (!start.hasOwnProperty(key)) { + start[key] = actual; + } + + origin = start[key]; + + type = typeof target; + + if (type === typeof origin) { + if (type === 'string') { + c0 = chartjsColor(origin); + if (c0.valid) { + c1 = chartjsColor(target); + if (c1.valid) { + view[key] = c1.mix(c0, ease).rgbString(); + continue; + } + } + } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) { + view[key] = origin + (target - origin) * ease; + continue; + } + } + + view[key] = target; + } +} + +var Element = function(configuration) { + helpers$1.extend(this, configuration); + this.initialize.apply(this, arguments); +}; + +helpers$1.extend(Element.prototype, { + + initialize: function() { + this.hidden = false; + }, + + pivot: function() { + var me = this; + if (!me._view) { + me._view = helpers$1.clone(me._model); + } + me._start = {}; + return me; + }, + + transition: function(ease) { + var me = this; + var model = me._model; + var start = me._start; + var view = me._view; + + // No animation -> No Transition + if (!model || ease === 1) { + me._view = model; + me._start = null; + return me; + } + + if (!view) { + view = me._view = {}; + } + + if (!start) { + start = me._start = {}; + } + + interpolate(start, view, model, ease); + + return me; + }, + + tooltipPosition: function() { + return { + x: this._model.x, + y: this._model.y + }; + }, + + hasValue: function() { + return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y); + } +}); + +Element.extend = helpers$1.inherits; + +var core_element = Element; + +var exports$2 = core_element.extend({ + chart: null, // the animation associated chart instance + currentStep: 0, // the current animation step + numSteps: 60, // default number of steps + easing: '', // the easing to use for this animation + render: null, // render function used by the animation service + + onAnimationProgress: null, // user specified callback to fire on each step of the animation + onAnimationComplete: null, // user specified callback to fire when the animation finishes +}); + +var core_animation = exports$2; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.Animation instead + * @prop Chart.Animation#animationObject + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$2.prototype, 'animationObject', { + get: function() { + return this; + } +}); + +/** + * Provided for backward compatibility, use Chart.Animation#chart instead + * @prop Chart.Animation#chartInstance + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ +Object.defineProperty(exports$2.prototype, 'chartInstance', { + get: function() { + return this.chart; + }, + set: function(value) { + this.chart = value; + } +}); + +core_defaults._set('global', { + animation: { + duration: 1000, + easing: 'easeOutQuart', + onProgress: helpers$1.noop, + onComplete: helpers$1.noop + } +}); + +var core_animations = { + animations: [], + request: null, + + /** + * @param {Chart} chart - The chart to animate. + * @param {Chart.Animation} animation - The animation that we will animate. + * @param {number} duration - The animation duration in ms. + * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions + */ + addAnimation: function(chart, animation, duration, lazy) { + var animations = this.animations; + var i, ilen; + + animation.chart = chart; + animation.startTime = Date.now(); + animation.duration = duration; + + if (!lazy) { + chart.animating = true; + } + + for (i = 0, ilen = animations.length; i < ilen; ++i) { + if (animations[i].chart === chart) { + animations[i] = animation; + return; + } + } + + animations.push(animation); + + // If there are no animations queued, manually kickstart a digest, for lack of a better word + if (animations.length === 1) { + this.requestAnimationFrame(); + } + }, + + cancelAnimation: function(chart) { + var index = helpers$1.findIndex(this.animations, function(animation) { + return animation.chart === chart; + }); + + if (index !== -1) { + this.animations.splice(index, 1); + chart.animating = false; + } + }, + + requestAnimationFrame: function() { + var me = this; + if (me.request === null) { + // Skip animation frame requests until the active one is executed. + // This can happen when processing mouse events, e.g. 'mousemove' + // and 'mouseout' events will trigger multiple renders. + me.request = helpers$1.requestAnimFrame.call(window, function() { + me.request = null; + me.startDigest(); + }); + } + }, + + /** + * @private + */ + startDigest: function() { + var me = this; + + me.advance(); + + // Do we have more stuff to animate? + if (me.animations.length > 0) { + me.requestAnimationFrame(); + } + }, + + /** + * @private + */ + advance: function() { + var animations = this.animations; + var animation, chart, numSteps, nextStep; + var i = 0; + + // 1 animation per chart, so we are looping charts here + while (i < animations.length) { + animation = animations[i]; + chart = animation.chart; + numSteps = animation.numSteps; + + // Make sure that currentStep starts at 1 + // https://github.com/chartjs/Chart.js/issues/6104 + nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1; + animation.currentStep = Math.min(nextStep, numSteps); + + helpers$1.callback(animation.render, [chart, animation], chart); + helpers$1.callback(animation.onAnimationProgress, [animation], chart); + + if (animation.currentStep >= numSteps) { + helpers$1.callback(animation.onAnimationComplete, [animation], chart); + chart.animating = false; + animations.splice(i, 1); + } else { + ++i; + } + } + } +}; + +var resolve = helpers$1.options.resolve; + +var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; + +/** + * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', + * 'unshift') and notify the listener AFTER the array has been altered. Listeners are + * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. + */ +function listenArrayEvents(array, listener) { + if (array._chartjs) { + array._chartjs.listeners.push(listener); + return; + } + + Object.defineProperty(array, '_chartjs', { + configurable: true, + enumerable: false, + value: { + listeners: [listener] + } + }); + + arrayEvents.forEach(function(key) { + var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); + var base = array[key]; + + Object.defineProperty(array, key, { + configurable: true, + enumerable: false, + value: function() { + var args = Array.prototype.slice.call(arguments); + var res = base.apply(this, args); + + helpers$1.each(array._chartjs.listeners, function(object) { + if (typeof object[method] === 'function') { + object[method].apply(object, args); + } + }); + + return res; + } + }); + }); +} + +/** + * Removes the given array event listener and cleanup extra attached properties (such as + * the _chartjs stub and overridden methods) if array doesn't have any more listeners. + */ +function unlistenArrayEvents(array, listener) { + var stub = array._chartjs; + if (!stub) { + return; + } + + var listeners = stub.listeners; + var index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + + if (listeners.length > 0) { + return; + } + + arrayEvents.forEach(function(key) { + delete array[key]; + }); + + delete array._chartjs; +} + +// Base class for all dataset controllers (line, bar, etc) +var DatasetController = function(chart, datasetIndex) { + this.initialize(chart, datasetIndex); +}; + +helpers$1.extend(DatasetController.prototype, { + + /** + * Element type used to generate a meta dataset (e.g. Chart.element.Line). + * @type {Chart.core.element} + */ + datasetElementType: null, + + /** + * Element type used to generate a meta data (e.g. Chart.element.Point). + * @type {Chart.core.element} + */ + dataElementType: null, + + initialize: function(chart, datasetIndex) { + var me = this; + me.chart = chart; + me.index = datasetIndex; + me.linkScales(); + me.addElements(); + }, + + updateIndex: function(datasetIndex) { + this.index = datasetIndex; + }, + + linkScales: function() { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + + if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) { + meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; + } + if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) { + meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; + } + }, + + getDataset: function() { + return this.chart.data.datasets[this.index]; + }, + + getMeta: function() { + return this.chart.getDatasetMeta(this.index); + }, + + getScaleForId: function(scaleID) { + return this.chart.scales[scaleID]; + }, + + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().yAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getValueScale: function() { + return this.getScaleForId(this._getValueScaleId()); + }, + + /** + * @private + */ + _getIndexScale: function() { + return this.getScaleForId(this._getIndexScaleId()); + }, + + reset: function() { + this.update(true); + }, + + /** + * @private + */ + destroy: function() { + if (this._data) { + unlistenArrayEvents(this._data, this); + } + }, + + createMetaDataset: function() { + var me = this; + var type = me.datasetElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index + }); + }, + + createMetaData: function(index) { + var me = this; + var type = me.dataElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index, + _index: index + }); + }, + + addElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data || []; + var metaData = meta.data; + var i, ilen; + + for (i = 0, ilen = data.length; i < ilen; ++i) { + metaData[i] = metaData[i] || me.createMetaData(i); + } + + meta.dataset = meta.dataset || me.createMetaDataset(); + }, + + addElementAndReset: function(index) { + var element = this.createMetaData(index); + this.getMeta().data.splice(index, 0, element); + this.updateElement(element, index, true); + }, + + buildOrUpdateElements: function() { + var me = this; + var dataset = me.getDataset(); + var data = dataset.data || (dataset.data = []); + + // In order to correctly handle data addition/deletion animation (an thus simulate + // real-time charts), we need to monitor these data modifications and synchronize + // the internal meta data accordingly. + if (me._data !== data) { + if (me._data) { + // This case happens when the user replaced the data array instance. + unlistenArrayEvents(me._data, me); + } + + if (data && Object.isExtensible(data)) { + listenArrayEvents(data, me); + } + me._data = data; + } + + // Re-sync meta data in case the user replaced the data array or if we missed + // any updates and so make sure that we handle number of datapoints changing. + me.resyncElements(); + }, + + update: helpers$1.noop, + + transition: function(easingValue) { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + for (; i < ilen; ++i) { + elements[i].transition(easingValue); + } + + if (meta.dataset) { + meta.dataset.transition(easingValue); + } + }, + + draw: function() { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + if (meta.dataset) { + meta.dataset.draw(); + } + + for (; i < ilen; ++i) { + elements[i].draw(); + } + }, + + removeHoverStyle: function(element) { + helpers$1.merge(element._model, element.$previousStyle || {}); + delete element.$previousStyle; + }, + + setHoverStyle: function(element) { + var dataset = this.chart.data.datasets[element._datasetIndex]; + var index = element._index; + var custom = element.custom || {}; + var model = element._model; + var getHoverColor = helpers$1.getHoverColor; + + element.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth + }; + + model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index); + model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index); + model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index); + }, + + /** + * @private + */ + resyncElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data; + var numMeta = meta.data.length; + var numData = data.length; + + if (numData < numMeta) { + meta.data.splice(numData, numMeta - numData); + } else if (numData > numMeta) { + me.insertElements(numMeta, numData - numMeta); + } + }, + + /** + * @private + */ + insertElements: function(start, count) { + for (var i = 0; i < count; ++i) { + this.addElementAndReset(start + i); + } + }, + + /** + * @private + */ + onDataPush: function() { + var count = arguments.length; + this.insertElements(this.getDataset().data.length - count, count); + }, + + /** + * @private + */ + onDataPop: function() { + this.getMeta().data.pop(); + }, + + /** + * @private + */ + onDataShift: function() { + this.getMeta().data.shift(); + }, + + /** + * @private + */ + onDataSplice: function(start, count) { + this.getMeta().data.splice(start, count); + this.insertElements(start, arguments.length - 2); + }, + + /** + * @private + */ + onDataUnshift: function() { + this.insertElements(0, arguments.length); + } +}); + +DatasetController.extend = helpers$1.inherits; + +var core_datasetController = DatasetController; + +core_defaults._set('global', { + elements: { + arc: { + backgroundColor: core_defaults.global.defaultColor, + borderColor: '#fff', + borderWidth: 2, + borderAlign: 'center' + } + } +}); + +var element_arc = core_element.extend({ + inLabelRange: function(mouseX) { + var vm = this._view; + + if (vm) { + return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); + } + return false; + }, + + inRange: function(chartX, chartY) { + var vm = this._view; + + if (vm) { + var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY}); + var angle = pointRelativePosition.angle; + var distance = pointRelativePosition.distance; + + // Sanitise angle range + var startAngle = vm.startAngle; + var endAngle = vm.endAngle; + while (endAngle < startAngle) { + endAngle += 2.0 * Math.PI; + } + while (angle > endAngle) { + angle -= 2.0 * Math.PI; + } + while (angle < startAngle) { + angle += 2.0 * Math.PI; + } + + // Check if within the range of the open/close angle + var betweenAngles = (angle >= startAngle && angle <= endAngle); + var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); + + return (betweenAngles && withinRadius); + } + return false; + }, + + getCenterPoint: function() { + var vm = this._view; + var halfAngle = (vm.startAngle + vm.endAngle) / 2; + var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; + return { + x: vm.x + Math.cos(halfAngle) * halfRadius, + y: vm.y + Math.sin(halfAngle) * halfRadius + }; + }, + + getArea: function() { + var vm = this._view; + return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); + }, + + tooltipPosition: function() { + var vm = this._view; + var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); + var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; + + return { + x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), + y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var sA = vm.startAngle; + var eA = vm.endAngle; + var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0; + var angleMargin; + + ctx.save(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.fillStyle = vm.backgroundColor; + ctx.fill(); + + if (vm.borderWidth) { + if (vm.borderAlign === 'inner') { + // Draw an inner border by cliping the arc and drawing a double-width border + // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders + ctx.beginPath(); + angleMargin = pixelMargin / vm.outerRadius; + ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin); + if (vm.innerRadius > pixelMargin) { + angleMargin = pixelMargin / vm.innerRadius; + ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true); + } else { + ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2); + } + ctx.closePath(); + ctx.clip(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.lineWidth = vm.borderWidth * 2; + ctx.lineJoin = 'round'; + } else { + ctx.lineWidth = vm.borderWidth; + ctx.lineJoin = 'bevel'; + } + + ctx.strokeStyle = vm.borderColor; + ctx.stroke(); + } + + ctx.restore(); + } +}); + +var valueOrDefault$1 = helpers$1.valueOrDefault; + +var defaultColor = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + line: { + tension: 0.4, + backgroundColor: defaultColor, + borderWidth: 3, + borderColor: defaultColor, + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + capBezierPoints: true, + fill: true, // do we fill in the area between the line and its base axis + } + } +}); + +var element_line = core_element.extend({ + draw: function() { + var me = this; + var vm = me._view; + var ctx = me._chart.ctx; + var spanGaps = vm.spanGaps; + var points = me._children.slice(); // clone array + var globalDefaults = core_defaults.global; + var globalOptionLineElements = globalDefaults.elements.line; + var lastDrawnIndex = -1; + var index, current, previous, currentVM; + + // If we are looping, adding the first point again + if (me._loop && points.length) { + points.push(points[0]); + } + + ctx.save(); + + // Stroke Line Options + ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; + + // IE 9 and 10 do not support line dash + if (ctx.setLineDash) { + ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); + } + + ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset); + ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; + ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth); + ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; + + // Stroke Line + ctx.beginPath(); + lastDrawnIndex = -1; + + for (index = 0; index < points.length; ++index) { + current = points[index]; + previous = helpers$1.previousItem(points, index); + currentVM = current._view; + + // First point moves to it's starting position no matter what + if (index === 0) { + if (!currentVM.skip) { + ctx.moveTo(currentVM.x, currentVM.y); + lastDrawnIndex = index; + } + } else { + previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; + + if (!currentVM.skip) { + if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { + // There was a gap and this is the first point after the gap + ctx.moveTo(currentVM.x, currentVM.y); + } else { + // Line to next point + helpers$1.canvas.lineTo(ctx, previous._view, current._view); + } + lastDrawnIndex = index; + } + } + } + + ctx.stroke(); + ctx.restore(); + } +}); + +var valueOrDefault$2 = helpers$1.valueOrDefault; + +var defaultColor$1 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + point: { + radius: 3, + pointStyle: 'circle', + backgroundColor: defaultColor$1, + borderColor: defaultColor$1, + borderWidth: 1, + // Hover + hitRadius: 1, + hoverRadius: 4, + hoverBorderWidth: 1 + } + } +}); + +function xRange(mouseX) { + var vm = this._view; + return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false; +} + +function yRange(mouseY) { + var vm = this._view; + return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false; +} + +var element_point = core_element.extend({ + inRange: function(mouseX, mouseY) { + var vm = this._view; + return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; + }, + + inLabelRange: xRange, + inXRange: xRange, + inYRange: yRange, + + getCenterPoint: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + }, + + getArea: function() { + return Math.PI * Math.pow(this._view.radius, 2); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y, + padding: vm.radius + vm.borderWidth + }; + }, + + draw: function(chartArea) { + var vm = this._view; + var ctx = this._chart.ctx; + var pointStyle = vm.pointStyle; + var rotation = vm.rotation; + var radius = vm.radius; + var x = vm.x; + var y = vm.y; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow + + if (vm.skip) { + return; + } + + // Clipping for Points. + if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) { + ctx.strokeStyle = vm.borderColor || defaultColor; + ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth); + ctx.fillStyle = vm.backgroundColor || defaultColor; + helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation); + } + } +}); + +var defaultColor$2 = core_defaults.global.defaultColor; + +core_defaults._set('global', { + elements: { + rectangle: { + backgroundColor: defaultColor$2, + borderColor: defaultColor$2, + borderSkipped: 'bottom', + borderWidth: 0 + } + } +}); + +function isVertical(vm) { + return vm && vm.width !== undefined; +} + +/** + * Helper function to get the bounds of the bar regardless of the orientation + * @param bar {Chart.Element.Rectangle} the bar + * @return {Bounds} bounds of the bar + * @private + */ +function getBarBounds(vm) { + var x1, x2, y1, y2, half; + + if (isVertical(vm)) { + half = vm.width / 2; + x1 = vm.x - half; + x2 = vm.x + half; + y1 = Math.min(vm.y, vm.base); + y2 = Math.max(vm.y, vm.base); + } else { + half = vm.height / 2; + x1 = Math.min(vm.x, vm.base); + x2 = Math.max(vm.x, vm.base); + y1 = vm.y - half; + y2 = vm.y + half; + } + + return { + left: x1, + top: y1, + right: x2, + bottom: y2 + }; +} + +function swap(orig, v1, v2) { + return orig === v1 ? v2 : orig === v2 ? v1 : orig; +} + +function parseBorderSkipped(vm) { + var edge = vm.borderSkipped; + var res = {}; + + if (!edge) { + return res; + } + + if (vm.horizontal) { + if (vm.base > vm.x) { + edge = swap(edge, 'left', 'right'); + } + } else if (vm.base < vm.y) { + edge = swap(edge, 'bottom', 'top'); + } + + res[edge] = true; + return res; +} + +function parseBorderWidth(vm, maxW, maxH) { + var value = vm.borderWidth; + var skip = parseBorderSkipped(vm); + var t, r, b, l; + + if (helpers$1.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t, + r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r, + b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b, + l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l + }; +} + +function boundingRects(vm) { + var bounds = getBarBounds(vm); + var width = bounds.right - bounds.left; + var height = bounds.bottom - bounds.top; + var border = parseBorderWidth(vm, width / 2, height / 2); + + return { + outer: { + x: bounds.left, + y: bounds.top, + w: width, + h: height + }, + inner: { + x: bounds.left + border.l, + y: bounds.top + border.t, + w: width - border.l - border.r, + h: height - border.t - border.b + } + }; +} + +function inRange(vm, x, y) { + var skipX = x === null; + var skipY = y === null; + var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm); + + return bounds + && (skipX || x >= bounds.left && x <= bounds.right) + && (skipY || y >= bounds.top && y <= bounds.bottom); +} + +var element_rectangle = core_element.extend({ + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var rects = boundingRects(vm); + var outer = rects.outer; + var inner = rects.inner; + + ctx.fillStyle = vm.backgroundColor; + ctx.fillRect(outer.x, outer.y, outer.w, outer.h); + + if (outer.w === inner.w && outer.h === inner.h) { + return; + } + + ctx.save(); + ctx.beginPath(); + ctx.rect(outer.x, outer.y, outer.w, outer.h); + ctx.clip(); + ctx.fillStyle = vm.borderColor; + ctx.rect(inner.x, inner.y, inner.w, inner.h); + ctx.fill('evenodd'); + ctx.restore(); + }, + + height: function() { + var vm = this._view; + return vm.base - vm.y; + }, + + inRange: function(mouseX, mouseY) { + return inRange(this._view, mouseX, mouseY); + }, + + inLabelRange: function(mouseX, mouseY) { + var vm = this._view; + return isVertical(vm) + ? inRange(vm, mouseX, null) + : inRange(vm, null, mouseY); + }, + + inXRange: function(mouseX) { + return inRange(this._view, mouseX, null); + }, + + inYRange: function(mouseY) { + return inRange(this._view, null, mouseY); + }, + + getCenterPoint: function() { + var vm = this._view; + var x, y; + if (isVertical(vm)) { + x = vm.x; + y = (vm.y + vm.base) / 2; + } else { + x = (vm.x + vm.base) / 2; + y = vm.y; + } + + return {x: x, y: y}; + }, + + getArea: function() { + var vm = this._view; + + return isVertical(vm) + ? vm.width * Math.abs(vm.y - vm.base) + : vm.height * Math.abs(vm.x - vm.base); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + } +}); + +var elements = {}; +var Arc = element_arc; +var Line = element_line; +var Point = element_point; +var Rectangle = element_rectangle; +elements.Arc = Arc; +elements.Line = Line; +elements.Point = Point; +elements.Rectangle = Rectangle; + +var resolve$1 = helpers$1.options.resolve; + +core_defaults._set('bar', { + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }], + + yAxes: [{ + type: 'linear' + }] + } +}); + +/** + * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. + * @private + */ +function computeMinSampleSize(scale, pixels) { + var min = scale.isHorizontal() ? scale.width : scale.height; + var ticks = scale.getTicks(); + var prev, curr, i, ilen; + + for (i = 1, ilen = pixels.length; i < ilen; ++i) { + min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1])); + } + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + curr = scale.getPixelForTick(i); + min = i > 0 ? Math.min(min, curr - prev) : min; + prev = curr; + } + + return min; +} + +/** + * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, + * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This + * mode currently always generates bars equally sized (until we introduce scriptable options?). + * @private + */ +function computeFitCategoryTraits(index, ruler, options) { + var thickness = options.barThickness; + var count = ruler.stackCount; + var curr = ruler.pixels[index]; + var size, ratio; + + if (helpers$1.isNullOrUndef(thickness)) { + size = ruler.min * options.categoryPercentage; + ratio = options.barPercentage; + } else { + // When bar thickness is enforced, category and bar percentages are ignored. + // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') + // and deprecate barPercentage since this value is ignored when thickness is absolute. + size = thickness * count; + ratio = 1; + } + + return { + chunk: size / count, + ratio: ratio, + start: curr - (size / 2) + }; +} + +/** + * Computes an "optimal" category that globally arranges bars side by side (no gap when + * percentage options are 1), based on the previous and following categories. This mode + * generates bars with different widths when data are not evenly spaced. + * @private + */ +function computeFlexCategoryTraits(index, ruler, options) { + var pixels = ruler.pixels; + var curr = pixels[index]; + var prev = index > 0 ? pixels[index - 1] : null; + var next = index < pixels.length - 1 ? pixels[index + 1] : null; + var percent = options.categoryPercentage; + var start, size; + + if (prev === null) { + // first data: its size is double based on the next point or, + // if it's also the last data, we use the scale size. + prev = curr - (next === null ? ruler.end - ruler.start : next - curr); + } + + if (next === null) { + // last data: its size is also double based on the previous point. + next = curr + curr - prev; + } + + start = curr - (curr - Math.min(prev, next)) / 2 * percent; + size = Math.abs(next - prev) / 2 * percent; + + return { + chunk: size / ruler.stackCount, + ratio: options.barPercentage, + start: start + }; +} + +var controller_bar = core_datasetController.extend({ + + dataElementType: elements.Rectangle, + + initialize: function() { + var me = this; + var meta; + + core_datasetController.prototype.initialize.apply(me, arguments); + + meta = me.getMeta(); + meta.stack = me.getDataset().stack; + meta.bar = true; + }, + + update: function(reset) { + var me = this; + var rects = me.getMeta().data; + var i, ilen; + + me._ruler = me.getRuler(); + + for (i = 0, ilen = rects.length; i < ilen; ++i) { + me.updateElement(rects[i], i, reset); + } + }, + + updateElement: function(rectangle, index, reset) { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + var options = me._resolveElementOptions(rectangle, index); + + rectangle._xScale = me.getScaleForId(meta.xAxisID); + rectangle._yScale = me.getScaleForId(meta.yAxisID); + rectangle._datasetIndex = me.index; + rectangle._index = index; + rectangle._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderSkipped: options.borderSkipped, + borderWidth: options.borderWidth, + datasetLabel: dataset.label, + label: me.chart.data.labels[index] + }; + + me._updateElementGeometry(rectangle, index, reset); + + rectangle.pivot(); + }, + + /** + * @private + */ + _updateElementGeometry: function(rectangle, index, reset) { + var me = this; + var model = rectangle._model; + var vscale = me._getValueScale(); + var base = vscale.getBasePixel(); + var horizontal = vscale.isHorizontal(); + var ruler = me._ruler || me.getRuler(); + var vpixels = me.calculateBarValuePixels(me.index, index); + var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); + + model.horizontal = horizontal; + model.base = reset ? base : vpixels.base; + model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; + model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; + model.height = horizontal ? ipixels.size : undefined; + model.width = horizontal ? undefined : ipixels.size; + }, + + /** + * Returns the stacks based on groups and bar visibility. + * @param {number} [last] - The dataset index + * @returns {string[]} The list of stack IDs + * @private + */ + _getStacks: function(last) { + var me = this; + var chart = me.chart; + var scale = me._getIndexScale(); + var stacked = scale.options.stacked; + var ilen = last === undefined ? chart.data.datasets.length : last + 1; + var stacks = []; + var i, meta; + + for (i = 0; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + if (meta.bar && chart.isDatasetVisible(i) && + (stacked === false || + (stacked === true && stacks.indexOf(meta.stack) === -1) || + (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { + stacks.push(meta.stack); + } + } + + return stacks; + }, + + /** + * Returns the effective number of stacks based on groups and bar visibility. + * @private + */ + getStackCount: function() { + return this._getStacks().length; + }, + + /** + * Returns the stack index for the given dataset based on groups and bar visibility. + * @param {number} [datasetIndex] - The dataset index + * @param {string} [name] - The stack name to find + * @returns {number} The stack index + * @private + */ + getStackIndex: function(datasetIndex, name) { + var stacks = this._getStacks(datasetIndex); + var index = (name !== undefined) + ? stacks.indexOf(name) + : -1; // indexOf returns -1 if element is not present + + return (index === -1) + ? stacks.length - 1 + : index; + }, + + /** + * @private + */ + getRuler: function() { + var me = this; + var scale = me._getIndexScale(); + var stackCount = me.getStackCount(); + var datasetIndex = me.index; + var isHorizontal = scale.isHorizontal(); + var start = isHorizontal ? scale.left : scale.top; + var end = start + (isHorizontal ? scale.width : scale.height); + var pixels = []; + var i, ilen, min; + + for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { + pixels.push(scale.getPixelForValue(null, i, datasetIndex)); + } + + min = helpers$1.isNullOrUndef(scale.options.barThickness) + ? computeMinSampleSize(scale, pixels) + : -1; + + return { + min: min, + pixels: pixels, + start: start, + end: end, + stackCount: stackCount, + scale: scale + }; + }, + + /** + * Note: pixel values are not clamped to the scale area. + * @private + */ + calculateBarValuePixels: function(datasetIndex, index) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var scale = me._getValueScale(); + var isHorizontal = scale.isHorizontal(); + var datasets = chart.data.datasets; + var value = +scale.getRightValue(datasets[datasetIndex].data[index]); + var minBarLength = scale.options.minBarLength; + var stacked = scale.options.stacked; + var stack = meta.stack; + var start = 0; + var i, imeta, ivalue, base, head, size; + + if (stacked || (stacked === undefined && stack !== undefined)) { + for (i = 0; i < datasetIndex; ++i) { + imeta = chart.getDatasetMeta(i); + + if (imeta.bar && + imeta.stack === stack && + imeta.controller._getValueScaleId() === scale.id && + chart.isDatasetVisible(i)) { + + ivalue = +scale.getRightValue(datasets[i].data[index]); + if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { + start += ivalue; + } + } + } + } + + base = scale.getPixelForValue(start); + head = scale.getPixelForValue(start + value); + size = head - base; + + if (minBarLength !== undefined && Math.abs(size) < minBarLength) { + size = minBarLength; + if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) { + head = base - minBarLength; + } else { + head = base + minBarLength; + } + } + + return { + size: size, + base: base, + head: head, + center: head + size / 2 + }; + }, + + /** + * @private + */ + calculateBarIndexPixels: function(datasetIndex, index, ruler) { + var me = this; + var options = ruler.scale.options; + var range = options.barThickness === 'flex' + ? computeFlexCategoryTraits(index, ruler, options) + : computeFitCategoryTraits(index, ruler, options); + + var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); + var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); + var size = Math.min( + helpers$1.valueOrDefault(options.maxBarThickness, Infinity), + range.chunk * range.ratio); + + return { + base: center - size / 2, + head: center + size / 2, + center: center, + size: size + }; + }, + + draw: function() { + var me = this; + var chart = me.chart; + var scale = me._getValueScale(); + var rects = me.getMeta().data; + var dataset = me.getDataset(); + var ilen = rects.length; + var i = 0; + + helpers$1.canvas.clipArea(chart.ctx, chart.chartArea); + + for (; i < ilen; ++i) { + if (!isNaN(scale.getRightValue(dataset.data[i]))) { + rects[i].draw(); + } + } + + helpers$1.canvas.unclipArea(chart.ctx); + }, + + /** + * @private + */ + _resolveElementOptions: function(rectangle, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = rectangle.custom || {}; + var options = chart.options.elements.rectangle; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderSkipped', + 'borderWidth' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$1([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + } +}); + +var valueOrDefault$3 = helpers$1.valueOrDefault; +var resolve$2 = helpers$1.options.resolve; + +core_defaults._set('bubble', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + type: 'linear', // bubble should probably use a linear scale by default + position: 'bottom', + id: 'x-axis-0' // need an ID so datasets can reference the scale + }], + yAxes: [{ + type: 'linear', + position: 'left', + id: 'y-axis-0' + }] + }, + + tooltips: { + callbacks: { + title: function() { + // Title doesn't make sense for scatter since we format the data as a point + return ''; + }, + label: function(item, data) { + var datasetLabel = data.datasets[item.datasetIndex].label || ''; + var dataPoint = data.datasets[item.datasetIndex].data[item.index]; + return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; + } + } + } +}); + +var controller_bubble = core_datasetController.extend({ + /** + * @protected + */ + dataElementType: elements.Point, + + /** + * @protected + */ + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var points = meta.data; + + // Update Points + helpers$1.each(points, function(point, index) { + me.updateElement(point, index, reset); + }); + }, + + /** + * @protected + */ + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var xScale = me.getScaleForId(meta.xAxisID); + var yScale = me.getScaleForId(meta.yAxisID); + var options = me._resolveElementOptions(point, index); + var data = me.getDataset().data[index]; + var dsIndex = me.index; + + var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); + var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); + + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = dsIndex; + point._index = index; + point._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + hitRadius: options.hitRadius, + pointStyle: options.pointStyle, + rotation: options.rotation, + radius: reset ? 0 : options.radius, + skip: custom.skip || isNaN(x) || isNaN(y), + x: x, + y: y, + }; + + point.pivot(); + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth); + model.radius = options.radius + options.hoverRadius; + }, + + /** + * @private + */ + _resolveElementOptions: function(point, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = point.custom || {}; + var options = chart.options.elements.point; + var data = dataset.data[index]; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + 'hoverRadius', + 'hitRadius', + 'pointStyle', + 'rotation' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$2([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + // Custom radius resolution + values.radius = resolve$2([ + custom.radius, + data ? data.r : undefined, + dataset.radius, + options.radius + ], context, index); + + return values; + } +}); + +var resolve$3 = helpers$1.options.resolve; +var valueOrDefault$4 = helpers$1.valueOrDefault; + +core_defaults._set('doughnut', { + animation: { + // Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + // Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false + }, + hover: { + mode: 'single' + }, + legendCallback: function(chart) { + var text = []; + text.push('<ul class="' + chart.id + '-legend">'); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('<li><span style="background-color:' + datasets[0].backgroundColor[i] + '"></span>'); + if (labels[i]) { + text.push(labels[i]); + } + text.push('</li>'); + } + } + + text.push('</ul>'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc && arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + // toggle visibility of index if exists + if (meta.data[index]) { + meta.data[index].hidden = !meta.data[index].hidden; + } + } + + chart.update(); + } + }, + + // The percentage of the chart that we cut out of the middle. + cutoutPercentage: 50, + + // The rotation of the chart, where the first data arc begins. + rotation: Math.PI * -0.5, + + // The total circumference of the chart. + circumference: Math.PI * 2.0, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(tooltipItem, data) { + var dataLabel = data.labels[tooltipItem.index]; + var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; + + if (helpers$1.isArray(dataLabel)) { + // show value on first line of multiline label + // need to clone because we are changing the value + dataLabel = dataLabel.slice(); + dataLabel[0] += value; + } else { + dataLabel += value; + } + + return dataLabel; + } + } + } +}); + +var controller_doughnut = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly + getRingIndex: function(datasetIndex) { + var ringIndex = 0; + + for (var j = 0; j < datasetIndex; ++j) { + if (this.chart.isDatasetVisible(j)) { + ++ringIndex; + } + } + + return ringIndex; + }, + + update: function(reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var availableWidth = chartArea.right - chartArea.left; + var availableHeight = chartArea.bottom - chartArea.top; + var minSize = Math.min(availableWidth, availableHeight); + var offset = {x: 0, y: 0}; + var meta = me.getMeta(); + var arcs = meta.data; + var cutoutPercentage = opts.cutoutPercentage; + var circumference = opts.circumference; + var chartWeight = me._getRingWeight(me.index); + var i, ilen; + + // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc + if (circumference < Math.PI * 2.0) { + var startAngle = opts.rotation % (Math.PI * 2.0); + startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); + var endAngle = startAngle + circumference; + var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; + var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; + var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); + var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); + var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); + var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); + var cutout = cutoutPercentage / 100.0; + var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; + var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; + var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; + minSize = Math.min(availableWidth / size.width, availableHeight / size.height); + offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + } + + chart.borderWidth = me.getMaxBorderWidth(); + chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); + chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1); + chart.offsetX = offset.x * chart.outerRadius; + chart.offsetY = offset.y * chart.outerRadius; + + meta.total = me.calculateTotal(); + + me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index); + me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0); + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + me.updateElement(arcs[i], i, reset); + } + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var animationOpts = opts.animation; + var centerX = (chartArea.left + chartArea.right) / 2; + var centerY = (chartArea.top + chartArea.bottom) / 2; + var startAngle = opts.rotation; // non reset case handled later + var endAngle = opts.rotation; // non reset case handled later + var dataset = me.getDataset(); + var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); + var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; + var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX + chart.offsetX, + y: centerY + chart.offsetY, + startAngle: startAngle, + endAngle: endAngle, + circumference: circumference, + outerRadius: outerRadius, + innerRadius: innerRadius, + label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) + } + }); + + var model = arc._model; + + // Set correct angles if not resetting + if (!reset || !animationOpts.animateRotate) { + if (index === 0) { + model.startAngle = opts.rotation; + } else { + model.startAngle = me.getMeta().data[index - 1]._model.endAngle; + } + + model.endAngle = model.startAngle + model.circumference; + } + + arc.pivot(); + }, + + calculateTotal: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var total = 0; + var value; + + helpers$1.each(meta.data, function(element, index) { + value = dataset.data[index]; + if (!isNaN(value) && !element.hidden) { + total += Math.abs(value); + } + }); + + /* if (total === 0) { + total = NaN; + }*/ + + return total; + }, + + calculateCircumference: function(value) { + var total = this.getMeta().total; + if (total > 0 && !isNaN(value)) { + return (Math.PI * 2.0) * (Math.abs(value) / total); + } + return 0; + }, + + // gets the max border or hover width to properly scale pie charts + getMaxBorderWidth: function(arcs) { + var me = this; + var max = 0; + var chart = me.chart; + var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth; + + if (!arcs) { + // Find the outmost visible dataset + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + arcs = meta.data; + if (i !== me.index) { + controller = meta.controller; + } + break; + } + } + } + + if (!arcs) { + return 0; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arc = arcs[i]; + options = controller ? controller._resolveElementOptions(arc, i) : arc._options; + if (options.borderAlign !== 'inner') { + borderWidth = options.borderWidth; + hoverWidth = options.hoverBorderWidth; + + max = borderWidth > max ? borderWidth : max; + max = hoverWidth > max ? hoverWidth : max; + } + } + return max; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function(arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$3([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly + * @private + */ + _getRingWeightOffset: function(datasetIndex) { + var ringWeightOffset = 0; + + for (var i = 0; i < datasetIndex; ++i) { + if (this.chart.isDatasetVisible(i)) { + ringWeightOffset += this._getRingWeight(i); + } + } + + return ringWeightOffset; + }, + + /** + * @private + */ + _getRingWeight: function(dataSetIndex) { + return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0); + }, + + /** + * Returns the sum of all visibile data set weights. This value can be 0. + * @private + */ + _getVisibleDatasetWeightTotal: function() { + return this._getRingWeightOffset(this.chart.data.datasets.length); + } +}); + +core_defaults._set('horizontalBar', { + hover: { + mode: 'index', + axis: 'y' + }, + + scales: { + xAxes: [{ + type: 'linear', + position: 'bottom' + }], + + yAxes: [{ + type: 'category', + position: 'left', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }] + }, + + elements: { + rectangle: { + borderSkipped: 'left' + } + }, + + tooltips: { + mode: 'index', + axis: 'y' + } +}); + +var controller_horizontalBar = controller_bar.extend({ + /** + * @private + */ + _getValueScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function() { + return this.getMeta().yAxisID; + } +}); + +var valueOrDefault$5 = helpers$1.valueOrDefault; +var resolve$4 = helpers$1.options.resolve; +var isPointInArea = helpers$1.canvas._isPointInArea; + +core_defaults._set('line', { + showLines: true, + spanGaps: false, + + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + id: 'x-axis-0' + }], + yAxes: [{ + type: 'linear', + id: 'y-axis-0' + }] + } +}); + +function lineEnabled(dataset, options) { + return valueOrDefault$5(dataset.showLine, options.showLines); +} + +var controller_line = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.getScaleForId(meta.yAxisID); + var dataset = me.getDataset(); + var showLine = lineEnabled(dataset, me.chart.options); + var i, ilen; + + // Update Line + if (showLine) { + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + } + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + if (showLine && line._model.tension !== 0) { + me.updateBezierControlPoints(); + } + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var dataset = me.getDataset(); + var datasetIndex = me.index; + var value = dataset.data[index]; + var yScale = me.getScaleForId(meta.yAxisID); + var xScale = me.getScaleForId(meta.xAxisID); + var lineModel = meta.dataset._model; + var x, y; + + var options = me._resolvePointOptions(point, index); + + x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); + y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); + + // Utility + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = datasetIndex; + point._index = index; + + // Desired view properties + point._model = { + x: x, + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0), + steppedLine: lineModel ? lineModel.steppedLine : false, + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function(element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function(element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options; + var elementOptions = options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill', + 'cubicInterpolationMode' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[key], + elementOptions[key] + ]); + } + + // The default behavior of lines is to break at null values, according + // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 + // This option gives lines the ability to span gaps + values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps); + values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension); + values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]); + + return values; + }, + + calculatePointY: function(value, index, datasetIndex) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var yScale = me.getScaleForId(meta.yAxisID); + var sumPos = 0; + var sumNeg = 0; + var i, ds, dsMeta; + + if (yScale.options.stacked) { + for (i = 0; i < datasetIndex; i++) { + ds = chart.data.datasets[i]; + dsMeta = chart.getDatasetMeta(i); + if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { + var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); + if (stackedRightValue < 0) { + sumNeg += stackedRightValue || 0; + } else { + sumPos += stackedRightValue || 0; + } + } + } + + var rightValue = Number(yScale.getRightValue(value)); + if (rightValue < 0) { + return yScale.getPixelForValue(sumNeg + rightValue); + } + return yScale.getPixelForValue(sumPos + rightValue); + } + + return yScale.getPixelForValue(value); + }, + + updateBezierControlPoints: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var lineModel = meta.dataset._model; + var area = chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + // Only consider points that are drawn in case the spanGaps option is used + if (lineModel.spanGaps) { + points = points.filter(function(pt) { + return !pt._model.skip; + }); + } + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + if (lineModel.cubicInterpolationMode === 'monotone') { + helpers$1.splineCurveMonotone(points); + } else { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i)._model, + model, + helpers$1.nextItem(points, i)._model, + lineModel.tension + ); + model.controlPointPreviousX = controlPoints.previous.x; + model.controlPointPreviousY = controlPoints.previous.y; + model.controlPointNextX = controlPoints.next.x; + model.controlPointNextY = controlPoints.next.y; + } + } + + if (chart.options.elements.line.capBezierPoints) { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + if (isPointInArea(model, area)) { + if (i > 0 && isPointInArea(points[i - 1]._model, area)) { + model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); + model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); + } + if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) { + model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); + model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); + } + } + } + } + }, + + draw: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var points = meta.data || []; + var area = chart.chartArea; + var ilen = points.length; + var halfBorderWidth; + var i = 0; + + if (lineEnabled(me.getDataset(), chart.options)) { + halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2; + + helpers$1.canvas.clipArea(chart.ctx, { + left: area.left, + right: area.right, + top: area.top - halfBorderWidth, + bottom: area.bottom + halfBorderWidth + }); + + meta.dataset.draw(); + + helpers$1.canvas.unclipArea(chart.ctx); + } + + // Draw the points + for (; i < ilen; ++i) { + points[i].draw(area); + } + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$5(options.hoverRadius, options.radius); + }, +}); + +var resolve$5 = helpers$1.options.resolve; + +core_defaults._set('polarArea', { + scale: { + type: 'radialLinear', + angleLines: { + display: false + }, + gridLines: { + circular: true + }, + pointLabels: { + display: false + }, + ticks: { + beginAtZero: true + } + }, + + // Boolean - Whether to animate the rotation of the chart + animation: { + animateRotate: true, + animateScale: true + }, + + startAngle: -0.5 * Math.PI, + legendCallback: function(chart) { + var text = []; + text.push('<ul class="' + chart.id + '-legend">'); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('<li><span style="background-color:' + datasets[0].backgroundColor[i] + '"></span>'); + if (labels[i]) { + text.push(labels[i]); + } + text.push('</li>'); + } + } + + text.push('</ul>'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + meta.data[index].hidden = !meta.data[index].hidden; + } + + chart.update(); + } + }, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(item, data) { + return data.labels[item.index] + ': ' + item.yLabel; + } + } + } +}); + +var controller_polarArea = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + update: function(reset) { + var me = this; + var dataset = me.getDataset(); + var meta = me.getMeta(); + var start = me.chart.options.startAngle || 0; + var starts = me._starts = []; + var angles = me._angles = []; + var arcs = meta.data; + var i, ilen, angle; + + me._updateRadius(); + + meta.count = me.countVisibleElements(); + + for (i = 0, ilen = dataset.data.length; i < ilen; i++) { + starts[i] = start; + angle = me._computeAngle(i); + angles[i] = angle; + start += angle; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + me.updateElement(arcs[i], i, reset); + } + }, + + /** + * @private + */ + _updateRadius: function() { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); + + chart.outerRadius = Math.max(minSize / 2, 0); + chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + + me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); + me.innerRadius = me.outerRadius - chart.radiusLength; + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var opts = chart.options; + var animationOpts = opts.animation; + var scale = chart.scale; + var labels = chart.data.labels; + + var centerX = scale.xCenter; + var centerY = scale.yCenter; + + // var negHalfPI = -0.5 * Math.PI; + var datasetStartAngle = opts.startAngle; + var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var startAngle = me._starts[index]; + var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]); + + var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX, + y: centerY, + innerRadius: 0, + outerRadius: reset ? resetRadius : distance, + startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, + endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, + label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index]) + } + }); + + arc.pivot(); + }, + + countVisibleElements: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var count = 0; + + helpers$1.each(meta.data, function(element, index) { + if (!isNaN(dataset.data[index]) && !element.hidden) { + count++; + } + }); + + return count; + }, + + /** + * @protected + */ + setHoverStyle: function(arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + var valueOrDefault = helpers$1.valueOrDefault; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function(arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$5([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _computeAngle: function(index) { + var me = this; + var count = this.getMeta().count; + var dataset = me.getDataset(); + var meta = me.getMeta(); + + if (isNaN(dataset.data[index]) || meta.data[index].hidden) { + return 0; + } + + // Scriptable options + var context = { + chart: me.chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + return resolve$5([ + me.chart.options.elements.arc.angle, + (2 * Math.PI) / count + ], context, index); + } +}); + +core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut)); +core_defaults._set('pie', { + cutoutPercentage: 0 +}); + +// Pie charts are Doughnut chart with different defaults +var controller_pie = controller_doughnut; + +var valueOrDefault$6 = helpers$1.valueOrDefault; +var resolve$6 = helpers$1.options.resolve; + +core_defaults._set('radar', { + scale: { + type: 'radialLinear' + }, + elements: { + line: { + tension: 0 // no bezier in radar + } + } +}); + +var controller_radar = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + linkScales: helpers$1.noop, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.chart.scale; + var dataset = me.getDataset(); + var i, ilen; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + line._loop = true; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + // Update bezier control points + me.updateBezierControlPoints(); + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function(point, index, reset) { + var me = this; + var custom = point.custom || {}; + var dataset = me.getDataset(); + var scale = me.chart.scale; + var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); + var options = me._resolvePointOptions(point, index); + var lineModel = me.getMeta().dataset._model; + var x = reset ? scale.xCenter : pointPosition.x; + var y = reset ? scale.yCenter : pointPosition.y; + + // Utility + point._scale = scale; + point._options = options; + point._datasetIndex = me.index; + point._index = index; + + // Desired view properties + point._model = { + x: x, // value not used in dataset scale, but we want a consistent API between scales + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0), + + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function(element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function(element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[key], + options[key] + ]); + } + + values.tension = valueOrDefault$6(dataset.lineTension, options.tension); + + return values; + }, + + updateBezierControlPoints: function() { + var me = this; + var meta = me.getMeta(); + var area = me.chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i, true)._model, + model, + helpers$1.nextItem(points, i, true)._model, + model.tension + ); + + // Prevent the bezier going outside of the bounds of the graph + model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right); + model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom); + model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right); + model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom); + } + }, + + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$6(options.hoverRadius, options.radius); + } +}); + +core_defaults._set('scatter', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + id: 'x-axis-1', // need an ID so datasets can reference the scale + type: 'linear', // scatter should not use a category axis + position: 'bottom' + }], + yAxes: [{ + id: 'y-axis-1', + type: 'linear', + position: 'left' + }] + }, + + showLines: false, + + tooltips: { + callbacks: { + title: function() { + return ''; // doesn't make sense for scatter since data are formatted as a point + }, + label: function(item) { + return '(' + item.xLabel + ', ' + item.yLabel + ')'; + } + } + } +}); + +// Scatter charts use line controllers +var controller_scatter = controller_line; + +// NOTE export a map in which the key represents the controller type, not +// the class, and so must be CamelCase in order to be correctly retrieved +// by the controller in core.controller.js (`controllers[meta.type]`). + +var controllers = { + bar: controller_bar, + bubble: controller_bubble, + doughnut: controller_doughnut, + horizontalBar: controller_horizontalBar, + line: controller_line, + polarArea: controller_polarArea, + pie: controller_pie, + radar: controller_radar, + scatter: controller_scatter +}; + +/** + * Helper function to get relative position for an event + * @param {Event|IEvent} event - The event to get the position for + * @param {Chart} chart - The chart + * @returns {object} the event position + */ +function getRelativePosition(e, chart) { + if (e.native) { + return { + x: e.x, + y: e.y + }; + } + + return helpers$1.getRelativePosition(e, chart); +} + +/** + * Helper function to traverse all of the visible elements in the chart + * @param {Chart} chart - the chart + * @param {function} handler - the callback to execute for each visible item + */ +function parseVisibleItems(chart, handler) { + var datasets = chart.data.datasets; + var meta, i, j, ilen, jlen; + + for (i = 0, ilen = datasets.length; i < ilen; ++i) { + if (!chart.isDatasetVisible(i)) { + continue; + } + + meta = chart.getDatasetMeta(i); + for (j = 0, jlen = meta.data.length; j < jlen; ++j) { + var element = meta.data[j]; + if (!element._view.skip) { + handler(element); + } + } + } +} + +/** + * Helper function to get the items that intersect the event position + * @param {ChartElement[]} items - elements to filter + * @param {object} position - the point to be nearest to + * @return {ChartElement[]} the nearest items + */ +function getIntersectItems(chart, position) { + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + } + }); + + return elements; +} + +/** + * Helper function to get the items nearest to the event position considering all visible items in teh chart + * @param {Chart} chart - the chart to look at elements from + * @param {object} position - the point to be nearest to + * @param {boolean} intersect - if true, only consider items that intersect the position + * @param {function} distanceMetric - function to provide the distance between points + * @return {ChartElement[]} the nearest items + */ +function getNearestItems(chart, position, intersect, distanceMetric) { + var minDistance = Number.POSITIVE_INFINITY; + var nearestItems = []; + + parseVisibleItems(chart, function(element) { + if (intersect && !element.inRange(position.x, position.y)) { + return; + } + + var center = element.getCenterPoint(); + var distance = distanceMetric(position, center); + if (distance < minDistance) { + nearestItems = [element]; + minDistance = distance; + } else if (distance === minDistance) { + // Can have multiple items at the same distance in which case we sort by size + nearestItems.push(element); + } + }); + + return nearestItems; +} + +/** + * Get a distance metric function for two points based on the + * axis mode setting + * @param {string} axis - the axis mode. x|y|xy + */ +function getDistanceMetricForAxis(axis) { + var useX = axis.indexOf('x') !== -1; + var useY = axis.indexOf('y') !== -1; + + return function(pt1, pt2) { + var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; + var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; + return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); + }; +} + +function indexMode(chart, e, options) { + var position = getRelativePosition(e, chart); + // Default axis for index mode is 'x' to match old behaviour + options.axis = options.axis || 'x'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + var elements = []; + + if (!items.length) { + return []; + } + + chart.data.datasets.forEach(function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + var element = meta.data[items[0]._index]; + + // don't count items that are skipped (null data) + if (element && !element._view.skip) { + elements.push(element); + } + } + }); + + return elements; +} + +/** + * @interface IInteractionOptions + */ +/** + * If true, only consider items that intersect the point + * @name IInterfaceOptions#boolean + * @type Boolean + */ + +/** + * Contains interaction related functions + * @namespace Chart.Interaction + */ +var core_interaction = { + // Helper function for different modes + modes: { + single: function(chart, e) { + var position = getRelativePosition(e, chart); + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + return elements; + } + }); + + return elements.slice(0, 1); + }, + + /** + * @function Chart.Interaction.modes.label + * @deprecated since version 2.4.0 + * @todo remove at version 3 + * @private + */ + label: indexMode, + + /** + * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item + * @function Chart.Interaction.modes.index + * @since v2.4.0 + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + index: indexMode, + + /** + * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect is false, we find the nearest item and return the items in that dataset + * @function Chart.Interaction.modes.dataset + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + dataset: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + + if (items.length > 0) { + items = chart.getDatasetMeta(items[0]._datasetIndex).data; + } + + return items; + }, + + /** + * @function Chart.Interaction.modes.x-axis + * @deprecated since version 2.4.0. Use index mode and intersect == true + * @todo remove at version 3 + * @private + */ + 'x-axis': function(chart, e) { + return indexMode(chart, e, {intersect: false}); + }, + + /** + * Point mode returns all elements that hit test based on the event position + * of the event + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + point: function(chart, e) { + var position = getRelativePosition(e, chart); + return getIntersectItems(chart, position); + }, + + /** + * nearest mode returns the element closest to the point + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + nearest: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + return getNearestItems(chart, position, options.intersect, distanceMetric); + }, + + /** + * x mode returns the elements that hit-test at the current x coordinate + * @function Chart.Interaction.modes.x + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + x: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inXRange(position.x)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + }, + + /** + * y mode returns the elements that hit-test at the current y coordinate + * @function Chart.Interaction.modes.y + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + y: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inYRange(position.y)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + } + } +}; + +function filterByPosition(array, position) { + return helpers$1.where(array, function(v) { + return v.position === position; + }); +} + +function sortByWeight(array, reverse) { + array.forEach(function(v, i) { + v._tmpIndex_ = i; + return v; + }); + array.sort(function(a, b) { + var v0 = reverse ? b : a; + var v1 = reverse ? a : b; + return v0.weight === v1.weight ? + v0._tmpIndex_ - v1._tmpIndex_ : + v0.weight - v1.weight; + }); + array.forEach(function(v) { + delete v._tmpIndex_; + }); +} + +function findMaxPadding(boxes) { + var top = 0; + var left = 0; + var bottom = 0; + var right = 0; + helpers$1.each(boxes, function(box) { + if (box.getPadding) { + var boxPadding = box.getPadding(); + top = Math.max(top, boxPadding.top); + left = Math.max(left, boxPadding.left); + bottom = Math.max(bottom, boxPadding.bottom); + right = Math.max(right, boxPadding.right); + } + }); + return { + top: top, + left: left, + bottom: bottom, + right: right + }; +} + +function addSizeByPosition(boxes, size) { + helpers$1.each(boxes, function(box) { + size[box.position] += box.isHorizontal() ? box.height : box.width; + }); +} + +core_defaults._set('global', { + layout: { + padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + } +}); + +/** + * @interface ILayoutItem + * @prop {string} position - The position of the item in the chart layout. Possible values are + * 'left', 'top', 'right', 'bottom', and 'chartArea' + * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area + * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down + * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) + * @prop {function} update - Takes two parameters: width and height. Returns size of item + * @prop {function} getPadding - Returns an object with padding on the edges + * @prop {number} width - Width of item. Must be valid after update() + * @prop {number} height - Height of item. Must be valid after update() + * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update + * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update + * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update + * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update + */ + +// The layout service is very self explanatory. It's responsible for the layout within a chart. +// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need +// It is this service's responsibility of carrying out that layout. +var core_layouts = { + defaults: {}, + + /** + * Register a box to a chart. + * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. + * @param {Chart} chart - the chart to use + * @param {ILayoutItem} item - the item to add to be layed out + */ + addBox: function(chart, item) { + if (!chart.boxes) { + chart.boxes = []; + } + + // initialize item with default values + item.fullWidth = item.fullWidth || false; + item.position = item.position || 'top'; + item.weight = item.weight || 0; + + chart.boxes.push(item); + }, + + /** + * Remove a layoutItem from a chart + * @param {Chart} chart - the chart to remove the box from + * @param {ILayoutItem} layoutItem - the item to remove from the layout + */ + removeBox: function(chart, layoutItem) { + var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; + if (index !== -1) { + chart.boxes.splice(index, 1); + } + }, + + /** + * Sets (or updates) options on the given `item`. + * @param {Chart} chart - the chart in which the item lives (or will be added to) + * @param {ILayoutItem} item - the item to configure with the given options + * @param {object} options - the new item options. + */ + configure: function(chart, item, options) { + var props = ['fullWidth', 'position', 'weight']; + var ilen = props.length; + var i = 0; + var prop; + + for (; i < ilen; ++i) { + prop = props[i]; + if (options.hasOwnProperty(prop)) { + item[prop] = options[prop]; + } + } + }, + + /** + * Fits boxes of the given chart into the given size by having each box measure itself + * then running a fitting algorithm + * @param {Chart} chart - the chart + * @param {number} width - the width to fit into + * @param {number} height - the height to fit into + */ + update: function(chart, width, height) { + if (!chart) { + return; + } + + var layoutOptions = chart.options.layout || {}; + var padding = helpers$1.options.toPadding(layoutOptions.padding); + var leftPadding = padding.left; + var rightPadding = padding.right; + var topPadding = padding.top; + var bottomPadding = padding.bottom; + + var leftBoxes = filterByPosition(chart.boxes, 'left'); + var rightBoxes = filterByPosition(chart.boxes, 'right'); + var topBoxes = filterByPosition(chart.boxes, 'top'); + var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); + var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); + + // Sort boxes by weight. A higher weight is further away from the chart area + sortByWeight(leftBoxes, true); + sortByWeight(rightBoxes, false); + sortByWeight(topBoxes, true); + sortByWeight(bottomBoxes, false); + + var verticalBoxes = leftBoxes.concat(rightBoxes); + var horizontalBoxes = topBoxes.concat(bottomBoxes); + var outerBoxes = verticalBoxes.concat(horizontalBoxes); + + // Essentially we now have any number of boxes on each of the 4 sides. + // Our canvas looks like the following. + // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and + // B1 is the bottom axis + // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays + // These locations are single-box locations only, when trying to register a chartArea location that is already taken, + // an error will be thrown. + // + // |----------------------------------------------------| + // | T1 (Full Width) | + // |----------------------------------------------------| + // | | | T2 | | + // | |----|-------------------------------------|----| + // | | | C1 | | C2 | | + // | | |----| |----| | + // | | | | | + // | L1 | L2 | ChartArea (C0) | R1 | + // | | | | | + // | | |----| |----| | + // | | | C3 | | C4 | | + // | |----|-------------------------------------|----| + // | | | B1 | | + // |----------------------------------------------------| + // | B2 (Full Width) | + // |----------------------------------------------------| + // + // What we do to find the best sizing, we do the following + // 1. Determine the minimum size of the chart area. + // 2. Split the remaining width equally between each vertical axis + // 3. Split the remaining height equally between each horizontal axis + // 4. Give each layout the maximum size it can be. The layout will return it's minimum size + // 5. Adjust the sizes of each axis based on it's minimum reported size. + // 6. Refit each axis + // 7. Position each axis in the final location + // 8. Tell the chart the final location of the chart area + // 9. Tell any axes that overlay the chart area the positions of the chart area + + // Step 1 + var chartWidth = width - leftPadding - rightPadding; + var chartHeight = height - topPadding - bottomPadding; + var chartAreaWidth = chartWidth / 2; // min 50% + + // Step 2 + var verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length; + + // Step 3 + // TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837) + // var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length; + + // Step 4 + var maxChartAreaWidth = chartWidth; + var maxChartAreaHeight = chartHeight; + var outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; + var minBoxSizes = []; + var maxPadding; + + function getMinimumBoxSize(box) { + var minSize; + var isHorizontal = box.isHorizontal(); + + if (isHorizontal) { + minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2); + maxChartAreaHeight -= minSize.height; + } else { + minSize = box.update(verticalBoxWidth, maxChartAreaHeight); + maxChartAreaWidth -= minSize.width; + } + + minBoxSizes.push({ + horizontal: isHorizontal, + width: minSize.width, + box: box, + }); + } + + helpers$1.each(outerBoxes, getMinimumBoxSize); + + // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) + maxPadding = findMaxPadding(outerBoxes); + + // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could + // be if the axes are drawn at their minimum sizes. + // Steps 5 & 6 + + // Function to fit a box + function fitBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minBox) { + return minBox.box === box; + }); + + if (minBoxSize) { + if (minBoxSize.horizontal) { + var scaleMargin = { + left: Math.max(outerBoxSizes.left, maxPadding.left), + right: Math.max(outerBoxSizes.right, maxPadding.right), + top: 0, + bottom: 0 + }; + + // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends + // on the margin. Sometimes they need to increase in size slightly + box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); + } else { + box.update(minBoxSize.width, maxChartAreaHeight); + } + } + } + + // Update, and calculate the left and right margins for the horizontal boxes + helpers$1.each(verticalBoxes, fitBox); + addSizeByPosition(verticalBoxes, outerBoxSizes); + + // Set the Left and Right margins for the horizontal boxes + helpers$1.each(horizontalBoxes, fitBox); + addSizeByPosition(horizontalBoxes, outerBoxSizes); + + function finalFitVerticalBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minSize) { + return minSize.box === box; + }); + + var scaleMargin = { + left: 0, + right: 0, + top: outerBoxSizes.top, + bottom: outerBoxSizes.bottom + }; + + if (minBoxSize) { + box.update(minBoxSize.width, maxChartAreaHeight, scaleMargin); + } + } + + // Let the left layout know the final margin + helpers$1.each(verticalBoxes, finalFitVerticalBox); + + // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) + outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; + addSizeByPosition(outerBoxes, outerBoxSizes); + + // We may be adding some padding to account for rotated x axis labels + var leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0); + outerBoxSizes.left += leftPaddingAddition; + outerBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0); + + var topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0); + outerBoxSizes.top += topPaddingAddition; + outerBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 0); + + // Figure out if our chart area changed. This would occur if the dataset layout label rotation + // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do + // without calling `fit` again + var newMaxChartAreaHeight = height - outerBoxSizes.top - outerBoxSizes.bottom; + var newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right; + + if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { + helpers$1.each(verticalBoxes, function(box) { + box.height = newMaxChartAreaHeight; + }); + + helpers$1.each(horizontalBoxes, function(box) { + if (!box.fullWidth) { + box.width = newMaxChartAreaWidth; + } + }); + + maxChartAreaHeight = newMaxChartAreaHeight; + maxChartAreaWidth = newMaxChartAreaWidth; + } + + // Step 7 - Position the boxes + var left = leftPadding + leftPaddingAddition; + var top = topPadding + topPaddingAddition; + + function placeBox(box) { + if (box.isHorizontal()) { + box.left = box.fullWidth ? leftPadding : outerBoxSizes.left; + box.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + maxChartAreaWidth; + box.top = top; + box.bottom = top + box.height; + + // Move to next point + top = box.bottom; + + } else { + + box.left = left; + box.right = left + box.width; + box.top = outerBoxSizes.top; + box.bottom = outerBoxSizes.top + maxChartAreaHeight; + + // Move to next point + left = box.right; + } + } + + helpers$1.each(leftBoxes.concat(topBoxes), placeBox); + + // Account for chart width and height + left += maxChartAreaWidth; + top += maxChartAreaHeight; + + helpers$1.each(rightBoxes, placeBox); + helpers$1.each(bottomBoxes, placeBox); + + // Step 8 + chart.chartArea = { + left: outerBoxSizes.left, + top: outerBoxSizes.top, + right: outerBoxSizes.left + maxChartAreaWidth, + bottom: outerBoxSizes.top + maxChartAreaHeight + }; + + // Step 9 + helpers$1.each(chartAreaBoxes, function(box) { + box.left = chart.chartArea.left; + box.top = chart.chartArea.top; + box.right = chart.chartArea.right; + box.bottom = chart.chartArea.bottom; + + box.update(maxChartAreaWidth, maxChartAreaHeight); + }); + } +}; + +/** + * Platform fallback implementation (minimal). + * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 + */ + +var platform_basic = { + acquireContext: function(item) { + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + return item && item.getContext('2d') || null; + } +}; + +var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n"; + +var platform_dom$1 = /*#__PURE__*/Object.freeze({ +default: platform_dom +}); + +function getCjsExportFromNamespace (n) { + return n && n.default || n; +} + +var stylesheet = getCjsExportFromNamespace(platform_dom$1); + +var EXPANDO_KEY = '$chartjs'; +var CSS_PREFIX = 'chartjs-'; +var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor'; +var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; +var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; +var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; + +/** + * DOM event types -> Chart.js event types. + * Note: only events with different types are mapped. + * @see https://developer.mozilla.org/en-US/docs/Web/Events + */ +var EVENT_TYPES = { + touchstart: 'mousedown', + touchmove: 'mousemove', + touchend: 'mouseup', + pointerenter: 'mouseenter', + pointerdown: 'mousedown', + pointermove: 'mousemove', + pointerup: 'mouseup', + pointerleave: 'mouseout', + pointerout: 'mouseout' +}; + +/** + * The "used" size is the final value of a dimension property after all calculations have + * been performed. This method uses the computed style of `element` but returns undefined + * if the computed style is not expressed in pixels. That can happen in some cases where + * `element` has a size relative to its parent and this last one is not yet displayed, + * for example because of `display: none` on a parent node. + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value + * @returns {number} Size in pixels or undefined if unknown. + */ +function readUsedSize(element, property) { + var value = helpers$1.getStyle(element, property); + var matches = value && value.match(/^(\d+)(\.\d+)?px$/); + return matches ? Number(matches[1]) : undefined; +} + +/** + * Initializes the canvas style and render size without modifying the canvas display size, + * since responsiveness is handled by the controller.resize() method. The config is used + * to determine the aspect ratio to apply in case no explicit height has been specified. + */ +function initCanvas(canvas, config) { + var style = canvas.style; + + // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it + // returns null or '' if no explicit value has been set to the canvas attribute. + var renderHeight = canvas.getAttribute('height'); + var renderWidth = canvas.getAttribute('width'); + + // Chart.js modifies some canvas values that we want to restore on destroy + canvas[EXPANDO_KEY] = { + initial: { + height: renderHeight, + width: renderWidth, + style: { + display: style.display, + height: style.height, + width: style.width + } + } + }; + + // Force canvas to display as block to avoid extra space caused by inline + // elements, which would interfere with the responsive resize process. + // https://github.com/chartjs/Chart.js/issues/2538 + style.display = style.display || 'block'; + + if (renderWidth === null || renderWidth === '') { + var displayWidth = readUsedSize(canvas, 'width'); + if (displayWidth !== undefined) { + canvas.width = displayWidth; + } + } + + if (renderHeight === null || renderHeight === '') { + if (canvas.style.height === '') { + // If no explicit render height and style height, let's apply the aspect ratio, + // which one can be specified by the user but also by charts as default option + // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. + canvas.height = canvas.width / (config.options.aspectRatio || 2); + } else { + var displayHeight = readUsedSize(canvas, 'height'); + if (displayWidth !== undefined) { + canvas.height = displayHeight; + } + } + } + + return canvas; +} + +/** + * Detects support for options object argument in addEventListener. + * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + * @private + */ +var supportsEventListenerOptions = (function() { + var supports = false; + try { + var options = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line getter-return + get: function() { + supports = true; + } + }); + window.addEventListener('e', null, options); + } catch (e) { + // continue regardless of error + } + return supports; +}()); + +// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. +// https://github.com/chartjs/Chart.js/issues/4287 +var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; + +function addListener(node, type, listener) { + node.addEventListener(type, listener, eventListenerOptions); +} + +function removeListener(node, type, listener) { + node.removeEventListener(type, listener, eventListenerOptions); +} + +function createEvent(type, chart, x, y, nativeEvent) { + return { + type: type, + chart: chart, + native: nativeEvent || null, + x: x !== undefined ? x : null, + y: y !== undefined ? y : null, + }; +} + +function fromNativeEvent(event, chart) { + var type = EVENT_TYPES[event.type] || event.type; + var pos = helpers$1.getRelativePosition(event, chart); + return createEvent(type, chart, pos.x, pos.y, event); +} + +function throttled(fn, thisArg) { + var ticking = false; + var args = []; + + return function() { + args = Array.prototype.slice.call(arguments); + thisArg = thisArg || this; + + if (!ticking) { + ticking = true; + helpers$1.requestAnimFrame.call(window, function() { + ticking = false; + fn.apply(thisArg, args); + }); + } + }; +} + +function createDiv(cls) { + var el = document.createElement('div'); + el.className = cls || ''; + return el; +} + +// Implementation based on https://github.com/marcj/css-element-queries +function createResizer(handler) { + var maxSize = 1000000; + + // NOTE(SB) Don't use innerHTML because it could be considered unsafe. + // https://github.com/chartjs/Chart.js/issues/5902 + var resizer = createDiv(CSS_SIZE_MONITOR); + var expand = createDiv(CSS_SIZE_MONITOR + '-expand'); + var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink'); + + expand.appendChild(createDiv()); + shrink.appendChild(createDiv()); + + resizer.appendChild(expand); + resizer.appendChild(shrink); + resizer._reset = function() { + expand.scrollLeft = maxSize; + expand.scrollTop = maxSize; + shrink.scrollLeft = maxSize; + shrink.scrollTop = maxSize; + }; + + var onScroll = function() { + resizer._reset(); + handler(); + }; + + addListener(expand, 'scroll', onScroll.bind(expand, 'expand')); + addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); + + return resizer; +} + +// https://davidwalsh.name/detect-node-insertion +function watchForRender(node, handler) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + var proxy = expando.renderProxy = function(e) { + if (e.animationName === CSS_RENDER_ANIMATION) { + handler(); + } + }; + + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + addListener(node, type, proxy); + }); + + // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class + // is removed then added back immediately (same animation frame?). Accessing the + // `offsetParent` property will force a reflow and re-evaluate the CSS animation. + // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics + // https://github.com/chartjs/Chart.js/issues/4737 + expando.reflow = !!node.offsetParent; + + node.classList.add(CSS_RENDER_MONITOR); +} + +function unwatchForRender(node) { + var expando = node[EXPANDO_KEY] || {}; + var proxy = expando.renderProxy; + + if (proxy) { + helpers$1.each(ANIMATION_START_EVENTS, function(type) { + removeListener(node, type, proxy); + }); + + delete expando.renderProxy; + } + + node.classList.remove(CSS_RENDER_MONITOR); +} + +function addResizeListener(node, listener, chart) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + + // Let's keep track of this added resizer and thus avoid DOM query when removing it. + var resizer = expando.resizer = createResizer(throttled(function() { + if (expando.resizer) { + var container = chart.options.maintainAspectRatio && node.parentNode; + var w = container ? container.clientWidth : 0; + listener(createEvent('resize', chart)); + if (container && container.clientWidth < w && chart.canvas) { + // If the container size shrank during chart resize, let's assume + // scrollbar appeared. So we resize again with the scrollbar visible - + // effectively making chart smaller and the scrollbar hidden again. + // Because we are inside `throttled`, and currently `ticking`, scroll + // events are ignored during this whole 2 resize process. + // If we assumed wrong and something else happened, we are resizing + // twice in a frame (potential performance issue) + listener(createEvent('resize', chart)); + } + } + })); + + // The resizer needs to be attached to the node parent, so we first need to be + // sure that `node` is attached to the DOM before injecting the resizer element. + watchForRender(node, function() { + if (expando.resizer) { + var container = node.parentNode; + if (container && container !== resizer.parentNode) { + container.insertBefore(resizer, container.firstChild); + } + + // The container size might have changed, let's reset the resizer state. + resizer._reset(); + } + }); +} + +function removeResizeListener(node) { + var expando = node[EXPANDO_KEY] || {}; + var resizer = expando.resizer; + + delete expando.resizer; + unwatchForRender(node); + + if (resizer && resizer.parentNode) { + resizer.parentNode.removeChild(resizer); + } +} + +function injectCSS(platform, css) { + // https://stackoverflow.com/q/3922139 + var style = platform._style || document.createElement('style'); + if (!platform._style) { + platform._style = style; + css = '/* Chart.js */\n' + css; + style.setAttribute('type', 'text/css'); + document.getElementsByTagName('head')[0].appendChild(style); + } + + style.appendChild(document.createTextNode(css)); +} + +var platform_dom$2 = { + /** + * When `true`, prevents the automatic injection of the stylesheet required to + * correctly detect when the chart is added to the DOM and then resized. This + * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`) + * to be manually imported to make this library compatible with any CSP. + * See https://github.com/chartjs/Chart.js/issues/5208 + */ + disableCSSInjection: false, + + /** + * This property holds whether this platform is enabled for the current environment. + * Currently used by platform.js to select the proper implementation. + * @private + */ + _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', + + /** + * @private + */ + _ensureLoaded: function() { + if (this._loaded) { + return; + } + + this._loaded = true; + + // https://github.com/chartjs/Chart.js/issues/5208 + if (!this.disableCSSInjection) { + injectCSS(this, stylesheet); + } + }, + + acquireContext: function(item, config) { + if (typeof item === 'string') { + item = document.getElementById(item); + } else if (item.length) { + // Support for array based queries (such as jQuery) + item = item[0]; + } + + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + // To prevent canvas fingerprinting, some add-ons undefine the getContext + // method, for example: https://github.com/kkapsner/CanvasBlocker + // https://github.com/chartjs/Chart.js/issues/2807 + var context = item && item.getContext && item.getContext('2d'); + + // Load platform resources on first chart creation, to make possible to change + // platform options after importing the library (e.g. `disableCSSInjection`). + this._ensureLoaded(); + + // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is + // inside an iframe or when running in a protected environment. We could guess the + // types from their toString() value but let's keep things flexible and assume it's + // a sufficient condition if the item has a context2D which has item as `canvas`. + // https://github.com/chartjs/Chart.js/issues/3887 + // https://github.com/chartjs/Chart.js/issues/4102 + // https://github.com/chartjs/Chart.js/issues/4152 + if (context && context.canvas === item) { + initCanvas(item, config); + return context; + } + + return null; + }, + + releaseContext: function(context) { + var canvas = context.canvas; + if (!canvas[EXPANDO_KEY]) { + return; + } + + var initial = canvas[EXPANDO_KEY].initial; + ['height', 'width'].forEach(function(prop) { + var value = initial[prop]; + if (helpers$1.isNullOrUndef(value)) { + canvas.removeAttribute(prop); + } else { + canvas.setAttribute(prop, value); + } + }); + + helpers$1.each(initial.style || {}, function(value, key) { + canvas.style[key] = value; + }); + + // The canvas render size might have been changed (and thus the state stack discarded), + // we can't use save() and restore() to restore the initial state. So make sure that at + // least the canvas context is reset to the default state by setting the canvas width. + // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html + // eslint-disable-next-line no-self-assign + canvas.width = canvas.width; + + delete canvas[EXPANDO_KEY]; + }, + + addEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + addResizeListener(canvas, listener, chart); + return; + } + + var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); + var proxies = expando.proxies || (expando.proxies = {}); + var proxy = proxies[chart.id + '_' + type] = function(event) { + listener(fromNativeEvent(event, chart)); + }; + + addListener(canvas, type, proxy); + }, + + removeEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + removeResizeListener(canvas); + return; + } + + var expando = listener[EXPANDO_KEY] || {}; + var proxies = expando.proxies || {}; + var proxy = proxies[chart.id + '_' + type]; + if (!proxy) { + return; + } + + removeListener(canvas, type, proxy); + } +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use EventTarget.addEventListener instead. + * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener + * @function Chart.helpers.addEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers$1.addEvent = addListener; + +/** + * Provided for backward compatibility, use EventTarget.removeEventListener instead. + * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener + * @function Chart.helpers.removeEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers$1.removeEvent = removeListener; + +// @TODO Make possible to select another platform at build time. +var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic; + +/** + * @namespace Chart.platform + * @see https://chartjs.gitbooks.io/proposals/content/Platform.html + * @since 2.4.0 + */ +var platform = helpers$1.extend({ + /** + * @since 2.7.0 + */ + initialize: function() {}, + + /** + * Called at chart construction time, returns a context2d instance implementing + * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. + * @param {*} item - The native item from which to acquire context (platform specific) + * @param {object} options - The chart options + * @returns {CanvasRenderingContext2D} context2d instance + */ + acquireContext: function() {}, + + /** + * Called at chart destruction time, releases any resources associated to the context + * previously returned by the acquireContext() method. + * @param {CanvasRenderingContext2D} context - The context2d instance + * @returns {boolean} true if the method succeeded, else false + */ + releaseContext: function() {}, + + /** + * Registers the specified listener on the given chart. + * @param {Chart} chart - Chart from which to listen for event + * @param {string} type - The ({@link IEvent}) type to listen for + * @param {function} listener - Receives a notification (an object that implements + * the {@link IEvent} interface) when an event of the specified type occurs. + */ + addEventListener: function() {}, + + /** + * Removes the specified listener previously registered with addEventListener. + * @param {Chart} chart - Chart from which to remove the listener + * @param {string} type - The ({@link IEvent}) type to remove + * @param {function} listener - The listener function to remove from the event target. + */ + removeEventListener: function() {} + +}, implementation); + +core_defaults._set('global', { + plugins: {} +}); + +/** + * The plugin service singleton + * @namespace Chart.plugins + * @since 2.1.0 + */ +var core_plugins = { + /** + * Globally registered plugins. + * @private + */ + _plugins: [], + + /** + * This identifier is used to invalidate the descriptors cache attached to each chart + * when a global plugin is registered or unregistered. In this case, the cache ID is + * incremented and descriptors are regenerated during following API calls. + * @private + */ + _cacheId: 0, + + /** + * Registers the given plugin(s) if not already registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + register: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + if (p.indexOf(plugin) === -1) { + p.push(plugin); + } + }); + + this._cacheId++; + }, + + /** + * Unregisters the given plugin(s) only if registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + unregister: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + var idx = p.indexOf(plugin); + if (idx !== -1) { + p.splice(idx, 1); + } + }); + + this._cacheId++; + }, + + /** + * Remove all registered plugins. + * @since 2.1.5 + */ + clear: function() { + this._plugins = []; + this._cacheId++; + }, + + /** + * Returns the number of registered plugins? + * @returns {number} + * @since 2.1.5 + */ + count: function() { + return this._plugins.length; + }, + + /** + * Returns all registered plugin instances. + * @returns {IPlugin[]} array of plugin objects. + * @since 2.1.5 + */ + getAll: function() { + return this._plugins; + }, + + /** + * Calls enabled plugins for `chart` on the specified hook and with the given args. + * This method immediately returns as soon as a plugin explicitly returns false. The + * returned value can be used, for instance, to interrupt the current action. + * @param {Chart} chart - The chart instance for which plugins should be called. + * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). + * @param {Array} [args] - Extra arguments to apply to the hook call. + * @returns {boolean} false if any of the plugins return false, else returns true. + */ + notify: function(chart, hook, args) { + var descriptors = this.descriptors(chart); + var ilen = descriptors.length; + var i, descriptor, plugin, params, method; + + for (i = 0; i < ilen; ++i) { + descriptor = descriptors[i]; + plugin = descriptor.plugin; + method = plugin[hook]; + if (typeof method === 'function') { + params = [chart].concat(args || []); + params.push(descriptor.options); + if (method.apply(plugin, params) === false) { + return false; + } + } + } + + return true; + }, + + /** + * Returns descriptors of enabled plugins for the given chart. + * @returns {object[]} [{ plugin, options }] + * @private + */ + descriptors: function(chart) { + var cache = chart.$plugins || (chart.$plugins = {}); + if (cache.id === this._cacheId) { + return cache.descriptors; + } + + var plugins = []; + var descriptors = []; + var config = (chart && chart.config) || {}; + var options = (config.options && config.options.plugins) || {}; + + this._plugins.concat(config.plugins || []).forEach(function(plugin) { + var idx = plugins.indexOf(plugin); + if (idx !== -1) { + return; + } + + var id = plugin.id; + var opts = options[id]; + if (opts === false) { + return; + } + + if (opts === true) { + opts = helpers$1.clone(core_defaults.global.plugins[id]); + } + + plugins.push(plugin); + descriptors.push({ + plugin: plugin, + options: opts || {} + }); + }); + + cache.descriptors = descriptors; + cache.id = this._cacheId; + return descriptors; + }, + + /** + * Invalidates cache for the given chart: descriptors hold a reference on plugin option, + * but in some cases, this reference can be changed by the user when updating options. + * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + * @private + */ + _invalidate: function(chart) { + delete chart.$plugins; + } +}; + +var core_scaleService = { + // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then + // use the new chart options to grab the correct scale + constructors: {}, + // Use a registration function so that we can move to an ES6 map when we no longer need to support + // old browsers + + // Scale config defaults + defaults: {}, + registerScaleType: function(type, scaleConstructor, scaleDefaults) { + this.constructors[type] = scaleConstructor; + this.defaults[type] = helpers$1.clone(scaleDefaults); + }, + getScaleConstructor: function(type) { + return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; + }, + getScaleDefaults: function(type) { + // Return the scale defaults merged with the global settings so that we always use the latest ones + return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {}; + }, + updateScaleDefaults: function(type, additions) { + var me = this; + if (me.defaults.hasOwnProperty(type)) { + me.defaults[type] = helpers$1.extend(me.defaults[type], additions); + } + }, + addScalesToLayout: function(chart) { + // Adds each scale to the chart.boxes array to be sized accordingly + helpers$1.each(chart.scales, function(scale) { + // Set ILayoutItem parameters for backwards compatibility + scale.fullWidth = scale.options.fullWidth; + scale.position = scale.options.position; + scale.weight = scale.options.weight; + core_layouts.addBox(chart, scale); + }); + } +}; + +var valueOrDefault$7 = helpers$1.valueOrDefault; + +core_defaults._set('global', { + tooltips: { + enabled: true, + custom: null, + mode: 'nearest', + position: 'average', + intersect: true, + backgroundColor: 'rgba(0,0,0,0.8)', + titleFontStyle: 'bold', + titleSpacing: 2, + titleMarginBottom: 6, + titleFontColor: '#fff', + titleAlign: 'left', + bodySpacing: 2, + bodyFontColor: '#fff', + bodyAlign: 'left', + footerFontStyle: 'bold', + footerSpacing: 2, + footerMarginTop: 6, + footerFontColor: '#fff', + footerAlign: 'left', + yPadding: 6, + xPadding: 6, + caretPadding: 2, + caretSize: 5, + cornerRadius: 6, + multiKeyBackground: '#fff', + displayColors: true, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 0, + callbacks: { + // Args are: (tooltipItems, data) + beforeTitle: helpers$1.noop, + title: function(tooltipItems, data) { + var title = ''; + var labels = data.labels; + var labelCount = labels ? labels.length : 0; + + if (tooltipItems.length > 0) { + var item = tooltipItems[0]; + if (item.label) { + title = item.label; + } else if (item.xLabel) { + title = item.xLabel; + } else if (labelCount > 0 && item.index < labelCount) { + title = labels[item.index]; + } + } + + return title; + }, + afterTitle: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeBody: helpers$1.noop, + + // Args are: (tooltipItem, data) + beforeLabel: helpers$1.noop, + label: function(tooltipItem, data) { + var label = data.datasets[tooltipItem.datasetIndex].label || ''; + + if (label) { + label += ': '; + } + if (!helpers$1.isNullOrUndef(tooltipItem.value)) { + label += tooltipItem.value; + } else { + label += tooltipItem.yLabel; + } + return label; + }, + labelColor: function(tooltipItem, chart) { + var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); + var activeElement = meta.data[tooltipItem.index]; + var view = activeElement._view; + return { + borderColor: view.borderColor, + backgroundColor: view.backgroundColor + }; + }, + labelTextColor: function() { + return this._options.bodyFontColor; + }, + afterLabel: helpers$1.noop, + + // Args are: (tooltipItems, data) + afterBody: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeFooter: helpers$1.noop, + footer: helpers$1.noop, + afterFooter: helpers$1.noop + } + } +}); + +var positioners = { + /** + * Average mode places the tooltip at the average position of the elements shown + * @function Chart.Tooltip.positioners.average + * @param elements {ChartElement[]} the elements being displayed in the tooltip + * @returns {object} tooltip position + */ + average: function(elements) { + if (!elements.length) { + return false; + } + + var i, len; + var x = 0; + var y = 0; + var count = 0; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var pos = el.tooltipPosition(); + x += pos.x; + y += pos.y; + ++count; + } + } + + return { + x: x / count, + y: y / count + }; + }, + + /** + * Gets the tooltip position nearest of the item nearest to the event position + * @function Chart.Tooltip.positioners.nearest + * @param elements {Chart.Element[]} the tooltip elements + * @param eventPosition {object} the position of the event in canvas coordinates + * @returns {object} the tooltip position + */ + nearest: function(elements, eventPosition) { + var x = eventPosition.x; + var y = eventPosition.y; + var minDistance = Number.POSITIVE_INFINITY; + var i, len, nearestElement; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var center = el.getCenterPoint(); + var d = helpers$1.distanceBetweenPoints(eventPosition, center); + + if (d < minDistance) { + minDistance = d; + nearestElement = el; + } + } + } + + if (nearestElement) { + var tp = nearestElement.tooltipPosition(); + x = tp.x; + y = tp.y; + } + + return { + x: x, + y: y + }; + } +}; + +// Helper to push or concat based on if the 2nd parameter is an array or not +function pushOrConcat(base, toPush) { + if (toPush) { + if (helpers$1.isArray(toPush)) { + // base = base.concat(toPush); + Array.prototype.push.apply(base, toPush); + } else { + base.push(toPush); + } + } + + return base; +} + +/** + * Returns array of strings split by newline + * @param {string} value - The value to split by newline. + * @returns {string[]} value if newline present - Returned from String split() method + * @function + */ +function splitNewlines(str) { + if ((typeof str === 'string' || str instanceof String) && str.indexOf('\n') > -1) { + return str.split('\n'); + } + return str; +} + + +/** + * Private helper to create a tooltip item model + * @param element - the chart element (point, arc, bar) to create the tooltip item for + * @return new tooltip item + */ +function createTooltipItem(element) { + var xScale = element._xScale; + var yScale = element._yScale || element._scale; // handle radar || polarArea charts + var index = element._index; + var datasetIndex = element._datasetIndex; + var controller = element._chart.getDatasetMeta(datasetIndex).controller; + var indexScale = controller._getIndexScale(); + var valueScale = controller._getValueScale(); + + return { + xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', + yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', + label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '', + value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '', + index: index, + datasetIndex: datasetIndex, + x: element._model.x, + y: element._model.y + }; +} + +/** + * Helper to get the reset model for the tooltip + * @param tooltipOpts {object} the tooltip options + */ +function getBaseModel(tooltipOpts) { + var globalDefaults = core_defaults.global; + + return { + // Positioning + xPadding: tooltipOpts.xPadding, + yPadding: tooltipOpts.yPadding, + xAlign: tooltipOpts.xAlign, + yAlign: tooltipOpts.yAlign, + + // Body + bodyFontColor: tooltipOpts.bodyFontColor, + _bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), + _bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), + _bodyAlign: tooltipOpts.bodyAlign, + bodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), + bodySpacing: tooltipOpts.bodySpacing, + + // Title + titleFontColor: tooltipOpts.titleFontColor, + _titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), + _titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), + titleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), + _titleAlign: tooltipOpts.titleAlign, + titleSpacing: tooltipOpts.titleSpacing, + titleMarginBottom: tooltipOpts.titleMarginBottom, + + // Footer + footerFontColor: tooltipOpts.footerFontColor, + _footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), + _footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), + footerFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), + _footerAlign: tooltipOpts.footerAlign, + footerSpacing: tooltipOpts.footerSpacing, + footerMarginTop: tooltipOpts.footerMarginTop, + + // Appearance + caretSize: tooltipOpts.caretSize, + cornerRadius: tooltipOpts.cornerRadius, + backgroundColor: tooltipOpts.backgroundColor, + opacity: 0, + legendColorBackground: tooltipOpts.multiKeyBackground, + displayColors: tooltipOpts.displayColors, + borderColor: tooltipOpts.borderColor, + borderWidth: tooltipOpts.borderWidth + }; +} + +/** + * Get the size of the tooltip + */ +function getTooltipSize(tooltip, model) { + var ctx = tooltip._chart.ctx; + + var height = model.yPadding * 2; // Tooltip Padding + var width = 0; + + // Count of all lines in the body + var body = model.body; + var combinedBodyLength = body.reduce(function(count, bodyItem) { + return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; + }, 0); + combinedBodyLength += model.beforeBody.length + model.afterBody.length; + + var titleLineCount = model.title.length; + var footerLineCount = model.footer.length; + var titleFontSize = model.titleFontSize; + var bodyFontSize = model.bodyFontSize; + var footerFontSize = model.footerFontSize; + + height += titleLineCount * titleFontSize; // Title Lines + height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing + height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin + height += combinedBodyLength * bodyFontSize; // Body Lines + height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing + height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin + height += footerLineCount * (footerFontSize); // Footer Lines + height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing + + // Title width + var widthPadding = 0; + var maxLineWidth = function(line) { + width = Math.max(width, ctx.measureText(line).width + widthPadding); + }; + + ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); + helpers$1.each(model.title, maxLineWidth); + + // Body width + ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); + helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth); + + // Body lines may include some extra width due to the color box + widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; + helpers$1.each(body, function(bodyItem) { + helpers$1.each(bodyItem.before, maxLineWidth); + helpers$1.each(bodyItem.lines, maxLineWidth); + helpers$1.each(bodyItem.after, maxLineWidth); + }); + + // Reset back to 0 + widthPadding = 0; + + // Footer width + ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); + helpers$1.each(model.footer, maxLineWidth); + + // Add padding + width += 2 * model.xPadding; + + return { + width: width, + height: height + }; +} + +/** + * Helper to get the alignment of a tooltip given the size + */ +function determineAlignment(tooltip, size) { + var model = tooltip._model; + var chart = tooltip._chart; + var chartArea = tooltip._chart.chartArea; + var xAlign = 'center'; + var yAlign = 'center'; + + if (model.y < size.height) { + yAlign = 'top'; + } else if (model.y > (chart.height - size.height)) { + yAlign = 'bottom'; + } + + var lf, rf; // functions to determine left, right alignment + var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart + var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges + var midX = (chartArea.left + chartArea.right) / 2; + var midY = (chartArea.top + chartArea.bottom) / 2; + + if (yAlign === 'center') { + lf = function(x) { + return x <= midX; + }; + rf = function(x) { + return x > midX; + }; + } else { + lf = function(x) { + return x <= (size.width / 2); + }; + rf = function(x) { + return x >= (chart.width - (size.width / 2)); + }; + } + + olf = function(x) { + return x + size.width + model.caretSize + model.caretPadding > chart.width; + }; + orf = function(x) { + return x - size.width - model.caretSize - model.caretPadding < 0; + }; + yf = function(y) { + return y <= midY ? 'top' : 'bottom'; + }; + + if (lf(model.x)) { + xAlign = 'left'; + + // Is tooltip too wide and goes over the right side of the chart.? + if (olf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } else if (rf(model.x)) { + xAlign = 'right'; + + // Is tooltip too wide and goes outside left edge of canvas? + if (orf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } + + var opts = tooltip._options; + return { + xAlign: opts.xAlign ? opts.xAlign : xAlign, + yAlign: opts.yAlign ? opts.yAlign : yAlign + }; +} + +/** + * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment + */ +function getBackgroundPoint(vm, size, alignment, chart) { + // Background Position + var x = vm.x; + var y = vm.y; + + var caretSize = vm.caretSize; + var caretPadding = vm.caretPadding; + var cornerRadius = vm.cornerRadius; + var xAlign = alignment.xAlign; + var yAlign = alignment.yAlign; + var paddingAndSize = caretSize + caretPadding; + var radiusAndPadding = cornerRadius + caretPadding; + + if (xAlign === 'right') { + x -= size.width; + } else if (xAlign === 'center') { + x -= (size.width / 2); + if (x + size.width > chart.width) { + x = chart.width - size.width; + } + if (x < 0) { + x = 0; + } + } + + if (yAlign === 'top') { + y += paddingAndSize; + } else if (yAlign === 'bottom') { + y -= size.height + paddingAndSize; + } else { + y -= (size.height / 2); + } + + if (yAlign === 'center') { + if (xAlign === 'left') { + x += paddingAndSize; + } else if (xAlign === 'right') { + x -= paddingAndSize; + } + } else if (xAlign === 'left') { + x -= radiusAndPadding; + } else if (xAlign === 'right') { + x += radiusAndPadding; + } + + return { + x: x, + y: y + }; +} + +function getAlignedX(vm, align) { + return align === 'center' + ? vm.x + vm.width / 2 + : align === 'right' + ? vm.x + vm.width - vm.xPadding + : vm.x + vm.xPadding; +} + +/** + * Helper to build before and after body lines + */ +function getBeforeAfterBodyLines(callback) { + return pushOrConcat([], splitNewlines(callback)); +} + +var exports$3 = core_element.extend({ + initialize: function() { + this._model = getBaseModel(this._options); + this._lastActive = []; + }, + + // Get the title + // Args are: (tooltipItem, data) + getTitle: function() { + var me = this; + var opts = me._options; + var callbacks = opts.callbacks; + + var beforeTitle = callbacks.beforeTitle.apply(me, arguments); + var title = callbacks.title.apply(me, arguments); + var afterTitle = callbacks.afterTitle.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeTitle)); + lines = pushOrConcat(lines, splitNewlines(title)); + lines = pushOrConcat(lines, splitNewlines(afterTitle)); + + return lines; + }, + + // Args are: (tooltipItem, data) + getBeforeBody: function() { + return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments)); + }, + + // Args are: (tooltipItem, data) + getBody: function(tooltipItems, data) { + var me = this; + var callbacks = me._options.callbacks; + var bodyItems = []; + + helpers$1.each(tooltipItems, function(tooltipItem) { + var bodyItem = { + before: [], + lines: [], + after: [] + }; + pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data))); + pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); + pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data))); + + bodyItems.push(bodyItem); + }); + + return bodyItems; + }, + + // Args are: (tooltipItem, data) + getAfterBody: function() { + return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments)); + }, + + // Get the footer and beforeFooter and afterFooter lines + // Args are: (tooltipItem, data) + getFooter: function() { + var me = this; + var callbacks = me._options.callbacks; + + var beforeFooter = callbacks.beforeFooter.apply(me, arguments); + var footer = callbacks.footer.apply(me, arguments); + var afterFooter = callbacks.afterFooter.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeFooter)); + lines = pushOrConcat(lines, splitNewlines(footer)); + lines = pushOrConcat(lines, splitNewlines(afterFooter)); + + return lines; + }, + + update: function(changed) { + var me = this; + var opts = me._options; + + // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition + // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time + // which breaks any animations. + var existingModel = me._model; + var model = me._model = getBaseModel(opts); + var active = me._active; + + var data = me._data; + + // In the case where active.length === 0 we need to keep these at existing values for good animations + var alignment = { + xAlign: existingModel.xAlign, + yAlign: existingModel.yAlign + }; + var backgroundPoint = { + x: existingModel.x, + y: existingModel.y + }; + var tooltipSize = { + width: existingModel.width, + height: existingModel.height + }; + var tooltipPosition = { + x: existingModel.caretX, + y: existingModel.caretY + }; + + var i, len; + + if (active.length) { + model.opacity = 1; + + var labelColors = []; + var labelTextColors = []; + tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition); + + var tooltipItems = []; + for (i = 0, len = active.length; i < len; ++i) { + tooltipItems.push(createTooltipItem(active[i])); + } + + // If the user provided a filter function, use it to modify the tooltip items + if (opts.filter) { + tooltipItems = tooltipItems.filter(function(a) { + return opts.filter(a, data); + }); + } + + // If the user provided a sorting function, use it to modify the tooltip items + if (opts.itemSort) { + tooltipItems = tooltipItems.sort(function(a, b) { + return opts.itemSort(a, b, data); + }); + } + + // Determine colors for boxes + helpers$1.each(tooltipItems, function(tooltipItem) { + labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); + labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); + }); + + + // Build the Text Lines + model.title = me.getTitle(tooltipItems, data); + model.beforeBody = me.getBeforeBody(tooltipItems, data); + model.body = me.getBody(tooltipItems, data); + model.afterBody = me.getAfterBody(tooltipItems, data); + model.footer = me.getFooter(tooltipItems, data); + + // Initial positioning and colors + model.x = tooltipPosition.x; + model.y = tooltipPosition.y; + model.caretPadding = opts.caretPadding; + model.labelColors = labelColors; + model.labelTextColors = labelTextColors; + + // data points + model.dataPoints = tooltipItems; + + // We need to determine alignment of the tooltip + tooltipSize = getTooltipSize(this, model); + alignment = determineAlignment(this, tooltipSize); + // Final Size and Position + backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart); + } else { + model.opacity = 0; + } + + model.xAlign = alignment.xAlign; + model.yAlign = alignment.yAlign; + model.x = backgroundPoint.x; + model.y = backgroundPoint.y; + model.width = tooltipSize.width; + model.height = tooltipSize.height; + + // Point where the caret on the tooltip points to + model.caretX = tooltipPosition.x; + model.caretY = tooltipPosition.y; + + me._model = model; + + if (changed && opts.custom) { + opts.custom.call(me, model); + } + + return me; + }, + + drawCaret: function(tooltipPoint, size) { + var ctx = this._chart.ctx; + var vm = this._view; + var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); + + ctx.lineTo(caretPosition.x1, caretPosition.y1); + ctx.lineTo(caretPosition.x2, caretPosition.y2); + ctx.lineTo(caretPosition.x3, caretPosition.y3); + }, + getCaretPosition: function(tooltipPoint, size, vm) { + var x1, x2, x3, y1, y2, y3; + var caretSize = vm.caretSize; + var cornerRadius = vm.cornerRadius; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var ptX = tooltipPoint.x; + var ptY = tooltipPoint.y; + var width = size.width; + var height = size.height; + + if (yAlign === 'center') { + y2 = ptY + (height / 2); + + if (xAlign === 'left') { + x1 = ptX; + x2 = x1 - caretSize; + x3 = x1; + + y1 = y2 + caretSize; + y3 = y2 - caretSize; + } else { + x1 = ptX + width; + x2 = x1 + caretSize; + x3 = x1; + + y1 = y2 - caretSize; + y3 = y2 + caretSize; + } + } else { + if (xAlign === 'left') { + x2 = ptX + cornerRadius + (caretSize); + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else if (xAlign === 'right') { + x2 = ptX + width - cornerRadius - caretSize; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else { + x2 = vm.caretX; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } + if (yAlign === 'top') { + y1 = ptY; + y2 = y1 - caretSize; + y3 = y1; + } else { + y1 = ptY + height; + y2 = y1 + caretSize; + y3 = y1; + // invert drawing order + var tmp = x3; + x3 = x1; + x1 = tmp; + } + } + return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; + }, + + drawTitle: function(pt, vm, ctx) { + var title = vm.title; + + if (title.length) { + pt.x = getAlignedX(vm, vm._titleAlign); + + ctx.textAlign = vm._titleAlign; + ctx.textBaseline = 'top'; + + var titleFontSize = vm.titleFontSize; + var titleSpacing = vm.titleSpacing; + + ctx.fillStyle = vm.titleFontColor; + ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); + + var i, len; + for (i = 0, len = title.length; i < len; ++i) { + ctx.fillText(title[i], pt.x, pt.y); + pt.y += titleFontSize + titleSpacing; // Line Height and spacing + + if (i + 1 === title.length) { + pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing + } + } + } + }, + + drawBody: function(pt, vm, ctx) { + var bodyFontSize = vm.bodyFontSize; + var bodySpacing = vm.bodySpacing; + var bodyAlign = vm._bodyAlign; + var body = vm.body; + var drawColorBoxes = vm.displayColors; + var labelColors = vm.labelColors; + var xLinePadding = 0; + var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0; + var textColor; + + ctx.textAlign = bodyAlign; + ctx.textBaseline = 'top'; + ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); + + pt.x = getAlignedX(vm, bodyAlign); + + // Before Body + var fillLineOfText = function(line) { + ctx.fillText(line, pt.x + xLinePadding, pt.y); + pt.y += bodyFontSize + bodySpacing; + }; + + // Before body lines + ctx.fillStyle = vm.bodyFontColor; + helpers$1.each(vm.beforeBody, fillLineOfText); + + xLinePadding = drawColorBoxes && bodyAlign !== 'right' + ? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2) + : 0; + + // Draw body lines now + helpers$1.each(body, function(bodyItem, i) { + textColor = vm.labelTextColors[i]; + ctx.fillStyle = textColor; + helpers$1.each(bodyItem.before, fillLineOfText); + + helpers$1.each(bodyItem.lines, function(line) { + // Draw Legend-like boxes if needed + if (drawColorBoxes) { + // Fill a white rect so that colours merge nicely if the opacity is < 1 + ctx.fillStyle = vm.legendColorBackground; + ctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Border + ctx.lineWidth = 1; + ctx.strokeStyle = labelColors[i].borderColor; + ctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Inner square + ctx.fillStyle = labelColors[i].backgroundColor; + ctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); + ctx.fillStyle = textColor; + } + + fillLineOfText(line); + }); + + helpers$1.each(bodyItem.after, fillLineOfText); + }); + + // Reset back to 0 for after body + xLinePadding = 0; + + // After body lines + helpers$1.each(vm.afterBody, fillLineOfText); + pt.y -= bodySpacing; // Remove last body spacing + }, + + drawFooter: function(pt, vm, ctx) { + var footer = vm.footer; + + if (footer.length) { + pt.x = getAlignedX(vm, vm._footerAlign); + pt.y += vm.footerMarginTop; + + ctx.textAlign = vm._footerAlign; + ctx.textBaseline = 'top'; + + ctx.fillStyle = vm.footerFontColor; + ctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); + + helpers$1.each(footer, function(line) { + ctx.fillText(line, pt.x, pt.y); + pt.y += vm.footerFontSize + vm.footerSpacing; + }); + } + }, + + drawBackground: function(pt, vm, ctx, tooltipSize) { + ctx.fillStyle = vm.backgroundColor; + ctx.strokeStyle = vm.borderColor; + ctx.lineWidth = vm.borderWidth; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var x = pt.x; + var y = pt.y; + var width = tooltipSize.width; + var height = tooltipSize.height; + var radius = vm.cornerRadius; + + ctx.beginPath(); + ctx.moveTo(x + radius, y); + if (yAlign === 'top') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + if (yAlign === 'center' && xAlign === 'right') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + if (yAlign === 'bottom') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + if (yAlign === 'center' && xAlign === 'left') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + + ctx.fill(); + + if (vm.borderWidth > 0) { + ctx.stroke(); + } + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + + if (vm.opacity === 0) { + return; + } + + var tooltipSize = { + width: vm.width, + height: vm.height + }; + var pt = { + x: vm.x, + y: vm.y + }; + + // IE11/Edge does not like very small opacities, so snap to 0 + var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; + + // Truthy/falsey value for empty tooltip + var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; + + if (this._options.enabled && hasTooltipContent) { + ctx.save(); + ctx.globalAlpha = opacity; + + // Draw Background + this.drawBackground(pt, vm, ctx, tooltipSize); + + // Draw Title, Body, and Footer + pt.y += vm.yPadding; + + // Titles + this.drawTitle(pt, vm, ctx); + + // Body + this.drawBody(pt, vm, ctx); + + // Footer + this.drawFooter(pt, vm, ctx); + + ctx.restore(); + } + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + * @returns {boolean} true if the tooltip changed + */ + handleEvent: function(e) { + var me = this; + var options = me._options; + var changed = false; + + me._lastActive = me._lastActive || []; + + // Find Active Elements for tooltips + if (e.type === 'mouseout') { + me._active = []; + } else { + me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); + } + + // Remember Last Actives + changed = !helpers$1.arrayEquals(me._active, me._lastActive); + + // Only handle target event on tooltip change + if (changed) { + me._lastActive = me._active; + + if (options.enabled || options.custom) { + me._eventPosition = { + x: e.x, + y: e.y + }; + + me.update(true); + me.pivot(); + } + } + + return changed; + } +}); + +/** + * @namespace Chart.Tooltip.positioners + */ +var positioners_1 = positioners; + +var core_tooltip = exports$3; +core_tooltip.positioners = positioners_1; + +var valueOrDefault$8 = helpers$1.valueOrDefault; + +core_defaults._set('global', { + elements: {}, + events: [ + 'mousemove', + 'mouseout', + 'click', + 'touchstart', + 'touchmove' + ], + hover: { + onHover: null, + mode: 'nearest', + intersect: true, + animationDuration: 400 + }, + onClick: null, + maintainAspectRatio: true, + responsive: true, + responsiveAnimationDuration: 0 +}); + +/** + * Recursively merge the given config objects representing the `scales` option + * by incorporating scale defaults in `xAxes` and `yAxes` array items, then + * returns a deep copy of the result, thus doesn't alter inputs. + */ +function mergeScaleConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function(key, target, source, options) { + if (key === 'xAxes' || key === 'yAxes') { + var slen = source[key].length; + var i, type, scale; + + if (!target[key]) { + target[key] = []; + } + + for (i = 0; i < slen; ++i) { + scale = source[key][i]; + type = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear'); + + if (i >= target[key].length) { + target[key].push({}); + } + + if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { + // new/untyped scale or type changed: let's apply the new defaults + // then merge source scale to correctly overwrite the defaults. + helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]); + } else { + // scales type are the same + helpers$1.merge(target[key][i], scale); + } + } + } else { + helpers$1._merger(key, target, source, options); + } + } + }); +} + +/** + * Recursively merge the given config objects as the root options by handling + * default scale options for the `scales` and `scale` properties, then returns + * a deep copy of the result, thus doesn't alter inputs. + */ +function mergeConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function(key, target, source, options) { + var tval = target[key] || {}; + var sval = source[key]; + + if (key === 'scales') { + // scale config merging is complex. Add our own function here for that + target[key] = mergeScaleConfig(tval, sval); + } else if (key === 'scale') { + // used in polar area & radar charts since there is only one scale + target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]); + } else { + helpers$1._merger(key, target, source, options); + } + } + }); +} + +function initConfig(config) { + config = config || {}; + + // Do NOT use mergeConfig for the data object because this method merges arrays + // and so would change references to labels and datasets, preventing data updates. + var data = config.data = config.data || {}; + data.datasets = data.datasets || []; + data.labels = data.labels || []; + + config.options = mergeConfig( + core_defaults.global, + core_defaults[config.type], + config.options || {}); + + return config; +} + +function updateConfig(chart) { + var newOptions = chart.options; + + helpers$1.each(chart.scales, function(scale) { + core_layouts.removeBox(chart, scale); + }); + + newOptions = mergeConfig( + core_defaults.global, + core_defaults[chart.config.type], + newOptions); + + chart.options = chart.config.options = newOptions; + chart.ensureScalesHaveIDs(); + chart.buildOrUpdateScales(); + + // Tooltip + chart.tooltip._options = newOptions.tooltips; + chart.tooltip.initialize(); +} + +function positionIsHorizontal(position) { + return position === 'top' || position === 'bottom'; +} + +var Chart = function(item, config) { + this.construct(item, config); + return this; +}; + +helpers$1.extend(Chart.prototype, /** @lends Chart */ { + /** + * @private + */ + construct: function(item, config) { + var me = this; + + config = initConfig(config); + + var context = platform.acquireContext(item, config); + var canvas = context && context.canvas; + var height = canvas && canvas.height; + var width = canvas && canvas.width; + + me.id = helpers$1.uid(); + me.ctx = context; + me.canvas = canvas; + me.config = config; + me.width = width; + me.height = height; + me.aspectRatio = height ? width / height : null; + me.options = config.options; + me._bufferedRender = false; + + /** + * Provided for backward compatibility, Chart and Chart.Controller have been merged, + * the "instance" still need to be defined since it might be called from plugins. + * @prop Chart#chart + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ + me.chart = me; + me.controller = me; // chart.chart.controller #inception + + // Add the chart instance to the global namespace + Chart.instances[me.id] = me; + + // Define alias to the config data: `chart.data === chart.config.data` + Object.defineProperty(me, 'data', { + get: function() { + return me.config.data; + }, + set: function(value) { + me.config.data = value; + } + }); + + if (!context || !canvas) { + // The given item is not a compatible context2d element, let's return before finalizing + // the chart initialization but after setting basic chart / controller properties that + // can help to figure out that the chart is not valid (e.g chart.canvas !== null); + // https://github.com/chartjs/Chart.js/issues/2807 + console.error("Failed to create chart: can't acquire context from the given item"); + return; + } + + me.initialize(); + me.update(); + }, + + /** + * @private + */ + initialize: function() { + var me = this; + + // Before init plugin notification + core_plugins.notify(me, 'beforeInit'); + + helpers$1.retinaScale(me, me.options.devicePixelRatio); + + me.bindEvents(); + + if (me.options.responsive) { + // Initial resize before chart draws (must be silent to preserve initial animations). + me.resize(true); + } + + // Make sure scales have IDs and are built before we build any controllers. + me.ensureScalesHaveIDs(); + me.buildOrUpdateScales(); + me.initToolTip(); + + // After init plugin notification + core_plugins.notify(me, 'afterInit'); + + return me; + }, + + clear: function() { + helpers$1.canvas.clear(this); + return this; + }, + + stop: function() { + // Stops any current animation loop occurring + core_animations.cancelAnimation(this); + return this; + }, + + resize: function(silent) { + var me = this; + var options = me.options; + var canvas = me.canvas; + var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; + + // the canvas render width and height will be casted to integers so make sure that + // the canvas display style uses the same integer values to avoid blurring effect. + + // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed + var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas))); + var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas))); + + if (me.width === newWidth && me.height === newHeight) { + return; + } + + canvas.width = me.width = newWidth; + canvas.height = me.height = newHeight; + canvas.style.width = newWidth + 'px'; + canvas.style.height = newHeight + 'px'; + + helpers$1.retinaScale(me, options.devicePixelRatio); + + if (!silent) { + // Notify any plugins about the resize + var newSize = {width: newWidth, height: newHeight}; + core_plugins.notify(me, 'resize', [newSize]); + + // Notify of resize + if (options.onResize) { + options.onResize(me, newSize); + } + + me.stop(); + me.update({ + duration: options.responsiveAnimationDuration + }); + } + }, + + ensureScalesHaveIDs: function() { + var options = this.options; + var scalesOptions = options.scales || {}; + var scaleOptions = options.scale; + + helpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) { + xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); + }); + + helpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) { + yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); + }); + + if (scaleOptions) { + scaleOptions.id = scaleOptions.id || 'scale'; + } + }, + + /** + * Builds a map of scale ID to scale object for future lookup. + */ + buildOrUpdateScales: function() { + var me = this; + var options = me.options; + var scales = me.scales || {}; + var items = []; + var updated = Object.keys(scales).reduce(function(obj, id) { + obj[id] = false; + return obj; + }, {}); + + if (options.scales) { + items = items.concat( + (options.scales.xAxes || []).map(function(xAxisOptions) { + return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; + }), + (options.scales.yAxes || []).map(function(yAxisOptions) { + return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; + }) + ); + } + + if (options.scale) { + items.push({ + options: options.scale, + dtype: 'radialLinear', + isDefault: true, + dposition: 'chartArea' + }); + } + + helpers$1.each(items, function(item) { + var scaleOptions = item.options; + var id = scaleOptions.id; + var scaleType = valueOrDefault$8(scaleOptions.type, item.dtype); + + if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { + scaleOptions.position = item.dposition; + } + + updated[id] = true; + var scale = null; + if (id in scales && scales[id].type === scaleType) { + scale = scales[id]; + scale.options = scaleOptions; + scale.ctx = me.ctx; + scale.chart = me; + } else { + var scaleClass = core_scaleService.getScaleConstructor(scaleType); + if (!scaleClass) { + return; + } + scale = new scaleClass({ + id: id, + type: scaleType, + options: scaleOptions, + ctx: me.ctx, + chart: me + }); + scales[scale.id] = scale; + } + + scale.mergeTicksOptions(); + + // TODO(SB): I think we should be able to remove this custom case (options.scale) + // and consider it as a regular scale part of the "scales"" map only! This would + // make the logic easier and remove some useless? custom code. + if (item.isDefault) { + me.scale = scale; + } + }); + // clear up discarded scales + helpers$1.each(updated, function(hasUpdated, id) { + if (!hasUpdated) { + delete scales[id]; + } + }); + + me.scales = scales; + + core_scaleService.addScalesToLayout(this); + }, + + buildOrUpdateControllers: function() { + var me = this; + var newControllers = []; + + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + var meta = me.getDatasetMeta(datasetIndex); + var type = dataset.type || me.config.type; + + if (meta.type && meta.type !== type) { + me.destroyDatasetMeta(datasetIndex); + meta = me.getDatasetMeta(datasetIndex); + } + meta.type = type; + + if (meta.controller) { + meta.controller.updateIndex(datasetIndex); + meta.controller.linkScales(); + } else { + var ControllerClass = controllers[meta.type]; + if (ControllerClass === undefined) { + throw new Error('"' + meta.type + '" is not a chart type.'); + } + + meta.controller = new ControllerClass(me, datasetIndex); + newControllers.push(meta.controller); + } + }, me); + + return newControllers; + }, + + /** + * Reset the elements of all datasets + * @private + */ + resetElements: function() { + var me = this; + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.reset(); + }, me); + }, + + /** + * Resets the chart back to it's state before the initial animation + */ + reset: function() { + this.resetElements(); + this.tooltip.initialize(); + }, + + update: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + updateConfig(me); + + // plugins options references might have change, let's invalidate the cache + // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + core_plugins._invalidate(me); + + if (core_plugins.notify(me, 'beforeUpdate') === false) { + return; + } + + // In case the entire data object changed + me.tooltip._data = me.data; + + // Make sure dataset controllers are updated and new controllers are reset + var newControllers = me.buildOrUpdateControllers(); + + // Make sure all dataset controllers have correct meta data counts + helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); + }, me); + + me.updateLayout(); + + // Can only reset the new controllers after the scales have been updated + if (me.options.animation && me.options.animation.duration) { + helpers$1.each(newControllers, function(controller) { + controller.reset(); + }); + } + + me.updateDatasets(); + + // Need to reset tooltip in case it is displayed with elements that are removed + // after update. + me.tooltip.initialize(); + + // Last active contains items that were previously in the tooltip. + // When we reset the tooltip, we need to clear it + me.lastActive = []; + + // Do this before render so that any plugins that need final scale updates can use it + core_plugins.notify(me, 'afterUpdate'); + + if (me._bufferedRender) { + me._bufferedRequest = { + duration: config.duration, + easing: config.easing, + lazy: config.lazy + }; + } else { + me.render(config); + } + }, + + /** + * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` + * hook, in which case, plugins will not be called on `afterLayout`. + * @private + */ + updateLayout: function() { + var me = this; + + if (core_plugins.notify(me, 'beforeLayout') === false) { + return; + } + + core_layouts.update(this, this.width, this.height); + + /** + * Provided for backward compatibility, use `afterLayout` instead. + * @method IPlugin#afterScaleUpdate + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ + core_plugins.notify(me, 'afterScaleUpdate'); + core_plugins.notify(me, 'afterLayout'); + }, + + /** + * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` + * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. + * @private + */ + updateDatasets: function() { + var me = this; + + if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) { + return; + } + + for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.updateDataset(i); + } + + core_plugins.notify(me, 'afterDatasetsUpdate'); + }, + + /** + * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` + * hook, in which case, plugins will not be called on `afterDatasetUpdate`. + * @private + */ + updateDataset: function(index) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index + }; + + if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { + return; + } + + meta.controller.update(); + + core_plugins.notify(me, 'afterDatasetUpdate', [args]); + }, + + render: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + var animationOptions = me.options.animation; + var duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration); + var lazy = config.lazy; + + if (core_plugins.notify(me, 'beforeRender') === false) { + return; + } + + var onComplete = function(animation) { + core_plugins.notify(me, 'afterRender'); + helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me); + }; + + if (animationOptions && duration) { + var animation = new core_animation({ + numSteps: duration / 16.66, // 60 fps + easing: config.easing || animationOptions.easing, + + render: function(chart, animationObject) { + var easingFunction = helpers$1.easing.effects[animationObject.easing]; + var currentStep = animationObject.currentStep; + var stepDecimal = currentStep / animationObject.numSteps; + + chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); + }, + + onAnimationProgress: animationOptions.onProgress, + onAnimationComplete: onComplete + }); + + core_animations.addAnimation(me, animation, duration, lazy); + } else { + me.draw(); + + // See https://github.com/chartjs/Chart.js/issues/3781 + onComplete(new core_animation({numSteps: 0, chart: me})); + } + + return me; + }, + + draw: function(easingValue) { + var me = this; + + me.clear(); + + if (helpers$1.isNullOrUndef(easingValue)) { + easingValue = 1; + } + + me.transition(easingValue); + + if (me.width <= 0 || me.height <= 0) { + return; + } + + if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) { + return; + } + + // Draw all the scales + helpers$1.each(me.boxes, function(box) { + box.draw(me.chartArea); + }, me); + + me.drawDatasets(easingValue); + me._drawTooltip(easingValue); + + core_plugins.notify(me, 'afterDraw', [easingValue]); + }, + + /** + * @private + */ + transition: function(easingValue) { + var me = this; + + for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { + if (me.isDatasetVisible(i)) { + me.getDatasetMeta(i).controller.transition(easingValue); + } + } + + me.tooltip.transition(easingValue); + }, + + /** + * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` + * hook, in which case, plugins will not be called on `afterDatasetsDraw`. + * @private + */ + drawDatasets: function(easingValue) { + var me = this; + + if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { + return; + } + + // Draw datasets reversed to support proper line stacking + for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { + if (me.isDatasetVisible(i)) { + me.drawDataset(i, easingValue); + } + } + + core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]); + }, + + /** + * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` + * hook, in which case, plugins will not be called on `afterDatasetDraw`. + * @private + */ + drawDataset: function(index, easingValue) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index, + easingValue: easingValue + }; + + if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { + return; + } + + meta.controller.draw(easingValue); + + core_plugins.notify(me, 'afterDatasetDraw', [args]); + }, + + /** + * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` + * hook, in which case, plugins will not be called on `afterTooltipDraw`. + * @private + */ + _drawTooltip: function(easingValue) { + var me = this; + var tooltip = me.tooltip; + var args = { + tooltip: tooltip, + easingValue: easingValue + }; + + if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { + return; + } + + tooltip.draw(); + + core_plugins.notify(me, 'afterTooltipDraw', [args]); + }, + + /** + * Get the single element that was clicked on + * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw + */ + getElementAtEvent: function(e) { + return core_interaction.modes.single(this, e); + }, + + getElementsAtEvent: function(e) { + return core_interaction.modes.label(this, e, {intersect: true}); + }, + + getElementsAtXAxis: function(e) { + return core_interaction.modes['x-axis'](this, e, {intersect: true}); + }, + + getElementsAtEventForMode: function(e, mode, options) { + var method = core_interaction.modes[mode]; + if (typeof method === 'function') { + return method(this, e, options); + } + + return []; + }, + + getDatasetAtEvent: function(e) { + return core_interaction.modes.dataset(this, e, {intersect: true}); + }, + + getDatasetMeta: function(datasetIndex) { + var me = this; + var dataset = me.data.datasets[datasetIndex]; + if (!dataset._meta) { + dataset._meta = {}; + } + + var meta = dataset._meta[me.id]; + if (!meta) { + meta = dataset._meta[me.id] = { + type: null, + data: [], + dataset: null, + controller: null, + hidden: null, // See isDatasetVisible() comment + xAxisID: null, + yAxisID: null + }; + } + + return meta; + }, + + getVisibleDatasetCount: function() { + var count = 0; + for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + if (this.isDatasetVisible(i)) { + count++; + } + } + return count; + }, + + isDatasetVisible: function(datasetIndex) { + var meta = this.getDatasetMeta(datasetIndex); + + // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, + // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. + return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; + }, + + generateLegend: function() { + return this.options.legendCallback(this); + }, + + /** + * @private + */ + destroyDatasetMeta: function(datasetIndex) { + var id = this.id; + var dataset = this.data.datasets[datasetIndex]; + var meta = dataset._meta && dataset._meta[id]; + + if (meta) { + meta.controller.destroy(); + delete dataset._meta[id]; + } + }, + + destroy: function() { + var me = this; + var canvas = me.canvas; + var i, ilen; + + me.stop(); + + // dataset controllers need to cleanup associated data + for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.destroyDatasetMeta(i); + } + + if (canvas) { + me.unbindEvents(); + helpers$1.canvas.clear(me); + platform.releaseContext(me.ctx); + me.canvas = null; + me.ctx = null; + } + + core_plugins.notify(me, 'destroy'); + + delete Chart.instances[me.id]; + }, + + toBase64Image: function() { + return this.canvas.toDataURL.apply(this.canvas, arguments); + }, + + initToolTip: function() { + var me = this; + me.tooltip = new core_tooltip({ + _chart: me, + _chartInstance: me, // deprecated, backward compatibility + _data: me.data, + _options: me.options.tooltips + }, me); + }, + + /** + * @private + */ + bindEvents: function() { + var me = this; + var listeners = me._listeners = {}; + var listener = function() { + me.eventHandler.apply(me, arguments); + }; + + helpers$1.each(me.options.events, function(type) { + platform.addEventListener(me, type, listener); + listeners[type] = listener; + }); + + // Elements used to detect size change should not be injected for non responsive charts. + // See https://github.com/chartjs/Chart.js/issues/2210 + if (me.options.responsive) { + listener = function() { + me.resize(); + }; + + platform.addEventListener(me, 'resize', listener); + listeners.resize = listener; + } + }, + + /** + * @private + */ + unbindEvents: function() { + var me = this; + var listeners = me._listeners; + if (!listeners) { + return; + } + + delete me._listeners; + helpers$1.each(listeners, function(listener, type) { + platform.removeEventListener(me, type, listener); + }); + }, + + updateHoverStyle: function(elements, mode, enabled) { + var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; + var element, i, ilen; + + for (i = 0, ilen = elements.length; i < ilen; ++i) { + element = elements[i]; + if (element) { + this.getDatasetMeta(element._datasetIndex).controller[method](element); + } + } + }, + + /** + * @private + */ + eventHandler: function(e) { + var me = this; + var tooltip = me.tooltip; + + if (core_plugins.notify(me, 'beforeEvent', [e]) === false) { + return; + } + + // Buffer any update calls so that renders do not occur + me._bufferedRender = true; + me._bufferedRequest = null; + + var changed = me.handleEvent(e); + // for smooth tooltip animations issue #4989 + // the tooltip should be the source of change + // Animation check workaround: + // tooltip._start will be null when tooltip isn't animating + if (tooltip) { + changed = tooltip._start + ? tooltip.handleEvent(e) + : changed | tooltip.handleEvent(e); + } + + core_plugins.notify(me, 'afterEvent', [e]); + + var bufferedRequest = me._bufferedRequest; + if (bufferedRequest) { + // If we have an update that was triggered, we need to do a normal render + me.render(bufferedRequest); + } else if (changed && !me.animating) { + // If entering, leaving, or changing elements, animate the change via pivot + me.stop(); + + // We only need to render at this point. Updating will cause scales to be + // recomputed generating flicker & using more memory than necessary. + me.render({ + duration: me.options.hover.animationDuration, + lazy: true + }); + } + + me._bufferedRender = false; + me._bufferedRequest = null; + + return me; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event the event to handle + * @return {boolean} true if the chart needs to re-render + */ + handleEvent: function(e) { + var me = this; + var options = me.options || {}; + var hoverOptions = options.hover; + var changed = false; + + me.lastActive = me.lastActive || []; + + // Find Active Elements for hover and tooltips + if (e.type === 'mouseout') { + me.active = []; + } else { + me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); + } + + // Invoke onHover hook + // Need to call with native event here to not break backwards compatibility + helpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); + + if (e.type === 'mouseup' || e.type === 'click') { + if (options.onClick) { + // Use e.native here for backwards compatibility + options.onClick.call(me, e.native, me.active); + } + } + + // Remove styling for last active (even if it may still be active) + if (me.lastActive.length) { + me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); + } + + // Built in hover styling + if (me.active.length && hoverOptions.mode) { + me.updateHoverStyle(me.active, hoverOptions.mode, true); + } + + changed = !helpers$1.arrayEquals(me.active, me.lastActive); + + // Remember Last Actives + me.lastActive = me.active; + + return changed; + } +}); + +/** + * NOTE(SB) We actually don't use this container anymore but we need to keep it + * for backward compatibility. Though, it can still be useful for plugins that + * would need to work on multiple charts?! + */ +Chart.instances = {}; + +var core_controller = Chart; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart instead. + * @class Chart.Controller + * @deprecated since version 2.6 + * @todo remove at version 3 + * @private + */ +Chart.Controller = Chart; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ +Chart.types = {}; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.configMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +helpers$1.configMerge = mergeConfig; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.scaleMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +helpers$1.scaleMerge = mergeScaleConfig; + +var core_helpers = function() { + + // -- Basic js utility methods + + helpers$1.where = function(collection, filterCallback) { + if (helpers$1.isArray(collection) && Array.prototype.filter) { + return collection.filter(filterCallback); + } + var filtered = []; + + helpers$1.each(collection, function(item) { + if (filterCallback(item)) { + filtered.push(item); + } + }); + + return filtered; + }; + helpers$1.findIndex = Array.prototype.findIndex ? + function(array, callback, scope) { + return array.findIndex(callback, scope); + } : + function(array, callback, scope) { + scope = scope === undefined ? array : scope; + for (var i = 0, ilen = array.length; i < ilen; ++i) { + if (callback.call(scope, array[i], i, array)) { + return i; + } + } + return -1; + }; + helpers$1.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to start of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = -1; + } + for (var i = startIndex + 1; i < arrayToSearch.length; i++) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + helpers$1.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to end of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = arrayToSearch.length; + } + for (var i = startIndex - 1; i >= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + + // -- Math methods + helpers$1.isNumber = function(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }; + helpers$1.almostEquals = function(x, y, epsilon) { + return Math.abs(x - y) < epsilon; + }; + helpers$1.almostWhole = function(x, epsilon) { + var rounded = Math.round(x); + return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); + }; + helpers$1.max = function(array) { + return array.reduce(function(max, value) { + if (!isNaN(value)) { + return Math.max(max, value); + } + return max; + }, Number.NEGATIVE_INFINITY); + }; + helpers$1.min = function(array) { + return array.reduce(function(min, value) { + if (!isNaN(value)) { + return Math.min(min, value); + } + return min; + }, Number.POSITIVE_INFINITY); + }; + helpers$1.sign = Math.sign ? + function(x) { + return Math.sign(x); + } : + function(x) { + x = +x; // convert to a number + if (x === 0 || isNaN(x)) { + return x; + } + return x > 0 ? 1 : -1; + }; + helpers$1.log10 = Math.log10 ? + function(x) { + return Math.log10(x); + } : + function(x) { + var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. + // Check for whole powers of 10, + // which due to floating point rounding error should be corrected. + var powerOf10 = Math.round(exponent); + var isPowerOf10 = x === Math.pow(10, powerOf10); + + return isPowerOf10 ? powerOf10 : exponent; + }; + helpers$1.toRadians = function(degrees) { + return degrees * (Math.PI / 180); + }; + helpers$1.toDegrees = function(radians) { + return radians * (180 / Math.PI); + }; + + /** + * Returns the number of decimal places + * i.e. the number of digits after the decimal point, of the value of this Number. + * @param {number} x - A number. + * @returns {number} The number of decimal places. + * @private + */ + helpers$1._decimalPlaces = function(x) { + if (!helpers$1.isFinite(x)) { + return; + } + var e = 1; + var p = 0; + while (Math.round(x * e) / e !== x) { + e *= 10; + p++; + } + return p; + }; + + // Gets the angle from vertical upright to the point about a centre. + helpers$1.getAngleFromPoint = function(centrePoint, anglePoint) { + var distanceFromXCenter = anglePoint.x - centrePoint.x; + var distanceFromYCenter = anglePoint.y - centrePoint.y; + var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + + var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); + + if (angle < (-0.5 * Math.PI)) { + angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }; + helpers$1.distanceBetweenPoints = function(pt1, pt2) { + return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); + }; + + /** + * Provided for backward compatibility, not available anymore + * @function Chart.helpers.aliasPixel + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ + helpers$1.aliasPixel = function(pixelWidth) { + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }; + + /** + * Returns the aligned pixel value to avoid anti-aliasing blur + * @param {Chart} chart - The chart instance. + * @param {number} pixel - A pixel value. + * @param {number} width - The width of the element. + * @returns {number} The aligned pixel value. + * @private + */ + helpers$1._alignPixel = function(chart, pixel, width) { + var devicePixelRatio = chart.currentDevicePixelRatio; + var halfWidth = width / 2; + return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; + }; + + helpers$1.splineCurve = function(firstPoint, middlePoint, afterPoint, t) { + // Props to Rob Spencer at scaled innovation for his post on splining between points + // http://scaledinnovation.com/analytics/splines/aboutSplines.html + + // This function must also respect "skipped" points + + var previous = firstPoint.skip ? middlePoint : firstPoint; + var current = middlePoint; + var next = afterPoint.skip ? middlePoint : afterPoint; + + var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); + var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); + + var s01 = d01 / (d01 + d12); + var s12 = d12 / (d01 + d12); + + // If all points are the same, s01 & s02 will be inf + s01 = isNaN(s01) ? 0 : s01; + s12 = isNaN(s12) ? 0 : s12; + + var fa = t * s01; // scaling factor for triangle Ta + var fb = t * s12; + + return { + previous: { + x: current.x - fa * (next.x - previous.x), + y: current.y - fa * (next.y - previous.y) + }, + next: { + x: current.x + fb * (next.x - previous.x), + y: current.y + fb * (next.y - previous.y) + } + }; + }; + helpers$1.EPSILON = Number.EPSILON || 1e-14; + helpers$1.splineCurveMonotone = function(points) { + // This function calculates Bézier control points in a similar way than |splineCurve|, + // but preserves monotonicity of the provided data and ensures no local extremums are added + // between the dataset discrete points due to the interpolation. + // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation + + var pointsWithTangents = (points || []).map(function(point) { + return { + model: point._model, + deltaK: 0, + mK: 0 + }; + }); + + // Calculate slopes (deltaK) and initialize tangents (mK) + var pointsLen = pointsWithTangents.length; + var i, pointBefore, pointCurrent, pointAfter; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointAfter && !pointAfter.model.skip) { + var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); + + // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 + pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; + } + + if (!pointBefore || pointBefore.model.skip) { + pointCurrent.mK = pointCurrent.deltaK; + } else if (!pointAfter || pointAfter.model.skip) { + pointCurrent.mK = pointBefore.deltaK; + } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { + pointCurrent.mK = 0; + } else { + pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; + } + } + + // Adjust tangents to ensure monotonic properties + var alphaK, betaK, tauK, squaredMagnitude; + for (i = 0; i < pointsLen - 1; ++i) { + pointCurrent = pointsWithTangents[i]; + pointAfter = pointsWithTangents[i + 1]; + if (pointCurrent.model.skip || pointAfter.model.skip) { + continue; + } + + if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { + pointCurrent.mK = pointAfter.mK = 0; + continue; + } + + alphaK = pointCurrent.mK / pointCurrent.deltaK; + betaK = pointAfter.mK / pointCurrent.deltaK; + squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); + if (squaredMagnitude <= 9) { + continue; + } + + tauK = 3 / Math.sqrt(squaredMagnitude); + pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; + pointAfter.mK = betaK * tauK * pointCurrent.deltaK; + } + + // Compute control points + var deltaX; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointBefore && !pointBefore.model.skip) { + deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; + pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; + pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; + } + if (pointAfter && !pointAfter.model.skip) { + deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; + pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; + pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; + } + } + }; + helpers$1.nextItem = function(collection, index, loop) { + if (loop) { + return index >= collection.length - 1 ? collection[0] : collection[index + 1]; + } + return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; + }; + helpers$1.previousItem = function(collection, index, loop) { + if (loop) { + return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; + } + return index <= 0 ? collection[0] : collection[index - 1]; + }; + // Implementation of the nice number algorithm used in determining where axis labels will go + helpers$1.niceNum = function(range, round) { + var exponent = Math.floor(helpers$1.log10(range)); + var fraction = range / Math.pow(10, exponent); + var niceFraction; + + if (round) { + if (fraction < 1.5) { + niceFraction = 1; + } else if (fraction < 3) { + niceFraction = 2; + } else if (fraction < 7) { + niceFraction = 5; + } else { + niceFraction = 10; + } + } else if (fraction <= 1.0) { + niceFraction = 1; + } else if (fraction <= 2) { + niceFraction = 2; + } else if (fraction <= 5) { + niceFraction = 5; + } else { + niceFraction = 10; + } + + return niceFraction * Math.pow(10, exponent); + }; + // Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + helpers$1.requestAnimFrame = (function() { + if (typeof window === 'undefined') { + return function(callback) { + callback(); + }; + } + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + }()); + // -- DOM methods + helpers$1.getRelativePosition = function(evt, chart) { + var mouseX, mouseY; + var e = evt.originalEvent || evt; + var canvas = evt.target || evt.srcElement; + var boundingRect = canvas.getBoundingClientRect(); + + var touches = e.touches; + if (touches && touches.length > 0) { + mouseX = touches[0].clientX; + mouseY = touches[0].clientY; + + } else { + mouseX = e.clientX; + mouseY = e.clientY; + } + + // Scale mouse coordinates into canvas coordinates + // by following the pattern laid out by 'jerryj' in the comments of + // https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ + var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left')); + var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top')); + var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right')); + var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom')); + var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; + var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; + + // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However + // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here + mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); + mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); + + return { + x: mouseX, + y: mouseY + }; + + }; + + // Private helper function to convert max-width/max-height values that may be percentages into a number + function parseMaxStyle(styleValue, node, parentProperty) { + var valueInPixels; + if (typeof styleValue === 'string') { + valueInPixels = parseInt(styleValue, 10); + + if (styleValue.indexOf('%') !== -1) { + // percentage * size in dimension + valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; + } + } else { + valueInPixels = styleValue; + } + + return valueInPixels; + } + + /** + * Returns if the given value contains an effective constraint. + * @private + */ + function isConstrainedValue(value) { + return value !== undefined && value !== null && value !== 'none'; + } + + /** + * Returns the max width or height of the given DOM node in a cross-browser compatible fashion + * @param {HTMLElement} domNode - the node to check the constraint on + * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height') + * @param {string} percentageProperty - property of parent to use when calculating width as a percentage + * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser} + */ + function getConstraintDimension(domNode, maxStyle, percentageProperty) { + var view = document.defaultView; + var parentNode = helpers$1._getParentNode(domNode); + var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; + var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; + var hasCNode = isConstrainedValue(constrainedNode); + var hasCContainer = isConstrainedValue(constrainedContainer); + var infinity = Number.POSITIVE_INFINITY; + + if (hasCNode || hasCContainer) { + return Math.min( + hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, + hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); + } + + return 'none'; + } + // returns Number or undefined if no constraint + helpers$1.getConstraintWidth = function(domNode) { + return getConstraintDimension(domNode, 'max-width', 'clientWidth'); + }; + // returns Number or undefined if no constraint + helpers$1.getConstraintHeight = function(domNode) { + return getConstraintDimension(domNode, 'max-height', 'clientHeight'); + }; + /** + * @private + */ + helpers$1._calculatePadding = function(container, padding, parentDimension) { + padding = helpers$1.getStyle(container, padding); + + return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10); + }; + /** + * @private + */ + helpers$1._getParentNode = function(domNode) { + var parent = domNode.parentNode; + if (parent && parent.toString() === '[object ShadowRoot]') { + parent = parent.host; + } + return parent; + }; + helpers$1.getMaximumWidth = function(domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientWidth; + } + + var clientWidth = container.clientWidth; + var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth); + var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth); + + var w = clientWidth - paddingLeft - paddingRight; + var cw = helpers$1.getConstraintWidth(domNode); + return isNaN(cw) ? w : Math.min(w, cw); + }; + helpers$1.getMaximumHeight = function(domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientHeight; + } + + var clientHeight = container.clientHeight; + var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight); + var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight); + + var h = clientHeight - paddingTop - paddingBottom; + var ch = helpers$1.getConstraintHeight(domNode); + return isNaN(ch) ? h : Math.min(h, ch); + }; + helpers$1.getStyle = function(el, property) { + return el.currentStyle ? + el.currentStyle[property] : + document.defaultView.getComputedStyle(el, null).getPropertyValue(property); + }; + helpers$1.retinaScale = function(chart, forceRatio) { + var pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && window.devicePixelRatio) || 1; + if (pixelRatio === 1) { + return; + } + + var canvas = chart.canvas; + var height = chart.height; + var width = chart.width; + + canvas.height = height * pixelRatio; + canvas.width = width * pixelRatio; + chart.ctx.scale(pixelRatio, pixelRatio); + + // If no style has been set on the canvas, the render size is used as display size, + // making the chart visually bigger, so let's enforce it to the "correct" values. + // See https://github.com/chartjs/Chart.js/issues/3575 + if (!canvas.style.height && !canvas.style.width) { + canvas.style.height = height + 'px'; + canvas.style.width = width + 'px'; + } + }; + // -- Canvas methods + helpers$1.fontString = function(pixelSize, fontStyle, fontFamily) { + return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; + }; + helpers$1.longestText = function(ctx, font, arrayOfThings, cache) { + cache = cache || {}; + var data = cache.data = cache.data || {}; + var gc = cache.garbageCollect = cache.garbageCollect || []; + + if (cache.font !== font) { + data = cache.data = {}; + gc = cache.garbageCollect = []; + cache.font = font; + } + + ctx.font = font; + var longest = 0; + helpers$1.each(arrayOfThings, function(thing) { + // Undefined strings and arrays should not be measured + if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) { + longest = helpers$1.measureText(ctx, data, gc, longest, thing); + } else if (helpers$1.isArray(thing)) { + // if it is an array lets measure each element + // to do maybe simplify this function a bit so we can do this more recursively? + helpers$1.each(thing, function(nestedThing) { + // Undefined strings and arrays should not be measured + if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) { + longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing); + } + }); + } + }); + + var gcLen = gc.length / 2; + if (gcLen > arrayOfThings.length) { + for (var i = 0; i < gcLen; i++) { + delete data[gc[i]]; + } + gc.splice(0, gcLen); + } + return longest; + }; + helpers$1.measureText = function(ctx, data, gc, longest, string) { + var textWidth = data[string]; + if (!textWidth) { + textWidth = data[string] = ctx.measureText(string).width; + gc.push(string); + } + if (textWidth > longest) { + longest = textWidth; + } + return longest; + }; + helpers$1.numberOfLabelLines = function(arrayOfThings) { + var numberOfLines = 1; + helpers$1.each(arrayOfThings, function(thing) { + if (helpers$1.isArray(thing)) { + if (thing.length > numberOfLines) { + numberOfLines = thing.length; + } + } + }); + return numberOfLines; + }; + + helpers$1.color = !chartjsColor ? + function(value) { + console.error('Color.js not found!'); + return value; + } : + function(value) { + /* global CanvasGradient */ + if (value instanceof CanvasGradient) { + value = core_defaults.global.defaultColor; + } + + return chartjsColor(value); + }; + + helpers$1.getHoverColor = function(colorValue) { + /* global CanvasPattern */ + return (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ? + colorValue : + helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString(); + }; +}; + +function abstract() { + throw new Error( + 'This method is not implemented: either no adapter can ' + + 'be found or an incomplete integration was provided.' + ); +} + +/** + * Date adapter (current used by the time scale) + * @namespace Chart._adapters._date + * @memberof Chart._adapters + * @private + */ + +/** + * Currently supported unit string values. + * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')} + * @memberof Chart._adapters._date + * @name Unit + */ + +/** + * @class + */ +function DateAdapter(options) { + this.options = options || {}; +} + +helpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */ { + /** + * Returns a map of time formats for the supported formatting units defined + * in Unit as well as 'datetime' representing a detailed date/time string. + * @returns {{string: string}} + */ + formats: abstract, + + /** + * Parses the given `value` and return the associated timestamp. + * @param {any} value - the value to parse (usually comes from the data) + * @param {string} [format] - the expected data format + * @returns {(number|null)} + * @function + */ + parse: abstract, + + /** + * Returns the formatted date in the specified `format` for a given `timestamp`. + * @param {number} timestamp - the timestamp to format + * @param {string} format - the date/time token + * @return {string} + * @function + */ + format: abstract, + + /** + * Adds the specified `amount` of `unit` to the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {number} amount - the amount to add + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + add: abstract, + + /** + * Returns the number of `unit` between the given timestamps. + * @param {number} max - the input timestamp (reference) + * @param {number} min - the timestamp to substract + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + diff: abstract, + + /** + * Returns start of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @param {number} [weekday] - the ISO day of the week with 1 being Monday + * and 7 being Sunday (only needed if param *unit* is `isoWeek`). + * @function + */ + startOf: abstract, + + /** + * Returns end of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @function + */ + endOf: abstract, + + // DEPRECATIONS + + /** + * Provided for backward compatibility for scale.getValueForPixel(), + * this method should be overridden only by the moment adapter. + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function(value) { + return value; + } +}); + +DateAdapter.override = function(members) { + helpers$1.extend(DateAdapter.prototype, members); +}; + +var _date = DateAdapter; + +var core_adapters = { + _date: _date +}; + +/** + * Namespace to hold static tick generation functions + * @namespace Chart.Ticks + */ +var core_ticks = { + /** + * Namespace to hold formatters for different types of ticks + * @namespace Chart.Ticks.formatters + */ + formatters: { + /** + * Formatter for value labels + * @method Chart.Ticks.formatters.values + * @param value the value to display + * @return {string|string[]} the label to display + */ + values: function(value) { + return helpers$1.isArray(value) ? value : '' + value; + }, + + /** + * Formatter for linear numeric ticks + * @method Chart.Ticks.formatters.linear + * @param tickValue {number} the value to be formatted + * @param index {number} the position of the tickValue parameter in the ticks array + * @param ticks {number[]} the list of ticks being converted + * @return {string} string representation of the tickValue parameter + */ + linear: function(tickValue, index, ticks) { + // If we have lots of ticks, don't use the ones + var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; + + // If we have a number like 2.5 as the delta, figure out how many decimal places we need + if (Math.abs(delta) > 1) { + if (tickValue !== Math.floor(tickValue)) { + // not an integer + delta = tickValue - Math.floor(tickValue); + } + } + + var logDelta = helpers$1.log10(Math.abs(delta)); + var tickString = ''; + + if (tickValue !== 0) { + var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1])); + if (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation + var logTick = helpers$1.log10(Math.abs(tickValue)); + tickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta)); + } else { + var numDecimal = -1 * Math.floor(logDelta); + numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places + tickString = tickValue.toFixed(numDecimal); + } + } else { + tickString = '0'; // never show decimal places for 0 + } + + return tickString; + }, + + logarithmic: function(tickValue, index, ticks) { + var remain = tickValue / (Math.pow(10, Math.floor(helpers$1.log10(tickValue)))); + + if (tickValue === 0) { + return '0'; + } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { + return tickValue.toExponential(); + } + return ''; + } + } +}; + +var valueOrDefault$9 = helpers$1.valueOrDefault; +var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault; + +core_defaults._set('scale', { + display: true, + position: 'left', + offset: false, + + // grid line settings + gridLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + drawBorder: true, + drawOnChartArea: true, + drawTicks: true, + tickMarkLength: 10, + zeroLineWidth: 1, + zeroLineColor: 'rgba(0,0,0,0.25)', + zeroLineBorderDash: [], + zeroLineBorderDashOffset: 0.0, + offsetGridLines: false, + borderDash: [], + borderDashOffset: 0.0 + }, + + // scale label + scaleLabel: { + // display property + display: false, + + // actual label + labelString: '', + + // top/bottom padding + padding: { + top: 4, + bottom: 4 + } + }, + + // label settings + ticks: { + beginAtZero: false, + minRotation: 0, + maxRotation: 50, + mirror: false, + padding: 0, + reverse: false, + display: true, + autoSkip: true, + autoSkipPadding: 0, + labelOffset: 0, + // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. + callback: core_ticks.formatters.values, + minor: {}, + major: {} + } +}); + +function labelsFromTicks(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(ticks[i].label); + } + + return labels; +} + +function getPixelForGridLine(scale, index, offsetGridLines) { + var lineValue = scale.getPixelForTick(index); + + if (offsetGridLines) { + if (scale.getTicks().length === 1) { + lineValue -= scale.isHorizontal() ? + Math.max(lineValue - scale.left, scale.right - lineValue) : + Math.max(lineValue - scale.top, scale.bottom - lineValue); + } else if (index === 0) { + lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; + } else { + lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; + } + } + return lineValue; +} + +function computeTextSize(context, tick, font) { + return helpers$1.isArray(tick) ? + helpers$1.longestText(context, font, tick) : + context.measureText(tick).width; +} + +var core_scale = core_element.extend({ + /** + * Get the padding needed for the scale + * @method getPadding + * @private + * @returns {Padding} the necessary padding + */ + getPadding: function() { + var me = this; + return { + left: me.paddingLeft || 0, + top: me.paddingTop || 0, + right: me.paddingRight || 0, + bottom: me.paddingBottom || 0 + }; + }, + + /** + * Returns the scale tick objects ({label, major}) + * @since 2.7 + */ + getTicks: function() { + return this._ticks; + }, + + // These methods are ordered by lifecyle. Utilities then follow. + // Any function defined here is inherited by all scale types. + // Any function can be extended by the scale type + + mergeTicksOptions: function() { + var ticks = this.options.ticks; + if (ticks.minor === false) { + ticks.minor = { + display: false + }; + } + if (ticks.major === false) { + ticks.major = { + display: false + }; + } + for (var key in ticks) { + if (key !== 'major' && key !== 'minor') { + if (typeof ticks.minor[key] === 'undefined') { + ticks.minor[key] = ticks[key]; + } + if (typeof ticks.major[key] === 'undefined') { + ticks.major[key] = ticks[key]; + } + } + } + }, + beforeUpdate: function() { + helpers$1.callback(this.options.beforeUpdate, [this]); + }, + + update: function(maxWidth, maxHeight, margins) { + var me = this; + var i, ilen, labels, label, ticks, tick; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = helpers$1.extend({ + left: 0, + right: 0, + top: 0, + bottom: 0 + }, margins); + + me._maxLabelLines = 0; + me.longestLabelWidth = 0; + me.longestTextCache = me.longestTextCache || {}; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + + // Data min/max + me.beforeDataLimits(); + me.determineDataLimits(); + me.afterDataLimits(); + + // Ticks - `this.ticks` is now DEPRECATED! + // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member + // and must not be accessed directly from outside this class. `this.ticks` being + // around for long time and not marked as private, we can't change its structure + // without unexpected breaking changes. If you need to access the scale ticks, + // use scale.getTicks() instead. + + me.beforeBuildTicks(); + + // New implementations should return an array of objects but for BACKWARD COMPAT, + // we still support no return (`this.ticks` internally set by calling this method). + ticks = me.buildTicks() || []; + + // Allow modification of ticks in callback. + ticks = me.afterBuildTicks(ticks) || ticks; + + me.beforeTickToLabelConversion(); + + // New implementations should return the formatted tick labels but for BACKWARD + // COMPAT, we still support no return (`this.ticks` internally changed by calling + // this method and supposed to contain only string values). + labels = me.convertTicksToLabels(ticks) || me.ticks; + + me.afterTickToLabelConversion(); + + me.ticks = labels; // BACKWARD COMPATIBILITY + + // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! + + // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) + for (i = 0, ilen = labels.length; i < ilen; ++i) { + label = labels[i]; + tick = ticks[i]; + if (!tick) { + ticks.push(tick = { + label: label, + major: false + }); + } else { + tick.label = label; + } + } + + me._ticks = ticks; + + // Tick Rotation + me.beforeCalculateTickRotation(); + me.calculateTickRotation(); + me.afterCalculateTickRotation(); + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: function() { + helpers$1.callback(this.options.afterUpdate, [this]); + }, + + // + + beforeSetDimensions: function() { + helpers$1.callback(this.options.beforeSetDimensions, [this]); + }, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + }, + afterSetDimensions: function() { + helpers$1.callback(this.options.afterSetDimensions, [this]); + }, + + // Data limits + beforeDataLimits: function() { + helpers$1.callback(this.options.beforeDataLimits, [this]); + }, + determineDataLimits: helpers$1.noop, + afterDataLimits: function() { + helpers$1.callback(this.options.afterDataLimits, [this]); + }, + + // + beforeBuildTicks: function() { + helpers$1.callback(this.options.beforeBuildTicks, [this]); + }, + buildTicks: helpers$1.noop, + afterBuildTicks: function(ticks) { + var me = this; + // ticks is empty for old axis implementations here + if (helpers$1.isArray(ticks) && ticks.length) { + return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]); + } + // Support old implementations (that modified `this.ticks` directly in buildTicks) + me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks; + return ticks; + }, + + beforeTickToLabelConversion: function() { + helpers$1.callback(this.options.beforeTickToLabelConversion, [this]); + }, + convertTicksToLabels: function() { + var me = this; + // Convert ticks to strings + var tickOpts = me.options.ticks; + me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); + }, + afterTickToLabelConversion: function() { + helpers$1.callback(this.options.afterTickToLabelConversion, [this]); + }, + + // + + beforeCalculateTickRotation: function() { + helpers$1.callback(this.options.beforeCalculateTickRotation, [this]); + }, + calculateTickRotation: function() { + var me = this; + var context = me.ctx; + var tickOpts = me.options.ticks; + var labels = labelsFromTicks(me._ticks); + + // Get the width of each grid by calculating the difference + // between x offsets between 0 and 1. + var tickFont = helpers$1.options._parseFont(tickOpts); + context.font = tickFont.string; + + var labelRotation = tickOpts.minRotation || 0; + + if (labels.length && me.options.display && me.isHorizontal()) { + var originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache); + var labelWidth = originalLabelWidth; + var cosRotation, sinRotation; + + // Allow 3 pixels x2 padding either side for label readability + var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; + + // Max label rotation can be set or default to 90 - also act as a loop counter + while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { + var angleRadians = helpers$1.toRadians(labelRotation); + cosRotation = Math.cos(angleRadians); + sinRotation = Math.sin(angleRadians); + + if (sinRotation * originalLabelWidth > me.maxHeight) { + // go back one step + labelRotation--; + break; + } + + labelRotation++; + labelWidth = cosRotation * originalLabelWidth; + } + } + + me.labelRotation = labelRotation; + }, + afterCalculateTickRotation: function() { + helpers$1.callback(this.options.afterCalculateTickRotation, [this]); + }, + + // + + beforeFit: function() { + helpers$1.callback(this.options.beforeFit, [this]); + }, + fit: function() { + var me = this; + // Reset + var minSize = me.minSize = { + width: 0, + height: 0 + }; + + var labels = labelsFromTicks(me._ticks); + + var opts = me.options; + var tickOpts = opts.ticks; + var scaleLabelOpts = opts.scaleLabel; + var gridLineOpts = opts.gridLines; + var display = me._isVisible(); + var position = opts.position; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var tickFont = parseFont(tickOpts); + var tickMarkLength = opts.gridLines.tickMarkLength; + + // Width + if (isHorizontal) { + // subtract the margins to line up with the chartArea if we are a full width scale + minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; + } else { + minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } + + // height + if (isHorizontal) { + minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } else { + minSize.height = me.maxHeight; // fill all the height + } + + // Are we showing a title for the scale? + if (scaleLabelOpts.display && display) { + var scaleLabelFont = parseFont(scaleLabelOpts); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding); + var deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height; + + if (isHorizontal) { + minSize.height += deltaHeight; + } else { + minSize.width += deltaHeight; + } + } + + // Don't bother fitting the ticks if we are not showing the labels + if (tickOpts.display && display) { + var largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache); + var tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels); + var lineSpace = tickFont.size * 0.5; + var tickPadding = me.options.ticks.padding; + + // Store max number of lines and widest label for _autoSkip + me._maxLabelLines = tallestLabelHeightInLines; + me.longestLabelWidth = largestTextWidth; + + if (isHorizontal) { + var angleRadians = helpers$1.toRadians(me.labelRotation); + var cosRotation = Math.cos(angleRadians); + var sinRotation = Math.sin(angleRadians); + + // TODO - improve this calculation + var labelHeight = (sinRotation * largestTextWidth) + + (tickFont.lineHeight * tallestLabelHeightInLines) + + lineSpace; // padding + + minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); + + me.ctx.font = tickFont.string; + var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string); + var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string); + var offsetLeft = me.getPixelForTick(0) - me.left; + var offsetRight = me.right - me.getPixelForTick(labels.length - 1); + var paddingLeft, paddingRight; + + // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned + // which means that the right padding is dominated by the font height + if (me.labelRotation !== 0) { + paddingLeft = position === 'bottom' ? (cosRotation * firstLabelWidth) : (cosRotation * lineSpace); + paddingRight = position === 'bottom' ? (cosRotation * lineSpace) : (cosRotation * lastLabelWidth); + } else { + paddingLeft = firstLabelWidth / 2; + paddingRight = lastLabelWidth / 2; + } + me.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges + me.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3; + } else { + // A vertical axis is more constrained by the width. Labels are the + // dominant factor here, so get that length first and account for padding + if (tickOpts.mirror) { + largestTextWidth = 0; + } else { + // use lineSpace for consistency with horizontal axis + // tickPadding is not implemented for horizontal + largestTextWidth += tickPadding + lineSpace; + } + + minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); + + me.paddingTop = tickFont.size / 2; + me.paddingBottom = tickFont.size / 2; + } + } + + me.handleMargins(); + + me.width = minSize.width; + me.height = minSize.height; + }, + + /** + * Handle margins and padding interactions + * @private + */ + handleMargins: function() { + var me = this; + if (me.margins) { + me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); + me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); + me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); + me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); + } + }, + + afterFit: function() { + helpers$1.callback(this.options.afterFit, [this]); + }, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + isFullWidth: function() { + return (this.options.fullWidth); + }, + + // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not + getRightValue: function(rawValue) { + // Null and undefined values first + if (helpers$1.isNullOrUndef(rawValue)) { + return NaN; + } + // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values + if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) { + return NaN; + } + // If it is in fact an object, dive in one more level + if (rawValue) { + if (this.isHorizontal()) { + if (rawValue.x !== undefined) { + return this.getRightValue(rawValue.x); + } + } else if (rawValue.y !== undefined) { + return this.getRightValue(rawValue.y); + } + } + + // Value is good, return it + return rawValue; + }, + + /** + * Used to get the value to display in the tooltip for the data at the given index + * @param index + * @param datasetIndex + */ + getLabelForIndex: helpers$1.noop, + + /** + * Returns the location of the given data point. Value can either be an index or a numerical value + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param value + * @param index + * @param datasetIndex + */ + getPixelForValue: helpers$1.noop, + + /** + * Used to get the data value from a given pixel. This is the inverse of getPixelForValue + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param pixel + */ + getValueForPixel: helpers$1.noop, + + /** + * Returns the location of the tick at the given index + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForTick: function(index) { + var me = this; + var offset = me.options.offset; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var pixel = (tickWidth * index) + me.paddingLeft; + + if (offset) { + pixel += tickWidth / 2; + } + + var finalVal = me.left + pixel; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + var innerHeight = me.height - (me.paddingTop + me.paddingBottom); + return me.top + (index * (innerHeight / (me._ticks.length - 1))); + }, + + /** + * Utility for getting the pixel location of a percentage of scale + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForDecimal: function(decimal) { + var me = this; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var valueOffset = (innerWidth * decimal) + me.paddingLeft; + + var finalVal = me.left + valueOffset; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + return me.top + (decimal * me.height); + }, + + /** + * Returns the pixel for the minimum chart value + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getBasePixel: function() { + return this.getPixelForValue(this.getBaseValue()); + }, + + getBaseValue: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0; + }, + + /** + * Returns a subset of ticks to be plotted to avoid overlapping labels. + * @private + */ + _autoSkip: function(ticks) { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + var tickCount = ticks.length; + var skipRatio = false; + var maxTicks = optionTicks.maxTicksLimit; + + // Total space needed to display all ticks. First and last ticks are + // drawn as their center at end of axis, so tickCount-1 + var ticksLength = me._tickSize() * (tickCount - 1); + + // Axis length + var axisLength = isHorizontal + ? me.width - (me.paddingLeft + me.paddingRight) + : me.height - (me.paddingTop + me.PaddingBottom); + + var result = []; + var i, tick; + + if (ticksLength > axisLength) { + skipRatio = 1 + Math.floor(ticksLength / axisLength); + } + + // if they defined a max number of optionTicks, + // increase skipRatio until that number is met + if (tickCount > maxTicks) { + skipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks)); + } + + for (i = 0; i < tickCount; i++) { + tick = ticks[i]; + + if (skipRatio > 1 && i % skipRatio > 0) { + // leave tick in place but make sure it's not displayed (#4635) + delete tick.label; + } + result.push(tick); + } + return result; + }, + + /** + * @private + */ + _tickSize: function() { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + + // Calculate space needed by label in axis direction. + var rot = helpers$1.toRadians(me.labelRotation); + var cos = Math.abs(Math.cos(rot)); + var sin = Math.abs(Math.sin(rot)); + + var padding = optionTicks.autoSkipPadding || 0; + var w = (me.longestLabelWidth + padding) || 0; + + var tickFont = helpers$1.options._parseFont(optionTicks); + var h = (me._maxLabelLines * tickFont.lineHeight + padding) || 0; + + // Calculate space needed for 1 tick in axis direction. + return isHorizontal + ? h * cos > w * sin ? w / cos : h / sin + : h * sin < w * cos ? h / cos : w / sin; + }, + + /** + * @private + */ + _isVisible: function() { + var me = this; + var chart = me.chart; + var display = me.options.display; + var i, ilen, meta; + + if (display !== 'auto') { + return !!display; + } + + // When 'auto', the scale is visible if at least one associated dataset is visible. + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + if (meta.xAxisID === me.id || meta.yAxisID === me.id) { + return true; + } + } + } + + return false; + }, + + /** + * Actually draw the scale on the canvas + * @param {object} chartArea - the area of the chart to draw full grid lines on + */ + draw: function(chartArea) { + var me = this; + var options = me.options; + + if (!me._isVisible()) { + return; + } + + var chart = me.chart; + var context = me.ctx; + var globalDefaults = core_defaults.global; + var defaultFontColor = globalDefaults.defaultFontColor; + var optionTicks = options.ticks.minor; + var optionMajorTicks = options.ticks.major || optionTicks; + var gridLines = options.gridLines; + var scaleLabel = options.scaleLabel; + var position = options.position; + + var isRotated = me.labelRotation !== 0; + var isMirrored = optionTicks.mirror; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); + var tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor); + var tickFont = parseFont(optionTicks); + var lineHeight = tickFont.lineHeight; + var majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor); + var majorTickFont = parseFont(optionMajorTicks); + var tickPadding = optionTicks.padding; + var labelOffset = optionTicks.labelOffset; + + var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; + + var scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor); + var scaleLabelFont = parseFont(scaleLabel); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding); + var labelRotationRadians = helpers$1.toRadians(me.labelRotation); + + var itemsToDraw = []; + + var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0; + var alignPixel = helpers$1._alignPixel; + var borderValue, tickStart, tickEnd; + + if (position === 'top') { + borderValue = alignPixel(chart, me.bottom, axisWidth); + tickStart = me.bottom - tl; + tickEnd = borderValue - axisWidth / 2; + } else if (position === 'bottom') { + borderValue = alignPixel(chart, me.top, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.top + tl; + } else if (position === 'left') { + borderValue = alignPixel(chart, me.right, axisWidth); + tickStart = me.right - tl; + tickEnd = borderValue - axisWidth / 2; + } else { + borderValue = alignPixel(chart, me.left, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.left + tl; + } + + var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error. + + helpers$1.each(ticks, function(tick, index) { + // autoskipper skipped this tick (#4635) + if (helpers$1.isNullOrUndef(tick.label)) { + return; + } + + var label = tick.label; + var lineWidth, lineColor, borderDash, borderDashOffset; + if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { + // Draw the first index specially + lineWidth = gridLines.zeroLineWidth; + lineColor = gridLines.zeroLineColor; + borderDash = gridLines.zeroLineBorderDash || []; + borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0; + } else { + lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index); + lineColor = valueAtIndexOrDefault(gridLines.color, index); + borderDash = gridLines.borderDash || []; + borderDashOffset = gridLines.borderDashOffset || 0.0; + } + + // Common properties + var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign; + var labelCount = helpers$1.isArray(label) ? label.length : 1; + var lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines); + + if (isHorizontal) { + var labelYOffset = tl + tickPadding; + + if (lineValue < me.left - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth); + ty1 = tickStart; + ty2 = tickEnd; + labelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option) + + if (position === 'top') { + y1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2; + y2 = chartArea.bottom; + textOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight; + textAlign = !isRotated ? 'center' : 'left'; + labelY = me.bottom - labelYOffset; + } else { + y1 = chartArea.top; + y2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2; + textOffset = (!isRotated ? 0.5 : 0) * lineHeight; + textAlign = !isRotated ? 'center' : 'right'; + labelY = me.top + labelYOffset; + } + } else { + var labelXOffset = (isMirrored ? 0 : tl) + tickPadding; + + if (lineValue < me.top - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tickStart; + tx2 = tickEnd; + ty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth); + labelY = me.getPixelForTick(index) + labelOffset; + textOffset = (1 - labelCount) * lineHeight / 2; + + if (position === 'left') { + x1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2; + x2 = chartArea.right; + textAlign = isMirrored ? 'left' : 'right'; + labelX = me.right - labelXOffset; + } else { + x1 = chartArea.left; + x2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2; + textAlign = isMirrored ? 'right' : 'left'; + labelX = me.left + labelXOffset; + } + } + + itemsToDraw.push({ + tx1: tx1, + ty1: ty1, + tx2: tx2, + ty2: ty2, + x1: x1, + y1: y1, + x2: x2, + y2: y2, + labelX: labelX, + labelY: labelY, + glWidth: lineWidth, + glColor: lineColor, + glBorderDash: borderDash, + glBorderDashOffset: borderDashOffset, + rotation: -1 * labelRotationRadians, + label: label, + major: tick.major, + textOffset: textOffset, + textAlign: textAlign + }); + }); + + // Draw all of the tick labels, tick marks, and grid lines at the correct places + helpers$1.each(itemsToDraw, function(itemToDraw) { + var glWidth = itemToDraw.glWidth; + var glColor = itemToDraw.glColor; + + if (gridLines.display && glWidth && glColor) { + context.save(); + context.lineWidth = glWidth; + context.strokeStyle = glColor; + if (context.setLineDash) { + context.setLineDash(itemToDraw.glBorderDash); + context.lineDashOffset = itemToDraw.glBorderDashOffset; + } + + context.beginPath(); + + if (gridLines.drawTicks) { + context.moveTo(itemToDraw.tx1, itemToDraw.ty1); + context.lineTo(itemToDraw.tx2, itemToDraw.ty2); + } + + if (gridLines.drawOnChartArea) { + context.moveTo(itemToDraw.x1, itemToDraw.y1); + context.lineTo(itemToDraw.x2, itemToDraw.y2); + } + + context.stroke(); + context.restore(); + } + + if (optionTicks.display) { + // Make sure we draw text in the correct color and font + context.save(); + context.translate(itemToDraw.labelX, itemToDraw.labelY); + context.rotate(itemToDraw.rotation); + context.font = itemToDraw.major ? majorTickFont.string : tickFont.string; + context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; + context.textBaseline = 'middle'; + context.textAlign = itemToDraw.textAlign; + + var label = itemToDraw.label; + var y = itemToDraw.textOffset; + if (helpers$1.isArray(label)) { + for (var i = 0; i < label.length; ++i) { + // We just make sure the multiline element is a string here.. + context.fillText('' + label[i], 0, y); + y += lineHeight; + } + } else { + context.fillText(label, 0, y); + } + context.restore(); + } + }); + + if (scaleLabel.display) { + // Draw the scale label + var scaleLabelX; + var scaleLabelY; + var rotation = 0; + var halfLineHeight = scaleLabelFont.lineHeight / 2; + + if (isHorizontal) { + scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width + scaleLabelY = position === 'bottom' + ? me.bottom - halfLineHeight - scaleLabelPadding.bottom + : me.top + halfLineHeight + scaleLabelPadding.top; + } else { + var isLeft = position === 'left'; + scaleLabelX = isLeft + ? me.left + halfLineHeight + scaleLabelPadding.top + : me.right - halfLineHeight - scaleLabelPadding.top; + scaleLabelY = me.top + ((me.bottom - me.top) / 2); + rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; + } + + context.save(); + context.translate(scaleLabelX, scaleLabelY); + context.rotate(rotation); + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.fillStyle = scaleLabelFontColor; // render in correct colour + context.font = scaleLabelFont.string; + context.fillText(scaleLabel.labelString, 0, 0); + context.restore(); + } + + if (axisWidth) { + // Draw the line at the edge of the axis + var firstLineWidth = axisWidth; + var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0); + var x1, x2, y1, y2; + + if (isHorizontal) { + x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2; + x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2; + y1 = y2 = borderValue; + } else { + y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2; + y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2; + x1 = x2 = borderValue; + } + + context.lineWidth = axisWidth; + context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0); + context.beginPath(); + context.moveTo(x1, y1); + context.lineTo(x2, y2); + context.stroke(); + } + } +}); + +var defaultConfig = { + position: 'bottom' +}; + +var scale_category = core_scale.extend({ + /** + * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those + * else fall back to data.labels + * @private + */ + getLabels: function() { + var data = this.chart.data; + return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; + }, + + determineDataLimits: function() { + var me = this; + var labels = me.getLabels(); + me.minIndex = 0; + me.maxIndex = labels.length - 1; + var findIndex; + + if (me.options.ticks.min !== undefined) { + // user specified min value + findIndex = labels.indexOf(me.options.ticks.min); + me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; + } + + if (me.options.ticks.max !== undefined) { + // user specified max value + findIndex = labels.indexOf(me.options.ticks.max); + me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; + } + + me.min = labels[me.minIndex]; + me.max = labels[me.maxIndex]; + }, + + buildTicks: function() { + var me = this; + var labels = me.getLabels(); + // If we are viewing some subset of labels, slice the original array + me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var chart = me.chart; + + if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) { + return me.getRightValue(chart.data.datasets[datasetIndex].data[index]); + } + + return me.ticks[index - me.minIndex]; + }, + + // Used to get data value locations. Value can either be an index or a numerical value + getPixelForValue: function(value, index) { + var me = this; + var offset = me.options.offset; + // 1 is added because we need the length but we have the indexes + var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); + + // If value is a data object, then index is the index in the data array, + // not the index of the scale. We need to change that. + var valueCategory; + if (value !== undefined && value !== null) { + valueCategory = me.isHorizontal() ? value.x : value.y; + } + if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { + var labels = me.getLabels(); + value = valueCategory || value; + var idx = labels.indexOf(value); + index = idx !== -1 ? idx : index; + } + + if (me.isHorizontal()) { + var valueWidth = me.width / offsetAmt; + var widthOffset = (valueWidth * (index - me.minIndex)); + + if (offset) { + widthOffset += (valueWidth / 2); + } + + return me.left + widthOffset; + } + var valueHeight = me.height / offsetAmt; + var heightOffset = (valueHeight * (index - me.minIndex)); + + if (offset) { + heightOffset += (valueHeight / 2); + } + + return me.top + heightOffset; + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); + }, + + getValueForPixel: function(pixel) { + var me = this; + var offset = me.options.offset; + var value; + var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var horz = me.isHorizontal(); + var valueDimension = (horz ? me.width : me.height) / offsetAmt; + + pixel -= horz ? me.left : me.top; + + if (offset) { + pixel -= (valueDimension / 2); + } + + if (pixel <= 0) { + value = 0; + } else { + value = Math.round(pixel / valueDimension); + } + + return value + me.minIndex; + }, + + getBasePixel: function() { + return this.bottom; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults = defaultConfig; +scale_category._defaults = _defaults; + +var noop = helpers$1.noop; +var isNullOrUndef = helpers$1.isNullOrUndef; + +/** + * Generate a set of linear ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ +function generateTicks(generationOptions, dataRange) { + var ticks = []; + // To get a "nice" value for the tick spacing, we will use the appropriately named + // "nice number" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks + // for details. + + var MIN_SPACING = 1e-14; + var stepSize = generationOptions.stepSize; + var unit = stepSize || 1; + var maxNumSpaces = generationOptions.maxTicks - 1; + var min = generationOptions.min; + var max = generationOptions.max; + var precision = generationOptions.precision; + var rmin = dataRange.min; + var rmax = dataRange.max; + var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit; + var factor, niceMin, niceMax, numSpaces; + + // Beyond MIN_SPACING floating point numbers being to lose precision + // such that we can't do the math necessary to generate ticks + if (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) { + return [rmin, rmax]; + } + + numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); + if (numSpaces > maxNumSpaces) { + // If the calculated num of spaces exceeds maxNumSpaces, recalculate it + spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit; + } + + if (stepSize || isNullOrUndef(precision)) { + // If a precision is not specified, calculate factor based on spacing + factor = Math.pow(10, helpers$1._decimalPlaces(spacing)); + } else { + // If the user specified a precision, round to that number of decimal places + factor = Math.pow(10, precision); + spacing = Math.ceil(spacing * factor) / factor; + } + + niceMin = Math.floor(rmin / spacing) * spacing; + niceMax = Math.ceil(rmax / spacing) * spacing; + + // If min, max and stepSize is set and they make an evenly spaced scale use it. + if (stepSize) { + // If very close to our whole number, use it. + if (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) { + niceMin = min; + } + if (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) { + niceMax = max; + } + } + + numSpaces = (niceMax - niceMin) / spacing; + // If very close to our rounded value, use it. + if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { + numSpaces = Math.round(numSpaces); + } else { + numSpaces = Math.ceil(numSpaces); + } + + niceMin = Math.round(niceMin * factor) / factor; + niceMax = Math.round(niceMax * factor) / factor; + ticks.push(isNullOrUndef(min) ? niceMin : min); + for (var j = 1; j < numSpaces; ++j) { + ticks.push(Math.round((niceMin + j * spacing) * factor) / factor); + } + ticks.push(isNullOrUndef(max) ? niceMax : max); + + return ticks; +} + +var scale_linearbase = core_scale.extend({ + getRightValue: function(value) { + if (typeof value === 'string') { + return +value; + } + return core_scale.prototype.getRightValue.call(this, value); + }, + + handleTickRangeOptions: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, + // do nothing since that would make the chart weird. If the user really wants a weird chart + // axis, they can manually override it + if (tickOpts.beginAtZero) { + var minSign = helpers$1.sign(me.min); + var maxSign = helpers$1.sign(me.max); + + if (minSign < 0 && maxSign < 0) { + // move the top up to 0 + me.max = 0; + } else if (minSign > 0 && maxSign > 0) { + // move the bottom down to 0 + me.min = 0; + } + } + + var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; + var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; + + if (tickOpts.min !== undefined) { + me.min = tickOpts.min; + } else if (tickOpts.suggestedMin !== undefined) { + if (me.min === null) { + me.min = tickOpts.suggestedMin; + } else { + me.min = Math.min(me.min, tickOpts.suggestedMin); + } + } + + if (tickOpts.max !== undefined) { + me.max = tickOpts.max; + } else if (tickOpts.suggestedMax !== undefined) { + if (me.max === null) { + me.max = tickOpts.suggestedMax; + } else { + me.max = Math.max(me.max, tickOpts.suggestedMax); + } + } + + if (setMin !== setMax) { + // We set the min or the max but not both. + // So ensure that our range is good + // Inverted or 0 length range can happen when + // ticks.min is set, and no datasets are visible + if (me.min >= me.max) { + if (setMin) { + me.max = me.min + 1; + } else { + me.min = me.max - 1; + } + } + } + + if (me.min === me.max) { + me.max++; + + if (!tickOpts.beginAtZero) { + me.min--; + } + } + }, + + getTickLimit: function() { + var me = this; + var tickOpts = me.options.ticks; + var stepSize = tickOpts.stepSize; + var maxTicksLimit = tickOpts.maxTicksLimit; + var maxTicks; + + if (stepSize) { + maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1; + } else { + maxTicks = me._computeTickLimit(); + maxTicksLimit = maxTicksLimit || 11; + } + + if (maxTicksLimit) { + maxTicks = Math.min(maxTicksLimit, maxTicks); + } + + return maxTicks; + }, + + _computeTickLimit: function() { + return Number.POSITIVE_INFINITY; + }, + + handleDirectionalChanges: noop, + + buildTicks: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // Figure out what the max number of ticks we can support it is based on the size of + // the axis area. For now, we say that the minimum tick spacing in pixels must be 40 + // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on + // the graph. Make sure we always have at least 2 ticks + var maxTicks = me.getTickLimit(); + maxTicks = Math.max(2, maxTicks); + + var numericGeneratorOptions = { + maxTicks: maxTicks, + min: tickOpts.min, + max: tickOpts.max, + precision: tickOpts.precision, + stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) + }; + var ticks = me.ticks = generateTicks(numericGeneratorOptions, me); + + me.handleDirectionalChanges(); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + ticks.reverse(); + + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + }, + + convertTicksToLabels: function() { + var me = this; + me.ticksAsNumbers = me.ticks.slice(); + me.zeroLineIndex = me.ticks.indexOf(0); + + core_scale.prototype.convertTicksToLabels.call(me); + } +}); + +var defaultConfig$1 = { + position: 'left', + ticks: { + callback: core_ticks.formatters.linear + } +}; + +var scale_linear = scale_linearbase.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + var DEFAULT_MIN = 0; + var DEFAULT_MAX = 1; + + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // First Calculate the range + me.min = null; + me.max = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = { + positiveValues: [], + negativeValues: [] + }; + } + + // Store these per type + var positiveValues = valuesPerStack[key].positiveValues; + var negativeValues = valuesPerStack[key].negativeValues; + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + positiveValues[index] = positiveValues[index] || 0; + negativeValues[index] = negativeValues[index] || 0; + + if (opts.relativePoints) { + positiveValues[index] = 100; + } else if (value < 0) { + negativeValues[index] += value; + } else { + positiveValues[index] += value; + } + }); + } + }); + + helpers$1.each(valuesPerStack, function(valuesForType) { + var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); + var minVal = helpers$1.min(values); + var maxVal = helpers$1.max(values); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + }); + + } else { + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + }); + } + }); + } + + me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; + me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + this.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function() { + var me = this; + var tickFont; + + if (me.isHorizontal()) { + return Math.ceil(me.width / 40); + } + tickFont = helpers$1.options._parseFont(me.options.ticks); + return Math.ceil(me.height / tickFont.lineHeight); + }, + + // Called after the ticks are built. We need + handleDirectionalChanges: function() { + if (!this.isHorizontal()) { + // We are in a vertical orientation. The top value is the highest. So reverse the array + this.ticks.reverse(); + } + }, + + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + // Utils + getPixelForValue: function(value) { + // This must be called after fit has been run so that + // this.left, this.top, this.right, and this.bottom have been defined + var me = this; + var start = me.start; + + var rightValue = +me.getRightValue(value); + var pixel; + var range = me.end - start; + + if (me.isHorizontal()) { + pixel = me.left + (me.width / range * (rightValue - start)); + } else { + pixel = me.bottom - (me.height / range * (rightValue - start)); + } + return pixel; + }, + + getValueForPixel: function(pixel) { + var me = this; + var isHorizontal = me.isHorizontal(); + var innerDimension = isHorizontal ? me.width : me.height; + var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; + return me.start + ((me.end - me.start) * offset); + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticksAsNumbers[index]); + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$1 = defaultConfig$1; +scale_linear._defaults = _defaults$1; + +var valueOrDefault$a = helpers$1.valueOrDefault; + +/** + * Generate a set of logarithmic ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ +function generateTicks$1(generationOptions, dataRange) { + var ticks = []; + + var tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min)))); + + var endExp = Math.floor(helpers$1.log10(dataRange.max)); + var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); + var exp, significand; + + if (tickVal === 0) { + exp = Math.floor(helpers$1.log10(dataRange.minNotZero)); + significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); + + ticks.push(tickVal); + tickVal = significand * Math.pow(10, exp); + } else { + exp = Math.floor(helpers$1.log10(tickVal)); + significand = Math.floor(tickVal / Math.pow(10, exp)); + } + var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; + + do { + ticks.push(tickVal); + + ++significand; + if (significand === 10) { + significand = 1; + ++exp; + precision = exp >= 0 ? 1 : precision; + } + + tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision; + } while (exp < endExp || (exp === endExp && significand < endSignificand)); + + var lastTick = valueOrDefault$a(generationOptions.max, tickVal); + ticks.push(lastTick); + + return ticks; +} + +var defaultConfig$2 = { + position: 'left', + + // label settings + ticks: { + callback: core_ticks.formatters.logarithmic + } +}; + +// TODO(v3): change this to positiveOrDefault +function nonNegativeOrDefault(value, defaultValue) { + return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue; +} + +var scale_logarithmic = core_scale.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // Calculate Range + me.min = null; + me.max = null; + me.minNotZero = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = []; + } + + helpers$1.each(dataset.data, function(rawValue, index) { + var values = valuesPerStack[key]; + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + values[index] = values[index] || 0; + values[index] += value; + }); + } + }); + + helpers$1.each(valuesPerStack, function(valuesForType) { + if (valuesForType.length > 0) { + var minVal = helpers$1.min(valuesForType); + var maxVal = helpers$1.max(valuesForType); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + } + }); + + } else { + helpers$1.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + + if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { + me.minNotZero = value; + } + }); + } + }); + } + + // Common base implementation to handle ticks.min, ticks.max + this.handleTickRangeOptions(); + }, + + handleTickRangeOptions: function() { + var me = this; + var tickOpts = me.options.ticks; + var DEFAULT_MIN = 1; + var DEFAULT_MAX = 10; + + me.min = nonNegativeOrDefault(tickOpts.min, me.min); + me.max = nonNegativeOrDefault(tickOpts.max, me.max); + + if (me.min === me.max) { + if (me.min !== 0 && me.min !== null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1); + me.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1); + } else { + me.min = DEFAULT_MIN; + me.max = DEFAULT_MAX; + } + } + if (me.min === null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1); + } + if (me.max === null) { + me.max = me.min !== 0 + ? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1) + : DEFAULT_MAX; + } + if (me.minNotZero === null) { + if (me.min > 0) { + me.minNotZero = me.min; + } else if (me.max < 1) { + me.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max))); + } else { + me.minNotZero = DEFAULT_MIN; + } + } + }, + + buildTicks: function() { + var me = this; + var tickOpts = me.options.ticks; + var reverse = !me.isHorizontal(); + + var generationOptions = { + min: nonNegativeOrDefault(tickOpts.min), + max: nonNegativeOrDefault(tickOpts.max) + }; + var ticks = me.ticks = generateTicks$1(generationOptions, me); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + reverse = !reverse; + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + if (reverse) { + ticks.reverse(); + } + }, + + convertTicksToLabels: function() { + this.tickValues = this.ticks.slice(); + + core_scale.prototype.convertTicksToLabels.call(this); + }, + + // Get the correct tooltip label + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + getPixelForTick: function(index) { + return this.getPixelForValue(this.tickValues[index]); + }, + + /** + * Returns the value of the first tick. + * @param {number} value - The minimum not zero value. + * @return {number} The first tick value. + * @private + */ + _getFirstTickValue: function(value) { + var exp = Math.floor(helpers$1.log10(value)); + var significand = Math.floor(value / Math.pow(10, exp)); + + return significand * Math.pow(10, exp); + }, + + getPixelForValue: function(value) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var offset = 0; + var innerDimension, pixel, start, end, sign; + + value = +me.getRightValue(value); + if (reverse) { + start = me.end; + end = me.start; + sign = -1; + } else { + start = me.start; + end = me.end; + sign = 1; + } + if (me.isHorizontal()) { + innerDimension = me.width; + pixel = reverse ? me.right : me.left; + } else { + innerDimension = me.height; + sign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0) + pixel = reverse ? me.top : me.bottom; + } + if (value !== start) { + if (start === 0) { // include zero tick + offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + innerDimension -= offset; + start = firstTickValue; + } + if (value !== 0) { + offset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start)); + } + pixel += sign * offset; + } + return pixel; + }, + + getValueForPixel: function(pixel) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var innerDimension, start, end, value; + + if (reverse) { + start = me.end; + end = me.start; + } else { + start = me.start; + end = me.end; + } + if (me.isHorizontal()) { + innerDimension = me.width; + value = reverse ? me.right - pixel : pixel - me.left; + } else { + innerDimension = me.height; + value = reverse ? pixel - me.top : me.bottom - pixel; + } + if (value !== start) { + if (start === 0) { // include zero tick + var offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + value -= offset; + innerDimension -= offset; + start = firstTickValue; + } + value *= log10(end) - log10(start); + value /= innerDimension; + value = Math.pow(10, log10(start) + value); + } + return value; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$2 = defaultConfig$2; +scale_logarithmic._defaults = _defaults$2; + +var valueOrDefault$b = helpers$1.valueOrDefault; +var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault; +var resolve$7 = helpers$1.options.resolve; + +var defaultConfig$3 = { + display: true, + + // Boolean - Whether to animate scaling the chart from the centre + animate: true, + position: 'chartArea', + + angleLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + borderDash: [], + borderDashOffset: 0.0 + }, + + gridLines: { + circular: false + }, + + // label settings + ticks: { + // Boolean - Show a backdrop to the scale label + showLabelBackdrop: true, + + // String - The colour of the label backdrop + backdropColor: 'rgba(255,255,255,0.75)', + + // Number - The backdrop padding above & below the label in pixels + backdropPaddingY: 2, + + // Number - The backdrop padding to the side of the label in pixels + backdropPaddingX: 2, + + callback: core_ticks.formatters.linear + }, + + pointLabels: { + // Boolean - if true, show point labels + display: true, + + // Number - Point label font size in pixels + fontSize: 10, + + // Function - Used to convert point labels + callback: function(label) { + return label; + } + } +}; + +function getValueCount(scale) { + var opts = scale.options; + return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; +} + +function getTickBackdropHeight(opts) { + var tickOpts = opts.ticks; + + if (tickOpts.display && opts.display) { + return valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2; + } + return 0; +} + +function measureLabelSize(ctx, lineHeight, label) { + if (helpers$1.isArray(label)) { + return { + w: helpers$1.longestText(ctx, ctx.font, label), + h: label.length * lineHeight + }; + } + + return { + w: ctx.measureText(label).width, + h: lineHeight + }; +} + +function determineLimits(angle, pos, size, min, max) { + if (angle === min || angle === max) { + return { + start: pos - (size / 2), + end: pos + (size / 2) + }; + } else if (angle < min || angle > max) { + return { + start: pos - size, + end: pos + }; + } + + return { + start: pos, + end: pos + size + }; +} + +/** + * Helper function to fit a radial linear scale with point labels + */ +function fitWithPointLabels(scale) { + + // Right, this is really confusing and there is a lot of maths going on here + // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + // + // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + // + // Solution: + // + // We assume the radius of the polygon is half the size of the canvas at first + // at each index we check if the text overlaps. + // + // Where it does, we store that angle and that index. + // + // After finding the largest index and angle we calculate how much we need to remove + // from the shape radius to move the point inwards by that x. + // + // We average the left and right distances to get the maximum shape radius that can fit in the box + // along with labels. + // + // Once we have that, we can find the centre point for the chart, by taking the x text protrusion + // on each side, removing that from the size, halving it and adding the left x protrusion width. + // + // This will mean we have a shape fitted to the canvas, as large as it can be with the labels + // and position it in the most space efficient manner + // + // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + + var plFont = helpers$1.options._parseFont(scale.options.pointLabels); + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var furthestLimits = { + l: 0, + r: scale.width, + t: 0, + b: scale.height - scale.paddingTop + }; + var furthestAngles = {}; + var i, textSize, pointPosition; + + scale.ctx.font = plFont.string; + scale._pointLabelSizes = []; + + var valueCount = getValueCount(scale); + for (i = 0; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, scale.drawingArea + 5); + textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || ''); + scale._pointLabelSizes[i] = textSize; + + // Add quarter circle to make degree 0 mean top of circle + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians) % 360; + var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); + var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); + + if (hLimits.start < furthestLimits.l) { + furthestLimits.l = hLimits.start; + furthestAngles.l = angleRadians; + } + + if (hLimits.end > furthestLimits.r) { + furthestLimits.r = hLimits.end; + furthestAngles.r = angleRadians; + } + + if (vLimits.start < furthestLimits.t) { + furthestLimits.t = vLimits.start; + furthestAngles.t = angleRadians; + } + + if (vLimits.end > furthestLimits.b) { + furthestLimits.b = vLimits.end; + furthestAngles.b = angleRadians; + } + } + + scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles); +} + +function getTextAlignForAngle(angle) { + if (angle === 0 || angle === 180) { + return 'center'; + } else if (angle < 180) { + return 'left'; + } + + return 'right'; +} + +function fillText(ctx, text, position, lineHeight) { + var y = position.y + lineHeight / 2; + var i, ilen; + + if (helpers$1.isArray(text)) { + for (i = 0, ilen = text.length; i < ilen; ++i) { + ctx.fillText(text[i], position.x, y); + y += lineHeight; + } + } else { + ctx.fillText(text, position.x, y); + } +} + +function adjustPointPositionForLabelHeight(angle, textSize, position) { + if (angle === 90 || angle === 270) { + position.y -= (textSize.h / 2); + } else if (angle > 270 || angle < 90) { + position.y -= textSize.h; + } +} + +function drawPointLabels(scale) { + var ctx = scale.ctx; + var opts = scale.options; + var angleLineOpts = opts.angleLines; + var gridLineOpts = opts.gridLines; + var pointLabelOpts = opts.pointLabels; + var lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth); + var lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color); + var tickBackdropHeight = getTickBackdropHeight(opts); + + ctx.save(); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = lineColor; + if (ctx.setLineDash) { + ctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []])); + ctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]); + } + + var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); + + // Point Label Font + var plFont = helpers$1.options._parseFont(pointLabelOpts); + + ctx.font = plFont.string; + ctx.textBaseline = 'middle'; + + for (var i = getValueCount(scale) - 1; i >= 0; i--) { + if (angleLineOpts.display && lineWidth && lineColor) { + var outerPosition = scale.getPointPosition(i, outerDistance); + ctx.beginPath(); + ctx.moveTo(scale.xCenter, scale.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + } + + if (pointLabelOpts.display) { + // Extra pixels out for some label spacing + var extra = (i === 0 ? tickBackdropHeight / 2 : 0); + var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5); + + // Keep this in loop since we may support array properties here + var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor); + ctx.fillStyle = pointLabelFontColor; + + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians); + ctx.textAlign = getTextAlignForAngle(angle); + adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); + fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight); + } + } + ctx.restore(); +} + +function drawRadiusLine(scale, gridLineOpts, radius, index) { + var ctx = scale.ctx; + var circular = gridLineOpts.circular; + var valueCount = getValueCount(scale); + var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1); + var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1); + var pointPosition; + + if ((!circular && !valueCount) || !lineColor || !lineWidth) { + return; + } + + ctx.save(); + ctx.strokeStyle = lineColor; + ctx.lineWidth = lineWidth; + if (ctx.setLineDash) { + ctx.setLineDash(gridLineOpts.borderDash || []); + ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0; + } + + ctx.beginPath(); + if (circular) { + // Draw circular arcs between the points + ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); + } else { + // Draw straight lines connecting each index + pointPosition = scale.getPointPosition(0, radius); + ctx.moveTo(pointPosition.x, pointPosition.y); + + for (var i = 1; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, radius); + ctx.lineTo(pointPosition.x, pointPosition.y); + } + } + ctx.closePath(); + ctx.stroke(); + ctx.restore(); +} + +function numberOrZero(param) { + return helpers$1.isNumber(param) ? param : 0; +} + +var scale_radialLinear = scale_linearbase.extend({ + setDimensions: function() { + var me = this; + + // Set the unconstrained dimension before label rotation + me.width = me.maxWidth; + me.height = me.maxHeight; + me.paddingTop = getTickBackdropHeight(me.options) / 2; + me.xCenter = Math.floor(me.width / 2); + me.yCenter = Math.floor((me.height - me.paddingTop) / 2); + me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2; + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var min = Number.POSITIVE_INFINITY; + var max = Number.NEGATIVE_INFINITY; + + helpers$1.each(chart.data.datasets, function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + + helpers$1.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + min = Math.min(value, min); + max = Math.max(value, max); + }); + } + }); + + me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); + me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + me.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function() { + return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); + }, + + convertTicksToLabels: function() { + var me = this; + + scale_linearbase.prototype.convertTicksToLabels.call(me); + + // Point labels + me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); + }, + + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + fit: function() { + var me = this; + var opts = me.options; + + if (opts.display && opts.pointLabels.display) { + fitWithPointLabels(me); + } else { + me.setCenterPoint(0, 0, 0, 0); + } + }, + + /** + * Set radius reductions and determine new radius and center point + * @private + */ + setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) { + var me = this; + var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); + var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); + var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); + var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b); + + radiusReductionLeft = numberOrZero(radiusReductionLeft); + radiusReductionRight = numberOrZero(radiusReductionRight); + radiusReductionTop = numberOrZero(radiusReductionTop); + radiusReductionBottom = numberOrZero(radiusReductionBottom); + + me.drawingArea = Math.min( + Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), + Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); + me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); + }, + + setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) { + var me = this; + var maxRight = me.width - rightMovement - me.drawingArea; + var maxLeft = leftMovement + me.drawingArea; + var maxTop = topMovement + me.drawingArea; + var maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea; + + me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left); + me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop); + }, + + getIndexAngle: function(index) { + var angleMultiplier = (Math.PI * 2) / getValueCount(this); + var startAngle = this.chart.options && this.chart.options.startAngle ? + this.chart.options.startAngle : + 0; + + var startAngleRadians = startAngle * Math.PI * 2 / 360; + + // Start from the top instead of right, so remove a quarter of the circle + return index * angleMultiplier + startAngleRadians; + }, + + getDistanceFromCenterForValue: function(value) { + var me = this; + + if (value === null) { + return 0; // null always in center + } + + // Take into account half font size + the yPadding of the top value + var scalingFactor = me.drawingArea / (me.max - me.min); + if (me.options.ticks.reverse) { + return (me.max - value) * scalingFactor; + } + return (value - me.min) * scalingFactor; + }, + + getPointPosition: function(index, distanceFromCenter) { + var me = this; + var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); + return { + x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter, + y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter + }; + }, + + getPointPositionForValue: function(index, value) { + return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); + }, + + getBasePosition: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.getPointPositionForValue(0, + me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0); + }, + + draw: function() { + var me = this; + var opts = me.options; + var gridLineOpts = opts.gridLines; + var tickOpts = opts.ticks; + + if (opts.display) { + var ctx = me.ctx; + var startAngle = this.getIndexAngle(0); + var tickFont = helpers$1.options._parseFont(tickOpts); + + if (opts.angleLines.display || opts.pointLabels.display) { + drawPointLabels(me); + } + + helpers$1.each(me.ticks, function(label, index) { + // Don't draw a centre value (if it is minimum) + if (index > 0 || tickOpts.reverse) { + var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); + + // Draw circular lines around the scale + if (gridLineOpts.display && index !== 0) { + drawRadiusLine(me, gridLineOpts, yCenterOffset, index); + } + + if (tickOpts.display) { + var tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor); + ctx.font = tickFont.string; + + ctx.save(); + ctx.translate(me.xCenter, me.yCenter); + ctx.rotate(startAngle); + + if (tickOpts.showLabelBackdrop) { + var labelWidth = ctx.measureText(label).width; + ctx.fillStyle = tickOpts.backdropColor; + ctx.fillRect( + -labelWidth / 2 - tickOpts.backdropPaddingX, + -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY, + labelWidth + tickOpts.backdropPaddingX * 2, + tickFont.size + tickOpts.backdropPaddingY * 2 + ); + } + + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = tickFontColor; + ctx.fillText(label, 0, -yCenterOffset); + ctx.restore(); + } + } + }); + } + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$3 = defaultConfig$3; +scale_radialLinear._defaults = _defaults$3; + +var valueOrDefault$c = helpers$1.valueOrDefault; + +// Integer constants are from the ES6 spec. +var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; +var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +var INTERVALS = { + millisecond: { + common: true, + size: 1, + steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] + }, + second: { + common: true, + size: 1000, + steps: [1, 2, 5, 10, 15, 30] + }, + minute: { + common: true, + size: 60000, + steps: [1, 2, 5, 10, 15, 30] + }, + hour: { + common: true, + size: 3600000, + steps: [1, 2, 3, 6, 12] + }, + day: { + common: true, + size: 86400000, + steps: [1, 2, 5] + }, + week: { + common: false, + size: 604800000, + steps: [1, 2, 3, 4] + }, + month: { + common: true, + size: 2.628e9, + steps: [1, 2, 3] + }, + quarter: { + common: false, + size: 7.884e9, + steps: [1, 2, 3, 4] + }, + year: { + common: true, + size: 3.154e10 + } +}; + +var UNITS = Object.keys(INTERVALS); + +function sorter(a, b) { + return a - b; +} + +function arrayUnique(items) { + var hash = {}; + var out = []; + var i, ilen, item; + + for (i = 0, ilen = items.length; i < ilen; ++i) { + item = items[i]; + if (!hash[item]) { + hash[item] = true; + out.push(item); + } + } + + return out; +} + +/** + * Returns an array of {time, pos} objects used to interpolate a specific `time` or position + * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is + * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other + * extremity (left + width or top + height). Note that it would be more optimized to directly + * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need + * to create the lookup table. The table ALWAYS contains at least two items: min and max. + * + * @param {number[]} timestamps - timestamps sorted from lowest to highest. + * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min + * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. + * If 'series', timestamps will be positioned at the same distance from each other. In this + * case, only timestamps that break the time linearity are registered, meaning that in the + * best case, all timestamps are linear, the table contains only min and max. + */ +function buildLookupTable(timestamps, min, max, distribution) { + if (distribution === 'linear' || !timestamps.length) { + return [ + {time: min, pos: 0}, + {time: max, pos: 1} + ]; + } + + var table = []; + var items = [min]; + var i, ilen, prev, curr, next; + + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + curr = timestamps[i]; + if (curr > min && curr < max) { + items.push(curr); + } + } + + items.push(max); + + for (i = 0, ilen = items.length; i < ilen; ++i) { + next = items[i + 1]; + prev = items[i - 1]; + curr = items[i]; + + // only add points that breaks the scale linearity + if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { + table.push({time: curr, pos: i / (ilen - 1)}); + } + } + + return table; +} + +// @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ +function lookup(table, key, value) { + var lo = 0; + var hi = table.length - 1; + var mid, i0, i1; + + while (lo >= 0 && lo <= hi) { + mid = (lo + hi) >> 1; + i0 = table[mid - 1] || null; + i1 = table[mid]; + + if (!i0) { + // given value is outside table (before first item) + return {lo: null, hi: i1}; + } else if (i1[key] < value) { + lo = mid + 1; + } else if (i0[key] > value) { + hi = mid - 1; + } else { + return {lo: i0, hi: i1}; + } + } + + // given value is outside table (after last item) + return {lo: i1, hi: null}; +} + +/** + * Linearly interpolates the given source `value` using the table items `skey` values and + * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') + * returns the position for a timestamp equal to 42. If value is out of bounds, values at + * index [0, 1] or [n - 1, n] are used for the interpolation. + */ +function interpolate$1(table, skey, sval, tkey) { + var range = lookup(table, skey, sval); + + // Note: the lookup table ALWAYS contains at least 2 items (min and max) + var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; + var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; + + var span = next[skey] - prev[skey]; + var ratio = span ? (sval - prev[skey]) / span : 0; + var offset = (next[tkey] - prev[tkey]) * ratio; + + return prev[tkey] + offset; +} + +function toTimestamp(scale, input) { + var adapter = scale._adapter; + var options = scale.options.time; + var parser = options.parser; + var format = parser || options.format; + var value = input; + + if (typeof parser === 'function') { + value = parser(value); + } + + // Only parse if its not a timestamp already + if (!helpers$1.isFinite(value)) { + value = typeof format === 'string' + ? adapter.parse(value, format) + : adapter.parse(value); + } + + if (value !== null) { + return +value; + } + + // Labels are in an incompatible format and no `parser` has been provided. + // The user might still use the deprecated `format` option for parsing. + if (!parser && typeof format === 'function') { + value = format(input); + + // `format` could return something else than a timestamp, if so, parse it + if (!helpers$1.isFinite(value)) { + value = adapter.parse(value); + } + } + + return value; +} + +function parse(scale, input) { + if (helpers$1.isNullOrUndef(input)) { + return null; + } + + var options = scale.options.time; + var value = toTimestamp(scale, scale.getRightValue(input)); + if (value === null) { + return value; + } + + if (options.round) { + value = +scale._adapter.startOf(value, options.round); + } + + return value; +} + +/** + * Returns the number of unit to skip to be able to display up to `capacity` number of ticks + * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. + */ +function determineStepSize(min, max, unit, capacity) { + var range = max - min; + var interval = INTERVALS[unit]; + var milliseconds = interval.size; + var steps = interval.steps; + var i, ilen, factor; + + if (!steps) { + return Math.ceil(range / (capacity * milliseconds)); + } + + for (i = 0, ilen = steps.length; i < ilen; ++i) { + factor = steps[i]; + if (Math.ceil(range / (milliseconds * factor)) <= capacity) { + break; + } + } + + return factor; +} + +/** + * Figures out what unit results in an appropriate number of auto-generated ticks + */ +function determineUnitForAutoTicks(minUnit, min, max, capacity) { + var ilen = UNITS.length; + var i, interval, factor; + + for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { + interval = INTERVALS[UNITS[i]]; + factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; + + if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { + return UNITS[i]; + } + } + + return UNITS[ilen - 1]; +} + +/** + * Figures out what unit to format a set of ticks with + */ +function determineUnitForFormatting(scale, ticks, minUnit, min, max) { + var ilen = UNITS.length; + var i, unit; + + for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { + unit = UNITS[i]; + if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) { + return unit; + } + } + + return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; +} + +function determineMajorUnit(unit) { + for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { + if (INTERVALS[UNITS[i]].common) { + return UNITS[i]; + } + } +} + +/** + * Generates a maximum of `capacity` timestamps between min and max, rounded to the + * `minor` unit, aligned on the `major` unit and using the given scale time `options`. + * Important: this method can return ticks outside the min and max range, it's the + * responsibility of the calling code to clamp values if needed. + */ +function generate(scale, min, max, capacity) { + var adapter = scale._adapter; + var options = scale.options; + var timeOpts = options.time; + var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); + var major = determineMajorUnit(minor); + var stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize); + var weekday = minor === 'week' ? timeOpts.isoWeekday : false; + var majorTicksEnabled = options.ticks.major.enabled; + var interval = INTERVALS[minor]; + var first = min; + var last = max; + var ticks = []; + var time; + + if (!stepSize) { + stepSize = determineStepSize(min, max, minor, capacity); + } + + // For 'week' unit, handle the first day of week option + if (weekday) { + first = +adapter.startOf(first, 'isoWeek', weekday); + last = +adapter.startOf(last, 'isoWeek', weekday); + } + + // Align first/last ticks on unit + first = +adapter.startOf(first, weekday ? 'day' : minor); + last = +adapter.startOf(last, weekday ? 'day' : minor); + + // Make sure that the last tick include max + if (last < max) { + last = +adapter.add(last, 1, minor); + } + + time = first; + + if (majorTicksEnabled && major && !weekday && !timeOpts.round) { + // Align the first tick on the previous `minor` unit aligned on the `major` unit: + // we first aligned time on the previous `major` unit then add the number of full + // stepSize there is between first and the previous major time. + time = +adapter.startOf(time, major); + time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor); + } + + for (; time < last; time = +adapter.add(time, stepSize, minor)) { + ticks.push(+time); + } + + ticks.push(+time); + + return ticks; +} + +/** + * Returns the start and end offsets from edges in the form of {start, end} + * where each value is a relative width to the scale and ranges between 0 and 1. + * They add extra margins on the both sides by scaling down the original scale. + * Offsets are added when the `offset` option is true. + */ +function computeOffsets(table, ticks, min, max, options) { + var start = 0; + var end = 0; + var first, last; + + if (options.offset && ticks.length) { + if (!options.time.min) { + first = interpolate$1(table, 'time', ticks[0], 'pos'); + if (ticks.length === 1) { + start = 1 - first; + } else { + start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2; + } + } + if (!options.time.max) { + last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos'); + if (ticks.length === 1) { + end = last; + } else { + end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2; + } + } + } + + return {start: start, end: end}; +} + +function ticksFromTimestamps(scale, values, majorUnit) { + var ticks = []; + var i, ilen, value, major; + + for (i = 0, ilen = values.length; i < ilen; ++i) { + value = values[i]; + major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false; + + ticks.push({ + value: value, + major: major + }); + } + + return ticks; +} + +var defaultConfig$4 = { + position: 'bottom', + + /** + * Data distribution along the scale: + * - 'linear': data are spread according to their time (distances can vary), + * - 'series': data are spread at the same distance from each other. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + distribution: 'linear', + + /** + * Scale boundary strategy (bypassed by min/max time options) + * - `data`: make sure data are fully visible, ticks outside are removed + * - `ticks`: make sure ticks are fully visible, data outside are truncated + * @see https://github.com/chartjs/Chart.js/pull/4556 + * @since 2.7.0 + */ + bounds: 'data', + + adapters: {}, + time: { + parser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment + format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/ + unit: false, // false == automatic or override with week, month, year, etc. + round: false, // none, or override with week, month, year, etc. + displayFormat: false, // DEPRECATED + isoWeekday: false, // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/ + minUnit: 'millisecond', + displayFormats: {} + }, + ticks: { + autoSkip: false, + + /** + * Ticks generation input values: + * - 'auto': generates "optimal" ticks based on scale size and time options. + * - 'data': generates ticks from data (including labels from data {t|x|y} objects). + * - 'labels': generates ticks from user given `data.labels` values ONLY. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + source: 'auto', + + major: { + enabled: false + } + } +}; + +var scale_time = core_scale.extend({ + initialize: function() { + this.mergeTicksOptions(); + core_scale.prototype.initialize.call(this); + }, + + update: function() { + var me = this; + var options = me.options; + var time = options.time || (options.time = {}); + var adapter = me._adapter = new core_adapters._date(options.adapters.date); + + // DEPRECATIONS: output a message only one time per update + if (time.format) { + console.warn('options.time.format is deprecated and replaced by options.time.parser.'); + } + + // Backward compatibility: before introducing adapter, `displayFormats` was + // supposed to contain *all* unit/string pairs but this can't be resolved + // when loading the scale (adapters are loaded afterward), so let's populate + // missing formats on update + helpers$1.mergeIf(time.displayFormats, adapter.formats()); + + return core_scale.prototype.update.apply(me, arguments); + }, + + /** + * Allows data to be referenced via 't' attribute + */ + getRightValue: function(rawValue) { + if (rawValue && rawValue.t !== undefined) { + rawValue = rawValue.t; + } + return core_scale.prototype.getRightValue.call(this, rawValue); + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var adapter = me._adapter; + var timeOpts = me.options.time; + var unit = timeOpts.unit || 'day'; + var min = MAX_INTEGER; + var max = MIN_INTEGER; + var timestamps = []; + var datasets = []; + var labels = []; + var i, j, ilen, jlen, data, timestamp; + var dataLabels = chart.data.labels || []; + + // Convert labels to timestamps + for (i = 0, ilen = dataLabels.length; i < ilen; ++i) { + labels.push(parse(me, dataLabels[i])); + } + + // Convert data to timestamps + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + data = chart.data.datasets[i].data; + + // Let's consider that all data have the same format. + if (helpers$1.isObject(data[0])) { + datasets[i] = []; + + for (j = 0, jlen = data.length; j < jlen; ++j) { + timestamp = parse(me, data[j]); + timestamps.push(timestamp); + datasets[i][j] = timestamp; + } + } else { + for (j = 0, jlen = labels.length; j < jlen; ++j) { + timestamps.push(labels[j]); + } + datasets[i] = labels.slice(0); + } + } else { + datasets[i] = []; + } + } + + if (labels.length) { + // Sort labels **after** data have been converted + labels = arrayUnique(labels).sort(sorter); + min = Math.min(min, labels[0]); + max = Math.max(max, labels[labels.length - 1]); + } + + if (timestamps.length) { + timestamps = arrayUnique(timestamps).sort(sorter); + min = Math.min(min, timestamps[0]); + max = Math.max(max, timestamps[timestamps.length - 1]); + } + + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // In case there is no valid min/max, set limits based on unit time option + min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min; + max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max; + + // Make sure that max is strictly higher than min (required by the lookup table) + me.min = Math.min(min, max); + me.max = Math.max(min + 1, max); + + // PRIVATE + me._horizontal = me.isHorizontal(); + me._table = []; + me._timestamps = { + data: timestamps, + datasets: datasets, + labels: labels + }; + }, + + buildTicks: function() { + var me = this; + var min = me.min; + var max = me.max; + var options = me.options; + var timeOpts = options.time; + var timestamps = []; + var ticks = []; + var i, ilen, timestamp; + + switch (options.ticks.source) { + case 'data': + timestamps = me._timestamps.data; + break; + case 'labels': + timestamps = me._timestamps.labels; + break; + case 'auto': + default: + timestamps = generate(me, min, max, me.getLabelCapacity(min), options); + } + + if (options.bounds === 'ticks' && timestamps.length) { + min = timestamps[0]; + max = timestamps[timestamps.length - 1]; + } + + // Enforce limits with user min/max options + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // Remove ticks outside the min/max range + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + timestamp = timestamps[i]; + if (timestamp >= min && timestamp <= max) { + ticks.push(timestamp); + } + } + + me.min = min; + me.max = max; + + // PRIVATE + me._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max); + me._majorUnit = determineMajorUnit(me._unit); + me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); + me._offsets = computeOffsets(me._table, ticks, min, max, options); + + if (options.ticks.reverse) { + ticks.reverse(); + } + + return ticksFromTimestamps(me, ticks, me._majorUnit); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var adapter = me._adapter; + var data = me.chart.data; + var timeOpts = me.options.time; + var label = data.labels && index < data.labels.length ? data.labels[index] : ''; + var value = data.datasets[datasetIndex].data[index]; + + if (helpers$1.isObject(value)) { + label = me.getRightValue(value); + } + if (timeOpts.tooltipFormat) { + return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat); + } + if (typeof label === 'string') { + return label; + } + return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime); + }, + + /** + * Function to format an individual tick mark + * @private + */ + tickFormatFunction: function(time, index, ticks, format) { + var me = this; + var adapter = me._adapter; + var options = me.options; + var formats = options.time.displayFormats; + var minorFormat = formats[me._unit]; + var majorUnit = me._majorUnit; + var majorFormat = formats[majorUnit]; + var majorTime = +adapter.startOf(time, majorUnit); + var majorTickOpts = options.ticks.major; + var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; + var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat); + var tickOpts = major ? majorTickOpts : options.ticks.minor; + var formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback); + + return formatter ? formatter(label, index, ticks) : label; + }, + + convertTicksToLabels: function(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(this.tickFormatFunction(ticks[i].value, i, ticks)); + } + + return labels; + }, + + /** + * @private + */ + getPixelForOffset: function(time) { + var me = this; + var isReverse = me.options.ticks.reverse; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top; + var pos = interpolate$1(me._table, 'time', time, 'pos'); + var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end); + + return isReverse ? start - offset : start + offset; + }, + + getPixelForValue: function(value, index, datasetIndex) { + var me = this; + var time = null; + + if (index !== undefined && datasetIndex !== undefined) { + time = me._timestamps.datasets[datasetIndex][index]; + } + + if (time === null) { + time = parse(me, value); + } + + if (time !== null) { + return me.getPixelForOffset(time); + } + }, + + getPixelForTick: function(index) { + var ticks = this.getTicks(); + return index >= 0 && index < ticks.length ? + this.getPixelForOffset(ticks[index].value) : + null; + }, + + getValueForPixel: function(pixel) { + var me = this; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? me.left : me.top; + var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end; + var time = interpolate$1(me._table, 'pos', pos, 'time'); + + // DEPRECATION, we should return time directly + return me._adapter._create(time); + }, + + /** + * Crude approximation of what the label width might be + * @private + */ + getLabelWidth: function(label) { + var me = this; + var ticksOpts = me.options.ticks; + var tickLabelWidth = me.ctx.measureText(label).width; + var angle = helpers$1.toRadians(ticksOpts.maxRotation); + var cosRotation = Math.cos(angle); + var sinRotation = Math.sin(angle); + var tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize); + + return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); + }, + + /** + * @private + */ + getLabelCapacity: function(exampleTime) { + var me = this; + + // pick the longest format (milliseconds) for guestimation + var format = me.options.time.displayFormats.millisecond; + var exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format); + var tickLabelWidth = me.getLabelWidth(exampleLabel); + var innerWidth = me.isHorizontal() ? me.width : me.height; + var capacity = Math.floor(innerWidth / tickLabelWidth); + + return capacity > 0 ? capacity : 1; + } +}); + +// INTERNAL: static default options, registered in src/index.js +var _defaults$4 = defaultConfig$4; +scale_time._defaults = _defaults$4; + +var scales = { + category: scale_category, + linear: scale_linear, + logarithmic: scale_logarithmic, + radialLinear: scale_radialLinear, + time: scale_time +}; + +var FORMATS = { + datetime: 'MMM D, YYYY, h:mm:ss a', + millisecond: 'h:mm:ss.SSS a', + second: 'h:mm:ss a', + minute: 'h:mm a', + hour: 'hA', + day: 'MMM D', + week: 'll', + month: 'MMM YYYY', + quarter: '[Q]Q - YYYY', + year: 'YYYY' +}; + +core_adapters._date.override(typeof moment === 'function' ? { + _id: 'moment', // DEBUG ONLY + + formats: function() { + return FORMATS; + }, + + parse: function(value, format) { + if (typeof value === 'string' && typeof format === 'string') { + value = moment(value, format); + } else if (!(value instanceof moment)) { + value = moment(value); + } + return value.isValid() ? value.valueOf() : null; + }, + + format: function(time, format) { + return moment(time).format(format); + }, + + add: function(time, amount, unit) { + return moment(time).add(amount, unit).valueOf(); + }, + + diff: function(max, min, unit) { + return moment.duration(moment(max).diff(moment(min))).as(unit); + }, + + startOf: function(time, unit, weekday) { + time = moment(time); + if (unit === 'isoWeek') { + return time.isoWeekday(weekday).valueOf(); + } + return time.startOf(unit).valueOf(); + }, + + endOf: function(time, unit) { + return moment(time).endOf(unit).valueOf(); + }, + + // DEPRECATIONS + + /** + * Provided for backward compatibility with scale.getValueForPixel(). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function(time) { + return moment(time); + }, +} : {}); + +core_defaults._set('global', { + plugins: { + filler: { + propagate: true + } + } +}); + +var mappers = { + dataset: function(source) { + var index = source.fill; + var chart = source.chart; + var meta = chart.getDatasetMeta(index); + var visible = meta && chart.isDatasetVisible(index); + var points = (visible && meta.dataset._children) || []; + var length = points.length || 0; + + return !length ? null : function(point, i) { + return (i < length && points[i]._view) || null; + }; + }, + + boundary: function(source) { + var boundary = source.boundary; + var x = boundary ? boundary.x : null; + var y = boundary ? boundary.y : null; + + return function(point) { + return { + x: x === null ? point.x : x, + y: y === null ? point.y : y, + }; + }; + } +}; + +// @todo if (fill[0] === '#') +function decodeFill(el, index, count) { + var model = el._model || {}; + var fill = model.fill; + var target; + + if (fill === undefined) { + fill = !!model.backgroundColor; + } + + if (fill === false || fill === null) { + return false; + } + + if (fill === true) { + return 'origin'; + } + + target = parseFloat(fill, 10); + if (isFinite(target) && Math.floor(target) === target) { + if (fill[0] === '-' || fill[0] === '+') { + target = index + target; + } + + if (target === index || target < 0 || target >= count) { + return false; + } + + return target; + } + + switch (fill) { + // compatibility + case 'bottom': + return 'start'; + case 'top': + return 'end'; + case 'zero': + return 'origin'; + // supported boundaries + case 'origin': + case 'start': + case 'end': + return fill; + // invalid fill values + default: + return false; + } +} + +function computeBoundary(source) { + var model = source.el._model || {}; + var scale = source.el._scale || {}; + var fill = source.fill; + var target = null; + var horizontal; + + if (isFinite(fill)) { + return null; + } + + // Backward compatibility: until v3, we still need to support boundary values set on + // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and + // controllers might still use it (e.g. the Smith chart). + + if (fill === 'start') { + target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; + } else if (fill === 'end') { + target = model.scaleTop === undefined ? scale.top : model.scaleTop; + } else if (model.scaleZero !== undefined) { + target = model.scaleZero; + } else if (scale.getBasePosition) { + target = scale.getBasePosition(); + } else if (scale.getBasePixel) { + target = scale.getBasePixel(); + } + + if (target !== undefined && target !== null) { + if (target.x !== undefined && target.y !== undefined) { + return target; + } + + if (helpers$1.isFinite(target)) { + horizontal = scale.isHorizontal(); + return { + x: horizontal ? target : null, + y: horizontal ? null : target + }; + } + } + + return null; +} + +function resolveTarget(sources, index, propagate) { + var source = sources[index]; + var fill = source.fill; + var visited = [index]; + var target; + + if (!propagate) { + return fill; + } + + while (fill !== false && visited.indexOf(fill) === -1) { + if (!isFinite(fill)) { + return fill; + } + + target = sources[fill]; + if (!target) { + return false; + } + + if (target.visible) { + return fill; + } + + visited.push(fill); + fill = target.fill; + } + + return false; +} + +function createMapper(source) { + var fill = source.fill; + var type = 'dataset'; + + if (fill === false) { + return null; + } + + if (!isFinite(fill)) { + type = 'boundary'; + } + + return mappers[type](source); +} + +function isDrawable(point) { + return point && !point.skip; +} + +function drawArea(ctx, curve0, curve1, len0, len1) { + var i; + + if (!len0 || !len1) { + return; + } + + // building first area curve (normal) + ctx.moveTo(curve0[0].x, curve0[0].y); + for (i = 1; i < len0; ++i) { + helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); + } + + // joining the two area curves + ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); + + // building opposite area curve (reverse) + for (i = len1 - 1; i > 0; --i) { + helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); + } +} + +function doFill(ctx, points, mapper, view, color, loop) { + var count = points.length; + var span = view.spanGaps; + var curve0 = []; + var curve1 = []; + var len0 = 0; + var len1 = 0; + var i, ilen, index, p0, p1, d0, d1; + + ctx.beginPath(); + + for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { + index = i % count; + p0 = points[index]._view; + p1 = mapper(p0, index, view); + d0 = isDrawable(p0); + d1 = isDrawable(p1); + + if (d0 && d1) { + len0 = curve0.push(p0); + len1 = curve1.push(p1); + } else if (len0 && len1) { + if (!span) { + drawArea(ctx, curve0, curve1, len0, len1); + len0 = len1 = 0; + curve0 = []; + curve1 = []; + } else { + if (d0) { + curve0.push(p0); + } + if (d1) { + curve1.push(p1); + } + } + } + } + + drawArea(ctx, curve0, curve1, len0, len1); + + ctx.closePath(); + ctx.fillStyle = color; + ctx.fill(); +} + +var plugin_filler = { + id: 'filler', + + afterDatasetsUpdate: function(chart, options) { + var count = (chart.data.datasets || []).length; + var propagate = options.propagate; + var sources = []; + var meta, i, el, source; + + for (i = 0; i < count; ++i) { + meta = chart.getDatasetMeta(i); + el = meta.dataset; + source = null; + + if (el && el._model && el instanceof elements.Line) { + source = { + visible: chart.isDatasetVisible(i), + fill: decodeFill(el, i, count), + chart: chart, + el: el + }; + } + + meta.$filler = source; + sources.push(source); + } + + for (i = 0; i < count; ++i) { + source = sources[i]; + if (!source) { + continue; + } + + source.fill = resolveTarget(sources, i, propagate); + source.boundary = computeBoundary(source); + source.mapper = createMapper(source); + } + }, + + beforeDatasetDraw: function(chart, args) { + var meta = args.meta.$filler; + if (!meta) { + return; + } + + var ctx = chart.ctx; + var el = meta.el; + var view = el._view; + var points = el._children || []; + var mapper = meta.mapper; + var color = view.backgroundColor || core_defaults.global.defaultColor; + + if (mapper && color && points.length) { + helpers$1.canvas.clipArea(ctx, chart.chartArea); + doFill(ctx, points, mapper, view, color, el._loop); + helpers$1.canvas.unclipArea(ctx); + } + } +}; + +var noop$1 = helpers$1.noop; +var valueOrDefault$d = helpers$1.valueOrDefault; + +core_defaults._set('global', { + legend: { + display: true, + position: 'top', + fullWidth: true, + reverse: false, + weight: 1000, + + // a callback that will handle + onClick: function(e, legendItem) { + var index = legendItem.datasetIndex; + var ci = this.chart; + var meta = ci.getDatasetMeta(index); + + // See controller.isDatasetVisible comment + meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; + + // We hid a dataset ... rerender the chart + ci.update(); + }, + + onHover: null, + onLeave: null, + + labels: { + boxWidth: 40, + padding: 10, + // Generates labels shown in the legend + // Valid properties to return: + // text : text to display + // fillStyle : fill of coloured box + // strokeStyle: stroke of coloured box + // hidden : if this legend item refers to a hidden item + // lineCap : cap style for line + // lineDash + // lineDashOffset : + // lineJoin : + // lineWidth : + generateLabels: function(chart) { + var data = chart.data; + return helpers$1.isArray(data.datasets) ? data.datasets.map(function(dataset, i) { + return { + text: dataset.label, + fillStyle: (!helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), + hidden: !chart.isDatasetVisible(i), + lineCap: dataset.borderCapStyle, + lineDash: dataset.borderDash, + lineDashOffset: dataset.borderDashOffset, + lineJoin: dataset.borderJoinStyle, + lineWidth: dataset.borderWidth, + strokeStyle: dataset.borderColor, + pointStyle: dataset.pointStyle, + + // Below is extra data used for toggling the datasets + datasetIndex: i + }; + }, this) : []; + } + } + }, + + legendCallback: function(chart) { + var text = []; + text.push('<ul class="' + chart.id + '-legend">'); + for (var i = 0; i < chart.data.datasets.length; i++) { + text.push('<li><span style="background-color:' + chart.data.datasets[i].backgroundColor + '"></span>'); + if (chart.data.datasets[i].label) { + text.push(chart.data.datasets[i].label); + } + text.push('</li>'); + } + text.push('</ul>'); + return text.join(''); + } +}); + +/** + * Helper function to get the box width based on the usePointStyle option + * @param {object} labelopts - the label options on the legend + * @param {number} fontSize - the label font size + * @return {number} width of the color box area + */ +function getBoxWidth(labelOpts, fontSize) { + return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ? + fontSize : + labelOpts.boxWidth; +} + +/** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ +var Legend = core_element.extend({ + + initialize: function(config) { + helpers$1.extend(this, config); + + // Contains hit boxes for each dataset (in dataset order) + this.legendHitBoxes = []; + + /** + * @private + */ + this._hoveredItem = null; + + // Are we in doughnut mode which has a different data type + this.doughnutMode = false; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + // Any function defined here is inherited by all legend types. + // Any function can be extended by the legend type + + beforeUpdate: noop$1, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + }, + afterUpdate: noop$1, + + // + + beforeSetDimensions: noop$1, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$1, + + // + + beforeBuildLabels: noop$1, + buildLabels: function() { + var me = this; + var labelOpts = me.options.labels || {}; + var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || []; + + if (labelOpts.filter) { + legendItems = legendItems.filter(function(item) { + return labelOpts.filter(item, me.chart.data); + }); + } + + if (me.options.reverse) { + legendItems.reverse(); + } + + me.legendItems = legendItems; + }, + afterBuildLabels: noop$1, + + // + + beforeFit: noop$1, + fit: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var display = opts.display; + + var ctx = me.ctx; + + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + + // Reset hit boxes + var hitboxes = me.legendHitBoxes = []; + + var minSize = me.minSize; + var isHorizontal = me.isHorizontal(); + + if (isHorizontal) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = display ? 10 : 0; + } else { + minSize.width = display ? 10 : 0; + minSize.height = me.maxHeight; // fill all the height + } + + // Increase sizes here + if (display) { + ctx.font = labelFont.string; + + if (isHorizontal) { + // Labels + + // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one + var lineWidths = me.lineWidths = [0]; + var totalHeight = 0; + + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + + helpers$1.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + if (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) { + totalHeight += fontSize + labelOpts.padding; + lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding; + } + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: width, + height: fontSize + }; + + lineWidths[lineWidths.length - 1] += width + labelOpts.padding; + }); + + minSize.height += totalHeight; + + } else { + var vPadding = labelOpts.padding; + var columnWidths = me.columnWidths = []; + var totalWidth = labelOpts.padding; + var currentColWidth = 0; + var currentColHeight = 0; + var itemHeight = fontSize + vPadding; + + helpers$1.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + // If too tall, go to new column + if (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) { + totalWidth += currentColWidth + labelOpts.padding; + columnWidths.push(currentColWidth); // previous column width + + currentColWidth = 0; + currentColHeight = 0; + } + + // Get max width + currentColWidth = Math.max(currentColWidth, itemWidth); + currentColHeight += itemHeight; + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: itemWidth, + height: fontSize + }; + }); + + totalWidth += currentColWidth; + columnWidths.push(currentColWidth); + minSize.width += totalWidth; + } + } + + me.width = minSize.width; + me.height = minSize.height; + }, + afterFit: noop$1, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + + // Actually draw the legend on the canvas + draw: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; + var lineDefault = globalDefaults.elements.line; + var legendWidth = me.width; + var lineWidths = me.lineWidths; + + if (opts.display) { + var ctx = me.ctx; + var fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor); + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + var cursor; + + // Canvas setup + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + ctx.lineWidth = 0.5; + ctx.strokeStyle = fontColor; // for strikethrough effect + ctx.fillStyle = fontColor; // render in correct colour + ctx.font = labelFont.string; + + var boxWidth = getBoxWidth(labelOpts, fontSize); + var hitboxes = me.legendHitBoxes; + + // current position + var drawLegendBox = function(x, y, legendItem) { + if (isNaN(boxWidth) || boxWidth <= 0) { + return; + } + + // Set the ctx for the box + ctx.save(); + + var lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth); + ctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor); + ctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle); + ctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset); + ctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor); + + if (ctx.setLineDash) { + // IE 9 and 10 do not support line dash + ctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash)); + } + + if (opts.labels && opts.labels.usePointStyle) { + // Recalculate x and y for drawPoint() because its expecting + // x and y to be center of figure (instead of top left) + var radius = boxWidth * Math.SQRT2 / 2; + var centerX = x + boxWidth / 2; + var centerY = y + fontSize / 2; + + // Draw pointStyle as legend symbol + helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); + } else { + // Draw box as legend symbol + if (lineWidth !== 0) { + ctx.strokeRect(x, y, boxWidth, fontSize); + } + ctx.fillRect(x, y, boxWidth, fontSize); + } + + ctx.restore(); + }; + var fillText = function(x, y, legendItem, textWidth) { + var halfFontSize = fontSize / 2; + var xLeft = boxWidth + halfFontSize + x; + var yMiddle = y + halfFontSize; + + ctx.fillText(legendItem.text, xLeft, yMiddle); + + if (legendItem.hidden) { + // Strikethrough the text if hidden + ctx.beginPath(); + ctx.lineWidth = 2; + ctx.moveTo(xLeft, yMiddle); + ctx.lineTo(xLeft + textWidth, yMiddle); + ctx.stroke(); + } + }; + + // Horizontal + var isHorizontal = me.isHorizontal(); + if (isHorizontal) { + cursor = { + x: me.left + ((legendWidth - lineWidths[0]) / 2) + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } else { + cursor = { + x: me.left + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } + + var itemHeight = fontSize + labelOpts.padding; + helpers$1.each(me.legendItems, function(legendItem, i) { + var textWidth = ctx.measureText(legendItem.text).width; + var width = boxWidth + (fontSize / 2) + textWidth; + var x = cursor.x; + var y = cursor.y; + + // Use (me.left + me.minSize.width) and (me.top + me.minSize.height) + // instead of me.right and me.bottom because me.width and me.height + // may have been changed since me.minSize was calculated + if (isHorizontal) { + if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) { + y = cursor.y += itemHeight; + cursor.line++; + x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2) + labelOpts.padding; + } + } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) { + x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; + y = cursor.y = me.top + labelOpts.padding; + cursor.line++; + } + + drawLegendBox(x, y, legendItem); + + hitboxes[i].left = x; + hitboxes[i].top = y; + + // Fill the actual label + fillText(x, y, legendItem, textWidth); + + if (isHorizontal) { + cursor.x += width + labelOpts.padding; + } else { + cursor.y += itemHeight; + } + + }); + } + }, + + /** + * @private + */ + _getLegendItemAt: function(x, y) { + var me = this; + var i, hitBox, lh; + + if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { + // See if we are touching one of the dataset boxes + lh = me.legendHitBoxes; + for (i = 0; i < lh.length; ++i) { + hitBox = lh[i]; + + if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { + // Touching an element + return me.legendItems[i]; + } + } + } + + return null; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + */ + handleEvent: function(e) { + var me = this; + var opts = me.options; + var type = e.type === 'mouseup' ? 'click' : e.type; + var hoveredItem; + + if (type === 'mousemove') { + if (!opts.onHover && !opts.onLeave) { + return; + } + } else if (type === 'click') { + if (!opts.onClick) { + return; + } + } else { + return; + } + + // Chart event already has relative position in it + hoveredItem = me._getLegendItemAt(e.x, e.y); + + if (type === 'click') { + if (hoveredItem && opts.onClick) { + // use e.native for backwards compatibility + opts.onClick.call(me, e.native, hoveredItem); + } + } else { + if (opts.onLeave && hoveredItem !== me._hoveredItem) { + if (me._hoveredItem) { + opts.onLeave.call(me, e.native, me._hoveredItem); + } + me._hoveredItem = hoveredItem; + } + + if (opts.onHover && hoveredItem) { + // use e.native for backwards compatibility + opts.onHover.call(me, e.native, hoveredItem); + } + } + } +}); + +function createNewLegendAndAttach(chart, legendOpts) { + var legend = new Legend({ + ctx: chart.ctx, + options: legendOpts, + chart: chart + }); + + core_layouts.configure(chart, legend, legendOpts); + core_layouts.addBox(chart, legend); + chart.legend = legend; +} + +var plugin_legend = { + id: 'legend', + + /** + * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making + * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Legend, + + beforeInit: function(chart) { + var legendOpts = chart.options.legend; + + if (legendOpts) { + createNewLegendAndAttach(chart, legendOpts); + } + }, + + beforeUpdate: function(chart) { + var legendOpts = chart.options.legend; + var legend = chart.legend; + + if (legendOpts) { + helpers$1.mergeIf(legendOpts, core_defaults.global.legend); + + if (legend) { + core_layouts.configure(chart, legend, legendOpts); + legend.options = legendOpts; + } else { + createNewLegendAndAttach(chart, legendOpts); + } + } else if (legend) { + core_layouts.removeBox(chart, legend); + delete chart.legend; + } + }, + + afterEvent: function(chart, e) { + var legend = chart.legend; + if (legend) { + legend.handleEvent(e); + } + } +}; + +var noop$2 = helpers$1.noop; + +core_defaults._set('global', { + title: { + display: false, + fontStyle: 'bold', + fullWidth: true, + padding: 10, + position: 'top', + text: '', + weight: 2000 // by default greater than legend (1000) to be above + } +}); + +/** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ +var Title = core_element.extend({ + initialize: function(config) { + var me = this; + helpers$1.extend(me, config); + + // Contains hit boxes for each dataset (in dataset order) + me.legendHitBoxes = []; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + + beforeUpdate: noop$2, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: noop$2, + + // + + beforeSetDimensions: noop$2, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$2, + + // + + beforeBuildLabels: noop$2, + buildLabels: noop$2, + afterBuildLabels: noop$2, + + // + + beforeFit: noop$2, + fit: function() { + var me = this; + var opts = me.options; + var display = opts.display; + var minSize = me.minSize; + var lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1; + var fontOpts = helpers$1.options._parseFont(opts); + var textSize = display ? (lineCount * fontOpts.lineHeight) + (opts.padding * 2) : 0; + + if (me.isHorizontal()) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = textSize; + } else { + minSize.width = textSize; + minSize.height = me.maxHeight; // fill all the height + } + + me.width = minSize.width; + me.height = minSize.height; + + }, + afterFit: noop$2, + + // Shared Methods + isHorizontal: function() { + var pos = this.options.position; + return pos === 'top' || pos === 'bottom'; + }, + + // Actually draw the title block on the canvas + draw: function() { + var me = this; + var ctx = me.ctx; + var opts = me.options; + + if (opts.display) { + var fontOpts = helpers$1.options._parseFont(opts); + var lineHeight = fontOpts.lineHeight; + var offset = lineHeight / 2 + opts.padding; + var rotation = 0; + var top = me.top; + var left = me.left; + var bottom = me.bottom; + var right = me.right; + var maxWidth, titleX, titleY; + + ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour + ctx.font = fontOpts.string; + + // Horizontal + if (me.isHorizontal()) { + titleX = left + ((right - left) / 2); // midpoint of the width + titleY = top + offset; + maxWidth = right - left; + } else { + titleX = opts.position === 'left' ? left + offset : right - offset; + titleY = top + ((bottom - top) / 2); + maxWidth = bottom - top; + rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); + } + + ctx.save(); + ctx.translate(titleX, titleY); + ctx.rotate(rotation); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + var text = opts.text; + if (helpers$1.isArray(text)) { + var y = 0; + for (var i = 0; i < text.length; ++i) { + ctx.fillText(text[i], 0, y, maxWidth); + y += lineHeight; + } + } else { + ctx.fillText(text, 0, 0, maxWidth); + } + + ctx.restore(); + } + } +}); + +function createNewTitleBlockAndAttach(chart, titleOpts) { + var title = new Title({ + ctx: chart.ctx, + options: titleOpts, + chart: chart + }); + + core_layouts.configure(chart, title, titleOpts); + core_layouts.addBox(chart, title); + chart.titleBlock = title; +} + +var plugin_title = { + id: 'title', + + /** + * Backward compatibility: since 2.1.5, the title is registered as a plugin, making + * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Title, + + beforeInit: function(chart) { + var titleOpts = chart.options.title; + + if (titleOpts) { + createNewTitleBlockAndAttach(chart, titleOpts); + } + }, + + beforeUpdate: function(chart) { + var titleOpts = chart.options.title; + var titleBlock = chart.titleBlock; + + if (titleOpts) { + helpers$1.mergeIf(titleOpts, core_defaults.global.title); + + if (titleBlock) { + core_layouts.configure(chart, titleBlock, titleOpts); + titleBlock.options = titleOpts; + } else { + createNewTitleBlockAndAttach(chart, titleOpts); + } + } else if (titleBlock) { + core_layouts.removeBox(chart, titleBlock); + delete chart.titleBlock; + } + } +}; + +var plugins = {}; +var filler = plugin_filler; +var legend = plugin_legend; +var title = plugin_title; +plugins.filler = filler; +plugins.legend = legend; +plugins.title = title; + +/** + * @namespace Chart + */ + + +core_controller.helpers = helpers$1; + +// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! +core_helpers(core_controller); + +core_controller._adapters = core_adapters; +core_controller.Animation = core_animation; +core_controller.animationService = core_animations; +core_controller.controllers = controllers; +core_controller.DatasetController = core_datasetController; +core_controller.defaults = core_defaults; +core_controller.Element = core_element; +core_controller.elements = elements; +core_controller.Interaction = core_interaction; +core_controller.layouts = core_layouts; +core_controller.platform = platform; +core_controller.plugins = core_plugins; +core_controller.Scale = core_scale; +core_controller.scaleService = core_scaleService; +core_controller.Ticks = core_ticks; +core_controller.Tooltip = core_tooltip; + +// Register built-in scales + +core_controller.helpers.each(scales, function(scale, type) { + core_controller.scaleService.registerScaleType(type, scale, scale._defaults); +}); + +// Load to register built-in adapters (as side effects) + + +// Loading built-in plugins + +for (var k in plugins) { + if (plugins.hasOwnProperty(k)) { + core_controller.plugins.register(plugins[k]); + } +} + +core_controller.platform.initialize(); + +var src = core_controller; +if (typeof window !== 'undefined') { + window.Chart = core_controller; +} + +// DEPRECATIONS + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Chart + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ +core_controller.Chart = core_controller; + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Legend + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.Legend = plugins.legend._element; + +/** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Title + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.Title = plugins.title._element; + +/** + * Provided for backward compatibility, use Chart.plugins instead + * @namespace Chart.pluginService + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ +core_controller.pluginService = core_controller.plugins; + +/** + * Provided for backward compatibility, inheriting from Chart.PlugingBase has no + * effect, instead simply create/register plugins via plain JavaScript objects. + * @interface Chart.PluginBase + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ +core_controller.PluginBase = core_controller.Element.extend({}); + +/** + * Provided for backward compatibility, use Chart.helpers.canvas instead. + * @namespace Chart.canvasHelpers + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +core_controller.canvasHelpers = core_controller.helpers.canvas; + +/** + * Provided for backward compatibility, use Chart.layouts instead. + * @namespace Chart.layoutService + * @deprecated since version 2.7.3 + * @todo remove at version 3 + * @private + */ +core_controller.layoutService = core_controller.layouts; + +/** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.LinearScaleBase + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ +core_controller.LinearScaleBase = scale_linearbase; + +/** + * Provided for backward compatibility, instead we should create a new Chart + * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ +core_controller.helpers.each( + [ + 'Bar', + 'Bubble', + 'Doughnut', + 'Line', + 'PolarArea', + 'Radar', + 'Scatter' + ], + function(klass) { + core_controller[klass] = function(ctx, cfg) { + return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, { + type: klass.charAt(0).toLowerCase() + klass.slice(1) + })); + }; + } +); + +return src; + +}))); diff --git a/SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js b/SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js new file mode 100644 index 00000000..0ef77455 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js @@ -0,0 +1,911 @@ +/* + CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ + Copyright 2018 fenopix + + --------------------- License Information -------------------- + CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. + https://canvasjs.com/license/ + +*/ +/*eslint-disable*/ +/*jshint ignore:start*/ +(function(){function qa(k,p){k.prototype=eb(p.prototype);k.prototype.constructor=k;k.base=p.prototype}function eb(k){function p(){}p.prototype=k;return new p}function Ya(k,p,D){"millisecond"===D?k.setMilliseconds(k.getMilliseconds()+1*p):"second"===D?k.setSeconds(k.getSeconds()+1*p):"minute"===D?k.setMinutes(k.getMinutes()+1*p):"hour"===D?k.setHours(k.getHours()+1*p):"day"===D?k.setDate(k.getDate()+1*p):"week"===D?k.setDate(k.getDate()+7*p):"month"===D?k.setMonth(k.getMonth()+1*p):"year"===D&&k.setFullYear(k.getFullYear()+ +1*p);return k}function $(k,p){var D=!1;0>k&&(D=!0,k*=-1);k=""+k;for(p=p?p:1;k.length<p;)k="0"+k;return D?"-"+k:k}function Ia(k){if(!k)return k;k=k.replace(/^\s\s*/,"");for(var p=/\s/,D=k.length;p.test(k.charAt(--D)););return k.slice(0,D+1)}function Ea(k){k.roundRect=function(k,D,r,u,H,F,z,v){z&&(this.fillStyle=z);v&&(this.strokeStyle=v);"undefined"===typeof H&&(H=5);this.lineWidth=F;this.beginPath();this.moveTo(k+H,D);this.lineTo(k+r-H,D);this.quadraticCurveTo(k+r,D,k+r,D+H);this.lineTo(k+r,D+u-H); +this.quadraticCurveTo(k+r,D+u,k+r-H,D+u);this.lineTo(k+H,D+u);this.quadraticCurveTo(k,D+u,k,D+u-H);this.lineTo(k,D+H);this.quadraticCurveTo(k,D,k+H,D);this.closePath();z&&this.fill();v&&0<F&&this.stroke()}}function Sa(k,p){return k-p}function Ta(k,p,D){if(k&&p&&D){D=D+"."+p;var r="image/"+p;k=k.toDataURL(r);var u=!1,H=document.createElement("a");H.download=D;H.href=k;if("undefined"!==typeof Blob&&new Blob){for(var F=k.replace(/^data:[a-z\/]*;base64,/,""),F=atob(F),z=new ArrayBuffer(F.length),z=new Uint8Array(z), +v=0;v<F.length;v++)z[v]=F.charCodeAt(v);p=new Blob([z.buffer],{type:"image/"+p});try{window.navigator.msSaveBlob(p,D),u=!0}catch(L){H.dataset.downloadurl=[r,H.download,H.href].join(":"),H.href=window.URL.createObjectURL(p)}}if(!u)try{event=document.createEvent("MouseEvents"),event.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),H.dispatchEvent?H.dispatchEvent(event):H.fireEvent&&H.fireEvent("onclick")}catch(E){p=window.open(),p.document.write("<img src='"+k+"'></img><div>Please right click on the image and save it to your device</div>"), +p.document.close()}}}function N(k){var p=((k&16711680)>>16).toString(16),D=((k&65280)>>8).toString(16);k=((k&255)>>0).toString(16);p=2>p.length?"0"+p:p;D=2>D.length?"0"+D:D;k=2>k.length?"0"+k:k;return"#"+p+D+k}function fb(k,p){var D=this.length>>>0,r=Number(p)||0,r=0>r?Math.ceil(r):Math.floor(r);for(0>r&&(r+=D);r<D;r++)if(r in this&&this[r]===k)return r;return-1}function u(k){return null===k||"undefined"===typeof k}function Fa(k){k.indexOf||(k.indexOf=fb);return k}function gb(k){if(U.fSDec)k[ja("`eeDwdouMhrudods")](ja("e`u`@ohl`uhnoHuds`uhnoDoe"), +function(){U._fTWm&&U._fTWm(k)})}function Za(k,p,D){D=D||"normal";var r=k+"_"+p+"_"+D,u=$a[r];if(isNaN(u)){try{k="position:absolute; left:0px; top:-20000px; padding:0px;margin:0px;border:none;white-space:pre;line-height:normal;font-family:"+k+"; font-size:"+p+"px; font-weight:"+D+";";if(!xa){var H=document.body;xa=document.createElement("span");xa.innerHTML="";var F=document.createTextNode("Mpgyi");xa.appendChild(F);H.appendChild(xa)}xa.style.display="";xa.setAttribute("style",k);u=Math.round(xa.offsetHeight); +xa.style.display="none"}catch(z){u=Math.ceil(1.1*p)}u=Math.max(u,p);$a[r]=u}return u}function R(k,p){var D=[];if(D={solid:[],shortDash:[3,1],shortDot:[1,1],shortDashDot:[3,1,1,1],shortDashDotDot:[3,1,1,1,1,1],dot:[1,2],dash:[4,2],dashDot:[4,2,1,2],longDash:[8,2],longDashDot:[8,2,1,2],longDashDotDot:[8,2,1,2,1,2]}[k||"solid"])for(var r=0;r<D.length;r++)D[r]*=p;else D=[];return D}function O(k,p,D,r,u){r=r||[];u=u||!1;r.push([k,p,D,u]);return k.addEventListener?(k.addEventListener(p,D,u),D):k.attachEvent? +(r=function(p){p=p||window.event;p.preventDefault=p.preventDefault||function(){p.returnValue=!1};p.stopPropagation=p.stopPropagation||function(){p.cancelBubble=!0};D.call(k,p)},k.attachEvent("on"+p,r),r):!1}function ab(k,p,D){k*=W;p*=W;k=D.getImageData(k,p,2,2).data;p=!0;for(D=0;4>D;D++)if(k[D]!==k[D+4]|k[D]!==k[D+8]|k[D]!==k[D+12]){p=!1;break}return p?k[0]<<16|k[1]<<8|k[2]:0}function na(k,p,D){return k in p?p[k]:D[k]}function Oa(k,p,D){if(r&&bb){var u=k.getContext("2d");Pa=u.webkitBackingStorePixelRatio|| +u.mozBackingStorePixelRatio||u.msBackingStorePixelRatio||u.oBackingStorePixelRatio||u.backingStorePixelRatio||1;W=Ua/Pa;k.width=p*W;k.height=D*W;Ua!==Pa&&(k.style.width=p+"px",k.style.height=D+"px",u.scale(W,W))}else k.width=p,k.height=D}function hb(k){if(!ib){var p=!1,D=!1;"undefined"===typeof ra.Chart.creditHref?(k.creditHref=ja("iuuqr;..b`ow`rkr/bnl."),k.creditText=ja("B`ow`rKR/bnl")):(p=k.updateOption("creditText"),D=k.updateOption("creditHref"));if(k.creditHref&&k.creditText){k._creditLink|| +(k._creditLink=document.createElement("a"),k._creditLink.setAttribute("class","canvasjs-chart-credit"),k._creditLink.setAttribute("title","JavaScript Charts"),k._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:2px;top:"+(k.height-14)+"px;color:dimgrey;text-decoration:none;font-size:11px;font-family: Calibri, Lucida Grande, Lucida Sans Unicode, Arial, sans-serif"),k._creditLink.setAttribute("tabIndex",-1),k._creditLink.setAttribute("target","_blank"));if(0===k.renderCount|| +p||D)k._creditLink.setAttribute("href",k.creditHref),k._creditLink.innerHTML=k.creditText;k._creditLink&&k.creditHref&&k.creditText?(k._creditLink.parentElement||k._canvasJSContainer.appendChild(k._creditLink),k._creditLink.style.top=k.height-14+"px"):k._creditLink.parentElement&&k._canvasJSContainer.removeChild(k._creditLink)}}}function ta(k,p){Ja&&(this.canvasCount|=0,window.console.log(++this.canvasCount));var D=document.createElement("canvas");D.setAttribute("class","canvasjs-chart-canvas");Oa(D, +k,p);r||"undefined"===typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(D);return D}function sa(k,p,D){for(var r in D)p.style[r]=D[r]}function ua(k,p,D){p.getAttribute("state")||(p.style.backgroundColor=k.toolbar.backgroundColor,p.style.color=k.toolbar.fontColor,p.style.border="none",sa(k,p,{WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",userSelect:"none"}));p.getAttribute("state")!==D&&(p.setAttribute("state",D),p.setAttribute("type","button"),sa(k,p,{padding:"5px 12px", +cursor:"pointer","float":"left",width:"40px",height:"25px",outline:"0px",verticalAlign:"baseline",lineHeight:"0"}),p.setAttribute("title",k._cultureInfo[D+"Text"]),p.innerHTML="<img style='height:95%; pointer-events: none;' src='"+jb[D].image+"' alt='"+k._cultureInfo[D+"Text"]+"' />")}function Qa(){for(var k=null,p=0;p<arguments.length;p++)k=arguments[p],k.style&&(k.style.display="inline")}function va(){for(var k=null,p=0;p<arguments.length;p++)(k=arguments[p])&&k.style&&(k.style.display="none")} +function V(k,p,D,r,v){this._defaultsKey=k;this._themeOptionsKey=p;this._index=r;this.parent=v;this._eventListeners=[];k={};this.theme&&u(p)&&u(r)?k=u(ya[this.theme])?ya.light1:ya[this.theme]:this.parent&&(this.parent.themeOptions&&this.parent.themeOptions[p])&&(null===r?k=this.parent.themeOptions[p]:0<this.parent.themeOptions[p].length&&(r=Math.min(this.parent.themeOptions[p].length-1,r),k=this.parent.themeOptions[p][r]));this.themeOptions=k;this.options=D?D:{_isPlaceholder:!0};this.setOptions(this.options, +k)}function Ga(k,p,r,u,v){"undefined"===typeof v&&(v=0);this._padding=v;this._x1=k;this._y1=p;this._x2=r;this._y2=u;this._rightOccupied=this._leftOccupied=this._bottomOccupied=this._topOccupied=this._padding}function ka(k,p){ka.base.constructor.call(this,"TextBlock",null,p,null,null);this.ctx=k;this._isDirty=!0;this._wrappedText=null;this._initialize()}function Va(k,p){Va.base.constructor.call(this,"Toolbar","toolbar",p,null,k);this.chart=k;this.canvas=k.canvas;this.ctx=this.chart.ctx;this.optionsName= +"toolbar"}function Aa(k,p){Aa.base.constructor.call(this,"Title","title",p,null,k);this.chart=k;this.canvas=k.canvas;this.ctx=this.chart.ctx;this.optionsName="title";if(u(this.options.margin)&&k.options.subtitles)for(var r=k.options.subtitles,za=0;za<r.length;za++)if((u(r[za].horizontalAlign)&&"center"===this.horizontalAlign||r[za].horizontalAlign===this.horizontalAlign)&&(u(r[za].verticalAlign)&&"top"===this.verticalAlign||r[za].verticalAlign===this.verticalAlign)&&!r[za].dockInsidePlotArea===!this.dockInsidePlotArea){this.margin= +0;break}"undefined"===typeof this.options.fontSize&&(this.fontSize=this.chart.getAutoFontSize(this.fontSize));this.height=this.width=null;this.bounds={x1:null,y1:null,x2:null,y2:null}}function Ka(k,p,r){Ka.base.constructor.call(this,"Subtitle","subtitles",p,r,k);this.chart=k;this.canvas=k.canvas;this.ctx=this.chart.ctx;this.optionsName="subtitles";this.isOptionsInArray=!0;"undefined"===typeof this.options.fontSize&&(this.fontSize=this.chart.getAutoFontSize(this.fontSize));this.height=this.width=null; +this.bounds={x1:null,y1:null,x2:null,y2:null}}function Wa(){this.pool=[]}function La(k){var p;k&&Ma[k]&&(p=Ma[k]);La.base.constructor.call(this,"CultureInfo",null,p,null,null)}var Ja=!1,U={},r=!!document.createElement("canvas").getContext,ra={Chart:{width:500,height:400,zoomEnabled:!1,zoomType:"x",backgroundColor:"white",theme:"light1",animationEnabled:!1,animationDuration:1200,dataPointWidth:null,dataPointMinWidth:null,dataPointMaxWidth:null,colorSet:"colorSet1",culture:"en",creditHref:"",creditText:"CanvasJS", +interactivityEnabled:!0,exportEnabled:!1,exportFileName:"Chart",rangeChanging:null,rangeChanged:null,publicProperties:{title:"readWrite",subtitles:"readWrite",toolbar:"readWrite",toolTip:"readWrite",legend:"readWrite",axisX:"readWrite",axisY:"readWrite",axisX2:"readWrite",axisY2:"readWrite",data:"readWrite",options:"readWrite",bounds:"readOnly",container:"readOnly"}},Title:{padding:0,text:null,verticalAlign:"top",horizontalAlign:"center",fontSize:20,fontFamily:"Calibri",fontWeight:"normal",fontColor:"black", +fontStyle:"normal",borderThickness:0,borderColor:"black",cornerRadius:0,backgroundColor:r?"transparent":null,margin:5,wrap:!0,maxWidth:null,dockInsidePlotArea:!1,publicProperties:{options:"readWrite",bounds:"readOnly",chart:"readOnly"}},Subtitle:{padding:0,text:null,verticalAlign:"top",horizontalAlign:"center",fontSize:14,fontFamily:"Calibri",fontWeight:"normal",fontColor:"black",fontStyle:"normal",borderThickness:0,borderColor:"black",cornerRadius:0,backgroundColor:null,margin:2,wrap:!0,maxWidth:null, +dockInsidePlotArea:!1,publicProperties:{options:"readWrite",bounds:"readOnly",chart:"readOnly"}},Toolbar:{backgroundColor:"white",backgroundColorOnHover:"#2196f3",borderColor:"#2196f3",borderThickness:1,fontColor:"black",fontColorOnHover:"white",publicProperties:{options:"readWrite",chart:"readOnly"}},Legend:{name:null,verticalAlign:"center",horizontalAlign:"right",fontSize:14,fontFamily:"calibri",fontWeight:"normal",fontColor:"black",fontStyle:"normal",cursor:null,itemmouseover:null,itemmouseout:null, +itemmousemove:null,itemclick:null,dockInsidePlotArea:!1,reversed:!1,backgroundColor:r?"transparent":null,borderColor:r?"transparent":null,borderThickness:0,cornerRadius:0,maxWidth:null,maxHeight:null,markerMargin:null,itemMaxWidth:null,itemWidth:null,itemWrap:!0,itemTextFormatter:null,publicProperties:{options:"readWrite",bounds:"readOnly",chart:"readOnly"}},ToolTip:{enabled:!0,shared:!1,animationEnabled:!0,content:null,contentFormatter:null,reversed:!1,backgroundColor:r?"rgba(255,255,255,.9)":"rgb(255,255,255)", +borderColor:null,borderThickness:2,cornerRadius:5,fontSize:14,fontColor:"black",fontFamily:"Calibri, Arial, Georgia, serif;",fontWeight:"normal",fontStyle:"italic",publicProperties:{options:"readWrite",chart:"readOnly"}},Axis:{minimum:null,maximum:null,viewportMinimum:null,viewportMaximum:null,interval:null,intervalType:null,reversed:!1,logarithmic:!1,logarithmBase:10,title:null,titleFontColor:"black",titleFontSize:20,titleFontFamily:"arial",titleFontWeight:"normal",titleFontStyle:"normal",titleWrap:!0, +titleMaxWidth:null,titleBackgroundColor:r?"transparent":null,titleBorderColor:r?"transparent":null,titleBorderThickness:0,titleCornerRadius:0,labelAngle:0,labelFontFamily:"arial",labelFontColor:"black",labelFontSize:12,labelFontWeight:"normal",labelFontStyle:"normal",labelAutoFit:!0,labelWrap:!0,labelMaxWidth:null,labelFormatter:null,labelBackgroundColor:r?"transparent":null,labelBorderColor:r?"transparent":null,labelBorderThickness:0,labelCornerRadius:0,labelPlacement:"outside",prefix:"",suffix:"", +includeZero:!0,tickLength:5,tickColor:"black",tickThickness:1,lineColor:"black",lineThickness:1,lineDashType:"solid",gridColor:"A0A0A0",gridThickness:0,gridDashType:"solid",interlacedColor:r?"transparent":null,valueFormatString:null,margin:2,publicProperties:{options:"readWrite",stripLines:"readWrite",scaleBreaks:"readWrite",crosshair:"readWrite",bounds:"readOnly",chart:"readOnly"}},StripLine:{value:null,startValue:null,endValue:null,color:"orange",opacity:null,thickness:2,lineDashType:"solid",label:"", +labelPlacement:"inside",labelAlign:"far",labelWrap:!0,labelMaxWidth:null,labelBackgroundColor:null,labelBorderColor:r?"transparent":null,labelBorderThickness:0,labelCornerRadius:0,labelFontFamily:"arial",labelFontColor:"orange",labelFontSize:12,labelFontWeight:"normal",labelFontStyle:"normal",labelFormatter:null,showOnTop:!1,publicProperties:{options:"readWrite",axis:"readOnly",bounds:"readOnly",chart:"readOnly"}},ScaleBreaks:{autoCalculate:!1,collapsibleThreshold:"25%",maxNumberOfAutoBreaks:2,spacing:8, +type:"straight",color:"#FFFFFF",fillOpacity:0.9,lineThickness:2,lineColor:"#E16E6E",lineDashType:"solid",publicProperties:{options:"readWrite",customBreaks:"readWrite",axis:"readOnly",autoBreaks:"readOnly",bounds:"readOnly",chart:"readOnly"}},Break:{startValue:null,endValue:null,spacing:8,type:"straight",color:"#FFFFFF",fillOpacity:0.9,lineThickness:2,lineColor:"#E16E6E",lineDashType:"solid",publicProperties:{options:"readWrite",scaleBreaks:"readOnly",bounds:"readOnly",chart:"readOnly"}},Crosshair:{enabled:!1, +snapToDataPoint:!1,color:"grey",opacity:null,thickness:2,lineDashType:"solid",label:"",labelWrap:!0,labelMaxWidth:null,labelBackgroundColor:r?"grey":null,labelBorderColor:r?"grey":null,labelBorderThickness:0,labelCornerRadius:0,labelFontFamily:r?"Calibri, Optima, Candara, Verdana, Geneva, sans-serif":"calibri",labelFontSize:12,labelFontColor:"#fff",labelFontWeight:"normal",labelFontStyle:"normal",labelFormatter:null,valueFormatString:null,publicProperties:{options:"readWrite",axis:"readOnly",bounds:"readOnly", +chart:"readOnly"}},DataSeries:{name:null,dataPoints:null,label:"",bevelEnabled:!1,highlightEnabled:!0,cursor:"default",indexLabel:"",indexLabelPlacement:"auto",indexLabelOrientation:"horizontal",indexLabelFontColor:"black",indexLabelFontSize:12,indexLabelFontStyle:"normal",indexLabelFontFamily:"Arial",indexLabelFontWeight:"normal",indexLabelBackgroundColor:null,indexLabelLineColor:"gray",indexLabelLineThickness:1,indexLabelLineDashType:"solid",indexLabelMaxWidth:null,indexLabelWrap:!0,indexLabelFormatter:null, +lineThickness:2,lineDashType:"solid",connectNullData:!1,nullDataLineDashType:"dash",color:null,lineColor:null,risingColor:"white",fallingColor:"red",fillOpacity:null,startAngle:0,radius:null,innerRadius:null,neckHeight:null,neckWidth:null,reversed:!1,valueRepresents:null,linkedDataSeriesIndex:null,whiskerThickness:2,whiskerDashType:"solid",whiskerColor:null,whiskerLength:null,stemThickness:2,stemColor:null,stemDashType:"solid",upperBoxColor:"white",lowerBoxColor:"white",type:"column",xValueType:"number", +axisXType:"primary",axisYType:"primary",axisXIndex:0,axisYIndex:0,xValueFormatString:null,yValueFormatString:null,zValueFormatString:null,percentFormatString:null,showInLegend:null,legendMarkerType:null,legendMarkerColor:null,legendText:null,legendMarkerBorderColor:r?"transparent":null,legendMarkerBorderThickness:0,markerType:"circle",markerColor:null,markerSize:null,markerBorderColor:r?"transparent":null,markerBorderThickness:0,mouseover:null,mouseout:null,mousemove:null,click:null,toolTipContent:null, +visible:!0,publicProperties:{options:"readWrite",axisX:"readWrite",axisY:"readWrite",chart:"readOnly"}},TextBlock:{x:0,y:0,width:null,height:null,maxWidth:null,maxHeight:null,padding:0,angle:0,text:"",horizontalAlign:"center",fontSize:12,fontFamily:"calibri",fontWeight:"normal",fontColor:"black",fontStyle:"normal",borderThickness:0,borderColor:"black",cornerRadius:0,backgroundColor:null,textBaseline:"top"},CultureInfo:{decimalSeparator:".",digitGroupSeparator:",",zoomText:"Zoom",panText:"Pan",resetText:"Reset", +menuText:"More Options",saveJPGText:"Save as JPEG",savePNGText:"Save as PNG",printText:"Print",days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),shortDays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ")}},Ma={en:{}},v=r?"Trebuchet MS, Helvetica, sans-serif":"Arial",Ha=r?"Impact, Charcoal, sans-serif":"Arial", +Ba={colorSet1:"#4F81BC #C0504E #9BBB58 #23BFAA #8064A1 #4AACC5 #F79647 #7F6084 #77A033 #33558B #E59566".split(" "),colorSet2:"#6D78AD #51CDA0 #DF7970 #4C9CA0 #AE7D99 #C9D45C #5592AD #DF874D #52BCA8 #8E7AA3 #E3CB64 #C77B85 #C39762 #8DD17E #B57952 #FCC26C".split(" "),colorSet3:"#8CA1BC #36845C #017E82 #8CB9D0 #708C98 #94838D #F08891 #0366A7 #008276 #EE7757 #E5BA3A #F2990B #03557B #782970".split(" ")},I,fa,Q,ha,ga;fa="#333333";Q="#000000";I="#666666";ga=ha="#000000";var X=20,E=14,Xa={colorSet:"colorSet1", +backgroundColor:"#FFFFFF",title:{fontFamily:Ha,fontSize:32,fontColor:fa,fontWeight:"normal",verticalAlign:"top",margin:5},subtitles:[{fontFamily:Ha,fontSize:E,fontColor:fa,fontWeight:"normal",verticalAlign:"top",margin:5}],data:[{indexLabelFontFamily:v,indexLabelFontSize:E,indexLabelFontColor:fa,indexLabelFontWeight:"normal",indexLabelLineThickness:1}],axisX:[{titleFontFamily:v,titleFontSize:X,titleFontColor:fa,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal", +lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:0,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],axisX2:[{titleFontFamily:v, +titleFontSize:X,titleFontColor:fa,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:0,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1, +lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],axisY:[{titleFontFamily:v,titleFontSize:X,titleFontColor:fa,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:1,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300", +thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],axisY2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:fa,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:1, +gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],legend:{fontFamily:v,fontSize:14,fontColor:fa,fontWeight:"bold",verticalAlign:"bottom", +horizontalAlign:"center"},toolTip:{fontFamily:v,fontSize:14,fontStyle:"normal",cornerRadius:0,borderThickness:1}};Q=fa="#F5F5F5";I="#FFFFFF";ha="#40BAF1";ga="#F5F5F5";var X=20,E=14,cb={colorSet:"colorSet2",title:{fontFamily:v,fontSize:33,fontColor:"#3A3A3A",fontWeight:"bold",verticalAlign:"top",margin:5},subtitles:[{fontFamily:v,fontSize:E,fontColor:"#3A3A3A",fontWeight:"normal",verticalAlign:"top",margin:5}],data:[{indexLabelFontFamily:v,indexLabelFontSize:E,indexLabelFontColor:"#666666",indexLabelFontWeight:"normal", +indexLabelLineThickness:1}],axisX:[{titleFontFamily:v,titleFontSize:X,titleFontColor:"#666666",titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:"#666666",labelFontWeight:"normal",lineThickness:1,lineColor:"#BBBBBB",tickThickness:1,tickColor:"#BBBBBB",gridThickness:1,gridColor:"#BBBBBB",stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FFA500",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FFA500",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E, +labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:"black",color:"black",thickness:1,lineDashType:"dot"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],axisX2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:"#666666",titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:"#666666",labelFontWeight:"normal",lineThickness:1,lineColor:"#BBBBBB",tickColor:"#BBBBBB",tickThickness:1,gridThickness:1,gridColor:"#BBBBBB", +stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FFA500",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FFA500",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:"black",color:"black",thickness:1,lineDashType:"dot"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],axisY:[{titleFontFamily:v,titleFontSize:X,titleFontColor:"#666666",titleFontWeight:"normal", +labelFontFamily:v,labelFontSize:E,labelFontColor:"#666666",labelFontWeight:"normal",lineThickness:0,lineColor:"#BBBBBB",tickColor:"#BBBBBB",tickThickness:1,gridThickness:1,gridColor:"#BBBBBB",stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FFA500",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FFA500",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:"black",color:"black",thickness:1,lineDashType:"dot"}, +scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],axisY2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:"#666666",titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:"#666666",labelFontWeight:"normal",lineThickness:0,lineColor:"#BBBBBB",tickColor:"#BBBBBB",tickThickness:1,gridThickness:1,gridColor:"#BBBBBB",stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FFA500",labelFontWeight:"normal",labelBackgroundColor:null, +color:"#FFA500",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:"black",color:"black",thickness:1,lineDashType:"dot"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],legend:{fontFamily:v,fontSize:14,fontColor:"#3A3A3A",fontWeight:"bold",verticalAlign:"bottom",horizontalAlign:"center"},toolTip:{fontFamily:v,fontSize:14,fontStyle:"normal",cornerRadius:0,borderThickness:1}}; +Q=fa="#F5F5F5";I="#FFFFFF";ha="#40BAF1";ga="#F5F5F5";X=20;E=14;Ha={colorSet:"colorSet12",backgroundColor:"#2A2A2A",title:{fontFamily:Ha,fontSize:32,fontColor:fa,fontWeight:"normal",verticalAlign:"top",margin:5},subtitles:[{fontFamily:Ha,fontSize:E,fontColor:fa,fontWeight:"normal",verticalAlign:"top",margin:5}],toolbar:{backgroundColor:"#666666",backgroundColorOnHover:"#FF7372",borderColor:"#FF7372",borderThickness:1,fontColor:"#F5F5F5",fontColorOnHover:"#F5F5F5"},data:[{indexLabelFontFamily:v,indexLabelFontSize:E, +indexLabelFontColor:Q,indexLabelFontWeight:"normal",indexLabelLineThickness:1}],axisX:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:0,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v, +labelFontSize:E,labelFontColor:"#000000",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777",lineThickness:1,lineDashType:"solid",color:"#111111"}}],axisX2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:0,gridColor:I,stripLines:[{labelFontFamily:v, +labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#000000",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777",lineThickness:1,lineDashType:"solid",color:"#111111"}}],axisY:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v, +labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:1,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#000000",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777", +lineThickness:1,lineDashType:"solid",color:"#111111"}}],axisY2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:1,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#000000", +labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777",lineThickness:1,lineDashType:"solid",color:"#111111"}}],legend:{fontFamily:v,fontSize:14,fontColor:fa,fontWeight:"bold",verticalAlign:"bottom",horizontalAlign:"center"},toolTip:{fontFamily:v,fontSize:14,fontStyle:"normal",cornerRadius:0,borderThickness:1,fontColor:Q,backgroundColor:"rgba(0, 0, 0, .7)"}};I="#FFFFFF";Q=fa="#FAFAFA";ha="#40BAF1";ga="#F5F5F5"; +var X=20,E=14,ya={light1:Xa,light2:cb,dark1:Ha,dark2:{colorSet:"colorSet2",backgroundColor:"#32373A",title:{fontFamily:v,fontSize:32,fontColor:fa,fontWeight:"normal",verticalAlign:"top",margin:5},subtitles:[{fontFamily:v,fontSize:E,fontColor:fa,fontWeight:"normal",verticalAlign:"top",margin:5}],toolbar:{backgroundColor:"#666666",backgroundColorOnHover:"#FF7372",borderColor:"#FF7372",borderThickness:1,fontColor:"#F5F5F5",fontColorOnHover:"#F5F5F5"},data:[{indexLabelFontFamily:v,indexLabelFontSize:E, +indexLabelFontColor:Q,indexLabelFontWeight:"normal",indexLabelLineThickness:1}],axisX:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:0,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v, +labelFontSize:E,labelFontColor:"#000000",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777",lineThickness:1,lineDashType:"solid",color:"#111111"}}],axisX2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:0,gridColor:I,stripLines:[{labelFontFamily:v, +labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#000000",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777",lineThickness:1,lineDashType:"solid",color:"#111111"}}],axisY:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v, +labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:0,lineColor:I,tickThickness:1,tickColor:I,gridThickness:1,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#000000",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777", +lineThickness:1,lineDashType:"solid",color:"#111111"}}],axisY2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:0,lineColor:I,tickThickness:1,tickColor:I,gridThickness:1,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#000000", +labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777",lineThickness:1,lineDashType:"solid",color:"#111111"}}],legend:{fontFamily:v,fontSize:14,fontColor:fa,fontWeight:"bold",verticalAlign:"bottom",horizontalAlign:"center"},toolTip:{fontFamily:v,fontSize:14,fontStyle:"normal",cornerRadius:0,borderThickness:1,fontColor:Q,backgroundColor:"rgba(0, 0, 0, .7)"}},theme1:Xa,theme2:cb,theme3:Xa},S={numberDuration:1, +yearDuration:314496E5,monthDuration:2592E6,weekDuration:6048E5,dayDuration:864E5,hourDuration:36E5,minuteDuration:6E4,secondDuration:1E3,millisecondDuration:1,dayOfWeekFromInt:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" ")};(function(){U.fSDec=function(k){for(var p="",r=0;r<k.length;r++)p+=String.fromCharCode(Math.ceil(k.length/57/5)^k.charCodeAt(r));return p};U.obj={trVs:"Ush`m!Wdsrhno",fntStr:"qy!B`mhcsh-!Mtbhe`!Fs`oed-!Mtbhe`!R`or!Tohbned-!@sh`m-!r`or,rdshg",txtBl:"udyuC`rdmhod", +fnt:"gnou",fSy:"ghmmRuxmd",fTx:"ghmmUdyu",grClr:"fsdx",cntx:"buy",tp:"unq"};delete ra[U.fSDec("Bi`su")][U.fSDec("bsdehuIsdg")];U.pro={sCH:ra[U.fSDec("Bi`su")][U.fSDec("bsdehuIsdg")]};U._fTWm=function(k){if("undefined"===typeof U.pro.sCH&&!db)try{var p=k[U.fSDec(U.obj.cntx)];p[U.fSDec(U.obj.txtBl)]=U.fSDec(U.obj.tp);p[U.fSDec(U.obj.fnt)]=11+U.fSDec(U.obj.fntStr);p[U.fSDec(U.obj.fSy)]=U.fSDec(U.obj.grClr);p[U.fSDec(U.obj.fTx)](U.fSDec(U.obj.trVs),2,k.height-11-2)}catch(r){}}})();var $a={},xa=null,kb= +function(){this.ctx.clearRect(0,0,this.width,this.height);this.backgroundColor&&(this.ctx.fillStyle=this.backgroundColor,this.ctx.fillRect(0,0,this.width,this.height))},lb=function(k,p,r){p=Math.min(this.width,this.height);return Math.max("theme4"===this.theme?0:300<=p?12:10,Math.round(p*(k/400)))},Ca=function(){var k=/D{1,4}|M{1,4}|Y{1,4}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|f{1,3}|t{1,2}|T{1,2}|K|z{1,3}|"[^"]*"|'[^']*'/g,p="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),r="Sun Mon Tue Wed Thu Fri Sat".split(" "), +u="January February March April May June July August September October November December".split(" "),v="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),H=/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,F=/[^-+\dA-Z]/g;return function(z,E,L){var R=L?L.days:p,I=L?L.months:u,N=L?L.shortDays:r,O=L?L.shortMonths:v;L="";var S=!1;z=z&&z.getTime?z:z?new Date(z):new Date;if(isNaN(z))throw SyntaxError("invalid date"); +"UTC:"===E.slice(0,4)&&(E=E.slice(4),S=!0);L=S?"getUTC":"get";var U=z[L+"Date"](),V=z[L+"Day"](),M=z[L+"Month"](),Q=z[L+"FullYear"](),a=z[L+"Hours"](),d=z[L+"Minutes"](),b=z[L+"Seconds"](),c=z[L+"Milliseconds"](),e=S?0:z.getTimezoneOffset();return L=E.replace(k,function(g){switch(g){case "D":return U;case "DD":return $(U,2);case "DDD":return N[V];case "DDDD":return R[V];case "M":return M+1;case "MM":return $(M+1,2);case "MMM":return O[M];case "MMMM":return I[M];case "Y":return parseInt(String(Q).slice(-2)); +case "YY":return $(String(Q).slice(-2),2);case "YYY":return $(String(Q).slice(-3),3);case "YYYY":return $(Q,4);case "h":return a%12||12;case "hh":return $(a%12||12,2);case "H":return a;case "HH":return $(a,2);case "m":return d;case "mm":return $(d,2);case "s":return b;case "ss":return $(b,2);case "f":return String(c).slice(0,1);case "ff":return $(String(c).slice(0,2),2);case "fff":return $(String(c).slice(0,3),3);case "t":return 12>a?"a":"p";case "tt":return 12>a?"am":"pm";case "T":return 12>a?"A": +"P";case "TT":return 12>a?"AM":"PM";case "K":return S?"UTC":(String(z).match(H)||[""]).pop().replace(F,"");case "z":return(0<e?"-":"+")+Math.floor(Math.abs(e)/60);case "zz":return(0<e?"-":"+")+$(Math.floor(Math.abs(e)/60),2);case "zzz":return(0<e?"-":"+")+$(Math.floor(Math.abs(e)/60),2)+$(Math.abs(e)%60,2);default:return g.slice(1,g.length-1)}})}}(),ba=function(k,p,r){if(null===k)return"";if(!isFinite(k))return k;k=Number(k);var u=0>k?!0:!1;u&&(k*=-1);var v=r?r.decimalSeparator:".",H=r?r.digitGroupSeparator: +",",F="";p=String(p);var F=1,z=r="",E=-1,L=[],R=[],I=0,N=0,S=0,O=!1,U=0,z=p.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|\u2030|./g);p=null;for(var Q=0;z&&Q<z.length;Q++)if(p=z[Q],"."===p&&0>E)E=Q;else{if("%"===p)F*=100;else if("\u2030"===p){F*=1E3;continue}else if(","===p[0]&&"."===p[p.length-1]){F/=Math.pow(1E3,p.length-1);E=Q+p.length-1;continue}else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||(O=!0);0>E?(L.push(p),"#"===p||"0"===p?I++:","===p&&S++):(R.push(p),"#"!==p&&"0"!==p||N++)}O&&(p=Math.floor(k), +z=-Math.floor(Math.log(k)/Math.LN10+1),U=0===k?0:0===p?-(I+z):String(p).length-I,F/=Math.pow(10,U));0>E&&(E=Q);F=(k*F).toFixed(N);p=F.split(".");F=(p[0]+"").split("");k=(p[1]+"").split("");F&&"0"===F[0]&&F.shift();for(O=z=Q=N=E=0;0<L.length;)if(p=L.pop(),"#"===p||"0"===p)if(E++,E===I){var M=F,F=[];if("0"===p)for(p=I-N-(M?M.length:0);0<p;)M.unshift("0"),p--;for(;0<M.length;)r=M.pop()+r,O++,0===O%z&&(Q===S&&0<M.length)&&(r=H+r)}else 0<F.length?(r=F.pop()+r,N++,O++):"0"===p&&(r="0"+r,N++,O++),0===O% +z&&(Q===S&&0<F.length)&&(r=H+r);else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||!/[eE][+-]*[0]+/.test(p)?","===p?(Q++,z=O,O=0,0<F.length&&(r=H+r)):r=1<p.length&&('"'===p[0]&&'"'===p[p.length-1]||"'"===p[0]&&"'"===p[p.length-1])?p.slice(1,p.length-1)+r:p+r:(p=0>U?p.replace("+","").replace("-",""):p.replace("-",""),r+=p.replace(/[0]+/,function(k){return $(U,k.length)}));H="";for(L=!1;0<R.length;)p=R.shift(),"#"===p||"0"===p?0<k.length&&0!==Number(k.join(""))?(H+=k.shift(),L=!0):"0"===p&&(H+="0",L= +!0):1<p.length&&('"'===p[0]&&'"'===p[p.length-1]||"'"===p[0]&&"'"===p[p.length-1])?H+=p.slice(1,p.length-1):"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||!/[eE][+-]*[0]+/.test(p)?H+=p:(p=0>U?p.replace("+","").replace("-",""):p.replace("-",""),H+=p.replace(/[0]+/,function(k){return $(U,k.length)}));r+=(L?v:"")+H;return u?"-"+r:r},Ra=function(k){var p=0,r=0;k=k||window.event;k.offsetX||0===k.offsetX?(p=k.offsetX,r=k.offsetY):k.layerX||0==k.layerX?(p=k.layerX,r=k.layerY):(p=k.pageX-k.target.offsetLeft, +r=k.pageY-k.target.offsetTop);return{x:p,y:r}},bb=!0,Ua=window.devicePixelRatio||1,Pa=1,W=bb?Ua/Pa:1,ea=function(k,p,r,u,v,H,F,z,E,L,R,N,O){"undefined"===typeof O&&(O=1);F=F||0;z=z||"black";var I=15<u-p&&15<v-r?8:0.35*Math.min(u-p,v-r);k.beginPath();k.moveTo(p,r);k.save();k.fillStyle=H;k.globalAlpha=O;k.fillRect(p,r,u-p,v-r);k.globalAlpha=1;0<F&&(O=0===F%2?0:0.5,k.beginPath(),k.lineWidth=F,k.strokeStyle=z,k.moveTo(p,r),k.rect(p-O,r-O,u-p+2*O,v-r+2*O),k.stroke());k.restore();!0===E&&(k.save(),k.beginPath(), +k.moveTo(p,r),k.lineTo(p+I,r+I),k.lineTo(u-I,r+I),k.lineTo(u,r),k.closePath(),F=k.createLinearGradient((u+p)/2,r+I,(u+p)/2,r),F.addColorStop(0,H),F.addColorStop(1,"rgba(255, 255, 255, .4)"),k.fillStyle=F,k.fill(),k.restore());!0===L&&(k.save(),k.beginPath(),k.moveTo(p,v),k.lineTo(p+I,v-I),k.lineTo(u-I,v-I),k.lineTo(u,v),k.closePath(),F=k.createLinearGradient((u+p)/2,v-I,(u+p)/2,v),F.addColorStop(0,H),F.addColorStop(1,"rgba(255, 255, 255, .4)"),k.fillStyle=F,k.fill(),k.restore());!0===R&&(k.save(), +k.beginPath(),k.moveTo(p,r),k.lineTo(p+I,r+I),k.lineTo(p+I,v-I),k.lineTo(p,v),k.closePath(),F=k.createLinearGradient(p+I,(v+r)/2,p,(v+r)/2),F.addColorStop(0,H),F.addColorStop(1,"rgba(255, 255, 255, 0.1)"),k.fillStyle=F,k.fill(),k.restore());!0===N&&(k.save(),k.beginPath(),k.moveTo(u,r),k.lineTo(u-I,r+I),k.lineTo(u-I,v-I),k.lineTo(u,v),F=k.createLinearGradient(u-I,(v+r)/2,u,(v+r)/2),F.addColorStop(0,H),F.addColorStop(1,"rgba(255, 255, 255, 0.1)"),k.fillStyle=F,F.addColorStop(0,H),F.addColorStop(1, +"rgba(255, 255, 255, 0.1)"),k.fillStyle=F,k.fill(),k.closePath(),k.restore())},ja=function(k){for(var p="",r=0;r<k.length;r++)p+=String.fromCharCode(Math.ceil(k.length/57/5)^k.charCodeAt(r));return p},db=window&&window[ja("mnb`uhno")]&&window[ja("mnb`uhno")].href&&window[ja("mnb`uhno")].href.indexOf&&(-1!==window[ja("mnb`uhno")].href.indexOf(ja("b`ow`rkr/bnl"))||-1!==window[ja("mnb`uhno")].href.indexOf(ja("gdonqhy/bnl"))||-1!==window[ja("mnb`uhno")].href.indexOf(ja("gheemd"))),ib=db&&-1===window[ja("mnb`uhno")].href.indexOf(ja("gheemd")), +jb={reset:{image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAeCAYAAABJ/8wUAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAPjSURBVFhHxVdJaFNRFP1J/jwkP5MxsbaC1WJEglSxOFAXIsFpVRE3ggi1K90obioRRBA33XXnQnciirhQcMCdorgQxBkXWlREkFKsWkv5npvckp/XnzRpKh64kLw733fffe9L/wrL0+mVUdO8uTSZ3MBL/we2qg4rkuSpodCELstXE46ziVkLQ6FQcGOmeSSq6wd4aV50d3drWjj8kQKZJTUc9kxFGenv79dZrDksTSTWWJp2QYtEPiErysyzdX0LsxsCQR8keX8gs6RHIk8ysdgKFg2G53mhuOPsshTlBjKaFo1g7SqLNoShKLdFXT8huQ/paLSbxatYnc2mHMM4hr18Vi8TIvCmXF3vYrW6cF23gGTOk0M1wA4RKvOmq6vLZRVJipvmSWT6tZ6CSEYkco5V50VPT4+D7RwOqi6RiSZm0fJ+vggSqkeoypdsNmuyelNwbXsbgvkWYMtzDWNvWaijoyOBqE+hVK8abcssUeXQ/YfKyi0gFYv1Ipgfoj34fYGTJLOYJA0ODirok32GLN8XhUWCwSes1hIwBg6LydJ/tEeRRapAdUp+wSAiZchtZZWWgAZ+JNpD8peYXQVK9UwUxNpzOK8pq97kURZhYTCKBwPD7h2zK+js7Myi7D8Fod+0TkMI8+EMAngLGc/WtBFWawkFHFnoj/t9KLgGmF0B3QfkxC+EarxkdhnFYlFLY06USqUwL7UMjICHfh/wOc2sCqhpxGbCkLvL7EUDbF73+6DkmVWB6zi7xUDQSLeYvWjAILvm9zEnkJhlbRcDQZcv6Kg2AipyT/Axw6wKlqVSqxDdjF8Izfod13qURdrG/nxehY+xGh+h0CSzKygGvSNQIcc097BI24jb9hax6kj2E7OrMFX1il+ICEf2NrPbhiXLl+fYl+U7zK4iYdsDcyLGf+ofFlkwcN+s10KhmpuYhhtm0hCLVIFL0MDsqNlDIqy9x2CLs1jL6OvrI7vPRbtohXG6eFmsFnHDGAp6n9AgyuVySRZrGvROxRgIfLXhzjrNYnNBUxNX/dMgRWT1mt4XLDovaApD53E9W3ilNX5M55LJHpRtIsgAvciR4WWcgK2Dvb1YqgXevmF8z2zEBTcKG39EfSKsT9EbhVUaI2FZO+oZIqImxol6j66/hcAu4sSN4vc1ZPoKeoE6RGhYL2YYA+ymOSSi0Z0wWntbtkGUWCvfSDXIxONraZ/FY90KUfNTpfC5spnNLgxoYNnR9RO4F8ofXEHOgogCQE99w+fF2Xw+b7O59rEOsyRqGEfpVoaDMQQ1CZrG46bcM6AZ0C/wPqNfHliqejyTySxh9TqQpL+xmbIlkB9SlAAAAABJRU5ErkJggg=="}, +pan:{image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAICSURBVEhLxZbPahNRGMUn/5MpuAiBEAIufQGfzr5E40YptBXajYzudCEuGqS+gGlrFwquDGRTutBdYfydzJ3LzeQmJGZue+Dw/Z17Mnfmu5Pof9Hr9Z61Wq0bWZMKj263O6xWq99wU9lOpzPMKgEhEcRucNOcioOK+0RzBhNvt9tPV4nmVF19+OWhVqt9xXgFXZq+8lCv119UKpUJ7iX2FmvFTKz8RH34YdBsNk8wVtjE4fGYwm8wrrDi3WBG5oKXZGRSS9hGuNFojLTe2lFz5xThWZIktayyiE2FdT3rzXBXz7krKiL8c17wAKFDjCus2AvW+YGZ9y2JF0VFRuMPfI//rsCE/C+s26s4gQu9ul7r4NteKx7H8XOC724xNNGbaNu++IrBqbOV7Tj3FgMRvc/YKOr3+3sE47wgEt/Bl/gaK5cHbNU11vYSXylfpK7XOvjuumPp4Wcoipu30Qsez2uMXYz4lfI+mOmwothY+SLiXJy7mKVpWs3Si0CoOMfeI9Od43Wic+jO+ZVv+crsm9QSNhUW9LXSeoPBYLXopthGuFQgdIxxhY+UDwlt1x5CZ1hX+NTUdt/OIvjKaDSmuOJfaIVNPKX+W18j/PLA2/kR44p5Sd8HbHngT/yTfNRWUXX14ZcL3wmX0+TLf8YO7CGT8yFE5zB3/gney25/OETRP9CtPDFe5jShAAAAAElFTkSuQmCC"}, +zoom:{image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALWSURBVEhLvZZLaBNRFIabyftBIgEfqCCBoCC6MYqiXYiIj4U76U4X7sUHbhQhUBfixhZEUBDB16YuFERaUaQLK7ooCOJj4UKtYEFU0EptShO/A9Ph3js3k8lo/eHnP7n3nP/M3LlzMz1hkUwmNziOcyKRSFyFt+LxeD/c2Wq1Ym7Kv0M2m11Os1OxWGycn1OwZXCGuXfwIhezkd9/jRgNT2L4ldhs1pbkX5OLJe4euVxuGQaPCa3mnUjtJx7BDuKusJTCV6jVVGHTMuYRjxma7yIOhTgFY6jNaAKew2xPKpVay9ganmkvj+M448/MfJdT5K5Gg4HJacRngPFgqVRaRNwW1B4i7yehWfsEDdz1K+A01AoxPIqGAiuwGfkOTY8+1A6u7AyiFTB2Hu0KPIrdiOnzHLWDybeImvy+Wq2mZa5bUHsD0Zpz+KxHdWQymV6kAb1ElqeORgJLvgnRdj1+R1AfzkIvSUjxVjQSarVakrueIPT8+H1F5jSUy+WXiJrUYBVWyVxU4PEU8TzhfaijUqnMIWrjaY492eWRwdKOIqrnIxnXwLLeRLwk2GQzrEMjg0avEbXxkIxr4OoOImpj2QwyFgms1koa/SZUG8s+0iGnEhNfCNXEhzIXBVz0McTzEvJ+70P9oNFtxEzei3aFYrFYxmuSUPWSv9Yi9IMm2xE1We56Mp1OV4nDwqFmBDV9gk9AEh4gZtFHNt8W4kAUCoXF5MorY9Z/kDni9nDv7hc0i2fhgLvTtX8a99PoMPPagTFPxofRzmDJ9yM+AyEmTfgGysYbQcfhDzPPJDmX0c7gDg4gs9BqFIWhm/Nct5H8gtBq1I7UfIbtvmIuoaGQcp+fdpbbSM43eEH5wrwLbXmhm/fU63VHXjcuok7hEByFY/AeHGC8L5/PL3HT5xGH1uYwfPOICGo+CBcU0vwO1BqzUqILDl/z/9VYIMfpddiAc47jDP8BsUpb13wOLRwAAAAASUVORK5CYII="}, +menu:{image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAeCAYAAABE4bxTAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADoSURBVFhH7dc9CsJAFATgRxIIBCwCqZKATX5sbawsY2MvWOtF9AB6AU8gguAJbD2AnZ2VXQT/Ko2TYGCL2OYtYQc+BuYA+1hCtnCVwMm27SGaXpDJIAiCvCkVR05hGOZNN3HkFMdx3nQRR06+76/R1IcFLJlNQEWlmWlBTwJtKLKHynehZqnjOGM0PYWRVXk61C37p7xlZ3Hk5HneCk1dmMH811xGoKLSzDiQwIBZB4ocoPJdqNkDt2yKlueWRVGUtzy3rPwo3sWRU3nLjuLI6OO67oZM00wMw3hrmpZx0XU9syxrR0T0BeMpb9dneSR2AAAAAElFTkSuQmCC"}, +handle:{image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAQCAYAAADESFVDAAAAAXNSR0IArs4c6QAAAAZiS0dEANAAzwDP4Z7KegAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB9sHGw0cMqdt1UwAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAaElEQVQoz+3SsRFAQBCF4Z9WJM8KCDVwownl6YXsTmCUsyKGkZzcl7zkz3YLkypgAnreFmDEpHkIwVOMfpdi9CEEN2nGpFdwD03yEqDtOgCaun7sqSTDH32I1pQA2Pb9sZecAxc5r3IAb21d6878xsAAAAAASUVORK5CYII="}};V.prototype.setOptions=function(k,p){if(ra[this._defaultsKey]){var r=ra[this._defaultsKey],u;for(u in r)"publicProperties"!== +u&&r.hasOwnProperty(u)&&(this[u]=k&&u in k?k[u]:p&&u in p?p[u]:r[u])}else Ja&&window.console&&console.log("defaults not set")};V.prototype.get=function(k){var p=ra[this._defaultsKey];if("options"===k)return this.options&&this.options._isPlaceholder?null:this.options;if(p.hasOwnProperty(k)||p.publicProperties&&p.publicProperties.hasOwnProperty(k))return this[k];window.console&&window.console.log('Property "'+k+"\" doesn't exist. Please check for typo.")};V.prototype.set=function(k,p,r){r="undefined"=== +typeof r?!0:r;var u=ra[this._defaultsKey];if("options"===k)this.createUserOptions(p);else if(u.hasOwnProperty(k)||u.publicProperties&&u.publicProperties.hasOwnProperty(k)&&"readWrite"===u.publicProperties[k])this.options._isPlaceholder&&this.createUserOptions(),this.options[k]=p;else{window.console&&(u.publicProperties&&u.publicProperties.hasOwnProperty(k)&&"readOnly"===u.publicProperties[k]?window.console.log('Property "'+k+'" is read-only.'):window.console.log('Property "'+k+"\" doesn't exist. Please check for typo.")); +return}r&&(this.stockChart||this.chart||this).render()};V.prototype.addTo=function(k,p,r,u){u="undefined"===typeof u?!0:u;var v=ra[this._defaultsKey];v.hasOwnProperty(k)||v.publicProperties&&v.publicProperties.hasOwnProperty(k)&&"readWrite"===v.publicProperties[k]?(this.options._isPlaceholder&&this.createUserOptions(),"undefined"===typeof this.options[k]&&(this.options[k]=[]),k=this.options[k],r="undefined"===typeof r||null===r?k.length:r,k.splice(r,0,p),u&&(this.chart||this).render()):window.console&& +(v.publicProperties&&v.publicProperties.hasOwnProperty(k)&&"readOnly"===v.publicProperties[k]?window.console.log('Property "'+k+'" is read-only.'):window.console.log('Property "'+k+"\" doesn't exist. Please check for typo."))};V.prototype.createUserOptions=function(k){if("undefined"!==typeof k||this.options._isPlaceholder)if(this.parent.options._isPlaceholder&&this.parent.createUserOptions(),this.isOptionsInArray){this.parent.options[this.optionsName]||(this.parent.options[this.optionsName]=[]);var p= +this.parent.options[this.optionsName],r=p.length;this.options._isPlaceholder||(Fa(p),r=p.indexOf(this.options));this.options="undefined"===typeof k?{}:k;p[r]=this.options}else this.options="undefined"===typeof k?{}:k,k=this.parent.options,this.optionsName?p=this.optionsName:(p=this._defaultsKey)&&0!==p.length?(r=p.charAt(0).toLowerCase(),1<p.length&&(r=r.concat(p.slice(1))),p=r):p=void 0,k[p]=this.options};V.prototype.remove=function(k){k="undefined"===typeof k?!0:k;if(this.isOptionsInArray){var p= +this.parent.options[this.optionsName];Fa(p);var r=p.indexOf(this.options);0<=r&&p.splice(r,1)}else delete this.parent.options[this.optionsName];k&&(this.chart||this).render()};V.prototype.updateOption=function(k){!ra[this._defaultsKey]&&(Ja&&window.console)&&console.log("defaults not set");var p=ra[this._defaultsKey],r={},v=this[k],E=this._themeOptionsKey,H=this._index;this.theme&&u(E)&&u(H)?r=u(ya[this.theme])?ya.light1:ya[this.theme]:this.parent&&(this.parent.themeOptions&&this.parent.themeOptions[E])&& +(null===H?r=this.parent.themeOptions[E]:0<this.parent.themeOptions[E].length&&(r=Math.min(this.parent.themeOptions[E].length-1,H),r=this.parent.themeOptions[E][r]));this.themeOptions=r;k in p&&(v=k in this.options?this.options[k]:r&&k in r?r[k]:p[k]);if(v===this[k])return!1;this[k]=v;return!0};V.prototype.trackChanges=function(k){if(!this.sessionVariables)throw"Session Variable Store not set";this.sessionVariables[k]=this.options[k]};V.prototype.isBeingTracked=function(k){this.options._oldOptions|| +(this.options._oldOptions={});return this.options._oldOptions[k]?!0:!1};V.prototype.hasOptionChanged=function(k){if(!this.sessionVariables)throw"Session Variable Store not set";return this.sessionVariables[k]!==this.options[k]};V.prototype.addEventListener=function(k,p,r){k&&p&&(this._eventListeners[k]=this._eventListeners[k]||[],this._eventListeners[k].push({context:r||this,eventHandler:p}))};V.prototype.removeEventListener=function(k,p){if(k&&p&&this._eventListeners[k])for(var r=this._eventListeners[k], +u=0;u<r.length;u++)if(r[u].eventHandler===p){r[u].splice(u,1);break}};V.prototype.removeAllEventListeners=function(){this._eventListeners=[]};V.prototype.dispatchEvent=function(k,p,r){if(k&&this._eventListeners[k]){p=p||{};for(var u=this._eventListeners[k],v=0;v<u.length;v++)u[v].eventHandler.call(u[v].context,p)}"function"===typeof this[k]&&this[k].call(r||this.chart,p)};Ga.prototype.registerSpace=function(k,p){"top"===k?this._topOccupied+=p.height:"bottom"===k?this._bottomOccupied+=p.height:"left"=== +k?this._leftOccupied+=p.width:"right"===k&&(this._rightOccupied+=p.width)};Ga.prototype.unRegisterSpace=function(k,p){"top"===k?this._topOccupied-=p.height:"bottom"===k?this._bottomOccupied-=p.height:"left"===k?this._leftOccupied-=p.width:"right"===k&&(this._rightOccupied-=p.width)};Ga.prototype.getFreeSpace=function(){return{x1:this._x1+this._leftOccupied,y1:this._y1+this._topOccupied,x2:this._x2-this._rightOccupied,y2:this._y2-this._bottomOccupied,width:this._x2-this._x1-this._rightOccupied-this._leftOccupied, +height:this._y2-this._y1-this._bottomOccupied-this._topOccupied}};Ga.prototype.reset=function(){this._rightOccupied=this._leftOccupied=this._bottomOccupied=this._topOccupied=this._padding};qa(ka,V);ka.prototype._initialize=function(){u(this.padding)||"object"!==typeof this.padding?this.topPadding=this.rightPadding=this.bottomPadding=this.leftPadding=Number(this.padding)|0:(this.topPadding=u(this.padding.top)?0:Number(this.padding.top)|0,this.rightPadding=u(this.padding.right)?0:Number(this.padding.right)| +0,this.bottomPadding=u(this.padding.bottom)?0:Number(this.padding.bottom)|0,this.leftPadding=u(this.padding.left)?0:Number(this.padding.left)|0)};ka.prototype.render=function(k){if(0!==this.fontSize){k&&this.ctx.save();var p=this.ctx.font;this.ctx.textBaseline=this.textBaseline;var r=0;this._isDirty&&this.measureText(this.ctx);this.ctx.translate(this.x,this.y+r);"middle"===this.textBaseline&&(r=-this._lineHeight/2);this.ctx.font=this._getFontString();this.ctx.rotate(Math.PI/180*this.angle);var u= +0,v=this.topPadding,H=null;this.ctx.roundRect||Ea(this.ctx);(0<this.borderThickness&&this.borderColor||this.backgroundColor)&&this.ctx.roundRect(0,r,this.width,this.height,this.cornerRadius,this.borderThickness,this.backgroundColor,this.borderColor);this.ctx.fillStyle=this.fontColor;for(r=0;r<this._wrappedText.lines.length;r++)H=this._wrappedText.lines[r],"right"===this.horizontalAlign?u=(this.width-(this.leftPadding+this.rightPadding))/2-H.width/2+this.leftPadding:"left"===this.horizontalAlign?u= +this.leftPadding:"center"===this.horizontalAlign&&(u=(this.width-(this.leftPadding+this.rightPadding))/2-H.width/2+this.leftPadding),this.ctx.fillText(H.text,u,v),v+=H.height;this.ctx.font=p;k&&this.ctx.restore()}};ka.prototype.setText=function(k){this.text=k;this._isDirty=!0;this._wrappedText=null};ka.prototype.measureText=function(){this._lineHeight=Za(this.fontFamily,this.fontSize,this.fontWeight);if(null===this.maxWidth)throw"Please set maxWidth and height for TextBlock";this._wrapText(this.ctx); +this._isDirty=!1;return{width:this.width,height:this.height}};ka.prototype._getLineWithWidth=function(k,p,r){k=String(k);if(!k)return{text:"",width:0};var u=r=0,v=k.length-1,H=Infinity;for(this.ctx.font=this._getFontString();u<=v;){var H=Math.floor((u+v)/2),F=k.substr(0,H+1);r=this.ctx.measureText(F).width;if(r<p)u=H+1;else if(r>p)v=H-1;else break}r>p&&1<F.length&&(F=F.substr(0,F.length-1),r=this.ctx.measureText(F).width);p=!0;if(F.length===k.length||" "===k[F.length])p=!1;p&&(k=F.split(" "),1<k.length&& +k.pop(),F=k.join(" "),r=this.ctx.measureText(F).width);return{text:F,width:r}};ka.prototype._wrapText=function(){var k=new String(Ia(String(this.text))),p=[],r=this.ctx.font,u=0,v=0;this.ctx.font=this._getFontString();if(0===this.frontSize)v=u=0;else for(;0<k.length;){var H=this.maxHeight-(this.topPadding+this.bottomPadding),F=this._getLineWithWidth(k,this.maxWidth-(this.leftPadding+this.rightPadding),!1);F.height=this._lineHeight;p.push(F);var z=v,v=Math.max(v,F.width),u=u+F.height,k=Ia(k.slice(F.text.length, +k.length));H&&u>H&&(F=p.pop(),u-=F.height,v=z)}this._wrappedText={lines:p,width:v,height:u};this.width=v+(this.leftPadding+this.rightPadding);this.height=u+(this.topPadding+this.bottomPadding);this.ctx.font=r};ka.prototype._getFontString=function(){var k;k=""+(this.fontStyle?this.fontStyle+" ":"");k+=this.fontWeight?this.fontWeight+" ":"";k+=this.fontSize?this.fontSize+"px ":"";var p=this.fontFamily?this.fontFamily+"":"";!r&&p&&(p=p.split(",")[0],"'"!==p[0]&&'"'!==p[0]&&(p="'"+p+"'"));return k+=p}; +qa(Va,V);qa(Aa,V);Aa.prototype.setLayout=function(){if(this.text){var k=this.dockInsidePlotArea?this.chart.plotArea:this.chart,p=k.layoutManager.getFreeSpace(),r=p.x1,v=p.y1,E=0,H=0,F=this.chart._menuButton&&this.chart.exportEnabled&&"top"===this.verticalAlign?22:0,z,I;"top"===this.verticalAlign||"bottom"===this.verticalAlign?(null===this.maxWidth&&(this.maxWidth=p.width-4-F*("center"===this.horizontalAlign?2:1)),H=0.5*p.height-this.margin-2,E=0):"center"===this.verticalAlign&&("left"===this.horizontalAlign|| +"right"===this.horizontalAlign?(null===this.maxWidth&&(this.maxWidth=p.height-4),H=0.5*p.width-this.margin-2):"center"===this.horizontalAlign&&(null===this.maxWidth&&(this.maxWidth=p.width-4),H=0.5*p.height-4));var L;u(this.padding)||"number"!==typeof this.padding?u(this.padding)||"object"!==typeof this.padding||(L=this.padding.top?this.padding.top:this.padding.bottom?this.padding.bottom:0,L+=this.padding.bottom?this.padding.bottom:this.padding.top?this.padding.top:0,L*=1.25):L=2.5*this.padding;this.wrap|| +(H=Math.min(H,Math.max(1.5*this.fontSize,this.fontSize+L)));H=new ka(this.ctx,{fontSize:this.fontSize,fontFamily:this.fontFamily,fontColor:this.fontColor,fontStyle:this.fontStyle,fontWeight:this.fontWeight,horizontalAlign:this.horizontalAlign,verticalAlign:this.verticalAlign,borderColor:this.borderColor,borderThickness:this.borderThickness,backgroundColor:this.backgroundColor,maxWidth:this.maxWidth,maxHeight:H,cornerRadius:this.cornerRadius,text:this.text,padding:this.padding,textBaseline:"top"}); +L=H.measureText();"top"===this.verticalAlign||"bottom"===this.verticalAlign?("top"===this.verticalAlign?(v=p.y1+2,I="top"):"bottom"===this.verticalAlign&&(v=p.y2-2-L.height,I="bottom"),"left"===this.horizontalAlign?r=p.x1+2:"center"===this.horizontalAlign?r=p.x1+p.width/2-L.width/2:"right"===this.horizontalAlign&&(r=p.x2-2-L.width-F),z=this.horizontalAlign,this.width=L.width,this.height=L.height):"center"===this.verticalAlign&&("left"===this.horizontalAlign?(r=p.x1+2,v=p.y2-2-(this.maxWidth/2-L.width/ +2),E=-90,I="left",this.width=L.height,this.height=L.width):"right"===this.horizontalAlign?(r=p.x2-2,v=p.y1+2+(this.maxWidth/2-L.width/2),E=90,I="right",this.width=L.height,this.height=L.width):"center"===this.horizontalAlign&&(v=k.y1+(k.height/2-L.height/2),r=k.x1+(k.width/2-L.width/2),I="center",this.width=L.width,this.height=L.height),z="center");H.x=r;H.y=v;H.angle=E;H.horizontalAlign=z;this._textBlock=H;k.layoutManager.registerSpace(I,{width:this.width+("left"===I||"right"===I?this.margin+2:0), +height:this.height+("top"===I||"bottom"===I?this.margin+2:0)});this.bounds={x1:r,y1:v,x2:r+this.width,y2:v+this.height};this.ctx.textBaseline="top"}};Aa.prototype.render=function(){this._textBlock&&this._textBlock.render(!0)};qa(Ka,V);Ka.prototype.setLayout=Aa.prototype.setLayout;Ka.prototype.render=Aa.prototype.render;Wa.prototype.get=function(k,p){var r=null;0<this.pool.length?(r=this.pool.pop(),Oa(r,k,p)):r=ta(k,p);return r};Wa.prototype.release=function(k){this.pool.push(k)};qa(La,V);var Na={addTheme:function(k, +p){ya[k]=p},addColorSet:function(k,p){Ba[k]=p},addCultureInfo:function(k,p){Ma[k]=p},formatNumber:function(k,p,r){r=r||"en";if(Ma[r])return ba(k,p||"#,##0.##",new La(r));throw"Unknown Culture Name";},formatDate:function(k,p,r){r=r||"en";if(Ma[r])return Ca(k,p||"DD MMM YYYY",new La(r));throw"Unknown Culture Name";}};"undefined"!==typeof module&&"undefined"!==typeof module.exports?module.exports=Na:"function"===typeof define&&define.amd?define([],function(){return Na}):window.CanvasJS=Na;Na.Chart=function(){function k(a, +d){return a.x-d.x}function p(a,d){d=d||{};this.theme=u(d.theme)||u(ya[d.theme])?"light1":d.theme;p.base.constructor.call(this,"Chart",null,d,null,null);var b=this;this._containerId=a;this._objectsInitialized=!1;this.overlaidCanvasCtx=this.ctx=null;this._indexLabels=[];this._panTimerId=0;this._lastTouchEventType="";this._lastTouchData=null;this.isAnimating=!1;this.renderCount=0;this.disableToolTip=this.animatedRender=!1;this.canvasPool=new Wa;this.allDOMEventHandlers=[];this.panEnabled=!1;this._defaultCursor= +"default";this.plotArea={canvas:null,ctx:null,x1:0,y1:0,x2:0,y2:0,width:0,height:0};this._dataInRenderedOrder=[];if(this.container="string"===typeof this._containerId?document.getElementById(this._containerId):this._containerId){this.container.innerHTML="";var c=0,e=0,c=this.options.width?this.width:0<this.container.clientWidth?this.container.clientWidth:this.width,e=this.options.height?this.height:0<this.container.clientHeight?this.container.clientHeight:this.height;this.width=c;this.height=e;this.x1= +this.y1=0;this.x2=this.width;this.y2=this.height;this._selectedColorSet="undefined"!==typeof Ba[this.colorSet]?Ba[this.colorSet]:Ba.colorSet1;this._canvasJSContainer=document.createElement("div");this._canvasJSContainer.setAttribute("class","canvasjs-chart-container");this._canvasJSContainer.style.position="relative";this._canvasJSContainer.style.textAlign="left";this._canvasJSContainer.style.cursor="auto";r||(this._canvasJSContainer.style.height="0px");this.container.appendChild(this._canvasJSContainer); +this.canvas=ta(c,e);this._preRenderCanvas=ta(c,e);this.canvas.style.position="absolute";this.canvas.style.WebkitUserSelect="none";this.canvas.style.MozUserSelect="none";this.canvas.style.msUserSelect="none";this.canvas.style.userSelect="none";this.canvas.getContext&&(this._canvasJSContainer.appendChild(this.canvas),this.ctx=this.canvas.getContext("2d"),this.ctx.textBaseline="top",Ea(this.ctx),this._preRenderCtx=this._preRenderCanvas.getContext("2d"),this._preRenderCtx.textBaseline="top",Ea(this._preRenderCtx), +r?this.plotArea.ctx=this.ctx:(this.plotArea.canvas=ta(c,e),this.plotArea.canvas.style.position="absolute",this.plotArea.canvas.setAttribute("class","plotAreaCanvas"),this._canvasJSContainer.appendChild(this.plotArea.canvas),this.plotArea.ctx=this.plotArea.canvas.getContext("2d")),this.overlaidCanvas=ta(c,e),this.overlaidCanvas.style.position="absolute",this.overlaidCanvas.style.webkitTapHighlightColor="transparent",this.overlaidCanvas.style.WebkitUserSelect="none",this.overlaidCanvas.style.MozUserSelect= +"none",this.overlaidCanvas.style.msUserSelect="none",this.overlaidCanvas.style.userSelect="none",this.overlaidCanvas.getContext&&(this._canvasJSContainer.appendChild(this.overlaidCanvas),this.overlaidCanvasCtx=this.overlaidCanvas.getContext("2d"),this.overlaidCanvasCtx.textBaseline="top",Ea(this.overlaidCanvasCtx)),this._eventManager=new ha(this),this.windowResizeHandler=O(window,"resize",function(){b._updateSize()&&b.render()},this.allDOMEventHandlers),this._toolBar=document.createElement("div"), +this._toolBar.setAttribute("class","canvasjs-chart-toolbar"),this._toolBar.style.cssText="position: absolute; right: 1px; top: 1px;",this._canvasJSContainer.appendChild(this._toolBar),this.bounds={x1:0,y1:0,x2:this.width,y2:this.height},O(this.overlaidCanvas,"click",function(a){b._mouseEventHandler(a)},this.allDOMEventHandlers),O(this.overlaidCanvas,"mousemove",function(a){b._mouseEventHandler(a)},this.allDOMEventHandlers),O(this.overlaidCanvas,"mouseup",function(a){b._mouseEventHandler(a)},this.allDOMEventHandlers), +O(this.overlaidCanvas,"mousedown",function(a){b._mouseEventHandler(a);va(b._dropdownMenu)},this.allDOMEventHandlers),O(this.overlaidCanvas,"mouseout",function(a){b._mouseEventHandler(a)},this.allDOMEventHandlers),O(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerDown":"touchstart",function(a){b._touchEventHandler(a)},this.allDOMEventHandlers),O(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerMove":"touchmove",function(a){b._touchEventHandler(a)},this.allDOMEventHandlers), +O(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerUp":"touchend",function(a){b._touchEventHandler(a)},this.allDOMEventHandlers),O(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerCancel":"touchcancel",function(a){b._touchEventHandler(a)},this.allDOMEventHandlers),this.toolTip=new $(this,this.options.toolTip),this.data=null,this.axisX=[],this.axisX2=[],this.axisY=[],this.axisY2=[],this.sessionVariables={axisX:[],axisX2:[],axisY:[],axisY2:[]})}else window.console&&window.console.log('CanvasJS Error: Chart Container with id "'+ +this._containerId+'" was not found')}function v(a,d){for(var b=[],c,e=0;e<a.length;e++)if(0==e)b.push(a[0]);else{var g,m,l;l=e-1;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[m].x-a[l].x?0.01:a[m].x-a[l].x))*(d-1)/2+1;var w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0<w||a[l].x<a[g].x&&0>w?{x:a[l].x+w/3,y:a[l].y+c/3}:{x:a[l].x,y:a[l].y+c/9};l=e;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[l].x-a[g].x?0.01:a[l].x-a[g].x))*(d- +1)/2+1;w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0<w||a[l].x<a[g].x&&0>w?{x:a[l].x-w/3,y:a[l].y-c/3}:{x:a[l].x,y:a[l].y-c/9};b[b.length]=a[e]}return b}function E(a,d,b,c,e,g,m,l,w,h){var s=0;h?(m.color=g,l.color=g):h=1;s=w?Math.abs(e-b):Math.abs(c-d);s=0<m.trimLength?Math.abs(s*m.trimLength/100):Math.abs(s-m.length);w?(b+=s/2,e-=s/2):(d+=s/2,c-=s/2);var s=1===Math.round(m.thickness)%2?0.5:0,q=1===Math.round(l.thickness)%2?0.5:0;a.save();a.globalAlpha=h;a.strokeStyle=l.color|| +g;a.lineWidth=l.thickness||2;a.setLineDash&&a.setLineDash(R(l.dashType,l.thickness));a.beginPath();w&&0<l.thickness?(a.moveTo(c-m.thickness/2,Math.round((b+e)/2)-q),a.lineTo(d+m.thickness/2,Math.round((b+e)/2)-q)):0<l.thickness&&(a.moveTo(Math.round((d+c)/2)-q,b+m.thickness/2),a.lineTo(Math.round((d+c)/2)-q,e-m.thickness/2));a.stroke();a.strokeStyle=m.color||g;a.lineWidth=m.thickness||2;a.setLineDash&&a.setLineDash(R(m.dashType,m.thickness));a.beginPath();w&&0<m.thickness?(a.moveTo(c-s,b),a.lineTo(c- +s,e),a.moveTo(d+s,b),a.lineTo(d+s,e)):0<m.thickness&&(a.moveTo(d,b+s),a.lineTo(c,b+s),a.moveTo(d,e-s),a.lineTo(c,e-s));a.stroke();a.restore()}function I(a,d,b,c,e){if(null===a||"undefined"===typeof a)return"undefined"===typeof b?d:b;a=parseFloat(a.toString())*(0<=a.toString().indexOf("%")?d/100:1);"undefined"!==typeof c&&(a=Math.min(c,a),"undefined"!==typeof e&&(a=Math.max(e,a)));return!isNaN(a)&&a<=d&&0<=a?a:"undefined"===typeof b?d:b}function H(a,d){H.base.constructor.call(this,"Legend","legend", +d,null,a);this.chart=a;this.canvas=a.canvas;this.ctx=this.chart.ctx;this.ghostCtx=this.chart._eventManager.ghostCtx;this.items=[];this.optionsName="legend";this.height=this.width=0;this.orientation=null;this.dataSeries=[];this.bounds={x1:null,y1:null,x2:null,y2:null};"undefined"===typeof this.options.fontSize&&(this.fontSize=this.chart.getAutoFontSize(this.fontSize));this.lineHeight=Za(this.fontFamily,this.fontSize,this.fontWeight);this.horizontalSpacing=this.fontSize}function F(a,d,b,c){F.base.constructor.call(this, +"DataSeries","data",d,b,a);this.chart=a;this.canvas=a.canvas;this._ctx=a.canvas.ctx;this.index=b;this.noDataPointsInPlotArea=0;this.id=c;this.chart._eventManager.objectMap[c]={id:c,objectType:"dataSeries",dataSeriesIndex:b};a=d.dataPoints?d.dataPoints.length:0;this.dataPointEOs=[];for(d=0;d<a;d++)this.dataPointEOs[d]={};this.dataPointIds=[];this.plotUnit=[];this.axisY=this.axisX=null;this.optionsName="data";this.isOptionsInArray=!0;null===this.fillOpacity&&(this.type.match(/area/i)?this.fillOpacity= +0.7:this.fillOpacity=1);this.axisPlacement=this.getDefaultAxisPlacement();"undefined"===typeof this.options.indexLabelFontSize&&(this.indexLabelFontSize=this.chart.getAutoFontSize(this.indexLabelFontSize))}function z(a,d,b,c,e,g){z.base.constructor.call(this,"Axis",d,b,c,a);this.chart=a;this.canvas=a.canvas;this.ctx=a.ctx;this.intervalStartPosition=this.maxHeight=this.maxWidth=0;this.labels=[];this.dataSeries=[];this._stripLineLabels=this._ticks=this._labels=null;this.dataInfo={min:Infinity,max:-Infinity, +viewPortMin:Infinity,viewPortMax:-Infinity,minDiff:Infinity};this.isOptionsInArray=!0;"axisX"===e?("left"===g||"bottom"===g?(this.optionsName="axisX",u(this.chart.sessionVariables.axisX[c])&&(this.chart.sessionVariables.axisX[c]={}),this.sessionVariables=this.chart.sessionVariables.axisX[c]):(this.optionsName="axisX2",u(this.chart.sessionVariables.axisX2[c])&&(this.chart.sessionVariables.axisX2[c]={}),this.sessionVariables=this.chart.sessionVariables.axisX2[c]),this.options.interval||(this.intervalType= +null)):"left"===g||"bottom"===g?(this.optionsName="axisY",u(this.chart.sessionVariables.axisY[c])&&(this.chart.sessionVariables.axisY[c]={}),this.sessionVariables=this.chart.sessionVariables.axisY[c]):(this.optionsName="axisY2",u(this.chart.sessionVariables.axisY2[c])&&(this.chart.sessionVariables.axisY2[c]={}),this.sessionVariables=this.chart.sessionVariables.axisY2[c]);"undefined"===typeof this.options.titleFontSize&&(this.titleFontSize=this.chart.getAutoFontSize(this.titleFontSize));"undefined"=== +typeof this.options.labelFontSize&&(this.labelFontSize=this.chart.getAutoFontSize(this.labelFontSize));this.type=e;"axisX"!==e||b&&"undefined"!==typeof b.gridThickness||(this.gridThickness=0);this._position=g;this.lineCoordinates={x1:null,y1:null,x2:null,y2:null,width:null};this.labelAngle=(this.labelAngle%360+360)%360;90<this.labelAngle&&270>this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360);this.options.scaleBreaks&&(this.scaleBreaks=new Q(this.chart, +this.options.scaleBreaks,++this.chart._eventManager.lastObjectId,this));this.stripLines=[];if(this.options.stripLines&&0<this.options.stripLines.length)for(a=0;a<this.options.stripLines.length;a++)this.stripLines.push(new X(this.chart,this.options.stripLines[a],a,++this.chart._eventManager.lastObjectId,this));this.options.crosshair&&(this.crosshair=new fa(this.chart,this.options.crosshair,this));this._titleTextBlock=null;this.hasOptionChanged("viewportMinimum")&&null===this.viewportMinimum&&(this.options.viewportMinimum= +void 0,this.sessionVariables.viewportMinimum=null);this.hasOptionChanged("viewportMinimum")||isNaN(this.sessionVariables.newViewportMinimum)||null===this.sessionVariables.newViewportMinimum?this.sessionVariables.newViewportMinimum=null:this.viewportMinimum=this.sessionVariables.newViewportMinimum;this.hasOptionChanged("viewportMaximum")&&null===this.viewportMaximum&&(this.options.viewportMaximum=void 0,this.sessionVariables.viewportMaximum=null);this.hasOptionChanged("viewportMaximum")||isNaN(this.sessionVariables.newViewportMaximum)|| +null===this.sessionVariables.newViewportMaximum?this.sessionVariables.newViewportMaximum=null:this.viewportMaximum=this.sessionVariables.newViewportMaximum;null!==this.minimum&&null!==this.viewportMinimum&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));null!==this.maximum&&null!==this.viewportMaximum&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.trackChanges("viewportMinimum");this.trackChanges("viewportMaximum")}function Q(a,d,b,c){Q.base.constructor.call(this, +"ScaleBreaks","scaleBreaks",d,null,c);this.id=b;this.chart=a;this.ctx=this.chart.ctx;this.axis=c;this.optionsName="scaleBreaks";this.isOptionsInArray=!1;this._appliedBreaks=[];this.customBreaks=[];this.autoBreaks=[];"string"===typeof this.spacing?(this.spacing=parseFloat(this.spacing),this.spacing=isNaN(this.spacing)?8:(10<this.spacing?10:this.spacing)+"%"):"number"!==typeof this.spacing&&(this.spacing=8);this.autoCalculate&&(this.maxNumberOfAutoBreaks=Math.min(this.maxNumberOfAutoBreaks,5));if(this.options.customBreaks&& +0<this.options.customBreaks.length){for(a=0;a<this.options.customBreaks.length;a++)this.customBreaks.push(new L(this.chart,"customBreaks",this.options.customBreaks[a],a,++this.chart._eventManager.lastObjectId,this)),"number"===typeof this.customBreaks[a].startValue&&("number"===typeof this.customBreaks[a].endValue&&this.customBreaks[a].endValue!==this.customBreaks[a].startValue)&&this._appliedBreaks.push(this.customBreaks[a]);this._appliedBreaks.sort(function(a,c){return a.startValue-c.startValue}); +for(a=0;a<this._appliedBreaks.length-1;a++)this._appliedBreaks[a].endValue>=this._appliedBreaks[a+1].startValue&&(this._appliedBreaks[a].endValue=Math.max(this._appliedBreaks[a].endValue,this._appliedBreaks[a+1].endValue),window.console&&window.console.log("CanvasJS Error: Breaks "+a+" and "+(a+1)+" are overlapping."),this._appliedBreaks.splice(a,2),a--)}}function L(a,d,b,c,e,g){L.base.constructor.call(this,"Break",d,b,c,g);this.id=e;this.chart=a;this.ctx=this.chart.ctx;this.scaleBreaks=g;this.optionsName= +d;this.isOptionsInArray=!0;this.type=b.type?this.type:g.type;this.fillOpacity=u(b.fillOpacity)?g.fillOpacity:this.fillOpacity;this.lineThickness=u(b.lineThickness)?g.lineThickness:this.lineThickness;this.color=b.color?this.color:g.color;this.lineColor=b.lineColor?this.lineColor:g.lineColor;this.lineDashType=b.lineDashType?this.lineDashType:g.lineDashType;!u(this.startValue)&&this.startValue.getTime&&(this.startValue=this.startValue.getTime());!u(this.endValue)&&this.endValue.getTime&&(this.endValue= +this.endValue.getTime());"number"===typeof this.startValue&&("number"===typeof this.endValue&&this.endValue<this.startValue)&&(a=this.startValue,this.startValue=this.endValue,this.endValue=a);this.spacing="undefined"===typeof b.spacing?g.spacing:b.spacing;"string"===typeof this.options.spacing?(this.spacing=parseFloat(this.spacing),this.spacing=isNaN(this.spacing)?0:(10<this.spacing?10:this.spacing)+"%"):"number"!==typeof this.options.spacing&&(this.spacing=g.spacing);this.size=g.parent.logarithmic? +1:0}function X(a,d,b,c,e){X.base.constructor.call(this,"StripLine","stripLines",d,b,e);this.id=c;this.chart=a;this.ctx=this.chart.ctx;this.label=this.label;this.axis=e;this.optionsName="stripLines";this.isOptionsInArray=!0;this._thicknessType="pixel";null!==this.startValue&&null!==this.endValue&&(this.value=e.logarithmic?Math.sqrt((this.startValue.getTime?this.startValue.getTime():this.startValue)*(this.endValue.getTime?this.endValue.getTime():this.endValue)):((this.startValue.getTime?this.startValue.getTime(): +this.startValue)+(this.endValue.getTime?this.endValue.getTime():this.endValue))/2,this._thicknessType=null)}function fa(a,d,b){fa.base.constructor.call(this,"Crosshair","crosshair",d,null,b);this.chart=a;this.ctx=this.chart.ctx;this.axis=b;this.optionsName="crosshair";this._thicknessType="pixel"}function $(a,d){$.base.constructor.call(this,"ToolTip","toolTip",d,null,a);this.chart=a;this.canvas=a.canvas;this.ctx=this.chart.ctx;this.currentDataPointIndex=this.currentSeriesIndex=-1;this._prevY=this._prevX= +NaN;this.containerTransitionDuration=0.1;this.mozContainerTransition=this.getContainerTransition(this.containerTransitionDuration);this.optionsName="toolTip";this._initialize()}function ha(a){this.chart=a;this.lastObjectId=0;this.objectMap=[];this.rectangularRegionEventSubscriptions=[];this.previousDataPointEventObject=null;this.ghostCanvas=ta(this.chart.width,this.chart.height);this.ghostCtx=this.ghostCanvas.getContext("2d");this.mouseoveredObjectMaps=[]}function ga(a){this.chart=a;this.ctx=this.chart.plotArea.ctx; +this.animations=[];this.animationRequestId=null}qa(p,V);p.prototype.destroy=function(){var a=this.allDOMEventHandlers;this._animator&&this._animator.cancelAllAnimations();this._panTimerId&&clearTimeout(this._panTimerId);for(var d=0;d<a.length;d++){var b=a[d][0],c=a[d][1],e=a[d][2],g=a[d][3],g=g||!1;b.removeEventListener?b.removeEventListener(c,e,g):b.detachEvent&&b.detachEvent("on"+c,e)}this.allDOMEventHandlers=[];for(this.removeAllEventListeners();this._canvasJSContainer&&this._canvasJSContainer.hasChildNodes();)this._canvasJSContainer.removeChild(this._canvasJSContainer.lastChild); +for(;this.container&&this.container.hasChildNodes();)this.container.removeChild(this.container.lastChild);for(;this._dropdownMenu&&this._dropdownMenu.hasChildNodes();)this._dropdownMenu.removeChild(this._dropdownMenu.lastChild);this.overlaidCanvas=this.canvas=this.container=this._canvasJSContainer=null;this._toolBar=this._dropdownMenu=this._menuButton=this._resetButton=this._zoomButton=this._breaksCanvas=this._preRenderCanvas=this.toolTip.container=null};p.prototype._updateOptions=function(){var a= +this;this.updateOption("width");this.updateOption("height");this.updateOption("dataPointWidth");this.updateOption("dataPointMinWidth");this.updateOption("dataPointMaxWidth");this.updateOption("interactivityEnabled");this.updateOption("theme");this.updateOption("colorSet")&&(this._selectedColorSet="undefined"!==typeof Ba[this.colorSet]?Ba[this.colorSet]:Ba.colorSet1);this.updateOption("backgroundColor");this.backgroundColor||(this.backgroundColor="rgba(0,0,0,0)");this.updateOption("culture");this._cultureInfo= +new La(this.options.culture);this.updateOption("animationEnabled");this.animationEnabled=this.animationEnabled&&r;this.updateOption("animationDuration");this.updateOption("rangeChanging");this.updateOption("rangeChanged");this.updateOption("exportEnabled");this.updateOption("exportFileName");this.updateOption("zoomType");if(this.options.zoomEnabled){if(!this._zoomButton){var d=!1;va(this._zoomButton=document.createElement("button"));ua(this,this._zoomButton,"pan");this._toolBar.appendChild(this._zoomButton); +this._zoomButton.style.borderRight=this.toolbar.borderThickness+"px solid "+this.toolbar.borderColor;O(this._zoomButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(this._zoomButton,"click",function(){a.zoomEnabled?(a.zoomEnabled=!1,a.panEnabled=!0,ua(a,a._zoomButton,"zoom")):(a.zoomEnabled=!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"));a.render()},this.allDOMEventHandlers);O(this._zoomButton,"mouseover",function(){d?d=!1:(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColorOnHover, +color:a.toolbar.fontColorOnHover,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers);O(this._zoomButton,"mouseout",function(){d||(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(0%)", +filter:"invert(0%)"}))},this.allDOMEventHandlers)}this._resetButton||(d=!1,va(this._resetButton=document.createElement("button")),ua(this,this._resetButton,"reset"),this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor,this._toolBar.appendChild(this._resetButton),O(this._resetButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._resetButton,"click",function(){a.toolTip.hide();a.zoomEnabled||a.panEnabled?(a.zoomEnabled= +!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"),a._defaultCursor="default",a.overlaidCanvas.style.cursor=a._defaultCursor):(a.zoomEnabled=!1,a.panEnabled=!1);if(a.sessionVariables.axisX)for(var c=0;c<a.sessionVariables.axisX.length;c++)a.sessionVariables.axisX[c].newViewportMinimum=null,a.sessionVariables.axisX[c].newViewportMaximum=null;if(a.sessionVariables.axisX2)for(c=0;c<a.sessionVariables.axisX2.length;c++)a.sessionVariables.axisX2[c].newViewportMinimum=null,a.sessionVariables.axisX2[c].newViewportMaximum= +null;if(a.sessionVariables.axisY)for(c=0;c<a.sessionVariables.axisY.length;c++)a.sessionVariables.axisY[c].newViewportMinimum=null,a.sessionVariables.axisY[c].newViewportMaximum=null;if(a.sessionVariables.axisY2)for(c=0;c<a.sessionVariables.axisY2.length;c++)a.sessionVariables.axisY2[c].newViewportMinimum=null,a.sessionVariables.axisY2[c].newViewportMaximum=null;a.resetOverlayedCanvas();va(a._zoomButton,a._resetButton);a._dispatchRangeEvent("rangeChanging","reset");a.render();a._dispatchRangeEvent("rangeChanged", +"reset");a.syncCharts&&a.syncCharts(null,null)},this.allDOMEventHandlers),O(this._resetButton,"mouseover",function(){d||(sa(a,a._resetButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.hoverFfontColorOnHoverontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers),O(this._resetButton,"mouseout",function(){d||(sa(a,a._resetButton, +{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers),this.overlaidCanvas.style.cursor=a._defaultCursor);this.zoomEnabled||this.panEnabled||(this._zoomButton?(a._zoomButton.getAttribute("state")===a._cultureInfo.zoomText?(this.panEnabled=!0,this.zoomEnabled=!1):(this.zoomEnabled=!0,this.panEnabled= +!1),Qa(a._zoomButton,a._resetButton)):(this.zoomEnabled=!0,this.panEnabled=!1))}else this.panEnabled=this.zoomEnabled=!1;this._menuButton?this.exportEnabled?Qa(this._menuButton):va(this._menuButton):this.exportEnabled&&r&&(d=!1,this._menuButton=document.createElement("button"),ua(this,this._menuButton,"menu"),this._toolBar.appendChild(this._menuButton),O(this._menuButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._menuButton,"click",function(){"none"!==a._dropdownMenu.style.display|| +a._dropDownCloseTime&&500>=(new Date).getTime()-a._dropDownCloseTime.getTime()||(a._dropdownMenu.style.display="block",a._menuButton.blur(),a._dropdownMenu.focus())},this.allDOMEventHandlers,!0),O(this._menuButton,"mouseover",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.fontColorOnHover}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers,!0), +O(this._menuButton,"mouseout",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers,!0));if(!this._dropdownMenu&&this.exportEnabled&&r){d=!1;this._dropdownMenu=document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);var b=-1!==this.theme.indexOf("dark")?"black":"#888888";this._dropdownMenu.style.cssText= +"position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 0px;top: 25px;min-width: 120px;outline: 0;font-size: 14px; font-family: Arial, Helvetica, sans-serif;padding: 5px 0px 5px 0px;text-align: left;line-height: 10px;background-color:"+this.toolbar.backgroundColor+";box-shadow: 2px 2px 10px "+b;a._dropdownMenu.style.display="none";this._toolBar.appendChild(this._dropdownMenu);O(this._dropdownMenu,"blur",function(){va(a._dropdownMenu); +a._dropDownCloseTime=new Date},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.printText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers, +!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){a.print();va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.saveJPGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d= +!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"jpeg",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText= +"padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.savePNGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor, +this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"png",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0)}"none"!==this._toolBar.style.display&&this._zoomButton&&(this.panEnabled?ua(a,a._zoomButton,"zoom"):ua(a,a._zoomButton,"pan"),a._resetButton.getAttribute("state")!==a._cultureInfo.resetText&&ua(a,a._resetButton,"reset"));this.options.toolTip&&this.toolTip.options!==this.options.toolTip&&(this.toolTip.options=this.options.toolTip); +for(var c in this.toolTip.options)this.toolTip.options.hasOwnProperty(c)&&this.toolTip.updateOption(c)};p.prototype._updateSize=function(){var a;a=[this.canvas,this._preRenderCanvas,this.overlaidCanvas,this._eventManager.ghostCanvas];var d=0,b=0;this.options.width?d=this.width:this.width=d=0<this.container.clientWidth?this.container.clientWidth:this.width;this.options.height?b=this.height:this.height=b=0<this.container.clientHeight?this.container.clientHeight:this.height;if(this.canvas.width!==d* +W||this.canvas.height!==b*W){for(var c=0;c<a.length;c++)Oa(a[c],d,b);a=!0}else a=!1;return a};p.prototype._initialize=function(){this.isNavigator=u(this.parent)||u(this.parent._defaultsKey)||"Navigator"!==this.parent._defaultsKey?!1:!0;this.toolbar=new Va(this,this.options.toolbar);this._animator?this._animator.cancelAllAnimations():this._animator=new ga(this);this.removeAllEventListeners();this.disableToolTip=!1;this._axes=[];this.funnelPyramidClickHandler=this.pieDoughnutClickHandler=null;this._updateOptions(); +this.animatedRender=r&&this.animationEnabled&&0===this.renderCount;this._updateSize();this.clearCanvas();this.ctx.beginPath();this.axisX=[];this.axisX2=[];this.axisY=[];this.axisY2=[];this._indexLabels=[];this._dataInRenderedOrder=[];this._events=[];this._eventManager&&this._eventManager.reset();this.plotInfo={axisPlacement:null,plotTypes:[]};this.layoutManager=new Ga(0,0,this.width,this.height,this.isNavigator?0:2);this.plotArea.layoutManager&&this.plotArea.layoutManager.reset();this.data=[];var a= +0,d=null;if(this.options.data){for(var b=0;b<this.options.data.length;b++)if(a++,!this.options.data[b].type||0<=p._supportedChartTypes.indexOf(this.options.data[b].type)){var c=new F(this,this.options.data[b],a-1,++this._eventManager.lastObjectId);"error"===c.type&&(c.linkedDataSeriesIndex=u(this.options.data[b].linkedDataSeriesIndex)?b-1:this.options.data[b].linkedDataSeriesIndex,0>c.linkedDataSeriesIndex||c.linkedDataSeriesIndex>=this.options.data.length||"number"!==typeof c.linkedDataSeriesIndex|| +"error"===this.options.data[c.linkedDataSeriesIndex].type)&&(c.linkedDataSeriesIndex=null);null===c.name&&(c.name="DataSeries "+a);null===c.color?1<this.options.data.length?(c._colorSet=[this._selectedColorSet[c.index%this._selectedColorSet.length]],c.color=this._selectedColorSet[c.index%this._selectedColorSet.length]):c._colorSet="line"===c.type||"stepLine"===c.type||"spline"===c.type||"area"===c.type||"stepArea"===c.type||"splineArea"===c.type||"stackedArea"===c.type||"stackedArea100"===c.type|| +"rangeArea"===c.type||"rangeSplineArea"===c.type||"candlestick"===c.type||"ohlc"===c.type||"waterfall"===c.type||"boxAndWhisker"===c.type?[this._selectedColorSet[0]]:this._selectedColorSet:c._colorSet=[c.color];null===c.markerSize&&(("line"===c.type||"stepLine"===c.type||"spline"===c.type||0<=c.type.toLowerCase().indexOf("area"))&&c.dataPoints&&c.dataPoints.length<this.width/16||"scatter"===c.type)&&(c.markerSize=8);"bubble"!==c.type&&"scatter"!==c.type||!c.dataPoints||(c.dataPoints.some?c.dataPoints.some(function(a){return a.x})&& +c.dataPoints.sort(k):c.dataPoints.sort(k));this.data.push(c);var e=c.axisPlacement,d=d||e,g;"normal"===e?"xySwapped"===this.plotInfo.axisPlacement?g='You cannot combine "'+c.type+'" with bar chart':"none"===this.plotInfo.axisPlacement?g='You cannot combine "'+c.type+'" with pie chart':null===this.plotInfo.axisPlacement&&(this.plotInfo.axisPlacement="normal"):"xySwapped"===e?"normal"===this.plotInfo.axisPlacement?g='You cannot combine "'+c.type+'" with line, area, column or pie chart':"none"===this.plotInfo.axisPlacement? +g='You cannot combine "'+c.type+'" with pie chart':null===this.plotInfo.axisPlacement&&(this.plotInfo.axisPlacement="xySwapped"):"none"===e?"normal"===this.plotInfo.axisPlacement?g='You cannot combine "'+c.type+'" with line, area, column or bar chart':"xySwapped"===this.plotInfo.axisPlacement?g='You cannot combine "'+c.type+'" with bar chart':null===this.plotInfo.axisPlacement&&(this.plotInfo.axisPlacement="none"):null===e&&"none"===this.plotInfo.axisPlacement&&(g='You cannot combine "'+c.type+'" with pie chart'); +if(g&&window.console){window.console.log(g);return}}for(b=0;b<this.data.length;b++){if("none"==d&&"error"===this.data[b].type&&window.console){window.console.log('You cannot combine "'+c.type+'" with error chart');return}"error"===this.data[b].type&&(this.data[b].axisPlacement=this.plotInfo.axisPlacement=d||"normal",this.data[b]._linkedSeries=null===this.data[b].linkedDataSeriesIndex?null:this.data[this.data[b].linkedDataSeriesIndex])}}this._objectsInitialized=!0;this._plotAreaElements=[]};p._supportedChartTypes= +Fa("line stepLine spline column area stepArea splineArea bar bubble scatter stackedColumn stackedColumn100 stackedBar stackedBar100 stackedArea stackedArea100 candlestick ohlc boxAndWhisker rangeColumn error rangeBar rangeArea rangeSplineArea pie doughnut funnel pyramid waterfall".split(" "));p.prototype.setLayout=function(){for(var a=this._plotAreaElements,d=0;d<this.data.length;d++)if("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement){if(!this.data[d].axisYType|| +"primary"===this.data[d].axisYType)if(this.options.axisY&&0<this.options.axisY.length){if(!this.axisY.length)for(var b=0;b<this.options.axisY.length;b++)"normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisY[b]=new z(this,"axisY",this.options.axisY[b],b,"axisY","left")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisY[b]=new z(this,"axisY",this.options.axisY[b],b,"axisY","bottom"));this.data[d].axisY=this.axisY[0<=this.data[d].axisYIndex&&this.data[d].axisYIndex<this.axisY.length? +this.data[d].axisYIndex:0];this.axisY[0<=this.data[d].axisYIndex&&this.data[d].axisYIndex<this.axisY.length?this.data[d].axisYIndex:0].dataSeries.push(this.data[d])}else this.axisY.length||("normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisY[0]=new z(this,"axisY",this.options.axisY,0,"axisY","left")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisY[0]=new z(this,"axisY",this.options.axisY,0,"axisY","bottom"))),this.data[d].axisY=this.axisY[0],this.axisY[0].dataSeries.push(this.data[d]); +if("secondary"===this.data[d].axisYType)if(this.options.axisY2&&0<this.options.axisY2.length){if(!this.axisY2.length)for(b=0;b<this.options.axisY2.length;b++)"normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisY2[b]=new z(this,"axisY2",this.options.axisY2[b],b,"axisY","right")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisY2[b]=new z(this,"axisY2",this.options.axisY2[b],b,"axisY","top"));this.data[d].axisY=this.axisY2[0<=this.data[d].axisYIndex&&this.data[d].axisYIndex< +this.axisY2.length?this.data[d].axisYIndex:0];this.axisY2[0<=this.data[d].axisYIndex&&this.data[d].axisYIndex<this.axisY2.length?this.data[d].axisYIndex:0].dataSeries.push(this.data[d])}else this.axisY2.length||("normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisY2[0]=new z(this,"axisY2",this.options.axisY2,0,"axisY","right")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisY2[0]=new z(this,"axisY2",this.options.axisY2,0,"axisY","top"))),this.data[d].axisY=this.axisY2[0], +this.axisY2[0].dataSeries.push(this.data[d]);if(!this.data[d].axisXType||"primary"===this.data[d].axisXType)if(this.options.axisX&&0<this.options.axisX.length){if(!this.axisX.length)for(b=0;b<this.options.axisX.length;b++)"normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisX[b]=new z(this,"axisX",this.options.axisX[b],b,"axisX","bottom")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisX[b]=new z(this,"axisX",this.options.axisX[b],b,"axisX","left"));this.data[d].axisX= +this.axisX[0<=this.data[d].axisXIndex&&this.data[d].axisXIndex<this.axisX.length?this.data[d].axisXIndex:0];this.axisX[0<=this.data[d].axisXIndex&&this.data[d].axisXIndex<this.axisX.length?this.data[d].axisXIndex:0].dataSeries.push(this.data[d])}else this.axisX.length||("normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisX[0]=new z(this,"axisX",this.options.axisX,0,"axisX","bottom")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisX[0]=new z(this,"axisX",this.options.axisX, +0,"axisX","left"))),this.data[d].axisX=this.axisX[0],this.axisX[0].dataSeries.push(this.data[d]);if("secondary"===this.data[d].axisXType)if(this.options.axisX2&&0<this.options.axisX2.length){if(!this.axisX2.length)for(b=0;b<this.options.axisX2.length;b++)"normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisX2[b]=new z(this,"axisX2",this.options.axisX2[b],b,"axisX","top")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisX2[b]=new z(this,"axisX2",this.options.axisX2[b], +b,"axisX","right"));this.data[d].axisX=this.axisX2[0<=this.data[d].axisXIndex&&this.data[d].axisXIndex<this.axisX2.length?this.data[d].axisXIndex:0];this.axisX2[0<=this.data[d].axisXIndex&&this.data[d].axisXIndex<this.axisX2.length?this.data[d].axisXIndex:0].dataSeries.push(this.data[d])}else this.axisX2.length||("normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisX2[0]=new z(this,"axisX2",this.options.axisX2,0,"axisX","top")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisX2[0]= +new z(this,"axisX2",this.options.axisX2,0,"axisX","right"))),this.data[d].axisX=this.axisX2[0],this.axisX2[0].dataSeries.push(this.data[d])}if(this.axisY){for(b=1;b<this.axisY.length;b++)"undefined"===typeof this.axisY[b].options.gridThickness&&(this.axisY[b].gridThickness=0);for(b=0;b<this.axisY.length-1;b++)"undefined"===typeof this.axisY[b].options.margin&&(this.axisY[b].margin=10)}if(this.axisY2){for(b=1;b<this.axisY2.length;b++)"undefined"===typeof this.axisY2[b].options.gridThickness&&(this.axisY2[b].gridThickness= +0);for(b=0;b<this.axisY2.length-1;b++)"undefined"===typeof this.axisY2[b].options.margin&&(this.axisY2[b].margin=10)}this.axisY&&0<this.axisY.length&&(this.axisY2&&0<this.axisY2.length)&&(0<this.axisY[0].gridThickness&&"undefined"===typeof this.axisY2[0].options.gridThickness?this.axisY2[0].gridThickness=0:0<this.axisY2[0].gridThickness&&"undefined"===typeof this.axisY[0].options.gridThickness&&(this.axisY[0].gridThickness=0));if(this.axisX)for(b=0;b<this.axisX.length;b++)"undefined"===typeof this.axisX[b].options.gridThickness&& +(this.axisX[b].gridThickness=0);if(this.axisX2)for(b=0;b<this.axisX2.length;b++)"undefined"===typeof this.axisX2[b].options.gridThickness&&(this.axisX2[b].gridThickness=0);this.axisX&&0<this.axisX.length&&(this.axisX2&&0<this.axisX2.length)&&(0<this.axisX[0].gridThickness&&"undefined"===typeof this.axisX2[0].options.gridThickness?this.axisX2[0].gridThickness=0:0<this.axisX2[0].gridThickness&&"undefined"===typeof this.axisX[0].options.gridThickness&&(this.axisX[0].gridThickness=0));b=!1;if(0<this._axes.length&& +(this.zoomEnabled||this.panEnabled))for(d=0;d<this._axes.length;d++)if(null!==this._axes[d].viewportMinimum||null!==this._axes[d].viewportMaximum){b=!0;break}b?(Qa(this._zoomButton,this._resetButton),this._toolBar.style.border=this.toolbar.borderThickness+"px solid "+this.toolbar.borderColor,this._zoomButton.style.borderRight=this.toolbar.borderThickness+"px solid "+this.toolbar.borderColor,this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor): +(va(this._zoomButton,this._resetButton),this._toolBar.style.border=this.toolbar.borderThickness+"px solid transparent",this.options.zoomEnabled&&(this.zoomEnabled=!0,this.panEnabled=!1));gb(this);this._processData();this.options.title&&(this.title=new Aa(this,this.options.title),this.title.dockInsidePlotArea?a.push(this.title):this.title.setLayout());this.subtitles=[];if(this.options.subtitles)for(d=0;d<this.options.subtitles.length;d++)b=new Ka(this,this.options.subtitles[d],d),this.subtitles.push(b), +b.dockInsidePlotArea?a.push(b):b.setLayout();this.legend=new H(this,this.options.legend);for(d=0;d<this.data.length;d++)(this.data[d].showInLegend||"pie"===this.data[d].type||"doughnut"===this.data[d].type||"funnel"===this.data[d].type||"pyramid"===this.data[d].type)&&this.legend.dataSeries.push(this.data[d]);this.legend.dockInsidePlotArea?a.push(this.legend):this.legend.setLayout();for(d=0;d<this._axes.length;d++)if(this._axes[d].scaleBreaks&&this._axes[d].scaleBreaks._appliedBreaks.length){r?(this._breaksCanvas= +ta(this.width,this.height,!0),this._breaksCanvasCtx=this._breaksCanvas.getContext("2d")):(this._breaksCanvas=this.canvas,this._breaksCanvasCtx=this.ctx);break}this._preRenderCanvas=u(this._preRenderCanvas)?ta(this.width,this.height):this._preRenderCanvas;this._preRenderCtx=this._preRenderCanvas.getContext("2d");"normal"!==this.plotInfo.axisPlacement&&"xySwapped"!==this.plotInfo.axisPlacement||z.setLayout(this.axisX,this.axisX2,this.axisY,this.axisY2,this.plotInfo.axisPlacement,this.layoutManager.getFreeSpace())}; +p.prototype.renderElements=function(){var a=this._plotAreaElements;this.title&&!this.title.dockInsidePlotArea&&this.title.render();for(var d=0;d<this.subtitles.length;d++)this.subtitles[d].dockInsidePlotArea||this.subtitles[d].render();this.legend.dockInsidePlotArea||this.legend.render();if("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)z.render(this.axisX,this.axisX2,this.axisY,this.axisY2,this.plotInfo.axisPlacement);else if("none"===this.plotInfo.axisPlacement)this.preparePlotArea(); +else return;for(d=0;d<a.length;d++)a[d].setLayout(),a[d].render();var b=[];if(this.animatedRender){var c=ta(this.width,this.height);c.getContext("2d").drawImage(this.canvas,0,0,this.width,this.height)}hb(this);var a=this.ctx.miterLimit,e;this.ctx.miterLimit=3;r&&this._breaksCanvas&&(this._preRenderCtx.drawImage(this.canvas,0,0,this.width,this.height),this._preRenderCtx.drawImage(this._breaksCanvas,0,0,this.width,this.height),this._breaksCanvasCtx.globalCompositeOperation="source-atop",this._breaksCanvasCtx.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),this._preRenderCtx.clearRect(0,0,this.width,this.height));for(d=0;d<this.plotInfo.plotTypes.length;d++)for(var g=this.plotInfo.plotTypes[d],m=0;m<g.plotUnits.length;m++){var l=g.plotUnits[m],w=null;l.targetCanvas=null;this.animatedRender&&(l.targetCanvas=ta(this.width,this.height),l.targetCanvasCtx=l.targetCanvas.getContext("2d"),e=l.targetCanvasCtx.miterLimit,l.targetCanvasCtx.miterLimit=3);"line"===l.type?w=this.renderLine(l):"stepLine"===l.type?w=this.renderStepLine(l): +"spline"===l.type?w=this.renderSpline(l):"column"===l.type?w=this.renderColumn(l):"bar"===l.type?w=this.renderBar(l):"area"===l.type?w=this.renderArea(l):"stepArea"===l.type?w=this.renderStepArea(l):"splineArea"===l.type?w=this.renderSplineArea(l):"stackedColumn"===l.type?w=this.renderStackedColumn(l):"stackedColumn100"===l.type?w=this.renderStackedColumn100(l):"stackedBar"===l.type?w=this.renderStackedBar(l):"stackedBar100"===l.type?w=this.renderStackedBar100(l):"stackedArea"===l.type?w=this.renderStackedArea(l): +"stackedArea100"===l.type?w=this.renderStackedArea100(l):"bubble"===l.type?w=w=this.renderBubble(l):"scatter"===l.type?w=this.renderScatter(l):"pie"===l.type?this.renderPie(l):"doughnut"===l.type?this.renderPie(l):"funnel"===l.type?w=this.renderFunnel(l):"pyramid"===l.type?w=this.renderFunnel(l):"candlestick"===l.type?w=this.renderCandlestick(l):"ohlc"===l.type?w=this.renderCandlestick(l):"rangeColumn"===l.type?w=this.renderRangeColumn(l):"error"===l.type?w=this.renderError(l):"rangeBar"===l.type? +w=this.renderRangeBar(l):"rangeArea"===l.type?w=this.renderRangeArea(l):"rangeSplineArea"===l.type?w=this.renderRangeSplineArea(l):"waterfall"===l.type?w=this.renderWaterfall(l):"boxAndWhisker"===l.type&&(w=this.renderBoxAndWhisker(l));for(var h=0;h<l.dataSeriesIndexes.length;h++)this._dataInRenderedOrder.push(this.data[l.dataSeriesIndexes[h]]);this.animatedRender&&(l.targetCanvasCtx.miterLimit=e,w&&b.push(w))}this.ctx.miterLimit=a;this.animatedRender&&this._breaksCanvasCtx&&b.push({source:this._breaksCanvasCtx, +dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0,startTimePercent:0.7});this.animatedRender&&0<this._indexLabels.length&&(e=ta(this.width,this.height).getContext("2d"),b.push(this.renderIndexLabels(e)));var s=this;if(0<b.length)s.disableToolTip=!0,s._animator.animate(200,s.animationDuration,function(a){s.ctx.clearRect(0,0,s.width,s.height);s.ctx.drawImage(c,0,0,Math.floor(s.width*W),Math.floor(s.height*W),0,0,s.width,s.height);for(var e= +0;e<b.length;e++)w=b[e],1>a&&"undefined"!==typeof w.startTimePercent?a>=w.startTimePercent&&w.animationCallback(w.easingFunction(a-w.startTimePercent,0,1,1-w.startTimePercent),w):w.animationCallback(w.easingFunction(a,0,1,1),w);s.dispatchEvent("dataAnimationIterationEnd",{chart:s})},function(){b=[];for(var a=0;a<s.plotInfo.plotTypes.length;a++)for(var e=s.plotInfo.plotTypes[a],d=0;d<e.plotUnits.length;d++)e.plotUnits[d].targetCanvas=null;c=null;s.disableToolTip=!1});else{if(s._breaksCanvas)if(r)s.plotArea.ctx.drawImage(s._breaksCanvas, +0,0,this.width,this.height);else for(h=0;h<s._axes.length;h++)s._axes[h].createMask();0<s._indexLabels.length&&s.renderIndexLabels();s.dispatchEvent("dataAnimationIterationEnd",{chart:s})}this.attachPlotAreaEventHandlers();this.zoomEnabled||(this.panEnabled||!this._zoomButton||"none"===this._zoomButton.style.display)||va(this._zoomButton,this._resetButton);this.toolTip._updateToolTip();this.renderCount++;Ja&&(s=this,setTimeout(function(){var a=document.getElementById("ghostCanvasCopy");a&&(Oa(a,s.width, +s.height),a.getContext("2d").drawImage(s._eventManager.ghostCanvas,0,0))},2E3));this._breaksCanvas&&(delete this._breaksCanvas,delete this._breaksCanvasCtx);for(h=0;h<this._axes.length;h++)this._axes[h].maskCanvas&&(delete this._axes[h].maskCanvas,delete this._axes[h].maskCtx)};p.prototype.render=function(a){a&&(this.options=a);this._initialize();this.setLayout();this.renderElements()};p.prototype.attachPlotAreaEventHandlers=function(){this.attachEvent({context:this,chart:this,mousedown:this._plotAreaMouseDown, +mouseup:this._plotAreaMouseUp,mousemove:this._plotAreaMouseMove,cursor:this.panEnabled?"move":"default",capture:!0,bounds:this.plotArea})};p.prototype.categoriseDataSeries=function(){for(var a="",d=0;d<this.data.length;d++)if(a=this.data[d],a.dataPoints&&(0!==a.dataPoints.length&&a.visible)&&0<=p._supportedChartTypes.indexOf(a.type)){for(var b=null,c=!1,e=null,g=!1,m=0;m<this.plotInfo.plotTypes.length;m++)if(this.plotInfo.plotTypes[m].type===a.type){c=!0;b=this.plotInfo.plotTypes[m];break}c||(b={type:a.type, +totalDataSeries:0,plotUnits:[]},this.plotInfo.plotTypes.push(b));for(m=0;m<b.plotUnits.length;m++)if(b.plotUnits[m].axisYType===a.axisYType&&b.plotUnits[m].axisXType===a.axisXType&&b.plotUnits[m].axisYIndex===a.axisYIndex&&b.plotUnits[m].axisXIndex===a.axisXIndex){g=!0;e=b.plotUnits[m];break}g||(e={type:a.type,previousDataSeriesCount:0,index:b.plotUnits.length,plotType:b,axisXType:a.axisXType,axisYType:a.axisYType,axisYIndex:a.axisYIndex,axisXIndex:a.axisXIndex,axisY:"primary"===a.axisYType?this.axisY[0<= +a.axisYIndex&&a.axisYIndex<this.axisY.length?a.axisYIndex:0]:this.axisY2[0<=a.axisYIndex&&a.axisYIndex<this.axisY2.length?a.axisYIndex:0],axisX:"primary"===a.axisXType?this.axisX[0<=a.axisXIndex&&a.axisXIndex<this.axisX.length?a.axisXIndex:0]:this.axisX2[0<=a.axisXIndex&&a.axisXIndex<this.axisX2.length?a.axisXIndex:0],dataSeriesIndexes:[],yTotals:[]},b.plotUnits.push(e));b.totalDataSeries++;e.dataSeriesIndexes.push(d);a.plotUnit=e}for(d=0;d<this.plotInfo.plotTypes.length;d++)for(b=this.plotInfo.plotTypes[d], +m=a=0;m<b.plotUnits.length;m++)b.plotUnits[m].previousDataSeriesCount=a,a+=b.plotUnits[m].dataSeriesIndexes.length};p.prototype.assignIdToDataPoints=function(){for(var a=0;a<this.data.length;a++){var d=this.data[a];if(d.dataPoints)for(var b=d.dataPoints.length,c=0;c<b;c++)d.dataPointIds[c]=++this._eventManager.lastObjectId}};p.prototype._processData=function(){this.assignIdToDataPoints();this.categoriseDataSeries();for(var a=0;a<this.plotInfo.plotTypes.length;a++)for(var d=this.plotInfo.plotTypes[a], +b=0;b<d.plotUnits.length;b++){var c=d.plotUnits[b];"line"===c.type||"stepLine"===c.type||"spline"===c.type||"column"===c.type||"area"===c.type||"stepArea"===c.type||"splineArea"===c.type||"bar"===c.type||"bubble"===c.type||"scatter"===c.type?this._processMultiseriesPlotUnit(c):"stackedColumn"===c.type||"stackedBar"===c.type||"stackedArea"===c.type?this._processStackedPlotUnit(c):"stackedColumn100"===c.type||"stackedBar100"===c.type||"stackedArea100"===c.type?this._processStacked100PlotUnit(c):"candlestick"=== +c.type||"ohlc"===c.type||"rangeColumn"===c.type||"rangeBar"===c.type||"rangeArea"===c.type||"rangeSplineArea"===c.type||"error"===c.type||"boxAndWhisker"===c.type?this._processMultiYPlotUnit(c):"waterfall"===c.type&&this._processSpecificPlotUnit(c)}this.calculateAutoBreaks()};p.prototype._processMultiseriesPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;m<a.dataSeriesIndexes.length;m++){var l=this.data[a.dataSeriesIndexes[m]], +w=0,h=!1,s=!1,q;if("normal"===l.axisPlacement||"xySwapped"===l.axisPlacement)var n=a.axisX.sessionVariables.newViewportMinimum?a.axisX.sessionVariables.newViewportMinimum:this.options.axisX&&this.options.axisX.viewportMinimum?this.options.axisX.viewportMinimum:this.options.axisX&&this.options.axisX.minimum?this.options.axisX.minimum:a.axisX.logarithmic?0:-Infinity,f=a.axisX.sessionVariables.newViewportMaximum?a.axisX.sessionVariables.newViewportMaximum:this.options.axisX&&this.options.axisX.viewportMaximum? +this.options.axisX.viewportMaximum:this.options.axisX&&this.options.axisX.maximum?this.options.axisX.maximum:Infinity;if(l.dataPoints[w].x&&l.dataPoints[w].x.getTime||"dateTime"===l.xValueType)g=!0;for(w=0;w<l.dataPoints.length;w++){"undefined"===typeof l.dataPoints[w].x&&(l.dataPoints[w].x=w+(a.axisX.logarithmic?1:0));l.dataPoints[w].x.getTime?(g=!0,c=l.dataPoints[w].x.getTime()):c=l.dataPoints[w].x;e=l.dataPoints[w].y;c<b.min&&(b.min=c);c>b.max&&(b.max=c);e<d.min&&"number"===typeof e&&(d.min=e); +e>d.max&&"number"===typeof e&&(d.max=e);if(0<w){if(a.axisX.logarithmic){var B=c/l.dataPoints[w-1].x;1>B&&(B=1/B);b.minDiff>B&&1!==B&&(b.minDiff=B)}else B=c-l.dataPoints[w-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B);null!==e&&null!==l.dataPoints[w-1].y&&(a.axisY.logarithmic?(B=e/l.dataPoints[w-1].y,1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e-l.dataPoints[w-1].y,0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B)))}if(c<n&&!h)null!==e&&(q=c);else{if(!h&&(h=!0,0<w)){w-=2;continue}if(c>f&& +!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);c<b.viewPortMin&&(b.viewPortMin=c);c>b.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&q<c&&(b.viewPortMin=q):(e<d.viewPortMin&&"number"===typeof e&&(d.viewPortMin=e),e>d.viewPortMax&&"number"===typeof e&&(d.viewPortMax=e))}}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype._processStackedPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d= +a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=[],l=[],w=Infinity,h=-Infinity,s=0;s<a.dataSeriesIndexes.length;s++){var q=this.data[a.dataSeriesIndexes[s]],n=0,f=!1,B=!1,k;if("normal"===q.axisPlacement||"xySwapped"===q.axisPlacement)var p=a.axisX.sessionVariables.newViewportMinimum?a.axisX.sessionVariables.newViewportMinimum:this.options.axisX&&this.options.axisX.viewportMinimum?this.options.axisX.viewportMinimum:this.options.axisX&&this.options.axisX.minimum?this.options.axisX.minimum:-Infinity, +t=a.axisX.sessionVariables.newViewportMaximum?a.axisX.sessionVariables.newViewportMaximum:this.options.axisX&&this.options.axisX.viewportMaximum?this.options.axisX.viewportMaximum:this.options.axisX&&this.options.axisX.maximum?this.options.axisX.maximum:Infinity;if(q.dataPoints[n].x&&q.dataPoints[n].x.getTime||"dateTime"===q.xValueType)g=!0;for(n=0;n<q.dataPoints.length;n++){"undefined"===typeof q.dataPoints[n].x&&(q.dataPoints[n].x=n+(a.axisX.logarithmic?1:0));q.dataPoints[n].x.getTime?(g=!0,c=q.dataPoints[n].x.getTime()): +c=q.dataPoints[n].x;e=u(q.dataPoints[n].y)?0:q.dataPoints[n].y;c<b.min&&(b.min=c);c>b.max&&(b.max=c);if(0<n){if(a.axisX.logarithmic){var r=c/q.dataPoints[n-1].x;1>r&&(r=1/r);b.minDiff>r&&1!==r&&(b.minDiff=r)}else r=c-q.dataPoints[n-1].x,0>r&&(r*=-1),b.minDiff>r&&0!==r&&(b.minDiff=r);null!==e&&null!==q.dataPoints[n-1].y&&(a.axisY.logarithmic?0<e&&(r=e/q.dataPoints[n-1].y,1>r&&(r=1/r),d.minDiff>r&&1!==r&&(d.minDiff=r)):(r=e-q.dataPoints[n-1].y,0>r&&(r*=-1),d.minDiff>r&&0!==r&&(d.minDiff=r)))}if(c<p&& +!f)null!==q.dataPoints[n].y&&(k=c);else{if(!f&&(f=!0,0<n)){n-=2;continue}if(c>t&&!B)B=!0;else if(c>t&&B)continue;q.dataPoints[n].label&&(a.axisX.labels[c]=q.dataPoints[n].label);c<b.viewPortMin&&(b.viewPortMin=c);c>b.viewPortMax&&(b.viewPortMax=c);null===q.dataPoints[n].y?b.viewPortMin===c&&k<c&&(b.viewPortMin=k):(a.yTotals[c]=(a.yTotals[c]?a.yTotals[c]:0)+e,0<=e?m[c]?m[c]+=e:(m[c]=e,w=Math.min(e,w)):l[c]?l[c]+=e:(l[c]=e,h=Math.max(e,h)))}}a.axisY.scaleBreaks&&(a.axisY.scaleBreaks.autoCalculate&& +1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks)&&(d.dataPointYPositiveSums?(d.dataPointYPositiveSums.push.apply(d.dataPointYPositiveSums,m),d.dataPointYNegativeSums.push.apply(d.dataPointYPositiveSums,l)):(d.dataPointYPositiveSums=m,d.dataPointYNegativeSums=l));q.axisX.valueType=q.xValueType=g?"dateTime":"number"}for(n in m)m.hasOwnProperty(n)&&!isNaN(n)&&(a=m[n],a<d.min&&(d.min=Math.min(a,w)),a>d.max&&(d.max=a),n<b.viewPortMin||n>b.viewPortMax||(a<d.viewPortMin&&(d.viewPortMin=Math.min(a,w)),a>d.viewPortMax&& +(d.viewPortMax=a)));for(n in l)l.hasOwnProperty(n)&&!isNaN(n)&&(a=l[n],a<d.min&&(d.min=a),a>d.max&&(d.max=Math.max(a,h)),n<b.viewPortMin||n>b.viewPortMax||(a<d.viewPortMin&&(d.viewPortMin=a),a>d.viewPortMax&&(d.viewPortMax=Math.max(a,h))))}};p.prototype._processStacked100PlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=!1,l=!1,w=[],h=0;h<a.dataSeriesIndexes.length;h++){var s=this.data[a.dataSeriesIndexes[h]],q=0, +n=!1,f=!1,B;if("normal"===s.axisPlacement||"xySwapped"===s.axisPlacement)var k=a.axisX.sessionVariables.newViewportMinimum?a.axisX.sessionVariables.newViewportMinimum:this.options.axisX&&this.options.axisX.viewportMinimum?this.options.axisX.viewportMinimum:this.options.axisX&&this.options.axisX.minimum?this.options.axisX.minimum:-Infinity,r=a.axisX.sessionVariables.newViewportMaximum?a.axisX.sessionVariables.newViewportMaximum:this.options.axisX&&this.options.axisX.viewportMaximum?this.options.axisX.viewportMaximum: +this.options.axisX&&this.options.axisX.maximum?this.options.axisX.maximum:Infinity;if(s.dataPoints[q].x&&s.dataPoints[q].x.getTime||"dateTime"===s.xValueType)g=!0;for(q=0;q<s.dataPoints.length;q++){"undefined"===typeof s.dataPoints[q].x&&(s.dataPoints[q].x=q+(a.axisX.logarithmic?1:0));s.dataPoints[q].x.getTime?(g=!0,c=s.dataPoints[q].x.getTime()):c=s.dataPoints[q].x;e=u(s.dataPoints[q].y)?null:s.dataPoints[q].y;c<b.min&&(b.min=c);c>b.max&&(b.max=c);if(0<q){if(a.axisX.logarithmic){var t=c/s.dataPoints[q- +1].x;1>t&&(t=1/t);b.minDiff>t&&1!==t&&(b.minDiff=t)}else t=c-s.dataPoints[q-1].x,0>t&&(t*=-1),b.minDiff>t&&0!==t&&(b.minDiff=t);u(e)||null===s.dataPoints[q-1].y||(a.axisY.logarithmic?0<e&&(t=e/s.dataPoints[q-1].y,1>t&&(t=1/t),d.minDiff>t&&1!==t&&(d.minDiff=t)):(t=e-s.dataPoints[q-1].y,0>t&&(t*=-1),d.minDiff>t&&0!==t&&(d.minDiff=t)))}if(c<k&&!n)null!==e&&(B=c);else{if(!n&&(n=!0,0<q)){q-=2;continue}if(c>r&&!f)f=!0;else if(c>r&&f)continue;s.dataPoints[q].label&&(a.axisX.labels[c]=s.dataPoints[q].label); +c<b.viewPortMin&&(b.viewPortMin=c);c>b.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&B<c&&(b.viewPortMin=B):(a.yTotals[c]=(a.yTotals[c]?a.yTotals[c]:0)+e,0<=e?m=!0:0>e&&(l=!0),w[c]=w[c]?w[c]+Math.abs(e):Math.abs(e))}}s.axisX.valueType=s.xValueType=g?"dateTime":"number"}a.axisY.logarithmic?(d.max=u(d.viewPortMax)?99*Math.pow(a.axisY.logarithmBase,-0.05):Math.max(d.viewPortMax,99*Math.pow(a.axisY.logarithmBase,-0.05)),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&!l?(d.max=u(d.viewPortMax)? +99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&l?(d.max=u(d.viewPortMax)?99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99)):!m&&l&&(d.max=u(d.viewPortMax)?-1:Math.max(d.viewPortMax,-1),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99));d.viewPortMin=d.min;d.viewPortMax=d.max;a.dataPointYSums=w}};p.prototype._processMultiYPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo, +b=a.axisX.dataInfo,c,e,g,m,l=!1,w=0;w<a.dataSeriesIndexes.length;w++){var h=this.data[a.dataSeriesIndexes[w]],s=0,q=!1,n=!1,f,B,k;if("normal"===h.axisPlacement||"xySwapped"===h.axisPlacement)var r=a.axisX.sessionVariables.newViewportMinimum?a.axisX.sessionVariables.newViewportMinimum:this.options.axisX&&this.options.axisX.viewportMinimum?this.options.axisX.viewportMinimum:this.options.axisX&&this.options.axisX.minimum?this.options.axisX.minimum:a.axisX.logarithmic?0:-Infinity,t=a.axisX.sessionVariables.newViewportMaximum? +a.axisX.sessionVariables.newViewportMaximum:this.options.axisX&&this.options.axisX.viewportMaximum?this.options.axisX.viewportMaximum:this.options.axisX&&this.options.axisX.maximum?this.options.axisX.maximum:Infinity;if(h.dataPoints[s].x&&h.dataPoints[s].x.getTime||"dateTime"===h.xValueType)l=!0;for(s=0;s<h.dataPoints.length;s++){"undefined"===typeof h.dataPoints[s].x&&(h.dataPoints[s].x=s+(a.axisX.logarithmic?1:0));h.dataPoints[s].x.getTime?(l=!0,c=h.dataPoints[s].x.getTime()):c=h.dataPoints[s].x; +if((e=h.dataPoints[s].y)&&e.length){g=Math.min.apply(null,e);m=Math.max.apply(null,e);B=!0;for(var p=0;p<e.length;p++)null===e.k&&(B=!1);B&&(q||(k=f),f=c)}c<b.min&&(b.min=c);c>b.max&&(b.max=c);g<d.min&&(d.min=g);m>d.max&&(d.max=m);0<s&&(a.axisX.logarithmic?(B=c/h.dataPoints[s-1].x,1>B&&(B=1/B),b.minDiff>B&&1!==B&&(b.minDiff=B)):(B=c-h.dataPoints[s-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B)),e&&(null!==e[0]&&h.dataPoints[s-1].y&&null!==h.dataPoints[s-1].y[0])&&(a.axisY.logarithmic?(B=e[0]/ +h.dataPoints[s-1].y[0],1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e[0]-h.dataPoints[s-1].y[0],0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B))));if(!(c<r)||q){if(!q&&(q=!0,0<s)){s-=2;f=k;continue}if(c>t&&!n)n=!0;else if(c>t&&n)continue;h.dataPoints[s].label&&(a.axisX.labels[c]=h.dataPoints[s].label);c<b.viewPortMin&&(b.viewPortMin=c);c>b.viewPortMax&&(b.viewPortMax=c);if(b.viewPortMin===c&&e)for(p=0;p<e.length;p++)if(null===e[p]&&f<c){b.viewPortMin=f;break}null===e?b.viewPortMin===c&&f<c&& +(b.viewPortMin=f):(g<d.viewPortMin&&(d.viewPortMin=g),m>d.viewPortMax&&(d.viewPortMax=m))}}h.axisX.valueType=h.xValueType=l?"dateTime":"number"}};p.prototype._processSpecificPlotUnit=function(a){if("waterfall"===a.type&&a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;m<a.dataSeriesIndexes.length;m++){var l=this.data[a.dataSeriesIndexes[m]],w=0,h=!1,s=!1,q=c=0;if("normal"===l.axisPlacement||"xySwapped"===l.axisPlacement)var n=a.axisX.sessionVariables.newViewportMinimum? +a.axisX.sessionVariables.newViewportMinimum:this.options.axisX&&this.options.axisX.viewportMinimum?this.options.axisX.viewportMinimum:this.options.axisX&&this.options.axisX.minimum?this.options.axisX.minimum:a.axisX.logarithmic?0:-Infinity,f=a.axisX.sessionVariables.newViewportMaximum?a.axisX.sessionVariables.newViewportMaximum:this.options.axisX&&this.options.axisX.viewportMaximum?this.options.axisX.viewportMaximum:this.options.axisX&&this.options.axisX.maximum?this.options.axisX.maximum:Infinity; +if(l.dataPoints[w].x&&l.dataPoints[w].x.getTime||"dateTime"===l.xValueType)g=!0;for(w=0;w<l.dataPoints.length;w++)"undefined"!==typeof l.dataPoints[w].isCumulativeSum&&!0===l.dataPoints[w].isCumulativeSum?(l.dataPointEOs[w].cumulativeSumYStartValue=0,l.dataPointEOs[w].cumulativeSum=0===w?0:l.dataPointEOs[w-1].cumulativeSum,l.dataPoints[w].y=0===w?0:l.dataPointEOs[w-1].cumulativeSum):"undefined"!==typeof l.dataPoints[w].isIntermediateSum&&!0===l.dataPoints[w].isIntermediateSum?(l.dataPointEOs[w].cumulativeSumYStartValue= +q,l.dataPointEOs[w].cumulativeSum=0===w?0:l.dataPointEOs[w-1].cumulativeSum,l.dataPoints[w].y=0===w?0:c,q=0===w?0:l.dataPointEOs[w-1].cumulativeSum,c=0):(e="number"!==typeof l.dataPoints[w].y?0:l.dataPoints[w].y,l.dataPointEOs[w].cumulativeSumYStartValue=0===w?0:l.dataPointEOs[w-1].cumulativeSum,l.dataPointEOs[w].cumulativeSum=0===w?e:l.dataPointEOs[w-1].cumulativeSum+e,c+=e);for(w=0;w<l.dataPoints.length;w++)if("undefined"===typeof l.dataPoints[w].x&&(l.dataPoints[w].x=w+(a.axisX.logarithmic?1:0)), +l.dataPoints[w].x.getTime?(g=!0,c=l.dataPoints[w].x.getTime()):c=l.dataPoints[w].x,e=l.dataPoints[w].y,c<b.min&&(b.min=c),c>b.max&&(b.max=c),l.dataPointEOs[w].cumulativeSum<d.min&&(d.min=l.dataPointEOs[w].cumulativeSum),l.dataPointEOs[w].cumulativeSum>d.max&&(d.max=l.dataPointEOs[w].cumulativeSum),0<w&&(a.axisX.logarithmic?(q=c/l.dataPoints[w-1].x,1>q&&(q=1/q),b.minDiff>q&&1!==q&&(b.minDiff=q)):(q=c-l.dataPoints[w-1].x,0>q&&(q*=-1),b.minDiff>q&&0!==q&&(b.minDiff=q)),null!==e&&null!==l.dataPoints[w- +1].y&&(a.axisY.logarithmic?(e=l.dataPointEOs[w].cumulativeSum/l.dataPointEOs[w-1].cumulativeSum,1>e&&(e=1/e),d.minDiff>e&&1!==e&&(d.minDiff=e)):(e=l.dataPointEOs[w].cumulativeSum-l.dataPointEOs[w-1].cumulativeSum,0>e&&(e*=-1),d.minDiff>e&&0!==e&&(d.minDiff=e)))),!(c<n)||h){if(!h&&(h=!0,0<w)){w-=2;continue}if(c>f&&!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);c<b.viewPortMin&&(b.viewPortMin=c);c>b.viewPortMax&&(b.viewPortMax=c);0<w&&(l.dataPointEOs[w- +1].cumulativeSum<d.viewPortMin&&(d.viewPortMin=l.dataPointEOs[w-1].cumulativeSum),l.dataPointEOs[w-1].cumulativeSum>d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w-1].cumulativeSum));l.dataPointEOs[w].cumulativeSum<d.viewPortMin&&(d.viewPortMin=l.dataPointEOs[w].cumulativeSum);l.dataPointEOs[w].cumulativeSum>d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w].cumulativeSum)}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype.calculateAutoBreaks=function(){function a(a,c,b,e){if(e)return b= +Math.pow(Math.min(b*a/c,c/a),0.2),1>=b&&(b=Math.pow(1>a?1/a:Math.min(c/a,a),0.25)),{startValue:a*b,endValue:c/b};b=0.2*Math.min(b-c+a,c-a);0>=b&&(b=0.25*Math.min(c-a,Math.abs(a)));return{startValue:a+b,endValue:c-b}}function d(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){var c=a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<=a.axisX.scaleBreaks.maxNumberOfAutoBreaks,b=a.axisY.scaleBreaks&&a.axisY.scaleBreaks.autoCalculate&&1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks;if(c|| +b)for(var d=a.axisY.dataInfo,f=a.axisX.dataInfo,g,h=f.min,l=f.max,m=d.min,n=d.max,f=f._dataRanges,d=d._dataRanges,q,w=0,s=0;s<a.dataSeriesIndexes.length;s++){var k=e.data[a.dataSeriesIndexes[s]];if(!(4>k.dataPoints.length))for(w=0;w<k.dataPoints.length;w++)if(c&&(q=(l+1-h)*Math.max(parseFloat(a.axisX.scaleBreaks.collapsibleThreshold)||10,10)/100,g=k.dataPoints[w].x.getTime?k.dataPoints[w].x.getTime():k.dataPoints[w].x,q=Math.floor((g-h)/q),g<f[q].min&&(f[q].min=g),g>f[q].max&&(f[q].max=g)),b){var r= +(n+1-m)*Math.max(parseFloat(a.axisY.scaleBreaks.collapsibleThreshold)||10,10)/100;if((g="waterfall"===a.type?k.dataPointEOs[w].cumulativeSum:k.dataPoints[w].y)&&g.length)for(var p=0;p<g.length;p++)q=Math.floor((g[p]-m)/r),g[p]<d[q].min&&(d[q].min=g[p]),g[p]>d[q].max&&(d[q].max=g[p]);else u(g)||(q=Math.floor((g-m)/r),g<d[q].min&&(d[q].min=g),g>d[q].max&&(d[q].max=g))}}}}function b(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)&&a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<= +a.axisX.scaleBreaks.maxNumberOfAutoBreaks)for(var c=a.axisX.dataInfo,b=c.min,d=c.max,f=c._dataRanges,g,h=0,l=0;l<a.dataSeriesIndexes.length;l++){var m=e.data[a.dataSeriesIndexes[l]];if(!(4>m.dataPoints.length))for(h=0;h<m.dataPoints.length;h++)g=(d+1-b)*Math.max(parseFloat(a.axisX.scaleBreaks.collapsibleThreshold)||10,10)/100,c=m.dataPoints[h].x.getTime?m.dataPoints[h].x.getTime():m.dataPoints[h].x,g=Math.floor((c-b)/g),c<f[g].min&&(f[g].min=c),c>f[g].max&&(f[g].max=c)}}for(var c,e=this,g=!1,m=0;m< +this._axes.length;m++)if(this._axes[m].scaleBreaks&&this._axes[m].scaleBreaks.autoCalculate&&1<=this._axes[m].scaleBreaks.maxNumberOfAutoBreaks){g=!0;this._axes[m].dataInfo._dataRanges=[];for(var l=0;l<100/Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10);l++)this._axes[m].dataInfo._dataRanges.push({min:Infinity,max:-Infinity})}if(g){for(m=0;m<this.plotInfo.plotTypes.length;m++)for(g=this.plotInfo.plotTypes[m],l=0;l<g.plotUnits.length;l++)c=g.plotUnits[l],"line"===c.type|| +"stepLine"===c.type||"spline"===c.type||"column"===c.type||"area"===c.type||"stepArea"===c.type||"splineArea"===c.type||"bar"===c.type||"bubble"===c.type||"scatter"===c.type||"candlestick"===c.type||"ohlc"===c.type||"rangeColumn"===c.type||"rangeBar"===c.type||"rangeArea"===c.type||"rangeSplineArea"===c.type||"waterfall"===c.type||"error"===c.type||"boxAndWhisker"===c.type?d(c):0<=c.type.indexOf("stacked")&&b(c);for(m=0;m<this._axes.length;m++)if(this._axes[m].dataInfo._dataRanges){var w=this._axes[m].dataInfo.min; +c=(this._axes[m].dataInfo.max+1-w)*Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10)/100;var h=this._axes[m].dataInfo._dataRanges,s,q,g=[];if(this._axes[m].dataInfo.dataPointYPositiveSums){var n=this._axes[m].dataInfo.dataPointYPositiveSums;s=h;for(l in n)if(n.hasOwnProperty(l)&&!isNaN(l)&&(q=n[l],!u(q))){var f=Math.floor((q-w)/c);q<s[f].min&&(s[f].min=q);q>s[f].max&&(s[f].max=q)}delete this._axes[m].dataInfo.dataPointYPositiveSums}if(this._axes[m].dataInfo.dataPointYNegativeSums){n= +this._axes[m].dataInfo.dataPointYNegativeSums;s=h;for(l in n)n.hasOwnProperty(l)&&!isNaN(l)&&(q=-1*n[l],u(q)||(f=Math.floor((q-w)/c),q<s[f].min&&(s[f].min=q),q>s[f].max&&(s[f].max=q)));delete this._axes[m].dataInfo.dataPointYNegativeSums}for(l=0;l<h.length-1;l++)if(s=h[l].max,isFinite(s))for(;l<h.length-1;)if(w=h[l+1].min,isFinite(w)){q=w-s;q>c&&g.push({diff:q,start:s,end:w});break}else l++;if(this._axes[m].scaleBreaks.customBreaks)for(l=0;l<this._axes[m].scaleBreaks.customBreaks.length;l++)for(c= +0;c<g.length;c++)if(this._axes[m].scaleBreaks.customBreaks[l].startValue<=g[c].start&&g[c].start<=this._axes[m].scaleBreaks.customBreaks[l].endValue||this._axes[m].scaleBreaks.customBreaks[l].startValue<=g[c].start&&g[c].start<=this._axes[m].scaleBreaks.customBreaks[l].endValue||g[c].start<=this._axes[m].scaleBreaks.customBreaks[l].startValue&&this._axes[m].scaleBreaks.customBreaks[l].startValue<=g[c].end||g[c].start<=this._axes[m].scaleBreaks.customBreaks[l].endValue&&this._axes[m].scaleBreaks.customBreaks[l].endValue<= +g[c].end)g.splice(c,1),c--;g.sort(function(a,c){return c.diff-a.diff});for(l=0;l<Math.min(g.length,this._axes[m].scaleBreaks.maxNumberOfAutoBreaks);l++)c=a(g[l].start,g[l].end,this._axes[m].logarithmic?this._axes[m].dataInfo.max/this._axes[m].dataInfo.min:this._axes[m].dataInfo.max-this._axes[m].dataInfo.min,this._axes[m].logarithmic),this._axes[m].scaleBreaks.autoBreaks.push(new L(this,"autoBreaks",c,l,++this._eventManager.lastObjectId,this._axes[m].scaleBreaks)),this._axes[m].scaleBreaks._appliedBreaks.push(this._axes[m].scaleBreaks.autoBreaks[this._axes[m].scaleBreaks.autoBreaks.length- +1]);this._axes[m].scaleBreaks._appliedBreaks.sort(function(a,c){return a.startValue-c.startValue})}}};p.prototype.getDataPointAtXY=function(a,d,b){b=b||!1;for(var c=[],e=this._dataInRenderedOrder.length-1;0<=e;e--){var g=null;(g=this._dataInRenderedOrder[e].getDataPointAtXY(a,d,b))&&c.push(g)}a=null;d=!1;for(b=0;b<c.length;b++)if("line"===c[b].dataSeries.type||"stepLine"===c[b].dataSeries.type||"area"===c[b].dataSeries.type||"stepArea"===c[b].dataSeries.type)if(e=na("markerSize",c[b].dataPoint,c[b].dataSeries)|| +8,c[b].distance<=e/2){d=!0;break}for(b=0;b<c.length;b++)d&&"line"!==c[b].dataSeries.type&&"stepLine"!==c[b].dataSeries.type&&"area"!==c[b].dataSeries.type&&"stepArea"!==c[b].dataSeries.type||(a?c[b].distance<=a.distance&&(a=c[b]):a=c[b]);return a};p.prototype.getObjectAtXY=function(a,d,b){var c=null;if(b=this.getDataPointAtXY(a,d,b||!1))c=b.dataSeries.dataPointIds[b.dataPointIndex];else if(r)c=ab(a,d,this._eventManager.ghostCtx);else for(b=0;b<this.legend.items.length;b++){var e=this.legend.items[b]; +a>=e.x1&&(a<=e.x2&&d>=e.y1&&d<=e.y2)&&(c=e.id)}return c};p.prototype.getAutoFontSize=lb;p.prototype.resetOverlayedCanvas=function(){this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height)};p.prototype.clearCanvas=kb;p.prototype.attachEvent=function(a){this._events.push(a)};p.prototype._touchEventHandler=function(a){if(a.changedTouches&&this.interactivityEnabled){var d=[],b=a.changedTouches,c=b?b[0]:a,e=null;switch(a.type){case "touchstart":case "MSPointerDown":d=["mousemove","mousedown"];this._lastTouchData= +Ra(c);this._lastTouchData.time=new Date;break;case "touchmove":case "MSPointerMove":d=["mousemove"];break;case "touchend":case "MSPointerUp":var g=this._lastTouchData&&this._lastTouchData.time?new Date-this._lastTouchData.time:0,d="touchstart"===this._lastTouchEventType||"MSPointerDown"===this._lastTouchEventType||300>g?["mouseup","click"]:["mouseup"];break;default:return}if(!(b&&1<b.length)){e=Ra(c);e.time=new Date;try{var m=e.y-this._lastTouchData.y,g=e.time-this._lastTouchData.time;if(1<Math.abs(m)&& +this._lastTouchData.scroll||5<Math.abs(m)&&250>g)this._lastTouchData.scroll=!0}catch(l){}this._lastTouchEventType=a.type;if(this._lastTouchData.scroll&&this.zoomEnabled)this.isDrag&&this.resetOverlayedCanvas(),this.isDrag=!1;else for(b=0;b<d.length;b++)if(e=d[b],m=document.createEvent("MouseEvent"),m.initMouseEvent(e,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),c.target.dispatchEvent(m),!u(this._lastTouchData.scroll)&&!this._lastTouchData.scroll||!this._lastTouchData.scroll&& +250<g||"click"===e)a.preventManipulation&&a.preventManipulation(),a.preventDefault&&a.preventDefault()}}};p.prototype._dispatchRangeEvent=function(a,d){var b={chart:this};b.type=a;b.trigger=d;var c=[];this.axisX&&0<this.axisX.length&&c.push("axisX");this.axisX2&&0<this.axisX2.length&&c.push("axisX2");this.axisY&&0<this.axisY.length&&c.push("axisY");this.axisY2&&0<this.axisY2.length&&c.push("axisY2");for(var e=0;e<c.length;e++)if(u(b[c[e]])&&(b[c[e]]=[]),"axisY"===c[e])for(var g=0;g<this.axisY.length;g++)b[c[e]].push({viewportMinimum:this[c[e]][g].sessionVariables.newViewportMinimum, +viewportMaximum:this[c[e]][g].sessionVariables.newViewportMaximum});else if("axisY2"===c[e])for(g=0;g<this.axisY2.length;g++)b[c[e]].push({viewportMinimum:this[c[e]][g].sessionVariables.newViewportMinimum,viewportMaximum:this[c[e]][g].sessionVariables.newViewportMaximum});else if("axisX"===c[e])for(g=0;g<this.axisX.length;g++)b[c[e]].push({viewportMinimum:this[c[e]][g].sessionVariables.newViewportMinimum,viewportMaximum:this[c[e]][g].sessionVariables.newViewportMaximum});else if("axisX2"===c[e])for(g= +0;g<this.axisX2.length;g++)b[c[e]].push({viewportMinimum:this[c[e]][g].sessionVariables.newViewportMinimum,viewportMaximum:this[c[e]][g].sessionVariables.newViewportMaximum});this.dispatchEvent(a,b,this)};p.prototype._mouseEventHandler=function(a){"undefined"===typeof a.target&&a.srcElement&&(a.target=a.srcElement);var d=Ra(a),b=a.type,c,e;a.which?e=3==a.which:a.button&&(e=2==a.button);p.capturedEventParam&&(c=p.capturedEventParam,"mouseup"===b&&(p.capturedEventParam=null,c.chart.overlaidCanvas.releaseCapture? +c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",c.chart._mouseEventHandler,!1)),c.hasOwnProperty(b)&&("mouseup"!==b||c.chart.overlaidCanvas.releaseCapture?a.target!==c.chart.overlaidCanvas&&r||c[b].call(c.context,d.x,d.y):a.target!==c.chart.overlaidCanvas&&(c.chart.isDrag=!1)));if(this.interactivityEnabled)if(this._ignoreNextEvent)this._ignoreNextEvent=!1;else if(a.preventManipulation&&a.preventManipulation(),a.preventDefault&&a.preventDefault(),Ja&& +window.console&&(window.console.log(b+" --\x3e x: "+d.x+"; y:"+d.y),e&&window.console.log(a.which),"mouseup"===b&&window.console.log("mouseup")),!e){if(!p.capturedEventParam&&this._events){for(var g=0;g<this._events.length;g++)if(this._events[g].hasOwnProperty(b))if(c=this._events[g],e=c.bounds,d.x>=e.x1&&d.x<=e.x2&&d.y>=e.y1&&d.y<=e.y2){c[b].call(c.context,d.x,d.y);"mousedown"===b&&!0===c.capture?(p.capturedEventParam=c,this.overlaidCanvas.setCapture?this.overlaidCanvas.setCapture():document.documentElement.addEventListener("mouseup", +this._mouseEventHandler,!1)):"mouseup"===b&&(c.chart.overlaidCanvas.releaseCapture?c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",this._mouseEventHandler,!1));break}else c=null;a.target.style.cursor=c&&c.cursor?c.cursor:this._defaultCursor}b=this.plotArea;if(d.x<b.x1||d.x>b.x2||d.y<b.y1||d.y>b.y2)this.toolTip&&this.toolTip.enabled?this.toolTip.hide():this.resetOverlayedCanvas();this.isDrag&&this.zoomEnabled||!this._eventManager||this._eventManager.mouseEventHandler(a)}}; +p.prototype._plotAreaMouseDown=function(a,d){this.isDrag=!0;this.dragStartPoint={x:a,y:d}};p.prototype._plotAreaMouseUp=function(a,d){if(("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)&&this.isDrag){var b=d-this.dragStartPoint.y,c=a-this.dragStartPoint.x,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=!1;this.resetOverlayedCanvas();if("xySwapped"===this.plotInfo.axisPlacement)var l=g,g=e,e=l;if(this.panEnabled||this.zoomEnabled){if(this.panEnabled)for(e= +g=0;e<this._axes.length;e++)b=this._axes[e],b.logarithmic?b.viewportMinimum<b.minimum?(g=b.minimum/b.viewportMinimum,b.sessionVariables.newViewportMinimum=b.viewportMinimum*g,b.sessionVariables.newViewportMaximum=b.viewportMaximum*g,m=!0):b.viewportMaximum>b.maximum&&(g=b.viewportMaximum/b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum/g,b.sessionVariables.newViewportMaximum=b.viewportMaximum/g,m=!0):b.viewportMinimum<b.minimum?(g=b.minimum-b.viewportMinimum,b.sessionVariables.newViewportMinimum= +b.viewportMinimum+g,b.sessionVariables.newViewportMaximum=b.viewportMaximum+g,m=!0):b.viewportMaximum>b.maximum&&(g=b.viewportMaximum-b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum-g,b.sessionVariables.newViewportMaximum=b.viewportMaximum-g,m=!0);else if((!e||2<Math.abs(c))&&(!g||2<Math.abs(b))&&this.zoomEnabled){if(!this.dragStartPoint)return;b=e?this.dragStartPoint.x:this.plotArea.x1;c=g?this.dragStartPoint.y:this.plotArea.y1;e=e?a:this.plotArea.x2;g=g?d:this.plotArea.y2;2<Math.abs(b- +e)&&2<Math.abs(c-g)&&this._zoomPanToSelectedRegion(b,c,e,g)&&(m=!0)}m&&(this._ignoreNextEvent=!0,this._dispatchRangeEvent("rangeChanging","zoom"),this.render(),this._dispatchRangeEvent("rangeChanged","zoom"),m&&(this.zoomEnabled&&"none"===this._zoomButton.style.display)&&(Qa(this._zoomButton,this._resetButton),ua(this,this._zoomButton,"pan"),ua(this,this._resetButton,"reset")))}}this.isDrag=!1;if("none"!==this.plotInfo.axisPlacement){this.resetOverlayedCanvas();if(this.axisX&&0<this.axisX.length)for(m= +0;m<this.axisX.length;m++)this.axisX[m].crosshair&&this.axisX[m].crosshair.enabled&&this.axisX[m].renderCrosshair(a,d);if(this.axisX2&&0<this.axisX2.length)for(m=0;m<this.axisX2.length;m++)this.axisX2[m].crosshair&&this.axisX2[m].crosshair.enabled&&this.axisX2[m].renderCrosshair(a,d);if(this.axisY&&0<this.axisY.length)for(m=0;m<this.axisY.length;m++)this.axisY[m].crosshair&&this.axisY[m].crosshair.enabled&&this.axisY[m].renderCrosshair(a,d);if(this.axisY2&&0<this.axisY2.length)for(m=0;m<this.axisY2.length;m++)this.axisY2[m].crosshair&& +this.axisY2[m].crosshair.enabled&&this.axisY2[m].renderCrosshair(a,d)}};p.prototype._plotAreaMouseMove=function(a,d){if(this.isDrag&&"none"!==this.plotInfo.axisPlacement){var b=0,c=0,e=b=null,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=this;"xySwapped"===this.plotInfo.axisPlacement&&(b=g,g=e,e=b);b=this.dragStartPoint.x-a;c=this.dragStartPoint.y-d;2<Math.abs(b)&&8>Math.abs(b)&&(this.panEnabled||this.zoomEnabled)?this.toolTip.hide():this.panEnabled||this.zoomEnabled||this.toolTip.mouseMoveHandler(a, +d);if((!e||2<Math.abs(b)||!g||2<Math.abs(c))&&(this.panEnabled||this.zoomEnabled))if(this.panEnabled)e={x1:e?this.plotArea.x1+b:this.plotArea.x1,y1:g?this.plotArea.y1+c:this.plotArea.y1,x2:e?this.plotArea.x2+b:this.plotArea.x2,y2:g?this.plotArea.y2+c:this.plotArea.y2},clearTimeout(m._panTimerId),m._panTimerId=setTimeout(function(c,b,e,f){return function(){m._zoomPanToSelectedRegion(c,b,e,f,!0)&&(m._dispatchRangeEvent("rangeChanging","pan"),m.render(),m._dispatchRangeEvent("rangeChanged","pan"),m.dragStartPoint.x= +a,m.dragStartPoint.y=d)}}(e.x1,e.y1,e.x2,e.y2),0);else if(this.zoomEnabled){this.resetOverlayedCanvas();b=this.overlaidCanvasCtx.globalAlpha;this.overlaidCanvasCtx.fillStyle="#A89896";var c=e?this.dragStartPoint.x:this.plotArea.x1,l=g?this.dragStartPoint.y:this.plotArea.y1,w=e?a-this.dragStartPoint.x:this.plotArea.x2-this.plotArea.x1,h=g?d-this.dragStartPoint.y:this.plotArea.y2-this.plotArea.y1;this.validateRegion(c,l,e?a:this.plotArea.x2-this.plotArea.x1,g?d:this.plotArea.y2-this.plotArea.y1,"xy"!== +this.zoomType).isValid&&(this.resetOverlayedCanvas(),this.overlaidCanvasCtx.fillStyle="#99B2B5");this.overlaidCanvasCtx.globalAlpha=0.7;this.overlaidCanvasCtx.fillRect(c,l,w,h);this.overlaidCanvasCtx.globalAlpha=b}}else if(this.toolTip.mouseMoveHandler(a,d),"none"!==this.plotInfo.axisPlacement){if(this.axisX&&0<this.axisX.length)for(e=0;e<this.axisX.length;e++)this.axisX[e].crosshair&&this.axisX[e].crosshair.enabled&&this.axisX[e].renderCrosshair(a,d);if(this.axisX2&&0<this.axisX2.length)for(e=0;e< +this.axisX2.length;e++)this.axisX2[e].crosshair&&this.axisX2[e].crosshair.enabled&&this.axisX2[e].renderCrosshair(a,d);if(this.axisY&&0<this.axisY.length)for(e=0;e<this.axisY.length;e++)this.axisY[e].crosshair&&this.axisY[e].crosshair.enabled&&this.axisY[e].renderCrosshair(a,d);if(this.axisY2&&0<this.axisY2.length)for(e=0;e<this.axisY2.length;e++)this.axisY2[e].crosshair&&this.axisY2[e].crosshair.enabled&&this.axisY2[e].renderCrosshair(a,d)}};p.prototype._zoomPanToSelectedRegion=function(a,d,b,c, +e){a=this.validateRegion(a,d,b,c,e);d=a.axesWithValidRange;b=a.axesRanges;if(a.isValid)for(c=0;c<d.length;c++)e=b[c],d[c].setViewPortRange(e.val1,e.val2),this.syncCharts&&this.syncCharts(e.val1,e.val2);return a.isValid};p.prototype.validateRegion=function(a,d,b,c,e){e=e||!1;for(var g=0<=this.zoomType.indexOf("x"),m=0<=this.zoomType.indexOf("y"),l=!1,w=[],h=[],s=[],q=0;q<this._axes.length;q++)("axisX"===this._axes[q].type&&g||"axisY"===this._axes[q].type&&m)&&h.push(this._axes[q]);for(m=0;m<h.length;m++){var q= +h[m],g=!1,n=q.convertPixelToValue({x:a,y:d}),f=q.convertPixelToValue({x:b,y:c});if(n>f)var B=f,f=n,n=B;if(q.scaleBreaks)for(B=0;!g&&B<q.scaleBreaks._appliedBreaks.length;B++)g=q.scaleBreaks._appliedBreaks[B].startValue<=n&&q.scaleBreaks._appliedBreaks[B].endValue>=f;if(isFinite(q.dataInfo.minDiff))if(B=q.getApparentDifference(n,f,null,!0),!(g||!(this.panEnabled&&q.scaleBreaks&&q.scaleBreaks._appliedBreaks.length)&&(q.logarithmic&&B<Math.pow(q.dataInfo.minDiff,3)||!q.logarithmic&&B<3*Math.abs(q.dataInfo.minDiff))|| +n<q.minimum||f>q.maximum))w.push(q),s.push({val1:n,val2:f}),l=!0;else if(!e){l=!1;break}}return{isValid:l,axesWithValidRange:w,axesRanges:s}};p.prototype.preparePlotArea=function(){var a=this.plotArea;!r&&(0<a.x1||0<a.y1)&&a.ctx.translate(a.x1,a.y1);if((this.axisX[0]||this.axisX2[0])&&(this.axisY[0]||this.axisY2[0])){var d=this.axisX[0]?this.axisX[0].lineCoordinates:this.axisX2[0].lineCoordinates;if(this.axisY&&0<this.axisY.length&&this.axisY[0]){var b=this.axisY[0];a.x1=d.x1<d.x2?d.x1:b.lineCoordinates.x1; +a.y1=d.y1<b.lineCoordinates.y1?d.y1:b.lineCoordinates.y1;a.x2=d.x2>b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2;a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2;a.width=a.x2-a.x1;a.height=a.y2-a.y1}this.axisY2&&0<this.axisY2.length&&this.axisY2[0]&&(b=this.axisY2[0],a.x1=d.x1<d.x2?d.x1:b.lineCoordinates.x1,a.y1=d.y1<b.lineCoordinates.y1?d.y1:b.lineCoordinates.y1,a.x2=d.x2>b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2,a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2,a.width=a.x2-a.x1,a.height=a.y2-a.y1)}else d= +this.layoutManager.getFreeSpace(),a.x1=d.x1,a.x2=d.x2,a.y1=d.y1,a.y2=d.y2,a.width=d.width,a.height=d.height;r||(a.canvas.width=a.width,a.canvas.height=a.height,a.canvas.style.left=a.x1+"px",a.canvas.style.top=a.y1+"px",(0<a.x1||0<a.y1)&&a.ctx.translate(-a.x1,-a.y1));a.layoutManager=new Ga(a.x1,a.y1,a.x2,a.y2,2)};p.prototype.renderIndexLabels=function(a){var d=a||this.plotArea.ctx,b=this.plotArea,c=0,e=0,g=0,m=0,l=c=m=e=g=0,w=0;for(a=0;a<this._indexLabels.length;a++){var h=this._indexLabels[a],s=h.chartType.toLowerCase(), +q,n,l=na("indexLabelFontColor",h.dataPoint,h.dataSeries),w=na("indexLabelFontSize",h.dataPoint,h.dataSeries);q=na("indexLabelFontFamily",h.dataPoint,h.dataSeries);n=na("indexLabelFontStyle",h.dataPoint,h.dataSeries);var m=na("indexLabelFontWeight",h.dataPoint,h.dataSeries),f=na("indexLabelBackgroundColor",h.dataPoint,h.dataSeries),e=na("indexLabelMaxWidth",h.dataPoint,h.dataSeries),g=na("indexLabelWrap",h.dataPoint,h.dataSeries),B=na("indexLabelLineDashType",h.dataPoint,h.dataSeries),k=na("indexLabelLineColor", +h.dataPoint,h.dataSeries),p=u(h.dataPoint.indexLabelLineThickness)?u(h.dataSeries.options.indexLabelLineThickness)?0:h.dataSeries.options.indexLabelLineThickness:h.dataPoint.indexLabelLineThickness,c=0<p?Math.min(10,("normal"===this.plotInfo.axisPlacement?this.plotArea.height:this.plotArea.width)<<0):0,t={percent:null,total:null},C=null;if(0<=h.dataSeries.type.indexOf("stacked")||"pie"===h.dataSeries.type||"doughnut"===h.dataSeries.type)t=this.getPercentAndTotal(h.dataSeries,h.dataPoint);if(h.dataSeries.indexLabelFormatter|| +h.dataPoint.indexLabelFormatter)C={chart:this,dataSeries:h.dataSeries,dataPoint:h.dataPoint,index:h.indexKeyword,total:t.total,percent:t.percent};var x=h.dataPoint.indexLabelFormatter?h.dataPoint.indexLabelFormatter(C):h.dataPoint.indexLabel?this.replaceKeywordsWithValue(h.dataPoint.indexLabel,h.dataPoint,h.dataSeries,null,h.indexKeyword):h.dataSeries.indexLabelFormatter?h.dataSeries.indexLabelFormatter(C):h.dataSeries.indexLabel?this.replaceKeywordsWithValue(h.dataSeries.indexLabel,h.dataPoint,h.dataSeries, +null,h.indexKeyword):null;if(null!==x&&""!==x){var t=na("indexLabelPlacement",h.dataPoint,h.dataSeries),C=na("indexLabelOrientation",h.dataPoint,h.dataSeries),ma=h.direction,y=h.dataSeries.axisX,A=h.dataSeries.axisY,v=!1,f=new ka(d,{x:0,y:0,maxWidth:e?e:0.5*this.width,maxHeight:g?5*w:1.5*w,angle:"horizontal"===C?0:-90,text:x,padding:0,backgroundColor:f,horizontalAlign:"left",fontSize:w,fontFamily:q,fontWeight:m,fontColor:l,fontStyle:n,textBaseline:"top"});f.measureText();h.dataSeries.indexLabelMaxWidth= +f.maxWidth;if("stackedarea100"===s){if(h.point.x<b.x1||h.point.x>b.x2||h.point.y<b.y1-1||h.point.y>b.y2+1)continue}else if("rangearea"===s||"rangesplinearea"===s){if(h.dataPoint.x<y.viewportMinimum||h.dataPoint.x>y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)<A.viewportMinimum||Math.min.apply(null,h.dataPoint.y)>A.viewportMaximum)continue}else if(0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("bubble")||0<=s.indexOf("scatter")){if(h.dataPoint.x<y.viewportMinimum||h.dataPoint.x>y.viewportMaximum|| +h.dataPoint.y<A.viewportMinimum||h.dataPoint.y>A.viewportMaximum)continue}else if(0<=s.indexOf("column")||"waterfall"===s||"error"===s&&!h.axisSwapped){if(h.dataPoint.x<y.viewportMinimum||h.dataPoint.x>y.viewportMaximum||h.bounds.y1>b.y2||h.bounds.y2<b.y1)continue}else if(0<=s.indexOf("bar")||"error"===s){if(h.dataPoint.x<y.viewportMinimum||h.dataPoint.x>y.viewportMaximum||h.bounds.x1>b.x2||h.bounds.x2<b.x1)continue}else if("candlestick"===s||"ohlc"===s){if(h.dataPoint.x<y.viewportMinimum||h.dataPoint.x> +y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)<A.viewportMinimum||Math.min.apply(null,h.dataPoint.y)>A.viewportMaximum)continue}else if(h.dataPoint.x<y.viewportMinimum||h.dataPoint.x>y.viewportMaximum)continue;e=m=2;"horizontal"===C?(l=f.width,w=f.height):(w=f.width,l=f.height);if("normal"===this.plotInfo.axisPlacement){if(0<=s.indexOf("line")||0<=s.indexOf("area"))t="auto",m=4;else if(0<=s.indexOf("stacked"))"auto"===t&&(t="inside");else if("bubble"===s||"scatter"===s)t="inside";q=h.point.x- +l/2;"inside"!==t?(e=b.y1,g=b.y2,0<ma?(n=h.point.y-w-m-c,n<e&&(n="auto"===t?Math.max(h.point.y,e)+m+c:e+m+c,v=n+w>h.point.y)):(n=h.point.y+m+c,n>g-w-m-c&&(n="auto"===t?Math.min(h.point.y,g)-w-m-c:g-w-m-c,v=n<h.point.y))):(e=Math.max(h.bounds.y1,b.y1),g=Math.min(h.bounds.y2,b.y2),c=0<=s.indexOf("range")||"error"===s?0<ma?Math.max(h.bounds.y1,b.y1)+w/2+m:Math.min(h.bounds.y2,b.y2)-w/2-m:(Math.max(h.bounds.y1,b.y1)+Math.min(h.bounds.y2,b.y2))/2,0<ma?(n=Math.max(h.point.y,c)-w/2,n<e&&("bubble"===s||"scatter"=== +s)&&(n=Math.max(h.point.y-w-m,b.y1+m))):(n=Math.min(h.point.y,c)-w/2,n>g-w-m&&("bubble"===s||"scatter"===s)&&(n=Math.min(h.point.y+m,b.y2-w-m))),n=Math.min(n,g-w))}else 0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("scatter")?(t="auto",e=4):0<=s.indexOf("stacked")?"auto"===t&&(t="inside"):"bubble"===s&&(t="inside"),n=h.point.y-w/2,"inside"!==t?(m=b.x1,g=b.x2,0>ma?(q=h.point.x-l-e-c,q<m&&(q="auto"===t?Math.max(h.point.x,m)+e+c:m+e+c,v=q+l>h.point.x)):(q=h.point.x+e+c,q>g-l-e-c&&(q="auto"=== +t?Math.min(h.point.x,g)-l-e-c:g-l-e-c,v=q<h.point.x))):(m=Math.max(h.bounds.x1,b.x1),Math.min(h.bounds.x2,b.x2),c=0<=s.indexOf("range")||"error"===s?0>ma?Math.max(h.bounds.x1,b.x1)+l/2+e:Math.min(h.bounds.x2,b.x2)-l/2-e:(Math.max(h.bounds.x1,b.x1)+Math.min(h.bounds.x2,b.x2))/2,q=0>ma?Math.max(h.point.x,c)-l/2:Math.min(h.point.x,c)-l/2,q=Math.max(q,m));"vertical"===C&&(n+=w);f.x=q;f.y=n;f.render(!0);p&&("inside"!==t&&(0>s.indexOf("bar")&&("error"!==s||!h.axisSwapped)&&h.point.x>b.x1&&h.point.x<b.x2|| +!v)&&(0>s.indexOf("column")&&("error"!==s||h.axisSwapped)&&h.point.y>b.y1&&h.point.y<b.y2||!v))&&(d.lineWidth=p,d.strokeStyle=k?k:"gray",d.setLineDash&&d.setLineDash(R(B,p)),d.beginPath(),d.moveTo(h.point.x,h.point.y),0<=s.indexOf("bar")||"error"===s&&h.axisSwapped?d.lineTo(q+(0<h.direction?0:l),n+("horizontal"===C?w:-w)/2):0<=s.indexOf("column")||"error"===s&&!h.axisSwapped?d.lineTo(q+l/2,n+((0<h.direction?w:-w)+("horizontal"===C?w:-w))/2):d.lineTo(q+l/2,n+((n<h.point.y?w:-w)+("horizontal"===C?w: +-w))/2),d.stroke())}}d={source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0,startTimePercent:0.7};for(a=0;a<this._indexLabels.length;a++)h=this._indexLabels[a],f=na("indexLabelBackgroundColor",h.dataPoint,h.dataSeries),h.dataSeries.indexLabelBackgroundColor=u(f)?r?"transparent":null:f;return d};p.prototype.renderLine=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= +this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;l<a.dataSeriesIndexes.length;l++){var w=a.dataSeriesIndexes[l],h=this.data[w];b.lineWidth=h.lineThickness;var s=h.dataPoints,q="solid";if(b.setLineDash){var n=R(h.nullDataLineDashType,h.lineThickness),q=h.lineDashType,f=R(q,h.lineThickness);b.setLineDash(f)}var B=h.id;this._eventManager.objectMap[B]={objectType:"dataSeries",dataSeriesIndex:w};B=N(B);c.strokeStyle=B; +c.lineWidth=0<h.lineThickness?Math.max(h.lineThickness,4):0;var B=h._colorSet,k=B=h.lineColor=h.options.lineColor?h.options.lineColor:B[0];b.strokeStyle=B;var p=!0,t=0,C,x;b.beginPath();if(0<s.length){for(var u=!1,t=0;t<s.length;t++)if(C=s[t].x.getTime?s[t].x.getTime():s[t].x,!(C<a.axisX.dataInfo.viewPortMin||C>a.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0<t&&!(h.connectNullData||u||p)&&(b.stroke(),r&&c.stroke()),u=!0;else{C=a.axisX.convertValueToPixel(C);x= +a.axisY.convertValueToPixel(s[t].y);var y=h.dataPointIds[t];this._eventManager.objectMap[y]={id:y,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:t,x1:C,y1:x};p||u?(!p&&h.connectNullData?(b.setLineDash&&(h.options.nullDataLineDashType||q===h.lineDashType&&h.lineDashType!==h.nullDataLineDashType)&&(b.stroke(),b.beginPath(),b.moveTo(m.x,m.y),q=h.nullDataLineDashType,b.setLineDash(n)),b.lineTo(C,x),r&&c.lineTo(C,x)):(b.beginPath(),b.moveTo(C,x),r&&(c.beginPath(),c.moveTo(C,x))),u=p=!1):(b.lineTo(C, +x),r&&c.lineTo(C,x),0==t%500&&(b.stroke(),b.beginPath(),b.moveTo(C,x),r&&(c.stroke(),c.beginPath(),c.moveTo(C,x))));m={x:C,y:x};t<s.length-1&&(k!==(s[t].lineColor||B)||q!==(s[t].lineDashType||h.lineDashType))&&(b.stroke(),b.beginPath(),b.moveTo(C,x),k=s[t].lineColor||B,b.strokeStyle=k,b.setLineDash&&(s[t].lineDashType?(q=s[t].lineDashType,b.setLineDash(R(q,h.lineThickness))):(q=h.lineDashType,b.setLineDash(f))));if(0<s[t].markerSize||0<h.markerSize){var A=h.getMarkerProperties(t,C,x,b);g.push(A); +y=N(y);r&&g.push({x:C,y:x,ctx:c,type:A.type,size:A.size,color:y,borderColor:y,borderThickness:A.borderThickness})}(s[t].indexLabel||h.indexLabel||s[t].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"line",dataPoint:s[t],dataSeries:h,point:{x:C,y:x},direction:0>s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepLine=function(a){var d=a.targetCanvasCtx|| +this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;l<a.dataSeriesIndexes.length;l++){var w=a.dataSeriesIndexes[l],h=this.data[w];b.lineWidth=h.lineThickness;var s=h.dataPoints,q="solid";if(b.setLineDash){var n=R(h.nullDataLineDashType,h.lineThickness),q=h.lineDashType,f=R(q,h.lineThickness);b.setLineDash(f)}var B=h.id;this._eventManager.objectMap[B]= +{objectType:"dataSeries",dataSeriesIndex:w};B=N(B);c.strokeStyle=B;c.lineWidth=0<h.lineThickness?Math.max(h.lineThickness,4):0;var B=h._colorSet,k=B=h.lineColor=h.options.lineColor?h.options.lineColor:B[0];b.strokeStyle=B;var p=!0,t=0,C,x;b.beginPath();if(0<s.length){for(var u=!1,t=0;t<s.length;t++)if(C=s[t].getTime?s[t].x.getTime():s[t].x,!(C<a.axisX.dataInfo.viewPortMin||C>a.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0<t&&!(h.connectNullData||u||p)&&(b.stroke(), +r&&c.stroke()),u=!0;else{var y=x;C=a.axisX.convertValueToPixel(C);x=a.axisY.convertValueToPixel(s[t].y);var A=h.dataPointIds[t];this._eventManager.objectMap[A]={id:A,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:t,x1:C,y1:x};p||u?(!p&&h.connectNullData?(b.setLineDash&&(h.options.nullDataLineDashType||q===h.lineDashType&&h.lineDashType!==h.nullDataLineDashType)&&(b.stroke(),b.beginPath(),b.moveTo(m.x,m.y),q=h.nullDataLineDashType,b.setLineDash(n)),b.lineTo(C,y),b.lineTo(C,x),r&&(c.lineTo(C, +y),c.lineTo(C,x))):(b.beginPath(),b.moveTo(C,x),r&&(c.beginPath(),c.moveTo(C,x))),u=p=!1):(b.lineTo(C,y),r&&c.lineTo(C,y),b.lineTo(C,x),r&&c.lineTo(C,x),0==t%500&&(b.stroke(),b.beginPath(),b.moveTo(C,x),r&&(c.stroke(),c.beginPath(),c.moveTo(C,x))));m={x:C,y:x};t<s.length-1&&(k!==(s[t].lineColor||B)||q!==(s[t].lineDashType||h.lineDashType))&&(b.stroke(),b.beginPath(),b.moveTo(C,x),k=s[t].lineColor||B,b.strokeStyle=k,b.setLineDash&&(s[t].lineDashType?(q=s[t].lineDashType,b.setLineDash(R(q,h.lineThickness))): +(q=h.lineDashType,b.setLineDash(f))));if(0<s[t].markerSize||0<h.markerSize)y=h.getMarkerProperties(t,C,x,b),g.push(y),A=N(A),r&&g.push({x:C,y:x,ctx:c,type:y.type,size:y.size,color:A,borderColor:A,borderThickness:y.borderThickness});(s[t].indexLabel||h.indexLabel||s[t].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"stepLine",dataPoint:s[t],dataSeries:h,point:{x:C,y:x},direction:0>s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&& +(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation, +easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderSpline=function(a){function d(a){a=v(a,2);if(0<a.length){c.beginPath();r&&e.beginPath();c.moveTo(a[0].x,a[0].y);a[0].newStrokeStyle&&(c.strokeStyle=a[0].newStrokeStyle);a[0].newLineDashArray&&c.setLineDash(a[0].newLineDashArray);r&&e.moveTo(a[0].x,a[0].y);for(var b=0;b<a.length-3;b+=3)if(c.bezierCurveTo(a[b+1].x,a[b+1].y,a[b+2].x,a[b+2].y,a[b+3].x,a[b+3].y),r&&e.bezierCurveTo(a[b+1].x,a[b+1].y,a[b+2].x,a[b+2].y,a[b+3].x,a[b+3].y), +0<b&&0===b%3E3||a[b+3].newStrokeStyle||a[b+3].newLineDashArray)c.stroke(),c.beginPath(),c.moveTo(a[b+3].x,a[b+3].y),a[b+3].newStrokeStyle&&(c.strokeStyle=a[b+3].newStrokeStyle),a[b+3].newLineDashArray&&c.setLineDash(a[b+3].newLineDashArray),r&&(e.stroke(),e.beginPath(),e.moveTo(a[b+3].x,a[b+3].y));c.stroke();r&&e.stroke()}}var b=a.targetCanvasCtx||this.plotArea.ctx,c=r?this._preRenderCtx:b;if(!(0>=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx;c.save();var g=this.plotArea;c.beginPath(); +c.rect(g.x1,g.y1,g.width,g.height);c.clip();for(var m=[],l=0;l<a.dataSeriesIndexes.length;l++){var w=a.dataSeriesIndexes[l],h=this.data[w];c.lineWidth=h.lineThickness;var s=h.dataPoints,q="solid";if(c.setLineDash){var n=R(h.nullDataLineDashType,h.lineThickness),q=h.lineDashType,f=R(q,h.lineThickness);c.setLineDash(f)}var B=h.id;this._eventManager.objectMap[B]={objectType:"dataSeries",dataSeriesIndex:w};B=N(B);e.strokeStyle=B;e.lineWidth=0<h.lineThickness?Math.max(h.lineThickness,4):0;var B=h._colorSet, +k=B=h.lineColor=h.options.lineColor?h.options.lineColor:B[0];c.strokeStyle=B;var p=0,t,u,x=[];c.beginPath();if(0<s.length)for(u=!1,p=0;p<s.length;p++)if(t=s[p].getTime?s[p].x.getTime():s[p].x,!(t<a.axisX.dataInfo.viewPortMin||t>a.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[p].y)0<p&&!u&&(h.connectNullData?c.setLineDash&&(0<x.length&&(h.options.nullDataLineDashType||!s[p-1].lineDashType))&&(x[x.length-1].newLineDashArray=n,q=h.nullDataLineDashType):(d(x),x=[])),u=!0; +else{t=a.axisX.convertValueToPixel(t);u=a.axisY.convertValueToPixel(s[p].y);var ma=h.dataPointIds[p];this._eventManager.objectMap[ma]={id:ma,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:p,x1:t,y1:u};x[x.length]={x:t,y:u};p<s.length-1&&(k!==(s[p].lineColor||B)||q!==(s[p].lineDashType||h.lineDashType))&&(k=s[p].lineColor||B,x[x.length-1].newStrokeStyle=k,c.setLineDash&&(s[p].lineDashType?(q=s[p].lineDashType,x[x.length-1].newLineDashArray=R(q,h.lineThickness)):(q=h.lineDashType,x[x.length- +1].newLineDashArray=f)));if(0<s[p].markerSize||0<h.markerSize){var y=h.getMarkerProperties(p,t,u,c);m.push(y);ma=N(ma);r&&m.push({x:t,y:u,ctx:e,type:y.type,size:y.size,color:ma,borderColor:ma,borderThickness:y.borderThickness})}(s[p].indexLabel||h.indexLabel||s[p].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"spline",dataPoint:s[p],dataSeries:h,point:{x:t,y:u},direction:0>s[p].y===a.axisY.reversed?1:-1,color:B});u=!1}d(x)}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(g.x1,g.y1,g.width,g.height),e.beginPath());c.restore();c.beginPath();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width, +0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.dataPointWidth=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&s<g)&&(s=Math.max(this.options.dataPointWidth? +this.dataPointWidth:-Infinity,g));q<g&&(q=g);q>s&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;s<a.dataSeriesIndexes.length;s++){var n=a.dataSeriesIndexes[s],f=this.data[n],B=f.dataPoints;if(0<B.length)for(var p=5<q&&f.bevelEnabled?!0:!1,g=0;g<B.length;g++)if(B[g].getTime?w=B[g].x.getTime(): +w=B[g].x,!(w<a.axisX.dataInfo.viewPortMin||w>a.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){m=a.axisX.convertValueToPixel(w);l=a.axisY.convertValueToPixel(B[g].y);m=a.axisX.reversed?m+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:m-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var k=a.axisX.reversed?m-q<<0:m+q<<0,t;0<=B[g].y?t=h:(t=l,l=h);l>t&&(c=l,l=t,t=c);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,l,k,t,c,0,null,p&&0<=B[g].y, +0>B[g].y&&p,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:m,y1:l,x2:k,y2:t};c=N(c);r&&ea(this._eventManager.ghostCtx,m,l,k,t,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"column",dataPoint:B[g],dataSeries:f,point:{x:m+(k-m)/2,y:0>B[g].y===a.axisY.reversed?l:t},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:m, +y1:Math.min(l,t),x2:k,y2:Math.max(l,t)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore(); +return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:h<a.axisY.bounds.y1?a.axisY.bounds.y1:h>a.axisY.bounds.y2?a.axisY.bounds.y2:h}}};p.prototype.renderStackedColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth? +this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&s<h)&&(s=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,h));f<h&&(f=h);f>s&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;B<a.dataSeriesIndexes.length;B++){var k=a.dataSeriesIndexes[B], +p=this.data[k],t=p.dataPoints;if(0<t.length){var u=5<f&&p.bevelEnabled?!0:!1;b.strokeStyle="#4572A7 ";for(h=0;h<t.length;h++)if(c=t[h].x.getTime?t[h].x.getTime():t[h].x,!(c<a.axisX.dataInfo.viewPortMin||c>a.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0<t[h].y)l[c]=t[h].y+(l[c]?l[c]:0),0<l[c]&&(q=a.axisY.convertValueToPixel(l[c]), +y="undefined"!==typeof g[c]?g[c]:n,g[c]=q);else if(a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0>=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q="undefined"!==typeof m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;g[c]=A+(y-q)}else A=m[c]?m[c]:0,y=q+A,q=n+A,m[c]=A+(y-q);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1, +!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedColumn",dataPoint:t[h],dataSeries:p,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q, +y)},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx, +animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:n<a.axisY.bounds.y1?a.axisY.bounds.y1:n>a.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderStackedColumn100=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth: +this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&s<h)&&(s=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,h));f<h&&(f=h);f>s&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;B<a.dataSeriesIndexes.length;B++){var p=a.dataSeriesIndexes[B], +k=this.data[p],t=k.dataPoints;if(0<t.length)for(var u=5<f&&k.bevelEnabled?!0:!1,h=0;h<t.length;h++)if(c=t[h].x.getTime?t[h].x.getTime():t[h].x,!(c<a.axisX.dataInfo.viewPortMin||c>a.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);q=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0<t[h].y){l[c]=q+ +("undefined"!==typeof l[c]?l[c]:0);if(0>=l[c])continue;q=a.axisY.convertValueToPixel(l[c]);y=g[c]?g[c]:n;g[c]=q}else if(a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0>=t[h].y)w[c]=q+("undefined"!==typeof w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q=m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(q),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y1-q)&&(q=e.y1);g[c]=A+(y-q)}else A="undefined"!==typeof m[c]? +m[c]:0,y=q+A,q=n+A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y2-y)&&(y=e.y2),m[c]=A+(y-q);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&& +this._indexLabels.push({chartType:"stackedColumn100",dataPoint:t[h],dataSeries:k,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q,y)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&& +this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:n<a.axisY.bounds.y1?a.axisY.bounds.y1:n>a.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= +null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.options.dataPointWidth? +this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&s<g)&&(s=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,g));q<g&&(q=g);q>s&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height); +b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;s<a.dataSeriesIndexes.length;s++){var n=a.dataSeriesIndexes[s],f=this.data[n],B=f.dataPoints;if(0<B.length){var k=5<q&&f.bevelEnabled?!0:!1;b.strokeStyle="#4572A7 ";for(g=0;g<B.length;g++)if(B[g].getTime?w=B[g].x.getTime():w=B[g].x,!(w<a.axisX.dataInfo.viewPortMin||w>a.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){l=a.axisX.convertValueToPixel(w); +m=a.axisY.convertValueToPixel(B[g].y);l=a.axisX.reversed?l+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:l-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var p=a.axisX.reversed?l-q<<0:l+q<<0,t;0<=B[g].y?t=h:(t=m,m=h);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,t,l,m,p,c,0,null,k,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:t,y1:l,x2:m,y2:p};c= +N(c);r&&ea(this._eventManager.ghostCtx,t,l,m,p,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"bar",dataPoint:B[g],dataSeries:f,point:{x:0<=B[g].y?m:t,y:l+(p-l)/2},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(t,m),y1:l,x2:Math.max(t,m),y2:p},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas, +0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:h<a.axisY.bounds.x1?a.axisY.bounds.x1:h>a.axisY.bounds.x2?a.axisY.bounds.x2: +h}}};p.prototype.renderStackedBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<< +0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&q<h)&&(q=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,h));f< +h&&(f=h);f>q&&(f=q);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;B<a.dataSeriesIndexes.length;B++){var p=a.dataSeriesIndexes[B],k=this.data[p],t=k.dataPoints;if(0<t.length){var u=5<f&&k.bevelEnabled?!0:!1;b.strokeStyle="#4572A7 ";for(h=0;h<t.length;h++)if(c=t[h].x.getTime?t[h].x.getTime(): +t[h].x,!(c<a.axisX.dataInfo.viewPortMin||c>a.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0<t[h].y)l[c]=t[h].y+(l[c]?l[c]:0),0<l[c]&&(y=g[c]?g[c]:n,g[c]=s=a.axisY.convertValueToPixel(l[c]));else if(a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0>=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),s=m[c]? +m[c]:n,m[c]=y=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A=g[c]?g[c]:0;y=n+A;s+=A;g[c]=A+(s-y)}else A=m[c]?m[c]:0,y=s-A,s=n-A,m[c]=A+(s-y);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,y,x,s,v,c,0,null,u,!1,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:y,y1:x,x2:s,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,y,x,s,v,c,0,null,!1,!1,!1, +!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar",dataPoint:t[h],dataSeries:k,point:{x:0<=t[h].y?s:y,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(y,s),y1:x,x2:Math.max(y,s),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:n<a.axisY.bounds.x1?a.axisY.bounds.x1:n>a.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderStackedBar100=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)|| +(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&q<h)&&(q=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,h));f<h&&(f=h);f>q&&(f=q);b.save();r&&this._eventManager.ghostCtx.save(); +b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;B<a.dataSeriesIndexes.length;B++){var k=a.dataSeriesIndexes[B],p=this.data[k],t=p.dataPoints;if(0<t.length){var u=5<f&&p.bevelEnabled?!0:!1;b.strokeStyle="#4572A7 ";for(h=0;h<t.length;h++)if(c=t[h].x.getTime?t[h].x.getTime():t[h].x,!(c<a.axisX.dataInfo.viewPortMin||c>a.axisX.dataInfo.viewPortMax)&& +"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x;x=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var v=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,y=v+f<<0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0<t[h].y){l[c]=x+(l[c]?l[c]:0);if(0>=l[c])continue;x=g[c]?g[c]:n;g[c]=s=a.axisY.convertValueToPixel(l[c])}else if(a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0>=t[h].y)w[c]=x+(w[c]?w[c]:0),s=m[c]?m[c]: +n,m[c]=x=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(x),0<=t[h].y){var A=g[c]?g[c]:0;x=n+A;s+=A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x2-s)&&(s=e.x2);g[c]=A+(s-x)}else A=m[c]?m[c]:0,x=s-A,s=n-A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x1-x)&&(x=e.x1),m[c]=A+(s-x);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,v,s,y,c,0,null,u,!1,!1,!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k, +dataPointIndex:h,x1:x,y1:v,x2:s,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,v,s,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar100",dataPoint:t[h],dataSeries:p,point:{x:0<=t[h].y?s:x,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(x,s),y1:v,x2:Math.max(x,s),y2:y},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop", +a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:n<a.axisY.bounds.x1?a.axisY.bounds.x1: +n>a.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderArea=function(a){var d,b;function c(){A&&(0<B.lineThickness&&g.stroke(),a.axisY.logarithmic||0>=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0<a.axisY.viewportMinimum&&(y=l.y2),g.lineTo(t,y),g.lineTo(A.x,y),g.closePath(),g.globalAlpha=B.fillOpacity,g.fill(),g.globalAlpha=1,r&&(m.lineTo(t,y),m.lineTo(A.x,y),m.closePath(),m.fill()),g.beginPath(),g.moveTo(t,u),m.beginPath(),m.moveTo(t,u),A={x:t,y:u})} +var e=a.targetCanvasCtx||this.plotArea.ctx,g=r?this._preRenderCtx:e;if(!(0>=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;n<a.dataSeriesIndexes.length;n++){var f=a.dataSeriesIndexes[n],B=this.data[f],p=B.dataPoints,h=B.id;this._eventManager.objectMap[h]={objectType:"dataSeries", +dataSeriesIndex:f};h=N(h);m.fillStyle=h;h=[];d=!0;var k=0,t,u,x,v=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),y,A=null;if(0<p.length){var z=B._colorSet[k%B._colorSet.length],aa=B.lineColor=B.options.lineColor||z,T=aa;g.fillStyle=z;g.strokeStyle=aa;g.lineWidth=B.lineThickness;b="solid";if(g.setLineDash){var Y=R(B.nullDataLineDashType,B.lineThickness);b=B.lineDashType;var ca=R(b,B.lineThickness);g.setLineDash(ca)}for(var da=!0;k<p.length;k++)if(x=p[k].x.getTime?p[k].x.getTime(): +p[k].x,!(x<a.axisX.dataInfo.viewPortMin||x>a.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!da)))if("number"!==typeof p[k].y)B.connectNullData||(da||d)||c(),da=!0;else{t=a.axisX.convertValueToPixel(x);u=a.axisY.convertValueToPixel(p[k].y);d||da?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||b===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d=t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,b=B.nullDataLineDashType,g.setLineDash(Y)),g.lineTo(t,u),r&&m.lineTo(t, +u)):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),da=d=!1):(g.lineTo(t,u),r&&m.lineTo(t,u),0==k%250&&c());q={x:t,y:u};k<p.length-1&&(T!==(p[k].lineColor||aa)||b!==(p[k].lineDashType||B.lineDashType))&&(c(),T=p[k].lineColor||aa,g.strokeStyle=T,g.setLineDash&&(p[k].lineDashType?(b=p[k].lineDashType,g.setLineDash(R(b,B.lineThickness))):(b=B.lineDashType,g.setLineDash(ca))));var Z=B.dataPointIds[k];this._eventManager.objectMap[Z]={id:Z,objectType:"dataPoint",dataSeriesIndex:f, +dataPointIndex:k,x1:t,y1:u};0!==p[k].markerSize&&(0<p[k].markerSize||0<B.markerSize)&&(x=B.getMarkerProperties(k,t,u,g),h.push(x),Z=N(Z),r&&h.push({x:t,y:u,ctx:m,type:x.type,size:x.size,color:Z,borderColor:Z,borderThickness:x.borderThickness}));(p[k].indexLabel||B.indexLabel||p[k].indexLabelFormatter||B.indexLabelFormatter)&&this._indexLabels.push({chartType:"area",dataPoint:p[k],dataSeries:B,point:{x:t,y:u},direction:0>p[k].y===a.axisY.reversed?1:-1,color:z})}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderSplineArea=function(a){function d(){var b=v(x,2);if(0<b.length){if(0<q.lineThickness){c.beginPath();c.moveTo(b[0].x,b[0].y);b[0].newStrokeStyle&&(c.strokeStyle=b[0].newStrokeStyle);b[0].newLineDashArray&&c.setLineDash(b[0].newLineDashArray);for(var d=0;d<b.length-3;d+=3)if(c.bezierCurveTo(b[d+1].x,b[d+1].y,b[d+2].x,b[d+2].y,b[d+3].x,b[d+3].y),r&&e.bezierCurveTo(b[d+1].x,b[d+1].y,b[d+2].x,b[d+2].y,b[d+3].x,b[d+3].y),b[d+3].newStrokeStyle||b[d+3].newLineDashArray)c.stroke(), +c.beginPath(),c.moveTo(b[d+3].x,b[d+3].y),b[d+3].newStrokeStyle&&(c.strokeStyle=b[d+3].newStrokeStyle),b[d+3].newLineDashArray&&c.setLineDash(b[d+3].newLineDashArray);c.stroke()}c.beginPath();c.moveTo(b[0].x,b[0].y);r&&(e.beginPath(),e.moveTo(b[0].x,b[0].y));for(d=0;d<b.length-3;d+=3)c.bezierCurveTo(b[d+1].x,b[d+1].y,b[d+2].x,b[d+2].y,b[d+3].x,b[d+3].y),r&&e.bezierCurveTo(b[d+1].x,b[d+1].y,b[d+2].x,b[d+2].y,b[d+3].x,b[d+3].y);a.axisY.logarithmic||0>=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum? +t=p:0>a.axisY.viewportMaximum?t=m.y1:0<a.axisY.viewportMinimum&&(t=g.y2);u={x:b[0].x,y:b[0].y};c.lineTo(b[b.length-1].x,t);c.lineTo(u.x,t);c.closePath();c.globalAlpha=q.fillOpacity;c.fill();c.globalAlpha=1;r&&(e.lineTo(b[b.length-1].x,t),e.lineTo(u.x,t),e.closePath(),e.fill())}}var b=a.targetCanvasCtx||this.plotArea.ctx,c=r?this._preRenderCtx:b;if(!(0>=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=a.axisX.lineCoordinates,m=a.axisY.lineCoordinates,l=[],w=this.plotArea;c.save();r&& +e.save();c.beginPath();c.rect(w.x1,w.y1,w.width,w.height);c.clip();r&&(e.beginPath(),e.rect(w.x1,w.y1,w.width,w.height),e.clip());for(var h=0;h<a.dataSeriesIndexes.length;h++){var s=a.dataSeriesIndexes[h],q=this.data[s],n=q.dataPoints,l=q.id;this._eventManager.objectMap[l]={objectType:"dataSeries",dataSeriesIndex:s};l=N(l);e.fillStyle=l;var l=[],f=0,B,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),t,u=null,x=[];if(0<n.length){var ma=q._colorSet[f%q._colorSet.length], +y=q.lineColor=q.options.lineColor||ma,A=y;c.fillStyle=ma;c.strokeStyle=y;c.lineWidth=q.lineThickness;var z="solid";if(c.setLineDash){var aa=R(q.nullDataLineDashType,q.lineThickness),z=q.lineDashType,T=R(z,q.lineThickness);c.setLineDash(T)}for(k=!1;f<n.length;f++)if(B=n[f].x.getTime?n[f].x.getTime():n[f].x,!(B<a.axisX.dataInfo.viewPortMin||B>a.axisX.dataInfo.viewPortMax&&(!q.connectNullData||!k)))if("number"!==typeof n[f].y)0<f&&!k&&(q.connectNullData?c.setLineDash&&(0<x.length&&(q.options.nullDataLineDashType|| +!n[f-1].lineDashType))&&(x[x.length-1].newLineDashArray=aa,z=q.nullDataLineDashType):(d(),x=[])),k=!0;else{B=a.axisX.convertValueToPixel(B);k=a.axisY.convertValueToPixel(n[f].y);var Y=q.dataPointIds[f];this._eventManager.objectMap[Y]={id:Y,objectType:"dataPoint",dataSeriesIndex:s,dataPointIndex:f,x1:B,y1:k};x[x.length]={x:B,y:k};f<n.length-1&&(A!==(n[f].lineColor||y)||z!==(n[f].lineDashType||q.lineDashType))&&(A=n[f].lineColor||y,x[x.length-1].newStrokeStyle=A,c.setLineDash&&(n[f].lineDashType?(z= +n[f].lineDashType,x[x.length-1].newLineDashArray=R(z,q.lineThickness)):(z=q.lineDashType,x[x.length-1].newLineDashArray=T)));if(0!==n[f].markerSize&&(0<n[f].markerSize||0<q.markerSize)){var ca=q.getMarkerProperties(f,B,k,c);l.push(ca);Y=N(Y);r&&l.push({x:B,y:k,ctx:e,type:ca.type,size:ca.size,color:Y,borderColor:Y,borderThickness:ca.borderThickness})}(n[f].indexLabel||q.indexLabel||n[f].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"splineArea",dataPoint:n[f],dataSeries:q, +point:{x:B,y:k},direction:0>n[f].y===a.axisY.reversed?1:-1,color:ma});k=!1}d();ia.drawMarkers(l)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(w.x1,w.y1,w.width,w.height), +this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepArea=function(a){var d,b;function c(){A&&(0<B.lineThickness&&g.stroke(),a.axisY.logarithmic||0>=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0<a.axisY.viewportMinimum&&(y=l.y2),g.lineTo(t,y),g.lineTo(A.x,y),g.closePath(),g.globalAlpha=B.fillOpacity,g.fill(),g.globalAlpha= +1,r&&(m.lineTo(t,y),m.lineTo(A.x,y),m.closePath(),m.fill()),g.beginPath(),g.moveTo(t,u),m.beginPath(),m.moveTo(t,u),A={x:t,y:u})}var e=a.targetCanvasCtx||this.plotArea.ctx,g=r?this._preRenderCtx:e;if(!(0>=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;n<a.dataSeriesIndexes.length;n++){var f= +a.dataSeriesIndexes[n],B=this.data[f],k=B.dataPoints,h=B.id;this._eventManager.objectMap[h]={objectType:"dataSeries",dataSeriesIndex:f};h=N(h);m.fillStyle=h;h=[];d=!0;var p=0,t,u,x,v=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),y,A=null;b=!1;if(0<k.length){var z=B._colorSet[p%B._colorSet.length],aa=B.lineColor=B.options.lineColor||z,T=aa;g.fillStyle=z;g.strokeStyle=aa;g.lineWidth=B.lineThickness;var Y="solid";if(g.setLineDash){var ca=R(B.nullDataLineDashType,B.lineThickness), +Y=B.lineDashType,da=R(Y,B.lineThickness);g.setLineDash(da)}for(;p<k.length;p++)if(x=k[p].x.getTime?k[p].x.getTime():k[p].x,!(x<a.axisX.dataInfo.viewPortMin||x>a.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!b))){var Z=u;"number"!==typeof k[p].y?(B.connectNullData||(b||d)||c(),b=!0):(t=a.axisX.convertValueToPixel(x),u=a.axisY.convertValueToPixel(k[p].y),d||b?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||Y===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d= +t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,Y=B.nullDataLineDashType,g.setLineDash(ca)),g.lineTo(t,Z),g.lineTo(t,u),r&&(m.lineTo(t,Z),m.lineTo(t,u))):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),b=d=!1):(g.lineTo(t,Z),r&&m.lineTo(t,Z),g.lineTo(t,u),r&&m.lineTo(t,u),0==p%250&&c()),q={x:t,y:u},p<k.length-1&&(T!==(k[p].lineColor||aa)||Y!==(k[p].lineDashType||B.lineDashType))&&(c(),T=k[p].lineColor||aa,g.strokeStyle=T,g.setLineDash&&(k[p].lineDashType?(Y=k[p].lineDashType, +g.setLineDash(R(Y,B.lineThickness))):(Y=B.lineDashType,g.setLineDash(da)))),x=B.dataPointIds[p],this._eventManager.objectMap[x]={id:x,objectType:"dataPoint",dataSeriesIndex:f,dataPointIndex:p,x1:t,y1:u},0!==k[p].markerSize&&(0<k[p].markerSize||0<B.markerSize)&&(Z=B.getMarkerProperties(p,t,u,g),h.push(Z),x=N(x),r&&h.push({x:t,y:u,ctx:m,type:Z.type,size:Z.size,color:x,borderColor:x,borderThickness:Z.borderThickness})),(k[p].indexLabel||B.indexLabel||k[p].indexLabelFormatter||B.indexLabelFormatter)&& +this._indexLabels.push({chartType:"stepArea",dataPoint:k[p],dataSeries:B,point:{x:t,y:u},direction:0>k[p].y===a.axisY.reversed?1:-1,color:z}))}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea=function(a){function d(){if(!(1>h.length)){for(0<A.lineThickness&&c.stroke();0<h.length;){var a=h.pop();c.lineTo(a.x,a.y);r&&u.lineTo(a.x,a.y)}c.closePath();c.globalAlpha=A.fillOpacity;c.fill();c.globalAlpha=1;c.beginPath();r&&(u.closePath(), +u.fill(),u.beginPath());h=[]}}var b=a.targetCanvasCtx||this.plotArea.ctx,c=r?this._preRenderCtx:b;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=[],l=this.plotArea,w=[],h=[],s=[],q=[],n=0,f,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),u=this._eventManager.ghostCtx,t,C,x;r&&u.beginPath();c.save();r&&u.save();c.beginPath();c.rect(l.x1,l.y1,l.width,l.height);c.clip();r&&(u.beginPath(),u.rect(l.x1,l.y1,l.width,l.height),u.clip());for(var e=[],v=0;v<a.dataSeriesIndexes.length;v++){var y= +a.dataSeriesIndexes[v],A=this.data[y],z=A.dataPoints;A.dataPointIndexes=[];for(n=0;n<z.length;n++)y=z[n].x.getTime?z[n].x.getTime():z[n].x,A.dataPointIndexes[y]=n,e[y]||(s.push(y),e[y]=!0);s.sort(Sa)}for(v=0;v<a.dataSeriesIndexes.length;v++){y=a.dataSeriesIndexes[v];A=this.data[y];z=A.dataPoints;C=!0;h=[];n=A.id;this._eventManager.objectMap[n]={objectType:"dataSeries",dataSeriesIndex:y};n=N(n);u.fillStyle=n;if(0<s.length){var e=A._colorSet[0],aa=A.lineColor=A.options.lineColor||e,T=aa;c.fillStyle= +e;c.strokeStyle=aa;c.lineWidth=A.lineThickness;x="solid";if(c.setLineDash){var Y=R(A.nullDataLineDashType,A.lineThickness);x=A.lineDashType;var ca=R(x,A.lineThickness);c.setLineDash(ca)}for(var da=!0,n=0;n<s.length;n++){var g=s[n],Z=null,Z=0<=A.dataPointIndexes[g]?z[A.dataPointIndexes[g]]:{x:g,y:null};if(!(g<a.axisX.dataInfo.viewPortMin||g>a.axisX.dataInfo.viewPortMax&&(!A.connectNullData||!da)))if("number"!==typeof Z.y)A.connectNullData||(da||C)||d(),da=!0;else{f=a.axisX.convertValueToPixel(g);var oa= +w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length){q[g]=Z.y+(q[g]?q[g]:0);if(0>=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(Z.y),k-=oa;h.push({x:f,y:p-oa});w[g]=p-k;C||da?(!C&&A.connectNullData?(c.setLineDash&&(A.options.nullDataLineDashType||x===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(C=h.pop(),x=h[h.length-1],d(),c.moveTo(t.x,t.y),h.push(x),h.push(C),x=A.nullDataLineDashType, +c.setLineDash(Y)),c.lineTo(f,k),r&&u.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(u.beginPath(),u.moveTo(f,k))),da=C=!1):(c.lineTo(f,k),r&&u.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&u.moveTo(f,k),h.push({x:f,y:p-oa})));t={x:f,y:k};n<z.length-1&&(T!==(z[n].lineColor||aa)||x!==(z[n].lineDashType||A.lineDashType))&&(d(),c.beginPath(),c.moveTo(f,k),h.push({x:f,y:p-oa}),T=z[n].lineColor||aa,c.strokeStyle=T,c.setLineDash&&(z[n].lineDashType?(x=z[n].lineDashType,c.setLineDash(R(x,A.lineThickness))): +(x=A.lineDashType,c.setLineDash(ca))));if(0<=A.dataPointIndexes[g]){var la=A.dataPointIds[A.dataPointIndexes[g]];this._eventManager.objectMap[la]={id:la,objectType:"dataPoint",dataSeriesIndex:y,dataPointIndex:A.dataPointIndexes[g],x1:f,y1:k}}0<=A.dataPointIndexes[g]&&0!==Z.markerSize&&(0<Z.markerSize||0<A.markerSize)&&(oa=A.getMarkerProperties(A.dataPointIndexes[g],f,k,c),m.push(oa),g=N(la),r&&m.push({x:f,y:k,ctx:u,type:oa.type,size:oa.size,color:g,borderColor:g,borderThickness:oa.borderThickness})); +(Z.indexLabel||A.indexLabel||Z.indexLabelFormatter||A.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedArea",dataPoint:Z,dataSeries:A,point:{x:f,y:k},direction:0>z[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&u.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(l.x1,l.y1,l.width,l.height),u.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea100=function(a){function d(){for(0<A.lineThickness&&c.stroke();0<h.length;){var a=h.pop();c.lineTo(a.x,a.y);r&&x.lineTo(a.x, +a.y)}c.closePath();c.globalAlpha=A.fillOpacity;c.fill();c.globalAlpha=1;c.beginPath();r&&(x.closePath(),x.fill(),x.beginPath());h=[]}var b=a.targetCanvasCtx||this.plotArea.ctx,c=r?this._preRenderCtx:b;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=[],w=[],h=[],s=[],q=[],n=0,f,k,p,u,t,C=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),x=this._eventManager.ghostCtx;c.save();r&&x.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(x.beginPath(), +x.rect(m.x1,m.y1,m.width,m.height),x.clip());for(var e=[],v=0;v<a.dataSeriesIndexes.length;v++){var y=a.dataSeriesIndexes[v],A=this.data[y],z=A.dataPoints;A.dataPointIndexes=[];for(n=0;n<z.length;n++)y=z[n].x.getTime?z[n].x.getTime():z[n].x,A.dataPointIndexes[y]=n,e[y]||(s.push(y),e[y]=!0);s.sort(Sa)}for(v=0;v<a.dataSeriesIndexes.length;v++){y=a.dataSeriesIndexes[v];A=this.data[y];z=A.dataPoints;u=!0;e=A.id;this._eventManager.objectMap[e]={objectType:"dataSeries",dataSeriesIndex:y};e=N(e);x.fillStyle= +e;h=[];if(0<s.length){var e=A._colorSet[n%A._colorSet.length],aa=A.lineColor=A.options.lineColor||e,T=aa;c.fillStyle=e;c.strokeStyle=aa;c.lineWidth=A.lineThickness;t="solid";if(c.setLineDash){var Y=R(A.nullDataLineDashType,A.lineThickness);t=A.lineDashType;var ca=R(t,A.lineThickness);c.setLineDash(ca)}for(var da=!0,n=0;n<s.length;n++){var g=s[n],Z=null,Z=0<=A.dataPointIndexes[g]?z[A.dataPointIndexes[g]]:{x:g,y:null};if(!(g<a.axisX.dataInfo.viewPortMin||g>a.axisX.dataInfo.viewPortMax&&(!A.connectNullData|| +!da)))if("number"!==typeof Z.y)A.connectNullData||(da||u)||d(),da=!0;else{var oa;oa=0!==a.dataPointYSums[g]?100*(Z.y/a.dataPointYSums[g]):0;f=a.axisX.convertValueToPixel(g);var la=w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length){q[g]=oa+(q[g]?q[g]:0);if(0>=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(oa),k-=la;h.push({x:f,y:C-la});w[g]=C-k;u||da?(!u&&A.connectNullData?(c.setLineDash&& +(A.options.nullDataLineDashType||t===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(u=h.pop(),t=h[h.length-1],d(),c.moveTo(p.x,p.y),h.push(t),h.push(u),t=A.nullDataLineDashType,c.setLineDash(Y)),c.lineTo(f,k),r&&x.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(x.beginPath(),x.moveTo(f,k))),da=u=!1):(c.lineTo(f,k),r&&x.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&x.moveTo(f,k),h.push({x:f,y:C-la})));p={x:f,y:k};n<z.length-1&&(T!==(z[n].lineColor||aa)||t!==(z[n].lineDashType||A.lineDashType))&& +(d(),c.beginPath(),c.moveTo(f,k),h.push({x:f,y:C-la}),T=z[n].lineColor||aa,c.strokeStyle=T,c.setLineDash&&(z[n].lineDashType?(t=z[n].lineDashType,c.setLineDash(R(t,A.lineThickness))):(t=A.lineDashType,c.setLineDash(ca))));if(0<=A.dataPointIndexes[g]){var G=A.dataPointIds[A.dataPointIndexes[g]];this._eventManager.objectMap[G]={id:G,objectType:"dataPoint",dataSeriesIndex:y,dataPointIndex:A.dataPointIndexes[g],x1:f,y1:k}}0<=A.dataPointIndexes[g]&&0!==Z.markerSize&&(0<Z.markerSize||0<A.markerSize)&&(la= +A.getMarkerProperties(n,f,k,c),l.push(la),g=N(G),r&&l.push({x:f,y:k,ctx:x,type:la.type,size:la.size,color:g,borderColor:g,borderThickness:la.borderThickness}));(Z.indexLabel||A.indexLabel||Z.indexLabelFormatter||A.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedArea100",dataPoint:Z,dataSeries:A,point:{x:f,y:k},direction:0>z[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&x.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(l);r&&(b.drawImage(this._preRenderCanvas,0, +0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),x.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}}; +p.prototype.renderBubble=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=-Infinity,w=Infinity,h=0;h<a.dataSeriesIndexes.length;h++)for(var s=a.dataSeriesIndexes[h], +q=this.data[s],n=q.dataPoints,f=0,e=0;e<n.length;e++)g=n[e].getTime?g=n[e].x.getTime():g=n[e].x,g<a.axisX.dataInfo.viewPortMin||g>a.axisX.dataInfo.viewPortMax||"undefined"===typeof n[e].z||(f=n[e].z,f>l&&(l=f),f<w&&(w=f));for(var k=25*Math.PI,p=Math.max(Math.pow(0.25*Math.min(c.height,c.width)/2,2)*Math.PI,k),h=0;h<a.dataSeriesIndexes.length;h++)if(s=a.dataSeriesIndexes[h],q=this.data[s],n=q.dataPoints,0<n.length)for(b.strokeStyle="#4572A7 ",e=0;e<n.length;e++)if(g=n[e].getTime?g=n[e].x.getTime(): +g=n[e].x,!(g<a.axisX.dataInfo.viewPortMin||g>a.axisX.dataInfo.viewPortMax)&&"number"===typeof n[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(n[e].y);var f=n[e].z,u=2*Math.max(Math.sqrt((l===w?p/2:k+(p-k)/(l-w)*(f-w))/Math.PI)<<0,1),f=q.getMarkerProperties(e,b);f.size=u;b.globalAlpha=q.fillOpacity;ia.drawMarker(g,m,b,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;var t=q.dataPointIds[e];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:s, +dataPointIndex:e,x1:g,y1:m,size:u};u=N(t);r&&ia.drawMarker(g,m,this._eventManager.ghostCtx,f.type,f.size,u,u,f.borderThickness);(n[e].indexLabel||q.indexLabel||n[e].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"bubble",dataPoint:n[e],dataSeries:q,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/2,x2:g+f.size/2,y2:m+f.size/2},color:null})}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderScatter=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=0;l<a.dataSeriesIndexes.length;l++){var w=a.dataSeriesIndexes[l],h=this.data[w],s=h.dataPoints;if(0<s.length){b.strokeStyle= +"#4572A7 ";Math.pow(0.3*Math.min(c.height,c.width)/2,2);for(var q=0,n=0,e=0;e<s.length;e++)if(g=s[e].getTime?g=s[e].x.getTime():g=s[e].x,!(g<a.axisX.dataInfo.viewPortMin||g>a.axisX.dataInfo.viewPortMax)&&"number"===typeof s[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(s[e].y);var f=h.getMarkerProperties(e,g,m,b);b.globalAlpha=h.fillOpacity;ia.drawMarker(f.x,f.y,f.ctx,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;Math.sqrt((q-g)*(q-g)+(n-m)*(n-m))<Math.min(f.size, +5)&&s.length>Math.min(this.plotArea.width,this.plotArea.height)||(q=h.dataPointIds[e],this._eventManager.objectMap[q]={id:q,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:e,x1:g,y1:m},q=N(q),r&&ia.drawMarker(f.x,f.y,this._eventManager.ghostCtx,f.type,f.size,q,q,f.borderThickness),(s[e].indexLabel||h.indexLabel||s[e].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"scatter",dataPoint:s[e],dataSeries:h,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/ +2,x2:g+f.size/2,y2:m+f.size/2},color:null}),q=g,n=m)}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore()); +b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderCandlestick=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=0,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,g=this.options.dataPointMaxWidth? +this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*m.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&&e>g&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,g));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&g<e)&&(g=Math.max(this.options.dataPointWidth? +this.dataPointWidth:-Infinity,e));k<e&&(k=e);k>g&&(k=g);b.save();r&&c.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(c.beginPath(),c.rect(m.x1,m.y1,m.width,m.height),c.clip());for(var p=0;p<a.dataSeriesIndexes.length;p++){var v=a.dataSeriesIndexes[p],t=this.data[v],C=t.dataPoints;if(0<C.length)for(var x=5<k&&t.bevelEnabled?!0:!1,l=0;l<C.length;l++)if(C[l].getTime?f=C[l].x.getTime():f=C[l].x,!(f<a.axisX.dataInfo.viewPortMin||f>a.axisX.dataInfo.viewPortMax)&&!u(C[l].y)&&C[l].y.length&& +"number"===typeof C[l].y[0]&&"number"===typeof C[l].y[1]&&"number"===typeof C[l].y[2]&&"number"===typeof C[l].y[3]){w=a.axisX.convertValueToPixel(f);h=a.axisY.convertValueToPixel(C[l].y[0]);s=a.axisY.convertValueToPixel(C[l].y[1]);q=a.axisY.convertValueToPixel(C[l].y[2]);n=a.axisY.convertValueToPixel(C[l].y[3]);var z=w-k/2<<0,y=z+k<<0,g=t.options.fallingColor?t.fallingColor:t._colorSet[0],e=C[l].color?C[l].color:t._colorSet[0],A=Math.round(Math.max(1,0.15*k)),D=0===A%2?0:0.5,aa=t.dataPointIds[l]; +this._eventManager.objectMap[aa]={id:aa,objectType:"dataPoint",dataSeriesIndex:v,dataPointIndex:l,x1:z,y1:h,x2:y,y2:s,x3:w,y3:q,x4:w,y4:n,borderThickness:A,color:e};b.strokeStyle=e;b.beginPath();b.lineWidth=A;c.lineWidth=Math.max(A,4);"candlestick"===t.type?(b.moveTo(w-D,s),b.lineTo(w-D,Math.min(h,n)),b.stroke(),b.moveTo(w-D,Math.max(h,n)),b.lineTo(w-D,q),b.stroke(),ea(b,z,Math.min(h,n),y,Math.max(h,n),C[l].y[0]<=C[l].y[3]?t.risingColor:g,A,e,x,x,!1,!1,t.fillOpacity),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w- +D,s),c.lineTo(w-D,Math.min(h,n)),c.stroke(),c.moveTo(w-D,Math.max(h,n)),c.lineTo(w-D,q),c.stroke(),ea(c,z,Math.min(h,n),y,Math.max(h,n),e,0,null,!1,!1,!1,!1))):"ohlc"===t.type&&(b.moveTo(w-D,s),b.lineTo(w-D,q),b.stroke(),b.beginPath(),b.moveTo(w,h),b.lineTo(z,h),b.stroke(),b.beginPath(),b.moveTo(w,n),b.lineTo(y,n),b.stroke(),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w-D,s),c.lineTo(w-D,q),c.stroke(),c.beginPath(),c.moveTo(w,h),c.lineTo(z,h),c.stroke(),c.beginPath(),c.moveTo(w,n),c.lineTo(y,n),c.stroke())); +(C[l].indexLabel||t.indexLabel||C[l].indexLabelFormatter||t.indexLabelFormatter)&&this._indexLabels.push({chartType:t.type,dataPoint:C[l],dataSeries:t,point:{x:z+(y-z)/2,y:a.axisY.reversed?q:s},direction:1,bounds:{x1:z,y1:Math.min(s,q),x2:y,y2:Math.max(s,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas, +0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderBoxAndWhisker=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e= +null,g=this.plotArea,m=0,l,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*g.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&& +e>m&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&m<e)&&(m=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,e));k<e&&(k=e);k>m&&(k=m);b.save();r&&c.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(c.beginPath(),c.rect(g.x1,g.y1,g.width,g.height),c.clip());for(var p=!1,p=!!a.axisY.reversed,v=0;v<a.dataSeriesIndexes.length;v++){var t=a.dataSeriesIndexes[v],C=this.data[t],x=C.dataPoints; +if(0<x.length)for(var z=5<k&&C.bevelEnabled?!0:!1,m=0;m<x.length;m++)if(x[m].getTime?f=x[m].x.getTime():f=x[m].x,!(f<a.axisX.dataInfo.viewPortMin||f>a.axisX.dataInfo.viewPortMax)&&!u(x[m].y)&&x[m].y.length&&"number"===typeof x[m].y[0]&&"number"===typeof x[m].y[1]&&"number"===typeof x[m].y[2]&&"number"===typeof x[m].y[3]&&"number"===typeof x[m].y[4]&&5===x[m].y.length){l=a.axisX.convertValueToPixel(f);w=a.axisY.convertValueToPixel(x[m].y[0]);h=a.axisY.convertValueToPixel(x[m].y[1]);s=a.axisY.convertValueToPixel(x[m].y[2]); +q=a.axisY.convertValueToPixel(x[m].y[3]);n=a.axisY.convertValueToPixel(x[m].y[4]);var y=l-k/2<<0,A=l+k/2<<0,e=x[m].color?x[m].color:C._colorSet[0],D=Math.round(Math.max(1,0.15*k)),aa=0===D%2?0:0.5,T=x[m].whiskerColor?x[m].whiskerColor:x[m].color?C.whiskerColor?C.whiskerColor:x[m].color:C.whiskerColor?C.whiskerColor:e,Y="number"===typeof x[m].whiskerThickness?x[m].whiskerThickness:"number"===typeof C.options.whiskerThickness?C.whiskerThickness:D,ca=x[m].whiskerDashType?x[m].whiskerDashType:C.whiskerDashType, +da=u(x[m].whiskerLength)?u(C.options.whiskerLength)?k:C.whiskerLength:x[m].whiskerLength,da="number"===typeof da?0>=da?0:da>=k?k:da:"string"===typeof da?parseInt(da)*k/100>k?k:parseInt(da)*k/100:k,Z=1===Math.round(Y)%2?0.5:0,oa=x[m].stemColor?x[m].stemColor:x[m].color?C.stemColor?C.stemColor:x[m].color:C.stemColor?C.stemColor:e,la="number"===typeof x[m].stemThickness?x[m].stemThickness:"number"===typeof C.options.stemThickness?C.stemThickness:D,G=1===Math.round(la)%2?0.5:0,F=x[m].stemDashType?x[m].stemDashType: +C.stemDashType,E=x[m].lineColor?x[m].lineColor:x[m].color?C.lineColor?C.lineColor:x[m].color:C.lineColor?C.lineColor:e,H="number"===typeof x[m].lineThickness?x[m].lineThickness:"number"===typeof C.options.lineThickness?C.lineThickness:D,I=x[m].lineDashType?x[m].lineDashType:C.lineDashType,K=1===Math.round(H)%2?0.5:0,L=C.upperBoxColor,O=C.lowerBoxColor,Q=u(C.options.fillOpacity)?1:C.fillOpacity,P=C.dataPointIds[m];this._eventManager.objectMap[P]={id:P,objectType:"dataPoint",dataSeriesIndex:t,dataPointIndex:m, +x1:y,y1:w,x2:A,y2:h,x3:l,y3:s,x4:l,y4:q,y5:n,borderThickness:D,color:e,stemThickness:la,stemColor:oa,whiskerThickness:Y,whiskerLength:da,whiskerColor:T,lineThickness:H,lineColor:E};b.save();0<la&&(b.beginPath(),b.strokeStyle=oa,b.lineWidth=la,b.setLineDash&&b.setLineDash(R(F,la)),b.moveTo(l-G,h),b.lineTo(l-G,w),b.stroke(),b.moveTo(l-G,q),b.lineTo(l-G,s),b.stroke());b.restore();c.lineWidth=Math.max(D,4);b.beginPath();ea(b,y,Math.min(n,h),A,Math.max(h,n),O,0,e,p?z:!1,p?!1:z,!1,!1,Q);b.beginPath();ea(b, +y,Math.min(s,n),A,Math.max(n,s),L,0,e,p?!1:z,p?z:!1,!1,!1,Q);b.beginPath();b.lineWidth=D;b.strokeStyle=e;b.rect(y-aa,Math.min(h,s)-aa,A-y+2*aa,Math.max(h,s)-Math.min(h,s)+2*aa);b.stroke();b.save();0<H&&(b.beginPath(),b.globalAlpha=1,b.setLineDash&&b.setLineDash(R(I,H)),b.strokeStyle=E,b.lineWidth=H,b.moveTo(y,n-K),b.lineTo(A,n-K),b.stroke());b.restore();b.save();0<Y&&(b.beginPath(),b.setLineDash&&b.setLineDash(R(ca,Y)),b.strokeStyle=T,b.lineWidth=Y,b.moveTo(l-da/2<<0,q-Z),b.lineTo(l+da/2<<0,q-Z), +b.stroke(),b.moveTo(l-da/2<<0,w+Z),b.lineTo(l+da/2<<0,w+Z),b.stroke());b.restore();r&&(e=N(P),c.strokeStyle=e,c.lineWidth=la,0<la&&(c.moveTo(l-aa-G,h),c.lineTo(l-aa-G,Math.max(w,q)),c.stroke(),c.moveTo(l-aa-G,Math.min(w,q)),c.lineTo(l-aa-G,s),c.stroke()),ea(c,y,Math.max(h,s),A,Math.min(h,s),e,0,null,!1,!1,!1,!1),0<Y&&(c.beginPath(),c.lineWidth=Y,c.moveTo(l+da/2,q-Z),c.lineTo(l-da/2,q-Z),c.stroke(),c.moveTo(l+da/2,w+Z),c.lineTo(l-da/2,w+Z),c.stroke()));(x[m].indexLabel||C.indexLabel||x[m].indexLabelFormatter|| +C.indexLabelFormatter)&&this._indexLabels.push({chartType:C.type,dataPoint:x[m],dataSeries:C,point:{x:y+(A-y)/2,y:a.axisY.reversed?w:q},direction:1,bounds:{x1:y,y1:Math.min(w,q),x2:A,y2:Math.max(w,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),b.clearRect(g.x1,g.y1,g.width,g.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth: +1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.03*this.width;var h=a.axisX.dataInfo.minDiff;isFinite(h)||(h=0.3*Math.abs(a.axisX.range));h=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(h)/Math.log(a.axisX.range):Math.abs(h)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&& +(this.dataPointMinWidth&&m<g)&&(m=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,g));h<g&&(h=g);h>m&&(h=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var s=0;s<a.dataSeriesIndexes.length;s++){var q=a.dataSeriesIndexes[s],n=this.data[q],f=n.dataPoints;if(0<f.length)for(var k= +5<h&&n.bevelEnabled?!0:!1,g=0;g<f.length;g++)if(f[g].getTime?w=f[g].x.getTime():w=f[g].x,!(w<a.axisX.dataInfo.viewPortMin||w>a.axisX.dataInfo.viewPortMax)&&!u(f[g].y)&&f[g].y.length&&"number"===typeof f[g].y[0]&&"number"===typeof f[g].y[1]){c=a.axisX.convertValueToPixel(w);m=a.axisY.convertValueToPixel(f[g].y[0]);l=a.axisY.convertValueToPixel(f[g].y[1]);var p=a.axisX.reversed?c+a.plotType.totalDataSeries*h/2-(a.previousDataSeriesCount+s)*h<<0:c-a.plotType.totalDataSeries*h/2+(a.previousDataSeriesCount+ +s)*h<<0,v=a.axisX.reversed?p-h<<0:p+h<<0,c=f[g].color?f[g].color:n._colorSet[g%n._colorSet.length];if(m>l){var t=m;m=l;l=t}t=n.dataPointIds[g];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:q,dataPointIndex:g,x1:p,y1:m,x2:v,y2:l};ea(b,p,m,v,l,c,0,c,k,k,!1,!1,n.fillOpacity);c=N(t);r&&ea(this._eventManager.ghostCtx,p,m,v,l,c,0,null,!1,!1,!1,!1);if(f[g].indexLabel||n.indexLabel||f[g].indexLabelFormatter||n.indexLabelFormatter)this._indexLabels.push({chartType:"rangeColumn", +dataPoint:f[g],dataSeries:n,indexKeyword:0,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?l:m},direction:f[g].y[1]>=f[g].y[0]?-1:1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c}),this._indexLabels.push({chartType:"rangeColumn",dataPoint:f[g],dataSeries:n,indexKeyword:1,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?m:l},direction:f[g].y[1]>=f[g].y[0]?1:-1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation= +"source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderError= +function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=a.axisY._position?"left"===a.axisY._position||"right"===a.axisY._position?!1:!0:!1;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=!1,m=this.plotArea,l=0,w,h,s,q,n,f,k,p=a.axisX.dataInfo.minDiff;isFinite(p)||(p=0.3*Math.abs(a.axisX.range));b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(m.x1, +m.y1,m.width,m.height),this._eventManager.ghostCtx.clip());for(var v=0,t=0;t<this.data.length;t++)!this.data[t].type.match(/(bar|column)/ig)||!this.data[t].visible||this.data[t].type.match(/(stacked)/ig)&&v||v++;for(var C=0;C<a.dataSeriesIndexes.length;C++){var x=a.dataSeriesIndexes[C],z=this.data[x],y=z.dataPoints,A=u(z._linkedSeries)?!1:z._linkedSeries.type.match(/(bar|column)/ig)&&z._linkedSeries.visible?!0:!1,D=0;if(A)for(e=z._linkedSeries.id,t=0;t<e;t++)!this.data[t].type.match(/(bar|column)/ig)|| +!this.data[t].visible||this.data[t].type.match(/(stacked)/ig)&&D||(this.data[t].type.match(/(range)/ig)&&(g=!0),D++);e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;l=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:c?Math.min(0.15*this.height,0.9*(this.plotArea.height/(A?v:1)))<<0:0.3*this.width;g&&(l=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth: +c?Math.min(0.15*this.height,0.9*(this.plotArea.height/(A?v:1)))<<0:0.03*this.width);t=this.options.dataPointWidth?this.dataPointWidth:0.9*((c?m.height:m.width)*(a.axisX.logarithmic?Math.log(p)/Math.log(a.axisX.range):Math.abs(p)/Math.abs(a.axisX.range))/(A?v:1))<<0;this.dataPointMaxWidth&&e>l&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,l));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&l<e)&&(l=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,e));t<e&& +(t=e);t>l&&(t=l);if(0<y.length)for(var aa=z._colorSet,l=0;l<y.length;l++){var e=z.lineColor=z.options.color?z.options.color:aa[0],T={color:y[l].whiskerColor?y[l].whiskerColor:y[l].color?z.whiskerColor?z.whiskerColor:y[l].color:z.whiskerColor?z.whiskerColor:e,thickness:u(y[l].whiskerThickness)?z.whiskerThickness:y[l].whiskerThickness,dashType:y[l].whiskerDashType?y[l].whiskerDashType:z.whiskerDashType,length:u(y[l].whiskerLength)?u(z.options.whiskerLength)?t:z.options.whiskerLength:y[l].whiskerLength, +trimLength:u(y[l].whiskerLength)?u(z.options.whiskerLength)?50:0:0};T.length="number"===typeof T.length?0>=T.length?0:T.length>=t?t:T.length:"string"===typeof T.length?parseInt(T.length)*t/100>t?t:parseInt(T.length)*t/100>t:t;T.thickness="number"===typeof T.thickness?0>T.thickness?0:Math.round(T.thickness):2;var Y={color:y[l].stemColor?y[l].stemColor:y[l].color?z.stemColor?z.stemColor:y[l].color:z.stemColor?z.stemColor:e,thickness:y[l].stemThickness?y[l].stemThickness:z.stemThickness,dashType:y[l].stemDashType? +y[l].stemDashType:z.stemDashType};Y.thickness="number"===typeof Y.thickness?0>Y.thickness?0:Math.round(Y.thickness):2;y[l].getTime?k=y[l].x.getTime():k=y[l].x;if(!(k<a.axisX.dataInfo.viewPortMin||k>a.axisX.dataInfo.viewPortMax)&&!u(y[l].y)&&y[l].y.length&&"number"===typeof y[l].y[0]&&"number"===typeof y[l].y[1]){var ca=a.axisX.convertValueToPixel(k);c?h=ca:w=ca;ca=a.axisY.convertValueToPixel(y[l].y[0]);c?s=ca:n=ca;ca=a.axisY.convertValueToPixel(y[l].y[1]);c?q=ca:f=ca;c?(n=a.axisX.reversed?h+(A?v: +1)*t/2-(A?D-1:0)*t<<0:h-(A?v:1)*t/2+(A?D-1:0)*t<<0,f=a.axisX.reversed?n-t<<0:n+t<<0):(s=a.axisX.reversed?w+(A?v:1)*t/2-(A?D-1:0)*t<<0:w-(A?v:1)*t/2+(A?D-1:0)*t<<0,q=a.axisX.reversed?s-t<<0:s+t<<0);!c&&n>f&&(ca=n,n=f,f=ca);c&&s>q&&(ca=s,s=q,q=ca);ca=z.dataPointIds[l];this._eventManager.objectMap[ca]={id:ca,objectType:"dataPoint",dataSeriesIndex:x,dataPointIndex:l,x1:Math.min(s,q),y1:Math.min(n,f),x2:Math.max(q,s),y2:Math.max(f,n),isXYSwapped:c,stemProperties:Y,whiskerProperties:T};E(b,Math.min(s,q), +Math.min(n,f),Math.max(q,s),Math.max(f,n),e,T,Y,c);r&&E(this._eventManager.ghostCtx,s,n,q,f,e,T,Y,c);if(y[l].indexLabel||z.indexLabel||y[l].indexLabelFormatter||z.indexLabelFormatter)this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:0,point:{x:c?y[l].y[1]>=y[l].y[0]?s:q:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?f:n},direction:y[l].y[1]>=y[l].y[0]?-1:1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c}), +this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:1,point:{x:c?y[l].y[1]>=y[l].y[0]?q:s:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?n:f},direction:y[l].y[1]>=y[l].y[0]?1:-1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height), +a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx: +d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0;var s=a.axisX.dataInfo.minDiff;isFinite(s)||(s=0.3*Math.abs(a.axisX.range));s=this.options.dataPointWidth?this.dataPointWidth:0.9* +(e.height*(a.axisX.logarithmic?Math.log(s)/Math.log(a.axisX.range):Math.abs(s)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&m<g)&&(m=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,g));s<g&&(s=g);s>m&&(s=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(), +this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var q=0;q<a.dataSeriesIndexes.length;q++){var n=a.dataSeriesIndexes[q],f=this.data[n],k=f.dataPoints;if(0<k.length){var p=5<s&&f.bevelEnabled?!0:!1;b.strokeStyle="#4572A7 ";for(g=0;g<k.length;g++)if(k[g].getTime?h=k[g].x.getTime():h=k[g].x,!(h<a.axisX.dataInfo.viewPortMin||h>a.axisX.dataInfo.viewPortMax)&&!u(k[g].y)&&k[g].y.length&&"number"===typeof k[g].y[0]&&"number"===typeof k[g].y[1]){m=a.axisY.convertValueToPixel(k[g].y[0]); +l=a.axisY.convertValueToPixel(k[g].y[1]);w=a.axisX.convertValueToPixel(h);w=a.axisX.reversed?w+a.plotType.totalDataSeries*s/2-(a.previousDataSeriesCount+q)*s<<0:w-a.plotType.totalDataSeries*s/2+(a.previousDataSeriesCount+q)*s<<0;var v=a.axisX.reversed?w-s<<0:w+s<<0;m>l&&(c=m,m=l,l=c);c=k[g].color?k[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,w,l,v,c,0,null,p,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g, +x1:m,y1:w,x2:l,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,m,w,l,v,c,0,null,!1,!1,!1,!1);if(k[g].indexLabel||f.indexLabel||k[g].indexLabelFormatter||f.indexLabelFormatter)this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:0,point:{x:k[g].y[1]>=k[g].y[0]?m:l,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?-1:1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c}),this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:1,point:{x:k[g].y[1]>= +k[g].y[0]?l:m,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?1:-1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1, +e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeArea=function(a){function d(){if(C){var a=null;0<s.lineThickness&&c.stroke();for(var b=w.length-1;0<=b;b--)a=w[b],c.lineTo(a.x,a.y),e.lineTo(a.x,a.y);c.closePath();c.globalAlpha=s.fillOpacity;c.fill();c.globalAlpha=1;e.fill();if(0<s.lineThickness){c.beginPath();c.moveTo(a.x, +a.y);for(b=0;b<w.length;b++)a=w[b],c.lineTo(a.x,a.y);c.stroke()}c.beginPath();c.moveTo(k,p);e.beginPath();e.moveTo(k,p);C={x:k,y:p};w=[];w.push({x:k,y:u})}}var b=a.targetCanvasCtx||this.plotArea.ctx,c=r?this._preRenderCtx:b;if(!(0>=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width,m.height),e.clip());for(var l=0;l<a.dataSeriesIndexes.length;l++){var w= +[],h=a.dataSeriesIndexes[l],s=this.data[h],q=s.dataPoints,g=s.id;this._eventManager.objectMap[g]={objectType:"dataSeries",dataSeriesIndex:h};g=N(g);e.fillStyle=g;var g=[],n=!0,f=0,k,p,u,t,C=null;if(0<q.length){var x=s._colorSet[f%s._colorSet.length],v=s.lineColor=s.options.lineColor||x,y=v;c.fillStyle=x;c.strokeStyle=v;c.lineWidth=s.lineThickness;var A="solid";if(c.setLineDash){var z=R(s.nullDataLineDashType,s.lineThickness),A=s.lineDashType,D=R(A,s.lineThickness);c.setLineDash(D)}for(var T=!0;f< +q.length;f++)if(t=q[f].x.getTime?q[f].x.getTime():q[f].x,!(t<a.axisX.dataInfo.viewPortMin||t>a.axisX.dataInfo.viewPortMax&&(!s.connectNullData||!T)))if(null!==q[f].y&&q[f].y.length&&"number"===typeof q[f].y[0]&&"number"===typeof q[f].y[1]){k=a.axisX.convertValueToPixel(t);p=a.axisY.convertValueToPixel(q[f].y[0]);u=a.axisY.convertValueToPixel(q[f].y[1]);n||T?(s.connectNullData&&!n?(c.setLineDash&&(s.options.nullDataLineDashType||A===s.lineDashType&&s.lineDashType!==s.nullDataLineDashType)&&(w[w.length- +1].newLineDashArray=D,A=s.nullDataLineDashType,c.setLineDash(z)),c.lineTo(k,p),r&&e.lineTo(k,p),w.push({x:k,y:u})):(c.beginPath(),c.moveTo(k,p),C={x:k,y:p},w=[],w.push({x:k,y:u}),r&&(e.beginPath(),e.moveTo(k,p))),T=n=!1):(c.lineTo(k,p),w.push({x:k,y:u}),r&&e.lineTo(k,p),0==f%250&&d());t=s.dataPointIds[f];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:h,dataPointIndex:f,x1:k,y1:p,y2:u};f<q.length-1&&(y!==(q[f].lineColor||v)||A!==(q[f].lineDashType||s.lineDashType))&&(d(), +y=q[f].lineColor||v,w[w.length-1].newStrokeStyle=y,c.strokeStyle=y,c.setLineDash&&(q[f].lineDashType?(A=q[f].lineDashType,w[w.length-1].newLineDashArray=R(A,s.lineThickness),c.setLineDash(w[w.length-1].newLineDashArray)):(A=s.lineDashType,w[w.length-1].newLineDashArray=D,c.setLineDash(D))));if(0!==q[f].markerSize&&(0<q[f].markerSize||0<s.markerSize)){var Y=s.getMarkerProperties(f,k,u,c);g.push(Y);var ca=N(t);r&&g.push({x:k,y:u,ctx:e,type:Y.type,size:Y.size,color:ca,borderColor:ca,borderThickness:Y.borderThickness}); +Y=s.getMarkerProperties(f,k,p,c);g.push(Y);ca=N(t);r&&g.push({x:k,y:p,ctx:e,type:Y.type,size:Y.size,color:ca,borderColor:ca,borderThickness:Y.borderThickness})}if(q[f].indexLabel||s.indexLabel||q[f].indexLabelFormatter||s.indexLabelFormatter)this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:0,point:{x:k,y:p},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?-1:1,color:x}),this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:1,point:{x:k, +y:u},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?1:-1,color:x})}else T||n||d(),T=!0;d();ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1, +m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderRangeSplineArea=function(a){function d(a,b){var d=v(u,2);if(0<d.length){if(0<h.lineThickness){c.strokeStyle=b;c.setLineDash&&c.setLineDash(a);c.beginPath();c.moveTo(d[0].x,d[0].y);for(var f=0;f<d.length-3;f+=3){if(d[f].newStrokeStyle||d[f].newLineDashArray)c.stroke(),c.beginPath(),c.moveTo(d[f].x, +d[f].y),d[f].newStrokeStyle&&(c.strokeStyle=d[f].newStrokeStyle),d[f].newLineDashArray&&c.setLineDash(d[f].newLineDashArray);c.bezierCurveTo(d[f+1].x,d[f+1].y,d[f+2].x,d[f+2].y,d[f+3].x,d[f+3].y)}c.stroke()}c.beginPath();c.moveTo(d[0].x,d[0].y);r&&(e.beginPath(),e.moveTo(d[0].x,d[0].y));for(f=0;f<d.length-3;f+=3)c.bezierCurveTo(d[f+1].x,d[f+1].y,d[f+2].x,d[f+2].y,d[f+3].x,d[f+3].y),r&&e.bezierCurveTo(d[f+1].x,d[f+1].y,d[f+2].x,d[f+2].y,d[f+3].x,d[f+3].y);d=v(z,2);c.lineTo(z[z.length-1].x,z[z.length- +1].y);for(f=d.length-1;2<f;f-=3)c.bezierCurveTo(d[f-1].x,d[f-1].y,d[f-2].x,d[f-2].y,d[f-3].x,d[f-3].y),r&&e.bezierCurveTo(d[f-1].x,d[f-1].y,d[f-2].x,d[f-2].y,d[f-3].x,d[f-3].y);c.closePath();c.globalAlpha=h.fillOpacity;c.fill();r&&(e.closePath(),e.fill());c.globalAlpha=1;if(0<h.lineThickness){c.strokeStyle=b;c.setLineDash&&c.setLineDash(a);c.beginPath();c.moveTo(d[0].x,d[0].y);for(var g=f=0;f<d.length-3;f+=3,g++){if(u[g].newStrokeStyle||u[g].newLineDashArray)c.stroke(),c.beginPath(),c.moveTo(d[f].x, +d[f].y),u[g].newStrokeStyle&&(c.strokeStyle=u[g].newStrokeStyle),u[g].newLineDashArray&&c.setLineDash(u[g].newLineDashArray);c.bezierCurveTo(d[f+1].x,d[f+1].y,d[f+2].x,d[f+2].y,d[f+3].x,d[f+3].y)}c.stroke()}c.beginPath()}}var b=a.targetCanvasCtx||this.plotArea.ctx,c=r?this._preRenderCtx:b;if(!(0>=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width, +m.height),e.clip());for(var l=0;l<a.dataSeriesIndexes.length;l++){var w=a.dataSeriesIndexes[l],h=this.data[w],k=h.dataPoints,g=h.id;this._eventManager.objectMap[g]={objectType:"dataSeries",dataSeriesIndex:w};g=N(g);e.fillStyle=g;var g=[],q=0,n,f,p,u=[],z=[];if(0<k.length){var t=h._colorSet[q%h._colorSet.length],C=h.lineColor=h.options.lineColor||t,x=C;c.fillStyle=t;c.lineWidth=h.lineThickness;var F="solid",y;if(c.setLineDash){var A=R(h.nullDataLineDashType,h.lineThickness),F=h.lineDashType;y=R(F, +h.lineThickness)}for(f=!1;q<k.length;q++)if(n=k[q].x.getTime?k[q].x.getTime():k[q].x,!(n<a.axisX.dataInfo.viewPortMin||n>a.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!f)))if(null!==k[q].y&&k[q].y.length&&"number"===typeof k[q].y[0]&&"number"===typeof k[q].y[1]){n=a.axisX.convertValueToPixel(n);f=a.axisY.convertValueToPixel(k[q].y[0]);p=a.axisY.convertValueToPixel(k[q].y[1]);var E=h.dataPointIds[q];this._eventManager.objectMap[E]={id:E,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:q, +x1:n,y1:f,y2:p};u[u.length]={x:n,y:f};z[z.length]={x:n,y:p};q<k.length-1&&(x!==(k[q].lineColor||C)||F!==(k[q].lineDashType||h.lineDashType))&&(x=k[q].lineColor||C,u[u.length-1].newStrokeStyle=x,c.setLineDash&&(k[q].lineDashType?(F=k[q].lineDashType,u[u.length-1].newLineDashArray=R(F,h.lineThickness)):(F=h.lineDashType,u[u.length-1].newLineDashArray=y)));if(0!==k[q].markerSize&&(0<k[q].markerSize||0<h.markerSize)){var aa=h.getMarkerProperties(q,n,f,c);g.push(aa);var T=N(E);r&&g.push({x:n,y:f,ctx:e, +type:aa.type,size:aa.size,color:T,borderColor:T,borderThickness:aa.borderThickness});aa=h.getMarkerProperties(q,n,p,c);g.push(aa);T=N(E);r&&g.push({x:n,y:p,ctx:e,type:aa.type,size:aa.size,color:T,borderColor:T,borderThickness:aa.borderThickness})}if(k[q].indexLabel||h.indexLabel||k[q].indexLabelFormatter||h.indexLabelFormatter)this._indexLabels.push({chartType:"rangeSplineArea",dataPoint:k[q],dataSeries:h,indexKeyword:0,point:{x:n,y:f},direction:k[q].y[0]<=k[q].y[1]?-1:1,color:t}),this._indexLabels.push({chartType:"rangeSplineArea", +dataPoint:k[q],dataSeries:h,indexKeyword:1,point:{x:n,y:p},direction:k[q].y[0]<=k[q].y[1]?1:-1,color:t});f=!1}else 0<q&&!f&&(h.connectNullData?c.setLineDash&&(0<u.length&&(h.options.nullDataLineDashType||!k[q-1].lineDashType))&&(u[u.length-1].newLineDashArray=A,F=h.nullDataLineDashType):(d(y,C),u=[],z=[])),f=!0;d(y,C);ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0, +this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderWaterfall=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx, +b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx,e=null,g=this.plotArea,m=0,l,k,h,s,q=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),m=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;k=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width,0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0;var n= +a.axisX.dataInfo.minDiff;isFinite(n)||(n=0.3*Math.abs(a.axisX.range));n=this.options.dataPointWidth?this.dataPointWidth:0.6*(g.width*(a.axisX.logarithmic?Math.log(n)/Math.log(a.axisX.range):Math.abs(n)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&m>k&&(m=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,k));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&k<m)&&(k=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,m));n<m&&(n=m); +n>k&&(n=k);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.clip());for(var f=0;f<a.dataSeriesIndexes.length;f++){var p=a.dataSeriesIndexes[f],u=this.data[p],v=u.dataPoints,e=u._colorSet[0];u.risingColor=u.options.risingColor?u.options.risingColor:e;u.fallingColor=u.options.fallingColor?u.options.fallingColor:"#e40a0a"; +var t="number"===typeof u.options.lineThickness?Math.round(u.lineThickness):1,C=1===Math.round(t)%2?-0.5:0;if(0<v.length)for(var x=5<n&&u.bevelEnabled?!0:!1,z=!1,y=null,A=null,m=0;m<v.length;m++)if(v[m].getTime?s=v[m].x.getTime():s=v[m].x,"number"!==typeof v[m].y){if(0<m&&!z&&u.connectNullData)var D=u.options.nullDataLineDashType||!v[m-1].lineDashType?u.nullDataLineDashType:v[m-1].lineDashType;z=!0}else{l=a.axisX.convertValueToPixel(s);k=0===u.dataPointEOs[m].cumulativeSum?q:a.axisY.convertValueToPixel(u.dataPointEOs[m].cumulativeSum); +h=0===u.dataPointEOs[m].cumulativeSumYStartValue?q:a.axisY.convertValueToPixel(u.dataPointEOs[m].cumulativeSumYStartValue);l=a.axisX.reversed?l+a.plotType.totalDataSeries*n/2-(a.previousDataSeriesCount+f)*n<<0:l-a.plotType.totalDataSeries*n/2+(a.previousDataSeriesCount+f)*n<<0;var F=a.axisX.reversed?l-n<<0:l+n<<0;k>h&&(e=k,k=h,h=e);a.axisY.reversed&&(e=k,k=h,h=e);e=u.dataPointIds[m];this._eventManager.objectMap[e]={id:e,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:m,x1:l,y1:k,x2:F,y2:h}; +var T=v[m].color?v[m].color:0<v[m].y?u.risingColor:u.fallingColor;ea(b,l,k,F,h,T,0,T,x,x,!1,!1,u.fillOpacity);e=N(e);r&&ea(this._eventManager.ghostCtx,l,k,F,h,e,0,null,!1,!1,!1,!1);var Y,T=l;Y="undefined"!==typeof v[m].isIntermediateSum&&!0===v[m].isIntermediateSum||"undefined"!==typeof v[m].isCumulativeSum&&!0===v[m].isCumulativeSum?0<v[m].y?k:h:0<v[m].y?h:k;0<m&&y&&(!z||u.connectNullData)&&(z&&b.setLineDash&&b.setLineDash(R(D,t)),b.beginPath(),b.moveTo(y,A-C),b.lineTo(T,Y-C),0<t&&b.stroke(),r&& +(c.beginPath(),c.moveTo(y,A-C),c.lineTo(T,Y-C),0<t&&c.stroke()));z=!1;y=F;A=0<v[m].y?k:h;T=v[m].lineDashType?v[m].lineDashType:u.options.lineDashType?u.options.lineDashType:"shortDash";b.strokeStyle=v[m].lineColor?v[m].lineColor:u.options.lineColor?u.options.lineColor:"#9e9e9e";b.lineWidth=t;b.setLineDash&&(T=R(T,t),b.setLineDash(T));(v[m].indexLabel||u.indexLabel||v[m].indexLabelFormatter||u.indexLabelFormatter)&&this._indexLabels.push({chartType:"waterfall",dataPoint:v[m],dataSeries:u,point:{x:l+ +(F-l)/2,y:0<=v[m].y?k:h},direction:0>v[m].y===a.axisY.reversed?1:-1,bounds:{x1:l,y1:Math.min(k,h),x2:F,y2:Math.max(k,h)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height), +b.clearRect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};var ja=function(a,d,b,c,e,g,m,l,k){if(!(0>b)){"undefined"===typeof l&&(l=1);if(!r){var h=Number((m%(2*Math.PI)).toFixed(8));Number((g%(2*Math.PI)).toFixed(8))===h&&(m-=1E-4)}a.save();a.globalAlpha=l;"pie"===e?(a.beginPath(),a.moveTo(d.x,d.y),a.arc(d.x,d.y,b,g,m,!1),a.fillStyle=c,a.strokeStyle= +"white",a.lineWidth=2,a.closePath(),a.fill()):"doughnut"===e&&(a.beginPath(),a.arc(d.x,d.y,b,g,m,!1),0<=k&&a.arc(d.x,d.y,k*b,m,g,!0),a.closePath(),a.fillStyle=c,a.strokeStyle="white",a.lineWidth=2,a.fill());a.globalAlpha=1;a.restore()}};p.prototype.renderPie=function(a){function d(){if(h&&s){for(var a=0,b=0,c=0,e=0,d=0;d<s.length;d++){var g=s[d],l=h.dataPointIds[d];f[d].id=l;f[d].objectType="dataPoint";f[d].dataPointIndex=d;f[d].dataSeriesIndex=0;var m=f[d],q={percent:null,total:null},p=null,q=k.getPercentAndTotal(h, +g);if(h.indexLabelFormatter||g.indexLabelFormatter)p={chart:k.options,dataSeries:h,dataPoint:g,total:q.total,percent:q.percent};q=g.indexLabelFormatter?g.indexLabelFormatter(p):g.indexLabel?k.replaceKeywordsWithValue(g.indexLabel,g,h,d):h.indexLabelFormatter?h.indexLabelFormatter(p):h.indexLabel?k.replaceKeywordsWithValue(h.indexLabel,g,h,d):g.label?g.label:"";k._eventManager.objectMap[l]=m;m.center={x:x.x,y:x.y};m.y=g.y;m.radius=A;m.percentInnerRadius=F;m.indexLabelText=q;m.indexLabelPlacement=h.indexLabelPlacement; +m.indexLabelLineColor=g.indexLabelLineColor?g.indexLabelLineColor:h.options.indexLabelLineColor?h.options.indexLabelLineColor:g.color?g.color:h._colorSet[d%h._colorSet.length];m.indexLabelLineThickness=u(g.indexLabelLineThickness)?h.indexLabelLineThickness:g.indexLabelLineThickness;m.indexLabelLineDashType=g.indexLabelLineDashType?g.indexLabelLineDashType:h.indexLabelLineDashType;m.indexLabelFontColor=g.indexLabelFontColor?g.indexLabelFontColor:h.indexLabelFontColor;m.indexLabelFontStyle=g.indexLabelFontStyle? +g.indexLabelFontStyle:h.indexLabelFontStyle;m.indexLabelFontWeight=g.indexLabelFontWeight?g.indexLabelFontWeight:h.indexLabelFontWeight;m.indexLabelFontSize=u(g.indexLabelFontSize)?h.indexLabelFontSize:g.indexLabelFontSize;m.indexLabelFontFamily=g.indexLabelFontFamily?g.indexLabelFontFamily:h.indexLabelFontFamily;m.indexLabelBackgroundColor=g.indexLabelBackgroundColor?g.indexLabelBackgroundColor:h.options.indexLabelBackgroundColor?h.options.indexLabelBackgroundColor:h.indexLabelBackgroundColor;m.indexLabelMaxWidth= +g.indexLabelMaxWidth?g.indexLabelMaxWidth:h.indexLabelMaxWidth?h.indexLabelMaxWidth:0.33*n.width;m.indexLabelWrap="undefined"!==typeof g.indexLabelWrap?g.indexLabelWrap:h.indexLabelWrap;m.startAngle=0===d?h.startAngle?h.startAngle/180*Math.PI:0:f[d-1].endAngle;m.startAngle=(m.startAngle+2*Math.PI)%(2*Math.PI);m.endAngle=m.startAngle+2*Math.PI/z*Math.abs(g.y);g=(m.endAngle+m.startAngle)/2;g=(g+2*Math.PI)%(2*Math.PI);m.midAngle=g;if(m.midAngle>Math.PI/2-t&&m.midAngle<Math.PI/2+t){if(0===a||f[c].midAngle> +m.midAngle)c=d;a++}else if(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t){if(0===b||f[e].midAngle>m.midAngle)e=d;b++}m.hemisphere=g>Math.PI/2&&g<=3*Math.PI/2?"left":"right";m.indexLabelTextBlock=new ka(k.plotArea.ctx,{fontSize:m.indexLabelFontSize,fontFamily:m.indexLabelFontFamily,fontColor:m.indexLabelFontColor,fontStyle:m.indexLabelFontStyle,fontWeight:m.indexLabelFontWeight,horizontalAlign:"left",backgroundColor:m.indexLabelBackgroundColor,maxWidth:m.indexLabelMaxWidth,maxHeight:m.indexLabelWrap? +5*m.indexLabelFontSize:1.5*m.indexLabelFontSize,text:m.indexLabelText,padding:0,textBaseline:"top"});m.indexLabelTextBlock.measureText()}l=g=0;q=!1;for(d=0;d<s.length;d++)m=f[(c+d)%s.length],1<a&&(m.midAngle>Math.PI/2-t&&m.midAngle<Math.PI/2+t)&&(g<=a/2&&!q?(m.hemisphere="right",g++):(m.hemisphere="left",q=!0));q=!1;for(d=0;d<s.length;d++)m=f[(e+d)%s.length],1<b&&(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t)&&(l<=b/2&&!q?(m.hemisphere="left",l++):(m.hemisphere="right",q=!0))}}function b(a){var b= +k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);for(b=0;b<s.length;b++){var c=f[b].startAngle,e=f[b].endAngle;if(e>c){var d=0.07*A*Math.cos(f[b].midAngle),g=0.07*A*Math.sin(f[b].midAngle),m=!1;if(s[b].exploded){if(1E-9<Math.abs(f[b].center.x-(x.x+d))||1E-9<Math.abs(f[b].center.y-(x.y+g)))f[b].center.x=x.x+d*a,f[b].center.y=x.y+g*a,m=!0}else if(0<Math.abs(f[b].center.x-x.x)||0<Math.abs(f[b].center.y-x.y))f[b].center.x=x.x+ +d*(1-a),f[b].center.y=x.y+g*(1-a),m=!0;m&&(d={},d.dataSeries=h,d.dataPoint=h.dataPoints[b],d.index=b,k.toolTip.highlightObjects([d]));ja(k.plotArea.ctx,f[b].center,f[b].radius,s[b].color?s[b].color:h._colorSet[b%h._colorSet.length],h.type,c,e,h.fillOpacity,f[b].percentInnerRadius)}}a=k.plotArea.ctx;a.save();a.fillStyle="black";a.strokeStyle="grey";a.textBaseline="middle";a.lineJoin="round";for(b=b=0;b<s.length;b++)c=f[b],c.indexLabelText&&(c.indexLabelTextBlock.y-=c.indexLabelTextBlock.height/2,e= +0,e="left"===c.hemisphere?"inside"!==h.indexLabelPlacement?-(c.indexLabelTextBlock.width+q):-c.indexLabelTextBlock.width/2:"inside"!==h.indexLabelPlacement?q:-c.indexLabelTextBlock.width/2,c.indexLabelTextBlock.x+=e,c.indexLabelTextBlock.render(!0),c.indexLabelTextBlock.x-=e,c.indexLabelTextBlock.y+=c.indexLabelTextBlock.height/2,"inside"!==c.indexLabelPlacement&&0<c.indexLabelLineThickness&&(e=c.center.x+A*Math.cos(c.midAngle),d=c.center.y+A*Math.sin(c.midAngle),a.strokeStyle=c.indexLabelLineColor, +a.lineWidth=c.indexLabelLineThickness,a.setLineDash&&a.setLineDash(R(c.indexLabelLineDashType,c.indexLabelLineThickness)),a.beginPath(),a.moveTo(e,d),a.lineTo(c.indexLabelTextBlock.x,c.indexLabelTextBlock.y),a.lineTo(c.indexLabelTextBlock.x+("left"===c.hemisphere?-q:q),c.indexLabelTextBlock.y),a.stroke()),a.lineJoin="miter");a.save()}function c(a,b){var c=0,c=a.indexLabelTextBlock.y-a.indexLabelTextBlock.height/2,e=a.indexLabelTextBlock.y+a.indexLabelTextBlock.height/2,d=b.indexLabelTextBlock.y-b.indexLabelTextBlock.height/ +2,f=b.indexLabelTextBlock.y+b.indexLabelTextBlock.height/2;return c=b.indexLabelTextBlock.y>a.indexLabelTextBlock.y?d-e:c-f}function e(a){for(var b=null,e=1;e<s.length;e++)if(b=(a+e+f.length)%f.length,f[b].hemisphere!==f[a].hemisphere){b=null;break}else if(f[b].indexLabelText&&b!==a&&(0>c(f[b],f[a])||("right"===f[a].hemisphere?f[b].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y:f[b].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y)))break;else b=null;return b}function g(a,b,d){d=(d||0)+1;if(1E3< +d)return 0;b=b||0;var m=0,h=x.y-1*r,l=x.y+1*r;if(0<=a&&a<s.length){var n=f[a];if(0>b&&n.indexLabelTextBlock.y<h||0<b&&n.indexLabelTextBlock.y>l)return 0;var k=0,q=0,q=k=k=0;0>b?n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2>h&&n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+b<h&&(b=-(h-(n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+b))):n.indexLabelTextBlock.y+n.indexLabelTextBlock.height/2<h&&n.indexLabelTextBlock.y+n.indexLabelTextBlock.height/2+b>l&&(b=n.indexLabelTextBlock.y+ +n.indexLabelTextBlock.height/2+b-l);b=n.indexLabelTextBlock.y+b;h=0;h="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2));q=x.x+A*Math.cos(n.midAngle);k=x.y+A*Math.sin(n.midAngle);k=Math.sqrt(Math.pow(h-q,2)+Math.pow(b-k,2));q=Math.acos(A/r);k=Math.acos((r*r+A*A-k*k)/(2*A*r));b=k<q?b-n.indexLabelTextBlock.y:0;h=null;for(l=1;l<s.length;l++)if(h=(a-l+f.length)%f.length,f[h].hemisphere!==f[a].hemisphere){h=null;break}else if(f[h].indexLabelText&& +f[h].hemisphere===f[a].hemisphere&&h!==a&&(0>c(f[h],f[a])||("right"===f[a].hemisphere?f[h].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y:f[h].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y)))break;else h=null;q=h;k=e(a);l=h=0;0>b?(l="right"===n.hemisphere?q:k,m=b,null!==l&&(q=-b,b=n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2-(f[l].indexLabelTextBlock.y+f[l].indexLabelTextBlock.height/2),b-q<p&&(h=-q,l=g(l,h,d+1),+l.toFixed(C)>+h.toFixed(C)&&(m=b>p?-(b-p):-(q-(l-h)))))):0<b&&(l="right"=== +n.hemisphere?k:q,m=b,null!==l&&(q=b,b=f[l].indexLabelTextBlock.y-f[l].indexLabelTextBlock.height/2-(n.indexLabelTextBlock.y+n.indexLabelTextBlock.height/2),b-q<p&&(h=q,l=g(l,h,d+1),+l.toFixed(C)<+h.toFixed(C)&&(m=b>p?b-p:q-(h-l)))));m&&(d=n.indexLabelTextBlock.y+m,b=0,b="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)),n.midAngle>Math.PI/2-t&&n.midAngle<Math.PI/2+t?(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"left"=== +n.hemisphere&&"right"===h.hemisphere&&b>h.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x-15:"right"===n.hemisphere&&("left"===a.hemisphere&&b<a.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x+15)):n.midAngle>3*Math.PI/2-t&&n.midAngle<3*Math.PI/2+t&&(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"right"===n.hemisphere&&"left"===h.hemisphere&&b<h.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x+15:"left"===n.hemisphere&&("right"===a.hemisphere&&b>a.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x- +15)),n.indexLabelTextBlock.y=d,n.indexLabelTextBlock.x=b,n.indexLabelAngle=Math.atan2(n.indexLabelTextBlock.y-x.y,n.indexLabelTextBlock.x-x.x))}return m}function m(){var a=k.plotArea.ctx;a.fillStyle="grey";a.strokeStyle="grey";a.font="16px Arial";a.textBaseline="middle";for(var b=a=0,d=0,m=!0,b=0;10>b&&(1>b||0<d);b++){if(h.radius||!h.radius&&"undefined"!==typeof h.innerRadius&&null!==h.innerRadius&&A-d<=D)m=!1;m&&(A-=d);d=0;if("inside"!==h.indexLabelPlacement){r=A*v;for(a=0;a<s.length;a++){var l= +f[a];l.indexLabelTextBlock.x=x.x+r*Math.cos(l.midAngle);l.indexLabelTextBlock.y=x.y+r*Math.sin(l.midAngle);l.indexLabelAngle=l.midAngle;l.radius=A;l.percentInnerRadius=F}for(var t,u,a=0;a<s.length;a++){var l=f[a],y=e(a);if(null!==y){t=f[a];u=f[y];var z=0,z=c(t,u)-p;if(0>z){for(var E=u=0,H=0;H<s.length;H++)H!==a&&f[H].hemisphere===l.hemisphere&&(f[H].indexLabelTextBlock.y<l.indexLabelTextBlock.y?u++:E++);u=z/(u+E||1)*E;var E=-1*(z-u),I=H=0;"right"===l.hemisphere?(H=g(a,u),E=-1*(z-H),I=g(y,E),+I.toFixed(C)< ++E.toFixed(C)&&+H.toFixed(C)<=+u.toFixed(C)&&g(a,-(E-I))):(H=g(y,u),E=-1*(z-H),I=g(a,E),+I.toFixed(C)<+E.toFixed(C)&&+H.toFixed(C)<=+u.toFixed(C)&&g(y,-(E-I)))}}}}else for(a=0;a<s.length;a++)l=f[a],r="pie"===h.type?0.7*A:0.8*A,y=x.x+r*Math.cos(l.midAngle),u=x.y+r*Math.sin(l.midAngle),l.indexLabelTextBlock.x=y,l.indexLabelTextBlock.y=u;for(a=0;a<s.length;a++)if(l=f[a],y=l.indexLabelTextBlock.measureText(),0!==y.height&&0!==y.width)y=y=0,"right"===l.hemisphere?(y=n.x2-(l.indexLabelTextBlock.x+l.indexLabelTextBlock.width+ +q),y*=-1):y=n.x1-(l.indexLabelTextBlock.x-l.indexLabelTextBlock.width-q),0<y&&(!m&&l.indexLabelText&&(u="right"===l.hemisphere?n.x2-l.indexLabelTextBlock.x:l.indexLabelTextBlock.x-n.x1,0.3*l.indexLabelTextBlock.maxWidth>u?l.indexLabelText="":l.indexLabelTextBlock.maxWidth=0.85*u,0.3*l.indexLabelTextBlock.maxWidth<u&&(l.indexLabelTextBlock.x-="right"===l.hemisphere?2:-2)),Math.abs(l.indexLabelTextBlock.y-l.indexLabelTextBlock.height/2-x.y)<A||Math.abs(l.indexLabelTextBlock.y+l.indexLabelTextBlock.height/ +2-x.y)<A)&&(y/=Math.abs(Math.cos(l.indexLabelAngle)),9<y&&(y*=0.3),y>d&&(d=y)),y=y=0,0<l.indexLabelAngle&&l.indexLabelAngle<Math.PI?(y=n.y2-(l.indexLabelTextBlock.y+l.indexLabelTextBlock.height/2+5),y*=-1):y=n.y1-(l.indexLabelTextBlock.y-l.indexLabelTextBlock.height/2-5),0<y&&(!m&&l.indexLabelText&&(u=0<l.indexLabelAngle&&l.indexLabelAngle<Math.PI?-1:1,0===g(a,y*u)&&g(a,2*u)),Math.abs(l.indexLabelTextBlock.x-x.x)<A&&(y/=Math.abs(Math.sin(l.indexLabelAngle)),9<y&&(y*=0.3),y>d&&(d=y)));var K=function(a, +b,c){for(var e=[],d=0;e.push(f[b]),b!==c;b=(b+1+s.length)%s.length);e.sort(function(a,b){return a.y-b.y});for(b=0;b<e.length;b++)if(c=e[b],d<0.7*a)d+=c.indexLabelTextBlock.height,c.indexLabelTextBlock.text="",c.indexLabelText="",c.indexLabelTextBlock.measureText();else break};(function(){for(var a=-1,b=-1,d=0,g=!1,l=0;l<s.length;l++)if(g=!1,t=f[l],t.indexLabelText){var m=e(l);if(null!==m){var h=f[m];z=0;z=c(t,h);var n;if(n=0>z){n=t.indexLabelTextBlock.x;var k=t.indexLabelTextBlock.y-t.indexLabelTextBlock.height/ +2,w=t.indexLabelTextBlock.y+t.indexLabelTextBlock.height/2,p=h.indexLabelTextBlock.y-h.indexLabelTextBlock.height/2,u=h.indexLabelTextBlock.x+h.indexLabelTextBlock.width,r=h.indexLabelTextBlock.y+h.indexLabelTextBlock.height/2;n=t.indexLabelTextBlock.x+t.indexLabelTextBlock.width<h.indexLabelTextBlock.x-q||n>u+q||k>r+q||w<p-q?!1:!0}n?(0>a&&(a=l),m!==a&&(b=m,d+=-z),0===l%Math.max(s.length/10,3)&&(g=!0)):g=!0;g&&(0<d&&0<=a&&0<=b)&&(K(d,a,b),b=a=-1,d=0)}}0<d&&K(d,a,b)})()}}function l(){k.plotArea.layoutManager.reset(); +k.title&&(k.title.dockInsidePlotArea||"center"===k.title.horizontalAlign&&"center"===k.title.verticalAlign)&&k.title.render();if(k.subtitles)for(var a=0;a<k.subtitles.length;a++){var b=k.subtitles[a];(b.dockInsidePlotArea||"center"===b.horizontalAlign&&"center"===b.verticalAlign)&&b.render()}k.legend&&(k.legend.dockInsidePlotArea||"center"===k.legend.horizontalAlign&&"center"===k.legend.verticalAlign)&&(k.legend.setLayout(),k.legend.render())}var k=this;if(!(0>=a.dataSeriesIndexes.length)){var h= +this.data[a.dataSeriesIndexes[0]],s=h.dataPoints,q=10,n=this.plotArea,f=h.dataPointEOs,p=2,r,v=1.3,t=20/180*Math.PI,C=6,x={x:(n.x2+n.x1)/2,y:(n.y2+n.y1)/2},z=0;a=!1;for(var y=0;y<s.length;y++)z+=Math.abs(s[y].y),!a&&("undefined"!==typeof s[y].indexLabel&&null!==s[y].indexLabel&&0<s[y].indexLabel.toString().length)&&(a=!0),!a&&("undefined"!==typeof s[y].label&&null!==s[y].label&&0<s[y].label.toString().length)&&(a=!0);if(0!==z){a=a||"undefined"!==typeof h.indexLabel&&null!==h.indexLabel&&0<h.indexLabel.toString().length; +var A="inside"!==h.indexLabelPlacement&&a?0.75*Math.min(n.width,n.height)/2:0.92*Math.min(n.width,n.height)/2;h.radius&&(A=I(h.radius,A));var D="undefined"!==typeof h.innerRadius&&null!==h.innerRadius?I(h.innerRadius,A):0.7*A;h.radius=A;"doughnut"===h.type&&(h.innerRadius=D);var F=Math.min(D/A,(A-1)/A);this.pieDoughnutClickHandler=function(a){k.isAnimating||!u(a.dataSeries.explodeOnClick)&&!a.dataSeries.explodeOnClick||(a=a.dataPoint,a.exploded=a.exploded?!1:!0,1<this.dataPoints.length&&k._animator.animate(0, +500,function(a){b(a);l()}))};d();m();m();m();m();this.disableToolTip=!0;this._animator.animate(0,this.animatedRender?this.animationDuration:0,function(a){var b=k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);a=f[0].startAngle+2*Math.PI*a;for(b=0;b<s.length;b++){var c=0===b?f[b].startAngle:e,e=c+(f[b].endAngle-f[b].startAngle),d=!1;e>a&&(e=a,d=!0);var g=s[b].color?s[b].color:h._colorSet[b%h._colorSet.length];e>c&&ja(k.plotArea.ctx, +f[b].center,f[b].radius,g,h.type,c,e,h.fillOpacity,f[b].percentInnerRadius);if(d)break}l()},function(){k.disableToolTip=!1;k._animator.animate(0,k.animatedRender?500:0,function(a){b(a);l()})})}}};var ra=function(a,d,b,c){"undefined"===typeof b&&(b=1);0>=Math.round(d.y4-d.y1)||(a.save(),a.globalAlpha=b,a.beginPath(),a.moveTo(Math.round(d.x1),Math.round(d.y1)),a.lineTo(Math.round(d.x2),Math.round(d.y2)),a.lineTo(Math.round(d.x3),Math.round(d.y3)),a.lineTo(Math.round(d.x4),Math.round(d.y4)),"undefined"!== +d.x5&&(a.lineTo(Math.round(d.x5),Math.round(d.y5)),a.lineTo(Math.round(d.x6),Math.round(d.y6))),a.closePath(),a.fillStyle=c?c:d.color,a.fill(),a.globalAplha=1,a.restore())};p.prototype.renderFunnel=function(a){function d(){for(var a=0,b=[],c=0;c<C.length;c++){if("undefined"===typeof C[c].y)return-1;C[c].y="number"===typeof C[c].y?C[c].y:0;a+=Math.abs(C[c].y)}if(0===a)return-1;for(c=b[0]=0;c<C.length;c++)b.push(Math.abs(C[c].y)*F/a);return b}function b(){var a=$,b=V,c=K,e=ea,d,f;d=O;f=Z-N;e=Math.abs((f- +d)*(b-a+(e-c))/2);c=ea-K;d=f-d;f=c*(f-Z);f=Math.abs(f);f=e+f;for(var e=[],g=0,l=0;l<C.length;l++){if("undefined"===typeof C[l].y)return-1;C[l].y="number"===typeof C[l].y?C[l].y:0;g+=Math.abs(C[l].y)}if(0===g)return-1;for(var m=e[0]=0,h=0,n,k,b=b-a,m=!1,l=0;l<C.length;l++)a=Math.abs(C[l].y)*f/g,m?n=0==Number(c.toFixed(3))?0:a/c:(k=ba*ba*b*b-4*Math.abs(ba)*a,0>k?(k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=0==k?0:a/k,h+=a/k,m=!0):(n=(Math.abs(ba)*b-Math.sqrt(k))/2,k=b-2*n/Math.abs(ba),h+=n,h>d&&(h-=n, +k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=a/k,h+=a/k,m=!0),b=k)),e.push(n);return e}function c(){if(t&&C){for(var a,b,c,e,d,g,l,h,m,n,k,q,s,w,p=[],B=[],x={percent:null,total:null},v=null,y=0;y<C.length;y++)w=P[y],w="undefined"!==typeof w.x5?(w.y2+w.y4)/2:(w.y2+w.y3)/2,w=f(w).x2+1,p[y]=L-w-S;w=0.5*S;for(var y=0,A=C.length-1;y<C.length||0<=A;y++,A--){b=t.reversed?C[A]:C[y];a=b.color?b.color:t.reversed?t._colorSet[(C.length-1-y)%t._colorSet.length]:t._colorSet[y%t._colorSet.length];c=b.indexLabelPlacement|| +t.indexLabelPlacement||"outside";e=b.indexLabelBackgroundColor||t.indexLabelBackgroundColor||(r?"transparent":null);d=b.indexLabelFontColor||t.indexLabelFontColor||"#979797";g=u(b.indexLabelFontSize)?t.indexLabelFontSize:b.indexLabelFontSize;l=b.indexLabelFontStyle||t.indexLabelFontStyle||"normal";h=b.indexLabelFontFamily||t.indexLabelFontFamily||"arial";m=b.indexLabelFontWeight||t.indexLabelFontWeight||"normal";a=b.indexLabelLineColor||t.options.indexLabelLineColor||a;n="number"===typeof b.indexLabelLineThickness? +b.indexLabelLineThickness:"number"===typeof t.indexLabelLineThickness?t.indexLabelLineThickness:2;k=b.indexLabelLineDashType||t.indexLabelLineDashType||"solid";q="undefined"!==typeof b.indexLabelWrap?b.indexLabelWrap:"undefined"!==typeof t.indexLabelWrap?t.indexLabelWrap:!0;s=t.dataPointIds[y];z._eventManager.objectMap[s]={id:s,objectType:"dataPoint",dataPointIndex:y,dataSeriesIndex:0,funnelSection:P[t.reversed?C.length-1-y:y]};"inside"===t.indexLabelPlacement&&(p[y]=y!==fa?t.reversed?P[y].x2-P[y].x1: +P[y].x3-P[y].x4:P[y].x3-P[y].x6,20>p[y]&&(p[y]=y!==fa?t.reversed?P[y].x3-P[y].x4:P[y].x2-P[y].x1:P[y].x2-P[y].x1,p[y]/=2));s=b.indexLabelMaxWidth?b.indexLabelMaxWidth:t.options.indexLabelMaxWidth?t.indexLabelMaxWidth:p[y];if(s>p[y]||0>s)s=p[y];B[y]="inside"===t.indexLabelPlacement?P[y].height:!1;x=z.getPercentAndTotal(t,b);if(t.indexLabelFormatter||b.indexLabelFormatter)v={chart:z.options,dataSeries:t,dataPoint:b,total:x.total,percent:x.percent};b=b.indexLabelFormatter?b.indexLabelFormatter(v):b.indexLabel? +z.replaceKeywordsWithValue(b.indexLabel,b,t,y):t.indexLabelFormatter?t.indexLabelFormatter(v):t.indexLabel?z.replaceKeywordsWithValue(t.indexLabel,b,t,y):b.label?b.label:"";0>=n&&(n=0);1E3>s&&1E3-s<w&&(s+=1E3-s);Q.roundRect||Ea(Q);c=new ka(Q,{fontSize:g,fontFamily:h,fontColor:d,fontStyle:l,fontWeight:m,horizontalAlign:c,backgroundColor:e,maxWidth:s,maxHeight:!1===B[y]?q?4.28571429*g:1.5*g:B[y],text:b,padding:ga});c.measureText();J.push({textBlock:c,id:t.reversed?A:y,isDirty:!1,lineColor:a,lineThickness:n, +lineDashType:k,height:c.height<c.maxHeight?c.height:c.maxHeight,width:c.width<c.maxWidth?c.width:c.maxWidth})}}}function e(){var a,b,c,e,d,f=[];d=!1;c=0;for(var g,l=L-V-S/2,l=t.options.indexLabelMaxWidth?t.indexLabelMaxWidth>l?l:t.indexLabelMaxWidth:l,h=J.length-1;0<=h;h--){g=C[J[h].id];c=J[h];e=c.textBlock;b=(a=n(h)<P.length?J[n(h)]:null)?a.textBlock:null;c=c.height;a&&e.y+c+ga>b.y&&(d=!0);c=g.indexLabelMaxWidth||l;if(c>l||0>c)c=l;f.push(c)}if(d)for(h=J.length-1;0<=h;h--)a=P[h],J[h].textBlock.maxWidth= +f[f.length-(h+1)],J[h].textBlock.measureText(),J[h].textBlock.x=L-l,c=J[h].textBlock.height<J[h].textBlock.maxHeight?J[h].textBlock.height:J[h].textBlock.maxHeight,d=J[h].textBlock.width<J[h].textBlock.maxWidth?J[h].textBlock.width:J[h].textBlock.maxWidth,J[h].height=c,J[h].width=d,c="undefined"!==typeof a.x5?(a.y2+a.y4)/2:(a.y2+a.y3)/2,J[h].textBlock.y=c-J[h].height/2,t.reversed?(J[h].textBlock.y+J[h].height>pa+D&&(J[h].textBlock.y=pa+D-J[h].height),J[h].textBlock.y<wa-D&&(J[h].textBlock.y=wa-D)): +(J[h].textBlock.y<pa-D&&(J[h].textBlock.y=pa-D),J[h].textBlock.y+J[h].height>wa+D&&(J[h].textBlock.y=wa+D-J[h].height))}function g(){var a,b,c,e;if("inside"!==t.indexLabelPlacement)for(var d=0;d<P.length;d++)0==J[d].textBlock.text.length?J[d].isDirty=!0:(a=P[d],c="undefined"!==typeof a.x5?(a.y2+a.y4)/2:(a.y2+a.y3)/2,b=t.reversed?"undefined"!==typeof a.x5?c>Da?f(c).x2+1:(a.x2+a.x3)/2+1:(a.x2+a.x3)/2+1:"undefined"!==typeof a.x5?c<Da?f(c).x2+1:(a.x4+a.x3)/2+1:(a.x2+a.x3)/2+1,J[d].textBlock.x=b+S,J[d].textBlock.y= +c-J[d].height/2,t.reversed?(J[d].textBlock.y+J[d].height>pa+D&&(J[d].textBlock.y=pa+D-J[d].height),J[d].textBlock.y<wa-D&&(J[d].textBlock.y=wa-D)):(J[d].textBlock.y<pa-D&&(J[d].textBlock.y=pa-D),J[d].textBlock.y+J[d].height>wa+D&&(J[d].textBlock.y=wa+D-J[d].height)));else for(d=0;d<P.length;d++)0==J[d].textBlock.text.length?J[d].isDirty=!0:(a=P[d],b=a.height,c=J[d].height,e=J[d].width,b>=c?(b=d!=fa?(a.x4+a.x3)/2-e/2:(a.x5+a.x4)/2-e/2,c=d!=fa?(a.y1+a.y3)/2-c/2:(a.y1+a.y4)/2-c/2,J[d].textBlock.x=b, +J[d].textBlock.y=c):J[d].isDirty=!0)}function m(){function a(b,c){var d;if(0>b||b>=J.length)return 0;var e,f=J[b].textBlock;if(0>c){c*=-1;e=q(b);d=l(e,b);if(d>=c)return f.y-=c,c;if(0==b)return 0<d&&(f.y-=d),d;d+=a(e,-(c-d));0<d&&(f.y-=d);return d}e=n(b);d=l(b,e);if(d>=c)return f.y+=c,c;if(b==P.length-1)return 0<d&&(f.y+=d),d;d+=a(e,c-d);0<d&&(f.y+=d);return d}function b(){var a,d,e,f,g=0,h;f=(Z-O+2*D)/k;h=k;for(var l,m=1;m<h;m++){e=m*f;for(var s=J.length-1;0<=s;s--)!J[s].isDirty&&(J[s].textBlock.y< +e&&J[s].textBlock.y+J[s].height>e)&&(l=n(s),!(l>=J.length-1)&&J[s].textBlock.y+J[s].height+ga>J[l].textBlock.y&&(J[s].textBlock.y=J[s].textBlock.y+J[s].height-e>e-J[s].textBlock.y?e+1:e-J[s].height-1))}for(l=P.length-1;0<l;l--)if(!J[l].isDirty){e=q(l);if(0>e&&(e=0,J[e].isDirty))break;if(J[l].textBlock.y<J[e].textBlock.y+J[e].height){d=d||l;f=l;for(h=0;J[f].textBlock.y<J[e].textBlock.y+J[e].height+ga;){a=a||J[f].textBlock.y+J[f].height;h+=J[f].height;h+=ga;f=e;if(0>=f){f=0;h+=J[f].height;break}e=q(f); +if(0>e){f=0;h+=J[f].height;break}}if(f!=l){g=J[f].textBlock.y;a-=g;a=h-a;g=c(a,d,f);break}}}return g}function c(a,b,d){var e=[],f=0,g=0;for(a=Math.abs(a);d<=b;d++)e.push(P[d]);e.sort(function(a,b){return a.height-b.height});for(d=0;d<e.length;d++)if(b=e[d],f<a)g++,f+=J[b.id].height+ga,J[b.id].textBlock.text="",J[b.id].indexLabelText="",J[b.id].isDirty=!0,J[b.id].textBlock.measureText();else break;return g}for(var d,e,f,g,h,m,k=1,s=0;s<2*k;s++){for(var w=J.length-1;0<=w&&!(0<=q(w)&&q(w),f=J[w],g=f.textBlock, +m=(h=n(w)<P.length?J[n(w)]:null)?h.textBlock:null,d=+f.height.toFixed(6),e=+g.y.toFixed(6),!f.isDirty&&(h&&e+d+ga>+m.y.toFixed(6))&&(d=g.y+d+ga-m.y,e=a(w,-d),e<d&&(0<e&&(d-=e),e=a(n(w),d),e!=d)));w--);b()}}function l(a,b){return(b<P.length?J[b].textBlock.y:t.reversed?pa+D:wa+D)-(0>a?t.reversed?wa-D:pa-D:J[a].textBlock.y+J[a].height+ga)}function k(a,b,c){var d,e,f,l=[],m=D,n=[];-1!==b&&(0<=W.indexOf(b)?(e=W.indexOf(b),W.splice(e,1)):(W.push(b),W=W.sort(function(a,b){return a-b})));if(0===W.length)l= +ia;else{e=D*(1!=W.length||0!=W[0]&&W[0]!=P.length-1?2:1)/h();for(var q=0;q<P.length;q++){if(1==W.length&&0==W[0]){if(0===q){l.push(ia[q]);d=m;continue}}else 0===q&&(d=-1*m);l.push(ia[q]+d);if(0<=W.indexOf(q)||q<P.length&&0<=W.indexOf(q+1))d+=e}}f=function(){for(var a=[],b=0;b<P.length;b++)a.push(l[b]-P[b].y1);return a}();var w={startTime:(new Date).getTime(),duration:c||500,easingFunction:function(a,b,c,d){return M.easing.easeOutQuart(a,b,c,d)},changeSection:function(a){for(var b,c,d=0;d<P.length;d++)b= +f[d],c=P[d],b*=a,"undefined"===typeof n[d]&&(n[d]=0),0>n&&(n*=-1),c.y1+=b-n[d],c.y2+=b-n[d],c.y3+=b-n[d],c.y4+=b-n[d],c.y5&&(c.y5+=b-n[d],c.y6+=b-n[d]),n[d]=b}};a._animator.animate(0,c,function(c){var d=a.plotArea.ctx||a.ctx;ja=!0;d.clearRect(x.x1,x.y1,x.x2-x.x1,x.y2-x.y1);d.fillStyle=a.backgroundColor;d.fillRect(x.x1,x.y1,x.width,x.height);w.changeSection(c,b);var e={};e.dataSeries=t;e.dataPoint=t.reversed?t.dataPoints[C.length-1-b]:t.dataPoints[b];e.index=t.reversed?C.length-1-b:b;a.toolTip.highlightObjects([e]); +for(e=0;e<P.length;e++)ra(d,P[e],t.fillOpacity);v(d);H&&("inside"!==t.indexLabelPlacement?s(d):g(),p(d));1<=c&&(ja=!1)},null,M.easing.easeOutQuart)}function h(){for(var a=0,b=0;b<P.length-1;b++)(0<=W.indexOf(b)||0<=W.indexOf(b+1))&&a++;return a}function s(a){for(var b,c,d,e,g=0;g<P.length;g++)e=1===J[g].lineThickness%2?0.5:0,c=((P[g].y2+P[g].y4)/2<<0)+e,b=f(c).x2-1,d=J[g].textBlock.x,e=(J[g].textBlock.y+J[g].height/2<<0)+e,J[g].isDirty||0==J[g].lineThickness||(a.strokeStyle=J[g].lineColor,a.lineWidth= +J[g].lineThickness,a.setLineDash&&a.setLineDash(R(J[g].lineDashType,J[g].lineThickness)),a.beginPath(),a.moveTo(b,c),a.lineTo(d,e),a.stroke())}function q(a){for(a-=1;-1<=a&&-1!=a&&J[a].isDirty;a--);return a}function n(a){for(a+=1;a<=P.length&&a!=P.length&&J[a].isDirty;a++);return a}function f(a){for(var b,c=0;c<C.length;c++)if(P[c].y1<a&&P[c].y4>a){b=P[c];break}return b?(a=b.y6?a>b.y6?b.x3+(b.x4-b.x3)/(b.y4-b.y3)*(a-b.y3):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2), +{x1:a,x2:a}):-1}function p(a){for(var b=0;b<P.length;b++)J[b].isDirty||(a&&(J[b].textBlock.ctx=a),J[b].textBlock.render(!0))}function v(a){z.plotArea.layoutManager.reset();a.roundRect||Ea(a);z.title&&(z.title.dockInsidePlotArea||"center"===z.title.horizontalAlign&&"center"===z.title.verticalAlign)&&(z.title.ctx=a,z.title.render());if(z.subtitles)for(var b=0;b<z.subtitles.length;b++){var c=z.subtitles[b];if(c.dockInsidePlotArea||"center"===c.horizontalAlign&&"center"===c.verticalAlign)z.subtitles.ctx= +a,c.render()}z.legend&&(z.legend.dockInsidePlotArea||"center"===z.legend.horizontalAlign&&"center"===z.legend.verticalAlign)&&(z.legend.ctx=a,z.legend.setLayout(),z.legend.render());U.fNg&&U.fNg(z)}var z=this;if(!(0>=a.dataSeriesIndexes.length)){for(var t=this.data[a.dataSeriesIndexes[0]],C=t.dataPoints,x=this.plotArea,D=0.025*x.width,y=0.01*x.width,A=0,F=x.height-2*D,E=Math.min(x.width-2*y,2.8*x.height),H=!1,I=0;I<C.length;I++)if(!H&&("undefined"!==typeof C[I].indexLabel&&null!==C[I].indexLabel&& +0<C[I].indexLabel.toString().length)&&(H=!0),!H&&("undefined"!==typeof C[I].label&&null!==C[I].label&&0<C[I].label.toString().length)&&(H=!0),!H&&"function"===typeof t.indexLabelFormatter||"function"===typeof C[I].indexLabelFormatter)H=!0;H=H||"undefined"!==typeof t.indexLabel&&null!==t.indexLabel&&0<t.indexLabel.toString().length;"inside"!==t.indexLabelPlacement&&H||(y=(x.width-0.75*E)/2);var I=x.x1+y,L=x.x2-y,O=x.y1+D,Z=x.y2-D,Q=a.targetCanvasCtx||this.plotArea.ctx||this.ctx;if(0!=t.length&&(t.dataPoints&& +t.visible)&&0!==C.length){var N,G;a=75*E/100;var S=30*(L-a)/100;"funnel"===t.type?(N=u(t.options.neckHeight)?0.35*F:t.neckHeight,G=u(t.options.neckWidth)?0.25*a:t.neckWidth,"string"===typeof N&&N.match(/%$/)?(N=parseInt(N),N=N*F/100):N=parseInt(N),"string"===typeof G&&G.match(/%$/)?(G=parseInt(G),G=G*a/100):G=parseInt(G),N>F?N=F:0>=N&&(N=0),G>a?G=a-0.5:0>=G&&(G=0)):"pyramid"===t.type&&(G=N=0,t.reversed=t.reversed?!1:!0);var y=I+a/2,$=I,V=I+a,pa=t.reversed?Z:O,K=y-G/2,ea=y+G/2,Da=t.reversed?O+N:Z- +N,wa=t.reversed?O:Z;a=[];var y=[],P=[],E=[],X=O,fa,ba=(Da-pa)/(K-$),ha=-ba,I="area"===(t.valueRepresents?t.valueRepresents:"height")?b():d();if(-1!==I){if(t.reversed)for(E.push(X),G=I.length-1;0<G;G--)X+=I[G],E.push(X);else for(G=0;G<I.length;G++)X+=I[G],E.push(X);if(t.reversed)for(G=0;G<I.length;G++)E[G]<Da?(a.push(K),y.push(ea),fa=G):(a.push((E[G]-pa+ba*$)/ba),y.push((E[G]-pa+ha*V)/ha));else for(G=0;G<I.length;G++)E[G]<Da?(a.push((E[G]-pa+ba*$)/ba),y.push((E[G]-pa+ha*V)/ha),fa=G):(a.push(K),y.push(ea)); +for(G=0;G<I.length-1;G++)X=t.reversed?C[C.length-1-G].color?C[C.length-1-G].color:t._colorSet[(C.length-1-G)%t._colorSet.length]:C[G].color?C[G].color:t._colorSet[G%t._colorSet.length],G===fa?P.push({x1:a[G],y1:E[G],x2:y[G],y2:E[G],x3:ea,y3:Da,x4:y[G+1],y4:E[G+1],x5:a[G+1],y5:E[G+1],x6:K,y6:Da,id:G,height:E[G+1]-E[G],color:X}):P.push({x1:a[G],y1:E[G],x2:y[G],y2:E[G],x3:y[G+1],y3:E[G+1],x4:a[G+1],y4:E[G+1],id:G,height:E[G+1]-E[G],color:X});var ga=2,J=[],ja=!1,W=[],ia=[],I=!1;a=a=0;Fa(W);for(G=0;G< +C.length;G++)C[G].exploded&&(I=!0,t.reversed?W.push(C.length-1-G):W.push(G));Q.clearRect(x.x1,x.y1,x.width,x.height);Q.fillStyle=z.backgroundColor;Q.fillRect(x.x1,x.y1,x.width,x.height);if(H&&t.visible&&(c(),g(),e(),"inside"!==t.indexLabelPlacement)){m();for(G=0;G<C.length;G++)J[G].isDirty||(a=J[G].textBlock.x+J[G].width,a=(L-a)/2,0==G&&(A=a),A>a&&(A=a));for(G=0;G<P.length;G++)P[G].x1+=A,P[G].x2+=A,P[G].x3+=A,P[G].x4+=A,P[G].x5&&(P[G].x5+=A,P[G].x6+=A),J[G].textBlock.x+=A}for(G=0;G<P.length;G++)A= +P[G],ra(Q,A,t.fillOpacity),ia.push(A.y1);v(Q);H&&t.visible&&("inside"===t.indexLabelPlacement||z.animationEnabled||s(Q),z.animationEnabled||p());if(!H)for(G=0;G<C.length;G++)A=t.dataPointIds[G],a={id:A,objectType:"dataPoint",dataPointIndex:G,dataSeriesIndex:0,funnelSection:P[t.reversed?C.length-1-G:G]},z._eventManager.objectMap[A]=a;!z.animationEnabled&&I?k(z,-1,0):z.animationEnabled&&!z.animatedRender&&k(z,-1,0);this.funnelPyramidClickHandler=function(a){var b=-1;if(!ja&&!z.isAnimating&&(u(a.dataSeries.explodeOnClick)|| +a.dataSeries.explodeOnClick)&&(b=t.reversed?C.length-1-a.dataPointIndex:a.dataPointIndex,0<=b)){a=b;if("funnel"===t.type||"pyramid"===t.type)t.reversed?C[C.length-1-a].exploded=C[C.length-1-a].exploded?!1:!0:C[a].exploded=C[a].exploded?!1:!0;k(z,b,500)}};return{source:Q,dest:this.plotArea.ctx,animationCallback:function(a,b){M.fadeInAnimation(a,b);1<=a&&(k(z,-1,500),v(z.plotArea.ctx||z.ctx))},easingFunction:M.easing.easeInQuad,animationBase:0}}}}};p.prototype.requestAnimFrame=function(){return window.requestAnimationFrame|| +window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){window.setTimeout(a,1E3/60)}}();p.prototype.cancelRequestAnimFrame=window.cancelAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame||window.oCancelRequestAnimationFrame||window.msCancelRequestAnimationFrame||clearTimeout;p.prototype.set=function(a,d,b){b="undefined"===typeof b?!0:b;"options"===a?(this.options=d, +b&&this.render()):p.base.set.call(this,a,d,b)};p.prototype.exportChart=function(a){a="undefined"===typeof a?{}:a;var d=a.format?a.format:"png",b=a.fileName?a.fileName:this.exportFileName;if(a.toDataURL)return this.canvas.toDataURL("image/"+d);Ta(this.canvas,d,b)};p.prototype.print=function(){var a=this.exportChart({toDataURL:!0}),d=document.createElement("iframe");d.setAttribute("class","canvasjs-chart-print-frame");d.setAttribute("style","position:absolute; width:100%; border: 0px; margin: 0px 0px 0px 0px; padding 0px 0px 0px 0px;"); +d.style.height=this.height+"px";this._canvasJSContainer.appendChild(d);var b=this,c=d.contentWindow||d.contentDocument.document||d.contentDocument;c.document.open();c.document.write('<!DOCTYPE HTML>\n<html><body style="margin: 0px 0px 0px 0px; padding: 0px 0px 0px 0px;"><img src="'+a+'"/><body/></html>');c.document.close();setTimeout(function(){c.focus();c.print();setTimeout(function(){b._canvasJSContainer.removeChild(d)},1E3)},500)};p.prototype.getPercentAndTotal=function(a,d){var b=null,c=null, +e=null;if(0<=a.type.indexOf("stacked"))c=0,b=d.x.getTime?d.x.getTime():d.x,b in a.plotUnit.yTotals&&(c=a.plotUnit.yTotals[b],e=isNaN(d.y)?0:100*(d.y/c));else if("pie"===a.type||"doughnut"===a.type||"funnel"===a.type||"pyramid"===a.type){for(b=c=0;b<a.dataPoints.length;b++)isNaN(a.dataPoints[b].y)||(c+=a.dataPoints[b].y);e=isNaN(d.y)?0:100*(d.y/c)}return{percent:e,total:c}};p.prototype.replaceKeywordsWithValue=function(a,d,b,c,e){var g=this;e="undefined"===typeof e?0:e;if((0<=b.type.indexOf("stacked")|| +"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type)&&(0<=a.indexOf("#percent")||0<=a.indexOf("#total"))){var m="#percent",l="#total",k=this.getPercentAndTotal(b,d),l=isNaN(k.total)?l:k.total,m=isNaN(k.percent)?m:k.percent;do{k="";if(b.percentFormatString)k=b.percentFormatString;else{var k="#,##0.",h=Math.max(Math.ceil(Math.log(1/Math.abs(m))/Math.LN10),2);if(isNaN(h)||!isFinite(h))h=2;for(var s=0;s<h;s++)k+="#";b.percentFormatString=k}a=a.replace("#percent",ba(m,k,g._cultureInfo)); +a=a.replace("#total",ba(l,b.yValueFormatString?b.yValueFormatString:"#,##0.########",g._cultureInfo))}while(0<=a.indexOf("#percent")||0<=a.indexOf("#total"))}return a.replace(/\{.*?\}|"[^"]*"|'[^']*'/g,function(a){if('"'===a[0]&&'"'===a[a.length-1]||"'"===a[0]&&"'"===a[a.length-1])return a.slice(1,a.length-1);a=Ia(a.slice(1,a.length-1));a=a.replace("#index",e);var h=null;try{var f=a.match(/(.*?)\s*\[\s*(.*?)\s*\]/);f&&0<f.length&&(h=Ia(f[2]),a=Ia(f[1]))}catch(l){}f=null;if("color"===a)return"waterfall"=== +b.type?d.color?d.color:0<d.y?b.risingColor:b.fallingColor:"error"===b.type?b.color?b.color:b._colorSet[h%b._colorSet.length]:d.color?d.color:b.color?b.color:b._colorSet[c%b._colorSet.length];if(d.hasOwnProperty(a))f=d;else if(b.hasOwnProperty(a))f=b;else return"";f=f[a];null!==h&&(f=f[h]);if("x"===a)if("dateTime"===b.axisX.valueType||"dateTime"===b.xValueType||d.x&&d.x.getTime){if(g.plotInfo.plotTypes[0].plotUnits[0].axisX&&!g.plotInfo.plotTypes[0].plotUnits[0].axisX.logarithmic)return Ca(f,d.xValueFormatString? +d.xValueFormatString:b.xValueFormatString?b.xValueFormatString:b.xValueFormatString=g.axisX&&g.axisX.autoValueFormatString?g.axisX.autoValueFormatString:"DD MMM YY",g._cultureInfo)}else return ba(f,d.xValueFormatString?d.xValueFormatString:b.xValueFormatString?b.xValueFormatString:b.xValueFormatString="#,##0.########",g._cultureInfo);else return"y"===a?ba(f,d.yValueFormatString?d.yValueFormatString:b.yValueFormatString?b.yValueFormatString:b.yValueFormatString="#,##0.########",g._cultureInfo):"z"=== +a?ba(f,d.zValueFormatString?d.zValueFormatString:b.zValueFormatString?b.zValueFormatString:b.zValueFormatString="#,##0.########",g._cultureInfo):f})};qa(H,V);H.prototype.setLayout=function(){var a=this.dockInsidePlotArea?this.chart.plotArea:this.chart,d=a.layoutManager.getFreeSpace(),b=null,c=0,e=0,g=0,m=0,l=this.markerMargin=this.chart.options.legend&&!u(this.chart.options.legend.markerMargin)?this.chart.options.legend.markerMargin:0.3*this.fontSize;this.height=0;var k=[],h=[];"top"===this.verticalAlign|| +"bottom"===this.verticalAlign?(this.orientation="horizontal",b=this.verticalAlign,g=this.maxWidth=null!==this.maxWidth?this.maxWidth:d.width,m=this.maxHeight=null!==this.maxHeight?this.maxHeight:0.5*d.height):"center"===this.verticalAlign&&(this.orientation="vertical",b=this.horizontalAlign,g=this.maxWidth=null!==this.maxWidth?this.maxWidth:0.5*d.width,m=this.maxHeight=null!==this.maxHeight?this.maxHeight:d.height);this.errorMarkerColor=[];for(var s=0;s<this.dataSeries.length;s++){var q=this.dataSeries[s]; +if(q.dataPoints&&q.dataPoints.length)if("pie"!==q.type&&"doughnut"!==q.type&&"funnel"!==q.type&&"pyramid"!==q.type){var n=q.legendMarkerType=q.legendMarkerType?q.legendMarkerType:"line"!==q.type&&"stepLine"!==q.type&&"spline"!==q.type&&"scatter"!==q.type&&"bubble"!==q.type||!q.markerType?"error"===q.type&&q._linkedSeries?q._linkedSeries.legendMarkerType?q._linkedSeries.legendMarkerType:F.getDefaultLegendMarker(q._linkedSeries.type):F.getDefaultLegendMarker(q.type):q.markerType,f=q.legendText?q.legendText: +this.itemTextFormatter?this.itemTextFormatter({chart:this.chart,legend:this.options,dataSeries:q,dataPoint:null}):q.name,p=q.legendMarkerColor=q.legendMarkerColor?q.legendMarkerColor:q.markerColor?q.markerColor:"error"===q.type?u(q.whiskerColor)?q._colorSet[0]:q.whiskerColor:q._colorSet[0],r=q.markerSize||"line"!==q.type&&"stepLine"!==q.type&&"spline"!==q.type?0.75*this.lineHeight:0,v=q.legendMarkerBorderColor?q.legendMarkerBorderColor:q.markerBorderColor,t=q.legendMarkerBorderThickness?q.legendMarkerBorderThickness: +q.markerBorderThickness?Math.max(1,Math.round(0.2*r)):0;"error"===q.type&&this.errorMarkerColor.push(p);f=this.chart.replaceKeywordsWithValue(f,q.dataPoints[0],q,s);n={markerType:n,markerColor:p,text:f,textBlock:null,chartType:q.type,markerSize:r,lineColor:q._colorSet[0],dataSeriesIndex:q.index,dataPointIndex:null,markerBorderColor:v,markerBorderThickness:t};k.push(n)}else for(var z=0;z<q.dataPoints.length;z++){var x=q.dataPoints[z],n=x.legendMarkerType?x.legendMarkerType:q.legendMarkerType?q.legendMarkerType: +F.getDefaultLegendMarker(q.type),f=x.legendText?x.legendText:q.legendText?q.legendText:this.itemTextFormatter?this.itemTextFormatter({chart:this.chart,legend:this.options,dataSeries:q,dataPoint:x}):x.name?x.name:"DataPoint: "+(z+1),p=x.legendMarkerColor?x.legendMarkerColor:q.legendMarkerColor?q.legendMarkerColor:x.color?x.color:q.color?q.color:q._colorSet[z%q._colorSet.length],r=0.75*this.lineHeight,v=x.legendMarkerBorderColor?x.legendMarkerBorderColor:q.legendMarkerBorderColor?q.legendMarkerBorderColor: +x.markerBorderColor?x.markerBorderColor:q.markerBorderColor,t=x.legendMarkerBorderThickness?x.legendMarkerBorderThickness:q.legendMarkerBorderThickness?q.legendMarkerBorderThickness:x.markerBorderThickness||q.markerBorderThickness?Math.max(1,Math.round(0.2*r)):0,f=this.chart.replaceKeywordsWithValue(f,x,q,z),n={markerType:n,markerColor:p,text:f,textBlock:null,chartType:q.type,markerSize:r,dataSeriesIndex:s,dataPointIndex:z,markerBorderColor:v,markerBorderThickness:t};(x.showInLegend||q.showInLegend&& +!1!==x.showInLegend)&&k.push(n)}}!0===this.reversed&&k.reverse();if(0<k.length){q=null;p=f=x=z=0;x=null!==this.itemWidth?null!==this.itemMaxWidth?Math.min(this.itemWidth,this.itemMaxWidth,g):this.itemMaxWidth=Math.min(this.itemWidth,g):null!==this.itemMaxWidth?Math.min(this.itemMaxWidth,g):this.itemMaxWidth=g;r=0===r?0.75*this.lineHeight:r;x-=r+l;for(s=0;s<k.length;s++){n=k[s];v=x;if("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType)v-=2*0.1*this.lineHeight;if(!(0>=m||"undefined"=== +typeof m||0>=v||"undefined"===typeof v)){if("horizontal"===this.orientation){n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:v,maxHeight:this.itemWrap?m:this.lineHeight,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"});n.textBlock.measureText();null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"=== +n.chartType?2*0.1*this.lineHeight:0)));if(!q||q.width+Math.round(n.textBlock.width+r+l+(0===q.width?0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))>g)q={items:[],width:0},h.push(q),this.height+=f,f=0;f=Math.max(f,n.textBlock.height)}else n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:x,maxHeight:!0===this.itemWrap?m:1.5*this.fontSize,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily, +fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"}),n.textBlock.measureText(),null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))),this.height<m-this.lineHeight?(q={items:[],width:0},h.push(q)):(q=h[z],z=(z+1)%h.length),this.height+=n.textBlock.height;n.textBlock.x=q.width;n.textBlock.y=0;q.width+=Math.round(n.textBlock.width+r+l+(0===q.width? +0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0));q.items.push(n);this.width=Math.max(q.width,this.width);p=n.textBlock.width+(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))}}this.itemWidth=p;this.height=!1===this.itemWrap?h.length*this.lineHeight:this.height+f;this.height=Math.min(m,this.height);this.width=Math.min(g,this.width)}"top"===this.verticalAlign?(e="left"===this.horizontalAlign? +d.x1:"right"===this.horizontalAlign?d.x2-this.width:d.x1+d.width/2-this.width/2,c=d.y1):"center"===this.verticalAlign?(e="left"===this.horizontalAlign?d.x1:"right"===this.horizontalAlign?d.x2-this.width:d.x1+d.width/2-this.width/2,c=d.y1+d.height/2-this.height/2):"bottom"===this.verticalAlign&&(e="left"===this.horizontalAlign?d.x1:"right"===this.horizontalAlign?d.x2-this.width:d.x1+d.width/2-this.width/2,c=d.y2-this.height);this.items=k;for(s=0;s<this.items.length;s++)n=k[s],n.id=++this.chart._eventManager.lastObjectId, +this.chart._eventManager.objectMap[n.id]={id:n.id,objectType:"legendItem",legendItemIndex:s,dataSeriesIndex:n.dataSeriesIndex,dataPointIndex:n.dataPointIndex};this.markerSize=r;this.rows=h;0<k.length&&a.layoutManager.registerSpace(b,{width:this.width+2+2,height:this.height+5+5});this.bounds={x1:e,y1:c,x2:e+this.width,y2:c+this.height}};H.prototype.render=function(){var a=this.bounds.x1,d=this.bounds.y1,b=this.markerMargin,c=this.maxWidth,e=this.maxHeight,g=this.markerSize,m=this.rows;(0<this.borderThickness&& +this.borderColor||this.backgroundColor)&&this.ctx.roundRect(a,d,this.width,this.height,this.cornerRadius,this.borderThickness,this.backgroundColor,this.borderColor);for(var l=0,k=0;k<m.length;k++){for(var h=m[k],s=0,q=0;q<h.items.length;q++){var n=h.items[q],f=n.textBlock.x+a+(0===q?0.2*g:this.horizontalSpacing),p=d+l,u=f;this.chart.data[n.dataSeriesIndex].visible||(this.ctx.globalAlpha=0.5);this.ctx.save();this.ctx.beginPath();this.ctx.rect(a,d,c,Math.max(e-e%this.lineHeight,0));this.ctx.clip(); +if("line"===n.chartType||"stepLine"===n.chartType||"spline"===n.chartType)this.ctx.strokeStyle=n.lineColor,this.ctx.lineWidth=Math.ceil(this.lineHeight/8),this.ctx.beginPath(),this.ctx.moveTo(f-0.1*this.lineHeight,p+this.lineHeight/2),this.ctx.lineTo(f+0.85*this.lineHeight,p+this.lineHeight/2),this.ctx.stroke(),u-=0.1*this.lineHeight;if("error"===n.chartType){this.ctx.strokeStyle=this.errorMarkerColor[0];this.ctx.lineWidth=g/8;this.ctx.beginPath();var r=f-0.08*this.lineHeight+0.1*this.lineHeight, +t=p+0.15*this.lineHeight,v=0.7*this.lineHeight,x=v+0.02*this.lineHeight;this.ctx.moveTo(r,t);this.ctx.lineTo(r+v,t);this.ctx.stroke();this.ctx.beginPath();this.ctx.moveTo(r+v/2,t);this.ctx.lineTo(r+v/2,t+x);this.ctx.stroke();this.ctx.beginPath();this.ctx.moveTo(r,t+x);this.ctx.lineTo(r+v,t+x);this.ctx.stroke();this.errorMarkerColor.shift()}ia.drawMarker(f+g/2,p+this.lineHeight/2,this.ctx,n.markerType,"error"===n.chartType||"line"===n.chartType||"spline"===n.chartType?n.markerSize/2:n.markerSize,n.markerColor, +n.markerBorderColor,n.markerBorderThickness);n.textBlock.x=f+b+g;if("line"===n.chartType||"stepLine"===n.chartType||"spline"===n.chartType)n.textBlock.x+=0.1*this.lineHeight;n.textBlock.y=Math.round(p+this.lineHeight/2);n.textBlock.render(!0);this.ctx.restore();s=0<q?Math.max(s,n.textBlock.height):n.textBlock.height;this.chart.data[n.dataSeriesIndex].visible||(this.ctx.globalAlpha=1);f=N(n.id);this.ghostCtx.fillStyle=f;this.ghostCtx.beginPath();this.ghostCtx.fillRect(u,n.textBlock.y-this.lineHeight/ +2,n.textBlock.x+n.textBlock.width-u,n.textBlock.height);n.x1=this.chart._eventManager.objectMap[n.id].x1=u;n.y1=this.chart._eventManager.objectMap[n.id].y1=n.textBlock.y-this.lineHeight/2;n.x2=this.chart._eventManager.objectMap[n.id].x2=n.textBlock.x+n.textBlock.width;n.y2=this.chart._eventManager.objectMap[n.id].y2=n.textBlock.y+n.textBlock.height-this.lineHeight/2}l+=s}};qa(F,V);F.prototype.getDefaultAxisPlacement=function(){var a=this.type;if("column"===a||"line"===a||"stepLine"===a||"spline"=== +a||"area"===a||"stepArea"===a||"splineArea"===a||"stackedColumn"===a||"stackedLine"===a||"bubble"===a||"scatter"===a||"stackedArea"===a||"stackedColumn100"===a||"stackedLine100"===a||"stackedArea100"===a||"candlestick"===a||"ohlc"===a||"rangeColumn"===a||"rangeArea"===a||"rangeSplineArea"===a||"boxAndWhisker"===a||"waterfall"===a)return"normal";if("bar"===a||"stackedBar"===a||"stackedBar100"===a||"rangeBar"===a)return"xySwapped";if("pie"===a||"doughnut"===a||"funnel"===a||"pyramid"===a)return"none"; +"error"!==a&&window.console.log("Unknown Chart Type: "+a);return null};F.getDefaultLegendMarker=function(a){if("column"===a||"stackedColumn"===a||"stackedLine"===a||"bar"===a||"stackedBar"===a||"stackedBar100"===a||"bubble"===a||"scatter"===a||"stackedColumn100"===a||"stackedLine100"===a||"stepArea"===a||"candlestick"===a||"ohlc"===a||"rangeColumn"===a||"rangeBar"===a||"rangeArea"===a||"rangeSplineArea"===a||"boxAndWhisker"===a||"waterfall"===a)return"square";if("line"===a||"stepLine"===a||"spline"=== +a||"pie"===a||"doughnut"===a)return"circle";if("area"===a||"splineArea"===a||"stackedArea"===a||"stackedArea100"===a||"funnel"===a||"pyramid"===a)return"triangle";if("error"===a)return"none";window.console.log("Unknown Chart Type: "+a);return null};F.prototype.getDataPointAtX=function(a,d){if(!this.dataPoints||0===this.dataPoints.length)return null;var b={dataPoint:null,distance:Infinity,index:NaN},c=null,e=0,g=0,m=1,l=Infinity,k=0,h=0,s=0;"none"!==this.chart.plotInfo.axisPlacement&&(this.axisX.logarithmic? +(s=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),s=1<s?Math.min(Math.max((this.dataPoints.length-1)/s*Math.log(a/this.dataPoints[0].x)>>0,0),this.dataPoints.length):0):(s=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,s=0<s?Math.min(Math.max((this.dataPoints.length-1)/s*(a-this.dataPoints[0].x)>>0,0),this.dataPoints.length):0));for(;;){g=0<m?s+e:s-e;if(0<=g&&g<this.dataPoints.length){var c=this.dataPoints[g],q=this.axisX.logarithmic?c.x>a?c.x/a:a/c.x: +Math.abs(c.x-a);q<b.distance&&(b.dataPoint=c,b.distance=q,b.index=g);c=q;c<=l?l=c:0<m?k++:h++;if(1E3<k&&1E3<h)break}else if(0>s-e&&s+e>=this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}return d||b.dataPoint.x!==a?d&&null!==b.dataPoint?b:null:b};F.prototype.getDataPointAtXY=function(a,d,b){if(!this.dataPoints||0===this.dataPoints.length||a<this.chart.plotArea.x1||a>this.chart.plotArea.x2||d<this.chart.plotArea.y1||d>this.chart.plotArea.y2)return null;b=b||!1;var c=[],e=0,g=0,m=1,l=!1,k=Infinity, +h=0,s=0,q=0;if("none"!==this.chart.plotInfo.axisPlacement)if(q=(this.chart.axisX[0]?this.chart.axisX[0]:this.chart.axisX2[0]).getXValueAt({x:a,y:d}),this.axisX.logarithmic)var n=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),q=1<n?Math.min(Math.max((this.dataPoints.length-1)/n*Math.log(q/this.dataPoints[0].x)>>0,0),this.dataPoints.length):0;else n=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,q=0<n?Math.min(Math.max((this.dataPoints.length-1)/n*(q-this.dataPoints[0].x)>> +0,0),this.dataPoints.length):0;for(;;){g=0<m?q+e:q-e;if(0<=g&&g<this.dataPoints.length){var n=this.chart._eventManager.objectMap[this.dataPointIds[g]],f=this.dataPoints[g],p=null;if(n){switch(this.type){case "column":case "stackedColumn":case "stackedColumn100":case "bar":case "stackedBar":case "stackedBar100":case "rangeColumn":case "rangeBar":case "waterfall":case "error":a>=n.x1&&(a<=n.x2&&d>=n.y1&&d<=n.y2)&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1- +a),Math.abs(n.x2-a),Math.abs(n.y1-d),Math.abs(n.y2-d))}),l=!0);break;case "line":case "stepLine":case "spline":case "area":case "stepArea":case "stackedArea":case "stackedArea100":case "splineArea":case "scatter":var u=na("markerSize",f,this)||4,r=b?20:u,p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0<m?h++:s++;p<=u/2&&(l=!0);break;case "rangeArea":case "rangeSplineArea":u=na("markerSize",f,this)|| +4;r=b?20:u;p=Math.min(Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2)),Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y2-d,2)));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0<m?h++:s++;p<=u/2&&(l=!0);break;case "bubble":u=n.size;p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=u/2&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p}),l=!0);break;case "pie":case "doughnut":u=n.center;r="doughnut"===this.type?n.percentInnerRadius*n.radius: +0;p=Math.sqrt(Math.pow(u.x-a,2)+Math.pow(u.y-d,2));p<n.radius&&p>r&&(p=Math.atan2(d-u.y,a-u.x),0>p&&(p+=2*Math.PI),p=Number(((180*(p/Math.PI)%360+360)%360).toFixed(12)),u=Number(((180*(n.startAngle/Math.PI)%360+360)%360).toFixed(12)),r=Number(((180*(n.endAngle/Math.PI)%360+360)%360).toFixed(12)),0===r&&1<n.endAngle&&(r=360),u>=r&&0!==f.y&&(r+=360,p<u&&(p+=360)),p>u&&p<r&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:0}),l=!0));break;case "funnel":case "pyramid":p=n.funnelSection; +d>p.y1&&d<p.y4&&(p.y6?d>p.y6?(g=p.x6+(p.x5-p.x6)/(p.y5-p.y6)*(d-p.y6),p=p.x3+(p.x4-p.x3)/(p.y4-p.y3)*(d-p.y3)):(g=p.x1+(p.x6-p.x1)/(p.y6-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)):(g=p.x1+(p.x4-p.x1)/(p.y4-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)),a>g&&a<p&&(c.push({dataPoint:f,dataPointIndex:n.dataPointIndex,dataSeries:this,distance:0}),l=!0));break;case "boxAndWhisker":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y4-n.borderThickness/2&&d<=n.y1+n.borderThickness/ +2||Math.abs(n.x2-a+n.x1-a)<n.borderThickness&&d>=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "candlestick":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y2-n.borderThickness/2&&d<=n.y3+n.borderThickness/2||Math.abs(n.x2-a+n.x1-a)<n.borderThickness&&d>=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a), +Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "ohlc":if(Math.abs(n.x2-a+n.x1-a)<n.borderThickness&&d>=n.y2&&d<=n.y3||a>=n.x1&&a<=(n.x2+n.x1)/2&&d>=n.y1-n.borderThickness/2&&d<=n.y1+n.borderThickness/2||a>=(n.x1+n.x2)/2&&a<=n.x2&&d>=n.y4-n.borderThickness/2&&d<=n.y4+n.borderThickness/2)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0}if(l||1E3<h&&1E3<s)break}}else if(0>q-e&&q+e>= +this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}a=null;for(d=0;d<c.length;d++)a?c[d].distance<=a.distance&&(a=c[d]):a=c[d];return a};F.prototype.getMarkerProperties=function(a,d,b,c){var e=this.dataPoints;return{x:d,y:b,ctx:c,type:e[a].markerType?e[a].markerType:this.markerType,size:e[a].markerSize?e[a].markerSize:this.markerSize,color:e[a].markerColor?e[a].markerColor:this.markerColor?this.markerColor:e[a].color?e[a].color:this.color?this.color:this._colorSet[a%this._colorSet.length],borderColor:e[a].markerBorderColor? +e[a].markerBorderColor:this.markerBorderColor?this.markerBorderColor:null,borderThickness:e[a].markerBorderThickness?e[a].markerBorderThickness:this.markerBorderThickness?this.markerBorderThickness:null}};qa(z,V);z.prototype.createExtraLabelsForLog=function(a){a=(a||0)+1;if(!(5<a)){var d=this.logLabelValues[0]||this.intervalStartPosition;if(Math.log(this.range)/Math.log(d/this.viewportMinimum)<this.noTicks-1){for(var b=z.getNiceNumber((d-this.viewportMinimum)/Math.min(Math.max(2,this.noTicks-this.logLabelValues.length), +3),!0),c=Math.ceil(this.viewportMinimum/b)*b;c<d;c+=b)c<this.viewportMinimum||this.logLabelValues.push(c);this.logLabelValues.sort(Sa);this.createExtraLabelsForLog(a)}}};z.prototype.createLabels=function(){var a,d,b=0,c=0,e,g=0,m=0,c=0,c=this.interval,l=0,k,h=0.6*this.chart.height,p;a=!1;var q=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],n=q.length?u(this.scaleBreaks.firstBreakIndex)?0:this.scaleBreaks.firstBreakIndex:0;if("axisX"!==this.type||"dateTime"!==this.valueType||this.logarithmic){e= +this.viewportMaximum;if(this.labels){a=Math.ceil(c);for(var c=Math.ceil(this.intervalStartPosition),f=!1,b=c;b<this.viewportMaximum;b+=a)if(this.labels[b])f=!0;else{f=!1;break}f&&(this.interval=a,this.intervalStartPosition=c)}if(this.logarithmic&&!this.equidistantInterval)for(this.logLabelValues||(this.logLabelValues=[],this.createExtraLabelsForLog()),c=0,f=n;c<this.logLabelValues.length;c++)if(b=this.logLabelValues[c],b<this.viewportMinimum)c++;else{for(;f<q.length&&b>q[f].endValue;f++);a=f<q.length&& +b>=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius, +horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle",borderThickness:0}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}f=n;for(b=this.intervalStartPosition;b<=e;b=parseFloat(1E-12>this.interval?this.logarithmic&&this.equidistantInterval?b*Math.pow(this.logarithmBase,this.interval):b+this.interval:(this.logarithmic&&this.equidistantInterval? +b*Math.pow(this.logarithmBase,this.interval):b+this.interval).toFixed(12))){for(;f<q.length&&b>q[f].endValue;f++);a=f<q.length&&b>=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix, +horizontalAlign:"left",backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}}else for(this.intervalStartPosition=this.getLabelStartPoint(new Date(this.viewportMinimum), +this.intervalType,this.interval),e=Ya(new Date(this.viewportMaximum),this.interval,this.intervalType),f=n,b=this.intervalStartPosition;b<e;Ya(b,c,this.intervalType)){for(a=b.getTime();f<q.length&&a>q[f].endValue;f++);p=a;a=f<q.length&&a>=q[f].startValue&&a<=q[f].endValue;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:new Date(p),label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:Ca(p,this.valueFormatString,this.chart._cultureInfo), +a=new ka(this.ctx,{x:0,y:0,maxWidth:g,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null, +breaksLabelType:void 0}))}if("bottom"===this._position||"top"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.width*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length-2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.width/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+ +"Duration"]*this.interval,g="undefined"===typeof this.options.labelMaxWidth?0.5*this.chart.width>>0:this.options.labelMaxWidth,this.chart.panEnabled||(m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize);else if("left"===this._position||"right"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.height*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length- +2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.height/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+"Duration"]*this.interval,this.chart.panEnabled||(g="undefined"===typeof this.options.labelMaxWidth?0.3*this.chart.width>>0:this.options.labelMaxWidth),m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize; +for(c=0;c<this._labels.length;c++){a=this._labels[c].textBlock;a.maxWidth=g;a.maxHeight=m;var B=a.measureText();k=B.height}e=[];n=q=0;if(this.labelAutoFit||this.options.labelAutoFit)if(u(this.labelAngle)||(this.labelAngle=(this.labelAngle%360+360)%360,90<this.labelAngle&&270>this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360)),"bottom"===this._position||"top"===this._position)if(g=0.9*l>>0,n=0,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize= +this.labelFontSize;this.sessionVariables.labelMaxWidth=g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=this.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b<this._labels.length;b++)if(!this._labels[b].breaksLabelType){a=this._labels[b].textBlock;for(var v,f=a.text.split(" "),c=0;c<f.length;c++)p=f[c],this.ctx.font=a.fontStyle+" "+a.fontWeight+" "+a.fontSize+"px "+a.fontFamily,p=this.ctx.measureText(p),p.width>n&&(v=b,n=p.width)}b=0;for(b=this.intervalStartPosition< +this.viewportMinimum?1:0;b<this._labels.length;b++)if(!this._labels[b].breaksLabelType){a=this._labels[b].textBlock;B=a.measureText();for(f=b+1;f<this._labels.length;f++)if(!this._labels[f].breaksLabelType){d=this._labels[f].textBlock;d=d.measureText();break}e.push(a.height);this.sessionVariables.labelMaxHeight=Math.max.apply(Math,e);Math.cos(Math.PI/180*Math.abs(this.labelAngle));Math.sin(Math.PI/180*Math.abs(this.labelAngle));c=g*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(m-a.fontSize/2)* +Math.cos(Math.PI/180*Math.abs(this.labelAngle));if(u(this.options.labelAngle)&&isNaN(this.options.labelAngle)&&0!==this.options.labelAngle)if(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(-25)))/Math.sin(Math.PI/180*Math.abs(-25)),!u(this.options.labelWrap))this.labelWrap?u(this.options.labelMaxWidth)?(this.sessionVariables.labelMaxWidth= +Math.min(Math.max(g,n),p),this.sessionVariables.labelWrap=this.labelWrap,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25)):(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle):u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth= +g,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p)):(this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=this.labelWrap);else{if(u(this.options.labelWrap))if(!u(this.options.labelMaxWidth))this.options.labelMaxWidth<g?(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth, +this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m);else if(!u(d))if(c=B.width+d.width>>0,f=this.labelFontSize,n<g)c-2*g>q&&(q=c-2*g,c>=2*g&&c<2.2*g?(this.sessionVariables.labelMaxWidth=g,u(this.options.labelFontSize)&&12<f&&(f=Math.floor(12/13*f),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelAngle= +this.labelAngle):c>=2.2*g&&c<2.8*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=f):c>=2.8*g&&c<3.2*g?(this.sessionVariables.labelMaxWidth=Math.max(g,n),this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12<this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelAngle= +this.labelAngle):c>=3.2*g&&c<3.6*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=this.labelFontSize):c>3.6*g&&c<5*g?(u(this.options.labelFontSize)&&12<f&&(f=Math.floor(12/13*f),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p): +c>5*g&&(this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelFontSize=f,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=this.labelAngle));else if(v===b&&(0===v&&n+this._labels[v+1].textBlock.measureText().width-2*g>q||v===this._labels.length-1&&n+this._labels[v-1].textBlock.measureText().width-2*g>q||0<v&&v<this._labels.length-1&&n+this._labels[v+1].textBlock.measureText().width-2*g>q&&n+this._labels[v-1].textBlock.measureText().width- +2*g>q))q=0===v?n+this._labels[v+1].textBlock.measureText().width-2*g:n+this._labels[v-1].textBlock.measureText().width-2*g,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p;else if(0===q)for(this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,c=0;c<this._labels.length;c++)a= +this._labels[c].textBlock,a.maxWidth=this.sessionVariables.labelMaxWidth=Math.min(Math.max(g,n),p),B=a.measureText(),c<this._labels.length-1&&(f=c+1,d=this._labels[f].textBlock,d.maxWidth=this.sessionVariables.labelMaxWidth=Math.min(Math.max(g,n),p),d=d.measureText(),B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25))}else(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/ +Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=0!=this.labelAngle?(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)):g,this.sessionVariables.labelMaxHeight=m=this.labelWrap?(h-p*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)):1.5*this.labelFontSize,u(this.options.labelWrap))?u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap= +this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelMaxHeight=c<0.9*l?0.9*l:c,this.sessionVariables.labelWrap=this.labelWrap)):(this.options.labelWrap?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p): +(u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelWrap=this.labelWrap),this.sessionVariables.labelMaxHeight=m)}for(c=0;c<this._labels.length;c++)a=this._labels[c].textBlock,a.maxWidth=this.labelMaxWidth=this.sessionVariables.labelMaxWidth,a.fontSize=this.sessionVariables.labelFontSize,a.angle=this.labelAngle=this.sessionVariables.labelAngle,a.wrap=this.labelWrap=this.sessionVariables.labelWrap,a.maxHeight= +this.sessionVariables.labelMaxHeight,a.measureText()}else for(b=0;b<this._labels.length;b++)a=this._labels[b].textBlock,a.maxWidth=this.labelMaxWidth=u(this.options.labelMaxWidth)?this.sessionVariables.labelMaxWidth:this.options.labelMaxWidth,a.fontSize=this.labelFontSize=u(this.options.labelFontSize)?this.sessionVariables.labelFontSize:this.options.labelFontSize,a.angle=this.labelAngle=u(this.options.labelAngle)?this.sessionVariables.labelAngle:this.labelAngle,a.wrap=this.labelWrap=u(this.options.labelWrap)? +this.sessionVariables.labelWrap:this.options.labelWrap,a.maxHeight=this.sessionVariables.labelMaxHeight,a.measureText();else if("left"===this._position||"right"===this._position)if(g=u(this.options.labelMaxWidth)?0.3*this.chart.width>>0:this.options.labelMaxWidth,m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize=this.labelFontSize;this.sessionVariables.labelMaxWidth= +g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b<this._labels.length;b++)if(!this._labels[b].breaksLabelType){a=this._labels[b].textBlock;B=a.measureText();for(f=b+1;f<this._labels.length;f++)if(!this._labels[f].breaksLabelType){d=this._labels[f].textBlock;d=d.measureText();break}e.push(a.height);this.sessionVariables.labelMaxHeight=Math.max.apply(Math, +e);c=g*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(m-a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle));Math.cos(Math.PI/180*Math.abs(this.labelAngle));Math.sin(Math.PI/180*Math.abs(this.labelAngle));u(this.options.labelAngle)&&isNaN(this.options.labelAngle)&&0!==this.options.labelAngle?u(this.options.labelWrap)?u(this.options.labelWrap)&&(u(this.options.labelMaxWidth)?u(d)||(l=B.height+d.height>>0,l-2*m>n&&(n=l-2*m,l>=2*m&&l<2.4*m?(u(this.options.labelFontSize)&&12<this.labelFontSize&& +(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize):l>=2.4*m&&l<2.8*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelFontSize=this.labelFontSize,this.sessionVariables.labelWrap=!0):l>=2.8*m&&l<3.2*m?(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12< +this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>=3.2*m&&l<3.6*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelFontSize=this.labelFontSize):l>3.6*m&&l<10*m?(u(this.options.labelFontSize)&& +12<this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>10*m&&l<50*m&&(u(this.options.labelFontSize)&&12<this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize), +a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle))):(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth)):(this.sessionVariables.labelMaxWidth= +this.labelWrap?this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth:this.labelMaxWidth?this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=0===this.labelAngle?g:Math.min((c-m*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)),m),u(this.options.labelWrap))? +u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth>this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,u(this.options.labelMaxWidth)&& +(this.sessionVariables.labelAngle=this.labelAngle))):this.options.labelWrap?(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=g):(this.sessionVariables.labelMaxHeight=m,u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap)}for(c=0;c<this._labels.length;c++)a= +this._labels[c].textBlock,a.maxWidth=this.labelMaxWidth=this.sessionVariables.labelMaxWidth,a.fontSize=this.labelFontSize=this.sessionVariables.labelFontSize,a.angle=this.labelAngle=this.sessionVariables.labelAngle,a.wrap=this.labelWrap=this.sessionVariables.labelWrap,a.maxHeight=this.sessionVariables.labelMaxHeight,a.measureText()}else for(b=0;b<this._labels.length;b++)a=this._labels[b].textBlock,a.maxWidth=this.labelMaxWidth=u(this.options.labelMaxWidth)?this.sessionVariables.labelMaxWidth:this.options.labelMaxWidth, +a.fontSize=this.labelFontSize=u(this.options.labelFontSize)?this.sessionVariables.labelFontSize:this.options.labelFontSize,a.angle=this.labelAngle=u(this.options.labelAngle)?this.sessionVariables.labelAngle:this.labelAngle,a.wrap=this.labelWrap=u(this.options.labelWrap)?this.sessionVariables.labelWrap:this.options.labelWrap,a.maxHeight=this.sessionVariables.labelMaxHeight,a.measureText();for(b=0;b<this.stripLines.length;b++){var g=this.stripLines[b],z;if("outside"===g.labelPlacement){m=this.sessionVariables.labelMaxWidth; +if("bottom"===this._position||"top"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize;if("left"===this._position||"right"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.width>>0:1.5*this.labelFontSize;u(g.labelBackgroundColor)&&(g.labelBackgroundColor="#EEEEEE")}else m="bottom"===this._position||"top"===this._position?0.9*this.chart.width>>0:0.9*this.chart.height>> +0,z=u(g.options.labelWrap)||g.labelWrap?"bottom"===this._position||"top"===this._position?0.8*this.chart.width>>0:0.8*this.chart.height>>0:1.5*this.labelFontSize,u(g.labelBackgroundColor)&&(u(g.startValue)&&0!==g.startValue?g.labelBackgroundColor=r?"transparent":null:g.labelBackgroundColor="#EEEEEE");a=new ka(this.ctx,{x:0,y:0,backgroundColor:g.labelBackgroundColor,borderColor:g.labelBorderColor,borderThickness:g.labelBorderThickness,cornerRadius:g.labelCornerRadius,maxWidth:g.options.labelMaxWidth? +g.options.labelMaxWidth:m,maxHeight:z,angle:this.labelAngle,text:g.labelFormatter?g.labelFormatter({chart:this.chart,axis:this,stripLine:g}):g.label,horizontalAlign:"left",fontSize:"outside"===g.labelPlacement?g.options.labelFontSize?g.labelFontSize:this.labelFontSize:g.labelFontSize,fontFamily:"outside"===g.labelPlacement?g.options.labelFontFamily?g.labelFontFamily:this.labelFontFamily:g.labelFontFamily,fontWeight:"outside"===g.labelPlacement?g.options.labelFontWeight?g.labelFontWeight:this.labelFontWeight: +g.labelFontWeight,fontColor:g.labelFontColor||g.color,fontStyle:"outside"===g.labelPlacement?g.options.labelFontStyle?g.labelFontStyle:this.fontWeight:g.labelFontStyle,textBaseline:"middle"});this._stripLineLabels.push({position:g.value,textBlock:a,effectiveHeight:null,stripLine:g})}};z.prototype.createLabelsAndCalculateWidth=function(){var a=0,d=0;this._labels=[];this._stripLineLabels=[];var b=this.chart.isNavigator?0:5;if("left"===this._position||"right"===this._position){this.createLabels();for(d= +0;d<this._labels.length;d++){var c=this._labels[d].textBlock,e=c.measureText(),g=0,g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle));a<g&&(a=g);this._labels[d].effectiveWidth=g}for(d=0;d<this._stripLineLabels.length;d++)"outside"===this._stripLineLabels[d].stripLine.labelPlacement&&(this._stripLineLabels[d].stripLine.value>=this.viewportMinimum&&this._stripLineLabels[d].stripLine.value<=this.viewportMaximum)&& +(c=this._stripLineLabels[d].textBlock,e=c.measureText(),g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle)),a<g&&(a=g),this._stripLineLabels[d].effectiveWidth=g)}d=this.title?this._titleTextBlock.measureText().height+2:0;return c="inside"===this.labelPlacement?c=d+b:d+a+this.tickLength+b};z.prototype.createLabelsAndCalculateHeight=function(){var a=0;this._labels=[];this._stripLineLabels=[];var d, +b=0,c=this.chart.isNavigator?0:5;this.createLabels();if("bottom"===this._position||"top"===this._position){for(b=0;b<this._labels.length;b++){d=this._labels[b].textBlock;var e=d.measureText(),g=0,g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle));a<g&&(a=g);this._labels[b].effectiveHeight=g}for(b=0;b<this._stripLineLabels.length;b++)"outside"===this._stripLineLabels[b].stripLine.labelPlacement&& +(this._stripLineLabels[b].stripLine.value>=this.viewportMinimum&&this._stripLineLabels[b].stripLine.value<=this.viewportMaximum)&&(d=this._stripLineLabels[b].textBlock,e=d.measureText(),g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)),a<g&&(a=g),this._stripLineLabels[b].effectiveHeight=g)}d=this.title?this._titleTextBlock.measureText().height+2:0;return b="inside"===this.labelPlacement?b= +d+c:d+a+this.tickLength+c};z.setLayout=function(a,d,b,c,e,g){var m,l,k,h,p=a[0]?a[0].chart:d[0].chart,q=p.isNavigator?0:10,n=p._axes;if(a&&0<a.length)for(var f=0;f<a.length;f++)a[f]&&a[f].calculateAxisParameters();if(d&&0<d.length)for(f=0;f<d.length;f++)d[f].calculateAxisParameters();if(b&&0<b.length)for(f=0;f<b.length;f++)b[f].calculateAxisParameters();if(c&&0<c.length)for(f=0;f<c.length;f++)c[f].calculateAxisParameters();for(f=0;f<n.length;f++)if(n[f]&&n[f].scaleBreaks&&n[f].scaleBreaks._appliedBreaks.length)for(var r= +n[f].scaleBreaks._appliedBreaks,v=0;v<r.length&&!(r[v].startValue>n[f].viewportMaximum);v++)r[v].endValue<n[f].viewportMinimum||(u(n[f].scaleBreaks.firstBreakIndex)&&(n[f].scaleBreaks.firstBreakIndex=v),r[v].startValue>=n[f].viewPortMinimum&&(n[f].scaleBreaks.lastBreakIndex=v));for(var z=v=0,t=0,C=0,x=0,D=0,y=0,A,E,F=l=0,H,I,L,r=H=I=L=!1,f=0;f<n.length;f++)n[f]&&n[f].title&&(n[f]._titleTextBlock=new ka(n[f].ctx,{text:n[f].title,horizontalAlign:"center",fontSize:n[f].titleFontSize,fontFamily:n[f].titleFontFamily, +fontWeight:n[f].titleFontWeight,fontColor:n[f].titleFontColor,fontStyle:n[f].titleFontStyle,borderColor:n[f].titleBorderColor,borderThickness:n[f].titleBorderThickness,backgroundColor:n[f].titleBackgroundColor,cornerRadius:n[f].titleCornerRadius,textBaseline:"top"}));for(f=0;f<n.length;f++)if(n[f].title)switch(n[f]._position){case "left":n[f]._titleTextBlock.maxWidth=n[f].titleMaxWidth||g.height;n[f]._titleTextBlock.maxHeight=n[f].titleWrap?0.8*g.width:1.5*n[f].titleFontSize;n[f]._titleTextBlock.angle= +-90;break;case "right":n[f]._titleTextBlock.maxWidth=n[f].titleMaxWidth||g.height;n[f]._titleTextBlock.maxHeight=n[f].titleWrap?0.8*g.width:1.5*n[f].titleFontSize;n[f]._titleTextBlock.angle=90;break;default:n[f]._titleTextBlock.maxWidth=n[f].titleMaxWidth||g.width,n[f]._titleTextBlock.maxHeight=n[f].titleWrap?0.8*g.height:1.5*n[f].titleFontSize,n[f]._titleTextBlock.angle=0}if("normal"===e){for(var C=[],x=[],D=[],y=[],M=[],N=[],O=[],Q=[];4>v;){var G=0,R=0,S=0,U=0,W=e=0,K=0,$=0,V=0,X=0,P=0,ba=0;if(b&& +0<b.length)for(D=[],f=P=0;f<b.length;f++)D.push(Math.ceil(b[f]?b[f].createLabelsAndCalculateWidth():0)),P+=D[f],K+=b[f]&&!p.isNavigator?b[f].margin:0;else D.push(Math.ceil(b[0]?b[0].createLabelsAndCalculateWidth():0));O.push(D);if(c&&0<c.length)for(y=[],f=ba=0;f<c.length;f++)y.push(Math.ceil(c[f]?c[f].createLabelsAndCalculateWidth():0)),ba+=y[f],$+=c[f]?c[f].margin:0;else y.push(Math.ceil(c[0]?c[0].createLabelsAndCalculateWidth():0));Q.push(y);m=Math.round(g.x1+P+K);k=Math.round(g.x2-ba-$>p.width- +q?p.width-q:g.x2-ba-$);if(a&&0<a.length)for(C=[],f=V=0;f<a.length;f++)a[f]&&(a[f].lineCoordinates={}),a[f].lineCoordinates.width=Math.abs(k-m),a[f].title&&(a[f]._titleTextBlock.maxWidth=0<a[f].titleMaxWidth&&a[f].titleMaxWidth<a[f].lineCoordinates.width?a[f].titleMaxWidth:a[f].lineCoordinates.width),C.push(Math.ceil(a[f]?a[f].createLabelsAndCalculateHeight():0)),V+=C[f],e+=a[f]&&!p.isNavigator?a[f].margin:0;else C.push(Math.ceil(a[0]?a[0].createLabelsAndCalculateHeight():0));M.push(C);if(d&&0<d.length)for(x= +[],f=X=0;f<d.length;f++)d[f]&&(d[f].lineCoordinates={}),d[f].lineCoordinates.width=Math.abs(k-m),d[f].title&&(d[f]._titleTextBlock.maxWidth=0<d[f].titleMaxWidth&&d[f].titleMaxWidth<d[f].lineCoordinates.width?d[f].titleMaxWidth:d[f].lineCoordinates.width),x.push(Math.ceil(d[f]?d[f].createLabelsAndCalculateHeight():0)),X+=x[f],W+=d[f]&&!p.isNavigator?d[f].margin:0;else x.push(Math.ceil(d[0]?d[0].createLabelsAndCalculateHeight():0));N.push(x);if(a&&0<a.length)for(f=0;f<a.length;f++)a[f]&&(a[f].lineCoordinates.x1= +m,k=Math.round(g.x2-ba-$>p.width-q?p.width-q:g.x2-ba-$),a[f]._labels&&1<a[f]._labels.length&&(l=h=0,h=a[f]._labels[1],l="dateTime"===a[f].valueType?a[f]._labels[a[f]._labels.length-2]:a[f]._labels[a[f]._labels.length-1],z=h.textBlock.width*Math.cos(Math.PI/180*Math.abs(h.textBlock.angle))+(h.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/180*Math.abs(h.textBlock.angle)),t=l.textBlock.width*Math.cos(Math.PI/180*Math.abs(l.textBlock.angle))+(l.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/ +180*Math.abs(l.textBlock.angle))),!a[f]||(!a[f].labelAutoFit||u(A)||u(E)||p.isNavigator)||(l=0,0<a[f].labelAngle?E+t>k&&(l+=0<a[f].labelAngle?E+t-k-ba:0):0>a[f].labelAngle?A-z<m&&A-z<a[f].viewportMinimum&&(F=m-(K+a[f].tickLength+D+A-z+a[f].labelFontSize/2)):0===a[f].labelAngle&&(E+t>k&&(l=E+t/2-k-ba),A-z<m&&A-z<a[f].viewportMinimum&&(F=m-K-a[f].tickLength-D-A+z/2)),a[f].viewportMaximum===a[f].maximum&&a[f].viewportMinimum===a[f].minimum&&0<a[f].labelAngle&&0<l?k-=l:a[f].viewportMaximum===a[f].maximum&& +a[f].viewportMinimum===a[f].minimum&&0>a[f].labelAngle&&0<F?m+=F:a[f].viewportMaximum===a[f].maximum&&a[f].viewportMinimum===a[f].minimum&&0===a[f].labelAngle&&(0<F&&(m+=F),0<l&&(k-=l))),p.panEnabled?V=p.sessionVariables.axisX.height:p.sessionVariables.axisX.height=V,l=Math.round(g.y2-V-e+G),h=Math.round(g.y2),a[f].lineCoordinates.x2=k,a[f].lineCoordinates.width=k-m,a[f].lineCoordinates.y1=l,a[f].lineCoordinates.y2=l,a[f].bounds={x1:m,y1:l,x2:k,y2:h-(V+e-C[f]-G),width:k-m,height:h-l}),G+=C[f]+a[f].margin; +if(d&&0<d.length)for(f=0;f<d.length;f++)d[f].lineCoordinates.x1=Math.round(g.x1+P+K),d[f].lineCoordinates.x2=Math.round(g.x2-ba-$>p.width-q?p.width-q:g.x2-ba-$),d[f].lineCoordinates.width=Math.abs(k-m),d[f]._labels&&1<d[f]._labels.length&&(h=d[f]._labels[1],l="dateTime"===d[f].valueType?d[f]._labels[d[f]._labels.length-2]:d[f]._labels[d[f]._labels.length-1],z=h.textBlock.width*Math.cos(Math.PI/180*Math.abs(h.textBlock.angle))+(h.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/180*Math.abs(h.textBlock.angle)), +t=l.textBlock.width*Math.cos(Math.PI/180*Math.abs(l.textBlock.angle))+(l.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/180*Math.abs(l.textBlock.angle))),p.panEnabled?X=p.sessionVariables.axisX2.height:p.sessionVariables.axisX2.height=X,l=Math.round(g.y1),h=Math.round(g.y2+d[f].margin),d[f].lineCoordinates.y1=l+X+W-R,d[f].lineCoordinates.y2=l,d[f].bounds={x1:m,y1:l+(X+W-x[f]-R),x2:k,y2:h,width:k-m,height:h-l},R+=x[f]+d[f].margin;if(b&&0<b.length)for(f=0;f<b.length;f++)K=p.isNavigator?0: +10,b[f]&&(m=Math.round(a[0]?a[0].lineCoordinates.x1:d[0].lineCoordinates.x1),K=b[f]._labels&&0<b[f]._labels.length?b[f]._labels[b[f]._labels.length-1].textBlock.height/2:q,l=Math.round(g.y1+X+W<Math.max(K,q)?Math.max(K,q):g.y1+X+W),k=Math.round(a[0]?a[0].lineCoordinates.x1:d[0].lineCoordinates.x1),K=0<a.length?0:b[f]._labels&&0<b[f]._labels.length?b[f]._labels[0].textBlock.height/2:q,h=Math.round(g.y2-V-e-K),b[f].lineCoordinates={x1:k-S,y1:l,x2:k-S,y2:h,height:Math.abs(h-l)},b[f].bounds={x1:m-(D[f]+ +S),y1:l,x2:k,y2:h,width:k-m,height:h-l},b[f].title&&(b[f]._titleTextBlock.maxWidth=0<b[f].titleMaxWidth&&b[f].titleMaxWidth<b[f].lineCoordinates.height?b[f].titleMaxWidth:b[f].lineCoordinates.height),S+=D[f]+b[f].margin);if(c&&0<c.length)for(f=0;f<c.length;f++)c[f]&&(m=Math.round(a[0]?a[0].lineCoordinates.x2:d[0].lineCoordinates.x2),k=Math.round(m),K=c[f]._labels&&0<c[f]._labels.length?c[f]._labels[c[f]._labels.length-1].textBlock.height/2:0,l=Math.round(g.y1+X+W<Math.max(K,q)?Math.max(K,q):g.y1+ +X+W),K=0<a.length?0:c[f]._labels&&0<c[f]._labels.length?c[f]._labels[0].textBlock.height/2:0,h=Math.round(g.y2-(V+e+K)),c[f].lineCoordinates={x1:m+U,y1:l,x2:m+U,y2:h,height:Math.abs(h-l)},c[f].bounds={x1:m,y1:l,x2:k+(y[f]+U),y2:h,width:k-m,height:h-l},c[f].title&&(c[f]._titleTextBlock.maxWidth=0<c[f].titleMaxWidth&&c[f].titleMaxWidth<c[f].lineCoordinates.height?c[f].titleMaxWidth:c[f].lineCoordinates.height),U+=y[f]+c[f].margin);if(a&&0<a.length)for(f=0;f<a.length;f++)a[f]&&(a[f].calculateValueToPixelConversionParameters(), +a[f].calculateBreaksSizeInValues(),a[f]._labels&&1<a[f]._labels.length&&(A=(a[f].logarithmic?Math.log(a[f]._labels[1].position/a[f].viewportMinimum)/a[f].conversionParameters.lnLogarithmBase:a[f]._labels[1].position-a[f].viewportMinimum)*Math.abs(a[f].conversionParameters.pixelPerUnit)+a[f].lineCoordinates.x1,m=a[f]._labels[a[f]._labels.length-("dateTime"===a[f].valueType?2:1)].position,m=a[f].getApparentDifference(a[f].viewportMinimum,m),E=a[f].logarithmic?(1<m?Math.log(m)/a[f].conversionParameters.lnLogarithmBase* +Math.abs(a[f].conversionParameters.pixelPerUnit):0)+a[f].lineCoordinates.x1:(0<m?m*Math.abs(a[f].conversionParameters.pixelPerUnit):0)+a[f].lineCoordinates.x1));if(d&&0<d.length)for(f=0;f<d.length;f++)d[f].calculateValueToPixelConversionParameters(),d[f].calculateBreaksSizeInValues(),d[f]._labels&&1<d[f]._labels.length&&(A=(d[f].logarithmic?Math.log(d[f]._labels[1].position/d[f].viewportMinimum)/d[f].conversionParameters.lnLogarithmBase:d[f]._labels[1].position-d[f].viewportMinimum)*Math.abs(d[f].conversionParameters.pixelPerUnit)+ +d[f].lineCoordinates.x1,m=d[f]._labels[d[f]._labels.length-("dateTime"===d[f].valueType?2:1)].position,m=d[f].getApparentDifference(d[f].viewportMinimum,m),E=d[f].logarithmic?(1<m?Math.log(m)/d[f].conversionParameters.lnLogarithmBase*Math.abs(d[f].conversionParameters.pixelPerUnit):0)+d[f].lineCoordinates.x1:(0<m?m*Math.abs(d[f].conversionParameters.pixelPerUnit):0)+d[f].lineCoordinates.x1);for(f=0;f<n.length;f++)"axisY"===n[f].type&&(n[f].calculateValueToPixelConversionParameters(),n[f].calculateBreaksSizeInValues()); +if(0<v){if(a&&0<a.length)for(f=0;f<a.length;f++)r=M[v-1][f]===M[v][f]?!0:!1;else r=!0;if(d&&0<d.length)for(f=0;f<d.length;f++)H=N[v-1][f]===N[v][f]?!0:!1;else H=!0;if(b&&0<b.length)for(f=0;f<b.length;f++)I=O[v-1][f]===O[v][f]?!0:!1;else I=!0;if(c&&0<c.length)for(f=0;f<c.length;f++)L=Q[v-1][f]===Q[v][f]?!0:!1;else L=!0}if(r&&H&&I&&L)break;v++}if(a&&0<a.length)for(f=0;f<a.length;f++)a[f].calculateStripLinesThicknessInValues(),a[f].calculateBreaksInPixels();if(d&&0<d.length)for(f=0;f<d.length;f++)d[f].calculateStripLinesThicknessInValues(), +d[f].calculateBreaksInPixels();if(b&&0<b.length)for(f=0;f<b.length;f++)b[f].calculateStripLinesThicknessInValues(),b[f].calculateBreaksInPixels();if(c&&0<c.length)for(f=0;f<c.length;f++)c[f].calculateStripLinesThicknessInValues(),c[f].calculateBreaksInPixels()}else{q=[];A=[];F=[];z=[];E=[];t=[];M=[];for(N=[];4>v;){V=U=R=S=$=K=W=e=Q=O=G=X=0;if(a&&0<a.length)for(F=[],f=U=0;f<a.length;f++)F.push(Math.ceil(a[f]?a[f].createLabelsAndCalculateWidth():0)),U+=F[f],e+=a[f]&&!p.isNavigator?a[f].margin:0;else F.push(Math.ceil(a[0]? +a[0].createLabelsAndCalculateWidth():0));M.push(F);if(d&&0<d.length)for(z=[],f=V=0;f<d.length;f++)z.push(Math.ceil(d[f]?d[f].createLabelsAndCalculateWidth():0)),V+=z[f],W+=d[f]?d[f].margin:0;else z.push(Math.ceil(d[0]?d[0].createLabelsAndCalculateWidth():0));N.push(z);if(b&&0<b.length)for(f=0;f<b.length;f++)b[f].lineCoordinates={},m=Math.round(g.x1+U+e),k=Math.round(g.x2-V-W>p.width-10?p.width-10:g.x2-V-W),b[f].labelAutoFit&&!u(C)&&(0<!a.length&&(m=0>b[f].labelAngle?Math.max(m,C):0===b[f].labelAngle? +Math.max(m,C/2):m),0<!d.length&&(k=0<b[f].labelAngle?k-x/2:0===b[f].labelAngle?k-x/2:k)),b[f].lineCoordinates.x1=m,b[f].lineCoordinates.x2=k,b[f].lineCoordinates.width=Math.abs(k-m),b[f].title&&(b[f]._titleTextBlock.maxWidth=0<b[f].titleMaxWidth&&b[f].titleMaxWidth<b[f].lineCoordinates.width?b[f].titleMaxWidth:b[f].lineCoordinates.width);if(c&&0<c.length)for(f=0;f<c.length;f++)c[f].lineCoordinates={},m=Math.round(g.x1+U+e),k=Math.round(g.x2-V-W>c[f].chart.width-10?c[f].chart.width-10:g.x2-V-W),c[f]&& +c[f].labelAutoFit&&!u(D)&&(0<!a.length&&(m=0<c[f].labelAngle?Math.max(m,D):0===c[f].labelAngle?Math.max(m,D/2):m),0<!d.length&&(k-=y/2)),c[f].lineCoordinates.x1=m,c[f].lineCoordinates.x2=k,c[f].lineCoordinates.width=Math.abs(k-m),c[f].title&&(c[f]._titleTextBlock.maxWidth=0<c[f].titleMaxWidth&&c[f].titleMaxWidth<c[f].lineCoordinates.width?c[f].titleMaxWidth:c[f].lineCoordinates.width);if(b&&0<b.length)for(q=[],f=S=0;f<b.length;f++)q.push(Math.ceil(b[f]?b[f].createLabelsAndCalculateHeight():0)),S+= +q[f]+b[f].margin,K+=b[f].margin;else q.push(Math.ceil(b[0]?b[0].createLabelsAndCalculateHeight():0));E.push(q);if(c&&0<c.length)for(A=[],f=R=0;f<c.length;f++)A.push(Math.ceil(c[f]?c[f].createLabelsAndCalculateHeight():0)),R+=A[f],$+=c[f].margin;else A.push(Math.ceil(c[0]?c[0].createLabelsAndCalculateHeight():0));t.push(A);if(b&&0<b.length)for(f=0;f<b.length;f++)0<b[f]._labels.length&&(h=b[f]._labels[0],l=b[f]._labels[b[f]._labels.length-1],C=h.textBlock.width*Math.cos(Math.PI/180*Math.abs(h.textBlock.angle))+ +(h.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/180*Math.abs(h.textBlock.angle)),x=l.textBlock.width*Math.cos(Math.PI/180*Math.abs(l.textBlock.angle))+(l.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/180*Math.abs(l.textBlock.angle)));if(c&&0<c.length)for(f=0;f<c.length;f++)c[f]&&0<c[f]._labels.length&&(h=c[f]._labels[0],l=c[f]._labels[c[f]._labels.length-1],D=h.textBlock.width*Math.cos(Math.PI/180*Math.abs(h.textBlock.angle))+(h.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/ +180*Math.abs(h.textBlock.angle)),y=l.textBlock.width*Math.cos(Math.PI/180*Math.abs(l.textBlock.angle))+(l.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/180*Math.abs(l.textBlock.angle)));if(p.panEnabled)for(f=0;f<b.length;f++)q[f]=p.sessionVariables.axisY.height;else for(f=0;f<b.length;f++)p.sessionVariables.axisY.height=q[f];if(b&&0<b.length)for(f=b.length-1;0<=f;f--)l=Math.round(g.y2),h=Math.round(g.y2>b[f].chart.height-10?b[f].chart.height-10:g.y2),b[f].lineCoordinates.y1=l-(q[f]+b[f].margin+ +X),b[f].lineCoordinates.y2=l-(q[f]+b[f].margin+X),b[f].bounds={x1:m,y1:l-(q[f]+X+b[f].margin),x2:k,y2:h-(X+b[f].margin),width:k-m,height:q[f]},b[f].title&&(b[f]._titleTextBlock.maxWidth=0<b[f].titleMaxWidth&&b[f].titleMaxWidth<b[f].lineCoordinates.width?b[f].titleMaxWidth:b[f].lineCoordinates.width),X+=q[f]+b[f].margin;if(c&&0<c.length)for(f=c.length-1;0<=f;f--)c[f]&&(l=Math.round(g.y1),h=Math.round(g.y1+(A[f]+c[f].margin+G)),c[f].lineCoordinates.y1=h,c[f].lineCoordinates.y2=h,c[f].bounds={x1:m,y1:l+ +(c[f].margin+G),x2:k,y2:h,width:k-m,height:R},c[f].title&&(c[f]._titleTextBlock.maxWidth=0<c[f].titleMaxWidth&&c[f].titleMaxWidth<c[f].lineCoordinates.width?c[f].titleMaxWidth:c[f].lineCoordinates.width),G+=A[f]+c[f].margin);if(a&&0<a.length)for(f=0;f<a.length;f++){K=a[f]._labels&&0<a[f]._labels.length?a[f]._labels[0].textBlock.fontSize/2:0;m=Math.round(g.x1+e);l=c&&0<c.length?Math.round(c[0]?c[0].lineCoordinates.y2:g.y1<Math.max(K,10)?Math.max(K,10):g.y1):g.y1<Math.max(K,10)?Math.max(K,10):g.y1; +k=Math.round(g.x1+U+e);h=b&&0<b.length?Math.round(b[0]?b[0].lineCoordinates.y1:g.y2-S>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0<b.length)for(K=0;K<b.length;K++)b[K]&&b[K].labelAutoFit&&(k=0>b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0===b[K].labelAngle?k-U:m);if(c&&0<c.length)for(K=0;K<c.length;K++)c[K]&&c[K].labelAutoFit&&(k=c[K].lineCoordinates.x1,m=k-U);a[f].lineCoordinates= +{x1:k-O,y1:l,x2:k-O,y2:h,height:Math.abs(h-l)};a[f].bounds={x1:k-(F[f]+O),y1:l,x2:k,y2:h,width:k-m,height:h-l};a[f].title&&(a[f]._titleTextBlock.maxWidth=0<a[f].titleMaxWidth&&a[f].titleMaxWidth<a[f].lineCoordinates.height?a[f].titleMaxWidth:a[f].lineCoordinates.height);a[f].calculateValueToPixelConversionParameters();a[f].calculateBreaksSizeInValues();O+=F[f]+a[f].margin}if(d&&0<d.length)for(f=0;f<d.length;f++){K=d[f]._labels&&0<d[f]._labels.length?d[f]._labels[0].textBlock.fontSize/2:0;m=Math.round(g.x1- +e);l=c&&0<c.length?Math.round(c[0]?c[0].lineCoordinates.y2:g.y1<Math.max(K,10)?Math.max(K,10):g.y1):g.y1<Math.max(K,10)?Math.max(K,10):g.y1;k=Math.round(g.x2-V-W);h=b&&0<b.length?Math.round(b[0]?b[0].lineCoordinates.y1:g.y2-S>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0<b.length)for(K=0;K<b.length;K++)b[K]&&b[K].labelAutoFit&&(k=0>b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0=== +b[K].labelAngle?k-V:m);if(c&&0<c.length)for(K=0;K<c.length;K++)c[K]&&c[K].labelAutoFit&&(k=c[K].lineCoordinates.x2,m=k-V);d[f].lineCoordinates={x1:k+Q,y1:l,x2:k+Q,y2:h,height:Math.abs(h-l)};d[f].bounds={x1:m,y1:l,x2:k+z[f]+Q,y2:h,width:k-m,height:h-l};d[f].title&&(d[f]._titleTextBlock.maxWidth=0<d[f].titleMaxWidth&&d[f].titleMaxWidth<d[f].lineCoordinates.height?d[f].titleMaxWidth:d[f].lineCoordinates.height);d[f].calculateValueToPixelConversionParameters();d[f].calculateBreaksSizeInValues();Q+=z[f]+ +d[f].margin}for(f=0;f<n.length;f++)"axisY"===n[f].type&&(n[f].calculateValueToPixelConversionParameters(),n[f].calculateBreaksSizeInValues());if(0<v){if(a&&0<a.length)for(f=0;f<a.length;f++)r=M[v-1][f]===M[v][f]?!0:!1;else r=!0;if(d&&0<d.length)for(f=0;f<d.length;f++)H=N[v-1][f]===N[v][f]?!0:!1;else H=!0;if(b&&0<b.length)for(f=0;f<b.length;f++)I=E[v-1][f]===E[v][f]?!0:!1;else I=!0;if(c&&0<c.length)for(f=0;f<c.length;f++)L=t[v-1][f]===t[v][f]?!0:!1;else L=!0}if(r&&H&&I&&L)break;v++}if(b&&0<b.length)for(f= +0;f<b.length;f++)b[f].calculateStripLinesThicknessInValues(),b[f].calculateBreaksInPixels();if(c&&0<c.length)for(f=0;f<c.length;f++)c[f].calculateStripLinesThicknessInValues(),c[f].calculateBreaksInPixels();if(a&&0<a.length)for(f=0;f<a.length;f++)a[f].calculateStripLinesThicknessInValues(),a[f].calculateBreaksInPixels();if(d&&0<d.length)for(f=0;f<d.length;f++)d[f].calculateStripLinesThicknessInValues(),d[f].calculateBreaksInPixels()}};z.render=function(a,d,b,c,e){var g=a[0]?a[0].chart:d[0].chart; +e=g.ctx;var m=g._axes;g.alignVerticalAxes&&g.alignVerticalAxes();e.save();e.beginPath();a[0]&&e.rect(5,a[0].bounds.y1,a[0].chart.width-10,a[0].bounds.height);d[0]&&e.rect(5,d[d.length-1].bounds.y1,d[0].chart.width-10,d[0].bounds.height);e.clip();if(a&&0<a.length)for(var l=0;l<a.length;l++)a[l].renderLabelsTicksAndTitle();if(d&&0<d.length)for(l=0;l<d.length;l++)d[l].renderLabelsTicksAndTitle();e.restore();if(b&&0<b.length)for(l=0;l<b.length;l++)b[l].renderLabelsTicksAndTitle();if(c&&0<c.length)for(l= +0;l<c.length;l++)c[l].renderLabelsTicksAndTitle();g.preparePlotArea();g=g.plotArea;e.save();e.beginPath();e.rect(g.x1,g.y1,Math.abs(g.x2-g.x1),Math.abs(g.y2-g.y1));e.clip();if(a&&0<a.length)for(l=0;l<m.length;l++)m[l].renderStripLinesOfThicknessType("value");if(d&&0<d.length)for(l=0;l<d.length;l++)d[l].renderStripLinesOfThicknessType("value");if(b&&0<b.length)for(l=0;l<b.length;l++)b[l].renderStripLinesOfThicknessType("value");if(c&&0<c.length)for(l=0;l<c.length;l++)c[l].renderStripLinesOfThicknessType("value"); +if(a&&0<a.length)for(l=0;l<a.length;l++)a[l].renderInterlacedColors();if(d&&0<d.length)for(l=0;l<d.length;l++)d[l].renderInterlacedColors();if(b&&0<b.length)for(l=0;l<b.length;l++)b[l].renderInterlacedColors();if(c&&0<c.length)for(l=0;l<c.length;l++)c[l].renderInterlacedColors();e.restore();if(a&&0<a.length)for(l=0;l<a.length;l++)a[l].renderGrid(),r&&(a[l].createMask(),a[l].renderBreaksBackground());if(d&&0<d.length)for(l=0;l<d.length;l++)d[l].renderGrid(),r&&(d[l].createMask(),d[l].renderBreaksBackground()); +if(b&&0<b.length)for(l=0;l<b.length;l++)b[l].renderGrid(),r&&(b[l].createMask(),b[l].renderBreaksBackground());if(c&&0<c.length)for(l=0;l<c.length;l++)c[l].renderGrid(),r&&(c[l].createMask(),c[l].renderBreaksBackground());if(a&&0<a.length)for(l=0;l<a.length;l++)a[l].renderAxisLine();if(d&&0<d.length)for(l=0;l<d.length;l++)d[l].renderAxisLine();if(b&&0<b.length)for(l=0;l<b.length;l++)b[l].renderAxisLine();if(c&&0<c.length)for(l=0;l<c.length;l++)c[l].renderAxisLine();if(a&&0<a.length)for(l=0;l<a.length;l++)a[l].renderStripLinesOfThicknessType("pixel"); +if(d&&0<d.length)for(l=0;l<d.length;l++)d[l].renderStripLinesOfThicknessType("pixel");if(b&&0<b.length)for(l=0;l<b.length;l++)b[l].renderStripLinesOfThicknessType("pixel");if(c&&0<c.length)for(l=0;l<c.length;l++)c[l].renderStripLinesOfThicknessType("pixel")};z.prototype.calculateStripLinesThicknessInValues=function(){for(var a=0;a<this.stripLines.length;a++)if(null!==this.stripLines[a].startValue&&null!==this.stripLines[a].endValue){var d=Math.min(this.stripLines[a].startValue,this.stripLines[a].endValue), +b=Math.max(this.stripLines[a].startValue,this.stripLines[a].endValue),d=this.getApparentDifference(d,b);this.stripLines[a].value=this.logarithmic?this.stripLines[a].value*Math.sqrt(Math.log(this.stripLines[a].endValue/this.stripLines[a].startValue)/Math.log(d)):this.stripLines[a].value+(Math.abs(this.stripLines[a].endValue-this.stripLines[a].startValue)-d)/2;this.stripLines[a].thickness=d;this.stripLines[a]._thicknessType="value"}};z.prototype.calculateBreaksSizeInValues=function(){for(var a="left"=== +this._position||"right"===this._position?this.lineCoordinates.height||this.chart.height:this.lineCoordinates.width||this.chart.width,d=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b=this.conversionParameters.pixelPerUnit||a/(this.logarithmic?this.conversionParameters.maximum/this.conversionParameters.minimum:this.conversionParameters.maximum-this.conversionParameters.minimum),c=this.scaleBreaks&&!u(this.scaleBreaks.options.spacing),e,g=0;g<d.length;g++)e=c||!u(d[g].options.spacing),d[g].spacing= +I(d[g].spacing,a,8,e?0.1*a:8,e?0:3)<<0,d[g].size=0>d[g].spacing?0:Math.abs(d[g].spacing/b),this.logarithmic&&(d[g].size=Math.pow(this.logarithmBase,d[g].size))};z.prototype.calculateBreaksInPixels=function(){if(!(this.scaleBreaks&&0>=this.scaleBreaks._appliedBreaks.length)){var a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];a.length&&(this.scaleBreaks.firstBreakIndex=this.scaleBreaks.lastBreakIndex=null);for(var d=0;d<a.length&&!(a[d].startValue>this.conversionParameters.maximum);d++)a[d].endValue< +this.conversionParameters.minimum||(u(this.scaleBreaks.firstBreakIndex)&&(this.scaleBreaks.firstBreakIndex=d),a[d].startValue>=this.conversionParameters.minimum&&(a[d].startPixel=this.convertValueToPixel(a[d].startValue),this.scaleBreaks.lastBreakIndex=d),a[d].endValue<=this.conversionParameters.maximum&&(a[d].endPixel=this.convertValueToPixel(a[d].endValue)))}};z.prototype.renderLabelsTicksAndTitle=function(){var a=this,d=!1,b=0,c=0,e=1,g=0;0!==this.labelAngle&&360!==this.labelAngle&&(e=1.2);if("undefined"=== +typeof this.options.interval){if("bottom"===this._position||"top"===this._position)if(this.logarithmic&&!this.equidistantInterval&&this.labelAutoFit){for(var b=[],e=0!==this.labelAngle&&360!==this.labelAngle?1:1.2,m,l=this.viewportMaximum,k=this.lineCoordinates.width/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.position<this.viewportMinimum)break;q.position>this.viewportMaximum||!(h===this._labels.length-1||m<Math.log(l/q.position)*k/e)||(b.push(q),l=q.position,m= +q.textBlock.width*Math.abs(Math.cos(Math.PI/180*this.labelAngle))+q.textBlock.height*Math.abs(Math.sin(Math.PI/180*this.labelAngle)))}this._labels=b}else{for(h=0;h<this._labels.length;h++)q=this._labels[h],q.position<this.viewportMinimum||(m=q.textBlock.width*Math.abs(Math.cos(Math.PI/180*this.labelAngle))+q.textBlock.height*Math.abs(Math.sin(Math.PI/180*this.labelAngle)),b+=m);b>this.lineCoordinates.width*e&&this.labelAutoFit&&(d=!0)}if("left"===this._position||"right"===this._position)if(this.logarithmic&& +!this.equidistantInterval&&this.labelAutoFit){for(var b=[],p,l=this.viewportMaximum,k=this.lineCoordinates.height/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.position<this.viewportMinimum)break;q.position>this.viewportMaximum||!(h===this._labels.length-1||p<Math.log(l/q.position)*k)||(b.push(q),l=q.position,p=q.textBlock.height*Math.abs(Math.cos(Math.PI/180*this.labelAngle))+q.textBlock.width*Math.abs(Math.sin(Math.PI/180*this.labelAngle)))}this._labels=b}else{for(h= +0;h<this._labels.length;h++)q=this._labels[h],q.position<this.viewportMinimum||(p=q.textBlock.height*Math.abs(Math.cos(Math.PI/180*this.labelAngle))+q.textBlock.width*Math.abs(Math.sin(Math.PI/180*this.labelAngle)),c+=p);c>this.lineCoordinates.height*e&&this.labelAutoFit&&(d=!0)}}this.logarithmic&&(!this.equidistantInterval&&this.labelAutoFit)&&this._labels.sort(function(a,b){return a.position-b.position});var h=0,q,n;if("bottom"===this._position){for(h=0;h<this._labels.length;h++)q=this._labels[h], +q.position<this.viewportMinimum||(q.position>this.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y+this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y-(this.tickLength+q.textBlock.fontSize/2):n.y+this.tickLength+q.textBlock.fontSize/2):(n.x="inside"===this.labelPlacement?0>this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x-(0>this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0>this.labelAngle?n.y-this.tickLength-5:n.y-this.tickLength-Math.abs(q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle)+5):n.y+this.tickLength+Math.abs(0>this.labelAngle?q.textBlock.width* +Math.sin(Math.PI/180*this.labelAngle)-5:5)),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;h<a._labels.length;h++)if(q=a._labels[h],!(q.position<a.viewportMinimum||q.position>a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save(); +a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y-a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y2-this._titleTextBlock.height-3,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("top"===this._position){for(h=0;h<this._labels.length;h++)q=this._labels[h], +q.position<this.viewportMinimum||(q.position>this.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y-this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y+this.labelFontSize/2+this.tickLength+5:n.y-(this.tickLength+q.textBlock.height-q.textBlock.fontSize/2)):(n.x="inside"===this.labelPlacement?0<this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x+(q.textBlock.height-this.tickLength-this.labelFontSize)*Math.sin(Math.PI/180*this.labelAngle)-(0<this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0<this.labelAngle?n.y+this.tickLength+5:n.y-q.textBlock.width*Math.sin(Math.PI/ +180*this.labelAngle)+this.tickLength+5:n.y-(this.tickLength+((q.textBlock.height-q.textBlock.fontSize/2)*Math.cos(Math.PI/180*this.labelAngle)+(0<this.labelAngle?q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0)))),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;h<a._labels.length;h++)if(q=a._labels[h],!(q.position<a.viewportMinimum||q.position>a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&& +(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y+a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y1+1,this.titleMaxWidth= +this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("left"===this._position){for(h=0;h<this._labels.length;h++)q=this._labels[h],q.position<this.viewportMinimum||(q.position>this.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<< +0,c),this.ctx.lineTo(n.x-this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle?(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5):(q.textBlock.y="inside"===this.labelPlacement?n.y:n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:0<this.labelAngle?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)- +this.tickLength-5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)+(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.sin(Math.PI/180*this.labelAngle)-this.tickLength));"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;h<a._labels.length;h++)if(q=a._labels[h],!(q.position<a.viewportMinimum||q.position>a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness; +a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x+a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x1+1,this._titleTextBlock.y=this.lineCoordinates.height/2+this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("right"=== +this._position){for(h=0;h<this._labels.length;h++)q=this._labels[h],q.position<this.viewportMinimum||(q.position>this.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<<0,c),this.ctx.lineTo(n.x+this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle? +(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width-this.tickLength-5:n.x+this.tickLength+5):(q.textBlock.y="inside"===this.labelPlacement?n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0>this.labelAngle?n.y:n.y-(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.cos(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:0<this.labelAngle?n.x+(q.textBlock.height- +q.textBlock.fontSize/2-5)*Math.sin(Math.PI/180*this.labelAngle)+this.tickLength:n.x+this.tickLength+5));"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;h<a._labels.length;h++)if(q=a._labels[h],!(q.position<a.viewportMinimum||q.position>a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<< +0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x-a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x2-1,this._titleTextBlock.y=this.lineCoordinates.height/2-this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}g=0;if("inside"===this.labelPlacement)this.chart.addEventListener("dataAnimationIterationEnd", +function(){for(h=0;h<a._labels.length;h++)q=a._labels[h],q.position<a.viewportMinimum||(q.position>a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)||(a.ctx.save(),a.ctx.beginPath(),q.textBlock.render(!0),a.ctx.restore())},this);else for(h=0;h<this._labels.length;h++)q=this._labels[h],q.position<this.viewportMinimum||(q.position>this.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||q.textBlock.render(!0)};z.prototype.renderInterlacedColors=function(){var a=this.chart.plotArea.ctx,d,b,c=this.chart.plotArea, +e=0;d=!0;if(("bottom"===this._position||"top"===this._position)&&this.interlacedColor)for(a.fillStyle=this.interlacedColor,e=0;e<this._labels.length;e++)d?(d=this.getPixelCoordinatesOnAxis(this._labels[e].position),b=e+1>this._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(Math.min(b.x,d.x),c.y1,Math.abs(b.x-d.x),Math.abs(c.y1-c.y2)),d=!1):d=!0;else if(("left"===this._position||"right"===this._position)&&this.interlacedColor)for(a.fillStyle= +this.interlacedColor,e=0;e<this._labels.length;e++)d?(b=this.getPixelCoordinatesOnAxis(this._labels[e].position),d=e+1>this._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(c.x1,Math.min(b.y,d.y),Math.abs(c.x1-c.x2),Math.abs(d.y-b.y)),d=!1):d=!0;a.beginPath()};z.prototype.renderStripLinesOfThicknessType=function(a){if(this.stripLines&&0<this.stripLines.length&&a){for(var d=this,b,c=0,e=0,g=!1,m=!1,l=[],k=[], +m=!1,c=0;c<this.stripLines.length;c++){var h=this.stripLines[c];h._thicknessType===a&&("pixel"===a&&(h.value<this.viewportMinimum||h.value>this.viewportMaximum||u(h.value)||isNaN(this.range))||l.push(h))}for(c=0;c<this._stripLineLabels.length;c++)if(h=this.stripLines[c],b=this._stripLineLabels[c],!(b.position<this.viewportMinimum||b.position>this.viewportMaximum||isNaN(this.range))){a=this.getPixelCoordinatesOnAxis(b.position);if("outside"===b.stripLine.labelPlacement)if(h&&(this.ctx.strokeStyle= +h.color,"pixel"===h._thicknessType&&(this.ctx.lineWidth=h.thickness)),"bottom"===this._position){var p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0;this.ctx.beginPath();this.ctx.moveTo(p,a.y<<0);this.ctx.lineTo(p,a.y+this.tickLength<<0);this.ctx.stroke();0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y+=this.tickLength+b.textBlock.fontSize/2):(a.x-=0>this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0,a.y+=this.tickLength+Math.abs(0>this.labelAngle?b.textBlock.width*Math.sin(Math.PI/ +180*this.labelAngle)-5:5))}else"top"===this._position?(p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,this.ctx.beginPath(),this.ctx.moveTo(p,a.y<<0),this.ctx.lineTo(p,a.y-this.tickLength<<0),this.ctx.stroke(),0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y-=this.tickLength+b.textBlock.height):(a.x+=(b.textBlock.height-this.tickLength-this.labelFontSize/2)*Math.sin(Math.PI/180*this.labelAngle)-(0<this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),a.y-=this.tickLength+(b.textBlock.height* +Math.cos(Math.PI/180*this.labelAngle)+(0<this.labelAngle?b.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0)))):"left"===this._position?(p=1===this.ctx.lineWidth%2?(a.y<<0)+0.5:a.y<<0,this.ctx.beginPath(),this.ctx.moveTo(a.x<<0,p),this.ctx.lineTo(a.x-this.tickLength<<0,p),this.ctx.stroke(),0===this.labelAngle?a.x=a.x-b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:(a.y-=b.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),a.x=0<this.labelAngle?a.x-b.textBlock.width* +Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:a.x-b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)+(b.textBlock.height-b.textBlock.fontSize/2-5)*Math.sin(Math.PI/180*this.labelAngle)-this.tickLength)):"right"===this._position&&(p=1===this.ctx.lineWidth%2?(a.y<<0)+0.5:a.y<<0,this.ctx.beginPath(),this.ctx.moveTo(a.x<<0,p),this.ctx.lineTo(a.x+this.tickLength<<0,p),this.ctx.stroke(),0===this.labelAngle?a.x=a.x+this.tickLength+5:(a.y=0>this.labelAngle?a.y:a.y-(b.textBlock.height-b.textBlock.fontSize/ +2-5)*Math.cos(Math.PI/180*this.labelAngle),a.x=0<this.labelAngle?a.x+(b.textBlock.height-b.textBlock.fontSize/2-5)*Math.sin(Math.PI/180*this.labelAngle)+this.tickLength:a.x+this.tickLength+5));else b.textBlock.angle=-90,"bottom"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/ +2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+=b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y1+b.textBlock.width+3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-b.textBlock.width-3:"center"=== +b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y1+3):"top"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+= +b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+b.textBlock.width+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y2-3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y2- +b.textBlock.width-3):"left"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-b.textBlock.height>this.chart.plotArea.y1?u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3:a.y-b.textBlock.height<this.chart.plotArea.y2?a.y+=b.textBlock.fontSize/2+3:u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/ +2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3,a.x="near"===b.stripLine.labelAlign?this.chart.plotArea.x1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.x2+this.chart.plotArea.x1)/2-b.textBlock.width/2:this.chart.plotArea.x2-b.textBlock.width-3):"right"===this._position&&(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-+b.textBlock.height>this.chart.plotArea.y1? +u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2-3:a.y-b.textBlock.height<this.chart.plotArea.y2?a.y+=b.textBlock.fontSize/2+3:u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2+3,a.x="near"===b.stripLine.labelAlign?this.chart.plotArea.x2-b.textBlock.width-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.x2+this.chart.plotArea.x1)/2-b.textBlock.width/2:this.chart.plotArea.x1+ +3);b.textBlock.x=a.x;b.textBlock.y=a.y;k.push(b)}if(!m){m=!1;this.ctx.save();this.ctx.beginPath();this.ctx.rect(this.chart.plotArea.x1,this.chart.plotArea.y1,this.chart.plotArea.width,this.chart.plotArea.height);this.ctx.clip();for(c=0;c<l.length;c++)h=l[c],h.showOnTop?g||(g=!0,this.chart.addEventListener("dataAnimationIterationEnd",function(){this.ctx.save();this.ctx.beginPath();this.ctx.rect(this.chart.plotArea.x1,this.chart.plotArea.y1,this.chart.plotArea.width,this.chart.plotArea.height);this.ctx.clip(); +for(e=0;e<l.length;e++)h=l[e],h.showOnTop&&h.render();this.ctx.restore()},h)):h.render();for(c=0;c<k.length;c++)b=k[c],b.stripLine.showOnTop?m||(m=!0,this.chart.addEventListener("dataAnimationIterationEnd",function(){for(e=0;e<k.length;e++)b=k[e],"inside"===b.stripLine.labelPlacement&&b.stripLine.showOnTop&&(d.ctx.save(),d.ctx.beginPath(),d.ctx.rect(d.chart.plotArea.x1,d.chart.plotArea.y1,d.chart.plotArea.width,d.chart.plotArea.height),d.ctx.clip(),b.textBlock.render(!0),d.ctx.restore())},b.textBlock)): +"inside"===b.stripLine.labelPlacement&&b.textBlock.render(!0);this.ctx.restore();m=!0}if(m)for(m=!1,c=0;c<k.length;c++)b=k[c],b.stripLine.showOnTop?m||(m=!0,this.chart.addEventListener("dataAnimationIterationEnd",function(){for(e=0;e<k.length;e++)b=k[e],"outside"===b.stripLine.labelPlacement&&b.stripLine.showOnTop&&b.textBlock.render(!0)},b.textBlock)):"outside"===b.stripLine.labelPlacement&&b.textBlock.render(!0)}};z.prototype.renderBreaksBackground=function(){this.chart._breaksCanvas&&(this.scaleBreaks&& +0<this.scaleBreaks._appliedBreaks.length&&this.maskCanvas)&&(this.chart._breaksCanvasCtx.save(),this.chart._breaksCanvasCtx.beginPath(),this.chart._breaksCanvasCtx.rect(this.chart.plotArea.x1,this.chart.plotArea.y1,this.chart.plotArea.width,this.chart.plotArea.height),this.chart._breaksCanvasCtx.clip(),this.chart._breaksCanvasCtx.drawImage(this.maskCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx.restore())};z.prototype.createMask=function(){if(this.scaleBreaks&&0<this.scaleBreaks._appliedBreaks.length){var a= +this.scaleBreaks._appliedBreaks;r?(this.maskCanvas=ta(this.chart.width,this.chart.height),this.maskCtx=this.maskCanvas.getContext("2d")):(this.maskCanvas=this.chart.plotArea.canvas,this.maskCtx=this.chart.plotArea.ctx);this.maskCtx.save();this.maskCtx.beginPath();this.maskCtx.rect(this.chart.plotArea.x1,this.chart.plotArea.y1,this.chart.plotArea.width,this.chart.plotArea.height);this.maskCtx.clip();for(var d=0;d<a.length;d++)a[d].endValue<this.viewportMinimum||(a[d].startValue>this.viewportMaximum|| +isNaN(this.range))||a[d].render(this.maskCtx);this.maskCtx.restore()}};z.prototype.renderCrosshair=function(a,d){this.crosshair.render(a,d)};z.prototype.renderGrid=function(){if(this.gridThickness&&0<this.gridThickness){var a=this.chart.ctx;a.save();var d,b=this.chart.plotArea;a.lineWidth=this.gridThickness;a.strokeStyle=this.gridColor;a.setLineDash&&a.setLineDash(R(this.gridDashType,this.gridThickness));if("bottom"===this._position||"top"===this._position)for(c=0;c<this._labels.length;c++)this._labels[c].position< +this.viewportMinimum||(this._labels[c].position>this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(),d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.x<<0)+0.5:d.x<<0,a.moveTo(d,b.y1<<0),a.lineTo(d,b.y2<<0),a.stroke());else if("left"===this._position||"right"===this._position)for(var c=0;c<this._labels.length;c++)this._labels[c].position<this.viewportMinimum||(this._labels[c].position>this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(), +d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.y<<0)+0.5:d.y<<0,a.moveTo(b.x1<<0,d),a.lineTo(b.x2<<0,d),a.stroke());a.restore()}};z.prototype.renderAxisLine=function(){var a=this.chart.ctx,d=r?this.chart._preRenderCtx:a,b=Math.ceil(this.tickThickness/(this.reversed?-2:2)),c=Math.ceil(this.tickThickness/(this.reversed?2:-2)),e,g;d.save();if("bottom"===this._position||"top"===this._position){if(this.lineThickness){this.reversed?(e=this.lineCoordinates.x2,g=this.lineCoordinates.x1): +(e=this.lineCoordinates.x1,g=this.lineCoordinates.x2);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor?this.lineColor:"black";d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));var m=1===this.lineThickness%2?(this.lineCoordinates.y1<<0)+0.5:this.lineCoordinates.y1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+c;else for(var l= +this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(e,m),d.lineTo(this.scaleBreaks._appliedBreaks[l].startPixel+b,m),e=this.scaleBreaks._appliedBreaks[l].endPixel+c;e&&(d.moveTo(e,m),d.lineTo(g,m));d.stroke()}}else if(("left"===this._position||"right"===this._position)&&this.lineThickness){this.reversed?(e=this.lineCoordinates.y1,g=this.lineCoordinates.y2):(e=this.lineCoordinates.y2,g=this.lineCoordinates.y1);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor; +d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));m=1===this.lineThickness%2?(this.lineCoordinates.x1<<0)+0.5:this.lineCoordinates.x1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+b;else for(l=this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(m,e),d.lineTo(m,this.scaleBreaks._appliedBreaks[l].startPixel+c), +e=this.scaleBreaks._appliedBreaks[l].endPixel+b;e&&(d.moveTo(m,e),d.lineTo(m,g));d.stroke()}r&&(a.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx&&this.chart._breaksCanvasCtx.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),d.clearRect(0,0,this.chart.width,this.chart.height));d.restore()};z.prototype.getPixelCoordinatesOnAxis=function(a){var d={};if("bottom"===this._position||"top"===this._position)d.x=this.convertValueToPixel(a), +d.y=this.lineCoordinates.y1;if("left"===this._position||"right"===this._position)d.y=this.convertValueToPixel(a),d.x=this.lineCoordinates.x2;return d};z.prototype.convertPixelToValue=function(a){if("undefined"===typeof a)return null;var d=0,b=0,c,d=!0,e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b="number"===typeof a?a:"left"===this._position||"right"===this._position?a.y:a.x;if(this.logarithmic){a=c=Math.pow(this.logarithmBase,(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit); +if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b<e.length;b++){if(!(e[b].endValue<this.conversionParameters.minimum))if(d)if(e[b].startValue<this.conversionParameters.minimum){if(1<e[b].size&&this.conversionParameters.minimum*Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size))<e[b].endValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].endValue/this.conversionParameters.minimum/ +Math.pow(e[b].size,Math.log(e[b].endValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue)),c/=Math.pow(e[b].size,Math.log(e[b].endValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c>e[b].startValue/this.conversionParameters.minimum){c/=e[b].startValue/this.conversionParameters.minimum;if(c<e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1===e[b].size?1:Math.log(c)/Math.log(e[b].size))/c;break}else a*=e[b].endValue/e[b].startValue/ +e[b].size;c/=e[b].size;d=!1}else break;else if(c>e[b].startValue/e[b-1].endValue){c/=e[b].startValue/e[b-1].endValue;if(c<e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1===e[b].size?1:Math.log(c)/Math.log(e[b].size))/c;break}else a*=e[b].endValue/e[b].startValue/e[b].size;c/=e[b].size}else break}else for(b=e.length-1;0<=b;b--)if(!(e[b].startValue>this.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum){if(1<e[b].size&&this.conversionParameters.minimum*Math.pow(e[b].endValue/ +e[b].startValue,Math.log(c)/Math.log(e[b].size))>e[b].startValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].startValue/this.conversionParameters.minimum*Math.pow(e[b].size,Math.log(e[b].startValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue))*c,c*=Math.pow(e[b].size,Math.log(this.conversionParameters.minimum/e[b].startValue)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c<e[b].endValue/this.conversionParameters.minimum){c/= +e[b].endValue/this.conversionParameters.minimum;if(c>1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size;d=!1}else break;else if(c<e[b].endValue/e[b+1].startValue){c/=e[b].endValue/e[b+1].startValue;if(c>1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size}else break; +d=a*this.viewportMinimum}else{a=c=(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit;if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b<e.length;b++){if(!(e[b].endValue<this.conversionParameters.minimum))if(d)if(e[b].startValue<this.conversionParameters.minimum){if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue-e[b].startValue)/e[b].size<e[b].endValue){a=0>=e[b].size?0:c*(e[b].endValue- +e[b].startValue)/e[b].size;break}else a+=e[b].endValue-this.conversionParameters.minimum-e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue),c-=e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue);d=!1}else if(c>e[b].startValue-this.conversionParameters.minimum){c-=e[b].startValue-this.conversionParameters.minimum;if(c<e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)-c;break}else a+=e[b].endValue- +e[b].startValue-e[b].size;c-=e[b].size;d=!1}else break;else if(c>e[b].startValue-e[b-1].endValue){c-=e[b].startValue-e[b-1].endValue;if(c<e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)-c;break}else a+=e[b].endValue-e[b].startValue-e[b].size;c-=e[b].size}else break}else for(b=e.length-1;0<=b;b--)if(!(e[b].startValue>this.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum)if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue- +e[b].startValue)/e[b].size>e[b].startValue){a=0>=e[b].size?0:c*(e[b].endValue-e[b].startValue)/e[b].size;break}else a+=e[b].startValue-this.conversionParameters.minimum+e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),c+=e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),d=!1;else if(c<e[b].endValue-this.conversionParameters.minimum){c-=e[b].endValue-this.conversionParameters.minimum;if(c>-1*e[b].size){a+=(e[b].endValue- +e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size;d=!1}else break;else if(c<e[b].endValue-e[b+1].startValue){c-=e[b].endValue-e[b+1].startValue;if(c>-1*e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size}else break;d=this.conversionParameters.minimum+a}return d};z.prototype.convertValueToPixel=function(a){a=this.getApparentDifference(this.conversionParameters.minimum, +a,a);return this.logarithmic?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*Math.log(a/this.conversionParameters.minimum)/this.conversionParameters.lnLogarithmBase+0.5<<0:"axisX"===this.type?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5<<0:this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5};z.prototype.getApparentDifference=function(a, +d,b,c){var e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];if(this.logarithmic){b=u(b)?d/a:b;for(var g=0;g<e.length&&!(d<e[g].startValue);g++)a>e[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*e[g].startValue*e[g].size:a>=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*a*Math.pow(e[g].size,Math.log(e[g].endValue/a)/Math.log(e[g].endValue/e[g].startValue)):a<=e[g].startValue&&d<=e[g].endValue?b=b/d*e[g].startValue*Math.pow(e[g].size,Math.log(d/e[g].startValue)/Math.log(e[g].endValue/ +e[g].startValue)):!c&&(a>e[g].startValue&&d<e[g].endValue)&&(b=a*Math.pow(e[g].size,Math.log(d/a)/Math.log(e[g].endValue/e[g].startValue))))}else for(b=u(b)?Math.abs(d-a):b,g=0;g<e.length&&!(d<e[g].startValue);g++)a>e[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+e[g].startValue+e[g].size:a>e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+a+e[g].size*(e[g].endValue-a)/(e[g].endValue-e[g].startValue):a<=e[g].startValue&&d<e[g].endValue?b=b-d+e[g].startValue+e[g].size*(d-e[g].startValue)/ +(e[g].endValue-e[g].startValue):!c&&(a>e[g].startValue&&d<e[g].endValue)&&(b=a+e[g].size*(d-a)/(e[g].endValue-e[g].startValue)));return b};z.prototype.setViewPortRange=function(a,d){this.sessionVariables.newViewportMinimum=this.viewportMinimum=Math.min(a,d);this.sessionVariables.newViewportMaximum=this.viewportMaximum=Math.max(a,d)};z.prototype.getXValueAt=function(a){if(!a)return null;var d=null;"left"===this._position?d=this.convertPixelToValue(a.y):"bottom"===this._position&&(d=this.convertPixelToValue(a.x)); +return d};z.prototype.calculateValueToPixelConversionParameters=function(a){a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];var d={pixelPerUnit:null,minimum:null,reference:null},b=this.lineCoordinates.width,c=this.lineCoordinates.height,b="bottom"===this._position||"top"===this._position?b:c,c=Math.abs(this.range);if(this.logarithmic)for(var e=0;e<a.length&&!(this.viewportMaximum<a[e].startValue);e++)this.viewportMinimum>a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<= +a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*a[e].startValue,b=0<a[e].spacing.toString().indexOf("%")?b*(1-parseFloat(a[e].spacing)/100):b-Math.min(a[e].spacing,0.1*b)):this.viewportMinimum>a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*this.viewportMinimum,b=0<a[e].spacing.toString().indexOf("%")?b*(1-parseFloat(a[e].spacing)/100*Math.log(a[e].endValue/this.viewportMinimum)/Math.log(a[e].endValue/a[e].startValue)): +b-Math.min(a[e].spacing,0.1*b)*Math.log(a[e].endValue/this.viewportMinimum)/Math.log(a[e].endValue/a[e].startValue)):this.viewportMinimum<=a[e].startValue&&this.viewportMaximum<a[e].endValue&&(c=c/this.viewportMaximum*a[e].startValue,b=0<a[e].spacing.toString().indexOf("%")?b*(1-parseFloat(a[e].spacing)/100*Math.log(this.viewportMaximum/a[e].startValue)/Math.log(a[e].endValue/a[e].startValue)):b-Math.min(a[e].spacing,0.1*b)*Math.log(this.viewportMaximum/a[e].startValue)/Math.log(a[e].endValue/a[e].startValue))); +else for(e=0;e<a.length&&!(this.viewportMaximum<a[e].startValue);e++)this.viewportMinimum>a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<=a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+a[e].startValue,b=0<a[e].spacing.toString().indexOf("%")?b*(1-parseFloat(a[e].spacing)/100):b-Math.min(a[e].spacing,0.1*b)):this.viewportMinimum>a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+this.viewportMinimum, +b=0<a[e].spacing.toString().indexOf("%")?b*(1-parseFloat(a[e].spacing)/100*(a[e].endValue-this.viewportMinimum)/(a[e].endValue-a[e].startValue)):b-Math.min(a[e].spacing,0.1*b)*(a[e].endValue-this.viewportMinimum)/(a[e].endValue-a[e].startValue)):this.viewportMinimum<=a[e].startValue&&this.viewportMaximum<a[e].endValue&&(c=c-this.viewportMaximum+a[e].startValue,b=0<a[e].spacing.toString().indexOf("%")?b*(1-parseFloat(a[e].spacing)/100*(this.viewportMaximum-a[e].startValue)/(a[e].endValue-a[e].startValue)): +b-Math.min(a[e].spacing,0.1*b)*(this.viewportMaximum-a[e].startValue)/(a[e].endValue-a[e].startValue)));d.minimum=this.viewportMinimum;d.maximum=this.viewportMaximum;d.range=c;if("bottom"===this._position||"top"===this._position)this.logarithmic?(d.lnLogarithmBase=Math.log(this.logarithmBase),d.pixelPerUnit=(this.reversed?-1:1)*b*d.lnLogarithmBase/Math.log(Math.abs(c))):d.pixelPerUnit=(this.reversed?-1:1)*b/Math.abs(c),d.reference=this.reversed?this.lineCoordinates.x2:this.lineCoordinates.x1;if("left"=== +this._position||"right"===this._position)this.logarithmic?(d.lnLogarithmBase=Math.log(this.logarithmBase),d.pixelPerUnit=(this.reversed?1:-1)*b*d.lnLogarithmBase/Math.log(Math.abs(c))):d.pixelPerUnit=(this.reversed?1:-1)*b/Math.abs(c),d.reference=this.reversed?this.lineCoordinates.y1:this.lineCoordinates.y2;this.conversionParameters=d};z.prototype.calculateAxisParameters=function(){if(this.logarithmic)this.calculateLogarithmicAxisParameters();else{var a=this.chart.layoutManager.getFreeSpace(),d=!1, +b=!1;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?"xySwapped"===this.chart.plotInfo.axisPlacement?62:70:"xySwapped"===this.chart.plotInfo.axisPlacement?50:40,c=4;"axisX"===this.type&&(c=600>this.maxWidth?8:6);var a=Math.max(c,Math.floor(this.maxWidth/a)),e,g,m,c=0;!u(this.options.viewportMinimum)&&(!u(this.options.viewportMaximum)&&this.options.viewportMinimum>=this.options.viewportMaximum)&& +(this.viewportMinimum=this.viewportMaximum=null);if(u(this.options.viewportMinimum)&&!u(this.sessionVariables.newViewportMinimum)&&!isNaN(this.sessionVariables.newViewportMinimum))this.viewportMinimum=this.sessionVariables.newViewportMinimum;else if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(u(this.options.viewportMaximum)&&!u(this.sessionVariables.newViewportMaximum)&&!isNaN(this.sessionVariables.newViewportMaximum))this.viewportMaximum=this.sessionVariables.newViewportMaximum; +else if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(c=0;c<this.scaleBreaks._appliedBreaks.length;c++)if((!u(this.sessionVariables.newViewportMinimum)&&this.sessionVariables.newViewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue)&& +(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue)){this.scaleBreaks._appliedBreaks.splice(c,1);break}if("axisX"===this.type){if(this.dataSeries&&0<this.dataSeries.length)for(e=0;e<this.dataSeries.length;e++)"dateTime"===this.dataSeries[e].xValueType&& +(b=!0);e=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin;g=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax;0===g-e&&(c="undefined"===typeof this.options.interval?0.4:this.options.interval,g+=c,e-=c);Infinity!==this.dataInfo.minDiff?m=this.dataInfo.minDiff:1<g-e?m=0.5*Math.abs(g-e):(m=1,b&&(d=!0))}else"axisY"===this.type&&(e=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,g=null!==this.viewportMaximum?this.viewportMaximum: +this.dataInfo.viewPortMax,isFinite(e)||isFinite(g)?isFinite(e)?isFinite(g)||(g=e):e=g:(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),0===e&&0===g?(g+=9,e=0):0===g-e?(c=Math.min(Math.abs(0.01*Math.abs(g)),5),g+=c,e-=c):e>g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g, +null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1<g-e?0.5*Math.abs(g-e):1,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&0<e&&(e=0),this.includeZero&&(null===this.viewportMaximum||isNaN(this.viewportMaximum))&&0>g&&(g=0));c=this.getApparentDifference(isNaN(this.viewportMinimum)||null===this.viewportMinimum?e:this.viewportMinimum,isNaN(this.viewportMaximum)||null===this.viewportMaximum?g:this.viewportMaximum,null, +!0);if("axisX"===this.type&&b){this.intervalType||(c/1<=a?(this.interval=1,this.intervalType="millisecond"):c/2<=a?(this.interval=2,this.intervalType="millisecond"):c/5<=a?(this.interval=5,this.intervalType="millisecond"):c/10<=a?(this.interval=10,this.intervalType="millisecond"):c/20<=a?(this.interval=20,this.intervalType="millisecond"):c/50<=a?(this.interval=50,this.intervalType="millisecond"):c/100<=a?(this.interval=100,this.intervalType="millisecond"):c/200<=a?(this.interval=200,this.intervalType= +"millisecond"):c/250<=a?(this.interval=250,this.intervalType="millisecond"):c/300<=a?(this.interval=300,this.intervalType="millisecond"):c/400<=a?(this.interval=400,this.intervalType="millisecond"):c/500<=a?(this.interval=500,this.intervalType="millisecond"):c/(1*S.secondDuration)<=a?(this.interval=1,this.intervalType="second"):c/(2*S.secondDuration)<=a?(this.interval=2,this.intervalType="second"):c/(5*S.secondDuration)<=a?(this.interval=5,this.intervalType="second"):c/(10*S.secondDuration)<=a?(this.interval= +10,this.intervalType="second"):c/(15*S.secondDuration)<=a?(this.interval=15,this.intervalType="second"):c/(20*S.secondDuration)<=a?(this.interval=20,this.intervalType="second"):c/(30*S.secondDuration)<=a?(this.interval=30,this.intervalType="second"):c/(1*S.minuteDuration)<=a?(this.interval=1,this.intervalType="minute"):c/(2*S.minuteDuration)<=a?(this.interval=2,this.intervalType="minute"):c/(5*S.minuteDuration)<=a?(this.interval=5,this.intervalType="minute"):c/(10*S.minuteDuration)<=a?(this.interval= +10,this.intervalType="minute"):c/(15*S.minuteDuration)<=a?(this.interval=15,this.intervalType="minute"):c/(20*S.minuteDuration)<=a?(this.interval=20,this.intervalType="minute"):c/(30*S.minuteDuration)<=a?(this.interval=30,this.intervalType="minute"):c/(1*S.hourDuration)<=a?(this.interval=1,this.intervalType="hour"):c/(2*S.hourDuration)<=a?(this.interval=2,this.intervalType="hour"):c/(3*S.hourDuration)<=a?(this.interval=3,this.intervalType="hour"):c/(6*S.hourDuration)<=a?(this.interval=6,this.intervalType= +"hour"):c/(1*S.dayDuration)<=a?(this.interval=1,this.intervalType="day"):c/(2*S.dayDuration)<=a?(this.interval=2,this.intervalType="day"):c/(4*S.dayDuration)<=a?(this.interval=4,this.intervalType="day"):c/(1*S.weekDuration)<=a?(this.interval=1,this.intervalType="week"):c/(2*S.weekDuration)<=a?(this.interval=2,this.intervalType="week"):c/(3*S.weekDuration)<=a?(this.interval=3,this.intervalType="week"):c/(1*S.monthDuration)<=a?(this.interval=1,this.intervalType="month"):c/(2*S.monthDuration)<=a?(this.interval= +2,this.intervalType="month"):c/(3*S.monthDuration)<=a?(this.interval=3,this.intervalType="month"):c/(6*S.monthDuration)<=a?(this.interval=6,this.intervalType="month"):(this.interval=c/(1*S.yearDuration)<=a?1:c/(2*S.yearDuration)<=a?2:c/(4*S.yearDuration)<=a?4:Math.floor(z.getNiceNumber(c/(a-1),!0)/S.yearDuration),this.intervalType="year"));if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=e-m/2;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum= +g+m/2;d?this.autoValueFormatString="MMM DD YYYY HH:mm":"year"===this.intervalType?this.autoValueFormatString="YYYY":"month"===this.intervalType?this.autoValueFormatString="MMM YYYY":"week"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"day"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"hour"===this.intervalType?this.autoValueFormatString="hh:mm TT":"minute"===this.intervalType?this.autoValueFormatString="hh:mm TT":"second"===this.intervalType?this.autoValueFormatString= +"hh:mm:ss TT":"millisecond"===this.intervalType&&(this.autoValueFormatString="fff'ms'");this.valueFormatString||(this.valueFormatString=this.autoValueFormatString)}else{this.intervalType="number";c=z.getNiceNumber(c,!1);this.interval=this.options&&0<this.options.interval?this.options.interval:z.getNiceNumber(c/(a-1),!0);if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval;if(null===this.viewportMaximum|| +isNaN(this.viewportMaximum))this.viewportMaximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval;0===this.viewportMaximum&&0===this.viewportMinimum&&(0===this.options.viewportMinimum?this.viewportMaximum+=10:0===this.options.viewportMaximum&&(this.viewportMinimum-=10),this.options&&"undefined"===typeof this.options.interval&&(this.interval=z.getNiceNumber((this.viewportMaximum-this.viewportMinimum)/(a-1),!0)))}if(null===this.minimum||null===this.maximum)if("axisX"===this.type?(e= +null!==this.minimum?this.minimum:this.dataInfo.min,g=null!==this.maximum?this.maximum:this.dataInfo.max,0===g-e&&(c="undefined"===typeof this.options.interval?0.4:this.options.interval,g+=c,e-=c),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1<g-e?0.5*Math.abs(g-e):1):"axisY"===this.type&&(e=null!==this.minimum?this.minimum:this.dataInfo.min,g=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(e)||isFinite(g)?0===e&&0===g?(g+=9,e=0):0===g-e?(c=Math.min(Math.abs(0.01*Math.abs(g)), +5),g+=c,e-=c):e>g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g,null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)):(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1<g-e?0.5*Math.abs(g-e):1,this.includeZero&&(null===this.minimum|| +isNaN(this.minimum))&&0<e&&(e=0),this.includeZero&&(null===this.maximum||isNaN(this.maximum))&&0>g&&(g=0)),Math.abs(this.getApparentDifference(e,g,null,!0)),"axisX"===this.type&&b){this.valueType="dateTime";if(null===this.minimum||isNaN(this.minimum))this.minimum=e-m/2;if(null===this.maximum||isNaN(this.maximum))this.maximum=g+m/2}else this.intervalType=this.valueType="number",null===this.minimum&&(this.minimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval,this.minimum=Math.min(this.minimum, +null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?Infinity:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval,this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?-Infinity:this.sessionVariables.viewportMaximum)),0===this.maximum&&0===this.minimum&&(0===this.options.minimum?this.maximum+=10:0=== +this.options.maximum&&(this.minimum-=10));u(this.sessionVariables.newViewportMinimum)&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));u(this.sessionVariables.newViewportMaximum)&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.range=this.viewportMaximum-this.viewportMinimum;this.intervalStartPosition="axisX"===this.type&&b?this.getLabelStartPoint(new Date(this.viewportMinimum),this.intervalType,this.interval):Math.floor((this.viewportMinimum+0.2*this.interval)/ +this.interval)*this.interval;this.valueFormatString||(this.valueFormatString=z.generateValueFormatString(this.range,2))}};z.prototype.calculateLogarithmicAxisParameters=function(){var a=this.chart.layoutManager.getFreeSpace(),d=Math.log(this.logarithmBase),b;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?500>this.maxWidth?7:Math.max(7,Math.floor(this.maxWidth/100)):Math.max(Math.floor(this.maxWidth/ +50),3),c,e,g,m;m=1;if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(m=0;m<this.scaleBreaks._appliedBreaks.length;m++)if((!u(this.sessionVariables.newViewportMinimum)&&this.sessionVariables.newViewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[m].startValue|| +!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue)&&(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue)){this.scaleBreaks._appliedBreaks.splice(m,1);break}"axisX"===this.type? +(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,1===e/c&&(m=Math.pow(this.logarithmBase,"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin, +e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,0>=c&&!isFinite(e)?(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1):0>=c?c=e:isFinite(e)||(e=c),1===c&&1===e?(e*=this.logarithmBase-1/this.logarithmBase,c=1):1===e/c?(m=Math.min(e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),e*=m,c/=m):c>e?(m=Math.min(c/e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase, +0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&1<c&&(c=1),this.includeZero&&(null===this.viewportMaximum||isNaN(this.viewportMaximum))&&1>e&&(e=1));m=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)/(isNaN(this.viewportMinimum)||null=== +this.viewportMinimum?c:this.viewportMinimum);var l=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)-(isNaN(this.viewportMinimum)||null===this.viewportMinimum?c:this.viewportMinimum);this.intervalType="number";m=Math.pow(this.logarithmBase,z.getNiceNumber(Math.abs(Math.log(m)/d),!1));this.options&&0<this.options.interval?this.interval=this.options.interval:(this.interval=z.getNiceExponent(Math.log(m)/d/(a-1),!0),b=z.getNiceNumber(l/(a-1),!0));if(null===this.viewportMinimum|| +isNaN(this.viewportMinimum))this.viewportMinimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval));if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum="axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval));1===this.viewportMaximum&&1===this.viewportMinimum&&(1===this.options.viewportMinimum?this.viewportMaximum*=this.logarithmBase-1/this.logarithmBase: +1===this.options.viewportMaximum&&(this.viewportMinimum/=this.logarithmBase-1/this.logarithmBase),this.options&&"undefined"===typeof this.options.interval&&(this.interval=z.getNiceExponent(Math.ceil(Math.log(m)/d)/(a-1)),b=z.getNiceNumber((this.viewportMaximum-this.viewportMinimum)/(a-1),!0)));if(null===this.minimum||null===this.maximum)"axisX"===this.type?(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,1===e/c&&(m=Math.pow(this.logarithmBase, +"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(c)||isFinite(e)?1===c&&1===e?(e*=this.logarithmBase,c/=this.logarithmBase):1===e/c?(m=Math.pow(this.logarithmBase,this.interval),e*=m,c/=m):c>e?(m= +Math.min(0.01*(c/e),5),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)):(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.minimum||isNaN(this.minimum))&&1<c&&(c=1),this.includeZero&&(null===this.maximum||isNaN(this.maximum))&& +1>e&&(e=1)),this.intervalType="number",null===this.minimum&&(this.minimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval)),this.minimum=Math.min(this.minimum,null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?"undefined"===typeof this.sessionVariables.newViewportMinimum?Infinity:this.sessionVariables.newViewportMinimum:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum= +"axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval)),this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?"undefined"===typeof this.sessionVariables.newViewportMaximum?0:this.sessionVariables.newViewportMaximum:this.sessionVariables.viewportMaximum)),1===this.maximum&&1===this.minimum&&(1===this.options.minimum?this.maximum*=this.logarithmBase-1/this.logarithmBase: +1===this.options.maximum&&(this.minimum/=this.logarithmBase-1/this.logarithmBase));this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum);this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum);this.viewportMinimum>this.viewportMaximum&&(!this.options.viewportMinimum&&!this.options.minimum||this.options.viewportMaximum||this.options.maximum?this.options.viewportMinimum||this.options.minimum||!this.options.viewportMaximum&&!this.options.maximum||(this.viewportMinimum=this.minimum= +(this.options.viewportMaximum||this.options.maximum)/Math.pow(this.logarithmBase,2*Math.ceil(this.interval))):this.viewportMaximum=this.maximum=this.options.viewportMinimum||this.options.minimum);c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval);this.range=this.viewportMaximum/this.viewportMinimum;this.noTicks=a;if(!this.options.interval&&this.range<Math.pow(this.logarithmBase,8>this.viewportMaximum||3>a?2:3)){for(d=Math.floor(this.viewportMinimum/ +b+0.5)*b;d<this.viewportMinimum;)d+=b;this.equidistantInterval=!1;this.intervalStartPosition=d;this.interval=b}else this.options.interval||(b=Math.ceil(this.interval),this.range>this.interval&&(this.interval=b,c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval))),this.equidistantInterval=!0,this.intervalStartPosition=c;if(!this.valueFormatString&&(this.valueFormatString="#,##0.##",1>this.viewportMinimum)){d=Math.floor(Math.abs(Math.log(this.viewportMinimum)/ +Math.LN10))+2;if(isNaN(d)||!isFinite(d))d=2;if(2<d)for(m=0;m<d-2;m++)this.valueFormatString+="#"}};z.generateValueFormatString=function(a,d){var b="#,##0.",c=d;1>a&&(c+=Math.floor(Math.abs(Math.log(a)/Math.LN10)),isNaN(c)||!isFinite(c))&&(c=d);for(var e=0;e<c;e++)b+="#";return b};z.getNiceExponent=function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=0>b?1>=c?1:5>=c?5:10:Math.max(Math.floor(c),1);return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.getNiceNumber= +function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=d?1.5>c?1:3>c?2:7>c?5:10:1>=c?1:2>=c?2:5>=c?5:10;return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.prototype.getLabelStartPoint=function(){var a=S[this.intervalType+"Duration"]*this.interval,a=new Date(Math.floor(this.viewportMinimum/a)*a);if("millisecond"!==this.intervalType)if("second"===this.intervalType)0<a.getMilliseconds()&&(a.setSeconds(a.getSeconds()+1),a.setMilliseconds(0));else if("minute"=== +this.intervalType){if(0<a.getSeconds()||0<a.getMilliseconds())a.setMinutes(a.getMinutes()+1),a.setSeconds(0),a.setMilliseconds(0)}else if("hour"===this.intervalType){if(0<a.getMinutes()||0<a.getSeconds()||0<a.getMilliseconds())a.setHours(a.getHours()+1),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)}else if("day"===this.intervalType){if(0<a.getHours()||0<a.getMinutes()||0<a.getSeconds()||0<a.getMilliseconds())a.setDate(a.getDate()+1),a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)}else if("week"=== +this.intervalType){if(0<a.getDay()||0<a.getHours()||0<a.getMinutes()||0<a.getSeconds()||0<a.getMilliseconds())a.setDate(a.getDate()+(7-a.getDay())),a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)}else if("month"===this.intervalType){if(1<a.getDate()||0<a.getHours()||0<a.getMinutes()||0<a.getSeconds()||0<a.getMilliseconds())a.setMonth(a.getMonth()+1),a.setDate(1),a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)}else"year"===this.intervalType&&(0<a.getMonth()||1< +a.getDate()||0<a.getHours()||0<a.getMinutes()||0<a.getSeconds()||0<a.getMilliseconds())&&(a.setFullYear(a.getFullYear()+1),a.setMonth(0),a.setDate(1),a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0));return a};qa(Q,V);qa(L,V);L.prototype.createUserOptions=function(a){if("undefined"!==typeof a||this.options._isPlaceholder){var d=0;this.parent.options._isPlaceholder&&this.parent.createUserOptions();this.options._isPlaceholder||(Fa(this.parent[this.optionsName]),d=this.parent.options[this.optionsName].indexOf(this.options)); +this.options="undefined"===typeof a?{}:a;this.parent.options[this.optionsName][d]=this.options}};L.prototype.render=function(a){if(0!==this.spacing||0!==this.options.lineThickness&&("undefined"!==typeof this.options.lineThickness||0!==this.parent.lineThickness)){var d=this.ctx,b=this.ctx.globalAlpha;this.ctx=a||this.ctx;this.ctx.save();this.ctx.beginPath();this.ctx.rect(this.chart.plotArea.x1,this.chart.plotArea.y1,this.chart.plotArea.width,this.chart.plotArea.height);this.ctx.clip();var c=this.scaleBreaks.parent.getPixelCoordinatesOnAxis(this.startValue), +e=this.scaleBreaks.parent.getPixelCoordinatesOnAxis(this.endValue);this.ctx.strokeStyle=this.lineColor;this.ctx.fillStyle=this.color;this.ctx.beginPath();this.ctx.globalAlpha=1;N(this.id);var g,m,l,k,h,p;a=Math.max(this.spacing,3);var q=Math.max(0,this.lineThickness);this.ctx.lineWidth=q;this.ctx.setLineDash&&this.ctx.setLineDash(R(this.lineDashType,q));if("bottom"===this.scaleBreaks.parent._position||"top"===this.scaleBreaks.parent._position)if(c=1===q%2?(c.x<<0)+0.5:c.x<<0,m=1===q%2?(e.x<<0)+0.5: +e.x<<0,"top"===this.scaleBreaks.parent._position?(e=this.chart.plotArea.y1,l=this.chart.plotArea.y2+q/2+0.5<<0):(e=this.chart.plotArea.y2,l=this.chart.plotArea.y1-q/2+0.5<<0,a*=-1),this.bounds={x1:c-q/2,y1:e,x2:m+q/2,y2:l},this.ctx.moveTo(c,e),"straight"===this.type||"top"===this.scaleBreaks.parent._position&&0>=a||"bottom"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(c,l),this.ctx.lineTo(m,l),this.ctx.lineTo(m,e);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(l-h)/a/3;for(var n=0;n<p;n++)this.ctx.bezierCurveTo(k+ +g*a,h+a,k+g*a,h+2*a,k,h+3*a),h+=3*a,g*=-1;this.ctx.bezierCurveTo(k+g*a,h+a,k+g*a,h+2*a,k,h+3*a);k=m;g*=-1;this.ctx.lineTo(k,h);for(n=0;n<p;n++)this.ctx.bezierCurveTo(k+g*a,h-a,k+g*a,h-2*a,k,h-3*a),h-=3*a,g*=-1}else{if("zigzag"===this.type){g=-1;h=e+a;k=c+a;p=(l-h)/a/2;for(n=0;n<p;n++)this.ctx.lineTo(k,h),k+=2*g*a,h+=2*a,g*=-1;this.ctx.lineTo(k,h);k+=m-c;for(n=0;n<p+1;n++)this.ctx.lineTo(k,h),k+=2*g*a,h-=2*a,g*=-1;this.ctx.lineTo(k+g*a,h+a)}}else if("left"===this.scaleBreaks.parent._position||"right"=== +this.scaleBreaks.parent._position)if(e=1===q%2?(e.y<<0)+0.5:e.y<<0,l=1===q%2?(c.y<<0)+0.5:c.y<<0,"left"===this.scaleBreaks.parent._position?(c=this.chart.plotArea.x1,m=this.chart.plotArea.x2+q/2+0.5<<0):(c=this.chart.plotArea.x2,m=this.chart.plotArea.x1-q/2+0.5<<0,a*=-1),this.bounds={x1:c,y1:e-q/2,x2:m,y2:l+q/2},this.ctx.moveTo(c,e),"straight"===this.type||"left"===this.scaleBreaks.parent._position&&0>=a||"right"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(m,e),this.ctx.lineTo(m,l), +this.ctx.lineTo(c,l);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(m-k)/a/3;for(n=0;n<p;n++)this.ctx.bezierCurveTo(k+a,h+g*a,k+2*a,h+g*a,k+3*a,h),k+=3*a,g*=-1;this.ctx.bezierCurveTo(k+a,h+g*a,k+2*a,h+g*a,k+3*a,h);h=l;g*=-1;this.ctx.lineTo(k,h);for(n=0;n<p;n++)this.ctx.bezierCurveTo(k-a,h+g*a,k-2*a,h+g*a,k-3*a,h),k-=3*a,g*=-1}else if("zigzag"===this.type){g=1;h=e-a;k=c+a;p=(m-k)/a/2;for(n=0;n<p;n++)this.ctx.lineTo(k,h),h+=2*g*a,k+=2*a,g*=-1;this.ctx.lineTo(k,h);h+=l-e;for(n=0;n<p+1;n++)this.ctx.lineTo(k, +h),h+=2*g*a,k-=2*a,g*=-1;this.ctx.lineTo(k+a,h+g*a)}0<q&&this.ctx.stroke();this.ctx.closePath();this.ctx.globalAlpha=this.fillOpacity;this.ctx.globalCompositeOperation="destination-over";this.ctx.fill();this.ctx.restore();this.ctx.globalAlpha=b;this.ctx=d}};qa(X,V);X.prototype.createUserOptions=function(a){if("undefined"!==typeof a||this.options._isPlaceholder){var d=0;this.parent.options._isPlaceholder&&this.parent.createUserOptions();this.options._isPlaceholder||(Fa(this.parent.stripLines),d=this.parent.options.stripLines.indexOf(this.options)); +this.options="undefined"===typeof a?{}:a;this.parent.options.stripLines[d]=this.options}};X.prototype.render=function(){this.ctx.save();var a=this.parent.getPixelCoordinatesOnAxis(this.value),d=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness);if(0<d){var b=null===this.opacity?1:this.opacity;this.ctx.strokeStyle=this.color;this.ctx.beginPath();var c=this.ctx.globalAlpha;this.ctx.globalAlpha=b;N(this.id);var e,g,m,l;this.ctx.lineWidth= +d;this.ctx.setLineDash&&this.ctx.setLineDash(R(this.lineDashType,d));if("bottom"===this.parent._position||"top"===this.parent._position)e=g=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,m=this.chart.plotArea.y1,l=this.chart.plotArea.y2,this.bounds={x1:e-d/2,y1:m,x2:g+d/2,y2:l};else if("left"===this.parent._position||"right"===this.parent._position)m=l=1===this.ctx.lineWidth%2?(a.y<<0)+0.5:a.y<<0,e=this.chart.plotArea.x1,g=this.chart.plotArea.x2,this.bounds={x1:e,y1:m-d/2,x2:g,y2:l+d/2};this.ctx.moveTo(e, +m);this.ctx.lineTo(g,l);this.ctx.stroke();this.ctx.globalAlpha=c}this.ctx.restore()};qa(fa,V);fa.prototype.render=function(a,d){var b,c,e,g,m=null,l=m=null,k="";if(!this.valueFormatString)if("dateTime"===this.parent.valueType)this.valueFormatString=this.parent.valueFormatString;else{var h=0,h="xySwapped"===this.chart.plotInfo.axisPlacement?50<this.parent.range?0:500<this.chart.width&&25>this.parent.range?2:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range? +1:0):50<this.parent.range?0:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range?1:0);this.valueFormatString=z.generateValueFormatString(this.parent.range,h)}var l=null===this.opacity?1:this.opacity,h=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness),p=this.chart.overlaidCanvasCtx,q=p.globalAlpha;p.globalAlpha=l;p.beginPath();p.strokeStyle=this.color;p.lineWidth=h;p.save();this.labelFontSize= +u(this.options.labelFontSize)?this.parent.labelFontSize:this.labelFontSize;if("left"===this.parent._position||"right"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?this.parent.bounds.x2-this.parent.bounds.x1:this.labelMaxWidth,this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?3*this.chart.height:2*this.labelFontSize;else if("top"===this.parent._position||"bottom"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?3*this.chart.width:this.labelMaxWidth, +this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?this.parent.bounds.height:2*this.labelFontSize;0<h&&p.setLineDash&&p.setLineDash(R(this.lineDashType,h));l=new ka(p,{x:0,y:0,padding:{top:2,right:3,bottom:2,left:4},backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxWidth:this.labelMaxWidth,maxHeight:this.labelMaxHeight,angle:this.labelAngle,text:k,horizontalAlign:"left",fontSize:this.labelFontSize, +fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"});if(this.snapToDataPoint){var n=0,m=[];if("xySwapped"===this.chart.plotInfo.axisPlacement){var f=null;if("bottom"===this.parent._position||"top"===this.parent._position)n=this.parent.dataSeries[0].axisX.convertPixelToValue({y:d});else if("left"===this.parent._position||"right"===this.parent._position)n=this.parent.convertPixelToValue({y:d});for(var r=0;r< +this.parent.dataSeries.length;r++)(f=this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&&(f.dataSeries=this.parent.dataSeries[r],null!==f.dataPoint.y&&m.push(f));f=null;if(0===m.length)return;m.sort(function(a,b){return a.distance-b.distance});f=Math.abs(a-this.parent.convertValueToPixel(m[0].dataPoint.y));r=0;if("rangeBar"===m[0].dataSeries.type||"error"===m[0].dataSeries.type)for(var f=Math.abs(a-this.parent.convertValueToPixel(m[r].dataPoint.y[0])),v=0,n=0;n<m.length;n++)if(m[n].dataPoint.y&& +m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(a-this.parent.convertValueToPixel(m[n].dataPoint.y[k])),v<f&&(f=v,r=n);else v=Math.abs(a-this.parent.convertValueToPixel(m[n].dataPoint.y)),v<f&&(f=v,r=n);else if("stackedBar"===m[0].dataSeries.type)for(var f=Math.abs(a-this.parent.convertValueToPixel(m[0].dataPoint.y)),D=v=0,n=r=0;n<m.length;n++)if(m[n].dataPoint.y&&m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(a-this.parent.convertValueToPixel(m[n].dataPoint.y[k])), +v<f&&(f=v,r=n);else D+=m[n].dataPoint.y,v=Math.abs(a-this.parent.convertValueToPixel(D)),v<f&&(f=v,r=n);else if("stackedBar100"===m[0].dataSeries.type)for(var f=Math.abs(a-this.parent.convertValueToPixel(m[0].dataPoint.y)),t=D=v=0,n=0;n<m.length;n++)if(m[n].dataPoint.y&&m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(a-this.parent.convertValueToPixel(m[n].dataPoint.y[k])),v<f&&(f=v,r=n);else D+=m[n].dataPoint.y,t=m[n].dataPoint.x.getTime?m[n].dataPoint.x.getTime():m[n].dataPoint.x, +t=100*(D/m[n].dataSeries.plotUnit.dataPointYSums[t]),v=Math.abs(a-this.parent.convertValueToPixel(t)),v<f&&(f=v,r=n);else for(f=Math.abs(a-this.parent.convertValueToPixel(m[0].dataPoint.y)),n=r=v=0;n<m.length;n++)if(m[n].dataPoint.y&&m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(a-this.parent.convertValueToPixel(m[n].dataPoint.y[k])),v<f&&(f=v,r=n);else v=Math.abs(a-this.parent.convertValueToPixel(m[n].dataPoint.y)),v<f&&(f=v,r=n);k=m[r];if("bottom"===this.parent._position|| +"top"===this.parent._position){b=0;if("rangeBar"===this.parent.dataSeries[r].type||"error"===this.parent.dataSeries[r].type){f=Math.abs(a-this.parent.convertValueToPixel(k.dataPoint.y[0]));for(n=v=0;n<k.dataPoint.y.length;n++)v=Math.abs(a-this.parent.convertValueToPixel(k.dataPoint.y[n])),v<f&&(f=v,b=n);m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataPoint.y[b])<<0)+0.5:this.parent.convertValueToPixel(k.dataPoint.y[b])<<0;l.text=this.labelFormatter?this.labelFormatter({chart:this.chart, +axis:this.parent.options,crosshair:this.options,value:k.dataPoint.y[b]}):u(this.options.label)?ba(k.dataPoint.y[b],this.valueFormatString,this.chart._cultureInfo):this.label}else if("stackedBar"===this.parent.dataSeries[r].type){f=Math.abs(a-this.parent.convertValueToPixel(m[0].dataPoint.y));D=v=0;for(n=r;0<=n;n--)D+=m[n].dataPoint.y,v=Math.abs(a-this.parent.convertValueToPixel(D)),v<f&&(f=v,b=n);m=1===p.lineWidth%2?(this.parent.convertValueToPixel(D)<<0)+0.5:this.parent.convertValueToPixel(D)<<0; +l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.y}):u(this.options.label)?ba(k.dataPoint.y,this.valueFormatString,this.chart._cultureInfo):this.label}else if("stackedBar100"===this.parent.dataSeries[r].type){f=Math.abs(a-this.parent.convertValueToPixel(m[0].dataPoint.y));t=D=v=0;for(n=r;0<=n;n--)D+=m[n].dataPoint.y,t=m[n].dataPoint.x.getTime?m[n].dataPoint.x.getTime():m[n].dataPoint.x,t=100*(D/m[n].dataSeries.plotUnit.dataPointYSums[t]), +v=Math.abs(a-this.parent.convertValueToPixel(t)),v<f&&(f=v,b=n);m=1===p.lineWidth%2?(this.parent.convertValueToPixel(t)<<0)+0.5:this.parent.convertValueToPixel(t)<<0;l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:t}):u(this.options.label)?ba(t,this.valueFormatString,this.chart._cultureInfo):this.label}else m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataPoint.y)<<0)+0.5:this.parent.convertValueToPixel(k.dataPoint.y)<< +0,l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.y}):u(this.options.label)?ba(k.dataPoint.y,this.valueFormatString,this.chart._cultureInfo):this.label;b=c=m;e=this.chart.plotArea.y1;g=this.chart.plotArea.y2;this.bounds={x1:b-h/2,y1:e,x2:c+h/2,y2:g};l.x=b-l.measureText().width/2;l.x+l.width>this.chart.bounds.x2?l.x=this.chart.bounds.x2-l.width:l.x<this.chart.bounds.x1&&(l.x=this.chart.bounds.x1);l.y=this.parent.lineCoordinates.y2+ +l.fontSize/2+2}else if("left"===this.parent._position||"right"===this.parent._position){e=g=m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataPoint.x)<<0)+0.5:this.parent.convertValueToPixel(k.dataPoint.x)<<0;b=this.chart.plotArea.x1;c=this.chart.plotArea.x2;this.bounds={x1:b,y1:e-h/2,x2:c,y2:g+h/2};t=!1;if(this.parent.labels)for(m=Math.ceil(this.parent.interval),n=0;n<this.parent.viewportMaximum;n+=m)if(this.parent.labels[n])t=!0;else{t=!1;break}if(t){if("axisX"===this.parent.type)for(n= +this.parent.convertPixelToValue({y:d}),f=null,r=0;r<this.parent.dataSeries.length;r++)(f=this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.x}):u(this.options.label)?f.dataPoint.label:this.label)}else"dateTime"===this.parent.valueType?l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.x}): +u(this.options.label)?Ca(k.dataPoint.x,this.valueFormatString,this.chart._cultureInfo):this.label:"number"===this.parent.valueType&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.x}):u(this.options.label)?ba(k.dataPoint.x,this.valueFormatString,this.chart._cultureInfo):this.label);l.y=g+l.fontSize/2-l.measureText().height/2+2;l.y-l.fontSize/2<this.chart.bounds.y1?l.y=this.chart.bounds.y1+l.fontSize/2+2:l.y+l.measureText().height- +l.fontSize/2>this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}}else if("bottom"===this.parent._position||"top"===this.parent._position){n=this.parent.convertPixelToValue({x:a});for(r=0;r<this.parent.dataSeries.length;r++)(f=this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&&(f.dataSeries=this.parent.dataSeries[r], +null!==f.dataPoint.y&&m.push(f));if(0===m.length)return;m.sort(function(a,b){return a.distance-b.distance});k=m[0];b=c=m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataPoint.x)<<0)+0.5:this.parent.convertValueToPixel(k.dataPoint.x)<<0;e=this.chart.plotArea.y1;g=this.chart.plotArea.y2;this.bounds={x1:b-h/2,y1:e,x2:c+h/2,y2:g};t=!1;if(this.parent.labels)for(m=Math.ceil(this.parent.interval),n=0;n<this.parent.viewportMaximum;n+=m)if(this.parent.labels[n])t=!0;else{t=!1;break}if(t){if("axisX"=== +this.parent.type)for(n=this.parent.convertPixelToValue({x:a}),f=null,r=0;r<this.parent.dataSeries.length;r++)(f=this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.x}):u(this.options.label)?f.dataPoint.label:this.label)}else"dateTime"===this.parent.valueType?l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options, +value:k.dataPoint.x}):u(this.options.label)?Ca(k.dataPoint.x,this.valueFormatString,this.chart._cultureInfo):this.label:"number"===this.parent.valueType&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.x}):u(this.options.label)?ba(k.dataPoint.x,this.valueFormatString,this.chart._cultureInfo):this.label);l.x=b-l.measureText().width/2;l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.x<this.chart.bounds.x1&& +(l.x=this.chart.bounds.x1);"bottom"===this.parent._position?l.y=this.parent.lineCoordinates.y2+l.fontSize/2+2:"top"===this.parent._position&&(l.y=this.parent.lineCoordinates.y1-l.height+l.fontSize/2+2)}else if("left"===this.parent._position||"right"===this.parent._position){!u(this.parent.dataSeries)&&0<this.parent.dataSeries.length&&(n=this.parent.dataSeries[0].axisX.convertPixelToValue({x:a}));for(r=0;r<this.parent.dataSeries.length;r++)(f=this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&& +(f.dataSeries=this.parent.dataSeries[r],null!==f.dataPoint.y&&m.push(f));if(0===m.length)return;m.sort(function(a,b){return a.distance-b.distance});r=0;if("rangeColumn"===m[0].dataSeries.type||"rangeArea"===m[0].dataSeries.type||"error"===m[0].dataSeries.type||"rangeSplineArea"===m[0].dataSeries.type||"candlestick"===m[0].dataSeries.type||"ohlc"===m[0].dataSeries.type||"boxAndWhisker"===m[0].dataSeries.type)for(f=Math.abs(d-this.parent.convertValueToPixel(m[0].dataPoint.y[0])),n=v=0;n<m.length;n++)if(m[n].dataPoint.y&& +m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(d-this.parent.convertValueToPixel(m[n].dataPoint.y[k])),v<f&&(f=v,r=n);else v=Math.abs(d-this.parent.convertValueToPixel(m[n].dataPoint.y)),v<f&&(f=v,r=n);else if("stackedColumn"===m[0].dataSeries.type||"stackedArea"===m[0].dataSeries.type)for(f=Math.abs(d-this.parent.convertValueToPixel(m[0].dataPoint.y)),n=D=v=0;n<m.length;n++)if(m[n].dataPoint.y&&m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(d-this.parent.convertValueToPixel(m[n].dataPoint.y[k])), +v<f&&(f=v,r=n);else D+=m[n].dataPoint.y,v=Math.abs(d-this.parent.convertValueToPixel(D)),v<f&&(f=v,r=n);else if("stackedColumn100"===m[0].dataSeries.type||"stackedArea100"===m[0].dataSeries.type)for(f=Math.abs(d-this.parent.convertValueToPixel(m[0].dataPoint.y)),n=t=D=v=0;n<m.length;n++)if(m[n].dataPoint.y&&m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(d-this.parent.convertValueToPixel(m[n].dataPoint.y[k])),v<f&&(f=v,r=n);else D+=m[n].dataPoint.y,t=m[n].dataPoint.x.getTime? +m[n].dataPoint.x.getTime():m[n].dataPoint.x,t=100*(D/m[n].dataSeries.plotUnit.dataPointYSums[t]),v=Math.abs(d-this.parent.convertValueToPixel(t)),v<f&&(f=v,r=n);else for(f=Math.abs(d-this.parent.convertValueToPixel(m[0].dataPoint.y)),n=v=0;n<m.length;n++)if(m[n].dataPoint.y&&m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(d-this.parent.convertValueToPixel(m[n].dataPoint.y[k])),v<f&&(f=v,r=n);else v=Math.abs(d-this.parent.convertValueToPixel(m[n].dataPoint.y)),v<f&&(f=v,r= +n);k=m[r];b=0;if("rangeColumn"===this.parent.dataSeries[r].type||"rangeArea"===this.parent.dataSeries[r].type||"error"===this.parent.dataSeries[r].type||"rangeSplineArea"===this.parent.dataSeries[r].type||"candlestick"===this.parent.dataSeries[r].type||"ohlc"===this.parent.dataSeries[r].type||"boxAndWhisker"===this.parent.dataSeries[r].type){f=Math.abs(d-this.parent.convertValueToPixel(k.dataPoint.y[0]));for(n=v=0;n<k.dataPoint.y.length;n++)v=Math.abs(d-this.parent.convertValueToPixel(k.dataPoint.y[n])), +v<f&&(f=v,b=n);m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataPoint.y[b])<<0)+0.5:this.parent.convertValueToPixel(k.dataPoint.y[b])<<0;l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.y[b]}):u(this.options.label)?ba(k.dataPoint.y[b],this.valueFormatString,this.chart._cultureInfo):this.label}else if("stackedColumn"===this.parent.dataSeries[r].type||"stackedArea"===this.parent.dataSeries[r].type){f=Math.abs(d- +this.parent.convertValueToPixel(m[0].dataPoint.y));D=v=0;for(n=r;0<=n;n--)D+=m[n].dataPoint.y,v=Math.abs(d-this.parent.convertValueToPixel(D)),v<f&&(f=v,b=n);m=1===p.lineWidth%2?(this.parent.convertValueToPixel(D)<<0)+0.5:this.parent.convertValueToPixel(D)<<0;l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.y}):u(this.options.label)?ba(k.dataPoint.y,this.valueFormatString,this.chart._cultureInfo):this.label}else if("stackedColumn100"=== +this.parent.dataSeries[r].type||"stackedArea100"===this.parent.dataSeries[r].type){f=Math.abs(d-this.parent.convertValueToPixel(m[0].dataPoint.y));D=v=0;for(n=r;0<=n;n--)D+=m[n].dataPoint.y,t=m[n].dataPoint.x.getTime?m[n].dataPoint.x.getTime():m[n].dataPoint.x,t=100*(D/m[n].dataSeries.plotUnit.dataPointYSums[t]),v=Math.abs(d-this.parent.convertValueToPixel(t)),v<f&&(f=v,b=n);m=1===p.lineWidth%2?(this.parent.convertValueToPixel(t)<<0)+0.5:this.parent.convertValueToPixel(t)<<0;l.text=this.labelFormatter? +this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:t}):u(this.options.label)?ba(t,this.valueFormatString,this.chart._cultureInfo):this.label}else"waterfall"===this.parent.dataSeries[r].type?(m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataSeries.dataPointEOs[k.index].cumulativeSum)<<0)+0.5:this.parent.convertValueToPixel(k.dataSeries.dataPointEOs[k.index].cumulativeSum)<<0,l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options, +crosshair:this.options,value:k.dataSeries.dataPointEOs[k.index].cumulativeSum}):u(this.options.label)?ba(k.dataSeries.dataPointEOs[k.index].cumulativeSum,this.valueFormatString,this.chart._cultureInfo):this.label):(m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataPoint.y)<<0)+0.5:this.parent.convertValueToPixel(k.dataPoint.y)<<0,l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.y}):u(this.options.label)?ba(k.dataPoint.y, +this.valueFormatString,this.chart._cultureInfo):this.label);e=g=m;b=this.chart.plotArea.x1;c=this.chart.plotArea.x2;this.bounds={x1:b,y1:e-h/2,x2:c,y2:g+h/2};l.y=g+l.fontSize/2-l.measureText().height/2+2;l.y-l.fontSize/2<this.chart.bounds.y1?l.y=this.chart.bounds.y1+l.fontSize/2+2:l.y+l.measureText().height-l.fontSize/2>this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"=== +this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}m=null;("bottom"===this.parent._position||"top"===this.parent._position)&&(b>=this.parent.convertValueToPixel(this.parent.viewportMinimum)&&c<=this.parent.convertValueToPixel(this.parent.viewportMaximum))&&(0<h&&(p.moveTo(b,e),p.lineTo(c,g),p.stroke()),p.restore(),!u(l.text)&&("number"===typeof l.text.valueOf()||0<l.text.length)&&l.render(!0));("left"===this.parent._position||"right"===this.parent._position)&&(g>=this.parent.convertValueToPixel(this.parent.viewportMaximum)&& +e<=this.parent.convertValueToPixel(this.parent.viewportMinimum))&&(0<h&&(p.moveTo(b,e),p.lineTo(c,g),p.stroke()),p.restore(),!u(l.text)&&("number"===typeof l.text.valueOf()||0<l.text.length)&&l.render(!0))}else{if("bottom"===this.parent._position||"top"===this.parent._position)b=c=m=1===p.lineWidth%2?(a<<0)+0.5:a<<0,e=this.chart.plotArea.y1,g=this.chart.plotArea.y2,this.bounds={x1:b-h/2,y1:e,x2:c+h/2,y2:g};else if("left"===this.parent._position||"right"===this.parent._position)e=g=m=1===p.lineWidth% +2?(d<<0)+0.5:d<<0,b=this.chart.plotArea.x1,c=this.chart.plotArea.x2,this.bounds={x1:b,y1:e-h/2,x2:c,y2:g+h/2};if("xySwapped"===this.chart.plotInfo.axisPlacement)if("left"===this.parent._position||"right"===this.parent._position){t=!1;if(this.parent.labels)for(m=Math.ceil(this.parent.interval),n=0;n<this.parent.viewportMaximum;n+=m)if(this.parent.labels[n])t=!0;else{t=!1;break}if(t){if("axisX"===this.parent.type)for(n=this.parent.convertPixelToValue({y:d}),f=null,r=0;r<this.parent.dataSeries.length;r++)(f= +this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)?f.dataPoint.label:this.label)}else"dateTime"===this.parent.valueType?l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(d)}):u(this.options.label)?Ca(this.parent.convertPixelToValue(d), +this.valueFormatString,this.chart._cultureInfo):this.label:"number"===this.parent.valueType&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(d)}):u(this.options.label)?ba(this.parent.convertPixelToValue(d),this.valueFormatString,this.chart._cultureInfo):this.label);l.y=d+l.fontSize/2-l.measureText().height/2+2;l.y-l.fontSize/2<this.chart.bounds.y1?l.y=this.chart.bounds.y1+l.fontSize/2+2:l.y+l.measureText().height- +l.fontSize/2>this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x1-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}else{if("bottom"===this.parent._position||"top"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)? +ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label,l.x=b-l.measureText().width/2,l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width),l.x<this.chart.bounds.x1&&(l.x=this.chart.bounds.x1),"bottom"===this.parent._position&&(l.y=this.parent.lineCoordinates.y2+l.fontSize/2+2),"top"===this.parent._position&&(l.y=this.parent.lineCoordinates.y1-l.height+l.fontSize/2+2)}else if("bottom"===this.parent._position||"top"===this.parent._position){t= +!1;k="";if(this.parent.labels)for(m=Math.ceil(this.parent.interval),n=0;n<this.parent.viewportMaximum;n+=m)if(this.parent.labels[n])t=!0;else{t=!1;break}if(t){if("axisX"===this.parent.type)for(n=this.parent.convertPixelToValue({x:a}),f=null,r=0;r<this.parent.dataSeries.length;r++)(f=this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}): +u(this.options.label)?f.dataPoint.label:this.label)}else"dateTime"===this.parent.valueType?l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)?Ca(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label:"number"===this.parent.valueType&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options, +value:0<this.parent.dataSeries.length?this.parent.convertPixelToValue(a):""}):u(this.options.label)?ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label);l.x=b-l.measureText().width/2;l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.x<this.chart.bounds.x1&&(l.x=this.chart.bounds.x1);"bottom"===this.parent._position?l.y=this.parent.lineCoordinates.y2+l.fontSize/2+2:"top"===this.parent._position&&(l.y=this.parent.lineCoordinates.y1-l.height+ +l.fontSize/2+2)}else if("left"===this.parent._position||"right"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(d)}):u(this.options.label)?ba(this.parent.convertPixelToValue(d),this.valueFormatString,this.chart._cultureInfo):this.label,l.y=d+l.fontSize/2-l.measureText().height/2+2,l.y-l.fontSize/2<this.chart.bounds.y1?l.y=this.chart.bounds.y1+l.fontSize/2+2:l.y+l.measureText().height- +l.fontSize/2>this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2),"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2);0<h&&(p.moveTo(b,e),p.lineTo(c,g),p.stroke());p.restore();!u(l.text)&&("number"===typeof l.text.valueOf()||0<l.text.length)&&l.render(!0)}p.globalAlpha=q};qa($,V);$.prototype._initialize=function(){if(this.enabled){this.container=document.createElement("div"); +this.container.setAttribute("class","canvasjs-chart-tooltip");this.container.style.position="absolute";this.container.style.height="auto";this.container.style.boxShadow="1px 1px 2px 2px rgba(0,0,0,0.1)";this.container.style.zIndex="1000";this.container.style.pointerEvents="none";this.container.style.display="none";var a;a='<div style=" width: auto;height: auto;min-width: 50px;';a+="line-height: auto;";a+="margin: 0px 0px 0px 0px;";a+="padding: 5px;";a+="font-family: Calibri, Arial, Georgia, serif;"; +a+="font-weight: normal;";a+="font-style: "+(r?"italic;":"normal;");a+="font-size: 14px;";a+="color: #000000;";a+="text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1);";a+="text-align: left;";a+="border: 2px solid gray;";a+=r?"background: rgba(255,255,255,.9);":"background: rgb(255,255,255);";a+="text-indent: 0px;";a+="white-space: nowrap;";a+="border-radius: 5px;";a+="-moz-user-select:none;";a+="-khtml-user-select: none;";a+="-webkit-user-select: none;";a+="-ms-user-select: none;";a+="user-select: none;"; +r||(a+="filter: alpha(opacity = 90);",a+="filter: progid:DXImageTransform.Microsoft.Shadow(Strength=3, Direction=135, Color='#666666');");a+='} "> Sample Tooltip</div>';this.container.innerHTML=a;this.contentDiv=this.container.firstChild;this.container.style.borderRadius=this.contentDiv.style.borderRadius;this.chart._canvasJSContainer.appendChild(this.container)}};$.prototype.mouseMoveHandler=function(a,d){this._lastUpdated&&4>(new Date).getTime()-this._lastUpdated||(this._lastUpdated=(new Date).getTime(), +this.chart.resetOverlayedCanvas(),this._updateToolTip(a,d))};$.prototype._updateToolTip=function(a,d,b){b="undefined"===typeof b?!0:b;this.container||this._initialize();this.enabled||this.hide();if(!this.chart.disableToolTip){if("undefined"===typeof a||"undefined"===typeof d){if(isNaN(this._prevX)||isNaN(this._prevY))return;a=this._prevX;d=this._prevY}else this._prevX=a,this._prevY=d;var c=null,e=null,g=[],k=0;if(this.shared&&this.enabled&&"none"!==this.chart.plotInfo.axisPlacement){if("xySwapped"=== +this.chart.plotInfo.axisPlacement){var l=[];if(this.chart.axisX)for(var p=0;p<this.chart.axisX.length;p++){for(var k=this.chart.axisX[p].convertPixelToValue({y:d}),h=null,c=0;c<this.chart.axisX[p].dataSeries.length;c++)(h=this.chart.axisX[p].dataSeries[c].getDataPointAtX(k,b))&&0<=h.index&&(h.dataSeries=this.chart.axisX[p].dataSeries[c],null!==h.dataPoint.y&&l.push(h));h=null}if(this.chart.axisX2)for(p=0;p<this.chart.axisX2.length;p++){k=this.chart.axisX2[p].convertPixelToValue({y:d});h=null;for(c= +0;c<this.chart.axisX2[p].dataSeries.length;c++)(h=this.chart.axisX2[p].dataSeries[c].getDataPointAtX(k,b))&&0<=h.index&&(h.dataSeries=this.chart.axisX2[p].dataSeries[c],null!==h.dataPoint.y&&l.push(h));h=null}}else{l=[];if(this.chart.axisX)for(p=0;p<this.chart.axisX.length;p++)for(k=this.chart.axisX[p].convertPixelToValue({x:a}),h=null,c=0;c<this.chart.axisX[p].dataSeries.length;c++)(h=this.chart.axisX[p].dataSeries[c].getDataPointAtX(k,b))&&0<=h.index&&(h.dataSeries=this.chart.axisX[p].dataSeries[c], +null!==h.dataPoint.y&&l.push(h));if(this.chart.axisX2)for(p=0;p<this.chart.axisX2.length;p++)for(k=this.chart.axisX2[p].convertPixelToValue({x:a}),h=null,c=0;c<this.chart.axisX2[p].dataSeries.length;c++)(h=this.chart.axisX2[p].dataSeries[c].getDataPointAtX(k,b))&&0<=h.index&&(h.dataSeries=this.chart.axisX2[p].dataSeries[c],null!==h.dataPoint.y&&l.push(h))}if(0===l.length)return;l.sort(function(a,b){return a.distance-b.distance});b=l[0];for(c=0;c<l.length;c++)l[c].dataPoint.x.valueOf()===b.dataPoint.x.valueOf()&& +g.push(l[c]);l=null}else{if(h=this.chart.getDataPointAtXY(a,d,b))this.currentDataPointIndex=h.dataPointIndex,this.currentSeriesIndex=h.dataSeries.index;else if(r)if(h=ab(a,d,this.chart._eventManager.ghostCtx),0<h&&"undefined"!==typeof this.chart._eventManager.objectMap[h]){h=this.chart._eventManager.objectMap[h];if("legendItem"===h.objectType)return;this.currentSeriesIndex=h.dataSeriesIndex;this.currentDataPointIndex=0<=h.dataPointIndex?h.dataPointIndex:-1}else this.currentDataPointIndex=-1;else this.currentDataPointIndex= +-1;if(0<=this.currentSeriesIndex){e=this.chart.data[this.currentSeriesIndex];h={};if(0<=this.currentDataPointIndex)c=e.dataPoints[this.currentDataPointIndex],h.dataSeries=e,h.dataPoint=c,h.index=this.currentDataPointIndex,h.distance=Math.abs(c.x-k),"waterfall"===e.type&&(h.cumulativeSumYStartValue=e.dataPointEOs[this.currentDataPointIndex].cumulativeSumYStartValue,h.cumulativeSum=e.dataPointEOs[this.currentDataPointIndex].cumulativeSum);else{if(!this.enabled||"line"!==e.type&&"stepLine"!==e.type&& +"spline"!==e.type&&"area"!==e.type&&"stepArea"!==e.type&&"splineArea"!==e.type&&"stackedArea"!==e.type&&"stackedArea100"!==e.type&&"rangeArea"!==e.type&&"rangeSplineArea"!==e.type&&"candlestick"!==e.type&&"ohlc"!==e.type&&"boxAndWhisker"!==e.type)return;k=e.axisX.convertPixelToValue({x:a});h=e.getDataPointAtX(k,b);h.dataSeries=e;this.currentDataPointIndex=h.index;c=h.dataPoint}if(!u(h.dataPoint.y))if(h.dataSeries.axisY)if(0<h.dataPoint.y.length){for(c=b=0;c<h.dataPoint.y.length;c++)h.dataPoint.y[c]< +h.dataSeries.axisY.viewportMinimum?b--:h.dataPoint.y[c]>h.dataSeries.axisY.viewportMaximum&&b++;b<h.dataPoint.y.length&&b>-h.dataPoint.y.length&&g.push(h)}else"column"===e.type||"bar"===e.type?0>h.dataPoint.y?0>h.dataSeries.axisY.viewportMinimum&&h.dataSeries.axisY.viewportMaximum>=h.dataPoint.y&&g.push(h):h.dataSeries.axisY.viewportMinimum<=h.dataPoint.y&&0<=h.dataSeries.axisY.viewportMaximum&&g.push(h):"bubble"===e.type?(b=this.chart._eventManager.objectMap[e.dataPointIds[h.index]].size/2,h.dataPoint.y>= +h.dataSeries.axisY.viewportMinimum-b&&h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum+b&&g.push(h)):"waterfall"===e.type?(b=0,h.cumulativeSumYStartValue<h.dataSeries.axisY.viewportMinimum?b--:h.cumulativeSumYStartValue>h.dataSeries.axisY.viewportMaximum&&b++,h.cumulativeSum<h.dataSeries.axisY.viewportMinimum?b--:h.cumulativeSum>h.dataSeries.axisY.viewportMaximum&&b++,2>b&&-2<b&&g.push(h)):(0<=h.dataSeries.type.indexOf("100")||"stackedColumn"===e.type||"stackedBar"===e.type||h.dataPoint.y>=h.dataSeries.axisY.viewportMinimum&& +h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum)&&g.push(h);else g.push(h)}}if(0<g.length&&(this.highlightObjects(g),this.enabled))if(b="",b=this.getToolTipInnerHTML({entries:g}),null!==b){this.contentDiv.innerHTML=b;b=!1;"none"===this.container.style.display&&(b=!0,this.container.style.display="block");try{this.contentDiv.style.background=this.backgroundColor?this.backgroundColor:r?"rgba(255,255,255,.9)":"rgb(255,255,255)",this.borderColor="waterfall"===g[0].dataSeries.type?this.contentDiv.style.borderRightColor= +this.contentDiv.style.borderLeftColor=this.contentDiv.style.borderColor=this.options.borderColor?this.options.borderColor:g[0].dataPoint.color?g[0].dataPoint.color:0<g[0].dataPoint.y?g[0].dataSeries.risingColor:g[0].dataSeries.fallingColor:"error"===g[0].dataSeries.type?this.contentDiv.style.borderRightColor=this.contentDiv.style.borderLeftColor=this.contentDiv.style.borderColor=this.options.borderColor?this.options.borderColor:g[0].dataSeries.color?g[0].dataSeries.color:g[0].dataSeries._colorSet[e.index% +g[0].dataSeries._colorSet.length]:this.contentDiv.style.borderRightColor=this.contentDiv.style.borderLeftColor=this.contentDiv.style.borderColor=this.options.borderColor?this.options.borderColor:g[0].dataPoint.color?g[0].dataPoint.color:g[0].dataSeries.color?g[0].dataSeries.color:g[0].dataSeries._colorSet[g[0].index%g[0].dataSeries._colorSet.length],this.contentDiv.style.borderWidth=this.borderThickness||0===this.borderThickness?this.borderThickness+"px":"2px",this.contentDiv.style.borderRadius=this.cornerRadius|| +0===this.cornerRadius?this.cornerRadius+"px":"5px",this.container.style.borderRadius=this.contentDiv.style.borderRadius,this.contentDiv.style.fontSize=this.fontSize||0===this.fontSize?this.fontSize+"px":"14px",this.contentDiv.style.color=this.fontColor?this.fontColor:"#000000",this.contentDiv.style.fontFamily=this.fontFamily?this.fontFamily:"Calibri, Arial, Georgia, serif;",this.contentDiv.style.fontWeight=this.fontWeight?this.fontWeight:"normal",this.contentDiv.style.fontStyle=this.fontStyle?this.fontStyle: +r?"italic":"normal"}catch(s){}"pie"===g[0].dataSeries.type||"doughnut"===g[0].dataSeries.type||"funnel"===g[0].dataSeries.type||"pyramid"===g[0].dataSeries.type||"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"===g[0].dataSeries.type?a=a-10-this.container.clientWidth:(a=g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x)-this.container.clientWidth<<0,a-=10);0>a&&(a+=this.container.clientWidth+20);a+this.container.clientWidth> +Math.max(this.chart.container.clientWidth,this.chart.width)&&(a=Math.max(0,Math.max(this.chart.container.clientWidth,this.chart.width)-this.container.clientWidth));d=1!==g.length||this.shared||"line"!==g[0].dataSeries.type&&"stepLine"!==g[0].dataSeries.type&&"spline"!==g[0].dataSeries.type&&"area"!==g[0].dataSeries.type&&"stepArea"!==g[0].dataSeries.type&&"splineArea"!==g[0].dataSeries.type?"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"=== +g[0].dataSeries.type?g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x):d:g[0].dataSeries.axisY.convertValueToPixel(g[0].dataPoint.y);d=-d+10;0<d+this.container.clientHeight+5&&(d-=d+this.container.clientHeight+5-0);this.fixMozTransitionDelay(a,d);!this.animationEnabled||b?this.disableAnimation():(this.enableAnimation(),this.container.style.MozTransition=this.mozContainerTransition);this.container.style.left=a+"px";this.container.style.bottom=d+"px"}else this.hide(!1)}};$.prototype.highlightObjects= +function(a){var d=this.chart.overlaidCanvasCtx;this.chart.resetOverlayedCanvas();d.clearRect(0,0,this.chart.width,this.chart.height);d.save();var b=this.chart.plotArea,c=0;d.beginPath();d.rect(b.x1,b.y1,b.x2-b.x1,b.y2-b.y1);d.clip();for(b=0;b<a.length;b++){var e=a[b];if((e=this.chart._eventManager.objectMap[e.dataSeries.dataPointIds[e.index]])&&e.objectType&&"dataPoint"===e.objectType){var c=this.chart.data[e.dataSeriesIndex],g=c.dataPoints[e.dataPointIndex],k=e.dataPointIndex;!1===g.highlightEnabled|| +!0!==c.highlightEnabled&&!0!==g.highlightEnabled||("line"===c.type||"stepLine"===c.type||"spline"===c.type||"scatter"===c.type||"area"===c.type||"stepArea"===c.type||"splineArea"===c.type||"stackedArea"===c.type||"stackedArea100"===c.type||"rangeArea"===c.type||"rangeSplineArea"===c.type?(g=c.getMarkerProperties(k,e.x1,e.y1,this.chart.overlaidCanvasCtx),g.size=Math.max(1.5*g.size<<0,10),g.borderColor=g.borderColor||"#FFFFFF",g.borderThickness=g.borderThickness||Math.ceil(0.1*g.size),ia.drawMarkers([g]), +"undefined"!==typeof e.y2&&(g=c.getMarkerProperties(k,e.x1,e.y2,this.chart.overlaidCanvasCtx),g.size=Math.max(1.5*g.size<<0,10),g.borderColor=g.borderColor||"#FFFFFF",g.borderThickness=g.borderThickness||Math.ceil(0.1*g.size),ia.drawMarkers([g]))):"bubble"===c.type?(g=c.getMarkerProperties(k,e.x1,e.y1,this.chart.overlaidCanvasCtx),g.size=e.size,g.color="white",g.borderColor="white",d.globalAlpha=0.3,ia.drawMarkers([g]),d.globalAlpha=1):"column"===c.type||"stackedColumn"===c.type||"stackedColumn100"=== +c.type||"bar"===c.type||"rangeBar"===c.type||"stackedBar"===c.type||"stackedBar100"===c.type||"rangeColumn"===c.type||"waterfall"===c.type?ea(d,e.x1,e.y1,e.x2,e.y2,"white",0,null,!1,!1,!1,!1,0.3):"pie"===c.type||"doughnut"===c.type?ja(d,e.center,e.radius,"white",c.type,e.startAngle,e.endAngle,0.3,e.percentInnerRadius):"funnel"===c.type||"pyramid"===c.type?ra(d,e.funnelSection,0.3,"white"):"candlestick"===c.type?(d.globalAlpha=1,d.strokeStyle=e.color,d.lineWidth=2*e.borderThickness,c=0===d.lineWidth% +2?0:0.5,d.beginPath(),d.moveTo(e.x3-c,Math.min(e.y2,e.y3)),d.lineTo(e.x3-c,Math.min(e.y1,e.y4)),d.stroke(),d.beginPath(),d.moveTo(e.x3-c,Math.max(e.y1,e.y4)),d.lineTo(e.x3-c,Math.max(e.y2,e.y3)),d.stroke(),ea(d,e.x1,Math.min(e.y1,e.y4),e.x2,Math.max(e.y1,e.y4),"transparent",2*e.borderThickness,e.color,!1,!1,!1,!1),d.globalAlpha=1):"ohlc"===c.type?(d.globalAlpha=1,d.strokeStyle=e.color,d.lineWidth=2*e.borderThickness,c=0===d.lineWidth%2?0:0.5,d.beginPath(),d.moveTo(e.x3-c,e.y2),d.lineTo(e.x3-c,e.y3), +d.stroke(),d.beginPath(),d.moveTo(e.x3,e.y1),d.lineTo(e.x1,e.y1),d.stroke(),d.beginPath(),d.moveTo(e.x3,e.y4),d.lineTo(e.x2,e.y4),d.stroke(),d.globalAlpha=1):"boxAndWhisker"===c.type?(d.save(),d.globalAlpha=1,d.strokeStyle=e.stemColor,d.lineWidth=2*e.stemThickness,0<e.stemThickness&&(d.beginPath(),d.moveTo(e.x3,e.y2+e.borderThickness/2),d.lineTo(e.x3,e.y1+e.whiskerThickness/2),d.stroke(),d.beginPath(),d.moveTo(e.x3,e.y4-e.whiskerThickness/2),d.lineTo(e.x3,e.y3-e.borderThickness/2),d.stroke()),d.beginPath(), +ea(d,e.x1-e.borderThickness/2,Math.max(e.y2+e.borderThickness/2,e.y3+e.borderThickness/2),e.x2+e.borderThickness/2,Math.min(e.y2-e.borderThickness/2,e.y3-e.borderThickness/2),"transparent",e.borderThickness,e.color,!1,!1,!1,!1),d.globalAlpha=1,d.strokeStyle=e.whiskerColor,d.lineWidth=2*e.whiskerThickness,0<e.whiskerThickness&&(d.beginPath(),d.moveTo(Math.floor(e.x3-e.whiskerLength/2),e.y4),d.lineTo(Math.ceil(e.x3+e.whiskerLength/2),e.y4),d.stroke(),d.beginPath(),d.moveTo(Math.floor(e.x3-e.whiskerLength/ +2),e.y1),d.lineTo(Math.ceil(e.x3+e.whiskerLength/2),e.y1),d.stroke()),d.globalAlpha=1,d.strokeStyle=e.lineColor,d.lineWidth=2*e.lineThickness,0<e.lineThickness&&(d.beginPath(),d.moveTo(e.x1,e.y5),d.lineTo(e.x2,e.y5),d.stroke()),d.restore(),d.globalAlpha=1):"error"===c.type&&E(d,e.x1,e.y1,e.x2,e.y2,"white",e.whiskerProperties,e.stemProperties,e.isXYSwapped,0.3))}}d.restore();d.globalAlpha=1;d.beginPath()};$.prototype.getToolTipInnerHTML=function(a){a=a.entries;for(var d=null,b=null,c=null,e=0,g="", +k=!0,l=0;l<a.length;l++)if(a[l].dataSeries.toolTipContent||a[l].dataPoint.toolTipContent){k=!1;break}if(k&&(this.content&&"function"===typeof this.content||this.contentFormatter))a={chart:this.chart,toolTip:this.options,entries:a},d=this.contentFormatter?this.contentFormatter(a):this.content(a);else if(this.shared&&"none"!==this.chart.plotInfo.axisPlacement){for(var p=null,h="",l=0;l<a.length;l++)b=a[l].dataSeries,c=a[l].dataPoint,e=a[l].index,g="",0===l&&(k&&!this.content)&&(this.chart.axisX&&0< +this.chart.axisX.length?h+="undefined"!==typeof this.chart.axisX[0].labels[c.x]?this.chart.axisX[0].labels[c.x]:"{x}":this.chart.axisX2&&0<this.chart.axisX2.length&&(h+="undefined"!==typeof this.chart.axisX2[0].labels[c.x]?this.chart.axisX2[0].labels[c.x]:"{x}"),h+="</br>",h=this.chart.replaceKeywordsWithValue(h,c,b,e)),null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent||("line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"=== +b.type||"splineArea"===b.type||"column"===b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?(this.chart.axisX&&1<this.chart.axisX.length&&(g+=p!=b.axisXIndex?b.axisX.title?b.axisX.title+"<br/>":"X:{axisXIndex}<br/>":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content? +this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>{name}:</span>  {y}",p=b.axisXIndex):"bubble"===b.type?(this.chart.axisX&&1<this.chart.axisX.length&&(g+=p!=b.axisXIndex?b.axisX.title?b.axisX.title+"<br/>":"X:{axisXIndex}<br/>":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>{name}:</span>  {y},   {z}"): +"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?(this.chart.axisX&&1<this.chart.axisX.length&&(g+=p!=b.axisXIndex?b.axisX.title?b.axisX.title+"<br/>":"X:{axisXIndex}<br/>":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>{name}:</span>  {y[0]}, {y[1]}"):"candlestick"=== +b.type||"ohlc"===b.type?(this.chart.axisX&&1<this.chart.axisX.length&&(g+=p!=b.axisXIndex?b.axisX.title?b.axisX.title+"<br/>":"X:{axisXIndex}<br/>":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>{name}:</span><br/>Open:   {y[0]}<br/>High:    {y[1]}<br/>Low:   {y[2]}<br/>Close:   {y[3]}"):"boxAndWhisker"=== +b.type&&(this.chart.axisX&&1<this.chart.axisX.length&&(g+=p!=b.axisXIndex?b.axisX.title?b.axisX.title+"<br/>":"X:{axisXIndex}<br/>":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>{name}:</span><br/>Minimum:   {y[0]}<br/>Q1:               {y[1]}<br/>Q2:               {y[4]}<br/>Q3:               {y[2]}<br/>Maximum:  {y[3]}"), +null===d&&(d=""),!0===this.reversed?(d=this.chart.replaceKeywordsWithValue(g,c,b,e)+d,l<a.length-1&&(d="</br>"+d)):(d+=this.chart.replaceKeywordsWithValue(g,c,b,e),l<a.length-1&&(d+="</br>")));null!==d&&(d=h+d)}else{b=a[0].dataSeries;c=a[0].dataPoint;e=a[0].index;if(null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent)return null;"line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"===b.type||"splineArea"===b.type||"column"=== +b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>"+(c.label?"{label}":"{x}")+":</span>  {y}":"bubble"===b.type?g=c.toolTipContent? +c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>"+(c.label?"{label}":"{x}")+":</span>  {y},   {z}":"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"": +"'color:{color};'")+"\"'>"+(c.name?"{name}:</span>  ":c.label?"{label}:</span>  ":"</span>")+"{y}":"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>"+(c.label?"{label}":"{x}")+" :</span>  {y[0]},  {y[1]}": +"candlestick"===b.type||"ohlc"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>"+(c.label?"{label}":"{x}")+"</span><br/>Open:   {y[0]}<br/>High:    {y[1]}<br/>Low:     {y[2]}<br/>Close:   {y[3]}":"boxAndWhisker"===b.type&&(g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent: +this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>"+(c.label?"{label}":"{x}")+"</span><br/>Minimum:   {y[0]}<br/>Q1:               {y[1]}<br/>Q2:               {y[4]}<br/>Q3:               {y[2]}<br/>Maximum:  {y[3]}"); +null===d&&(d="");d+=this.chart.replaceKeywordsWithValue(g,c,b,e)}return d};$.prototype.enableAnimation=function(){if(!this.container.style.WebkitTransition){var a=this.getContainerTransition(this.containerTransitionDuration);this.container.style.WebkitTransition=a;this.container.style.MsTransition=a;this.container.style.transition=a;this.container.style.MozTransition=this.mozContainerTransition}};$.prototype.disableAnimation=function(){this.container.style.WebkitTransition&&(this.container.style.WebkitTransition= +"",this.container.style.MozTransition="",this.container.style.MsTransition="",this.container.style.transition="")};$.prototype.hide=function(a){this.container&&(this.container.style.display="none",this.currentSeriesIndex=-1,this._prevY=this._prevX=NaN,("undefined"===typeof a||a)&&this.chart.resetOverlayedCanvas())};$.prototype.show=function(a,d,b){this._updateToolTip(a,d,"undefined"===typeof b?!1:b)};$.prototype.fixMozTransitionDelay=function(a,d){if(20<this.chart._eventManager.lastObjectId)this.mozContainerTransition= +this.getContainerTransition(0);else{var b=parseFloat(this.container.style.left),b=isNaN(b)?0:b,c=parseFloat(this.container.style.bottom),c=isNaN(c)?0:c;10<Math.sqrt(Math.pow(b-a,2)+Math.pow(c-d,2))?this.mozContainerTransition=this.getContainerTransition(0.1):this.mozContainerTransition=this.getContainerTransition(0)}};$.prototype.getContainerTransition=function(a){return"left "+a+"s ease-out 0s, bottom "+a+"s ease-out 0s"};ha.prototype.reset=function(){this.lastObjectId=0;this.objectMap=[];this.rectangularRegionEventSubscriptions= +[];this.previousDataPointEventObject=null;this.eventObjects=[];r&&(this.ghostCtx.clearRect(0,0,this.chart.width,this.chart.height),this.ghostCtx.beginPath())};ha.prototype.getNewObjectTrackingId=function(){return++this.lastObjectId};ha.prototype.mouseEventHandler=function(a){if("mousemove"===a.type||"click"===a.type){var d=[],b=Ra(a),c=null;if((c=this.chart.getObjectAtXY(b.x,b.y,!1))&&"undefined"!==typeof this.objectMap[c])if(c=this.objectMap[c],"dataPoint"===c.objectType){var e=this.chart.data[c.dataSeriesIndex], +g=e.dataPoints[c.dataPointIndex],k=c.dataPointIndex;c.eventParameter={x:b.x,y:b.y,dataPoint:g,dataSeries:e.options,dataPointIndex:k,dataSeriesIndex:e.index,chart:this.chart};c.eventContext={context:g,userContext:g,mouseover:"mouseover",mousemove:"mousemove",mouseout:"mouseout",click:"click"};d.push(c);c=this.objectMap[e.id];c.eventParameter={x:b.x,y:b.y,dataPoint:g,dataSeries:e.options,dataPointIndex:k,dataSeriesIndex:e.index,chart:this.chart};c.eventContext={context:e,userContext:e.options,mouseover:"mouseover", +mousemove:"mousemove",mouseout:"mouseout",click:"click"};d.push(this.objectMap[e.id])}else"legendItem"===c.objectType&&(e=this.chart.data[c.dataSeriesIndex],g=null!==c.dataPointIndex?e.dataPoints[c.dataPointIndex]:null,c.eventParameter={x:b.x,y:b.y,dataSeries:e.options,dataPoint:g,dataPointIndex:c.dataPointIndex,dataSeriesIndex:c.dataSeriesIndex,chart:this.chart},c.eventContext={context:this.chart.legend,userContext:this.chart.legend.options,mouseover:"itemmouseover",mousemove:"itemmousemove",mouseout:"itemmouseout", +click:"itemclick"},d.push(c));e=[];for(b=0;b<this.mouseoveredObjectMaps.length;b++){g=!0;for(c=0;c<d.length;c++)if(d[c].id===this.mouseoveredObjectMaps[b].id){g=!1;break}g?this.fireEvent(this.mouseoveredObjectMaps[b],"mouseout",a):e.push(this.mouseoveredObjectMaps[b])}this.mouseoveredObjectMaps=e;for(b=0;b<d.length;b++){e=!1;for(c=0;c<this.mouseoveredObjectMaps.length;c++)if(d[b].id===this.mouseoveredObjectMaps[c].id){e=!0;break}e||(this.fireEvent(d[b],"mouseover",a),this.mouseoveredObjectMaps.push(d[b])); +"click"===a.type?this.fireEvent(d[b],"click",a):"mousemove"===a.type&&this.fireEvent(d[b],"mousemove",a)}}};ha.prototype.fireEvent=function(a,d,b){if(a&&d){var c=a.eventParameter,e=a.eventContext,g=a.eventContext.userContext;g&&(e&&g[e[d]])&&g[e[d]].call(g,c);"mouseout"!==d?g.cursor&&g.cursor!==b.target.style.cursor&&(b.target.style.cursor=g.cursor):(b.target.style.cursor=this.chart._defaultCursor,delete a.eventParameter,delete a.eventContext);"click"===d&&("dataPoint"===a.objectType&&this.chart.pieDoughnutClickHandler)&& +this.chart.pieDoughnutClickHandler.call(this.chart.data[a.dataSeriesIndex],c);"click"===d&&("dataPoint"===a.objectType&&this.chart.funnelPyramidClickHandler)&&this.chart.funnelPyramidClickHandler.call(this.chart.data[a.dataSeriesIndex],c)}};ga.prototype.animate=function(a,d,b,c,e){var g=this;this.chart.isAnimating=!0;e=e||M.easing.linear;b&&this.animations.push({startTime:(new Date).getTime()+(a?a:0),duration:d,animationCallback:b,onComplete:c});for(a=[];0<this.animations.length;)if(d=this.animations.shift(), +b=(new Date).getTime(),c=0,d.startTime<=b&&(c=e(Math.min(b-d.startTime,d.duration),0,1,d.duration),c=Math.min(c,1),isNaN(c)||!isFinite(c))&&(c=1),1>c&&a.push(d),d.animationCallback(c),1<=c&&d.onComplete)d.onComplete();this.animations=a;0<this.animations.length?this.animationRequestId=this.chart.requestAnimFrame.call(window,function(){g.animate.call(g)}):this.chart.isAnimating=!1};ga.prototype.cancelAllAnimations=function(){this.animations=[];this.animationRequestId&&this.chart.cancelRequestAnimFrame.call(window, +this.animationRequestId);this.animationRequestId=null;this.chart.isAnimating=!1};var M={yScaleAnimation:function(a,d){if(0!==a){var b=d.dest,c=d.source.canvas,e=d.animationBase;b.drawImage(c,0,0,c.width,c.height,0,e-e*a,b.canvas.width/W,a*b.canvas.height/W)}},xScaleAnimation:function(a,d){if(0!==a){var b=d.dest,c=d.source.canvas,e=d.animationBase;b.drawImage(c,0,0,c.width,c.height,e-e*a,0,a*b.canvas.width/W,b.canvas.height/W)}},xClipAnimation:function(a,d){if(0!==a){var b=d.dest,c=d.source.canvas; +b.save();0<a&&b.drawImage(c,0,0,c.width*a,c.height,0,0,c.width*a/W,c.height/W);b.restore()}},fadeInAnimation:function(a,d){if(0!==a){var b=d.dest,c=d.source.canvas;b.save();b.globalAlpha=a;b.drawImage(c,0,0,c.width,c.height,0,0,b.canvas.width/W,b.canvas.height/W);b.restore()}},easing:{linear:function(a,d,b,c){return b*a/c+d},easeOutQuad:function(a,d,b,c){return-b*(a/=c)*(a-2)+d},easeOutQuart:function(a,d,b,c){return-b*((a=a/c-1)*a*a*a-1)+d},easeInQuad:function(a,d,b,c){return b*(a/=c)*a+d},easeInQuart:function(a, +d,b,c){return b*(a/=c)*a*a*a+d}}},ia={drawMarker:function(a,d,b,c,e,g,k,l){if(b){var p=1;b.fillStyle=g?g:"#000000";b.strokeStyle=k?k:"#000000";b.lineWidth=l?l:0;b.setLineDash&&b.setLineDash(R("solid",l));"circle"===c?(b.moveTo(a,d),b.beginPath(),b.arc(a,d,e/2,0,2*Math.PI,!1),g&&b.fill(),l&&(k?b.stroke():(p=b.globalAlpha,b.globalAlpha=0.15,b.strokeStyle="black",b.stroke(),b.globalAlpha=p))):"square"===c?(b.beginPath(),b.rect(a-e/2,d-e/2,e,e),g&&b.fill(),l&&(k?b.stroke():(p=b.globalAlpha,b.globalAlpha= +0.15,b.strokeStyle="black",b.stroke(),b.globalAlpha=p))):"triangle"===c?(b.beginPath(),b.moveTo(a-e/2,d+e/2),b.lineTo(a+e/2,d+e/2),b.lineTo(a,d-e/2),b.closePath(),g&&b.fill(),l&&(k?b.stroke():(p=b.globalAlpha,b.globalAlpha=0.15,b.strokeStyle="black",b.stroke(),b.globalAlpha=p)),b.beginPath()):"cross"===c&&(b.strokeStyle=g,b.lineWidth=e/4,b.beginPath(),b.moveTo(a-e/2,d-e/2),b.lineTo(a+e/2,d+e/2),b.stroke(),b.moveTo(a+e/2,d-e/2),b.lineTo(a-e/2,d+e/2),b.stroke())}},drawMarkers:function(a){for(var d= +0;d<a.length;d++){var b=a[d];ia.drawMarker(b.x,b.y,b.ctx,b.type,b.size,b.color,b.borderColor,b.borderThickness)}}};return p}();Na.Chart.version="v2.3.1 GA"})(); + +/* + excanvas is used to support IE678 which do not implement HTML5 Canvas Element. You can safely remove the following excanvas code if you don't need to support older browsers. + + Copyright 2006 Google Inc. https://code.google.com/p/explorercanvas/ + Licensed under the Apache License, Version 2.0 +*/ +document.createElement("canvas").getContext||function(){function V(){return this.context_||(this.context_=new C(this))}function W(a,b,c){var g=M.call(arguments,2);return function(){return a.apply(b,g.concat(M.call(arguments)))}}function N(a){return String(a).replace(/&/g,"&").replace(/"/g,""")}function O(a){a.namespaces.g_vml_||a.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML");a.namespaces.g_o_||a.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML"); +a.styleSheets.ex_canvas_||(a=a.createStyleSheet(),a.owningElement.id="ex_canvas_",a.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}")}function X(a){var b=a.srcElement;switch(a.propertyName){case "width":b.getContext().clearRect();b.style.width=b.attributes.width.nodeValue+"px";b.firstChild.style.width=b.clientWidth+"px";break;case "height":b.getContext().clearRect(),b.style.height=b.attributes.height.nodeValue+"px",b.firstChild.style.height=b.clientHeight+ +"px"}}function Y(a){a=a.srcElement;a.firstChild&&(a.firstChild.style.width=a.clientWidth+"px",a.firstChild.style.height=a.clientHeight+"px")}function D(){return[[1,0,0],[0,1,0],[0,0,1]]}function t(a,b){for(var c=D(),g=0;3>g;g++)for(var e=0;3>e;e++){for(var f=0,d=0;3>d;d++)f+=a[g][d]*b[d][e];c[g][e]=f}return c}function P(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX= +a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha;b.font=a.font;b.textAlign=a.textAlign;b.textBaseline=a.textBaseline;b.arcScaleX_=a.arcScaleX_;b.arcScaleY_=a.arcScaleY_;b.lineScale_=a.lineScale_}function Q(a){var b=a.indexOf("(",3),c=a.indexOf(")",b+1),b=a.substring(b+1,c).split(",");if(4!=b.length||"a"!=a.charAt(3))b[3]=1;return b}function E(a,b,c){return Math.min(c,Math.max(b,a))}function F(a,b,c){0>c&&c++;1<c&&c--;return 1>6*c?a+6*(b-a)*c: +1>2*c?b:2>3*c?a+6*(b-a)*(2/3-c):a}function G(a){if(a in H)return H[a];var b,c=1;a=String(a);if("#"==a.charAt(0))b=a;else if(/^rgb/.test(a)){c=Q(a);b="#";for(var g,e=0;3>e;e++)g=-1!=c[e].indexOf("%")?Math.floor(255*(parseFloat(c[e])/100)):+c[e],b+=v[E(g,0,255)];c=+c[3]}else if(/^hsl/.test(a)){e=c=Q(a);b=parseFloat(e[0])/360%360;0>b&&b++;g=E(parseFloat(e[1])/100,0,1);e=E(parseFloat(e[2])/100,0,1);if(0==g)g=e=b=e;else{var f=0.5>e?e*(1+g):e+g-e*g,d=2*e-f;g=F(d,f,b+1/3);e=F(d,f,b);b=F(d,f,b-1/3)}b="#"+ +v[Math.floor(255*g)]+v[Math.floor(255*e)]+v[Math.floor(255*b)];c=c[3]}else b=Z[a]||a;return H[a]={color:b,alpha:c}}function C(a){this.m_=D();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=1*q;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=a;var b="width:"+a.clientWidth+"px;height:"+a.clientHeight+"px;overflow:hidden;position:absolute", +c=a.ownerDocument.createElement("div");c.style.cssText=b;a.appendChild(c);b=c.cloneNode(!1);b.style.backgroundColor="red";b.style.filter="alpha(opacity=0)";a.appendChild(b);this.element_=c;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}function R(a,b,c,g){a.currentPath_.push({type:"bezierCurveTo",cp1x:b.x,cp1y:b.y,cp2x:c.x,cp2y:c.y,x:g.x,y:g.y});a.currentX_=g.x;a.currentY_=g.y}function S(a,b){var c=G(a.strokeStyle),g=c.color,c=c.alpha*a.globalAlpha,e=a.lineScale_*a.lineWidth;1>e&&(c*=e);b.push("<g_vml_:stroke", +' opacity="',c,'"',' joinstyle="',a.lineJoin,'"',' miterlimit="',a.miterLimit,'"',' endcap="',$[a.lineCap]||"square",'"',' weight="',e,'px"',' color="',g,'" />')}function T(a,b,c,g){var e=a.fillStyle,f=a.arcScaleX_,d=a.arcScaleY_,k=g.x-c.x,n=g.y-c.y;if(e instanceof w){var h=0,l=g=0,u=0,m=1;if("gradient"==e.type_){h=e.x1_/f;c=e.y1_/d;var p=s(a,e.x0_/f,e.y0_/d),h=s(a,h,c),h=180*Math.atan2(h.x-p.x,h.y-p.y)/Math.PI;0>h&&(h+=360);1E-6>h&&(h=0)}else p=s(a,e.x0_,e.y0_),g=(p.x-c.x)/k,l=(p.y-c.y)/n,k/=f*q, +n/=d*q,m=x.max(k,n),u=2*e.r0_/m,m=2*e.r1_/m-u;f=e.colors_;f.sort(function(a,b){return a.offset-b.offset});d=f.length;p=f[0].color;c=f[d-1].color;k=f[0].alpha*a.globalAlpha;a=f[d-1].alpha*a.globalAlpha;for(var n=[],r=0;r<d;r++){var t=f[r];n.push(t.offset*m+u+" "+t.color)}b.push('<g_vml_:fill type="',e.type_,'"',' method="none" focus="100%"',' color="',p,'"',' color2="',c,'"',' colors="',n.join(","),'"',' opacity="',a,'"',' g_o_:opacity2="',k,'"',' angle="',h,'"',' focusposition="',g,",",l,'" />')}else e instanceof +I?k&&n&&b.push("<g_vml_:fill",' position="',-c.x/k*f*f,",",-c.y/n*d*d,'"',' type="tile"',' src="',e.src_,'" />'):(e=G(a.fillStyle),b.push('<g_vml_:fill color="',e.color,'" opacity="',e.alpha*a.globalAlpha,'" />'))}function s(a,b,c){a=a.m_;return{x:q*(b*a[0][0]+c*a[1][0]+a[2][0])-r,y:q*(b*a[0][1]+c*a[1][1]+a[2][1])-r}}function z(a,b,c){isFinite(b[0][0])&&(isFinite(b[0][1])&&isFinite(b[1][0])&&isFinite(b[1][1])&&isFinite(b[2][0])&&isFinite(b[2][1]))&&(a.m_=b,c&&(a.lineScale_=aa(ba(b[0][0]*b[1][1]-b[0][1]* +b[1][0]))))}function w(a){this.type_=a;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}function I(a,b){if(!a||1!=a.nodeType||"IMG"!=a.tagName)throw new A("TYPE_MISMATCH_ERR");if("complete"!=a.readyState)throw new A("INVALID_STATE_ERR");switch(b){case "repeat":case null:case "":this.repetition_="repeat";break;case "repeat-x":case "repeat-y":case "no-repeat":this.repetition_=b;break;default:throw new A("SYNTAX_ERR");}this.src_=a.src;this.width_=a.width;this.height_=a.height} +function A(a){this.code=this[a];this.message=a+": DOM Exception "+this.code}var x=Math,k=x.round,J=x.sin,K=x.cos,ba=x.abs,aa=x.sqrt,q=10,r=q/2;navigator.userAgent.match(/MSIE ([\d.]+)?/);var M=Array.prototype.slice;O(document);var U={init:function(a){a=a||document;a.createElement("canvas");a.attachEvent("onreadystatechange",W(this.init_,this,a))},init_:function(a){a=a.getElementsByTagName("canvas");for(var b=0;b<a.length;b++)this.initElement(a[b])},initElement:function(a){if(!a.getContext){a.getContext= +V;O(a.ownerDocument);a.innerHTML="";a.attachEvent("onpropertychange",X);a.attachEvent("onresize",Y);var b=a.attributes;b.width&&b.width.specified?a.style.width=b.width.nodeValue+"px":a.width=a.clientWidth;b.height&&b.height.specified?a.style.height=b.height.nodeValue+"px":a.height=a.clientHeight}return a}};U.init();for(var v=[],d=0;16>d;d++)for(var B=0;16>B;B++)v[16*d+B]=d.toString(16)+B.toString(16);var Z={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC", +bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000", +darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082", +ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA", +mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5", +peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"}, +H={},L={},$={butt:"flat",round:"round"},d=C.prototype;d.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null);this.element_.innerHTML=""};d.beginPath=function(){this.currentPath_=[]};d.moveTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.lineTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.bezierCurveTo= +function(a,b,c,g,e,f){e=s(this,e,f);a=s(this,a,b);c=s(this,c,g);R(this,a,c,e)};d.quadraticCurveTo=function(a,b,c,g){a=s(this,a,b);c=s(this,c,g);g={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)};R(this,g,{x:g.x+(c.x-this.currentX_)/3,y:g.y+(c.y-this.currentY_)/3},c)};d.arc=function(a,b,c,g,e,f){c*=q;var d=f?"at":"wa",k=a+K(g)*c-r,n=b+J(g)*c-r;g=a+K(e)*c-r;e=b+J(e)*c-r;k!=g||f||(k+=0.125);a=s(this,a,b);k=s(this,k,n);g=s(this,g,e);this.currentPath_.push({type:d, +x:a.x,y:a.y,radius:c,xStart:k.x,yStart:k.y,xEnd:g.x,yEnd:g.y})};d.rect=function(a,b,c,g){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath()};d.strokeRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath();this.stroke();this.currentPath_=e};d.fillRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+ +c,b+g);this.lineTo(a,b+g);this.closePath();this.fill();this.currentPath_=e};d.createLinearGradient=function(a,b,c,g){var e=new w("gradient");e.x0_=a;e.y0_=b;e.x1_=c;e.y1_=g;return e};d.createRadialGradient=function(a,b,c,g,e,f){var d=new w("gradientradial");d.x0_=a;d.y0_=b;d.r0_=c;d.x1_=g;d.y1_=e;d.r1_=f;return d};d.drawImage=function(a,b){var c,g,e,d,r,y,n,h;e=a.runtimeStyle.width;d=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var l=a.width,u=a.height;a.runtimeStyle.width= +e;a.runtimeStyle.height=d;if(3==arguments.length)c=arguments[1],g=arguments[2],r=y=0,n=e=l,h=d=u;else if(5==arguments.length)c=arguments[1],g=arguments[2],e=arguments[3],d=arguments[4],r=y=0,n=l,h=u;else if(9==arguments.length)r=arguments[1],y=arguments[2],n=arguments[3],h=arguments[4],c=arguments[5],g=arguments[6],e=arguments[7],d=arguments[8];else throw Error("Invalid number of arguments");var m=s(this,c,g),p=[];p.push(" <g_vml_:group",' coordsize="',10*q,",",10*q,'"',' coordorigin="0,0"',' style="width:', +10,"px;height:",10,"px;position:absolute;");if(1!=this.m_[0][0]||this.m_[0][1]||1!=this.m_[1][1]||this.m_[1][0]){var t=[];t.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",k(m.x/q),",","Dy=",k(m.y/q),"");var v=s(this,c+e,g),w=s(this,c,g+d);c=s(this,c+e,g+d);m.x=x.max(m.x,v.x,w.x,c.x);m.y=x.max(m.y,v.y,w.y,c.y);p.push("padding:0 ",k(m.x/q),"px ",k(m.y/q),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",t.join(""),", sizingmethod='clip');")}else p.push("top:", +k(m.y/q),"px;left:",k(m.x/q),"px;");p.push(' ">','<g_vml_:image src="',a.src,'"',' style="width:',q*e,"px;"," height:",q*d,'px"',' cropleft="',r/l,'"',' croptop="',y/u,'"',' cropright="',(l-r-n)/l,'"',' cropbottom="',(u-y-h)/u,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))};d.stroke=function(a){var b=[];b.push("<g_vml_:shape",' filled="',!!a,'"',' style="position:absolute;width:',10,"px;height:",10,'px;"',' coordorigin="0,0"',' coordsize="',10*q,",",10*q,'"', +' stroked="',!a,'"',' path="');for(var c={x:null,y:null},d={x:null,y:null},e=0;e<this.currentPath_.length;e++){var f=this.currentPath_[e];switch(f.type){case "moveTo":b.push(" m ",k(f.x),",",k(f.y));break;case "lineTo":b.push(" l ",k(f.x),",",k(f.y));break;case "close":b.push(" x ");f=null;break;case "bezierCurveTo":b.push(" c ",k(f.cp1x),",",k(f.cp1y),",",k(f.cp2x),",",k(f.cp2y),",",k(f.x),",",k(f.y));break;case "at":case "wa":b.push(" ",f.type," ",k(f.x-this.arcScaleX_*f.radius),",",k(f.y-this.arcScaleY_* +f.radius)," ",k(f.x+this.arcScaleX_*f.radius),",",k(f.y+this.arcScaleY_*f.radius)," ",k(f.xStart),",",k(f.yStart)," ",k(f.xEnd),",",k(f.yEnd))}if(f){if(null==c.x||f.x<c.x)c.x=f.x;if(null==d.x||f.x>d.x)d.x=f.x;if(null==c.y||f.y<c.y)c.y=f.y;if(null==d.y||f.y>d.y)d.y=f.y}}b.push(' ">');a?T(this,b,c,d):S(this,b);b.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",b.join(""))};d.fill=function(){this.stroke(!0)};d.closePath=function(){this.currentPath_.push({type:"close"})};d.save=function(){var a= +{};P(this,a);this.aStack_.push(a);this.mStack_.push(this.m_);this.m_=t(D(),this.m_)};d.restore=function(){this.aStack_.length&&(P(this.aStack_.pop(),this),this.m_=this.mStack_.pop())};d.translate=function(a,b){z(this,t([[1,0,0],[0,1,0],[a,b,1]],this.m_),!1)};d.rotate=function(a){var b=K(a);a=J(a);z(this,t([[b,a,0],[-a,b,0],[0,0,1]],this.m_),!1)};d.scale=function(a,b){this.arcScaleX_*=a;this.arcScaleY_*=b;z(this,t([[a,0,0],[0,b,0],[0,0,1]],this.m_),!0)};d.transform=function(a,b,c,d,e,f){z(this,t([[a, +b,0],[c,d,0],[e,f,1]],this.m_),!0)};d.setTransform=function(a,b,c,d,e,f){z(this,[[a,b,0],[c,d,0],[e,f,1]],!0)};d.drawText_=function(a,b,c,d,e){var f=this.m_;d=0;var r=1E3,t=0,n=[],h;h=this.font;if(L[h])h=L[h];else{var l=document.createElement("div").style;try{l.font=h}catch(u){}h=L[h]={style:l.fontStyle||"normal",variant:l.fontVariant||"normal",weight:l.fontWeight||"normal",size:l.fontSize||10,family:l.fontFamily||"sans-serif"}}var l=h,m=this.element_;h={};for(var p in l)h[p]=l[p];p=parseFloat(m.currentStyle.fontSize); +m=parseFloat(l.size);"number"==typeof l.size?h.size=l.size:-1!=l.size.indexOf("px")?h.size=m:-1!=l.size.indexOf("em")?h.size=p*m:-1!=l.size.indexOf("%")?h.size=p/100*m:-1!=l.size.indexOf("pt")?h.size=m/0.75:h.size=p;h.size*=0.981;p=h.style+" "+h.variant+" "+h.weight+" "+h.size+"px "+h.family;m=this.element_.currentStyle;l=this.textAlign.toLowerCase();switch(l){case "left":case "center":case "right":break;case "end":l="ltr"==m.direction?"right":"left";break;case "start":l="rtl"==m.direction?"right": +"left";break;default:l="left"}switch(this.textBaseline){case "hanging":case "top":t=h.size/1.75;break;case "middle":break;default:case null:case "alphabetic":case "ideographic":case "bottom":t=-h.size/2.25}switch(l){case "right":d=1E3;r=0.05;break;case "center":d=r=500}b=s(this,b+0,c+t);n.push('<g_vml_:line from="',-d,' 0" to="',r,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!e,'" stroked="',!!e,'" style="position:absolute;width:1px;height:1px;">');e?S(this,n):T(this,n,{x:-d,y:0}, +{x:r,y:h.size});e=f[0][0].toFixed(3)+","+f[1][0].toFixed(3)+","+f[0][1].toFixed(3)+","+f[1][1].toFixed(3)+",0,0";b=k(b.x/q)+","+k(b.y/q);n.push('<g_vml_:skew on="t" matrix="',e,'" ',' offset="',b,'" origin="',d,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',N(a),'" style="v-text-align:',l,";font:",N(p),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",n.join(""))};d.fillText=function(a,b,c,d){this.drawText_(a,b,c,d,!1)};d.strokeText=function(a, +b,c,d){this.drawText_(a,b,c,d,!0)};d.measureText=function(a){this.textMeasureEl_||(this.element_.insertAdjacentHTML("beforeEnd",'<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>'),this.textMeasureEl_=this.element_.lastChild);var b=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(b.createTextNode(a));return{width:this.textMeasureEl_.offsetWidth}};d.clip=function(){}; +d.arcTo=function(){};d.createPattern=function(a,b){return new I(a,b)};w.prototype.addColorStop=function(a,b){b=G(b);this.colors_.push({offset:a,color:b.color,alpha:b.alpha})};d=A.prototype=Error();d.INDEX_SIZE_ERR=1;d.DOMSTRING_SIZE_ERR=2;d.HIERARCHY_REQUEST_ERR=3;d.WRONG_DOCUMENT_ERR=4;d.INVALID_CHARACTER_ERR=5;d.NO_DATA_ALLOWED_ERR=6;d.NO_MODIFICATION_ALLOWED_ERR=7;d.NOT_FOUND_ERR=8;d.NOT_SUPPORTED_ERR=9;d.INUSE_ATTRIBUTE_ERR=10;d.INVALID_STATE_ERR=11;d.SYNTAX_ERR=12;d.INVALID_MODIFICATION_ERR= +13;d.NAMESPACE_ERR=14;d.INVALID_ACCESS_ERR=15;d.VALIDATION_ERR=16;d.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=U;CanvasRenderingContext2D=C;CanvasGradient=w;CanvasPattern=I;DOMException=A}(); +/*eslint-enable*/ +/*jshint ignore:end*/ \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js b/SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js new file mode 100644 index 00000000..69c7951e --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js @@ -0,0 +1,48 @@ +var React = require('react'); +var CanvasJS = require('./canvasjs.min'); +CanvasJS = CanvasJS.Chart ? CanvasJS : window.CanvasJS; + +class CanvasJSChart extends React.Component { + static _cjsContainerId = 0 + constructor(props) { + super(props); + this.options = props.options ? props.options : {}; + this.containerProps = props.containerProps ? props.containerProps : {width: "100%", position: "relative"}; + this.containerProps.height = props.containerProps && props.containerProps.height ? props.containerProps.height : this.options.height ? this.options.height + "px" : "400px"; + this.chartContainerId = "canvasjs-react-chart-container-" + CanvasJSChart._cjsContainerId++; + } + componentDidMount() { + //Create Chart and Render + this.chart = new CanvasJS.Chart(this.chartContainerId, this.options); + this.chart.render(); + + if(this.props.onRef) + this.props.onRef(this.chart); + } + shouldComponentUpdate(nextProps, nextState){ + //Check if Chart-options has changed and determine if component has to be updated + return !(nextProps.options === this.options); + } + componentDidUpdate() { + //Update Chart Options & Render + this.chart.options = this.props.options; + this.chart.render(); + } + componentWillUnmount() { + //Destroy chart and remove reference + this.chart.destroy(); + if(this.props.onRef) + this.props.onRef(undefined); + } + render() { + //return React.createElement('div', { id: this.chartContainerId, style: this.containerProps }); + return <div id = {this.chartContainerId} style = {this.containerProps}/> + } +} + +var CanvasJSReact = { + CanvasJSChart: CanvasJSChart, + CanvasJS: CanvasJS +}; + +export default CanvasJSReact; \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html new file mode 100644 index 00000000..ef650afe --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html @@ -0,0 +1,43 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function() { + +var chart = new CanvasJS.Chart("chartContainer", { + theme: "light2", // "light1", "light2", "dark1", "dark2" + exportEnabled: true, + animationEnabled: true, + title: { + text: "Desktop Browser Market Share in 2016" + }, + data: [{ + type: "pie", + startAngle: 25, + toolTipContent: "<b>{label}</b>: {y}%", + showInLegend: "true", + legendText: "{label}", + indexLabelFontSize: 16, + indexLabel: "{label} - {y}%", + dataPoints: [ + { y: 51.08, label: "Chrome" }, + { y: 27.34, label: "Internet Explorer" }, + { y: 10.62, label: "Firefox" }, + { y: 5.02, label: "Microsoft Edge" }, + { y: 4.07, label: "Safari" }, + { y: 1.22, label: "Opera" }, + { y: 0.44, label: "Others" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html new file mode 100644 index 00000000..57e08a55 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html @@ -0,0 +1,50 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> + +var chart = null; +var dataPoints = []; + +window.onload = function() { + +chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + theme: "light2", + title: { + text: "Daily Sales Data" + }, + axisY: { + title: "Units", + titleFontSize: 24 + }, + data: [{ + type: "column", + yValueFormatString: "#,### Units", + dataPoints: dataPoints + }] +}); + + +$.getJSON("https://canvasjs.com/data/gallery/javascript/daily-sales.json?callback=?", callback); + +} + +function callback(data) { + for (var i = 0; i < data.dps.length; i++) { + dataPoints.push({ + x: new Date(data.dps[i].date), + y: data.dps[i].units + }); + } + chart.render(); +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="https://canvasjs.com/assets/script/jquery-1.11.1.min.js"></script> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html new file mode 100644 index 00000000..3cb8789c --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html @@ -0,0 +1,51 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + theme: "light2", // "light1", "light2", "dark1", "dark2" + title: { + text: "GDP per Capita - 2016" + }, + subtitles: [{ + text: "In USD", + fontSize: 16 + }], + axisY: { + prefix: "$", + scaleBreaks: { + customBreaks: [{ + startValue: 10000, + endValue: 35000 + }] + } + }, + data: [{ + type: "column", + yValueFormatString: "$#,##0.00", + dataPoints: [ + { label: "USA", y: 57466.787 }, + { label: "Austraila", y: 49927.82 }, + { label: "UK", y: 39899.388 }, + { label: "UAE", y: 37622.207 }, + { label: "Brazil", y: 8649.948 }, + { label: "China", y: 8123.181 }, + { label: "Indonesia", y: 3570.295 }, + { label: "India", y: 1709.387 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html new file mode 100644 index 00000000..34e46259 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html @@ -0,0 +1,72 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Stock Price of BMW - August" + }, + axisX:{ + valueFormatString: "DD MMM", + crosshair: { + enabled: true, + snapToDataPoint: true + } + }, + axisY: { + title: "Closing Price (in USD)", + includeZero: false, + valueFormatString: "$##0.00", + crosshair: { + enabled: true, + snapToDataPoint: true, + labelFormatter: function(e) { + return "$" + CanvasJS.formatNumber(e.value, "##0.00"); + } + } + }, + data: [{ + type: "area", + xValueFormatString: "DD MMM", + yValueFormatString: "$##0.00", + dataPoints: [ + { x: new Date(2016, 07, 01), y: 76.727997 }, + { x: new Date(2016, 07, 02), y: 75.459999 }, + { x: new Date(2016, 07, 03), y: 76.011002 }, + { x: new Date(2016, 07, 04), y: 75.751999 }, + { x: new Date(2016, 07, 05), y: 77.500000 }, + { x: new Date(2016, 07, 08), y: 77.436996 }, + { x: new Date(2016, 07, 09), y: 79.650002 }, + { x: new Date(2016, 07, 10), y: 79.750999 }, + { x: new Date(2016, 07, 11), y: 80.169998 }, + { x: new Date(2016, 07, 12), y: 79.570000 }, + { x: new Date(2016, 07, 15), y: 80.699997 }, + { x: new Date(2016, 07, 16), y: 79.686996 }, + { x: new Date(2016, 07, 17), y: 78.996002 }, + { x: new Date(2016, 07, 18), y: 78.899002 }, + { x: new Date(2016, 07, 19), y: 77.127998 }, + { x: new Date(2016, 07, 22), y: 76.759003 }, + { x: new Date(2016, 07, 23), y: 77.480003 }, + { x: new Date(2016, 07, 24), y: 77.623001 }, + { x: new Date(2016, 07, 25), y: 76.408997 }, + { x: new Date(2016, 07, 26), y: 76.041000 }, + { x: new Date(2016, 07, 29), y: 76.778999 }, + { x: new Date(2016, 07, 30), y: 78.654999 }, + { x: new Date(2016, 07, 31), y: 77.667000 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html new file mode 100644 index 00000000..4f6e15c6 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html @@ -0,0 +1,233 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + //theme: "light2", // "light1", "light2", "dark1", "dark2" + animationEnabled: true, + title:{ + text: "Internet users" + }, + subtitles: [{ + text: "Try Clicking and Hovering over Legends!" + }], + axisX: { + lineColor: "black", + labelFontColor: "black" + }, + axisY2: { + gridThickness: 0, + title: "% of Population", + suffix: "%", + titleFontColor: "black", + labelFontColor: "black" + }, + legend: { + cursor: "pointer", + itemmouseover: function(e) { + e.dataSeries.lineThickness = e.chart.data[e.dataSeriesIndex].lineThickness * 2; + e.dataSeries.markerSize = e.chart.data[e.dataSeriesIndex].markerSize + 2; + e.chart.render(); + }, + itemmouseout: function(e) { + e.dataSeries.lineThickness = e.chart.data[e.dataSeriesIndex].lineThickness / 2; + e.dataSeries.markerSize = e.chart.data[e.dataSeriesIndex].markerSize - 2; + e.chart.render(); + }, + itemclick: function (e) { + if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else { + e.dataSeries.visible = true; + } + e.chart.render(); + } + }, + toolTip: { + shared: true + }, + data: [{ + type: "spline", + name: "Sweden", + markerSize: 5, + axisYType: "secondary", + xValueFormatString: "YYYY", + yValueFormatString: "#,##0.0'%'", + showInLegend: true, + dataPoints: [ + { x: new Date(2000, 00), y: 47.5 }, + { x: new Date(2005, 00), y: 84.8 }, + { x: new Date(2009, 00), y: 91 }, + { x: new Date(2010, 00), y: 90 }, + { x: new Date(2011, 00), y: 92.8 }, + { x: new Date(2012, 00), y: 93.2 }, + { x: new Date(2013, 00), y: 94.8 }, + { x: new Date(2014, 00), y: 92.5 } + ] + }, + { + type: "spline", + name: "UK", + markerSize: 5, + axisYType: "secondary", + xValueFormatString: "YYYY", + yValueFormatString: "#,##0.0'%'", + showInLegend: true, + dataPoints: [ + { x: new Date(2000, 00), y: 26.8 }, + { x: new Date(2005, 00), y: 70 }, + { x: new Date(2009, 00), y: 83.6 }, + { x: new Date(2010, 00), y: 85 }, + { x: new Date(2011, 00), y: 85.4 }, + { x: new Date(2012, 00), y: 87.5 }, + { x: new Date(2013, 00), y: 89.8 }, + { x: new Date(2014, 00), y: 91.6 } + ] + }, + { + type: "spline", + name: "UAE", + markerSize: 5, + axisYType: "secondary", + xValueFormatString: "YYYY", + yValueFormatString: "#,##0.0'%'", + showInLegend: true, + dataPoints: [ + { x: new Date(2000, 00), y: 23.6 }, + { x: new Date(2005, 00), y: 40 }, + { x: new Date(2009, 00), y: 64 }, + { x: new Date(2010, 00), y: 68 }, + { x: new Date(2011, 00), y: 78 }, + { x: new Date(2012, 00), y: 85 }, + { x: new Date(2013, 00), y: 86 }, + { x: new Date(2014, 00), y: 90.4 } + ] + }, + { + type: "spline", + showInLegend: true, + name: "USA", + markerSize: 5, + axisYType: "secondary", + yValueFormatString: "#,##0.0'%'", + xValueFormatString: "YYYY", + dataPoints: [ + { x: new Date(2000, 00), y: 43.1 }, + { x: new Date(2005, 00), y: 68 }, + { x: new Date(2009, 00), y: 71 }, + { x: new Date(2010, 00), y: 71.7 }, + { x: new Date(2011, 00), y: 69.7 }, + { x: new Date(2012, 00), y: 79.3 }, + { x: new Date(2013, 00), y: 84.2 }, + { x: new Date(2014, 00), y: 87 } + ] + }, + { + type: "spline", + name: "Switzerland", + markerSize: 5, + axisYType: "secondary", + xValueFormatString: "YYYY", + yValueFormatString: "#,##0.0'%'", + showInLegend: true, + dataPoints: [ + { x: new Date(2000, 00), y: 47.1 }, + { x: new Date(2005, 00), y: 70.1 }, + { x: new Date(2009, 00), y: 81.3 }, + { x: new Date(2010, 00), y: 83.9 }, + { x: new Date(2011, 00), y: 85.2 }, + { x: new Date(2012, 00), y: 85.2 }, + { x: new Date(2013, 00), y: 86.7 }, + { x: new Date(2014, 00), y: 87 } + ] + }, + { + type: "spline", + name: "Honk Kong", + markerSize: 5, + axisYType: "secondary", + xValueFormatString: "YYYY", + yValueFormatString: "#,##0.0'%'", + showInLegend: true, + dataPoints: [ + { x: new Date(2000, 00), y: 27.8 }, + { x: new Date(2005, 00), y: 56.9 }, + { x: new Date(2009, 00), y: 69.4 }, + { x: new Date(2010, 00), y: 72 }, + { x: new Date(2011, 00), y: 72.2 }, + { x: new Date(2012, 00), y: 72.9 }, + { x: new Date(2013, 00), y: 74.2 }, + { x: new Date(2014, 00), y: 74.6 } + ] + }, + { + type: "spline", + name: "Russia", + markerSize: 5, + axisYType: "secondary", + xValueFormatString: "YYYY", + yValueFormatString: "#,##0.0'%'", + showInLegend: true, + dataPoints: [ + { x: new Date(2000, 00), y: 2 }, + { x: new Date(2005, 00), y: 15.2 }, + { x: new Date(2009, 00), y: 29 }, + { x: new Date(2010, 00), y: 43 }, + { x: new Date(2011, 00), y: 49 }, + { x: new Date(2012, 00), y: 63.8 }, + { x: new Date(2013, 00), y: 61.4 }, + { x: new Date(2014, 00), y: 70.5 } + ] + }, + { + type: "spline", + name: "Ukraine", + markerSize: 5, + axisYType: "secondary", + xValueFormatString: "YYYY", + yValueFormatString: "#,##0.0'%'", + showInLegend: true, + dataPoints: [ + { x: new Date(2000, 00), y: .7 }, + { x: new Date(2005, 00), y: 3.7 }, + { x: new Date(2009, 00), y: 17.9 }, + { x: new Date(2010, 00), y: 23.3 }, + { x: new Date(2011, 00), y: 28.7 }, + { x: new Date(2012, 00), y: 35.3 }, + { x: new Date(2013, 00), y: 41.8 }, + { x: new Date(2014, 00), y: 43.4 } + ] + }, + { + type: "spline", + name: "India", + markerSize: 5, + axisYType: "secondary", + xValueFormatString: "YYYY", + yValueFormatString: "#,##0.0'%'", + showInLegend: true, + dataPoints: [ + { x: new Date(2000, 00), y: .5 }, + { x: new Date(2005, 00), y: 2.4 }, + { x: new Date(2009, 00), y: 5.1 }, + { x: new Date(2010, 00), y: 7.5 }, + { x: new Date(2011, 00), y: 10.1 }, + { x: new Date(2012, 00), y: 12.6 }, + { x: new Date(2013, 00), y: 15.1 }, + { x: new Date(2014, 00), y: 18 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html new file mode 100644 index 00000000..50b7d737 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html @@ -0,0 +1,108 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<style> +img{ + pointer-events: none; +} +</style> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + title:{ + text: "Weekly Weather Forecast" + }, + axisY: { + includeZero: false, + suffix: " °C", + maximum: 40, + gridThickness: 0 + }, + toolTip:{ + shared: true, + content: "{name} </br> <strong>Temperature: </strong> </br> Min: {y[0]} °C, Max: {y[1]} °C" + }, + data: [{ + type: "rangeSplineArea", + fillOpacity: 0.1, + color: "#91AAB1", + indexLabelFormatter: formatter, + dataPoints: [ + { label: "Monday", y: [15, 26], name: "rainy" }, + { label: "Tuesday", y: [15, 27], name: "rainy" }, + { label: "Wednesday", y: [13, 27], name: "sunny" }, + { label: "Thursday", y: [14, 27], name: "sunny" }, + { label: "Friday", y: [15, 26], name: "cloudy" }, + { label: "Saturday", y: [17, 26], name: "sunny" }, + { label: "Sunday", y: [16, 27], name: "rainy" } + ] + }] +}); +chart.render(); + +var images = []; + +addImages(chart); + +function addImages(chart) { + for(var i = 0; i < chart.data[0].dataPoints.length; i++){ + var dpsName = chart.data[0].dataPoints[i].name; + if(dpsName == "cloudy"){ + images.push($("<img>").attr("src", "https://canvasjs.com/wp-content/uploads/images/gallery/gallery-overview/cloudy.png")); + } else if(dpsName == "rainy"){ + images.push($("<img>").attr("src", "https://canvasjs.com/wp-content/uploads/images/gallery/gallery-overview/rainy.png")); + } else if(dpsName == "sunny"){ + images.push($("<img>").attr("src", "https://canvasjs.com/wp-content/uploads/images/gallery/gallery-overview/sunny.png")); + } + + images[i].attr("class", dpsName).appendTo($("#chartContainer>.canvasjs-chart-container")); + positionImage(images[i], i); + } +} + +function positionImage(image, index) { + var imageCenter = chart.axisX[0].convertValueToPixel(chart.data[0].dataPoints[index].x); + var imageTop = chart.axisY[0].convertValueToPixel(chart.axisY[0].maximum); + + image.width("40px") + .css({ "left": imageCenter - 20 + "px", + "position": "absolute","top":imageTop + "px", + "position": "absolute"}); +} + +$( window ).resize(function() { + var cloudyCounter = 0, rainyCounter = 0, sunnyCounter = 0; + var imageCenter = 0; + for(var i=0;i<chart.data[0].dataPoints.length;i++) { + imageCenter = chart.axisX[0].convertValueToPixel(chart.data[0].dataPoints[i].x) - 20; + if(chart.data[0].dataPoints[i].name == "cloudy") { + $(".cloudy").eq(cloudyCounter++).css({ "left": imageCenter}); + } else if(chart.data[0].dataPoints[i].name == "rainy") { + $(".rainy").eq(rainyCounter++).css({ "left": imageCenter}); + } else if(chart.data[0].dataPoints[i].name == "sunny") { + $(".sunny").eq(sunnyCounter++).css({ "left": imageCenter}); + } + } +}); + +function formatter(e) { + if(e.index === 0 && e.dataPoint.x === 0) { + return " Min " + e.dataPoint.y[e.index] + "°"; + } else if(e.index == 1 && e.dataPoint.x === 0) { + return " Max " + e.dataPoint.y[e.index] + "°"; + } else{ + return e.dataPoint.y[e.index] + "°"; + } +} + +} +</script> +</head> +<body> +<script src="https://canvasjs.com/assets/script/jquery-1.11.1.min.js"></script> +<script src="../../jquery.canvasjs.min.js"></script> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html new file mode 100644 index 00000000..cd5dd33e --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html @@ -0,0 +1,46 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + exportEnabled: true, + theme: "light1", // "light1", "light2", "dark1", "dark2" + title:{ + text: "Simple Column Chart with Index Labels" + }, + data: [{ + type: "column", //change type to bar, line, area, pie, etc + //indexLabel: "{y}", //Shows y value on all Data Points + indexLabelFontColor: "#5A5757", + indexLabelPlacement: "outside", + dataPoints: [ + { x: 10, y: 71 }, + { x: 20, y: 55 }, + { x: 30, y: 50 }, + { x: 40, y: 65 }, + { x: 50, y: 92, indexLabel: "Highest" }, + { x: 60, y: 68 }, + { x: 70, y: 38 }, + { x: 80, y: 71 }, + { x: 90, y: 54 }, + { x: 100, y: 60 }, + { x: 110, y: 36 }, + { x: 120, y: 49 }, + { x: 130, y: 21, indexLabel: "Lowest" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html new file mode 100644 index 00000000..0b69ea91 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html @@ -0,0 +1,46 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + exportEnabled: true, + theme: "light2", // "light1", "light2", "dark1", "dark2" + title:{ + text: "Depth of Ocean at Different Levels" + }, + axisY: { + title: "Depth (in meters)", + suffix: " m", + reversed: true + }, + axisX2: { + tickThickness: 0, + labelAngle: 0 + }, + data: [{ + type: "column", + axisXType: "secondary", + yValueFormatString: "#,##0 meters", + dataPoints: [ + { y: 300, label: "Continental Shelf" }, + { y: 3000, label: "Continental Slope" }, + { y: 4000, label: "Continental Rise" }, + { y: 6000, label: "Abyssal Plain", indexLabel: "Deepest" }, + { y: 4400, label: "Sea Mount" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html new file mode 100644 index 00000000..895c4e28 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html @@ -0,0 +1,128 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + zoomEnabled: true, + theme: "dark2", + title:{ + text: "Growth in Internet Users Globally" + }, + axisX:{ + title: "Year", + valueFormatString: "####", + interval: 2 + }, + axisY:{ + logarithmic: true, //change it to false + title: "Internet Users (Log)", + titleFontColor: "#6D78AD", + lineColor: "#6D78AD", + gridThickness: 0, + lineThickness: 1, + includeZero: false, + labelFormatter: addSymbols + }, + axisY2:{ + title: "Internet Users", + titleFontColor: "#51CDA0", + logarithmic: false, //change it to false + lineColor: "#51CDA0", + gridThickness: 0, + lineThickness: 1, + labelFormatter: addSymbols + }, + legend:{ + verticalAlign: "top", + fontSize: 16, + dockInsidePlotArea: true + }, + data: [{ + type: "line", + xValueFormatString: "####", + showInLegend: true, + name: "Log Scale", + dataPoints: [ + { x: 1994, y: 25437639 }, + { x: 1995, y: 44866595 }, + { x: 1996, y: 77583866 }, + { x: 1997, y: 120992212 }, + { x: 1998, y: 188507628 }, + { x: 1999, y: 281537652 }, + { x: 2000, y: 414794957 }, + { x: 2001, y: 502292245 }, + { x: 2002, y: 665065014 }, + { x: 2003, y: 781435983 }, + { x: 2004, y: 913327771 }, + { x: 2005, y: 1030101289 }, + { x: 2006, y: 1162916818 }, + { x: 2007, y: 1373226988 }, + { x: 2008, y: 1575067520 }, + { x: 2009, y: 1766403814 }, + { x: 2010, y: 2023202974 }, + { x: 2011, y: 2231957359 }, + { x: 2012, y: 2494736248 }, + { x: 2013, y: 2728428107 }, + { x: 2014, y: 2956385569 }, + { x: 2015, y: 3185996155 }, + { x: 2016, y: 3424971237 } + ] + }, + { + type: "line", + xValueFormatString: "####", + axisYType: "secondary", + showInLegend: true, + name: "Linear Scale", + dataPoints: [ + { x: 1994, y: 25437639 }, + { x: 1995, y: 44866595 }, + { x: 1996, y: 77583866 }, + { x: 1997, y: 120992212 }, + { x: 1998, y: 188507628 }, + { x: 1999, y: 281537652 }, + { x: 2000, y: 414794957 }, + { x: 2001, y: 502292245 }, + { x: 2002, y: 665065014 }, + { x: 2003, y: 781435983 }, + { x: 2004, y: 913327771 }, + { x: 2005, y: 1030101289 }, + { x: 2006, y: 1162916818 }, + { x: 2007, y: 1373226988 }, + { x: 2008, y: 1575067520 }, + { x: 2009, y: 1766403814 }, + { x: 2010, y: 2023202974 }, + { x: 2011, y: 2231957359 }, + { x: 2012, y: 2494736248 }, + { x: 2013, y: 2728428107 }, + { x: 2014, y: 2956385569 }, + { x: 2015, y: 3185996155 }, + { x: 2016, y: 3424971237 } + ] + }] +}); +chart.render(); + +function addSymbols(e){ + var suffixes = ["", "K", "M", "B"]; + + var order = Math.max(Math.floor(Math.log(e.value) / Math.log(1000)), 0); + if(order > suffixes.length - 1) + order = suffixes.length - 1; + + var suffix = suffixes[order]; + return CanvasJS.formatNumber(e.value / Math.pow(1000, order)) + suffix; +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html new file mode 100644 index 00000000..4e292db0 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html @@ -0,0 +1,87 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + exportEnabled: true, + animationEnabled: true, + title:{ + text: "Car Parts Sold in Different States" + }, + subtitles: [{ + text: "Click Legend to Hide or Unhide Data Series" + }], + axisX: { + title: "States" + }, + axisY: { + title: "Oil Filter - Units", + titleFontColor: "#4F81BC", + lineColor: "#4F81BC", + labelFontColor: "#4F81BC", + tickColor: "#4F81BC" + }, + axisY2: { + title: "Clutch - Units", + titleFontColor: "#C0504E", + lineColor: "#C0504E", + labelFontColor: "#C0504E", + tickColor: "#C0504E" + }, + toolTip: { + shared: true + }, + legend: { + cursor: "pointer", + itemclick: toggleDataSeries + }, + data: [{ + type: "column", + name: "Oil Filter", + showInLegend: true, + yValueFormatString: "#,##0.# Units", + dataPoints: [ + { label: "New Jersey", y: 19034.5 }, + { label: "Texas", y: 20015 }, + { label: "Oregon", y: 25342 }, + { label: "Montana", y: 20088 }, + { label: "Massachusetts", y: 28234 } + ] + }, + { + type: "column", + name: "Clutch", + axisYType: "secondary", + showInLegend: true, + yValueFormatString: "#,##0.# Units", + dataPoints: [ + { label: "New Jersey", y: 210.5 }, + { label: "Texas", y: 135 }, + { label: "Oregon", y: 425 }, + { label: "Montana", y: 130 }, + { label: "Massachusetts", y: 528 } + ] + }] +}); +chart.render(); + +function toggleDataSeries(e) { + if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else { + e.dataSeries.visible = true; + } + e.chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html new file mode 100644 index 00000000..79a3d417 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html @@ -0,0 +1,40 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + theme: "light2", // "light1", "light2", "dark1", "dark2" + animationEnabled: true, + zoomEnabled: true, + title: { + text: "Try Zooming and Panning" + }, + data: [{ + type: "area", + dataPoints: [] + }] +}); + +addDataPoints(1000); +chart.render(); + +function addDataPoints(noOfDps) { + var xVal = chart.options.data[0].dataPoints.length + 1, yVal = 100; + for(var i = 0; i < noOfDps; i++) { + yVal = yVal + Math.round(5 + Math.random() *(-5-5)); + chart.options.data[0].dataPoints.push({x: xVal,y: yVal}); + xVal++; + } +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html new file mode 100644 index 00000000..a42de04d --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html @@ -0,0 +1,57 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var dps = []; // dataPoints +var chart = new CanvasJS.Chart("chartContainer", { + title :{ + text: "Dynamic Data" + }, + axisY: { + includeZero: false + }, + data: [{ + type: "line", + dataPoints: dps + }] +}); + +var xVal = 0; +var yVal = 100; +var updateInterval = 1000; +var dataLength = 20; // number of dataPoints visible at any point + +var updateChart = function (count) { + + count = count || 1; + + for (var j = 0; j < count; j++) { + yVal = yVal + Math.round(5 + Math.random() *(-5-5)); + dps.push({ + x: xVal, + y: yVal + }); + xVal++; + } + + if (dps.length > dataLength) { + dps.shift(); + } + + chart.render(); +}; + +updateChart(dataLength); +setInterval(function(){updateChart()}, updateInterval); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html new file mode 100644 index 00000000..17505925 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html @@ -0,0 +1,115 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function() { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title: { + text: "Try Dragging Any Column to Resize" + }, + axisX:{ + minimum: 5, + maximum: 95 + }, + data: [{ + type: "column", + dataPoints: [ + { x: 10, y: 71 }, + { x: 20, y: 55 }, + { x: 30, y: 50 }, + { x: 40, y: 65 }, + { x: 50, y: 95 }, + { x: 60, y: 68 }, + { x: 70, y: 28 }, + { x: 80, y: 34 }, + { x: 90, y: 14 } + ] + }] +}); +chart.render(); + +var xSnapDistance = chart.axisX[0].convertPixelToValue(chart.get("dataPointWidth")) / 2; +var ySnapDistance = 3; + +var xValue, yValue; + +var mouseDown = false; +var selected = null; +var changeCursor = false; + +var timerId = null; + +function getPosition(e) { + var parentOffset = $("#chartContainer > .canvasjs-chart-container").offset(); + var relX = e.pageX - parentOffset.left; + var relY = e.pageY - parentOffset.top; + xValue = Math.round(chart.axisX[0].convertPixelToValue(relX)); + yValue = Math.round(chart.axisY[0].convertPixelToValue(relY)); +} + +function searchDataPoint() { + var dps = chart.data[0].dataPoints; + for(var i = 0; i < dps.length; i++ ) { + if( (xValue >= dps[i].x - xSnapDistance && xValue <= dps[i].x + xSnapDistance) && (yValue >= dps[i].y - ySnapDistance && yValue <= dps[i].y + ySnapDistance) ) + { + if(mouseDown) { + selected = i; + break; + } else { + changeCursor = true; + break; + } + } else { + selected = null; + changeCursor = false; + } + } +} + +jQuery("#chartContainer > .canvasjs-chart-container").on({ + mousedown: function(e) { + mouseDown = true; + getPosition(e); + searchDataPoint(); + }, + mousemove: function(e) { + getPosition(e); + if(mouseDown) { + clearTimeout(timerId); + timerId = setTimeout(function(){ + if(selected != null) { + chart.data[0].dataPoints[selected].y = yValue; + chart.render(); + } + }, 0); + } + else { + searchDataPoint(); + if(changeCursor) { + chart.data[0].set("cursor", "n-resize"); + } else { + chart.data[0].set("cursor", "default"); + } + } + }, + mouseup: function(e) { + if(selected != null) { + chart.data[0].dataPoints[selected].y = yValue; + chart.render(); + mouseDown = false; + } + } +}); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html new file mode 100644 index 00000000..f156e2f8 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html @@ -0,0 +1,94 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Daily High Temperature at Different Beaches" + }, + axisX: { + valueFormatString: "DD MMM,YY" + }, + axisY: { + title: "Temperature (in °C)", + includeZero: false, + suffix: " °C" + }, + legend:{ + cursor: "pointer", + fontSize: 16, + itemclick: toggleDataSeries + }, + toolTip:{ + shared: true + }, + data: [{ + name: "Myrtle Beach", + type: "spline", + yValueFormatString: "#0.## °C", + showInLegend: true, + dataPoints: [ + { x: new Date(2017,6,24), y: 31 }, + { x: new Date(2017,6,25), y: 31 }, + { x: new Date(2017,6,26), y: 29 }, + { x: new Date(2017,6,27), y: 29 }, + { x: new Date(2017,6,28), y: 31 }, + { x: new Date(2017,6,29), y: 30 }, + { x: new Date(2017,6,30), y: 29 } + ] + }, + { + name: "Martha Vineyard", + type: "spline", + yValueFormatString: "#0.## °C", + showInLegend: true, + dataPoints: [ + { x: new Date(2017,6,24), y: 20 }, + { x: new Date(2017,6,25), y: 20 }, + { x: new Date(2017,6,26), y: 25 }, + { x: new Date(2017,6,27), y: 25 }, + { x: new Date(2017,6,28), y: 25 }, + { x: new Date(2017,6,29), y: 25 }, + { x: new Date(2017,6,30), y: 25 } + ] + }, + { + name: "Nantucket", + type: "spline", + yValueFormatString: "#0.## °C", + showInLegend: true, + dataPoints: [ + { x: new Date(2017,6,24), y: 22 }, + { x: new Date(2017,6,25), y: 19 }, + { x: new Date(2017,6,26), y: 23 }, + { x: new Date(2017,6,27), y: 24 }, + { x: new Date(2017,6,28), y: 24 }, + { x: new Date(2017,6,29), y: 23 }, + { x: new Date(2017,6,30), y: 23 } + ] + }] +}); +chart.render(); + +function toggleDataSeries(e){ + if (typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } + else{ + e.dataSeries.visible = true; + } + chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html new file mode 100644 index 00000000..2b0a5ed9 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function() { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title: { + text: "Hourly Average CPU Utilization" + }, + axisX: { + title: "Time" + }, + axisY: { + title: "Percentage", + suffix: "%" + }, + data: [{ + type: "line", + name: "CPU Utilization", + connectNullData: true, + //nullDataLineDashType: "solid", + xValueType: "dateTime", + xValueFormatString: "DD MMM hh:mm TT", + yValueFormatString: "#,##0.##'%'", + dataPoints: [ + { x: 1501048673000, y: 35.939 }, + { x: 1501052273000, y: 40.896 }, + { x: 1501055873000, y: 56.625 }, + { x: 1501059473000, y: 26.003 }, + { x: 1501063073000, y: 20.376 }, + { x: 1501066673000, y: 19.774 }, + { x: 1501070273000, y: 23.508 }, + { x: 1501073873000, y: 18.577 }, + { x: 1501077473000, y: 15.918 }, + { x: 1501081073000, y: null }, // Null Data + { x: 1501084673000, y: 10.314 }, + { x: 1501088273000, y: 10.574 }, + { x: 1501091873000, y: 14.422 }, + { x: 1501095473000, y: 18.576 }, + { x: 1501099073000, y: 22.342 }, + { x: 1501102673000, y: 22.836 }, + { x: 1501106273000, y: 23.220 }, + { x: 1501109873000, y: 23.594 }, + { x: 1501113473000, y: 24.596 }, + { x: 1501117073000, y: 31.947 }, + { x: 1501120673000, y: 31.142 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html new file mode 100644 index 00000000..7be550ab --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html @@ -0,0 +1,43 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var dataPoints = []; +var y = 1000; +var limit = 50000; + +for ( var i = 0; i < limit; i++ ) { + y += Math.round( 10 + Math.random() * (-10 -10)); + dataPoints.push({ y: y }); +} + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + zoomEnabled: true, + title:{ + text: "Performance Demo with 50,000 Data Points" + }, + subtitles:[{ + text: "Try Zooming and Panning" + }], + data: [{ + type: "line", + dataPoints: dataPoints + }], + axisY:{ + includeZero: false + } +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html new file mode 100644 index 00000000..b5b8e010 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html @@ -0,0 +1,102 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + theme: "light2", + title:{ + text: "Site Traffic" + }, + axisX:{ + valueFormatString: "DD MMM", + crosshair: { + enabled: true, + snapToDataPoint: true + } + }, + axisY: { + title: "Number of Visits", + crosshair: { + enabled: true + } + }, + toolTip:{ + shared:true + }, + legend:{ + cursor:"pointer", + verticalAlign: "bottom", + horizontalAlign: "left", + dockInsidePlotArea: true, + itemclick: toogleDataSeries + }, + data: [{ + type: "line", + showInLegend: true, + name: "Total Visit", + markerType: "square", + xValueFormatString: "DD MMM, YYYY", + color: "#F08080", + dataPoints: [ + { x: new Date(2017, 0, 3), y: 650 }, + { x: new Date(2017, 0, 4), y: 700 }, + { x: new Date(2017, 0, 5), y: 710 }, + { x: new Date(2017, 0, 6), y: 658 }, + { x: new Date(2017, 0, 7), y: 734 }, + { x: new Date(2017, 0, 8), y: 963 }, + { x: new Date(2017, 0, 9), y: 847 }, + { x: new Date(2017, 0, 10), y: 853 }, + { x: new Date(2017, 0, 11), y: 869 }, + { x: new Date(2017, 0, 12), y: 943 }, + { x: new Date(2017, 0, 13), y: 970 }, + { x: new Date(2017, 0, 14), y: 869 }, + { x: new Date(2017, 0, 15), y: 890 }, + { x: new Date(2017, 0, 16), y: 930 } + ] + }, + { + type: "line", + showInLegend: true, + name: "Unique Visit", + lineDashType: "dash", + dataPoints: [ + { x: new Date(2017, 0, 3), y: 510 }, + { x: new Date(2017, 0, 4), y: 560 }, + { x: new Date(2017, 0, 5), y: 540 }, + { x: new Date(2017, 0, 6), y: 558 }, + { x: new Date(2017, 0, 7), y: 544 }, + { x: new Date(2017, 0, 8), y: 693 }, + { x: new Date(2017, 0, 9), y: 657 }, + { x: new Date(2017, 0, 10), y: 663 }, + { x: new Date(2017, 0, 11), y: 639 }, + { x: new Date(2017, 0, 12), y: 673 }, + { x: new Date(2017, 0, 13), y: 660 }, + { x: new Date(2017, 0, 14), y: 562 }, + { x: new Date(2017, 0, 15), y: 643 }, + { x: new Date(2017, 0, 16), y: 570 } + ] + }] +}); +chart.render(); + +function toogleDataSeries(e){ + if (typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else{ + e.dataSeries.visible = true; + } + chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html new file mode 100644 index 00000000..9bfb56e5 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html @@ -0,0 +1,56 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var dps = []; +var chart = new CanvasJS.Chart("chartContainer", { + exportEnabled: true, + title :{ + text: "Dynamic Spline Chart" + }, + axisY: { + includeZero: false + }, + data: [{ + type: "spline", + markerSize: 0, + dataPoints: dps + }] +}); + +var xVal = 0; +var yVal = 100; +var updateInterval = 1000; +var dataLength = 50; // number of dataPoints visible at any point + +var updateChart = function (count) { + count = count || 1; + // count is number of times loop runs to generate random dataPoints. + for (var j = 0; j < count; j++) { + yVal = yVal + Math.round(5 + Math.random() *(-5-5)); + dps.push({ + x: xVal, + y: yVal + }); + xVal++; + } + if (dps.length > dataLength) { + dps.shift(); + } + chart.render(); +}; + +updateChart(dataLength); +setInterval(function(){ updateChart() }, updateInterval); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html new file mode 100644 index 00000000..9a6a355b --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html @@ -0,0 +1,71 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Website Traffic" + }, + axisX:{ + valueFormatString: "DD MMM" + }, + axisY: { + title: "Number of Visitors", + includeZero: false, + scaleBreaks: { + autoCalculate: true + } + }, + data: [{ + type: "line", + xValueFormatString: "DD MMM", + color: "#F08080", + dataPoints: [ + { x: new Date(2017, 0, 1), y: 610 }, + { x: new Date(2017, 0, 2), y: 680 }, + { x: new Date(2017, 0, 3), y: 690 }, + { x: new Date(2017, 0, 4), y: 700 }, + { x: new Date(2017, 0, 5), y: 710 }, + { x: new Date(2017, 0, 6), y: 658 }, + { x: new Date(2017, 0, 7), y: 734 }, + { x: new Date(2017, 0, 8), y: 963 }, + { x: new Date(2017, 0, 9), y: 847 }, + { x: new Date(2017, 0, 10), y: 853 }, + { x: new Date(2017, 0, 11), y: 869 }, + { x: new Date(2017, 0, 12), y: 943 }, + { x: new Date(2017, 0, 13), y: 970 }, + { x: new Date(2017, 0, 14), y: 869 }, + { x: new Date(2017, 0, 15), y: 890 }, + { x: new Date(2017, 0, 16), y: 930 }, + { x: new Date(2017, 0, 17), y: 1850 }, + { x: new Date(2017, 0, 18), y: 1905 }, + { x: new Date(2017, 0, 19), y: 1980 }, + { x: new Date(2017, 0, 20), y: 1858 }, + { x: new Date(2017, 0, 21), y: 1034 }, + { x: new Date(2017, 0, 22), y: 963 }, + { x: new Date(2017, 0, 23), y: 847 }, + { x: new Date(2017, 0, 24), y: 853 }, + { x: new Date(2017, 0, 25), y: 869 }, + { x: new Date(2017, 0, 26), y: 943 }, + { x: new Date(2017, 0, 27), y: 970 }, + { x: new Date(2017, 0, 28), y: 869 }, + { x: new Date(2017, 0, 29), y: 890 }, + { x: new Date(2017, 0, 30), y: 930 }, + { x: new Date(2017, 0, 31), y: 750 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html new file mode 100644 index 00000000..8b620e23 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html @@ -0,0 +1,53 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + theme: "light2", // "light1", "light2", "dark1", "dark2" + animationEnabled: true, + title:{ + text: "Share Value - 2016" + }, + axisX: { + interval: 1, + intervalType: "month", + valueFormatString: "MMM" + }, + axisY:{ + title: "Price (in USD)", + valueFormatString: "$#0" + }, + data: [{ + type: "line", + markerSize: 12, + xValueFormatString: "MMM, YYYY", + yValueFormatString: "$###.#", + dataPoints: [ + { x: new Date(2016, 00, 1), y: 61, indexLabel: "gain", markerType: "triangle", markerColor: "#6B8E23" }, + { x: new Date(2016, 01, 1), y: 71, indexLabel: "gain", markerType: "triangle", markerColor: "#6B8E23" }, + { x: new Date(2016, 02, 1) , y: 55, indexLabel: "loss", markerType: "cross", markerColor: "tomato" }, + { x: new Date(2016, 03, 1) , y: 50, indexLabel: "loss", markerType: "cross", markerColor: "tomato" }, + { x: new Date(2016, 04, 1) , y: 65, indexLabel: "gain", markerType: "triangle", markerColor: "#6B8E23" }, + { x: new Date(2016, 05, 1) , y: 85, indexLabel: "gain", markerType: "triangle", markerColor: "#6B8E23" }, + { x: new Date(2016, 06, 1) , y: 68, indexLabel: "loss", markerType: "cross", markerColor: "tomato" }, + { x: new Date(2016, 07, 1) , y: 28, indexLabel: "loss", markerType: "cross", markerColor: "tomato" }, + { x: new Date(2016, 08, 1) , y: 34, indexLabel: "gain", markerType: "triangle", markerColor: "#6B8E23" }, + { x: new Date(2016, 09, 1) , y: 24, indexLabel: "loss", markerType: "cross", markerColor: "tomato" }, + { x: new Date(2016, 10, 1) , y: 44, indexLabel: "gain", markerType: "triangle", markerColor: "#6B8E23" }, + { x: new Date(2016, 11, 1) , y: 34, indexLabel: "loss", markerType: "cross", markerColor: "tomato" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html new file mode 100644 index 00000000..4a3430ac --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html @@ -0,0 +1,107 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var step = Math.pow(10, .05); +var chart = new CanvasJS.Chart("chartContainer", { + zoomEnabled: true, + zoomType: "xy", + exportEnabled: true, + title: { + text: "Frequency Response of Low Pass Filters" + }, + subtitles:[{ + text: "X Axis scale is Logarithmic", + fontSize: 14 + }], + axisX: { + logarithmic: true, + title: "Frequency \u03C9(rad/s)", + minimum: .01, + suffix: "\u03C9\u2099", + stripLines: [{ + value: 1, + label: "Cutoff Frequency", + labelFontColor: "#808080", + labelAlign: "near" + }] + }, + axisY: { + title: "Type 1 Magnitude (db)", + titleFontColor: "#4F81BC", + labelFontColor: "#4F81BC" + }, + axisY2: { + title: "Type 2 Magnitude (db)", + titleFontColor: "#C0504E", + labelFontColor: "#C0504E" + }, + toolTip: { + shared: true + }, + legend:{ + cursor:"pointer", + itemclick: toogleDataSeries + }, + data: [{ + type: "line", + name: "Type 1 Filter", + showInLegend: true, + yValueFormatString: "#,##0.00 db", + xValueFormatString: "\u03C9 = #,##0.00#\u03C9\u2099", + dataPoints: type1DataPoints(step) + }, + { + type: "line", + name: "Type 2 Filter", + color: "#C0504E", + showInLegend: true, + axisYType: "secondary", + yValueFormatString: "#,##0.00 db", + xValueFormatString: "\u03C9 = #,##0.00#\u03C9\u2099", + dataPoints: type2DataPoints(.02, step) + }] +}); + +chart.render(); + +function type1DataPoints(step){ + var dataPoints = []; + var h; + for(var w = .01; w < 100 ; w *= step){ + h = -5 * Math.log(w*w + 1); + dataPoints.push({x: w, y: h}); + } + return dataPoints +} + +function type2DataPoints(e, step){ + var dataPoints = []; + var h; + for(var w = .01; w < 100 ; w *= step){ + h = -5 * Math.log(Math.pow((1 - w*w), 2) + 4 *e*e*w*w); + dataPoints.push({x: w, y: h}); + } + return dataPoints; +} + +function toogleDataSeries(e){ + if (typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else{ + e.dataSeries.visible = true; + } + chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html new file mode 100644 index 00000000..e4626cc0 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html @@ -0,0 +1,125 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + var chart = new CanvasJS.Chart("chartContainer", { + title:{ + text: "Weekly Revenue Analysis for First Quarter" + }, + axisY:[{ + title: "Order", + lineColor: "#C24642", + tickColor: "#C24642", + labelFontColor: "#C24642", + titleFontColor: "#C24642", + suffix: "k" + }, + { + title: "Footfall", + lineColor: "#369EAD", + tickColor: "#369EAD", + labelFontColor: "#369EAD", + titleFontColor: "#369EAD", + suffix: "k" + }], + axisY2: { + title: "Revenue", + lineColor: "#7F6084", + tickColor: "#7F6084", + labelFontColor: "#7F6084", + titleFontColor: "#7F6084", + prefix: "$", + suffix: "k" + }, + toolTip: { + shared: true + }, + legend: { + cursor: "pointer", + itemclick: toggleDataSeries + }, + data: [{ + type: "line", + name: "Footfall", + color: "#369EAD", + showInLegend: true, + axisYIndex: 1, + dataPoints: [ + { x: new Date(2017, 00, 7), y: 85.4 }, + { x: new Date(2017, 00, 14), y: 92.7 }, + { x: new Date(2017, 00, 21), y: 64.9 }, + { x: new Date(2017, 00, 28), y: 58.0 }, + { x: new Date(2017, 01, 4), y: 63.4 }, + { x: new Date(2017, 01, 11), y: 69.9 }, + { x: new Date(2017, 01, 18), y: 88.9 }, + { x: new Date(2017, 01, 25), y: 66.3 }, + { x: new Date(2017, 02, 4), y: 82.7 }, + { x: new Date(2017, 02, 11), y: 60.2 }, + { x: new Date(2017, 02, 18), y: 87.3 }, + { x: new Date(2017, 02, 25), y: 98.5 } + ] + }, + { + type: "line", + name: "Order", + color: "#C24642", + axisYIndex: 0, + showInLegend: true, + dataPoints: [ + { x: new Date(2017, 00, 7), y: 32.3 }, + { x: new Date(2017, 00, 14), y: 33.9 }, + { x: new Date(2017, 00, 21), y: 26.0 }, + { x: new Date(2017, 00, 28), y: 15.8 }, + { x: new Date(2017, 01, 4), y: 18.6 }, + { x: new Date(2017, 01, 11), y: 34.6 }, + { x: new Date(2017, 01, 18), y: 37.7 }, + { x: new Date(2017, 01, 25), y: 24.7 }, + { x: new Date(2017, 02, 4), y: 35.9 }, + { x: new Date(2017, 02, 11), y: 12.8 }, + { x: new Date(2017, 02, 18), y: 38.1 }, + { x: new Date(2017, 02, 25), y: 42.4 } + ] + }, + { + type: "line", + name: "Revenue", + color: "#7F6084", + axisYType: "secondary", + showInLegend: true, + dataPoints: [ + { x: new Date(2017, 00, 7), y: 42.5 }, + { x: new Date(2017, 00, 14), y: 44.3 }, + { x: new Date(2017, 00, 21), y: 28.7 }, + { x: new Date(2017, 00, 28), y: 22.5 }, + { x: new Date(2017, 01, 4), y: 25.6 }, + { x: new Date(2017, 01, 11), y: 45.7 }, + { x: new Date(2017, 01, 18), y: 54.6 }, + { x: new Date(2017, 01, 25), y: 32.0 }, + { x: new Date(2017, 02, 4), y: 43.9 }, + { x: new Date(2017, 02, 11), y: 26.4 }, + { x: new Date(2017, 02, 18), y: 40.3 }, + { x: new Date(2017, 02, 25), y: 54.2 } + ] + }] +}); +chart.render(); + +function toggleDataSeries(e) { + if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else { + e.dataSeries.visible = true; + } + e.chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html new file mode 100644 index 00000000..24a15c69 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html @@ -0,0 +1,46 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + zoomEnabled: true, + title:{ + text: "Try Zooming and Panning" + }, + axisY :{ + includeZero:false + }, + data: data // random generator below +}); +chart.render(); + +} + +var limit = 1000; + +var y = 0; +var data = []; +var dataSeries = { type: "line" }; +var dataPoints = []; +for (var i = 0; i < limit; i += 1) { + y += (Math.random() * 10 - 5); + dataPoints.push({ + x: i - limit / 2, + y: y + }); +} +dataSeries.dataPoints = dataPoints; +data.push(dataSeries); + +</script> +<script src="../../canvasjs.min.js"></script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"> +</div> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html new file mode 100644 index 00000000..d21bd730 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html @@ -0,0 +1,44 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + theme: "light2", + title:{ + text: "Simple Line Chart" + }, + axisY:{ + includeZero: false + }, + data: [{ + type: "line", + dataPoints: [ + { y: 450 }, + { y: 414}, + { y: 520, indexLabel: "highest",markerColor: "red", markerType: "triangle" }, + { y: 460 }, + { y: 450 }, + { y: 500 }, + { y: 480 }, + { y: 480 }, + { y: 410 , indexLabel: "lowest",markerColor: "DarkSlateGrey", markerType: "cross" }, + { y: 500 }, + { y: 480 }, + { y: 510 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html new file mode 100644 index 00000000..c25f9ae8 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html @@ -0,0 +1,257 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + title: { + text: "House Median Price" + }, + axisX: { + valueFormatString: "MMM YYYY" + }, + axisY2: { + title: "Median List Price", + prefix: "$", + suffix: "K" + }, + toolTip: { + shared: true + }, + legend: { + cursor: "pointer", + verticalAlign: "top", + horizontalAlign: "center", + dockInsidePlotArea: true, + itemclick: toogleDataSeries + }, + data: [{ + type:"line", + axisYType: "secondary", + name: "San Fransisco", + showInLegend: true, + markerSize: 0, + yValueFormatString: "$#,###k", + dataPoints: [ + { x: new Date(2014, 00, 01), y: 850 }, + { x: new Date(2014, 01, 01), y: 889 }, + { x: new Date(2014, 02, 01), y: 890 }, + { x: new Date(2014, 03, 01), y: 899 }, + { x: new Date(2014, 04, 01), y: 903 }, + { x: new Date(2014, 05, 01), y: 925 }, + { x: new Date(2014, 06, 01), y: 899 }, + { x: new Date(2014, 07, 01), y: 875 }, + { x: new Date(2014, 08, 01), y: 927 }, + { x: new Date(2014, 09, 01), y: 949 }, + { x: new Date(2014, 10, 01), y: 946 }, + { x: new Date(2014, 11, 01), y: 927 }, + { x: new Date(2015, 00, 01), y: 950 }, + { x: new Date(2015, 01, 01), y: 998 }, + { x: new Date(2015, 02, 01), y: 998 }, + { x: new Date(2015, 03, 01), y: 1050 }, + { x: new Date(2015, 04, 01), y: 1050 }, + { x: new Date(2015, 05, 01), y: 999 }, + { x: new Date(2015, 06, 01), y: 998 }, + { x: new Date(2015, 07, 01), y: 998 }, + { x: new Date(2015, 08, 01), y: 1050 }, + { x: new Date(2015, 09, 01), y: 1070 }, + { x: new Date(2015, 10, 01), y: 1050 }, + { x: new Date(2015, 11, 01), y: 1050 }, + { x: new Date(2016, 00, 01), y: 995 }, + { x: new Date(2016, 01, 01), y: 1090 }, + { x: new Date(2016, 02, 01), y: 1100 }, + { x: new Date(2016, 03, 01), y: 1150 }, + { x: new Date(2016, 04, 01), y: 1150 }, + { x: new Date(2016, 05, 01), y: 1150 }, + { x: new Date(2016, 06, 01), y: 1100 }, + { x: new Date(2016, 07, 01), y: 1100 }, + { x: new Date(2016, 08, 01), y: 1150 }, + { x: new Date(2016, 09, 01), y: 1170 }, + { x: new Date(2016, 10, 01), y: 1150 }, + { x: new Date(2016, 11, 01), y: 1150 }, + { x: new Date(2017, 00, 01), y: 1150 }, + { x: new Date(2017, 01, 01), y: 1200 }, + { x: new Date(2017, 02, 01), y: 1200 }, + { x: new Date(2017, 03, 01), y: 1200 }, + { x: new Date(2017, 04, 01), y: 1190 }, + { x: new Date(2017, 05, 01), y: 1170 } + ] + }, + { + type: "line", + axisYType: "secondary", + name: "Manhattan", + showInLegend: true, + markerSize: 0, + yValueFormatString: "$#,###k", + dataPoints: [ + { x: new Date(2014, 00, 01), y: 1200 }, + { x: new Date(2014, 01, 01), y: 1200 }, + { x: new Date(2014, 02, 01), y: 1190 }, + { x: new Date(2014, 03, 01), y: 1180 }, + { x: new Date(2014, 04, 01), y: 1250 }, + { x: new Date(2014, 05, 01), y: 1270 }, + { x: new Date(2014, 06, 01), y: 1300 }, + { x: new Date(2014, 07, 01), y: 1300 }, + { x: new Date(2014, 08, 01), y: 1358 }, + { x: new Date(2014, 09, 01), y: 1410 }, + { x: new Date(2014, 10, 01), y: 1480 }, + { x: new Date(2014, 11, 01), y: 1500 }, + { x: new Date(2015, 00, 01), y: 1500 }, + { x: new Date(2015, 01, 01), y: 1550 }, + { x: new Date(2015, 02, 01), y: 1550 }, + { x: new Date(2015, 03, 01), y: 1590 }, + { x: new Date(2015, 04, 01), y: 1600 }, + { x: new Date(2015, 05, 01), y: 1590 }, + { x: new Date(2015, 06, 01), y: 1590 }, + { x: new Date(2015, 07, 01), y: 1620 }, + { x: new Date(2015, 08, 01), y: 1670 }, + { x: new Date(2015, 09, 01), y: 1720 }, + { x: new Date(2015, 10, 01), y: 1750 }, + { x: new Date(2015, 11, 01), y: 1820 }, + { x: new Date(2016, 00, 01), y: 2000 }, + { x: new Date(2016, 01, 01), y: 1920 }, + { x: new Date(2016, 02, 01), y: 1750 }, + { x: new Date(2016, 03, 01), y: 1850 }, + { x: new Date(2016, 04, 01), y: 1750 }, + { x: new Date(2016, 05, 01), y: 1730 }, + { x: new Date(2016, 06, 01), y: 1700 }, + { x: new Date(2016, 07, 01), y: 1730 }, + { x: new Date(2016, 08, 01), y: 1720 }, + { x: new Date(2016, 09, 01), y: 1740 }, + { x: new Date(2016, 10, 01), y: 1750 }, + { x: new Date(2016, 11, 01), y: 1750 }, + { x: new Date(2017, 00, 01), y: 1750 }, + { x: new Date(2017, 01, 01), y: 1770 }, + { x: new Date(2017, 02, 01), y: 1750 }, + { x: new Date(2017, 03, 01), y: 1750 }, + { x: new Date(2017, 04, 01), y: 1730 }, + { x: new Date(2017, 05, 01), y: 1730 } + ] + }, + { + type: "line", + axisYType: "secondary", + name: "Seatle", + showInLegend: true, + markerSize: 0, + yValueFormatString: "$#,###k", + dataPoints: [ + { x: new Date(2014, 00, 01), y: 409 }, + { x: new Date(2014, 01, 01), y: 415 }, + { x: new Date(2014, 02, 01), y: 419 }, + { x: new Date(2014, 03, 01), y: 429 }, + { x: new Date(2014, 04, 01), y: 429 }, + { x: new Date(2014, 05, 01), y: 450 }, + { x: new Date(2014, 06, 01), y: 450 }, + { x: new Date(2014, 07, 01), y: 445 }, + { x: new Date(2014, 08, 01), y: 450 }, + { x: new Date(2014, 09, 01), y: 450 }, + { x: new Date(2014, 10, 01), y: 440 }, + { x: new Date(2014, 11, 01), y: 429 }, + { x: new Date(2015, 00, 01), y: 435 }, + { x: new Date(2015, 01, 01), y: 450 }, + { x: new Date(2015, 02, 01), y: 475 }, + { x: new Date(2015, 03, 01), y: 475 }, + { x: new Date(2015, 04, 01), y: 475 }, + { x: new Date(2015, 05, 01), y: 489 }, + { x: new Date(2015, 06, 01), y: 495 }, + { x: new Date(2015, 07, 01), y: 495 }, + { x: new Date(2015, 08, 01), y: 500 }, + { x: new Date(2015, 09, 01), y: 508 }, + { x: new Date(2015, 10, 01), y: 520 }, + { x: new Date(2015, 11, 01), y: 525 }, + { x: new Date(2016, 00, 01), y: 525 }, + { x: new Date(2016, 01, 01), y: 529 }, + { x: new Date(2016, 02, 01), y: 549 }, + { x: new Date(2016, 03, 01), y: 550 }, + { x: new Date(2016, 04, 01), y: 568 }, + { x: new Date(2016, 05, 01), y: 575 }, + { x: new Date(2016, 06, 01), y: 579 }, + { x: new Date(2016, 07, 01), y: 575 }, + { x: new Date(2016, 08, 01), y: 585 }, + { x: new Date(2016, 09, 01), y: 589 }, + { x: new Date(2016, 10, 01), y: 595 }, + { x: new Date(2016, 11, 01), y: 595 }, + { x: new Date(2017, 00, 01), y: 595 }, + { x: new Date(2017, 01, 01), y: 600 }, + { x: new Date(2017, 02, 01), y: 624 }, + { x: new Date(2017, 03, 01), y: 635 }, + { x: new Date(2017, 04, 01), y: 650 }, + { x: new Date(2017, 05, 01), y: 675 } + ] + }, + { + type: "line", + axisYType: "secondary", + name: "Los Angeles", + showInLegend: true, + markerSize: 0, + yValueFormatString: "$#,###k", + dataPoints: [ + { x: new Date(2014, 00, 01), y: 529 }, + { x: new Date(2014, 01, 01), y: 540 }, + { x: new Date(2014, 02, 01), y: 539 }, + { x: new Date(2014, 03, 01), y: 565 }, + { x: new Date(2014, 04, 01), y: 575 }, + { x: new Date(2014, 05, 01), y: 579 }, + { x: new Date(2014, 06, 01), y: 589 }, + { x: new Date(2014, 07, 01), y: 579 }, + { x: new Date(2014, 08, 01), y: 579 }, + { x: new Date(2014, 09, 01), y: 579 }, + { x: new Date(2014, 10, 01), y: 569 }, + { x: new Date(2014, 11, 01), y: 525 }, + { x: new Date(2015, 00, 01), y: 535 }, + { x: new Date(2015, 01, 01), y: 575 }, + { x: new Date(2015, 02, 01), y: 599 }, + { x: new Date(2015, 03, 01), y: 619 }, + { x: new Date(2015, 04, 01), y: 639 }, + { x: new Date(2015, 05, 01), y: 648 }, + { x: new Date(2015, 06, 01), y: 640 }, + { x: new Date(2015, 07, 01), y: 645 }, + { x: new Date(2015, 08, 01), y: 648 }, + { x: new Date(2015, 09, 01), y: 649 }, + { x: new Date(2015, 10, 01), y: 649 }, + { x: new Date(2015, 11, 01), y: 649 }, + { x: new Date(2016, 00, 01), y: 650 }, + { x: new Date(2016, 01, 01), y: 665 }, + { x: new Date(2016, 02, 01), y: 675 }, + { x: new Date(2016, 03, 01), y: 695 }, + { x: new Date(2016, 04, 01), y: 690 }, + { x: new Date(2016, 05, 01), y: 699 }, + { x: new Date(2016, 06, 01), y: 699 }, + { x: new Date(2016, 07, 01), y: 699 }, + { x: new Date(2016, 08, 01), y: 699 }, + { x: new Date(2016, 09, 01), y: 699 }, + { x: new Date(2016, 10, 01), y: 709 }, + { x: new Date(2016, 11, 01), y: 699 }, + { x: new Date(2017, 00, 01), y: 700 }, + { x: new Date(2017, 01, 01), y: 700 }, + { x: new Date(2017, 02, 01), y: 724 }, + { x: new Date(2017, 03, 01), y: 739 }, + { x: new Date(2017, 04, 01), y: 749 }, + { x: new Date(2017, 05, 01), y: 740 } + ] + }] +}); +chart.render(); + +function toogleDataSeries(e){ + if (typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else{ + e.dataSeries.visible = true; + } + chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html new file mode 100644 index 00000000..7c4d43d0 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html @@ -0,0 +1,171 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + theme:"light2", + animationEnabled: true, + title:{ + text: "Game of Thrones Viewers of the First Airing on HBO" + }, + axisY :{ + includeZero: false, + title: "Number of Viewers", + suffix: "mn" + }, + toolTip: { + shared: "true" + }, + legend:{ + cursor:"pointer", + itemclick : toggleDataSeries + }, + data: [{ + type: "spline", + visible: false, + showInLegend: true, + yValueFormatString: "##.00mn", + name: "Season 1", + dataPoints: [ + { label: "Ep. 1", y: 2.22 }, + { label: "Ep. 2", y: 2.20 }, + { label: "Ep. 3", y: 2.44 }, + { label: "Ep. 4", y: 2.45 }, + { label: "Ep. 5", y: 2.58 }, + { label: "Ep. 6", y: 2.44 }, + { label: "Ep. 7", y: 2.40 }, + { label: "Ep. 8", y: 2.72 }, + { label: "Ep. 9", y: 2.66 }, + { label: "Ep. 10", y: 3.04 } + ] + }, + { + type: "spline", + showInLegend: true, + visible: false, + yValueFormatString: "##.00mn", + name: "Season 2", + dataPoints: [ + { label: "Ep. 1", y: 3.86 }, + { label: "Ep. 2", y: 3.76 }, + { label: "Ep. 3", y: 3.77 }, + { label: "Ep. 4", y: 3.65 }, + { label: "Ep. 5", y: 3.90 }, + { label: "Ep. 6", y: 3.88 }, + { label: "Ep. 7", y: 3.69 }, + { label: "Ep. 8", y: 3.86 }, + { label: "Ep. 9", y: 3.38 }, + { label: "Ep. 10", y: 4.20 } + ] + }, + { + type: "spline", + visible: false, + showInLegend: true, + yValueFormatString: "##.00mn", + name: "Season 3", + dataPoints: [ + { label: "Ep. 1", y: 4.37 }, + { label: "Ep. 2", y: 4.27 }, + { label: "Ep. 3", y: 4.72 }, + { label: "Ep. 4", y: 4.87 }, + { label: "Ep. 5", y: 5.35 }, + { label: "Ep. 6", y: 5.50 }, + { label: "Ep. 7", y: 4.84 }, + { label: "Ep. 8", y: 4.13 }, + { label: "Ep. 9", y: 5.22 }, + { label: "Ep. 10", y: 5.39 } + ] + }, + { + type: "spline", + showInLegend: true, + yValueFormatString: "##.00mn", + name: "Season 4", + dataPoints: [ + { label: "Ep. 1", y: 6.64 }, + { label: "Ep. 2", y: 6.31 }, + { label: "Ep. 3", y: 6.59 }, + { label: "Ep. 4", y: 6.95 }, + { label: "Ep. 5", y: 7.16 }, + { label: "Ep. 6", y: 6.40 }, + { label: "Ep. 7", y: 7.20 }, + { label: "Ep. 8", y: 7.17 }, + { label: "Ep. 9", y: 6.95 }, + { label: "Ep. 10", y: 7.09 } + ] + }, + { + type: "spline", + showInLegend: true, + yValueFormatString: "##.00mn", + name: "Season 5", + dataPoints: [ + { label: "Ep. 1", y: 8 }, + { label: "Ep. 2", y: 6.81 }, + { label: "Ep. 3", y: 6.71 }, + { label: "Ep. 4", y: 6.82 }, + { label: "Ep. 5", y: 6.56 }, + { label: "Ep. 6", y: 6.24 }, + { label: "Ep. 7", y: 5.40 }, + { label: "Ep. 8", y: 7.01 }, + { label: "Ep. 9", y: 7.14 }, + { label: "Ep. 10", y: 8.11 } + ] + }, + { + type: "spline", + showInLegend: true, + yValueFormatString: "##.00mn", + name: "Season 6", + dataPoints: [ + { label: "Ep. 1", y: 7.94 }, + { label: "Ep. 2", y: 7.29 }, + { label: "Ep. 3", y: 7.28 }, + { label: "Ep. 4", y: 7.82 }, + { label: "Ep. 5", y: 7.89 }, + { label: "Ep. 6", y: 6.71 }, + { label: "Ep. 7", y: 7.80 }, + { label: "Ep. 8", y: 7.60 }, + { label: "Ep. 9", y: 7.66 }, + { label: "Ep. 10", y: 8.89 } + ] + }, + { + type: "spline", + showInLegend: true, + yValueFormatString: "##.00mn", + name: "Season 7", + dataPoints: [ + { label: "Ep. 1", y: 10.11 }, + { label: "Ep. 2", y: 9.27 }, + { label: "Ep. 3", y: 9.25 }, + { label: "Ep. 4", y: 10.17 }, + { label: "Ep. 5", y: 10.72 }, + { label: "Ep. 6", y: 10.24 }, + { label: "Ep. 7", y: 12.07 } + ] + }] +}); +chart.render(); + +function toggleDataSeries(e) { + if (typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible ){ + e.dataSeries.visible = false; + } else { + e.dataSeries.visible = true; + } + chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html new file mode 100644 index 00000000..d6d67a13 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html @@ -0,0 +1,67 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart= new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Multi-Series StepLine Chart with Null Data" + }, + axisX: { + valueFormatString: "DD MMM" + }, + axisY:{ + includeZero: false + }, + axisY2:{ + includeZero: false, + minimum:25 + }, + toolTip: { + shared: true + }, + data: [{ + type: "stepLine", + connectNullData: true, + xValueFormatString: "MMM", + dataPoints: [ + { x: new Date(2008,02), y: 15.00 }, + { x: new Date(2008,03), y: 14.50 }, + { x: new Date(2008,04), y: 14.00 }, + { x: new Date(2008,05), y: 14.50 }, + { x: new Date(2008,06), y: 14.75 }, + { x: new Date(2008,07), y: null }, + { x: new Date(2008,08), y: 15.80 }, + { x: new Date(2008,09), y: 17.50 } + ] + }, + { + type: "stepLine", + axisYType: "secondary", + connectNullData: true, + xValueFormatString: "MMM", + dataPoints: [ + { x: new Date(2008,02), y: 41.00 }, + { x: new Date(2008,03), y: 43.50 }, + { x: new Date(2008,04), y: 41.00 }, + { x: new Date(2008,05), y: null }, + { x: new Date(2008,06), y: 47.55 }, + { x: new Date(2008,07), y: 45.00 }, + { x: new Date(2008,08), y: 40.70 }, + { x: new Date(2008,09), y: 37.00 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html new file mode 100644 index 00000000..34c7c5bf --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html @@ -0,0 +1,123 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + exportEnabled: true, + title:{ + text: "Gold Medals Won in Olympics" + }, + axisY:{ + title: "Number of Medals" + }, + toolTip: { + shared: true + }, + legend:{ + cursor:"pointer", + itemclick: toggleDataSeries + }, + data: [{ + type: "spline", + name: "US", + showInLegend: true, + dataPoints: [ + { label: "Atlanta 1996" , y: 44 }, + { label:"Sydney 2000", y: 37 }, + { label: "Athens 2004", y: 36 }, + { label: "Beijing 2008", y: 36 }, + { label: "London 2012", y: 46 }, + { label: "Rio 2016", y: 46 } + ] + }, + { + type: "spline", + name: "China", + showInLegend: true, + dataPoints: [ + { label: "Atlanta 1996" , y: 16 }, + { label:"Sydney 2000", y: 28 }, + { label: "Athens 2004", y: 32 }, + { label: "Beijing 2008", y: 48 }, + { label: "London 2012", y: 38 }, + { label: "Rio 2016", y: 26 } + ] + }, + { + type: "spline", + name: "Britain", + showInLegend: true, + dataPoints: [ + { label: "Atlanta 1996" , y: 1 }, + { label:"Sydney 2000", y: 11 }, + { label: "Athens 2004", y: 9 }, + { label: "Beijing 2008", y: 19 }, + { label: "London 2012", y: 29 }, + { label: "Rio 2016", y: 27 } + ] + }, + { + type: "spline", + name: "Russia", + showInLegend: true, + dataPoints: [ + { label: "Atlanta 1996" , y: 26 }, + { label:"Sydney 2000", y: 32 }, + { label: "Athens 2004", y: 28 }, + { label: "Beijing 2008", y: 22 }, + { label: "London 2012", y: 20 }, + { label: "Rio 2016", y: 19 } + ] + }, + { + type: "spline", + name: "S Korea", + showInLegend: true, + dataPoints: [ + { label: "Atlanta 1996" , y: 7 }, + { label:"Sydney 2000", y: 8 }, + { label: "Athens 2004", y: 9 }, + { label: "Beijing 2008", y: 13 }, + { label: "London 2012", y: 13 }, + { label: "Rio 2016", y: 9 } + ] + }, + { + type: "spline", + name: "Germany", + showInLegend: true, + dataPoints: [ + { label: "Atlanta 1996" , y: 20 }, + { label:"Sydney 2000", y: 13 }, + { label: "Athens 2004", y: 13 }, + { label: "Beijing 2008", y: 16 }, + { label: "London 2012", y: 11 }, + { label: "Rio 2016", y: 17 } + ] + }] +}); + +chart.render(); + +function toggleDataSeries(e) { + if(typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } + else { + e.dataSeries.visible = true; + } + chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html new file mode 100644 index 00000000..3cdb8259 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html @@ -0,0 +1,100 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Speed And Distance Time Graph" + }, + toolTip: { + shared: true + }, + axisX: { + title: "Time", + suffix : " s" + }, + axisY: { + title: "Speed", + titleFontColor: "#4F81BC", + suffix : " m/s", + lineColor: "#4F81BC", + tickColor: "#4F81BC" + }, + axisY2: { + title: "Distance", + titleFontColor: "#C0504E", + suffix : " m", + lineColor: "#C0504E", + tickColor: "#C0504E" + }, + data: [{ + type: "spline", + name: "speed", + xValueFormatString: "#### sec", + yValueFormatString: "#,##0.00 m/s", + dataPoints: [ + { x: 0 , y: 0 }, + { x: 11 , y: 8.2 }, + { x: 47 , y: 41.7 }, + { x: 56 , y: 16.7 }, + { x: 120 , y: 31.3 }, + { x: 131 , y: 18.2 }, + { x: 171 , y: 31.3 }, + { x: 189 , y: 61.1 }, + { x: 221 , y: 40.6 }, + { x: 232 , y: 18.2 }, + { x: 249 , y: 35.3 }, + { x: 253 , y: 12.5 }, + { x: 264 , y: 16.4 }, + { x: 280 , y: 37.5 }, + { x: 303 , y: 24.3 }, + { x: 346 , y: 23.3 }, + { x: 376 , y: 11.3 }, + { x: 388 , y: 8.3 }, + { x: 430 , y: 1.9 }, + { x: 451 , y: 4.8 } + ] + }, + { + type: "spline", + axisYType: "secondary", + name: "distance covered", + yValueFormatString: "#,##0.# m", + dataPoints: [ + { x: 0 , y: 0 }, + { x: 11 , y: 90 }, + { x: 47 , y: 1590 }, + { x: 56 , y: 1740 }, + { x: 120 , y: 3740 }, + { x: 131 , y: 3940 }, + { x: 171 , y: 5190 }, + { x: 189 , y: 6290 }, + { x: 221 , y: 7590 }, + { x: 232 , y: 7790 }, + { x: 249 , y: 8390 }, + { x: 253 , y: 8440 }, + { x: 264 , y: 8620 }, + { x: 280 , y: 9220 }, + { x: 303 , y: 9780 }, + { x: 346 , y: 10780 }, + { x: 376 , y: 11120 }, + { x: 388 , y: 11220 }, + { x: 430 , y: 11300 }, + { x: 451 , y: 11400 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html new file mode 100644 index 00000000..7c1afce1 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html @@ -0,0 +1,55 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Music Album Sales by Year" + }, + axisY: { + title: "Units Sold", + valueFormatString: "#0,,.", + suffix: "mn", + stripLines: [{ + value: 3366500, + label: "Average" + }] + }, + data: [{ + yValueFormatString: "#,### Units", + xValueFormatString: "YYYY", + type: "spline", + dataPoints: [ + {x: new Date(2002, 0), y: 2506000}, + {x: new Date(2003, 0), y: 2798000}, + {x: new Date(2004, 0), y: 3386000}, + {x: new Date(2005, 0), y: 6944000}, + {x: new Date(2006, 0), y: 6026000}, + {x: new Date(2007, 0), y: 2394000}, + {x: new Date(2008, 0), y: 1872000}, + {x: new Date(2009, 0), y: 2140000}, + {x: new Date(2010, 0), y: 7289000}, + {x: new Date(2011, 0), y: 4830000}, + {x: new Date(2012, 0), y: 2009000}, + {x: new Date(2013, 0), y: 2840000}, + {x: new Date(2014, 0), y: 2396000}, + {x: new Date(2015, 0), y: 1613000}, + {x: new Date(2016, 0), y: 2821000}, + {x: new Date(2017, 0), y: 2000000} + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html new file mode 100644 index 00000000..dc1a4b7a --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html @@ -0,0 +1,57 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + exportEnabled: true, + title:{ + text: "US Unemployement Rate" + }, + axisY:{ + title: "Percentage", + includeZero: false, + interval: .2, + suffix: "%", + valueFormatString: "#.0" + }, + data: [{ + type: "stepLine", + yValueFormatString: "#0.0'%'", + xValueFormatString: "MMM YYYY", + markerSize: 5, + dataPoints: [ + { x: new Date(2016, 0), y: 4.9 }, + { x: new Date(2016, 1), y: 4.9 }, + { x: new Date(2016, 2), y: 5.0 }, + { x: new Date(2016, 3), y: 5.0, indexLabel: "Highest", indexLabelFontColor: "#C24642" }, + { x: new Date(2016, 4), y: 4.7 }, + { x: new Date(2016, 5), y: 4.9 }, + { x: new Date(2016, 6), y: 4.9 }, + { x: new Date(2016, 7), y: 4.9 }, + { x: new Date(2016, 8), y: 4.9 }, + { x: new Date(2016, 9), y: 4.8 }, + { x: new Date(2016, 10), y: 4.6 }, + { x: new Date(2016, 11), y: 4.7 }, + { x: new Date(2017, 0), y: 4.8 }, + { x: new Date(2017, 1), y: 4.7 }, + { x: new Date(2017, 2), y: 4.5 }, + { x: new Date(2017, 3), y:4.4 }, + { x: new Date(2017, 4), y:4.3 }, + { x: new Date(2017, 5), y:4.4 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html new file mode 100644 index 00000000..f721ee43 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html @@ -0,0 +1,50 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title: { + text: "Number of iPhones Sold in Different Quarters" + }, + axisX: { + minimum: new Date(2015, 01, 25), + maximum: new Date(2017, 02, 15), + valueFormatString: "MMM YY" + }, + axisY: { + title: "Number of Sales", + titleFontColor: "#4F81BC", + suffix: "mn" + }, + data: [{ + indexLabelFontColor: "darkSlateGray", + name: "views", + type: "area", + yValueFormatString: "#,##0.0mn", + dataPoints: [ + { x: new Date(2015, 02, 1), y: 74.4, label: "Q1-2015" }, + { x: new Date(2015, 05, 1), y: 61.1, label: "Q2-2015" }, + { x: new Date(2015, 08, 1), y: 47.0, label: "Q3-2015" }, + { x: new Date(2015, 11, 1), y: 48.0, label: "Q4-2015" }, + { x: new Date(2016, 02, 1), y: 74.8, label: "Q1-2016" }, + { x: new Date(2016, 05, 1), y: 51.1, label: "Q2-2016" }, + { x: new Date(2016, 08, 1), y: 40.4, label: "Q3-2016" }, + { x: new Date(2016, 11, 1), y: 45.5, label: "Q4-2016" }, + { x: new Date(2017, 02, 1), y: 78.3, label: "Q1-2017", indexLabel: "Highest", markerColor: "red" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html new file mode 100644 index 00000000..5e0ce683 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html @@ -0,0 +1,73 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title: { + text: "Daily Email Analysis" + }, + axisX: { + valueFormatString: "DDD", + minimum: new Date(2017, 1, 5, 23), + maximum: new Date(2017, 1, 12, 1) + }, + axisY: { + title: "Number of Messages" + }, + legend: { + verticalAlign: "top", + horizontalAlign: "right", + dockInsidePlotArea: true + }, + toolTip: { + shared: true + }, + data: [{ + name: "Received", + showInLegend: true, + legendMarkerType: "square", + type: "area", + color: "rgba(40,175,101,0.6)", + markerSize: 0, + dataPoints: [ + { x: new Date(2017, 1, 6), y: 220 }, + { x: new Date(2017, 1, 7), y: 120 }, + { x: new Date(2017, 1, 8), y: 144 }, + { x: new Date(2017, 1, 9), y: 162 }, + { x: new Date(2017, 1, 10), y: 129 }, + { x: new Date(2017, 1, 11), y: 109 }, + { x: new Date(2017, 1, 12), y: 129 } + ] + }, + { + name: "Sent", + showInLegend: true, + legendMarkerType: "square", + type: "area", + color: "rgba(0,75,141,0.7)", + markerSize: 0, + dataPoints: [ + { x: new Date(2017, 1, 6), y: 42 }, + { x: new Date(2017, 1, 7), y: 34 }, + { x: new Date(2017, 1, 8), y: 29 }, + { x: new Date(2017, 1, 9), y: 42 }, + { x: new Date(2017, 1, 10), y: 53}, + { x: new Date(2017, 1, 11), y: 15 }, + { x: new Date(2017, 1, 12), y: 12 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html new file mode 100644 index 00000000..1bd75401 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html @@ -0,0 +1,127 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + exportEnabled: true, + animationEnabled: true, + theme: "light2", + title:{ + text: "Temperature Variation - Ladakh vs Chandigarh" + }, + axisX: { + title: "April 2017", + valueFormatString: "DD MMM" + }, + axisY: { + suffix: " °C" + }, + toolTip: { + shared: true + }, + legend: { + cursor: "pointer", + horizontalAlign: "right", + itemclick: toggleDataSeries + }, + data: [{ + type: "rangeArea", + showInLegend: true, + name: "Ladakh", + markerSize: 0, + yValueFormatString: "#0.## °C", + dataPoints: [ + { x: new Date(2017, 03, 01), y: [05, 21] }, + { x: new Date(2017, 03, 02), y: [07, 15] }, + { x: new Date(2017, 03, 03), y: [07, 18] }, + { x: new Date(2017, 03, 04), y: [09, 16] }, + { x: new Date(2017, 03, 05), y: [10, 17] }, + { x: new Date(2017, 03, 06), y: [08, 13] }, + { x: new Date(2017, 03, 07), y: [06, 10] }, + { x: new Date(2017, 03, 08), y: [06, 15] }, + { x: new Date(2017, 03, 09), y: [06, 20] }, + { x: new Date(2017, 03, 10), y: [05, 21] }, + { x: new Date(2017, 03, 11), y: [06, 21] }, + { x: new Date(2017, 03, 12), y: [07, 14] }, + { x: new Date(2017, 03, 13), y: [07, 17] }, + { x: new Date(2017, 03, 14), y: [05, 20] }, + { x: new Date(2017, 03, 15), y: [07, 18] }, + { x: new Date(2017, 03, 16), y: [07, 15] }, + { x: new Date(2017, 03, 17), y: [08, 15] }, + { x: new Date(2017, 03, 18), y: [07, 13] }, + { x: new Date(2017, 03, 19), y: [07, 13] }, + { x: new Date(2017, 03, 20), y: [07, 18] }, + { x: new Date(2017, 03, 21), y: [06, 20] }, + { x: new Date(2017, 03, 22), y: [09, 23] }, + { x: new Date(2017, 03, 23), y: [09, 24] }, + { x: new Date(2017, 03, 24), y: [08, 23] }, + { x: new Date(2017, 03, 25), y: [12, 24] }, + { x: new Date(2017, 03, 26), y: [10, 21] }, + { x: new Date(2017, 03, 27), y: [07, 24] }, + { x: new Date(2017, 03, 28), y: [10, 27] }, + { x: new Date(2017, 03, 29), y: [10, 26] }, + { x: new Date(2017, 03, 30), y: [12, 27] } + ] + }, + { + type: "rangeArea", + showInLegend: true, + name: "Chandigarh", + markerSize: 0, + yValueFormatString: "#0.## °C", + dataPoints: [ + { x: new Date(2017, 03, 01), y: [15, 31] }, + { x: new Date(2017, 03, 02), y: [16, 30] }, + { x: new Date(2017, 03, 03), y: [14, 30] }, + { x: new Date(2017, 03, 04), y: [15, 30] }, + { x: new Date(2017, 03, 05), y: [17, 33] }, + { x: new Date(2017, 03, 06), y: [19, 35] }, + { x: new Date(2017, 03, 07), y: [20, 30] }, + { x: new Date(2017, 03, 08), y: [15, 31] }, + { x: new Date(2017, 03, 09), y: [16, 32] }, + { x: new Date(2017, 03, 10), y: [16, 33] }, + { x: new Date(2017, 03, 11), y: [16, 35] }, + { x: new Date(2017, 03, 12), y: [17, 36] }, + { x: new Date(2017, 03, 13), y: [20, 32] }, + { x: new Date(2017, 03, 14), y: [17, 35] }, + { x: new Date(2017, 03, 15), y: [18, 36] }, + { x: new Date(2017, 03, 16), y: [20, 34] }, + { x: new Date(2017, 03, 17), y: [17, 30] }, + { x: new Date(2017, 03, 18), y: [19, 29] }, + { x: new Date(2017, 03, 19), y: [16, 32] }, + { x: new Date(2017, 03, 20), y: [17, 33] }, + { x: new Date(2017, 03, 21), y: [16, 35] }, + { x: new Date(2017, 03, 22), y: [19, 36] }, + { x: new Date(2017, 03, 23), y: [20, 36] }, + { x: new Date(2017, 03, 24), y: [21, 37] }, + { x: new Date(2017, 03, 25), y: [21, 38] }, + { x: new Date(2017, 03, 26), y: [21, 39] }, + { x: new Date(2017, 03, 27), y: [22, 39] }, + { x: new Date(2017, 03, 28), y: [22, 39] }, + { x: new Date(2017, 03, 29), y: [22, 41] }, + { x: new Date(2017, 03, 30), y: [23, 42] } + ] + }] +}); +chart.render(); + +function toggleDataSeries(e) { + if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else { + e.dataSeries.visible = true; + } + e.chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html new file mode 100644 index 00000000..54e2bece --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html @@ -0,0 +1,113 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Monthly Expenses, 2016-17" + }, + axisY :{ + includeZero: false, + prefix: "$" + }, + toolTip: { + shared: true + }, + legend: { + fontSize: 13 + }, + data: [{ + type: "splineArea", + showInLegend: true, + name: "Salaries", + yValueFormatString: "$#,##0", + dataPoints: [ + { x: new Date(2016, 2), y: 30000 }, + { x: new Date(2016, 3), y: 35000 }, + { x: new Date(2016, 4), y: 30000 }, + { x: new Date(2016, 5), y: 30400 }, + { x: new Date(2016, 6), y: 20900 }, + { x: new Date(2016, 7), y: 31000 }, + { x: new Date(2016, 8), y: 30200 }, + { x: new Date(2016, 9), y: 30000 }, + { x: new Date(2016, 10), y: 33000 }, + { x: new Date(2016, 11), y: 38000 }, + { x: new Date(2017, 0), y: 38900 }, + { x: new Date(2017, 1), y: 39000 } + ] + }, + { + type: "splineArea", + showInLegend: true, + name: "Office Cost", + yValueFormatString: "$#,##0", + dataPoints: [ + { x: new Date(2016, 2), y: 20100 }, + { x: new Date(2016, 3), y: 16000 }, + { x: new Date(2016, 4), y: 14000 }, + { x: new Date(2016, 5), y: 18000 }, + { x: new Date(2016, 6), y: 18000 }, + { x: new Date(2016, 7), y: 21000 }, + { x: new Date(2016, 8), y: 22000 }, + { x: new Date(2016, 9), y: 25000 }, + { x: new Date(2016, 10), y: 23000 }, + { x: new Date(2016, 11), y: 25000 }, + { x: new Date(2017, 0), y: 26000 }, + { x: new Date(2017, 1), y: 25000 } + ] + }, + { + type: "splineArea", + showInLegend: true, + name: "Entertainment", + yValueFormatString: "$#,##0", + dataPoints: [ + { x: new Date(2016, 2), y: 10100 }, + { x: new Date(2016, 3), y: 6000 }, + { x: new Date(2016, 4), y: 3400 }, + { x: new Date(2016, 5), y: 4000 }, + { x: new Date(2016, 6), y: 9000 }, + { x: new Date(2016, 7), y: 3900 }, + { x: new Date(2016, 8), y: 4200 }, + { x: new Date(2016, 9), y: 5000 }, + { x: new Date(2016, 10), y: 14300 }, + { x: new Date(2016, 11), y: 12300 }, + { x: new Date(2017, 0), y: 8300 }, + { x: new Date(2017, 1), y: 6300 } + ] + }, + { + type: "splineArea", + showInLegend: true, + yValueFormatString: "$#,##0", + name: "Maintenance", + dataPoints: [ + { x: new Date(2016, 2), y: 1700 }, + { x: new Date(2016, 3), y: 2600 }, + { x: new Date(2016, 4), y: 1000 }, + { x: new Date(2016, 5), y: 1400 }, + { x: new Date(2016, 6), y: 900 }, + { x: new Date(2016, 7), y: 1000 }, + { x: new Date(2016, 8), y: 1200 }, + { x: new Date(2016, 9), y: 5000 }, + { x: new Date(2016, 10), y: 1300 }, + { x: new Date(2016, 11), y: 2300 }, + { x: new Date(2017, 0), y: 2800 }, + { x: new Date(2017, 1), y: 1300 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html new file mode 100644 index 00000000..e5408a62 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html @@ -0,0 +1,72 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + exportEnabled: true, + title:{ + text: "Temperature in Toronto - July 2017" + }, + axisY: { + includeZero:false, + title: "Temperature (°C)", + suffix: " °C" + }, + axisX: { + valueFormatString: "DD MMMM" + }, + data: [ + { + type: "rangeArea", + xValueFormatString: "DD MMMM", + yValueFormatString: "#0.## °C", + toolTipContent: " <span style='color:#4F81BC'>{x}</span><br><b>Min:</b> {y[0]}<br><b>Max:</b> {y[1]}", + dataPoints: [ + { x: new Date(2017,06,01), y:[15, 21] }, + { x: new Date(2017,06,02), y:[13, 27] }, + { x: new Date(2017,06,03), y:[14, 23] }, + { x: new Date(2017,06,04), y:[17, 25] }, + { x: new Date(2017,06,05), y:[16, 23] }, + { x: new Date(2017,06,06), y:[16, 29] }, + { x: new Date(2017,06,07), y:[18, 27] }, + { x: new Date(2017,06,08), y:[16, 25] }, + { x: new Date(2017,06,09), y:[15, 25] }, + { x: new Date(2017,06,10), y:[16, 23] }, + { x: new Date(2017,06,11), y:[15, 26] }, + { x: new Date(2017,06,12), y:[19, 23] }, + { x: new Date(2017,06,13), y:[16, 19] }, + { x: new Date(2017,06,14), y:[16, 27] }, + { x: new Date(2017,06,15), y:[18, 27] }, + { x: new Date(2017,06,16), y:[17, 24] }, + { x: new Date(2017,06,17), y:[19, 23] }, + { x: new Date(2017,06,18), y:[19, 26] }, + { x: new Date(2017,06,19), y:[20, 30] }, + { x: new Date(2017,06,20), y:[17, 21] }, + { x: new Date(2017,06,21), y:[19, 30] }, + { x: new Date(2017,06,22), y:[21, 23] }, + { x: new Date(2017,06,23), y:[20, 24] }, + { x: new Date(2017,06,24), y:[17, 22] }, + { x: new Date(2017,06,25), y:[17, 22] }, + { x: new Date(2017,06,26), y:[16, 22] }, + { x: new Date(2017,06,27), y:[19, 26] }, + { x: new Date(2017,06,28), y:[18, 23] }, + { x: new Date(2017,06,29), y:[18, 27] }, + { x: new Date(2017,06,30), y:[20, 31] }, + { x: new Date(2017,06,31), y:[19, 27] } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html new file mode 100644 index 00000000..280a052a --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html @@ -0,0 +1,51 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + exportEnabled: true, + animationEnabled: true, + title:{ + text: "Monthly Average Temperature Variation in New Delhi" + }, + axisX: { + valueFormatString: "MMMM" + }, + axisY: { + title: "Temperature (°C)", + suffix: " °C" + }, + data: [{ + type: "rangeSplineArea", + indexLabel: "{y[#index]}°", + xValueFormatString: "MMMM YYYY", + toolTipContent: "{x} </br> <strong>Temperature: </strong> </br> Min: {y[0]} °C, Max: {y[1]} °C", + dataPoints: [ + { x: new Date(2016, 00, 01), y: [7, 18] }, + { x: new Date(2016, 01, 01), y: [11, 23] }, + { x: new Date(2016, 02, 01), y: [15, 28] }, + { x: new Date(2016, 03, 01), y: [22, 36] }, + { x: new Date(2016, 04, 01), y: [26, 39] }, + { x: new Date(2016, 05, 01), y: [27, 37] }, + { x: new Date(2016, 06, 01), y: [27, 34] }, + { x: new Date(2016, 07, 01), y: [26, 33] }, + { x: new Date(2016, 08, 01), y: [24, 33] }, + { x: new Date(2016, 09, 01), y: [19, 31] }, + { x: new Date(2016, 10, 01), y: [13, 27] }, + { x: new Date(2016, 11, 01), y: [08, 21] } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html new file mode 100644 index 00000000..450b4a57 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html @@ -0,0 +1,55 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Company Revenue by Year" + }, + axisY: { + title: "Revenue in USD", + valueFormatString: "#0,,.", + suffix: "mn", + prefix: "$" + }, + data: [{ + type: "splineArea", + color: "rgba(54,158,173,.7)", + markerSize: 5, + xValueFormatString: "YYYY", + yValueFormatString: "$#,##0.##", + dataPoints: [ + { x: new Date(2000, 0), y: 3289000 }, + { x: new Date(2001, 0), y: 3830000 }, + { x: new Date(2002, 0), y: 2009000 }, + { x: new Date(2003, 0), y: 2840000 }, + { x: new Date(2004, 0), y: 2396000 }, + { x: new Date(2005, 0), y: 1613000 }, + { x: new Date(2006, 0), y: 2821000 }, + { x: new Date(2007, 0), y: 2000000 }, + { x: new Date(2008, 0), y: 1397000 }, + { x: new Date(2009, 0), y: 2506000 }, + { x: new Date(2010, 0), y: 2798000 }, + { x: new Date(2011, 0), y: 3386000 }, + { x: new Date(2012, 0), y: 6704000}, + { x: new Date(2013, 0), y: 6026000 }, + { x: new Date(2014, 0), y: 2394000 }, + { x: new Date(2015, 0), y: 1872000 }, + { x: new Date(2016, 0), y: 2140000 } + ] + }] + }); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html new file mode 100644 index 00000000..76483f3a --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html @@ -0,0 +1,120 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + title:{ + text: "Percentage of People Involved in Traffic Accidents by Modes of Transport" + }, + theme: "light2", // "light1", "light2", "dark1", "dark2" + animationEnabled: true, + axisX: { + interval: 1, + intervalType: "month" + }, + toolTip: { + shared: true + }, + data: [ + { + type: "stackedArea100", + name: "Cars", + xValueFormatString: "MMM, YYYY", + showInLegend: "true", + dataPoints: [ + { x: new Date(2016, 00, 1), y: 1100 }, + { x: new Date(2016, 01, 1), y: 1200 }, + { x: new Date(2016, 02, 1), y: 1000 }, + { x: new Date(2016, 03, 1), y: 1200 }, + { x: new Date(2016, 04, 1), y: 1600 }, + { x: new Date(2016, 05, 1), y: 1800 }, + { x: new Date(2016, 06, 1), y: 1400 }, + { x: new Date(2016, 07, 1), y: 1500 }, + { x: new Date(2016, 08, 1), y: 1600 }, + { x: new Date(2016, 09, 1), y: 1800 } + ] + }, + { + type: "stackedArea100", + name: "Trucks", + showInLegend: "true", + dataPoints: [ + { x: new Date(2016, 00, 1), y: 150 }, + { x: new Date(2016, 01, 1), y: 171 }, + { x: new Date(2016, 02, 1), y: 155 }, + { x: new Date(2016, 03, 1), y: 150 }, + { x: new Date(2016, 04, 1), y: 165 }, + { x: new Date(2016, 05, 1), y: 195 }, + { x: new Date(2016, 06, 1), y: 155 }, + { x: new Date(2016, 07, 1), y: 145 }, + { x: new Date(2016, 08, 1), y: 140 }, + { x: new Date(2016, 09, 1), y: 151 } + ] + }, + { + type: "stackedArea100", + name: "Bicycles", + showInLegend: "true", + dataPoints: [ + { x: new Date(2016, 00, 1), y: 71 }, + { x: new Date(2016, 01, 1), y: 41 }, + { x: new Date(2016, 02, 1), y: 55 }, + { x: new Date(2016, 03, 1), y: 50 }, + { x: new Date(2016, 04, 1), y: 65 }, + { x: new Date(2016, 05, 1), y: 95 }, + { x: new Date(2016, 06, 1), y: 45 }, + { x: new Date(2016, 07, 1), y: 95 }, + { x: new Date(2016, 08, 1), y: 60 }, + { x: new Date(2016, 09, 1), y: 40 } + ] + }, + { + type: "stackedArea100", + name: "Motorcycles", + showInLegend: "true", + dataPoints: [ + { x: new Date(2016, 00, 1), y: 861 }, + { x: new Date(2016, 01, 1), y: 761 }, + { x: new Date(2016, 02, 1), y: 775 }, + { x: new Date(2016, 03, 1), y: 680 }, + { x: new Date(2016, 04, 1), y: 785 }, + { x: new Date(2016, 05, 1), y: 374 }, + { x: new Date(2016, 06, 1), y: 365 }, + { x: new Date(2016, 07, 1), y: 455 }, + { x: new Date(2016, 08, 1), y: 657 }, + { x: new Date(2016, 09, 1), y: 659 } + ] + }, + { + type: "stackedArea100", + name: "Pedistrians", + showInLegend: "true", + dataPoints: [ + { x: new Date(2016, 00, 1), y: 220 }, + { x: new Date(2016, 01, 1), y: 240 }, + { x: new Date(2016, 02, 1), y: 295 }, + { x: new Date(2016, 03, 1), y: 300 }, + { x: new Date(2016, 04, 1), y: 265 }, + { x: new Date(2016, 05, 1), y: 235 }, + { x: new Date(2016, 06, 1), y: 245 }, + { x: new Date(2016, 07, 1), y: 255 }, + { x: new Date(2016, 08, 1), y: 275 }, + { x: new Date(2016, 09, 1), y: 290 } + ] + } + ] +}); +chart.render(); + +} +</script> +<script src="../../canvasjs.min.js"></script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"> +</div> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html new file mode 100644 index 00000000..7af19276 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html @@ -0,0 +1,78 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Products Sold by XYZ Ltd. in 2016" + }, + axisX:{ + title: "Seasons", + minimum: -0.02, + maximum: 3.02 + }, + axisY:{ + title:"Sales" + }, + toolTip:{ + shared: true + }, + data: [{ + type: "stackedArea100", + name: "Mosquito Repellents", + showInLegend: "true", + dataPoints: [ + { y: 83450 , label: "Spring" }, + { y: 51240, label: "Summer" }, + { y: 64120, label: "Autumn" }, + { y: 71450, label: "Fall" } + ] + }, + { + type: "stackedArea100", + name: "Liquid Soap", + showInLegend: "true", + dataPoints: [ + { y: 20140 , label: "Spring" }, + { y: 30170, label: "Summer" }, + { y: 24410, label: "Autumn" }, + { y: 38120, label: "Fall" } + ] + }, + { + type: "stackedArea100", + name: "Napkins", + showInLegend: "true", + dataPoints: [ + { y: 45120 , label: "Spring" }, + { y: 50350, label: "Summer" }, + { y: 48410, label: "Autumn" }, + { y: 53120, label: "Fall" } + ] + }, + { + type: "stackedArea100", + name: "Sanitizer", + showInLegend: "true", + dataPoints: [ + { y: 11050, label: "Spring" }, + { y: 16100, label: "Summer" }, + { y: 15010, label: "Autumn" }, + { y: 23100, label: "Fall" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html new file mode 100644 index 00000000..90e29ed7 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html @@ -0,0 +1,68 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Cumulative App Downloads on iTunes and Play Store" + }, + axisY :{ + valueFormatString: "#0,.", + suffix: "k" + }, + axisX: { + title: "Months After Launch" + }, + toolTip: { + shared: true + }, + data: [{ + type: "stackedArea", + showInLegend: true, + toolTipContent: "<span style='color:#4F81BC'><strong>{name}: </strong></span> {y}", + name: "iOS", + dataPoints: [ + { x: 1, y: 3000 }, + { x: 2, y: 7000 }, + { x: 3, y: 10000 }, + { x: 4, y: 14000 }, + { x: 5, y: 23000 }, + { x: 6, y: 31000 }, + { x: 7, y: 42000 }, + { x: 8, y: 56000 }, + { x: 9, y: 64000 }, + { x: 10, y: 81000 }, + { x: 11, y: 105000 } + ] + }, + { + type: "stackedArea", + name: "Android", + toolTipContent: "<span style='color:#C0504E'><strong>{name}: </strong></span> {y}<br><b>Total:<b> #total", + showInLegend: true, + dataPoints: [ + { x: 4, y: 4000 }, + { x: 5, y: 6000 }, + { x: 6, y: 9000 }, + { x: 7,y: 14000 }, + { x: 8,y: 21000 }, + { x: 9, y: 31000 }, + { x: 10, y: 46000 }, + { x: 11, y: 61000 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html new file mode 100644 index 00000000..7fb51f0a --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html @@ -0,0 +1,42 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Customer Satisfaction Based on Reviews" + }, + axisY: { + title: "Satisfied Customers", + suffix: "%" + }, + data: [{ + type: "stepArea", + markerSize: 5, + xValueFormatString: "YYYY", + yValueFormatString: "#,##0.##'%'", + dataPoints: [ + { x: new Date(2010, 0), y: 34 }, + { x: new Date(2011, 0), y: 73 }, + { x: new Date(2012, 0), y: 78 }, + { x: new Date(2013, 0), y: 82 }, + { x: new Date(2014, 0), y: 70 }, + { x: new Date(2015, 0), y: 86 }, + { x: new Date(2016, 0), y: 80 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html new file mode 100644 index 00000000..5e7f2a0b --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html @@ -0,0 +1,58 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title: { + text: "Military Expenditure of Countries: 2016" + }, + axisX: { + interval: 1 + }, + axisY: { + title: "Expenses in Billion Dollars", + scaleBreaks: { + type: "wavy", + customBreaks: [{ + startValue: 80, + endValue: 210 + }, + { + startValue: 230, + endValue: 600 + } + ]} + }, + data: [{ + type: "bar", + toolTipContent: "<img src='https://canvasjs.com/wp-content/uploads/images/gallery/javascript-column-bar-charts/'{url}' style='width:40px; height:20px;'> <b>{label}</b><br>Budget: ${y}bn<br>{gdp}% of GDP", + dataPoints: [ + { label: "Israel", y: 17.8, gdp: 5.8, url: "israel.png" }, + { label: "United Arab Emirates", y: 22.8, gdp: 5.7, url: "uae.png" }, + { label: "Brazil", y: 22.8, gdp: 1.3, url: "brazil.png"}, + { label: "Australia", y: 24.3, gdp: 2.0, url: "australia.png" }, + { label: "South Korea", y: 36.8, gdp: 2.7, url: "skorea.png" }, + { label: "Germany", y: 41.1, gdp: 1.2, url: "germany.png" }, + { label: "Japan", y: 46.1, gdp: 1.0, url: "japan.png" }, + { label: "United Kingdom", y: 48.3, gdp: 1.9, url: "uk.png" }, + { label: "India", y: 55.9, gdp: 2.5, url: "india.png" }, + { label: "Russia", y: 69.2, gdp: 5.3, url: "russia.png" }, + { label: "China", y: 215.7, gdp: 1.9, url: "china.png" }, + { label: "United States", y: 611.2, gdp: 3.3, url: "us.png" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html new file mode 100644 index 00000000..d12b9cf5 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html @@ -0,0 +1,58 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + + title:{ + text:"Fortune 500 Companies by Country" + }, + axisX:{ + interval: 1 + }, + axisY2:{ + interlacedColor: "rgba(1,77,101,.2)", + gridColor: "rgba(1,77,101,.1)", + title: "Number of Companies" + }, + data: [{ + type: "bar", + name: "companies", + axisYType: "secondary", + color: "#014D65", + dataPoints: [ + { y: 3, label: "Sweden" }, + { y: 7, label: "Taiwan" }, + { y: 5, label: "Russia" }, + { y: 9, label: "Spain" }, + { y: 7, label: "Brazil" }, + { y: 7, label: "India" }, + { y: 9, label: "Italy" }, + { y: 8, label: "Australia" }, + { y: 11, label: "Canada" }, + { y: 15, label: "South Korea" }, + { y: 12, label: "Netherlands" }, + { y: 15, label: "Switzerland" }, + { y: 25, label: "Britain" }, + { y: 28, label: "Germany" }, + { y: 29, label: "France" }, + { y: 52, label: "Japan" }, + { y: 103, label: "China" }, + { y: 134, label: "US" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html new file mode 100644 index 00000000..982c84d7 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html @@ -0,0 +1,83 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Crude Oil Reserves vs Production, 2016" + }, + axisY: { + title: "Billions of Barrels", + titleFontColor: "#4F81BC", + lineColor: "#4F81BC", + labelFontColor: "#4F81BC", + tickColor: "#4F81BC" + }, + axisY2: { + title: "Millions of Barrels/day", + titleFontColor: "#C0504E", + lineColor: "#C0504E", + labelFontColor: "#C0504E", + tickColor: "#C0504E" + }, + toolTip: { + shared: true + }, + legend: { + cursor:"pointer", + itemclick: toggleDataSeries + }, + data: [{ + type: "column", + name: "Proven Oil Reserves (bn)", + legendText: "Proven Oil Reserves", + showInLegend: true, + dataPoints:[ + { label: "Saudi", y: 266.21 }, + { label: "Venezuela", y: 302.25 }, + { label: "Iran", y: 157.20 }, + { label: "Iraq", y: 148.77 }, + { label: "Kuwait", y: 101.50 }, + { label: "UAE", y: 97.8 } + ] + }, + { + type: "column", + name: "Oil Production (million/day)", + legendText: "Oil Production", + axisYType: "secondary", + showInLegend: true, + dataPoints:[ + { label: "Saudi", y: 10.46 }, + { label: "Venezuela", y: 2.27 }, + { label: "Iran", y: 3.99 }, + { label: "Iraq", y: 4.45 }, + { label: "Kuwait", y: 2.92 }, + { label: "UAE", y: 3.1 } + ] + }] +}); +chart.render(); + +function toggleDataSeries(e) { + if (typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } + else { + e.dataSeries.visible = true; + } + chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html new file mode 100644 index 00000000..db126063 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html @@ -0,0 +1,43 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + theme: "light2", // "light1", "light2", "dark1", "dark2" + title:{ + text: "Top Oil Reserves" + }, + axisY: { + title: "Reserves(MMbbl)" + }, + data: [{ + type: "column", + showInLegend: true, + legendMarkerColor: "grey", + legendText: "MMbbl = one million barrels", + dataPoints: [ + { y: 300878, label: "Venezuela" }, + { y: 266455, label: "Saudi" }, + { y: 169709, label: "Canada" }, + { y: 158400, label: "Iran" }, + { y: 142503, label: "Iraq" }, + { y: 101500, label: "Kuwait" }, + { y: 97800, label: "UAE" }, + { y: 80000, label: "Russia" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html new file mode 100644 index 00000000..69e6bb35 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html @@ -0,0 +1,104 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script type="text/javascript"> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Olympic Medals of all Times (till 2016 Olympics)" + }, + axisY: { + title: "Medals" + }, + legend: { + cursor:"pointer", + itemclick : toggleDataSeries + }, + toolTip: { + shared: true, + content: toolTipFormatter + }, + data: [{ + type: "bar", + showInLegend: true, + name: "Gold", + color: "gold", + dataPoints: [ + { y: 243, label: "Italy" }, + { y: 236, label: "China" }, + { y: 243, label: "France" }, + { y: 273, label: "Great Britain" }, + { y: 269, label: "Germany" }, + { y: 196, label: "Russia" }, + { y: 1118, label: "USA" } + ] + }, + { + type: "bar", + showInLegend: true, + name: "Silver", + color: "silver", + dataPoints: [ + { y: 212, label: "Italy" }, + { y: 186, label: "China" }, + { y: 272, label: "France" }, + { y: 299, label: "Great Britain" }, + { y: 270, label: "Germany" }, + { y: 165, label: "Russia" }, + { y: 896, label: "USA" } + ] + }, + { + type: "bar", + showInLegend: true, + name: "Bronze", + color: "#A57164", + dataPoints: [ + { y: 236, label: "Italy" }, + { y: 172, label: "China" }, + { y: 309, label: "France" }, + { y: 302, label: "Great Britain" }, + { y: 285, label: "Germany" }, + { y: 188, label: "Russia" }, + { y: 788, label: "USA" } + ] + }] +}); +chart.render(); + +function toolTipFormatter(e) { + var str = ""; + var total = 0 ; + var str3; + var str2 ; + for (var i = 0; i < e.entries.length; i++){ + var str1 = "<span style= 'color:"+e.entries[i].dataSeries.color + "'>" + e.entries[i].dataSeries.name + "</span>: <strong>"+ e.entries[i].dataPoint.y + "</strong> <br/>" ; + total = e.entries[i].dataPoint.y + total; + str = str.concat(str1); + } + str2 = "<strong>" + e.entries[0].dataPoint.label + "</strong> <br/>"; + str3 = "<span style = 'color:Tomato'>Total: </span><strong>" + total + "</strong><br/>"; + return (str2.concat(str)).concat(str3); +} + +function toggleDataSeries(e) { + if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } + else { + e.dataSeries.visible = true; + } + chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html new file mode 100644 index 00000000..a90e357d --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html @@ -0,0 +1,89 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + exportEnabled: true, + title:{ + text: "Temperature Comparison of Two Cities" + }, + axisX: { + valueFormatString: "MMM" + }, + axisY: { + includeZero: false, + suffix: " °C" + }, + toolTip: { + shared: true + }, + legend: { + cursor: "pointer", + itemclick: toggleDataSeries + }, + data: [{ + type: "rangeColumn", + name: "City 1", + showInLegend: true, + yValueFormatString: "#0.## °C", + xValueFormatString: "MMM, YYYY", + dataPoints: [ + { x: new Date(2016, 00), y: [08, 20] }, + { x: new Date(2016, 01), y: [10, 24] }, + { x: new Date(2016, 02), y: [16, 29] }, + { x: new Date(2016, 03), y: [21, 36] }, + { x: new Date(2016, 04), y: [26, 39] }, + { x: new Date(2016, 05), y: [22, 39] }, + { x: new Date(2016, 06), y: [20, 35] }, + { x: new Date(2016, 07), y: [20, 34] }, + { x: new Date(2016, 08), y: [20, 34] }, + { x: new Date(2016, 09), y: [19, 33] }, + { x: new Date(2016, 10), y: [13, 28] }, + { x: new Date(2016, 11), y: [09, 23] } + ] + }, + { + type: "rangeColumn", + name: "City 2", + showInLegend: true, + yValueFormatString: "#0.## °C", + xValueFormatString: "MMM, YYYY", + dataPoints: [ + { x: new Date(2016, 00), y: [16, 28] }, + { x: new Date(2016, 01), y: [18, 31] }, + { x: new Date(2016, 02), y: [20, 33] }, + { x: new Date(2016, 03), y: [22, 34] }, + { x: new Date(2016, 04), y: [22, 33] }, + { x: new Date(2016, 05), y: [20, 29] }, + { x: new Date(2016, 06), y: [20, 28] }, + { x: new Date(2016, 07), y: [20, 28] }, + { x: new Date(2016, 08), y: [20, 28] }, + { x: new Date(2016, 09), y: [20, 28] }, + { x: new Date(2016, 10), y: [14, 27] }, + { x: new Date(2016, 11), y: [11, 26] } + ] + }] +}); +chart.render(); + +function toggleDataSeries(e) { + if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else { + e.dataSeries.visible = true; + } + e.chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html new file mode 100644 index 00000000..3e473fbf --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html @@ -0,0 +1,98 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + theme: "light2", // "light1", "light2", "dark1", "dark2" + animationEnabled: true, + title:{ + text: "Sales Comparision of 2 Sellers" + }, + axisX: { + interval: 1 + }, + axisY: { + //prefix: "$", + //suffix: "k", + valueFormatString: "$#,##0,.M" + }, + toolTip: { + shared: true + }, + legend: { + cursor: "pointer", + itemclick: toggleDataSeries + }, + data: [{ + type: "waterfall", + yValueFormatString: "$#,##0,.00M", + name: "Seller 1", + showInLegend: true, + indexLabelOrientation: "vertical", + indexLabelFontColor: "black", + dataPoints: [ + { label: "Initial", y: 7645 }, + { label: "Jan", y: 3312 }, + { label: "Feb", y: 5065 }, + { label: "Mar", y: -2564 }, + { label: "Apr", y: 6004 }, + { label: "May", y: 5324 }, + { label: "Jun", y: -11543 }, + { label: "July", y: 3802 }, + { label: "Aug", y: 6673 }, + { label: "Sep", y: -5997 }, + { label: "Oct", y: 6654 }, + { label: "Nov", y: -4943 }, + { label: "Dec", y: 3324 }, + { label: "Final", isCumulativeSum: true, indexLabel: "{y}" } + ] + }, + { + type: "waterfall", + yValueFormatString: "$#,##0,.00M", + lineDashType: "solid", + name: "Seller 2", + showInLegend: true, + indexLabelOrientation: "vertical", + indexLabelFontColor: "black", + dataPoints: [ + { label: "Initial", y: 4634 }, + { label: "Jan", y: -2002 }, + { label: "Feb", y: 5095 }, + { label: "Mar", y: 2243 }, + { label: "Apr", y: 1984 }, + { label: "May", y: -6724 }, + { label: "Jun", y: 1901 }, + { label: "July", y: 3127 }, + { label: "Aug", y: 3324 }, + { label: "Sep", y: 2324 }, + { label: "Oct", y: -3574 }, + { label: "Nov", y: -1984 }, + { label: "Dec", y: 3594 }, + { label: "Final", isCumulativeSum: true, indexLabel: "{y}" } + ] + }] +}); +chart.render(); + +function toggleDataSeries(e) { + if(typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } + else { + e.dataSeries.visible = true; + } + chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html new file mode 100644 index 00000000..4a8b95f7 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html @@ -0,0 +1,49 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + exportEnabled: true, + title: { + text: "Employees Salary in a Company" + }, + axisX: { + title: "Departments" + }, + axisY: { + includeZero: false, + title: "Salary in USD", + interval: 10, + suffix: "k", + prefix: "$" + }, + data: [{ + type: "rangeBar", + showInLegend: true, + yValueFormatString: "$#0.#K", + indexLabel: "{y[#index]}", + legendText: "Department wise Min and Max Salary", + toolTipContent: "<b>{label}</b>: {y[0]} to {y[1]}", + dataPoints: [ + { x: 10, y:[80, 115], label: "Data Scientist" }, + { x: 20, y:[95, 141], label: "Product Manager" }, + { x: 30, y:[98, 115], label: "Web Developer" }, + { x: 40, y:[90, 160], label: "Software Engineer" }, + { x: 50, y:[100,152], label: "Quality Assurance" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html new file mode 100644 index 00000000..2482015d --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html @@ -0,0 +1,49 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + theme: "light2", // "light1", "light2", "dark1", "dark2" + animationEnabled: true, + title: { + text: "Brent Crude Oil Price - 2016" + }, + axisY: { + title: "Price(USD/bbl)", + prefix: "$", + includeZero: false + }, + data: [{ + type: "rangeColumn", + yValueFormatString: "$#,##0.00", + xValueFormatString: "MMM YYYY", + toolTipContent: "{x}<br>High: {y[0]}<br>Low: {y[1]}", + dataPoints: [ + { x: new Date(2016, 0), y: [27.10, 38.99] }, + { x: new Date(2016, 1), y: [29.92, 37.00] }, + { x: new Date(2016, 2), y: [35.95, 42.54] }, + { x: new Date(2016, 3), y: [37.27, 48.50] }, + { x: new Date(2016, 4), y: [43.33, 50.51] }, + { x: new Date(2016, 5), y: [46.69, 52.86] }, + { x: new Date(2016, 6), y: [41.80, 50.75] }, + { x: new Date(2016, 7), y: [41.51, 51.22] }, + { x: new Date(2016, 8), y: [45.09, 50.14] }, + { x: new Date(2016, 9), y: [47.98, 53.73] }, + { x: new Date(2016, 10), y: [43.57, 50.49] }, + { x: new Date(2016, 11), y: [51.51, 57.89] } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html new file mode 100644 index 00000000..a0fe8f0f --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html @@ -0,0 +1,76 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + theme: "light2", //"light1", "dark1", "dark2" + title:{ + text: "Division of Products Sold in 2nd Quarter" + }, + axisY:{ + interval: 10, + suffix: "%" + }, + toolTip:{ + shared: true + }, + data:[{ + type: "stackedBar100", + toolTipContent: "{label}<br><b>{name}:</b> {y} (#percent%)", + showInLegend: true, + name: "April", + dataPoints: [ + { y: 600, label: "Water Filter" }, + { y: 400, label: "Modern Chair" }, + { y: 120, label: "VOIP Phone" }, + { y: 250, label: "Microwave" }, + { y: 120, label: "Water Filter" }, + { y: 374, label: "Expresso Machine" }, + { y: 350, label: "Lobby Chair" } + ] + }, + { + type: "stackedBar100", + toolTipContent: "{label}<br><b>{name}:</b> {y} (#percent%)", + showInLegend: true, + name: "May", + dataPoints: [ + { y: 400, label: "Water Filter" }, + { y: 500, label: "Modern Chair" }, + { y: 220, label: "VOIP Phone" }, + { y: 350, label: "Microwave" }, + { y: 220, label: "Water Filter" }, + { y: 474, label: "Expresso Machine" }, + { y: 450, label: "Lobby Chair" } + ] + }, + { + type: "stackedBar100", + toolTipContent: "{label}<br><b>{name}:</b> {y} (#percent%)", + showInLegend: true, + name: "June", + dataPoints: [ + { y: 300, label: "Water Filter" }, + { y: 610, label: "Modern Chair" }, + { y: 215, label: "VOIP Phone" }, + { y: 221, label: "Microwave" }, + { y: 75, label: "Water Filter" }, + { y: 310, label: "Expresso Machine" }, + { y: 340, label: "Lobby Chair" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html new file mode 100644 index 00000000..e53506c7 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html @@ -0,0 +1,126 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Evening Sales in a Restaurant" + }, + axisX: { + valueFormatString: "DDD" + }, + axisY: { + prefix: "$" + }, + toolTip: { + shared: true + }, + legend:{ + cursor: "pointer", + itemclick: toggleDataSeries + }, + data: [{ + type: "stackedBar", + name: "Meals", + showInLegend: "true", + xValueFormatString: "DD, MMM", + yValueFormatString: "$#,##0", + dataPoints: [ + { x: new Date(2017, 0, 30), y: 56 }, + { x: new Date(2017, 0, 31), y: 45 }, + { x: new Date(2017, 1, 1), y: 71 }, + { x: new Date(2017, 1, 2), y: 41 }, + { x: new Date(2017, 1, 3), y: 60 }, + { x: new Date(2017, 1, 4), y: 75 }, + { x: new Date(2017, 1, 5), y: 98 } + ] + }, + { + type: "stackedBar", + name: "Snacks", + showInLegend: "true", + xValueFormatString: "DD, MMM", + yValueFormatString: "$#,##0", + dataPoints: [ + { x: new Date(2017, 0, 30), y: 86 }, + { x: new Date(2017, 0, 31), y: 95 }, + { x: new Date(2017, 1, 1), y: 71 }, + { x: new Date(2017, 1, 2), y: 58 }, + { x: new Date(2017, 1, 3), y: 60 }, + { x: new Date(2017, 1, 4), y: 65 }, + { x: new Date(2017, 1, 5), y: 89 } + ] + }, + { + type: "stackedBar", + name: "Drinks", + showInLegend: "true", + xValueFormatString: "DD, MMM", + yValueFormatString: "$#,##0", + dataPoints: [ + { x: new Date(2017, 0, 30), y: 48 }, + { x: new Date(2017, 0, 31), y: 45 }, + { x: new Date(2017, 1, 1), y: 41 }, + { x: new Date(2017, 1, 2), y: 55 }, + { x: new Date(2017, 1, 3), y: 80 }, + { x: new Date(2017, 1, 4), y: 85 }, + { x: new Date(2017, 1, 5), y: 83 } + ] + }, + { + type: "stackedBar", + name: "Dessert", + showInLegend: "true", + xValueFormatString: "DD, MMM", + yValueFormatString: "$#,##0", + dataPoints: [ + { x: new Date(2017, 0, 30), y: 61 }, + { x: new Date(2017, 0, 31), y: 55 }, + { x: new Date(2017, 1, 1), y: 61 }, + { x: new Date(2017, 1, 2), y: 75 }, + { x: new Date(2017, 1, 3), y: 80 }, + { x: new Date(2017, 1, 4), y: 85 }, + { x: new Date(2017, 1, 5), y: 105 } + ] + }, + { + type: "stackedBar", + name: "Takeaway", + showInLegend: "true", + xValueFormatString: "DD, MMM", + yValueFormatString: "$#,##0", + dataPoints: [ + { x: new Date(2017, 0, 30), y: 52 }, + { x: new Date(2017, 0, 31), y: 55 }, + { x: new Date(2017, 1, 1), y: 20 }, + { x: new Date(2017, 1, 2), y: 35 }, + { x: new Date(2017, 1, 3), y: 30 }, + { x: new Date(2017, 1, 4), y: 45 }, + { x: new Date(2017, 1, 5), y: 25 } + ] + }] +}); +chart.render(); + +function toggleDataSeries(e) { + if(typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } + else { + e.dataSeries.visible = true; + } + chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html new file mode 100644 index 00000000..39e9e1b9 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html @@ -0,0 +1,103 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Composition of Internet Traffic in North America" + }, + axisX: { + interval: 1, + intervalType: "year", + valueFormatString: "YYYY" + }, + axisY: { + suffix: "%" + }, + toolTip: { + shared: true + }, + legend: { + reversed: true, + verticalAlign: "center", + horizontalAlign: "right" + }, + data: [{ + type: "stackedColumn100", + name: "Real-Time", + showInLegend: true, + xValueFormatString: "YYYY", + yValueFormatString: "#,##0'%'", + dataPoints: [ + { x: new Date(2010,0), y: 40 }, + { x: new Date(2011,0), y: 50 }, + { x: new Date(2012,0), y: 60 }, + { x: new Date(2013,0), y: 61 }, + { x: new Date(2014,0), y: 63 }, + { x: new Date(2015,0), y: 65 }, + { x: new Date(2016,0), y: 67 } + ] + }, + { + type: "stackedColumn100", + name: "Web Browsing", + showInLegend: true, + xValueFormatString: "YYYY", + yValueFormatString: "#,##0'%'", + dataPoints: [ + { x: new Date(2010,0), y: 28 }, + { x: new Date(2011,0), y: 18 }, + { x: new Date(2012,0), y: 12 }, + { x: new Date(2013,0), y: 10 }, + { x: new Date(2014,0), y: 10 }, + { x: new Date(2015,0), y: 7 }, + { x: new Date(2016,0), y: 5 } + ] + }, + { + type: "stackedColumn100", + name: "File Sharing", + showInLegend: true, + xValueFormatString: "YYYY", + yValueFormatString: "#,##0'%'", + dataPoints: [ + { x: new Date(2010,0), y: 15 }, + { x: new Date(2011,0), y: 12 }, + { x: new Date(2012,0), y: 10 }, + { x: new Date(2013,0), y: 9 }, + { x: new Date(2014,0), y: 7 }, + { x: new Date(2015,0), y: 5 }, + { x: new Date(2016,0), y: 1 } + ] + }, + { + type: "stackedColumn100", + name: "Others", + showInLegend: true, + xValueFormatString: "YYYY", + yValueFormatString: "#,##0'%'", + dataPoints: [ + { x: new Date(2010,0), y: 17 }, + { x: new Date(2011,0), y: 20 }, + { x: new Date(2012,0), y: 18 }, + { x: new Date(2013,0), y: 20 }, + { x: new Date(2014,0), y: 20 }, + { x: new Date(2015,0), y: 23 }, + { x: new Date(2016,0), y: 27 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html new file mode 100644 index 00000000..f377f681 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html @@ -0,0 +1,113 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Google - Consolidated Quarterly Revenue", + fontFamily: "arial black", + fontColor: "#695A42" + }, + axisX: { + interval: 1, + intervalType: "year" + }, + axisY:{ + valueFormatString:"$#0bn", + gridColor: "#B6B1A8", + tickColor: "#B6B1A8" + }, + toolTip: { + shared: true, + content: toolTipContent + }, + data: [{ + type: "stackedColumn", + showInLegend: true, + color: "#696661", + name: "Q1", + dataPoints: [ + { y: 6.75, x: new Date(2010,0) }, + { y: 8.57, x: new Date(2011,0) }, + { y: 10.64, x: new Date(2012,0) }, + { y: 13.97, x: new Date(2013,0) }, + { y: 15.42, x: new Date(2014,0) }, + { y: 17.26, x: new Date(2015,0) }, + { y: 20.26, x: new Date(2016,0) } + ] + }, + { + type: "stackedColumn", + showInLegend: true, + name: "Q2", + color: "#EDCA93", + dataPoints: [ + { y: 6.82, x: new Date(2010,0) }, + { y: 9.02, x: new Date(2011,0) }, + { y: 11.80, x: new Date(2012,0) }, + { y: 14.11, x: new Date(2013,0) }, + { y: 15.96, x: new Date(2014,0) }, + { y: 17.73, x: new Date(2015,0) }, + { y: 21.5, x: new Date(2016,0) } + ] + }, + { + type: "stackedColumn", + showInLegend: true, + name: "Q3", + color: "#695A42", + dataPoints: [ + { y: 7.28, x: new Date(2010,0) }, + { y: 9.72, x: new Date(2011,0) }, + { y: 13.30, x: new Date(2012,0) }, + { y: 14.9, x: new Date(2013,0) }, + { y: 18.10, x: new Date(2014,0) }, + { y: 18.68, x: new Date(2015,0) }, + { y: 22.45, x: new Date(2016,0) } + ] + }, + { + type: "stackedColumn", + showInLegend: true, + name: "Q4", + color: "#B6B1A8", + dataPoints: [ + { y: 8.44, x: new Date(2010,0) }, + { y: 10.58, x: new Date(2011,0) }, + { y: 14.41, x: new Date(2012,0) }, + { y: 16.86, x: new Date(2013,0) }, + { y: 10.64, x: new Date(2014,0) }, + { y: 21.32, x: new Date(2015,0) }, + { y: 26.06, x: new Date(2016,0) } + ] + }] +}); +chart.render(); + +function toolTipContent(e) { + var str = ""; + var total = 0; + var str2, str3; + for (var i = 0; i < e.entries.length; i++){ + var str1 = "<span style= 'color:"+e.entries[i].dataSeries.color + "'> "+e.entries[i].dataSeries.name+"</span>: $<strong>"+e.entries[i].dataPoint.y+"</strong>bn<br/>"; + total = e.entries[i].dataPoint.y + total; + str = str.concat(str1); + } + str2 = "<span style = 'color:DodgerBlue;'><strong>"+(e.entries[0].dataPoint.x).getFullYear()+"</strong></span><br/>"; + total = Math.round(total * 100) / 100; + str3 = "<span style = 'color:Tomato'>Total:</span><strong> $"+total+"</strong>bn<br/>"; + return (str2.concat(str)).concat(str3); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html new file mode 100644 index 00000000..bed3a0ab --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html @@ -0,0 +1,51 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + theme: "light2", //"light1", "light2", "dark1", "dark2" + animationEnabled: true, + title:{ + text: "Income Statement, 2016" + }, + axisX:{ + labelFontSize: 12, + labelMaxWidth: 70 + }, + axisY: { + prefix: "$" + }, + data: [{ + type: "waterfall", + yValueFormatString: "$#,##0", + risingColor: "#5B9BD5", + fallingColor: "#ED7D31", + lineColor: "#222222", + dataPoints: [ + { label: "Net Revenue", y: 240631 }, + { label: "Inventory", y: -115000 }, + { label: "Merchandise", y: -18900 }, + { label: "Other Sales Cost", y: -6990 }, + { label: "Gross Income", isIntermediateSum: true, color: "#C7C7C7" }, + { label: "Staff", y: -27500 }, + { label: "Marketing", y: -12000 }, + { label: "Other Facilities", y: -35100 }, + { label: "Operating Income", isCumulativeSum: true, color: "#C7C7C7" }, + { label: "Taxes", y: -4500 }, + { label: "Net Income", isCumulativeSum: true} + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html new file mode 100644 index 00000000..cf00ff2b --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html @@ -0,0 +1,48 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + theme: "light1", // "light1", "ligh2", "dark1", "dark2" + animationEnabled: true, + title: { + text: "Company Finance" + }, + axisY: { + title: "Amount (in USD)", + prefix: "$", + lineThickness: 0, + suffix: "k" + }, + data: [{ + type: "waterfall", + indexLabel: "{y}", + indexLabelFontColor: "#EEEEEE", + indexLabelPlacement: "inside", + yValueFormatString: "#,##0k", + dataPoints: [ + { label: "Sales", y: 1273 }, + { label: "Service", y: 623 }, + { label: "Total Revenue", isIntermediateSum: true}, + { label: "Research", y: -150 }, + { label: "Marketing", y: -226 }, + { label: "Salaries", y: -632 }, + { label: "Operating Income", isCumulativeSum: true }, + { label: "Taxes", y: -264 }, + { label: "Net Income", isCumulativeSum: true } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html new file mode 100644 index 00000000..7ad45521 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html @@ -0,0 +1,40 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Email Categories", + horizontalAlign: "left" + }, + data: [{ + type: "doughnut", + startAngle: 60, + //innerRadius: 60, + indexLabelFontSize: 17, + indexLabel: "{label} - #percent%", + toolTipContent: "<b>{label}:</b> {y} (#percent%)", + dataPoints: [ + { y: 67, label: "Inbox" }, + { y: 28, label: "Archives" }, + { y: 10, label: "Labels" }, + { y: 7, label: "Drafts"}, + { y: 15, label: "Trash"}, + { y: 6, label: "Spam"} + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html new file mode 100644 index 00000000..7e9b4297 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html @@ -0,0 +1,55 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + theme: "dark2", + exportFileName: "Doughnut Chart", + exportEnabled: true, + animationEnabled: true, + title:{ + text: "Monthly Expense" + }, + legend:{ + cursor: "pointer", + itemclick: explodePie + }, + data: [{ + type: "doughnut", + innerRadius: 90, + showInLegend: true, + toolTipContent: "<b>{name}</b>: ${y} (#percent%)", + indexLabel: "{name} - #percent%", + dataPoints: [ + { y: 450, name: "Food" }, + { y: 120, name: "Insurance" }, + { y: 300, name: "Travelling" }, + { y: 800, name: "Housing" }, + { y: 150, name: "Education" }, + { y: 150, name: "Shopping"}, + { y: 250, name: "Others" } + ] + }] +}); +chart.render(); + +function explodePie (e) { + if(typeof (e.dataSeries.dataPoints[e.dataPointIndex].exploded) === "undefined" || !e.dataSeries.dataPoints[e.dataPointIndex].exploded) { + e.dataSeries.dataPoints[e.dataPointIndex].exploded = true; + } else { + e.dataSeries.dataPoints[e.dataPointIndex].exploded = false; + } + e.chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html new file mode 100644 index 00000000..b5d9fb7b --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html @@ -0,0 +1,52 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Recruitment Analysis - July 2016" + }, + data: [{ + type: "funnel", + indexLabel: "{label} - {y}", + toolTipContent: "<b>{label}</b>: {y} <b>({percentage}%)</b>", + neckWidth: 20, + neckHeight: 0, + valueRepresents: "area", + dataPoints: [ + { y: 3871, label: "Applications" }, + { y: 2496, label: "Screened" }, + { y: 1398, label: "Qualified" }, + { y: 1118, label: "Interviewed" }, + { y: 201, label: "Offers Extended" }, + { y: 151, label: "Filled" } + ] + }] +}); +calculatePercentage(); +chart.render(); + +function calculatePercentage() { + var dataPoint = chart.options.data[0].dataPoints; + var total = dataPoint[0].y; + for(var i = 0; i < dataPoint.length; i++) { + if(i == 0) { + chart.options.data[0].dataPoints[i].percentage = 100; + } else { + chart.options.data[0].dataPoints[i].percentage = ((dataPoint[i].y / total) * 100).toFixed(2); + } + } +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html new file mode 100644 index 00000000..8aa524e4 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html @@ -0,0 +1,52 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + theme: "light2", //"light1", "dark1", "dark2" + title:{ + text: "Sales Analysis - June 2016" + }, + data: [{ + type: "funnel", + indexLabelPlacement: "inside", + indexLabelFontColor: "white", + toolTipContent: "<b>{label}</b>: {y} <b>({percentage}%)</b>", + indexLabel: "{label} ({percentage}%)", + dataPoints: [ + { y: 1400, label: "Leads" }, + { y: 1212, label: "Initial Communication" }, + { y: 1080, label: "Customer Evaluation" }, + { y: 665, label: "Negotiation" }, + { y: 578, label: "Order Received" }, + { y: 549, label: "Payment" } + ] + }] +}); +calculatePercentage(); +chart.render(); + +function calculatePercentage() { + var dataPoint = chart.options.data[0].dataPoints; + var total = dataPoint[0].y; + for(var i = 0; i < dataPoint.length; i++) { + if(i == 0) { + chart.options.data[0].dataPoints[i].percentage = 100; + } else { + chart.options.data[0].dataPoints[i].percentage = ((dataPoint[i].y / total) * 100).toFixed(2); + } + } +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html new file mode 100644 index 00000000..3b475ef7 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html @@ -0,0 +1,54 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + exportEnabled: true, + title:{ + text: "Sales via Advertisement" + }, + data: [{ + type: "funnel", + reversed: true, + showInLegend: true, + legendText: "{label}", + indexLabel: "{label} - {y}", + toolTipContent: "<b>{label}</b>: {y} <b>({percentage}%)</b>", + indexLabelFontColor: "black", + dataPoints: [ + { y: 3500, label: "Impressions" }, + { y: 2130, label: "Clicked" }, + { y: 1950, label: "Free Downloads" }, + { y: 500, label: "Purchase" }, + { y: 300, label: "Renewal" } + ] + }] +}); +calculatePercentage(); +chart.render(); + +function calculatePercentage() { + var dataPoint = chart.options.data[0].dataPoints; + var total = dataPoint[0].y; + for(var i = 0; i < dataPoint.length; i++) { + if(i == 0) { + chart.options.data[0].dataPoints[i].percentage = 100; + } else { + chart.options.data[0].dataPoints[i].percentage = ((dataPoint[i].y / total) * 100).toFixed(2); + } + } +} + +} +</script> +<script src="../../canvasjs.min.js"></script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"> +</div> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html new file mode 100644 index 00000000..770bc9dc --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html @@ -0,0 +1,51 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + theme: "light2", + animationEnabled: true, + title: { + text: "Shares of Electricity Generation by Fuel" + }, + subtitles: [{ + text: "United Kingdom, 2016", + fontSize: 16 + }], + data: [{ + type: "pie", + indexLabelFontSize: 18, + radius: 80, + indexLabel: "{label} - {y}", + yValueFormatString: "###0.0'%'", + click: explodePie, + dataPoints: [ + { y: 42, label: "Gas" }, + { y: 21, label: "Nuclear"}, + { y: 24.5, label: "Renewable" }, + { y: 9, label: "Coal" }, + { y: 3.1, label: "Other Fuels" } + ] + }] +}); +chart.render(); + +function explodePie(e) { + for(var i = 0; i < e.dataSeries.dataPoints.length; i++) { + if(i !== e.dataPointIndex) + e.dataSeries.dataPoints[i].exploded = false; + } +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</div> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html new file mode 100644 index 00000000..e1bd01bb --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html @@ -0,0 +1,52 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + exportEnabled: true, + animationEnabled: true, + title:{ + text: "State Operating Funds" + }, + legend:{ + cursor: "pointer", + itemclick: explodePie + }, + data: [{ + type: "pie", + showInLegend: true, + toolTipContent: "{name}: <strong>{y}%</strong>", + indexLabel: "{name} - {y}%", + dataPoints: [ + { y: 26, name: "School Aid", exploded: true }, + { y: 20, name: "Medical Aid" }, + { y: 5, name: "Debt/Capital" }, + { y: 3, name: "Elected Officials" }, + { y: 7, name: "University" }, + { y: 17, name: "Executive" }, + { y: 22, name: "Other Local Assistance"} + ] + }] +}); +chart.render(); +} + +function explodePie (e) { + if(typeof (e.dataSeries.dataPoints[e.dataPointIndex].exploded) === "undefined" || !e.dataSeries.dataPoints[e.dataPointIndex].exploded) { + e.dataSeries.dataPoints[e.dataPointIndex].exploded = true; + } else { + e.dataSeries.dataPoints[e.dataPointIndex].exploded = false; + } + e.chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html new file mode 100644 index 00000000..7dd8a3e7 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html @@ -0,0 +1,36 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function() { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title: { + text: "Desktop Search Engine Market Share - 2016" + }, + data: [{ + type: "pie", + startAngle: 240, + yValueFormatString: "##0.00'%'", + indexLabel: "{label} {y}", + dataPoints: [ + {y: 79.45, label: "Google"}, + {y: 7.31, label: "Bing"}, + {y: 7.06, label: "Baidu"}, + {y: 4.91, label: "Yahoo"}, + {y: 1.26, label: "Others"} + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html new file mode 100644 index 00000000..c84b2a9a --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html @@ -0,0 +1,39 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + exportEnabled: true, + title:{ + text: "Product Manufacturing Expenses" + }, + data: [{ + type: "pyramid", + indexLabelFontSize: 18, + valueRepresents: "area", + showInLegend: true, + legendText: "{indexLabel}", + toolTipContent: "<b>{indexLabel}:</b> {y}%", + dataPoints: [ + { y: 30, indexLabel: "Research and Design" }, + { y: 30, indexLabel: "Manufacturing" }, + { y: 15, indexLabel: "Marketing" }, + { y: 13, indexLabel: "Shipping" }, + { y: 12, indexLabel: "Retail" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html new file mode 100644 index 00000000..e39048c9 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html @@ -0,0 +1,40 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + exportEnabled: true, + theme: "light2", + title:{ + text: "Advertisement Risk Pyramid" + }, + data: [{ + type: "pyramid", + toolTipContent: "<b>{label}</b>: {y}%", + indexLabelFontColor: "#5A5757", + indexLabelFontSize: 16, + indexLabel: "{label}({y}%)", + indexLabelPlacement: "inside", + dataPoints: [ + { y: 15, label: "Pay Per Click Advertising" }, + { y: 25, label: "Website Sponsorship" }, + { y: 25, label: "Banner Advertising" }, + { y: 40, label: "Interactive Advertising" }, + { y: 60, label: "Traditional Media" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html new file mode 100644 index 00000000..b9053b27 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html @@ -0,0 +1,40 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + exportEnabled: true, + theme: "light1", + title:{ + text: "Software Sales Conversion" + }, + data: [{ + type: "pyramid", + yValueFormatString: "#'%'", + indexLabelFontColor: "black", + indexLabelFontSize: 16, + indexLabel: "{label} - {y}", + //reversed: true, // Reverses the pyramid + dataPoints: [ + { y: 100, label: "Website Visit" }, + { y: 65, label: "Download Page Visit" }, + { y: 45, label: "Downloaded" }, + { y: 32, label: "Interested To Buy" }, + { y: 5, label: "Purchased" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html new file mode 100644 index 00000000..72db3b31 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html @@ -0,0 +1,108 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + theme: "light2", // "light1", "light2", "dark1", "dark2" + exportEnabled: true, + title:{ + text: "Facebook Stock Price - 2016" + }, + subtitles: [{ + text: "All Prices are in USD" + }], + axisX: { + valueFormatString: "MMM" + }, + axisY: { + includeZero:false, + prefix: "$", + title: "Price" + }, + axisY2: { + prefix: "$", + suffix: "bn", + title: "Revenue & Income", + tickLength: 0 + }, + toolTip: { + shared: true + }, + legend: { + reversed: true, + cursor: "pointer", + itemclick: toggleDataSeries + }, + data: [{ + type: "candlestick", + showInLegend: true, + name: "Stock Price", + yValueFormatString: "$#,##0.00", + xValueFormatString: "MMMM", + dataPoints: [ // Y: [Open, High ,Low, Close] + { x: new Date(2016, 0), y: [101.949997, 112.839996, 89.370003, 112.209999] }, + { x: new Date(2016, 1), y: [112.269997, 117.589996, 96.820000, 106.919998] }, + { x: new Date(2016, 2), y: [107.830002, 116.989998, 104.400002, 114.099998] }, + { x: new Date(2016, 3), y: [113.750000, 120.790001, 106.309998, 117.580002] }, + { x: new Date(2016, 4), y: [117.830002, 121.080002, 115.879997, 118.809998] }, + { x: new Date(2016, 5), y: [118.500000, 119.440002, 108.230003, 114.279999] }, + { x: new Date(2016, 6), y: [114.199997, 128.330002, 112.970001, 123.940002] }, + { x: new Date(2016, 7), y: [123.849998, 126.730003, 122.070000, 126.120003] }, + { x: new Date(2016, 8), y: [126.379997, 131.979996, 125.599998, 128.270004] }, + { x: new Date(2016, 9), y: [128.380005, 133.500000, 126.750000, 130.990005] }, + { x: new Date(2016, 10), y: [131.410004, 131.940002, 113.550003, 118.419998] }, + { x: new Date(2016, 11), y: [118.379997, 122.500000, 114.000000, 115.050003] } + ] + }, + { + type: "line", + showInLegend: true, + name: "Net Income", + axisYType: "secondary", + yValueFormatString: "$#,##0.00bn", + xValueFormatString: "MMMM", + dataPoints: [ + { x: new Date(2016, 2), y: 1.510 }, + { x: new Date(2016, 5), y: 2.055 }, + { x: new Date(2016, 8), y: 2.379 }, + { x: new Date(2016, 11), y: 3.568 } + ] + }, + { + type: "line", + showInLegend: true, + name: "Total Revenue", + axisYType: "secondary", + yValueFormatString: "$#,##0.00bn", + xValueFormatString: "MMMM", + dataPoints: [ + { x: new Date(2016, 2), y: 5.382 }, + { x: new Date(2016, 5), y: 6.436 }, + { x: new Date(2016, 8), y: 7.011 }, + { x: new Date(2016, 11), y: 8.809 } + ] + }] +}); +chart.render(); + +function toggleDataSeries(e) { + if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else { + e.dataSeries.visible = true; + } + e.chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html new file mode 100644 index 00000000..35871f64 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html @@ -0,0 +1,90 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + theme: "light2", // "light1", "light2", "dark1", "dark2" + exportEnabled: true, + title:{ + text: "Stock Price: AT&T Vs Verizon for 2016" + }, + axisX: { + valueFormatString: "MMM" + }, + axisY: { + includeZero:false, + prefix: "$", + title: "Price (in USD)" + }, + toolTip: { + shared: true + }, + legend: { + cursor: "pointer", + itemclick: toogleDataSeries + }, + data: [{ + type: "candlestick", + showInLegend: true, + name: "AT&T", + yValueFormatString: "$###0.00", + xValueFormatString: "MMMM YY", + dataPoints: [ + { x: new Date(2016, 00, 01), y: [34.080002, 36.060001, 33.410000, 36.060001] }, + { x: new Date(2016, 01, 01), y: [36.040001, 37.500000, 35.790001, 36.950001] }, + { x: new Date(2016, 02, 01), y: [37.099998, 39.720001, 37.060001, 39.169998] }, + { x: new Date(2016, 03, 01), y: [38.669998, 39.360001, 37.730000, 38.820000] }, + { x: new Date(2016, 04, 01), y: [38.869999, 39.669998, 37.770000, 39.150002] }, + { x: new Date(2016, 05, 01), y: [39.099998, 43.419998, 38.580002, 43.209999] }, + { x: new Date(2016, 06, 01), y: [43.209999, 43.889999, 41.700001, 43.290001] }, + { x: new Date(2016, 07, 01), y: [43.250000, 43.500000, 40.549999, 40.880001] }, + { x: new Date(2016, 08, 01), y: [40.849998, 41.700001, 39.549999, 40.610001] }, + { x: new Date(2016, 09, 01), y: [40.619999, 41.040001, 36.270000, 36.790001] }, + { x: new Date(2016, 10, 01), y: [36.970001, 39.669998, 36.099998, 38.630001] }, + { x: new Date(2016, 11, 01), y: [38.630001, 42.840000, 38.160000, 40.380001] } + ] + }, + { + type: "candlestick", + showInLegend: true, + name: "Verizon", + yValueFormatString: "$###0.00", + dataPoints: [ + { x: new Date(2016, 00, 01), y: [45.669998, 49.990002, 43.790001, 49.970001] }, + { x: new Date(2016, 01, 01), y: [49.939999, 51.380001, 49.270000, 50.730000] }, + { x: new Date(2016, 02, 01), y: [50.990002, 54.369999, 50.980000, 54.080002] }, + { x: new Date(2016, 03, 01), y: [53.320000, 54.490002, 49.470001, 50.939999] }, + { x: new Date(2016, 04, 01), y: [51.220001, 51.700001, 49.049999, 50.900002] }, + { x: new Date(2016, 05, 01), y: [50.869999, 55.919998, 50.119999, 55.840000] }, + { x: new Date(2016, 06, 01), y: [55.849998, 56.950001, 54.439999, 55.410000] }, + { x: new Date(2016, 07, 01), y: [55.580002, 55.820000, 51.900002, 52.330002] }, + { x: new Date(2016, 08, 01), y: [52.139999, 53.880001, 51.020000, 51.980000] }, + { x: new Date(2016, 09, 01), y: [51.840000, 52.139999, 47.580002, 48.099998] }, + { x: new Date(2016, 10, 01), y: [48.320000, 51.200001, 46.009998, 49.900002] }, + { x: new Date(2016, 11, 01), y: [49.799999, 53.900002, 49.310001, 53.380001] } + ] + }] +}); +chart.render(); + +function toogleDataSeries(e) { + if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else { + e.dataSeries.visible = true; + } + e.chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html new file mode 100644 index 00000000..3cca87c6 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html @@ -0,0 +1,58 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> + +var chart = null; +var dps = []; + +window.onload = function() { + +chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + exportEnabled: true, + title: { + text: "Intel Stock Price - January 2017" + }, + axisX: { + valueFormatString: "DD MMM" + }, + axisY: { + title: "Price", + includeZero: false, + prefix: "$" + }, + data: [{ + type: "ohlc", + name: "Intel Stock Price", + color: "#DD7E86", + showInLegend: true, + yValueFormatString: "$##0.00", + xValueType: "dateTime", + dataPoints: dps + }] +}); + +$.getJSON("https://canvasjs.com/data/gallery/javascript/intel-stock.json?callback=?", callback); + +} + +function callback(result) { + for (var i = 0; i < result.dps.length; i++) { + dps.push({ + x: result.dps[i].x, + y: result.dps[i].y + }); + } + chart.render(); +} + +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script type="text/javascript" src="https://canvasjs.com/assets/script/jquery-1.11.1.min.js"></script> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html new file mode 100644 index 00000000..ee555661 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html @@ -0,0 +1,54 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + exportEnabled: true, + exportFileName: "Tesla-StockChart", + title:{ + text: "Tesla Stock Price - 2016" + }, + axisX: { + interval:1, + intervalType: "month", + valueFormatString: "MMM" + }, + axisY: { + includeZero:false, + prefix: "$", + title: "Price (in USD)" + }, + data: [{ + type: "ohlc", + yValueFormatString: "$###0.00", + xValueFormatString: "MMM YYYY", + dataPoints: [ + { x: new Date(2016, 00, 01), y: [230.720001, 231.380005, 182.410004, 191.199997] }, + { x: new Date(2016, 01, 01), y: [188.759995, 199.520004, 141.050003, 191.929993] }, + { x: new Date(2016, 02, 01), y: [194.250000, 239.880005, 181.500000, 229.770004] }, + { x: new Date(2016, 03, 01), y: [244.830002, 269.339996, 233.250000, 240.759995] }, + { x: new Date(2016, 04, 01), y: [241.500000, 243.190002, 203.660004, 223.229996] }, + { x: new Date(2016, 05, 01), y: [221.479996, 240.850006, 187.869995, 212.279999] }, + { x: new Date(2016, 06, 01), y: [206.139999, 235.279999, 206.000000, 234.789993] }, + { x: new Date(2016, 07, 01), y: [235.500000, 236.630005, 208.649994, 212.009995] }, + { x: new Date(2016, 08, 01), y: [209.009995, 211.100006, 193.449997, 204.029999] }, + { x: new Date(2016, 09, 01), y: [212.300003, 215.669998, 192.000000, 197.729996] }, + { x: new Date(2016, 10, 01), y: [198.039993, 199.350006, 178.190002, 189.399994] }, + { x: new Date(2016, 11, 01), y: [188.250000, 223.800003, 180.000000, 213.690002] } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html new file mode 100644 index 00000000..580047d0 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html @@ -0,0 +1,59 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script type="text/javascript"> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Rail Roads Vs Land Area and Population" + }, + axisX: { + title:"Land Area (million sq. km)", + maximum: 17, + minimum: -.1 + }, + axisY:{ + title: "Rail Lines (in km)", + gridColor: "lightgrey", + tickColor: "lightgrey", + lineThickness: 0, + valueFormatString:"#,##0 km,.", + interval: 50000 + }, + data: [{ + type: "bubble", + markerType: "triangle", + toolTipContent: "<b>{label}</b><br/><b>Land Area:</b> {x}mn sq. km <br/><b>Rail Road:</b> {y} km<br/> <b>Population:</b>{z}mn", + dataPoints: [ + { x: 9.14, y: 228513, z:309.34, label:"US" }, + { x: 16.37, y: 85292, z:141.92, label:"Russia" }, + { x: 9.327, y: 66239, z:1337, label:"China" }, + { x: 9.09, y: 58345, z:34.12, label:"Canada" }, + { x: 8.45, y: 29817, z:194.94, label:"Brazil" }, + { x: 7.68, y: 8615, z:22.29, label:"Australia" }, + { x: 2.97, y: 63974, z:1224.61, label:"India" }, + { x: 2.73, y: 25023, z:40.41, label:"Argentina" }, + { x: 1.94, y: 26704, z:113.42, label:"Mexico" }, + { x: 1.21, y: 22051, z:49.99, label:"SA" }, + { x: .547, y: 33608, z:65.07, label:"France" }, + { x: .241, y: 31471, z:62.23, label:"U.K" }, + { x: .348, y: 33708, z:81.77, label:"Germany" }, + { x: .364, y: 20035, z:127.45, label:"Japan" }, + { x: .995, y: 5195, z:81.12, label:"Egypt" }, + { x: .743, y: 5352, z:17.11, label:"Chile" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html new file mode 100644 index 00000000..2670b874 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html @@ -0,0 +1,60 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + zoomEnabled: true, + theme: "light2", + title:{ + text: "Employment in Agriculture Vs Agri-Land and Population" + }, + axisX: { + title:"Employment - Agriculture", + suffix: "%", + minimum: 0, + maximum: 61, + gridThickness: 1 + }, + axisY:{ + title: "Agricultural Land (million sq.km)", + suffix: "mn" + }, + data: [{ + type: "bubble", + toolTipContent: "<b>{name}</b><br/>Employment: {x}% <br/> Agri-Land: {y}mn sq. km<br/> Population: {z}mn", + dataPoints: [ + { x: 39.6, y: 5.225, z:1347, name:"China" }, + { x: 3.3, y: 4.17, z:21.49, name:"Australia" }, + { x: 1.5, y: 4.043, z:304.09, name:"US" }, + { x: 17.4, y: 2.647, z:2.64, name:"Brazil" }, + { x: 8.6, y: 2.154, z:141.95, name:"Russia" }, + { x: 52.98, y: 1.797, z:1190.86, name:"India" }, + { x: 4.3, y: 1.735, z:26.16, name:"Saudi Arabia" }, + { x: 1.21, y: 1.41, z:39.71, name:"Argentina" }, + { x: 5.7, y: .993, z:48.79, name:"SA" }, + { x: 13.1, y: 1.02, z:110.42, name:"Mexico" }, + { x: 2.4, y: .676, z:33.31, name:"Canada" }, + { x: 2.8, y: .293, z:64.37, name:"France" }, + { x: 3.8, y: .46, z:127.70, name:"Japan" }, + { x: 40.3, y: .52, z:234.95, name:"Indonesia" }, + { x: 42.3, y: .197, z:68.26, name:"Thailand" }, + { x: 31.6, y: .35, z:78.12, name:"Egypt" }, + { x: 1.1, y: .176, z:61.39, name:"U.K" }, + { x: 3.7, y: .144, z:59.83, name:"Italy" }, + { x: 1.8, y: .169, z:82.11, name:"Germany" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html new file mode 100644 index 00000000..a0980da9 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html @@ -0,0 +1,69 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Fertility Rate Vs Life Expectancy in Different Countries - 2015" + }, + axisX: { + title:"Life Expectancy (in Years)" + }, + axisY: { + title:"Fertility Rate" + }, + legend:{ + horizontalAlign: "left" + }, + data: [{ + type: "bubble", + showInLegend: true, + legendText: "Size of Bubble Represents Population in Millions", + legendMarkerType: "circle", + legendMarkerColor: "grey", + toolTipContent: "<b>{name}</b><br/>Life Exp: {x} yrs<br/> Fertility Rate: {y}<br/> Population: {z}mn", + dataPoints: [ + //{ x: 68.3, y: 2.4, z: 1309.05 , name: "India"}, + //{ x: 76, y: 1.57, z:1371.22, name: "China"}, + { x: 78.7, y: 1.84, z:320.896, name: "US" }, + { x: 69.1, y: 2.44, z: 258.162, name: "Indonesia" }, + { x: 74.7, y: 1.78, z: 225.962, name: "Brazil" }, + { x: 76.9, y: 2.21, z: 125.890, name: "Mexico" }, + { x: 53, y: 5.59, z: 181.181, name: "Nigeria" }, + { x: 70.9, y: 1.75, z: 144.096, name: "Russia" }, + { x: 83.8, y: 1.46, z:127.141, name: "Japan" }, + { x: 82.5, y: 1.83, z:23.789, name: "Australia" }, + { x: 71.3, y: 3.31, z: 93.778, name: "Egypt" }, + { x: 81.6, y: 1.81, z:65.128, name: "UK" }, + { x: 62.1, y: 4.26, z: 47.236, name: "Kenya" }, + { x: 69.6, y: 4.51, z: 36.115, name: "Iraq" }, + { x: 60.7, y: 4.65, z: 33.736, name: "Afganistan" }, + { x: 52.7, y: 6, z: 27.859, name: "Angola" }, + { x: 68.4, y: 2.94, z: 101.716, name: "Philippines" }, + { x: 70, y: 2.17, z: 28.656, name: "Nepal" }, + { x: 71.2, y: 1.51, z: 45.154, name: "Ukrain" }, + { x: 83.4, y: 1.62, z: 46.447, name: "Spain" }, + { x: 64.6, y: 4.28, z: 99.873, name: "Ethiopia" }, + { x: 74.6, y: 1.5, z: 68.65, name: "Thailand" }, + { x: 74.2, y: 1.88, z: 48.228, name: "Colombia" }, + { x: 74.44, y: 2.34, z: 31.155, name: "Venezuela" }, + { x: 57.4, y: 2.34, z: 55, name: "South Africa" }, + { x: 59.2, y: 3.86, z: 15.77, name: "Zimbabwe" }, + { x: 55.9, y: 4.63, z: 22.834, name: "Cameroon"} + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html new file mode 100644 index 00000000..7a3212ee --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html @@ -0,0 +1,73 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Server Performance" + }, + axisX: { + title:"Server Load (in TPS)" + }, + axisY:{ + title: "Response Time (in ms)" + }, + data: [{ + type: "scatter", + toolTipContent: "<span style='color:#4F81BC '><b>{name}</b></span><br/><b> Load:</b> {x} TPS<br/><b> Response Time:</b></span> {y} ms", + name: "Server Pluto", + showInLegend: true, + dataPoints: [ + { x: 23, y: 330 }, + { x: 28, y: 390 }, + { x: 39, y: 400 }, + { x: 34, y: 430 }, + { x: 24, y: 321 }, + { x: 29, y: 250 }, + { x: 29, y: 370 }, + { x: 23, y: 290 }, + { x: 27, y: 250 }, + { x: 34, y: 380 }, + { x: 36, y: 320 }, + { x: 33, y: 405 }, + { x: 32, y: 453 }, + { x: 21, y: 292 } + ] + }, + { + type: "scatter", + name: "Server Mars", + showInLegend: true, + toolTipContent: "<span style='color:#C0504E '><b>{name}</b></span><br/><b> Load:</b> {x} TPS<br/><b> Response Time:</b></span> {y} ms", + dataPoints: [ + { x: 19, y: 200 }, + { x: 27, y: 300 }, + { x: 35, y: 330 }, + { x: 32, y: 190 }, + { x: 29, y: 189 }, + { x: 22, y: 150 }, + { x: 27, y: 200 }, + { x: 26, y: 190 }, + { x: 24, y: 225 }, + { x: 33, y: 330 }, + { x: 34, y: 250 }, + { x: 30, y: 120 }, + { x: 37, y: 153 }, + { x: 24, y: 196 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html new file mode 100644 index 00000000..eb0a7abd --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html @@ -0,0 +1,129 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title: { + text: "Server CPU Utilization Vs Active Users" + }, + axisX: { + title: "Active Users" + }, + axisY: { + title: "CPU Utilization", + suffix: "%" + }, + legend: { + cursor: "pointer", + itemclick: toggleDataSeries + }, + data: [{ + type: "scatter", + name: "Server 1", + showInLegend: true, + toolTipContent: "<span style='color:#4F81BC '>{name}</span><br>Active Users: {x}<br>CPU Utilization: {y}%", + dataPoints: [ + { x: 100, y: 10 }, + { x: 110, y: 15 }, + { x: 130, y: 17 }, + { x: 140, y: 19 }, + { x: 145, y: 21 }, + { x: 400, y: 25 }, + { x: 430, y: 27 }, + { x: 444, y: 30 }, + { x: 460, y: 29 }, + { x: 490, y: 35 }, + { x: 500, y: 40 }, + { x: 510, y: 50 }, + { x: 600, y: 30 }, + { x: 700, y: 35 }, + { x: 800, y: 40 }, + { x: 900, y: 45 }, + { x: 1000, y: 47 }, + { x: 1200, y: 55 }, + { x: 1230, y: 51 }, + { x: 1300, y: 60 }, + { x: 1330, y: 65 }, + { x: 1400, y: 70 }, + { x: 1450, y: 71 }, + { x: 1500, y: 69 }, + { x: 1530, y: 75 }, + { x: 1590, y: 79 }, + { x: 1600, y: 62 }, + { x: 1620, y: 80 }, + { x: 1640, y: 85 }, + { x: 1700, y: 81 }, + { x: 1790, y: 89 }, + { x: 1800, y: 91 }, + { x: 1950, y: 93 }, + { x: 1980, y: 88 }, + { x: 2000, y: 90 } + ] + }, + { + type: "scatter", + name: "Server 2", + showInLegend: true, + markerType: "triangle", + toolTipContent: "<span style='color:#C0504E '>{name}</span><br>Active Users: {x}<br>CPU Utilization: {y}%", + dataPoints: [ + { x: 100, y: 25 }, + { x: 110, y: 35 }, + { x: 130, y: 35 }, + { x: 140, y: 40 }, + { x: 145, y: 45 }, + { x: 400, y: 42 }, + { x: 430, y: 32 }, + { x: 444, y: 35 }, + { x: 460, y: 43 }, + { x: 490, y: 50 }, + { x: 500, y: 57 }, + { x: 510, y: 67 }, + { x: 600, y: 40 }, + { x: 700, y: 46 }, + { x: 800, y: 50 }, + { x: 900, y: 60 }, + { x: 1000, y: 66 }, + { x: 1200, y: 79 }, + { x: 1230, y: 60 }, + { x: 1300, y: 75 }, + { x: 1330, y: 80 }, + { x: 1400, y: 82 }, + { x: 1450, y: 88 }, + { x: 1500, y: 87 }, + { x: 1530, y: 88 }, + { x: 1590, y: 90 }, + { x: 1600, y: 80 }, + { x: 1620, y: 93 }, + { x: 1640, y: 91 }, + { x: 1700, y: 92 }, + { x: 1790, y: 93 }, + { x: 1800, y: 90 }, + { x: 1950, y: 91 }, + { x: 1980, y: 93 }, + { x: 2000, y: 95 } + ] + }] +}); +chart.render(); + +function toggleDataSeries(e) { + if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else { + e.dataSeries.visible = true; + } + e.chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html new file mode 100644 index 00000000..39a28571 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html @@ -0,0 +1,63 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + zoomEnabled: true, + title:{ + text: "Real Estate Rates" + }, + axisX: { + title:"Area (in sq. ft)", + minimum: 790, + maximum: 2260 + }, + axisY:{ + title: "Price (in USD)", + valueFormatString: "$#,##0k" + }, + data: [{ + type: "scatter", + toolTipContent: "<b>Area: </b>{x} sq.ft<br/><b>Price: </b>${y}k", + dataPoints: [ + { x: 800, y: 350 }, + { x: 900, y: 450 }, + { x: 850, y: 450 }, + { x: 1250, y: 700 }, + { x: 1100, y: 650 }, + { x: 1350, y: 850 }, + { x: 1200, y: 900 }, + { x: 1410, y: 1250 }, + { x: 1250, y: 1100 }, + { x: 1400, y: 1150 }, + { x: 1500, y: 1050 }, + { x: 1330, y: 1120 }, + { x: 1580, y: 1220 }, + { x: 1620, y: 1400 }, + { x: 1250, y: 1450 }, + { x: 1350, y: 1600 }, + { x: 1650, y: 1300 }, + { x: 1700, y: 1620 }, + { x: 1750, y: 1700 }, + { x: 1830, y: 1800 }, + { x: 1900, y: 2000 }, + { x: 2050, y: 2200 }, + { x: 2150, y: 1960 }, + { x: 2250, y: 1990 } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html new file mode 100644 index 00000000..c38a46af --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html @@ -0,0 +1,43 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Annual Salary Range - USA" + }, + axisY: { + title: "Annual Salary (in USD)", + prefix: "$", + interval: 40000 + }, + data: [{ + type: "boxAndWhisker", + upperBoxColor: "#FFC28D", + lowerBoxColor: "#9ECCB8", + color: "black", + yValueFormatString: "$#,##0", + dataPoints: [ + { label: "Registered Nurse", y: [46360, 55320, 82490, 101650, 71000] }, + { label: "Web Developer", y: [83133, 91830, 115828, 128982, 101381] }, + { label: "System Analyst", y: [51910, 60143, 115056, 135450, 85800] }, + { label: "Application Engineer", y: [63364, 71653, 91120, 100556, 80757] }, + { label: "Aerospace Engineer", y: [82725, 94361, 118683, 129191, 107142] }, + { label: "Dentist", y: [116777, 131082, 171679, 194336, 146794] } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html new file mode 100644 index 00000000..c7a16883 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html @@ -0,0 +1,81 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + theme: "light2", // "light1", "light2", "dark1", "dark2" + title:{ + text: "Michelson - Morley Experiment" + }, + subtitles: [{ + text: "Speed = (Given Value + 299,000) km/s", + fontSize: 15 + }], + axisY: { + title: "Readings (in km/s)", + includeZero: false, + tickLength: 0, + gridDashType: "dash", + stripLines: [{ + value: 792.5, + label: "True Speed", + labelFontColor: "#FF0800", + showOnTop: true, + labelAlign: "center", + color: "#FF0800" + }] + }, + legend: { + cursor: "pointer", + itemclick: toggleDataSeries + }, + data: [{ + type: "boxAndWhisker", + toolTipContent: "<span style='color:#6D78AD'>{label}:</span> <br><b>Maximum:</b> {y[3]},<br><b>Q3:</b> {y[2]},<br><b>Median:</b> {y[4]}<br><b>Q1:</b> {y[1]}<br><b>Minimum:</b> {y[0]}", + yValueFormatString: "#####.0 km/s", + dataPoints: [ + { x: 0, label: "Experiment 1", y: [740, 850, 980, 1070, 950] }, + { x: 1, label: "Experiment 2", y: [760, 800, 895, 960, 845] }, + { x: 2, label: "Experiment 3", y: [840, 840, 880, 910, 860] }, + { x: 3, label: "Experiment 4", y: [720, 762.5, 875, 920, 815] }, + { x: 4, label: "Experiment 5", y: [740, 802.5, 870, 950, 810] } + ] + }, + { + type: "scatter", + name: "Outlier Values", + toolTipContent: "<span style='color:#C0504E'>{name}</span>: {y} km/s", + showInLegend: true, + dataPoints: [ + { x: 0, label: "Experiment 1", y: 650 }, + { x: 2, label: "Experiment 3", y: 620 }, + { x: 2, label: "Experiment 3", y: 720 }, + { x: 2, label: "Experiment 3", y: 720 }, + { x: 2, label: "Experiment 3", y: 970 }, + { x: 2, label: "Experiment 3", y: 950 } + ] + }] +}); +chart.render(); + +function toggleDataSeries(e) { + if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else { + e.dataSeries.visible = true; + } + e.chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html new file mode 100644 index 00000000..327b5f6e --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html @@ -0,0 +1,43 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Daily Sleep Statistics of Age Group 12 - 20" + }, + axisX: { + valueFormatString: "DDD" + }, + axisY: { + title: "Sleep Time (in Hours)" + }, + data: [{ + type: "boxAndWhisker", + xValueFormatString: "DDDD", + yValueFormatString: "#0.0 Hours", + dataPoints: [ + { x: new Date(2017, 6, 3), y: [4, 6, 8, 9, 7] }, + { x: new Date(2017, 6, 4), y: [5, 6, 7, 8, 6.5] }, + { x: new Date(2017, 6, 5), y: [4, 5, 7, 8, 6.5] }, + { x: new Date(2017, 6, 6), y: [3, 5, 6, 9, 5.5] }, + { x: new Date(2017, 6, 7), y: [6, 8, 10, 11, 8.5] }, + { x: new Date(2017, 6, 8), y: [5, 7, 9, 12, 7.5] }, + { x: new Date(2017, 6, 9), y: [4, 6, 8, 9, 7] } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html new file mode 100644 index 00000000..1d9c8738 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + theme: "light2", + title: { + text: "Monthly Sales Data" + }, + axisX: { + valueFormatString: "MMM" + }, + axisY: { + prefix: "$", + labelFormatter: addSymbols + }, + toolTip: { + shared: true + }, + legend: { + cursor: "pointer", + itemclick: toggleDataSeries + }, + data: [ + { + type: "column", + name: "Actual Sales", + showInLegend: true, + xValueFormatString: "MMMM YYYY", + yValueFormatString: "$#,##0", + dataPoints: [ + { x: new Date(2016, 0), y: 20000 }, + { x: new Date(2016, 1), y: 30000 }, + { x: new Date(2016, 2), y: 25000 }, + { x: new Date(2016, 3), y: 70000, indexLabel: "High Renewals" }, + { x: new Date(2016, 4), y: 50000 }, + { x: new Date(2016, 5), y: 35000 }, + { x: new Date(2016, 6), y: 30000 }, + { x: new Date(2016, 7), y: 43000 }, + { x: new Date(2016, 8), y: 35000 }, + { x: new Date(2016, 9), y: 30000}, + { x: new Date(2016, 10), y: 40000 }, + { x: new Date(2016, 11), y: 50000 } + ] + }, + { + type: "line", + name: "Expected Sales", + showInLegend: true, + yValueFormatString: "$#,##0", + dataPoints: [ + { x: new Date(2016, 0), y: 40000 }, + { x: new Date(2016, 1), y: 42000 }, + { x: new Date(2016, 2), y: 45000 }, + { x: new Date(2016, 3), y: 45000 }, + { x: new Date(2016, 4), y: 47000 }, + { x: new Date(2016, 5), y: 43000 }, + { x: new Date(2016, 6), y: 42000 }, + { x: new Date(2016, 7), y: 43000 }, + { x: new Date(2016, 8), y: 41000 }, + { x: new Date(2016, 9), y: 45000 }, + { x: new Date(2016, 10), y: 42000 }, + { x: new Date(2016, 11), y: 50000 } + ] + }, + { + type: "area", + name: "Profit", + markerBorderColor: "white", + markerBorderThickness: 2, + showInLegend: true, + yValueFormatString: "$#,##0", + dataPoints: [ + { x: new Date(2016, 0), y: 5000 }, + { x: new Date(2016, 1), y: 7000 }, + { x: new Date(2016, 2), y: 6000}, + { x: new Date(2016, 3), y: 30000 }, + { x: new Date(2016, 4), y: 20000 }, + { x: new Date(2016, 5), y: 15000 }, + { x: new Date(2016, 6), y: 13000 }, + { x: new Date(2016, 7), y: 20000 }, + { x: new Date(2016, 8), y: 15000 }, + { x: new Date(2016, 9), y: 10000}, + { x: new Date(2016, 10), y: 19000 }, + { x: new Date(2016, 11), y: 22000 } + ] + }] +}); +chart.render(); + +function addSymbols(e) { + var suffixes = ["", "K", "M", "B"]; + var order = Math.max(Math.floor(Math.log(e.value) / Math.log(1000)), 0); + + if(order > suffixes.length - 1) + order = suffixes.length - 1; + + var suffix = suffixes[order]; + return CanvasJS.formatNumber(e.value / Math.pow(1000, order)) + suffix; +} + +function toggleDataSeries(e) { + if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else { + e.dataSeries.visible = true; + } + e.chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html new file mode 100644 index 00000000..01b9a6aa --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html @@ -0,0 +1,54 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "QOS - Survey Result" + }, + axisY:{ + title: "Response values", + interval: 10 + }, + toolTip: { + shared: true + }, + data: [{ + type: "bar", + name: "Avg. Score", + toolTipContent: "<b>{label}</b> <br> <span style='color:#4F81BC'>{name}</span>: {y}", + dataPoints: [ + { y: 94, label: "Order Accuracy" }, + { y: 74, label: "Packaging" }, + { y: 80, label: "Quantity" }, + { y: 88, label: "Quality" }, + { y: 76, label: "Delivery" } + ] + }, + { + type: "error", + name: "Variability Range", + toolTipContent: "<span style='color:#C0504E'>{name}</span>: {y[0]} - {y[1]}", + dataPoints: [ + { y: [92, 98], label: "Order Accuracy" }, + { y: [70, 78], label: "Packaging" }, + { y: [78, 85], label: "Quantity" }, + { y: [85, 92], label: "Quality" }, + { y: [72, 78], label: "Delivery" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html new file mode 100644 index 00000000..ddb9026b --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html @@ -0,0 +1,58 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Average Lifespan of a Machinery" + }, + axisY:{ + title: "Lifespan (in Years)" + }, + toolTip: { + shared: true + }, + data: [{ + type: "column", + name: "Avg. Lifespan", + toolTipContent: "{label} <br> <b>{name}:</b> {y} years", + dataPoints: [ + { y: 14, label: "Washing Machine" }, + { y: 16, label: "Refrigerator" }, + { y: 12, label: "Water Heater" }, + { y: 35, label: "Boilers" }, + { y: 11, label: "Television" }, + { y: 18, label: "AC" }, + { y: 9, label: "Dishwasher" } + ] + }, + { + type: "error", + name: "Variability ", + toolTipContent: "<b>{name}:</b> {y[0]} - {y[1]} years", + dataPoints: [ + { y: [13, 16], label:"Washing Machine" }, + { y: [14, 17], label:"Refrigerator" }, + { y: [9, 13], label:"Water Heater" }, + { y: [30, 36], label:"Boilers" }, + { y: [9, 12], label:"Television" }, + { y: [15, 20], label:"AC" }, + { y: [8, 10], label:"Dishwasher" } + + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html new file mode 100644 index 00000000..b6f1cc72 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html @@ -0,0 +1,73 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title:{ + text: "Predicted Rainfall - 2017" + }, + axisX: { + interval: 1 + }, + axisY:{ + title: "Precipitation (in inch)", + suffix: " in", + includeZero: false + }, + toolTip: { + shared: true + }, + data: [{ + type: "line", + name: "Predicted", + toolTipContent: "<b>{label}</b><br><span style='color:#4F81BC'>{name}</span>: {y} in", + markerType: "none", + dataPoints: [ + { y: 3.69, label: "Jan" }, + { y: 3.06, label: "Feb" }, + { y: 4.08, label: "Mar" }, + { y: 4.06, label: "Apr" }, + { y: 4.48, label: "May" }, + { y: 3.45, label: "Jun" }, + { y: 4.17, label: "Jul" }, + { y: 4.05, label: "Aug" }, + { y: 4.05, label: "Sep" }, + { y: 3.5, label: "Oct" }, + { y: 4.0, label: "Nov" }, + { y: 3.86, label: "Dec" } + ] + }, + { + type: "error", + name: "Error Range", + toolTipContent: "<span style='color:#C0504E'>{name}</span>: {y[0]} in - {y[1]} in", + dataPoints: [ + { y: [3.6, 3.8], label: "Jan" }, + { y: [3.0, 3.4], label: "Feb" }, + { y: [3.8, 4.3], label: "Mar" }, + { y: [3.9, 4.2], label: "Apr" }, + { y: [4.3, 4.6], label: "May" }, + { y: [3.3, 3.6], label: "Jun" }, + { y: [4.0, 4.4], label: "Jul" }, + { y: [3.9, 4.3], label: "Aug" }, + { y: [3.8, 4.2], label: "Sep" }, + { y: [3.4, 3.7], label: "Oct" }, + { y: [3.8, 4.2], label: "Nov" }, + { y: [3.7, 4.0], label: "Dec" } + ] + }] +}); +chart.render(); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html new file mode 100644 index 00000000..24674cea --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html @@ -0,0 +1,106 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + animationEnabled: true, + title: { + text: "Lockheed Martin Corp. Stock Price - 2016" + }, + axisX: { + valueFormatString: "MMM" + }, + axisY: { + title: "Price in USD", + includeZero: false, + prefix: "$", + lineThickness: 0 + }, + axisY2: { + title: "Volume", + labelFormatter: addSymbols + }, + toolTip: { + shared: true + }, + legend: { + cursor: "pointer", + itemclick: toggleDataSeries + }, + data: [{ + type: "ohlc", + xValueFormatString: "MMMM 2016", + name: "Stock Price", + showInLegend: true, + yValueFormatString: "$###0.00", + toolTipContent: "<b>{x}</b><br><span style='color:#4F81BC'>{name}</span>: <br>Open: {y[0]}<br>High: {y[1]}<br>Low: {y[2]}<br>Close: {y[3]}<br><b>Adj. Close</b>: {y[4]}", + dataPoints: [ + { x: new Date(2016, 00), y: [214.000000, 221.000000, 200.470001, 211.000000, 202.457352] }, + { x: new Date(2016, 01), y: [209.259995, 220.139999, 203.649994, 215.789993, 207.053421] }, + { x: new Date(2016, 02), y: [216.589996, 223.860001, 210.899994, 221.500000, 214.138062] }, + { x: new Date(2016, 03), y: [219.960007, 234.589996, 219.169998, 232.380005, 224.656464] }, + { x: new Date(2016, 04), y: [232.740005, 245.369995, 231.369995, 236.229996, 228.378494] }, + { x: new Date(2016, 05), y: [236.229996, 248.720001, 234.750000, 248.169998, 241.571869] }, + { x: new Date(2016, 06), y: [248.169998, 263.369995, 247.880005, 252.729996, 246.010620] }, + { x: new Date(2016, 07), y: [252.630005, 266.929993, 238.600006, 242.970001, 236.510101] }, + { x: new Date(2016, 08), y: [243.130005, 247.479996, 235.279999, 239.720001, 234.933273] }, + { x: new Date(2016, 09), y: [238.710007, 252.000000, 228.500000, 246.380005, 241.460281] }, + { x: new Date(2016, 10), y: [247.190002, 269.739990, 236.210007, 265.250000, 259.953491] }, + { x: new Date(2016, 11), y: [265.290009, 269.899994, 245.500000, 249.940002, 246.637146] } + ] + }, + { + type: "line", + axisYType: "secondary", + markerSize: 6, + name: "Volume", + showInLegend: true, + dataPoints: [ + { x: new Date(2016, 00), y: 40421200 }, + { x: new Date(2016, 01), y: 32717100 }, + { x: new Date(2016, 02), y: 24930400 }, + { x: new Date(2016, 03), y: 21628500 }, + { x: new Date(2016, 04), y: 23070900 }, + { x: new Date(2016, 05), y: 28267100 }, + { x: new Date(2016, 06), y: 54446800 }, + { x: new Date(2016, 07), y: 146232200 }, + { x: new Date(2016, 08), y: 30222100 }, + { x: new Date(2016, 09), y: 28914900 }, + { x: new Date(2016, 10), y: 32666300 }, + { x: new Date(2016, 11), y: 34840600 } + ] + }] +}); +chart.render(); + +function addSymbols(e){ + var suffixes = ["", "K", "M", "B"]; + var order = Math.max(Math.floor(Math.log(e.value) / Math.log(1000)), 0); + + if(order > suffixes.length - 1) + order = suffixes.length - 1; + + var suffix = suffixes[order]; + return CanvasJS.formatNumber(e.value / Math.pow(1000, order)) + suffix; +} + +function toggleDataSeries(e) { + if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else { + e.dataSeries.visible = true; + } + e.chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html new file mode 100644 index 00000000..fd35f556 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html @@ -0,0 +1,68 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + title:{ + text: "Customer Complaints" + }, + axisY: { + title: "Number of Reviews", + lineColor: "#4F81BC", + tickColor: "#4F81BC", + labelFontColor: "#4F81BC", + gridThickness: 0 + }, + axisY2: { + title: "Percent", + suffix: "%", + gridThickness: 0, + lineColor: "#C0504E", + tickColor: "#C0504E", + labelFontColor: "#C0504E" + }, + data: [{ + type: "column", + dataPoints: [ + { label: "Parking", y: 3050 }, + { label: "Rude Sales Rep.", y: 1100 }, + { label: "Poor Lighting", y: 850 }, + { label: "Confusing Layout", y: 480 }, + { label: "Limited Size", y: 350 }, + { label: "Faded Clothes", y: 180 }, + { label: "Shrank Clothes", y: 120 } + ] + }] +}); +chart.render(); +createPareto(); + +function createPareto(){ + var dps = []; + var yValue, yTotal = 0, yPercent = 0; + + for(var i = 0; i < chart.data[0].dataPoints.length; i++) + yTotal += chart.data[0].dataPoints[i].y; + + for(var i = 0; i < chart.data[0].dataPoints.length; i++) { + yValue = chart.data[0].dataPoints[i].y; + yPercent += (yValue / yTotal * 100); + dps.push({label: chart.data[0].dataPoints[i].label, y: yPercent }); + } + chart.addTo("data", {type:"line", axisYType: "secondary", yValueFormatString: "0.##'%'", indexLabel: "{y}", indexLabelFontColor: "#C24642", dataPoints: dps}); + chart.axisY[0].set("maximum", yTotal, false); + chart.axisY2[0].set("maximum", 105, false ); + chart.axisY2[0].set("interval", 25 ); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html new file mode 100644 index 00000000..393d6af1 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html @@ -0,0 +1,66 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + title:{ + text: "Popular Fast Food Chains" + }, + axisY: { + title: "Number of Locations", + lineColor: "#4F81BC", + tickColor: "#4F81BC", + labelFontColor: "#4F81BC" + }, + axisY2: { + title: "Percent", + suffix: "%", + lineColor: "#C0504E", + tickColor: "#C0504E", + labelFontColor: "#C0504E" + }, + data: [{ + type: "column", + dataPoints: [ + { label: "Subways", y: 44853 }, + { label: "McDonald", y: 36525 }, + { label: "Starbucks", y: 23768 }, + { label: "KFC", y: 19420 }, + { label: "Pizza Hut", y: 13528 }, + { label: "Dunkin Donuts", y: 11906 } + ] + }] +}); +chart.render(); +createPareto(); + +function createPareto(){ + var dps = []; + var yValue, yTotal = 0, yPercent = 0; + + for(var i = 0; i < chart.data[0].dataPoints.length; i++) + yTotal += chart.data[0].dataPoints[i].y; + + for(var i = 0; i < chart.data[0].dataPoints.length; i++){ + yValue = chart.data[0].dataPoints[i].y; + yPercent += (yValue / yTotal * 100); + dps.push({label: chart.data[0].dataPoints[i].label, y: yPercent}); + } + + chart.addTo("data",{type:"line", yValueFormatString: "0.##'%'", dataPoints: dps}); + chart.data[1].set("axisYType", "secondary", false); + chart.axisY[0].set("maximum", yTotal); + chart.axisY2[0].set("maximum", 100); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html new file mode 100644 index 00000000..be32272f --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html @@ -0,0 +1,108 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + theme: "light2", + title: { + text: "Daily Temperature Variation in Bengaluru - July 2017" + }, + axisX: { + valueFormatString: "DD MMM" + }, + axisY: { + title: "Temperature (in °C)" + }, + toolTip: { + shared: true + }, + legend: { + dockInsidePlotArea: true, + cursor: "pointer", + itemclick: toggleDataSeries + }, + data: [{ + type: "rangeArea", + markerSize: 0, + name: "Temperature Range", + showInLegend: true, + toolTipContent: "{x}<br><span style='color:#6D77AC'>{name}</span><br>Min: {y[1]} °C<br>Max: {y[0]} °C", + dataPoints: [ + { x: new Date(2017, 6, 1), y: [30, 19] }, + { x: new Date(2017, 6, 2), y: [30, 21] }, + { x: new Date(2017, 6, 3), y: [29, 21] }, + { x: new Date(2017, 6, 4), y: [28, 20] }, + { x: new Date(2017, 6, 5), y: [29, 20] }, + { x: new Date(2017, 6, 6), y: [29, 20] }, + { x: new Date(2017, 6, 7), y: [27, 21] }, + { x: new Date(2017, 6, 8), y: [26, 20] }, + { x: new Date(2017, 6, 9), y: [30, 20] }, + { x: new Date(2017, 6, 10), y: [30, 21] }, + { x: new Date(2017, 6, 11), y: [30, 21] }, + { x: new Date(2017, 6, 12),y: [29, 21] }, + { x: new Date(2017, 6, 13),y: [27, 20] }, + { x: new Date(2017, 6, 14),y: [27, 20] }, + { x: new Date(2017, 6, 15),y: [25, 20] }, + { x: new Date(2017, 6, 16),y: [29, 20] }, + { x: new Date(2017, 6, 17),y: [28, 20] }, + { x: new Date(2017, 6, 18),y: [27, 21] }, + { x: new Date(2017, 6, 19),y: [27, 21] }, + { x: new Date(2017, 6, 20),y: [29, 21] }, + { x: new Date(2017, 6, 21),y: [29, 20] }, + { x: new Date(2017, 6, 22),y: [31, 20] }, + { x: new Date(2017, 6, 23),y: [30, 21] }, + { x: new Date(2017, 6, 24),y: [30, 20] }, + { x: new Date(2017, 6, 25),y: [31, 21] }, + { x: new Date(2017, 6, 26),y: [30, 21] }, + { x: new Date(2017, 6, 27),y: [31, 21] }, + { x: new Date(2017, 6, 28),y: [31, 21] }, + { x: new Date(2017, 6, 29),y: [31, 21] }, + { x: new Date(2017, 6, 30), y: [31, 21] }, + { x: new Date(2017, 6, 31), y: [31, 22] } + ] + }] +}); +chart.render(); + +addAverages(); + +function addAverages() { + var dps = []; + for(var i = 0; i < chart.options.data[0].dataPoints.length; i++) { + dps.push({ + x: chart.options.data[0].dataPoints[i].x, + y: (chart.options.data[0].dataPoints[i].y[0] + chart.options.data[0].dataPoints[i].y[1]) / 2 + }); + } + chart.options.data.push({ + type: "line", + name: "Average", + showInLegend: true, + markerType: "triangle", + markerSize: 0, + yValueFormatString: "##.0 °C", + dataPoints: dps + }); + chart.render(); +} + +function toggleDataSeries(e) { + if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } else { + e.dataSeries.visible = true; + } + e.chart.render(); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html new file mode 100644 index 00000000..392bb3c1 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html @@ -0,0 +1,54 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var chart = new CanvasJS.Chart("chartContainer", { + title: { + text: "Temperature of Each Boiler" + }, + axisY: { + title: "Temperature (°C)", + suffix: " °C" + }, + data: [{ + type: "column", + yValueFormatString: "#,### °C", + indexLabel: "{y}", + dataPoints: [ + { label: "boiler1", y: 206 }, + { label: "boiler2", y: 163 }, + { label: "boiler3", y: 154 }, + { label: "boiler4", y: 176 }, + { label: "boiler5", y: 184 }, + { label: "boiler6", y: 122 } + ] + }] +}); + +function updateChart() { + var boilerColor, deltaY, yVal; + var dps = chart.options.data[0].dataPoints; + for (var i = 0; i < dps.length; i++) { + deltaY = Math.round(2 + Math.random() *(-2-2)); + yVal = deltaY + dps[i].y > 0 ? dps[i].y + deltaY : 0; + boilerColor = yVal > 200 ? "#FF2500" : yVal >= 170 ? "#FF6000" : yVal < 170 ? "#6B8E23 " : null; + dps[i] = {label: "Boiler "+(i+1) , y: yVal, color: boilerColor}; + } + chart.options.data[0].dataPoints = dps; + chart.render(); +}; +updateChart(); + +setInterval(function() {updateChart()}, 500); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html new file mode 100644 index 00000000..988c2219 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html @@ -0,0 +1,58 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function() { + +var dataPoints = []; + +var chart = new CanvasJS.Chart("chartContainer", { + theme: "light2", + title: { + text: "Live Data" + }, + data: [{ + type: "line", + dataPoints: dataPoints + }] +}); +updateData(); + +// Initial Values +var xValue = 0; +var yValue = 10; +var newDataCount = 6; + +function addData(data) { + if(newDataCount != 1) { + $.each(data, function(key, value) { + dataPoints.push({x: value[0], y: parseInt(value[1])}); + xValue++; + yValue = parseInt(value[1]); + }); + } else { + //dataPoints.shift(); + dataPoints.push({x: data[0][0], y: parseInt(data[0][1])}); + xValue++; + yValue = parseInt(data[0][1]); + } + + newDataCount = 1; + chart.render(); + setTimeout(updateData, 500); +} + +function updateData() { + $.getJSON("https://canvasjs.com/services/data/datapoints.php?xstart="+xValue+"&ystart="+yValue+"&length="+newDataCount+"type=json&callback=?", addData); +} + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="https://canvasjs.com/assets/script/jquery-1.11.1.min.js"></script> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html new file mode 100644 index 00000000..2dbd00d6 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html @@ -0,0 +1,113 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var dataPoints1 = []; +var dataPoints2 = []; + +var chart = new CanvasJS.Chart("chartContainer", { + zoomEnabled: true, + title: { + text: "Share Value of Two Companies" + }, + axisX: { + title: "chart updates every 3 secs" + }, + axisY:{ + prefix: "$", + includeZero: false + }, + toolTip: { + shared: true + }, + legend: { + cursor:"pointer", + verticalAlign: "top", + fontSize: 22, + fontColor: "dimGrey", + itemclick : toggleDataSeries + }, + data: [{ + type: "line", + xValueType: "dateTime", + yValueFormatString: "$####.00", + xValueFormatString: "hh:mm:ss TT", + showInLegend: true, + name: "Company A", + dataPoints: dataPoints1 + }, + { + type: "line", + xValueType: "dateTime", + yValueFormatString: "$####.00", + showInLegend: true, + name: "Company B" , + dataPoints: dataPoints2 + }] +}); + +function toggleDataSeries(e) { + if (typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) { + e.dataSeries.visible = false; + } + else { + e.dataSeries.visible = true; + } + chart.render(); +} + +var updateInterval = 3000; +// initial value +var yValue1 = 600; +var yValue2 = 605; + +var time = new Date; +// starting at 9.30 am +time.setHours(9); +time.setMinutes(30); +time.setSeconds(00); +time.setMilliseconds(00); + +function updateChart(count) { + count = count || 1; + var deltaY1, deltaY2; + for (var i = 0; i < count; i++) { + time.setTime(time.getTime()+ updateInterval); + deltaY1 = .5 + Math.random() *(-.5-.5); + deltaY2 = .5 + Math.random() *(-.5-.5); + + // adding random value and rounding it to two digits. + yValue1 = Math.round((yValue1 + deltaY1)*100)/100; + yValue2 = Math.round((yValue2 + deltaY2)*100)/100; + + // pushing the new values + dataPoints1.push({ + x: time.getTime(), + y: yValue1 + }); + dataPoints2.push({ + x: time.getTime(), + y: yValue2 + }); + } + + // updating legend text with updated with y Value + chart.options.data[0].legendText = " Company A $" + yValue1; + chart.options.data[1].legendText = " Company B $" + yValue2; + chart.render(); +} +// generates first set of dataPoints +updateChart(100); +setInterval(function(){updateChart()}, updateInterval); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="../../canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html new file mode 100644 index 00000000..d6d42070 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html @@ -0,0 +1,42 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +//Better to construct options first and then pass it as a parameter +var options = { + exportEnabled: true, + animationEnabled: true, + title: { + text: "jQuery Spline Area Chart" + }, + data: [ + { + type: "splineArea", //change it to line, area, bar, pie, etc + dataPoints: [ + { y: 10 }, + { y: 6 }, + { y: 14 }, + { y: 12 }, + { y: 19 }, + { y: 14 }, + { y: 26 }, + { y: 10 }, + { y: 22 } + ] + } + ] +}; +$("#chartContainer").CanvasJSChart(options); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="https://canvasjs.com/assets/script/jquery-1.11.1.min.js"></script> +<script src="../../jquery.canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html new file mode 100644 index 00000000..c139f406 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html @@ -0,0 +1,49 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +var limit = 10000; //increase number of dataPoints by increasing the limit +var y = 100; +var data = []; +var dataSeries = { type: "line" }; +var dataPoints = []; +for (var i = 0; i < limit; i += 1) { + y += Math.round(Math.random() * 10 - 5); + dataPoints.push({ + x: i, + y: y + }); +} +dataSeries.dataPoints = dataPoints; +data.push(dataSeries); + +//Better to construct options first and then pass it as a parameter +var options = { + zoomEnabled: true, + animationEnabled: true, + title: { + text: "Try Zooming - Panning" + }, + axisX: { + labelAngle: 30 + }, + axisY: { + includeZero: false + }, + data: data // random data +}; + +$("#chartContainer").CanvasJSChart(options); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="https://canvasjs.com/assets/script/jquery-1.11.1.min.js"></script> +<script src="../../jquery.canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html new file mode 100644 index 00000000..31523b13 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html @@ -0,0 +1,55 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<link href="https://canvasjs.com/assets/css/jquery-ui.1.11.2.min.css" rel="stylesheet" /> +<script> +window.onload = function () { + +// Construct options first and then pass it as a parameter +var options1 = { + animationEnabled: true, + title: { + text: "Chart inside a jQuery Resizable Element" + }, + data: [{ + type: "column", //change it to line, area, bar, pie, etc + legendText: "Try Resizing with the handle to the bottom right", + showInLegend: true, + dataPoints: [ + { y: 10 }, + { y: 6 }, + { y: 14 }, + { y: 12 }, + { y: 19 }, + { y: 14 }, + { y: 26 }, + { y: 10 }, + { y: 22 } + ] + }] +}; + +$("#resizable").resizable({ + create: function (event, ui) { + //Create chart. + $("#chartContainer1").CanvasJSChart(options1); + }, + resize: function (event, ui) { + //Update chart size according to its container size. + $("#chartContainer1").CanvasJSChart().render(); + } +}); + +} +</script> +</head> +<body> +<div id="resizable" style="height: 370px;border:1px solid gray;"> + <div id="chartContainer1" style="height: 100%; width: 100%;"></div> +</div> +<script src="https://canvasjs.com/assets/script/jquery-1.11.1.min.js"></script> +<script src="https://canvasjs.com/assets/script/jquery-ui.1.11.2.min.js"></script> +<script src="../../jquery.canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html new file mode 100644 index 00000000..b35ebf4b --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html @@ -0,0 +1,98 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<link href="https://canvasjs.com/assets/css/jquery-ui.1.11.2.min.css" rel="stylesheet" /> +<style> + .ui-tabs-anchor { + outline: none; + } +</style> +<script> +window.onload = function() { +var options1 = { + animationEnabled: true, + title: { + text: "Spline Chart using jQuery Plugin" + }, + axisX: { + labelFontSize: 14 + }, + axisY: { + labelFontSize: 14 + }, + data: [{ + type: "spline", //change it to line, area, bar, pie, etc + dataPoints: [ + { y: 10 }, + { y: 6 }, + { y: 14 }, + { y: 12 }, + { y: 19 }, + { y: 14 }, + { y: 26 }, + { y: 10 }, + { y: 22 } + ] + }] +}; + +var options2 = { + title: { + text: "Spline Area Chart using jQuery Plugin" + }, + axisX: { + labelFontSize: 14 + }, + axisY: { + labelFontSize: 14 + }, + data: [{ + type: "splineArea", //change it to line, area, bar, pie, etc + dataPoints: [ + { y: 10 }, + { y: 6 }, + { y: 14 }, + { y: 12 }, + { y: 19 }, + { y: 14 }, + { y: 26 }, + { y: 10 }, + { y: 22 } + ] + }] +}; + +$("#tabs").tabs({ + create: function (event, ui) { + //Render Charts after tabs have been created. + $("#chartContainer1").CanvasJSChart(options1); + $("#chartContainer2").CanvasJSChart(options2); + }, + activate: function (event, ui) { + //Updates the chart to its container size if it has changed. + ui.newPanel.children().first().CanvasJSChart().render(); + } +}); + +} +</script> +</head> +<body> +<div id="tabs" style="height: 360px"> +<ul> +<li ><a href="#tabs-1" style="font-size: 12px">Spline</a></li> +<li ><a href="#tabs-2" style="font-size: 12px">Spline Area</a></li> +</ul> +<div id="tabs-1" style="height: 300px"> +<div id="chartContainer1" style="height: 300px; width: 100%;"></div> +</div> +<div id="tabs-2" style="height: 300px"> +<div id="chartContainer2" style="height: 300px; width: 100%;"></div> +</div> +</div> +<script src="https://canvasjs.com/assets/script/jquery-1.11.1.min.js"></script> +<script src="https://canvasjs.com/assets/script/jquery-ui.1.11.2.min.js"></script> +<script src="../../jquery.canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html new file mode 100644 index 00000000..a3e82d02 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html @@ -0,0 +1,41 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="UTF-8"> +<script> +window.onload = function () { + +//Better to construct options first and then pass it as a parameter +var options = { + title: { + text: "Spline Chart with Export as Image" + }, + animationEnabled: true, + exportEnabled: true, + data: [ + { + type: "spline", //change it to line, area, column, pie, etc + dataPoints: [ + { x: 10, y: 10 }, + { x: 20, y: 12 }, + { x: 30, y: 8 }, + { x: 40, y: 14 }, + { x: 50, y: 6 }, + { x: 60, y: 24 }, + { x: 70, y: -4 }, + { x: 80, y: 10 } + ] + } + ] +}; +$("#chartContainer").CanvasJSChart(options); + +} +</script> +</head> +<body> +<div id="chartContainer" style="height: 370px; max-width: 920px; margin: 0px auto;"></div> +<script src="https://canvasjs.com/assets/script/jquery-1.11.1.min.js"></script> +<script src="../../jquery.canvasjs.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/instruction.txt b/SRIP/Libraries/canvasjs-2.3.1/instruction.txt new file mode 100644 index 00000000..93eb448f --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/instruction.txt @@ -0,0 +1,4 @@ +For standalone version include canvasjs.min.js +For jQuery version include jquery.canvasjs.min.js + +** DO NOT include both the files ** \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js b/SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js new file mode 100644 index 00000000..8785b495 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js @@ -0,0 +1,922 @@ +/* + CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ + Copyright 2018 fenopix + + --------------------- License Information -------------------- + CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. + https://canvasjs.com/license/ + +*/ +/*eslint-disable*/ +/*jshint ignore:start*/ +(function(){function qa(k,p){k.prototype=eb(p.prototype);k.prototype.constructor=k;k.base=p.prototype}function eb(k){function p(){}p.prototype=k;return new p}function Ya(k,p,D){"millisecond"===D?k.setMilliseconds(k.getMilliseconds()+1*p):"second"===D?k.setSeconds(k.getSeconds()+1*p):"minute"===D?k.setMinutes(k.getMinutes()+1*p):"hour"===D?k.setHours(k.getHours()+1*p):"day"===D?k.setDate(k.getDate()+1*p):"week"===D?k.setDate(k.getDate()+7*p):"month"===D?k.setMonth(k.getMonth()+1*p):"year"===D&&k.setFullYear(k.getFullYear()+ +1*p);return k}function $(k,p){var D=!1;0>k&&(D=!0,k*=-1);k=""+k;for(p=p?p:1;k.length<p;)k="0"+k;return D?"-"+k:k}function Ia(k){if(!k)return k;k=k.replace(/^\s\s*/,"");for(var p=/\s/,D=k.length;p.test(k.charAt(--D)););return k.slice(0,D+1)}function Ea(k){k.roundRect=function(k,D,r,u,H,F,z,v){z&&(this.fillStyle=z);v&&(this.strokeStyle=v);"undefined"===typeof H&&(H=5);this.lineWidth=F;this.beginPath();this.moveTo(k+H,D);this.lineTo(k+r-H,D);this.quadraticCurveTo(k+r,D,k+r,D+H);this.lineTo(k+r,D+u-H); +this.quadraticCurveTo(k+r,D+u,k+r-H,D+u);this.lineTo(k+H,D+u);this.quadraticCurveTo(k,D+u,k,D+u-H);this.lineTo(k,D+H);this.quadraticCurveTo(k,D,k+H,D);this.closePath();z&&this.fill();v&&0<F&&this.stroke()}}function Sa(k,p){return k-p}function Ta(k,p,D){if(k&&p&&D){D=D+"."+p;var r="image/"+p;k=k.toDataURL(r);var u=!1,H=document.createElement("a");H.download=D;H.href=k;if("undefined"!==typeof Blob&&new Blob){for(var F=k.replace(/^data:[a-z\/]*;base64,/,""),F=atob(F),z=new ArrayBuffer(F.length),z=new Uint8Array(z), +v=0;v<F.length;v++)z[v]=F.charCodeAt(v);p=new Blob([z.buffer],{type:"image/"+p});try{window.navigator.msSaveBlob(p,D),u=!0}catch(L){H.dataset.downloadurl=[r,H.download,H.href].join(":"),H.href=window.URL.createObjectURL(p)}}if(!u)try{event=document.createEvent("MouseEvents"),event.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),H.dispatchEvent?H.dispatchEvent(event):H.fireEvent&&H.fireEvent("onclick")}catch(E){p=window.open(),p.document.write("<img src='"+k+"'></img><div>Please right click on the image and save it to your device</div>"), +p.document.close()}}}function N(k){var p=((k&16711680)>>16).toString(16),D=((k&65280)>>8).toString(16);k=((k&255)>>0).toString(16);p=2>p.length?"0"+p:p;D=2>D.length?"0"+D:D;k=2>k.length?"0"+k:k;return"#"+p+D+k}function fb(k,p){var D=this.length>>>0,r=Number(p)||0,r=0>r?Math.ceil(r):Math.floor(r);for(0>r&&(r+=D);r<D;r++)if(r in this&&this[r]===k)return r;return-1}function u(k){return null===k||"undefined"===typeof k}function Fa(k){k.indexOf||(k.indexOf=fb);return k}function gb(k){if(U.fSDec)k[ja("`eeDwdouMhrudods")](ja("e`u`@ohl`uhnoHuds`uhnoDoe"), +function(){U._fTWm&&U._fTWm(k)})}function Za(k,p,D){D=D||"normal";var r=k+"_"+p+"_"+D,u=$a[r];if(isNaN(u)){try{k="position:absolute; left:0px; top:-20000px; padding:0px;margin:0px;border:none;white-space:pre;line-height:normal;font-family:"+k+"; font-size:"+p+"px; font-weight:"+D+";";if(!xa){var H=document.body;xa=document.createElement("span");xa.innerHTML="";var F=document.createTextNode("Mpgyi");xa.appendChild(F);H.appendChild(xa)}xa.style.display="";xa.setAttribute("style",k);u=Math.round(xa.offsetHeight); +xa.style.display="none"}catch(z){u=Math.ceil(1.1*p)}u=Math.max(u,p);$a[r]=u}return u}function R(k,p){var D=[];if(D={solid:[],shortDash:[3,1],shortDot:[1,1],shortDashDot:[3,1,1,1],shortDashDotDot:[3,1,1,1,1,1],dot:[1,2],dash:[4,2],dashDot:[4,2,1,2],longDash:[8,2],longDashDot:[8,2,1,2],longDashDotDot:[8,2,1,2,1,2]}[k||"solid"])for(var r=0;r<D.length;r++)D[r]*=p;else D=[];return D}function O(k,p,D,r,u){r=r||[];u=u||!1;r.push([k,p,D,u]);return k.addEventListener?(k.addEventListener(p,D,u),D):k.attachEvent? +(r=function(p){p=p||window.event;p.preventDefault=p.preventDefault||function(){p.returnValue=!1};p.stopPropagation=p.stopPropagation||function(){p.cancelBubble=!0};D.call(k,p)},k.attachEvent("on"+p,r),r):!1}function ab(k,p,D){k*=W;p*=W;k=D.getImageData(k,p,2,2).data;p=!0;for(D=0;4>D;D++)if(k[D]!==k[D+4]|k[D]!==k[D+8]|k[D]!==k[D+12]){p=!1;break}return p?k[0]<<16|k[1]<<8|k[2]:0}function na(k,p,D){return k in p?p[k]:D[k]}function Oa(k,p,D){if(r&&bb){var u=k.getContext("2d");Pa=u.webkitBackingStorePixelRatio|| +u.mozBackingStorePixelRatio||u.msBackingStorePixelRatio||u.oBackingStorePixelRatio||u.backingStorePixelRatio||1;W=Ua/Pa;k.width=p*W;k.height=D*W;Ua!==Pa&&(k.style.width=p+"px",k.style.height=D+"px",u.scale(W,W))}else k.width=p,k.height=D}function hb(k){if(!ib){var p=!1,D=!1;"undefined"===typeof ra.Chart.creditHref?(k.creditHref=ja("iuuqr;..b`ow`rkr/bnl."),k.creditText=ja("B`ow`rKR/bnl")):(p=k.updateOption("creditText"),D=k.updateOption("creditHref"));if(k.creditHref&&k.creditText){k._creditLink|| +(k._creditLink=document.createElement("a"),k._creditLink.setAttribute("class","canvasjs-chart-credit"),k._creditLink.setAttribute("title","JavaScript Charts"),k._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:2px;top:"+(k.height-14)+"px;color:dimgrey;text-decoration:none;font-size:11px;font-family: Calibri, Lucida Grande, Lucida Sans Unicode, Arial, sans-serif"),k._creditLink.setAttribute("tabIndex",-1),k._creditLink.setAttribute("target","_blank"));if(0===k.renderCount|| +p||D)k._creditLink.setAttribute("href",k.creditHref),k._creditLink.innerHTML=k.creditText;k._creditLink&&k.creditHref&&k.creditText?(k._creditLink.parentElement||k._canvasJSContainer.appendChild(k._creditLink),k._creditLink.style.top=k.height-14+"px"):k._creditLink.parentElement&&k._canvasJSContainer.removeChild(k._creditLink)}}}function ta(k,p){Ja&&(this.canvasCount|=0,window.console.log(++this.canvasCount));var D=document.createElement("canvas");D.setAttribute("class","canvasjs-chart-canvas");Oa(D, +k,p);r||"undefined"===typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(D);return D}function sa(k,p,D){for(var r in D)p.style[r]=D[r]}function ua(k,p,D){p.getAttribute("state")||(p.style.backgroundColor=k.toolbar.backgroundColor,p.style.color=k.toolbar.fontColor,p.style.border="none",sa(k,p,{WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",userSelect:"none"}));p.getAttribute("state")!==D&&(p.setAttribute("state",D),p.setAttribute("type","button"),sa(k,p,{padding:"5px 12px", +cursor:"pointer","float":"left",width:"40px",height:"25px",outline:"0px",verticalAlign:"baseline",lineHeight:"0"}),p.setAttribute("title",k._cultureInfo[D+"Text"]),p.innerHTML="<img style='height:95%; pointer-events: none;' src='"+jb[D].image+"' alt='"+k._cultureInfo[D+"Text"]+"' />")}function Qa(){for(var k=null,p=0;p<arguments.length;p++)k=arguments[p],k.style&&(k.style.display="inline")}function va(){for(var k=null,p=0;p<arguments.length;p++)(k=arguments[p])&&k.style&&(k.style.display="none")} +function V(k,p,D,r,v){this._defaultsKey=k;this._themeOptionsKey=p;this._index=r;this.parent=v;this._eventListeners=[];k={};this.theme&&u(p)&&u(r)?k=u(ya[this.theme])?ya.light1:ya[this.theme]:this.parent&&(this.parent.themeOptions&&this.parent.themeOptions[p])&&(null===r?k=this.parent.themeOptions[p]:0<this.parent.themeOptions[p].length&&(r=Math.min(this.parent.themeOptions[p].length-1,r),k=this.parent.themeOptions[p][r]));this.themeOptions=k;this.options=D?D:{_isPlaceholder:!0};this.setOptions(this.options, +k)}function Ga(k,p,r,u,v){"undefined"===typeof v&&(v=0);this._padding=v;this._x1=k;this._y1=p;this._x2=r;this._y2=u;this._rightOccupied=this._leftOccupied=this._bottomOccupied=this._topOccupied=this._padding}function ka(k,p){ka.base.constructor.call(this,"TextBlock",null,p,null,null);this.ctx=k;this._isDirty=!0;this._wrappedText=null;this._initialize()}function Va(k,p){Va.base.constructor.call(this,"Toolbar","toolbar",p,null,k);this.chart=k;this.canvas=k.canvas;this.ctx=this.chart.ctx;this.optionsName= +"toolbar"}function Aa(k,p){Aa.base.constructor.call(this,"Title","title",p,null,k);this.chart=k;this.canvas=k.canvas;this.ctx=this.chart.ctx;this.optionsName="title";if(u(this.options.margin)&&k.options.subtitles)for(var r=k.options.subtitles,za=0;za<r.length;za++)if((u(r[za].horizontalAlign)&&"center"===this.horizontalAlign||r[za].horizontalAlign===this.horizontalAlign)&&(u(r[za].verticalAlign)&&"top"===this.verticalAlign||r[za].verticalAlign===this.verticalAlign)&&!r[za].dockInsidePlotArea===!this.dockInsidePlotArea){this.margin= +0;break}"undefined"===typeof this.options.fontSize&&(this.fontSize=this.chart.getAutoFontSize(this.fontSize));this.height=this.width=null;this.bounds={x1:null,y1:null,x2:null,y2:null}}function Ka(k,p,r){Ka.base.constructor.call(this,"Subtitle","subtitles",p,r,k);this.chart=k;this.canvas=k.canvas;this.ctx=this.chart.ctx;this.optionsName="subtitles";this.isOptionsInArray=!0;"undefined"===typeof this.options.fontSize&&(this.fontSize=this.chart.getAutoFontSize(this.fontSize));this.height=this.width=null; +this.bounds={x1:null,y1:null,x2:null,y2:null}}function Wa(){this.pool=[]}function La(k){var p;k&&Ma[k]&&(p=Ma[k]);La.base.constructor.call(this,"CultureInfo",null,p,null,null)}var Ja=!1,U={},r=!!document.createElement("canvas").getContext,ra={Chart:{width:500,height:400,zoomEnabled:!1,zoomType:"x",backgroundColor:"white",theme:"light1",animationEnabled:!1,animationDuration:1200,dataPointWidth:null,dataPointMinWidth:null,dataPointMaxWidth:null,colorSet:"colorSet1",culture:"en",creditHref:"",creditText:"CanvasJS", +interactivityEnabled:!0,exportEnabled:!1,exportFileName:"Chart",rangeChanging:null,rangeChanged:null,publicProperties:{title:"readWrite",subtitles:"readWrite",toolbar:"readWrite",toolTip:"readWrite",legend:"readWrite",axisX:"readWrite",axisY:"readWrite",axisX2:"readWrite",axisY2:"readWrite",data:"readWrite",options:"readWrite",bounds:"readOnly",container:"readOnly"}},Title:{padding:0,text:null,verticalAlign:"top",horizontalAlign:"center",fontSize:20,fontFamily:"Calibri",fontWeight:"normal",fontColor:"black", +fontStyle:"normal",borderThickness:0,borderColor:"black",cornerRadius:0,backgroundColor:r?"transparent":null,margin:5,wrap:!0,maxWidth:null,dockInsidePlotArea:!1,publicProperties:{options:"readWrite",bounds:"readOnly",chart:"readOnly"}},Subtitle:{padding:0,text:null,verticalAlign:"top",horizontalAlign:"center",fontSize:14,fontFamily:"Calibri",fontWeight:"normal",fontColor:"black",fontStyle:"normal",borderThickness:0,borderColor:"black",cornerRadius:0,backgroundColor:null,margin:2,wrap:!0,maxWidth:null, +dockInsidePlotArea:!1,publicProperties:{options:"readWrite",bounds:"readOnly",chart:"readOnly"}},Toolbar:{backgroundColor:"white",backgroundColorOnHover:"#2196f3",borderColor:"#2196f3",borderThickness:1,fontColor:"black",fontColorOnHover:"white",publicProperties:{options:"readWrite",chart:"readOnly"}},Legend:{name:null,verticalAlign:"center",horizontalAlign:"right",fontSize:14,fontFamily:"calibri",fontWeight:"normal",fontColor:"black",fontStyle:"normal",cursor:null,itemmouseover:null,itemmouseout:null, +itemmousemove:null,itemclick:null,dockInsidePlotArea:!1,reversed:!1,backgroundColor:r?"transparent":null,borderColor:r?"transparent":null,borderThickness:0,cornerRadius:0,maxWidth:null,maxHeight:null,markerMargin:null,itemMaxWidth:null,itemWidth:null,itemWrap:!0,itemTextFormatter:null,publicProperties:{options:"readWrite",bounds:"readOnly",chart:"readOnly"}},ToolTip:{enabled:!0,shared:!1,animationEnabled:!0,content:null,contentFormatter:null,reversed:!1,backgroundColor:r?"rgba(255,255,255,.9)":"rgb(255,255,255)", +borderColor:null,borderThickness:2,cornerRadius:5,fontSize:14,fontColor:"black",fontFamily:"Calibri, Arial, Georgia, serif;",fontWeight:"normal",fontStyle:"italic",publicProperties:{options:"readWrite",chart:"readOnly"}},Axis:{minimum:null,maximum:null,viewportMinimum:null,viewportMaximum:null,interval:null,intervalType:null,reversed:!1,logarithmic:!1,logarithmBase:10,title:null,titleFontColor:"black",titleFontSize:20,titleFontFamily:"arial",titleFontWeight:"normal",titleFontStyle:"normal",titleWrap:!0, +titleMaxWidth:null,titleBackgroundColor:r?"transparent":null,titleBorderColor:r?"transparent":null,titleBorderThickness:0,titleCornerRadius:0,labelAngle:0,labelFontFamily:"arial",labelFontColor:"black",labelFontSize:12,labelFontWeight:"normal",labelFontStyle:"normal",labelAutoFit:!0,labelWrap:!0,labelMaxWidth:null,labelFormatter:null,labelBackgroundColor:r?"transparent":null,labelBorderColor:r?"transparent":null,labelBorderThickness:0,labelCornerRadius:0,labelPlacement:"outside",prefix:"",suffix:"", +includeZero:!0,tickLength:5,tickColor:"black",tickThickness:1,lineColor:"black",lineThickness:1,lineDashType:"solid",gridColor:"A0A0A0",gridThickness:0,gridDashType:"solid",interlacedColor:r?"transparent":null,valueFormatString:null,margin:2,publicProperties:{options:"readWrite",stripLines:"readWrite",scaleBreaks:"readWrite",crosshair:"readWrite",bounds:"readOnly",chart:"readOnly"}},StripLine:{value:null,startValue:null,endValue:null,color:"orange",opacity:null,thickness:2,lineDashType:"solid",label:"", +labelPlacement:"inside",labelAlign:"far",labelWrap:!0,labelMaxWidth:null,labelBackgroundColor:null,labelBorderColor:r?"transparent":null,labelBorderThickness:0,labelCornerRadius:0,labelFontFamily:"arial",labelFontColor:"orange",labelFontSize:12,labelFontWeight:"normal",labelFontStyle:"normal",labelFormatter:null,showOnTop:!1,publicProperties:{options:"readWrite",axis:"readOnly",bounds:"readOnly",chart:"readOnly"}},ScaleBreaks:{autoCalculate:!1,collapsibleThreshold:"25%",maxNumberOfAutoBreaks:2,spacing:8, +type:"straight",color:"#FFFFFF",fillOpacity:0.9,lineThickness:2,lineColor:"#E16E6E",lineDashType:"solid",publicProperties:{options:"readWrite",customBreaks:"readWrite",axis:"readOnly",autoBreaks:"readOnly",bounds:"readOnly",chart:"readOnly"}},Break:{startValue:null,endValue:null,spacing:8,type:"straight",color:"#FFFFFF",fillOpacity:0.9,lineThickness:2,lineColor:"#E16E6E",lineDashType:"solid",publicProperties:{options:"readWrite",scaleBreaks:"readOnly",bounds:"readOnly",chart:"readOnly"}},Crosshair:{enabled:!1, +snapToDataPoint:!1,color:"grey",opacity:null,thickness:2,lineDashType:"solid",label:"",labelWrap:!0,labelMaxWidth:null,labelBackgroundColor:r?"grey":null,labelBorderColor:r?"grey":null,labelBorderThickness:0,labelCornerRadius:0,labelFontFamily:r?"Calibri, Optima, Candara, Verdana, Geneva, sans-serif":"calibri",labelFontSize:12,labelFontColor:"#fff",labelFontWeight:"normal",labelFontStyle:"normal",labelFormatter:null,valueFormatString:null,publicProperties:{options:"readWrite",axis:"readOnly",bounds:"readOnly", +chart:"readOnly"}},DataSeries:{name:null,dataPoints:null,label:"",bevelEnabled:!1,highlightEnabled:!0,cursor:"default",indexLabel:"",indexLabelPlacement:"auto",indexLabelOrientation:"horizontal",indexLabelFontColor:"black",indexLabelFontSize:12,indexLabelFontStyle:"normal",indexLabelFontFamily:"Arial",indexLabelFontWeight:"normal",indexLabelBackgroundColor:null,indexLabelLineColor:"gray",indexLabelLineThickness:1,indexLabelLineDashType:"solid",indexLabelMaxWidth:null,indexLabelWrap:!0,indexLabelFormatter:null, +lineThickness:2,lineDashType:"solid",connectNullData:!1,nullDataLineDashType:"dash",color:null,lineColor:null,risingColor:"white",fallingColor:"red",fillOpacity:null,startAngle:0,radius:null,innerRadius:null,neckHeight:null,neckWidth:null,reversed:!1,valueRepresents:null,linkedDataSeriesIndex:null,whiskerThickness:2,whiskerDashType:"solid",whiskerColor:null,whiskerLength:null,stemThickness:2,stemColor:null,stemDashType:"solid",upperBoxColor:"white",lowerBoxColor:"white",type:"column",xValueType:"number", +axisXType:"primary",axisYType:"primary",axisXIndex:0,axisYIndex:0,xValueFormatString:null,yValueFormatString:null,zValueFormatString:null,percentFormatString:null,showInLegend:null,legendMarkerType:null,legendMarkerColor:null,legendText:null,legendMarkerBorderColor:r?"transparent":null,legendMarkerBorderThickness:0,markerType:"circle",markerColor:null,markerSize:null,markerBorderColor:r?"transparent":null,markerBorderThickness:0,mouseover:null,mouseout:null,mousemove:null,click:null,toolTipContent:null, +visible:!0,publicProperties:{options:"readWrite",axisX:"readWrite",axisY:"readWrite",chart:"readOnly"}},TextBlock:{x:0,y:0,width:null,height:null,maxWidth:null,maxHeight:null,padding:0,angle:0,text:"",horizontalAlign:"center",fontSize:12,fontFamily:"calibri",fontWeight:"normal",fontColor:"black",fontStyle:"normal",borderThickness:0,borderColor:"black",cornerRadius:0,backgroundColor:null,textBaseline:"top"},CultureInfo:{decimalSeparator:".",digitGroupSeparator:",",zoomText:"Zoom",panText:"Pan",resetText:"Reset", +menuText:"More Options",saveJPGText:"Save as JPEG",savePNGText:"Save as PNG",printText:"Print",days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),shortDays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ")}},Ma={en:{}},v=r?"Trebuchet MS, Helvetica, sans-serif":"Arial",Ha=r?"Impact, Charcoal, sans-serif":"Arial", +Ba={colorSet1:"#4F81BC #C0504E #9BBB58 #23BFAA #8064A1 #4AACC5 #F79647 #7F6084 #77A033 #33558B #E59566".split(" "),colorSet2:"#6D78AD #51CDA0 #DF7970 #4C9CA0 #AE7D99 #C9D45C #5592AD #DF874D #52BCA8 #8E7AA3 #E3CB64 #C77B85 #C39762 #8DD17E #B57952 #FCC26C".split(" "),colorSet3:"#8CA1BC #36845C #017E82 #8CB9D0 #708C98 #94838D #F08891 #0366A7 #008276 #EE7757 #E5BA3A #F2990B #03557B #782970".split(" ")},I,fa,Q,ha,ga;fa="#333333";Q="#000000";I="#666666";ga=ha="#000000";var X=20,E=14,Xa={colorSet:"colorSet1", +backgroundColor:"#FFFFFF",title:{fontFamily:Ha,fontSize:32,fontColor:fa,fontWeight:"normal",verticalAlign:"top",margin:5},subtitles:[{fontFamily:Ha,fontSize:E,fontColor:fa,fontWeight:"normal",verticalAlign:"top",margin:5}],data:[{indexLabelFontFamily:v,indexLabelFontSize:E,indexLabelFontColor:fa,indexLabelFontWeight:"normal",indexLabelLineThickness:1}],axisX:[{titleFontFamily:v,titleFontSize:X,titleFontColor:fa,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal", +lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:0,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],axisX2:[{titleFontFamily:v, +titleFontSize:X,titleFontColor:fa,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:0,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1, +lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],axisY:[{titleFontFamily:v,titleFontSize:X,titleFontColor:fa,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:1,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300", +thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],axisY2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:fa,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:1, +gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],legend:{fontFamily:v,fontSize:14,fontColor:fa,fontWeight:"bold",verticalAlign:"bottom", +horizontalAlign:"center"},toolTip:{fontFamily:v,fontSize:14,fontStyle:"normal",cornerRadius:0,borderThickness:1}};Q=fa="#F5F5F5";I="#FFFFFF";ha="#40BAF1";ga="#F5F5F5";var X=20,E=14,cb={colorSet:"colorSet2",title:{fontFamily:v,fontSize:33,fontColor:"#3A3A3A",fontWeight:"bold",verticalAlign:"top",margin:5},subtitles:[{fontFamily:v,fontSize:E,fontColor:"#3A3A3A",fontWeight:"normal",verticalAlign:"top",margin:5}],data:[{indexLabelFontFamily:v,indexLabelFontSize:E,indexLabelFontColor:"#666666",indexLabelFontWeight:"normal", +indexLabelLineThickness:1}],axisX:[{titleFontFamily:v,titleFontSize:X,titleFontColor:"#666666",titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:"#666666",labelFontWeight:"normal",lineThickness:1,lineColor:"#BBBBBB",tickThickness:1,tickColor:"#BBBBBB",gridThickness:1,gridColor:"#BBBBBB",stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FFA500",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FFA500",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E, +labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:"black",color:"black",thickness:1,lineDashType:"dot"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],axisX2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:"#666666",titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:"#666666",labelFontWeight:"normal",lineThickness:1,lineColor:"#BBBBBB",tickColor:"#BBBBBB",tickThickness:1,gridThickness:1,gridColor:"#BBBBBB", +stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FFA500",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FFA500",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:"black",color:"black",thickness:1,lineDashType:"dot"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],axisY:[{titleFontFamily:v,titleFontSize:X,titleFontColor:"#666666",titleFontWeight:"normal", +labelFontFamily:v,labelFontSize:E,labelFontColor:"#666666",labelFontWeight:"normal",lineThickness:0,lineColor:"#BBBBBB",tickColor:"#BBBBBB",tickThickness:1,gridThickness:1,gridColor:"#BBBBBB",stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FFA500",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FFA500",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:"black",color:"black",thickness:1,lineDashType:"dot"}, +scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],axisY2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:"#666666",titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:"#666666",labelFontWeight:"normal",lineThickness:0,lineColor:"#BBBBBB",tickColor:"#BBBBBB",tickThickness:1,gridThickness:1,gridColor:"#BBBBBB",stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FFA500",labelFontWeight:"normal",labelBackgroundColor:null, +color:"#FFA500",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#EEEEEE",labelFontWeight:"normal",labelBackgroundColor:"black",color:"black",thickness:1,lineDashType:"dot"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#BBBBBB",lineThickness:1,lineDashType:"solid"}}],legend:{fontFamily:v,fontSize:14,fontColor:"#3A3A3A",fontWeight:"bold",verticalAlign:"bottom",horizontalAlign:"center"},toolTip:{fontFamily:v,fontSize:14,fontStyle:"normal",cornerRadius:0,borderThickness:1}}; +Q=fa="#F5F5F5";I="#FFFFFF";ha="#40BAF1";ga="#F5F5F5";X=20;E=14;Ha={colorSet:"colorSet12",backgroundColor:"#2A2A2A",title:{fontFamily:Ha,fontSize:32,fontColor:fa,fontWeight:"normal",verticalAlign:"top",margin:5},subtitles:[{fontFamily:Ha,fontSize:E,fontColor:fa,fontWeight:"normal",verticalAlign:"top",margin:5}],toolbar:{backgroundColor:"#666666",backgroundColorOnHover:"#FF7372",borderColor:"#FF7372",borderThickness:1,fontColor:"#F5F5F5",fontColorOnHover:"#F5F5F5"},data:[{indexLabelFontFamily:v,indexLabelFontSize:E, +indexLabelFontColor:Q,indexLabelFontWeight:"normal",indexLabelLineThickness:1}],axisX:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:0,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v, +labelFontSize:E,labelFontColor:"#000000",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777",lineThickness:1,lineDashType:"solid",color:"#111111"}}],axisX2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:0,gridColor:I,stripLines:[{labelFontFamily:v, +labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#000000",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777",lineThickness:1,lineDashType:"solid",color:"#111111"}}],axisY:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v, +labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:1,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#000000",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777", +lineThickness:1,lineDashType:"solid",color:"#111111"}}],axisY2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:1,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#000000", +labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777",lineThickness:1,lineDashType:"solid",color:"#111111"}}],legend:{fontFamily:v,fontSize:14,fontColor:fa,fontWeight:"bold",verticalAlign:"bottom",horizontalAlign:"center"},toolTip:{fontFamily:v,fontSize:14,fontStyle:"normal",cornerRadius:0,borderThickness:1,fontColor:Q,backgroundColor:"rgba(0, 0, 0, .7)"}};I="#FFFFFF";Q=fa="#FAFAFA";ha="#40BAF1";ga="#F5F5F5"; +var X=20,E=14,ya={light1:Xa,light2:cb,dark1:Ha,dark2:{colorSet:"colorSet2",backgroundColor:"#32373A",title:{fontFamily:v,fontSize:32,fontColor:fa,fontWeight:"normal",verticalAlign:"top",margin:5},subtitles:[{fontFamily:v,fontSize:E,fontColor:fa,fontWeight:"normal",verticalAlign:"top",margin:5}],toolbar:{backgroundColor:"#666666",backgroundColorOnHover:"#FF7372",borderColor:"#FF7372",borderThickness:1,fontColor:"#F5F5F5",fontColorOnHover:"#F5F5F5"},data:[{indexLabelFontFamily:v,indexLabelFontSize:E, +indexLabelFontColor:Q,indexLabelFontWeight:"normal",indexLabelLineThickness:1}],axisX:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:0,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v, +labelFontSize:E,labelFontColor:"#000000",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777",lineThickness:1,lineDashType:"solid",color:"#111111"}}],axisX2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:1,lineColor:I,tickThickness:1,tickColor:I,gridThickness:0,gridColor:I,stripLines:[{labelFontFamily:v, +labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#000000",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777",lineThickness:1,lineDashType:"solid",color:"#111111"}}],axisY:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v, +labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:0,lineColor:I,tickThickness:1,tickColor:I,gridThickness:1,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#000000",labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777", +lineThickness:1,lineDashType:"solid",color:"#111111"}}],axisY2:[{titleFontFamily:v,titleFontSize:X,titleFontColor:Q,titleFontWeight:"normal",labelFontFamily:v,labelFontSize:E,labelFontColor:Q,labelFontWeight:"normal",lineThickness:0,lineColor:I,tickThickness:1,tickColor:I,gridThickness:1,gridColor:I,stripLines:[{labelFontFamily:v,labelFontSize:E,labelFontColor:"#FF7300",labelFontWeight:"normal",labelBackgroundColor:null,color:"#FF7300",thickness:1}],crosshair:{labelFontFamily:v,labelFontSize:E,labelFontColor:"#000000", +labelFontWeight:"normal",labelBackgroundColor:ga,color:ha,thickness:1,lineDashType:"dash"},scaleBreaks:{type:"zigzag",spacing:"2%",lineColor:"#777777",lineThickness:1,lineDashType:"solid",color:"#111111"}}],legend:{fontFamily:v,fontSize:14,fontColor:fa,fontWeight:"bold",verticalAlign:"bottom",horizontalAlign:"center"},toolTip:{fontFamily:v,fontSize:14,fontStyle:"normal",cornerRadius:0,borderThickness:1,fontColor:Q,backgroundColor:"rgba(0, 0, 0, .7)"}},theme1:Xa,theme2:cb,theme3:Xa},S={numberDuration:1, +yearDuration:314496E5,monthDuration:2592E6,weekDuration:6048E5,dayDuration:864E5,hourDuration:36E5,minuteDuration:6E4,secondDuration:1E3,millisecondDuration:1,dayOfWeekFromInt:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" ")};(function(){U.fSDec=function(k){for(var p="",r=0;r<k.length;r++)p+=String.fromCharCode(Math.ceil(k.length/57/5)^k.charCodeAt(r));return p};U.obj={trVs:"Ush`m!Wdsrhno",fntStr:"qy!B`mhcsh-!Mtbhe`!Fs`oed-!Mtbhe`!R`or!Tohbned-!@sh`m-!r`or,rdshg",txtBl:"udyuC`rdmhod", +fnt:"gnou",fSy:"ghmmRuxmd",fTx:"ghmmUdyu",grClr:"fsdx",cntx:"buy",tp:"unq"};delete ra[U.fSDec("Bi`su")][U.fSDec("bsdehuIsdg")];U.pro={sCH:ra[U.fSDec("Bi`su")][U.fSDec("bsdehuIsdg")]};U._fTWm=function(k){if("undefined"===typeof U.pro.sCH&&!db)try{var p=k[U.fSDec(U.obj.cntx)];p[U.fSDec(U.obj.txtBl)]=U.fSDec(U.obj.tp);p[U.fSDec(U.obj.fnt)]=11+U.fSDec(U.obj.fntStr);p[U.fSDec(U.obj.fSy)]=U.fSDec(U.obj.grClr);p[U.fSDec(U.obj.fTx)](U.fSDec(U.obj.trVs),2,k.height-11-2)}catch(r){}}})();var $a={},xa=null,kb= +function(){this.ctx.clearRect(0,0,this.width,this.height);this.backgroundColor&&(this.ctx.fillStyle=this.backgroundColor,this.ctx.fillRect(0,0,this.width,this.height))},lb=function(k,p,r){p=Math.min(this.width,this.height);return Math.max("theme4"===this.theme?0:300<=p?12:10,Math.round(p*(k/400)))},Ca=function(){var k=/D{1,4}|M{1,4}|Y{1,4}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|f{1,3}|t{1,2}|T{1,2}|K|z{1,3}|"[^"]*"|'[^']*'/g,p="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),r="Sun Mon Tue Wed Thu Fri Sat".split(" "), +u="January February March April May June July August September October November December".split(" "),v="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),H=/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,F=/[^-+\dA-Z]/g;return function(z,E,L){var R=L?L.days:p,I=L?L.months:u,N=L?L.shortDays:r,O=L?L.shortMonths:v;L="";var S=!1;z=z&&z.getTime?z:z?new Date(z):new Date;if(isNaN(z))throw SyntaxError("invalid date"); +"UTC:"===E.slice(0,4)&&(E=E.slice(4),S=!0);L=S?"getUTC":"get";var U=z[L+"Date"](),V=z[L+"Day"](),M=z[L+"Month"](),Q=z[L+"FullYear"](),a=z[L+"Hours"](),d=z[L+"Minutes"](),b=z[L+"Seconds"](),c=z[L+"Milliseconds"](),e=S?0:z.getTimezoneOffset();return L=E.replace(k,function(g){switch(g){case "D":return U;case "DD":return $(U,2);case "DDD":return N[V];case "DDDD":return R[V];case "M":return M+1;case "MM":return $(M+1,2);case "MMM":return O[M];case "MMMM":return I[M];case "Y":return parseInt(String(Q).slice(-2)); +case "YY":return $(String(Q).slice(-2),2);case "YYY":return $(String(Q).slice(-3),3);case "YYYY":return $(Q,4);case "h":return a%12||12;case "hh":return $(a%12||12,2);case "H":return a;case "HH":return $(a,2);case "m":return d;case "mm":return $(d,2);case "s":return b;case "ss":return $(b,2);case "f":return String(c).slice(0,1);case "ff":return $(String(c).slice(0,2),2);case "fff":return $(String(c).slice(0,3),3);case "t":return 12>a?"a":"p";case "tt":return 12>a?"am":"pm";case "T":return 12>a?"A": +"P";case "TT":return 12>a?"AM":"PM";case "K":return S?"UTC":(String(z).match(H)||[""]).pop().replace(F,"");case "z":return(0<e?"-":"+")+Math.floor(Math.abs(e)/60);case "zz":return(0<e?"-":"+")+$(Math.floor(Math.abs(e)/60),2);case "zzz":return(0<e?"-":"+")+$(Math.floor(Math.abs(e)/60),2)+$(Math.abs(e)%60,2);default:return g.slice(1,g.length-1)}})}}(),ba=function(k,p,r){if(null===k)return"";if(!isFinite(k))return k;k=Number(k);var u=0>k?!0:!1;u&&(k*=-1);var v=r?r.decimalSeparator:".",H=r?r.digitGroupSeparator: +",",F="";p=String(p);var F=1,z=r="",E=-1,L=[],R=[],I=0,N=0,S=0,O=!1,U=0,z=p.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|\u2030|./g);p=null;for(var Q=0;z&&Q<z.length;Q++)if(p=z[Q],"."===p&&0>E)E=Q;else{if("%"===p)F*=100;else if("\u2030"===p){F*=1E3;continue}else if(","===p[0]&&"."===p[p.length-1]){F/=Math.pow(1E3,p.length-1);E=Q+p.length-1;continue}else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||(O=!0);0>E?(L.push(p),"#"===p||"0"===p?I++:","===p&&S++):(R.push(p),"#"!==p&&"0"!==p||N++)}O&&(p=Math.floor(k), +z=-Math.floor(Math.log(k)/Math.LN10+1),U=0===k?0:0===p?-(I+z):String(p).length-I,F/=Math.pow(10,U));0>E&&(E=Q);F=(k*F).toFixed(N);p=F.split(".");F=(p[0]+"").split("");k=(p[1]+"").split("");F&&"0"===F[0]&&F.shift();for(O=z=Q=N=E=0;0<L.length;)if(p=L.pop(),"#"===p||"0"===p)if(E++,E===I){var M=F,F=[];if("0"===p)for(p=I-N-(M?M.length:0);0<p;)M.unshift("0"),p--;for(;0<M.length;)r=M.pop()+r,O++,0===O%z&&(Q===S&&0<M.length)&&(r=H+r)}else 0<F.length?(r=F.pop()+r,N++,O++):"0"===p&&(r="0"+r,N++,O++),0===O% +z&&(Q===S&&0<F.length)&&(r=H+r);else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||!/[eE][+-]*[0]+/.test(p)?","===p?(Q++,z=O,O=0,0<F.length&&(r=H+r)):r=1<p.length&&('"'===p[0]&&'"'===p[p.length-1]||"'"===p[0]&&"'"===p[p.length-1])?p.slice(1,p.length-1)+r:p+r:(p=0>U?p.replace("+","").replace("-",""):p.replace("-",""),r+=p.replace(/[0]+/,function(k){return $(U,k.length)}));H="";for(L=!1;0<R.length;)p=R.shift(),"#"===p||"0"===p?0<k.length&&0!==Number(k.join(""))?(H+=k.shift(),L=!0):"0"===p&&(H+="0",L= +!0):1<p.length&&('"'===p[0]&&'"'===p[p.length-1]||"'"===p[0]&&"'"===p[p.length-1])?H+=p.slice(1,p.length-1):"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||!/[eE][+-]*[0]+/.test(p)?H+=p:(p=0>U?p.replace("+","").replace("-",""):p.replace("-",""),H+=p.replace(/[0]+/,function(k){return $(U,k.length)}));r+=(L?v:"")+H;return u?"-"+r:r},Ra=function(k){var p=0,r=0;k=k||window.event;k.offsetX||0===k.offsetX?(p=k.offsetX,r=k.offsetY):k.layerX||0==k.layerX?(p=k.layerX,r=k.layerY):(p=k.pageX-k.target.offsetLeft, +r=k.pageY-k.target.offsetTop);return{x:p,y:r}},bb=!0,Ua=window.devicePixelRatio||1,Pa=1,W=bb?Ua/Pa:1,ea=function(k,p,r,u,v,H,F,z,E,L,R,N,O){"undefined"===typeof O&&(O=1);F=F||0;z=z||"black";var I=15<u-p&&15<v-r?8:0.35*Math.min(u-p,v-r);k.beginPath();k.moveTo(p,r);k.save();k.fillStyle=H;k.globalAlpha=O;k.fillRect(p,r,u-p,v-r);k.globalAlpha=1;0<F&&(O=0===F%2?0:0.5,k.beginPath(),k.lineWidth=F,k.strokeStyle=z,k.moveTo(p,r),k.rect(p-O,r-O,u-p+2*O,v-r+2*O),k.stroke());k.restore();!0===E&&(k.save(),k.beginPath(), +k.moveTo(p,r),k.lineTo(p+I,r+I),k.lineTo(u-I,r+I),k.lineTo(u,r),k.closePath(),F=k.createLinearGradient((u+p)/2,r+I,(u+p)/2,r),F.addColorStop(0,H),F.addColorStop(1,"rgba(255, 255, 255, .4)"),k.fillStyle=F,k.fill(),k.restore());!0===L&&(k.save(),k.beginPath(),k.moveTo(p,v),k.lineTo(p+I,v-I),k.lineTo(u-I,v-I),k.lineTo(u,v),k.closePath(),F=k.createLinearGradient((u+p)/2,v-I,(u+p)/2,v),F.addColorStop(0,H),F.addColorStop(1,"rgba(255, 255, 255, .4)"),k.fillStyle=F,k.fill(),k.restore());!0===R&&(k.save(), +k.beginPath(),k.moveTo(p,r),k.lineTo(p+I,r+I),k.lineTo(p+I,v-I),k.lineTo(p,v),k.closePath(),F=k.createLinearGradient(p+I,(v+r)/2,p,(v+r)/2),F.addColorStop(0,H),F.addColorStop(1,"rgba(255, 255, 255, 0.1)"),k.fillStyle=F,k.fill(),k.restore());!0===N&&(k.save(),k.beginPath(),k.moveTo(u,r),k.lineTo(u-I,r+I),k.lineTo(u-I,v-I),k.lineTo(u,v),F=k.createLinearGradient(u-I,(v+r)/2,u,(v+r)/2),F.addColorStop(0,H),F.addColorStop(1,"rgba(255, 255, 255, 0.1)"),k.fillStyle=F,F.addColorStop(0,H),F.addColorStop(1, +"rgba(255, 255, 255, 0.1)"),k.fillStyle=F,k.fill(),k.closePath(),k.restore())},ja=function(k){for(var p="",r=0;r<k.length;r++)p+=String.fromCharCode(Math.ceil(k.length/57/5)^k.charCodeAt(r));return p},db=window&&window[ja("mnb`uhno")]&&window[ja("mnb`uhno")].href&&window[ja("mnb`uhno")].href.indexOf&&(-1!==window[ja("mnb`uhno")].href.indexOf(ja("b`ow`rkr/bnl"))||-1!==window[ja("mnb`uhno")].href.indexOf(ja("gdonqhy/bnl"))||-1!==window[ja("mnb`uhno")].href.indexOf(ja("gheemd"))),ib=db&&-1===window[ja("mnb`uhno")].href.indexOf(ja("gheemd")), +jb={reset:{image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAeCAYAAABJ/8wUAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAPjSURBVFhHxVdJaFNRFP1J/jwkP5MxsbaC1WJEglSxOFAXIsFpVRE3ggi1K90obioRRBA33XXnQnciirhQcMCdorgQxBkXWlREkFKsWkv5npvckp/XnzRpKh64kLw733fffe9L/wrL0+mVUdO8uTSZ3MBL/we2qg4rkuSpodCELstXE46ziVkLQ6FQcGOmeSSq6wd4aV50d3drWjj8kQKZJTUc9kxFGenv79dZrDksTSTWWJp2QYtEPiErysyzdX0LsxsCQR8keX8gs6RHIk8ysdgKFg2G53mhuOPsshTlBjKaFo1g7SqLNoShKLdFXT8huQ/paLSbxatYnc2mHMM4hr18Vi8TIvCmXF3vYrW6cF23gGTOk0M1wA4RKvOmq6vLZRVJipvmSWT6tZ6CSEYkco5V50VPT4+D7RwOqi6RiSZm0fJ+vggSqkeoypdsNmuyelNwbXsbgvkWYMtzDWNvWaijoyOBqE+hVK8abcssUeXQ/YfKyi0gFYv1Ipgfoj34fYGTJLOYJA0ODirok32GLN8XhUWCwSes1hIwBg6LydJ/tEeRRapAdUp+wSAiZchtZZWWgAZ+JNpD8peYXQVK9UwUxNpzOK8pq97kURZhYTCKBwPD7h2zK+js7Myi7D8Fod+0TkMI8+EMAngLGc/WtBFWawkFHFnoj/t9KLgGmF0B3QfkxC+EarxkdhnFYlFLY06USqUwL7UMjICHfh/wOc2sCqhpxGbCkLvL7EUDbF73+6DkmVWB6zi7xUDQSLeYvWjAILvm9zEnkJhlbRcDQZcv6Kg2AipyT/Axw6wKlqVSqxDdjF8Izfod13qURdrG/nxehY+xGh+h0CSzKygGvSNQIcc097BI24jb9hax6kj2E7OrMFX1il+ICEf2NrPbhiXLl+fYl+U7zK4iYdsDcyLGf+ofFlkwcN+s10KhmpuYhhtm0hCLVIFL0MDsqNlDIqy9x2CLs1jL6OvrI7vPRbtohXG6eFmsFnHDGAp6n9AgyuVySRZrGvROxRgIfLXhzjrNYnNBUxNX/dMgRWT1mt4XLDovaApD53E9W3ilNX5M55LJHpRtIsgAvciR4WWcgK2Dvb1YqgXevmF8z2zEBTcKG39EfSKsT9EbhVUaI2FZO+oZIqImxol6j66/hcAu4sSN4vc1ZPoKeoE6RGhYL2YYA+ymOSSi0Z0wWntbtkGUWCvfSDXIxONraZ/FY90KUfNTpfC5spnNLgxoYNnR9RO4F8ofXEHOgogCQE99w+fF2Xw+b7O59rEOsyRqGEfpVoaDMQQ1CZrG46bcM6AZ0C/wPqNfHliqejyTySxh9TqQpL+xmbIlkB9SlAAAAABJRU5ErkJggg=="}, +pan:{image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAICSURBVEhLxZbPahNRGMUn/5MpuAiBEAIufQGfzr5E40YptBXajYzudCEuGqS+gGlrFwquDGRTutBdYfydzJ3LzeQmJGZue+Dw/Z17Mnfmu5Pof9Hr9Z61Wq0bWZMKj263O6xWq99wU9lOpzPMKgEhEcRucNOcioOK+0RzBhNvt9tPV4nmVF19+OWhVqt9xXgFXZq+8lCv119UKpUJ7iX2FmvFTKz8RH34YdBsNk8wVtjE4fGYwm8wrrDi3WBG5oKXZGRSS9hGuNFojLTe2lFz5xThWZIktayyiE2FdT3rzXBXz7krKiL8c17wAKFDjCus2AvW+YGZ9y2JF0VFRuMPfI//rsCE/C+s26s4gQu9ul7r4NteKx7H8XOC724xNNGbaNu++IrBqbOV7Tj3FgMRvc/YKOr3+3sE47wgEt/Bl/gaK5cHbNU11vYSXylfpK7XOvjuumPp4Wcoipu30Qsez2uMXYz4lfI+mOmwothY+SLiXJy7mKVpWs3Si0CoOMfeI9Od43Wic+jO+ZVv+crsm9QSNhUW9LXSeoPBYLXopthGuFQgdIxxhY+UDwlt1x5CZ1hX+NTUdt/OIvjKaDSmuOJfaIVNPKX+W18j/PLA2/kR44p5Sd8HbHngT/yTfNRWUXX14ZcL3wmX0+TLf8YO7CGT8yFE5zB3/gney25/OETRP9CtPDFe5jShAAAAAElFTkSuQmCC"}, +zoom:{image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALWSURBVEhLvZZLaBNRFIabyftBIgEfqCCBoCC6MYqiXYiIj4U76U4X7sUHbhQhUBfixhZEUBDB16YuFERaUaQLK7ooCOJj4UKtYEFU0EptShO/A9Ph3js3k8lo/eHnP7n3nP/M3LlzMz1hkUwmNziOcyKRSFyFt+LxeD/c2Wq1Ym7Kv0M2m11Os1OxWGycn1OwZXCGuXfwIhezkd9/jRgNT2L4ldhs1pbkX5OLJe4euVxuGQaPCa3mnUjtJx7BDuKusJTCV6jVVGHTMuYRjxma7yIOhTgFY6jNaAKew2xPKpVay9ganmkvj+M448/MfJdT5K5Gg4HJacRngPFgqVRaRNwW1B4i7yehWfsEDdz1K+A01AoxPIqGAiuwGfkOTY8+1A6u7AyiFTB2Hu0KPIrdiOnzHLWDybeImvy+Wq2mZa5bUHsD0Zpz+KxHdWQymV6kAb1ElqeORgJLvgnRdj1+R1AfzkIvSUjxVjQSarVakrueIPT8+H1F5jSUy+WXiJrUYBVWyVxU4PEU8TzhfaijUqnMIWrjaY492eWRwdKOIqrnIxnXwLLeRLwk2GQzrEMjg0avEbXxkIxr4OoOImpj2QwyFgms1koa/SZUG8s+0iGnEhNfCNXEhzIXBVz0McTzEvJ+70P9oNFtxEzei3aFYrFYxmuSUPWSv9Yi9IMm2xE1We56Mp1OV4nDwqFmBDV9gk9AEh4gZtFHNt8W4kAUCoXF5MorY9Z/kDni9nDv7hc0i2fhgLvTtX8a99PoMPPagTFPxofRzmDJ9yM+AyEmTfgGysYbQcfhDzPPJDmX0c7gDg4gs9BqFIWhm/Nct5H8gtBq1I7UfIbtvmIuoaGQcp+fdpbbSM43eEH5wrwLbXmhm/fU63VHXjcuok7hEByFY/AeHGC8L5/PL3HT5xGH1uYwfPOICGo+CBcU0vwO1BqzUqILDl/z/9VYIMfpddiAc47jDP8BsUpb13wOLRwAAAAASUVORK5CYII="}, +menu:{image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAeCAYAAABE4bxTAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADoSURBVFhH7dc9CsJAFATgRxIIBCwCqZKATX5sbawsY2MvWOtF9AB6AU8gguAJbD2AnZ2VXQT/Ko2TYGCL2OYtYQc+BuYA+1hCtnCVwMm27SGaXpDJIAiCvCkVR05hGOZNN3HkFMdx3nQRR06+76/R1IcFLJlNQEWlmWlBTwJtKLKHynehZqnjOGM0PYWRVXk61C37p7xlZ3Hk5HneCk1dmMH811xGoKLSzDiQwIBZB4ocoPJdqNkDt2yKlueWRVGUtzy3rPwo3sWRU3nLjuLI6OO67oZM00wMw3hrmpZx0XU9syxrR0T0BeMpb9dneSR2AAAAAElFTkSuQmCC"}, +handle:{image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAQCAYAAADESFVDAAAAAXNSR0IArs4c6QAAAAZiS0dEANAAzwDP4Z7KegAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB9sHGw0cMqdt1UwAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAaElEQVQoz+3SsRFAQBCF4Z9WJM8KCDVwownl6YXsTmCUsyKGkZzcl7zkz3YLkypgAnreFmDEpHkIwVOMfpdi9CEEN2nGpFdwD03yEqDtOgCaun7sqSTDH32I1pQA2Pb9sZecAxc5r3IAb21d6878xsAAAAAASUVORK5CYII="}};V.prototype.setOptions=function(k,p){if(ra[this._defaultsKey]){var r=ra[this._defaultsKey],u;for(u in r)"publicProperties"!== +u&&r.hasOwnProperty(u)&&(this[u]=k&&u in k?k[u]:p&&u in p?p[u]:r[u])}else Ja&&window.console&&console.log("defaults not set")};V.prototype.get=function(k){var p=ra[this._defaultsKey];if("options"===k)return this.options&&this.options._isPlaceholder?null:this.options;if(p.hasOwnProperty(k)||p.publicProperties&&p.publicProperties.hasOwnProperty(k))return this[k];window.console&&window.console.log('Property "'+k+"\" doesn't exist. Please check for typo.")};V.prototype.set=function(k,p,r){r="undefined"=== +typeof r?!0:r;var u=ra[this._defaultsKey];if("options"===k)this.createUserOptions(p);else if(u.hasOwnProperty(k)||u.publicProperties&&u.publicProperties.hasOwnProperty(k)&&"readWrite"===u.publicProperties[k])this.options._isPlaceholder&&this.createUserOptions(),this.options[k]=p;else{window.console&&(u.publicProperties&&u.publicProperties.hasOwnProperty(k)&&"readOnly"===u.publicProperties[k]?window.console.log('Property "'+k+'" is read-only.'):window.console.log('Property "'+k+"\" doesn't exist. Please check for typo.")); +return}r&&(this.stockChart||this.chart||this).render()};V.prototype.addTo=function(k,p,r,u){u="undefined"===typeof u?!0:u;var v=ra[this._defaultsKey];v.hasOwnProperty(k)||v.publicProperties&&v.publicProperties.hasOwnProperty(k)&&"readWrite"===v.publicProperties[k]?(this.options._isPlaceholder&&this.createUserOptions(),"undefined"===typeof this.options[k]&&(this.options[k]=[]),k=this.options[k],r="undefined"===typeof r||null===r?k.length:r,k.splice(r,0,p),u&&(this.chart||this).render()):window.console&& +(v.publicProperties&&v.publicProperties.hasOwnProperty(k)&&"readOnly"===v.publicProperties[k]?window.console.log('Property "'+k+'" is read-only.'):window.console.log('Property "'+k+"\" doesn't exist. Please check for typo."))};V.prototype.createUserOptions=function(k){if("undefined"!==typeof k||this.options._isPlaceholder)if(this.parent.options._isPlaceholder&&this.parent.createUserOptions(),this.isOptionsInArray){this.parent.options[this.optionsName]||(this.parent.options[this.optionsName]=[]);var p= +this.parent.options[this.optionsName],r=p.length;this.options._isPlaceholder||(Fa(p),r=p.indexOf(this.options));this.options="undefined"===typeof k?{}:k;p[r]=this.options}else this.options="undefined"===typeof k?{}:k,k=this.parent.options,this.optionsName?p=this.optionsName:(p=this._defaultsKey)&&0!==p.length?(r=p.charAt(0).toLowerCase(),1<p.length&&(r=r.concat(p.slice(1))),p=r):p=void 0,k[p]=this.options};V.prototype.remove=function(k){k="undefined"===typeof k?!0:k;if(this.isOptionsInArray){var p= +this.parent.options[this.optionsName];Fa(p);var r=p.indexOf(this.options);0<=r&&p.splice(r,1)}else delete this.parent.options[this.optionsName];k&&(this.chart||this).render()};V.prototype.updateOption=function(k){!ra[this._defaultsKey]&&(Ja&&window.console)&&console.log("defaults not set");var p=ra[this._defaultsKey],r={},v=this[k],E=this._themeOptionsKey,H=this._index;this.theme&&u(E)&&u(H)?r=u(ya[this.theme])?ya.light1:ya[this.theme]:this.parent&&(this.parent.themeOptions&&this.parent.themeOptions[E])&& +(null===H?r=this.parent.themeOptions[E]:0<this.parent.themeOptions[E].length&&(r=Math.min(this.parent.themeOptions[E].length-1,H),r=this.parent.themeOptions[E][r]));this.themeOptions=r;k in p&&(v=k in this.options?this.options[k]:r&&k in r?r[k]:p[k]);if(v===this[k])return!1;this[k]=v;return!0};V.prototype.trackChanges=function(k){if(!this.sessionVariables)throw"Session Variable Store not set";this.sessionVariables[k]=this.options[k]};V.prototype.isBeingTracked=function(k){this.options._oldOptions|| +(this.options._oldOptions={});return this.options._oldOptions[k]?!0:!1};V.prototype.hasOptionChanged=function(k){if(!this.sessionVariables)throw"Session Variable Store not set";return this.sessionVariables[k]!==this.options[k]};V.prototype.addEventListener=function(k,p,r){k&&p&&(this._eventListeners[k]=this._eventListeners[k]||[],this._eventListeners[k].push({context:r||this,eventHandler:p}))};V.prototype.removeEventListener=function(k,p){if(k&&p&&this._eventListeners[k])for(var r=this._eventListeners[k], +u=0;u<r.length;u++)if(r[u].eventHandler===p){r[u].splice(u,1);break}};V.prototype.removeAllEventListeners=function(){this._eventListeners=[]};V.prototype.dispatchEvent=function(k,p,r){if(k&&this._eventListeners[k]){p=p||{};for(var u=this._eventListeners[k],v=0;v<u.length;v++)u[v].eventHandler.call(u[v].context,p)}"function"===typeof this[k]&&this[k].call(r||this.chart,p)};Ga.prototype.registerSpace=function(k,p){"top"===k?this._topOccupied+=p.height:"bottom"===k?this._bottomOccupied+=p.height:"left"=== +k?this._leftOccupied+=p.width:"right"===k&&(this._rightOccupied+=p.width)};Ga.prototype.unRegisterSpace=function(k,p){"top"===k?this._topOccupied-=p.height:"bottom"===k?this._bottomOccupied-=p.height:"left"===k?this._leftOccupied-=p.width:"right"===k&&(this._rightOccupied-=p.width)};Ga.prototype.getFreeSpace=function(){return{x1:this._x1+this._leftOccupied,y1:this._y1+this._topOccupied,x2:this._x2-this._rightOccupied,y2:this._y2-this._bottomOccupied,width:this._x2-this._x1-this._rightOccupied-this._leftOccupied, +height:this._y2-this._y1-this._bottomOccupied-this._topOccupied}};Ga.prototype.reset=function(){this._rightOccupied=this._leftOccupied=this._bottomOccupied=this._topOccupied=this._padding};qa(ka,V);ka.prototype._initialize=function(){u(this.padding)||"object"!==typeof this.padding?this.topPadding=this.rightPadding=this.bottomPadding=this.leftPadding=Number(this.padding)|0:(this.topPadding=u(this.padding.top)?0:Number(this.padding.top)|0,this.rightPadding=u(this.padding.right)?0:Number(this.padding.right)| +0,this.bottomPadding=u(this.padding.bottom)?0:Number(this.padding.bottom)|0,this.leftPadding=u(this.padding.left)?0:Number(this.padding.left)|0)};ka.prototype.render=function(k){if(0!==this.fontSize){k&&this.ctx.save();var p=this.ctx.font;this.ctx.textBaseline=this.textBaseline;var r=0;this._isDirty&&this.measureText(this.ctx);this.ctx.translate(this.x,this.y+r);"middle"===this.textBaseline&&(r=-this._lineHeight/2);this.ctx.font=this._getFontString();this.ctx.rotate(Math.PI/180*this.angle);var u= +0,v=this.topPadding,H=null;this.ctx.roundRect||Ea(this.ctx);(0<this.borderThickness&&this.borderColor||this.backgroundColor)&&this.ctx.roundRect(0,r,this.width,this.height,this.cornerRadius,this.borderThickness,this.backgroundColor,this.borderColor);this.ctx.fillStyle=this.fontColor;for(r=0;r<this._wrappedText.lines.length;r++)H=this._wrappedText.lines[r],"right"===this.horizontalAlign?u=(this.width-(this.leftPadding+this.rightPadding))/2-H.width/2+this.leftPadding:"left"===this.horizontalAlign?u= +this.leftPadding:"center"===this.horizontalAlign&&(u=(this.width-(this.leftPadding+this.rightPadding))/2-H.width/2+this.leftPadding),this.ctx.fillText(H.text,u,v),v+=H.height;this.ctx.font=p;k&&this.ctx.restore()}};ka.prototype.setText=function(k){this.text=k;this._isDirty=!0;this._wrappedText=null};ka.prototype.measureText=function(){this._lineHeight=Za(this.fontFamily,this.fontSize,this.fontWeight);if(null===this.maxWidth)throw"Please set maxWidth and height for TextBlock";this._wrapText(this.ctx); +this._isDirty=!1;return{width:this.width,height:this.height}};ka.prototype._getLineWithWidth=function(k,p,r){k=String(k);if(!k)return{text:"",width:0};var u=r=0,v=k.length-1,H=Infinity;for(this.ctx.font=this._getFontString();u<=v;){var H=Math.floor((u+v)/2),F=k.substr(0,H+1);r=this.ctx.measureText(F).width;if(r<p)u=H+1;else if(r>p)v=H-1;else break}r>p&&1<F.length&&(F=F.substr(0,F.length-1),r=this.ctx.measureText(F).width);p=!0;if(F.length===k.length||" "===k[F.length])p=!1;p&&(k=F.split(" "),1<k.length&& +k.pop(),F=k.join(" "),r=this.ctx.measureText(F).width);return{text:F,width:r}};ka.prototype._wrapText=function(){var k=new String(Ia(String(this.text))),p=[],r=this.ctx.font,u=0,v=0;this.ctx.font=this._getFontString();if(0===this.frontSize)v=u=0;else for(;0<k.length;){var H=this.maxHeight-(this.topPadding+this.bottomPadding),F=this._getLineWithWidth(k,this.maxWidth-(this.leftPadding+this.rightPadding),!1);F.height=this._lineHeight;p.push(F);var z=v,v=Math.max(v,F.width),u=u+F.height,k=Ia(k.slice(F.text.length, +k.length));H&&u>H&&(F=p.pop(),u-=F.height,v=z)}this._wrappedText={lines:p,width:v,height:u};this.width=v+(this.leftPadding+this.rightPadding);this.height=u+(this.topPadding+this.bottomPadding);this.ctx.font=r};ka.prototype._getFontString=function(){var k;k=""+(this.fontStyle?this.fontStyle+" ":"");k+=this.fontWeight?this.fontWeight+" ":"";k+=this.fontSize?this.fontSize+"px ":"";var p=this.fontFamily?this.fontFamily+"":"";!r&&p&&(p=p.split(",")[0],"'"!==p[0]&&'"'!==p[0]&&(p="'"+p+"'"));return k+=p}; +qa(Va,V);qa(Aa,V);Aa.prototype.setLayout=function(){if(this.text){var k=this.dockInsidePlotArea?this.chart.plotArea:this.chart,p=k.layoutManager.getFreeSpace(),r=p.x1,v=p.y1,E=0,H=0,F=this.chart._menuButton&&this.chart.exportEnabled&&"top"===this.verticalAlign?22:0,z,I;"top"===this.verticalAlign||"bottom"===this.verticalAlign?(null===this.maxWidth&&(this.maxWidth=p.width-4-F*("center"===this.horizontalAlign?2:1)),H=0.5*p.height-this.margin-2,E=0):"center"===this.verticalAlign&&("left"===this.horizontalAlign|| +"right"===this.horizontalAlign?(null===this.maxWidth&&(this.maxWidth=p.height-4),H=0.5*p.width-this.margin-2):"center"===this.horizontalAlign&&(null===this.maxWidth&&(this.maxWidth=p.width-4),H=0.5*p.height-4));var L;u(this.padding)||"number"!==typeof this.padding?u(this.padding)||"object"!==typeof this.padding||(L=this.padding.top?this.padding.top:this.padding.bottom?this.padding.bottom:0,L+=this.padding.bottom?this.padding.bottom:this.padding.top?this.padding.top:0,L*=1.25):L=2.5*this.padding;this.wrap|| +(H=Math.min(H,Math.max(1.5*this.fontSize,this.fontSize+L)));H=new ka(this.ctx,{fontSize:this.fontSize,fontFamily:this.fontFamily,fontColor:this.fontColor,fontStyle:this.fontStyle,fontWeight:this.fontWeight,horizontalAlign:this.horizontalAlign,verticalAlign:this.verticalAlign,borderColor:this.borderColor,borderThickness:this.borderThickness,backgroundColor:this.backgroundColor,maxWidth:this.maxWidth,maxHeight:H,cornerRadius:this.cornerRadius,text:this.text,padding:this.padding,textBaseline:"top"}); +L=H.measureText();"top"===this.verticalAlign||"bottom"===this.verticalAlign?("top"===this.verticalAlign?(v=p.y1+2,I="top"):"bottom"===this.verticalAlign&&(v=p.y2-2-L.height,I="bottom"),"left"===this.horizontalAlign?r=p.x1+2:"center"===this.horizontalAlign?r=p.x1+p.width/2-L.width/2:"right"===this.horizontalAlign&&(r=p.x2-2-L.width-F),z=this.horizontalAlign,this.width=L.width,this.height=L.height):"center"===this.verticalAlign&&("left"===this.horizontalAlign?(r=p.x1+2,v=p.y2-2-(this.maxWidth/2-L.width/ +2),E=-90,I="left",this.width=L.height,this.height=L.width):"right"===this.horizontalAlign?(r=p.x2-2,v=p.y1+2+(this.maxWidth/2-L.width/2),E=90,I="right",this.width=L.height,this.height=L.width):"center"===this.horizontalAlign&&(v=k.y1+(k.height/2-L.height/2),r=k.x1+(k.width/2-L.width/2),I="center",this.width=L.width,this.height=L.height),z="center");H.x=r;H.y=v;H.angle=E;H.horizontalAlign=z;this._textBlock=H;k.layoutManager.registerSpace(I,{width:this.width+("left"===I||"right"===I?this.margin+2:0), +height:this.height+("top"===I||"bottom"===I?this.margin+2:0)});this.bounds={x1:r,y1:v,x2:r+this.width,y2:v+this.height};this.ctx.textBaseline="top"}};Aa.prototype.render=function(){this._textBlock&&this._textBlock.render(!0)};qa(Ka,V);Ka.prototype.setLayout=Aa.prototype.setLayout;Ka.prototype.render=Aa.prototype.render;Wa.prototype.get=function(k,p){var r=null;0<this.pool.length?(r=this.pool.pop(),Oa(r,k,p)):r=ta(k,p);return r};Wa.prototype.release=function(k){this.pool.push(k)};qa(La,V);var Na={addTheme:function(k, +p){ya[k]=p},addColorSet:function(k,p){Ba[k]=p},addCultureInfo:function(k,p){Ma[k]=p},formatNumber:function(k,p,r){r=r||"en";if(Ma[r])return ba(k,p||"#,##0.##",new La(r));throw"Unknown Culture Name";},formatDate:function(k,p,r){r=r||"en";if(Ma[r])return Ca(k,p||"DD MMM YYYY",new La(r));throw"Unknown Culture Name";}};"undefined"!==typeof module&&"undefined"!==typeof module.exports?module.exports=Na:"function"===typeof define&&define.amd?define([],function(){return Na}):window.CanvasJS=Na;Na.Chart=function(){function k(a, +d){return a.x-d.x}function p(a,d){d=d||{};this.theme=u(d.theme)||u(ya[d.theme])?"light1":d.theme;p.base.constructor.call(this,"Chart",null,d,null,null);var b=this;this._containerId=a;this._objectsInitialized=!1;this.overlaidCanvasCtx=this.ctx=null;this._indexLabels=[];this._panTimerId=0;this._lastTouchEventType="";this._lastTouchData=null;this.isAnimating=!1;this.renderCount=0;this.disableToolTip=this.animatedRender=!1;this.canvasPool=new Wa;this.allDOMEventHandlers=[];this.panEnabled=!1;this._defaultCursor= +"default";this.plotArea={canvas:null,ctx:null,x1:0,y1:0,x2:0,y2:0,width:0,height:0};this._dataInRenderedOrder=[];if(this.container="string"===typeof this._containerId?document.getElementById(this._containerId):this._containerId){this.container.innerHTML="";var c=0,e=0,c=this.options.width?this.width:0<this.container.clientWidth?this.container.clientWidth:this.width,e=this.options.height?this.height:0<this.container.clientHeight?this.container.clientHeight:this.height;this.width=c;this.height=e;this.x1= +this.y1=0;this.x2=this.width;this.y2=this.height;this._selectedColorSet="undefined"!==typeof Ba[this.colorSet]?Ba[this.colorSet]:Ba.colorSet1;this._canvasJSContainer=document.createElement("div");this._canvasJSContainer.setAttribute("class","canvasjs-chart-container");this._canvasJSContainer.style.position="relative";this._canvasJSContainer.style.textAlign="left";this._canvasJSContainer.style.cursor="auto";r||(this._canvasJSContainer.style.height="0px");this.container.appendChild(this._canvasJSContainer); +this.canvas=ta(c,e);this._preRenderCanvas=ta(c,e);this.canvas.style.position="absolute";this.canvas.style.WebkitUserSelect="none";this.canvas.style.MozUserSelect="none";this.canvas.style.msUserSelect="none";this.canvas.style.userSelect="none";this.canvas.getContext&&(this._canvasJSContainer.appendChild(this.canvas),this.ctx=this.canvas.getContext("2d"),this.ctx.textBaseline="top",Ea(this.ctx),this._preRenderCtx=this._preRenderCanvas.getContext("2d"),this._preRenderCtx.textBaseline="top",Ea(this._preRenderCtx), +r?this.plotArea.ctx=this.ctx:(this.plotArea.canvas=ta(c,e),this.plotArea.canvas.style.position="absolute",this.plotArea.canvas.setAttribute("class","plotAreaCanvas"),this._canvasJSContainer.appendChild(this.plotArea.canvas),this.plotArea.ctx=this.plotArea.canvas.getContext("2d")),this.overlaidCanvas=ta(c,e),this.overlaidCanvas.style.position="absolute",this.overlaidCanvas.style.webkitTapHighlightColor="transparent",this.overlaidCanvas.style.WebkitUserSelect="none",this.overlaidCanvas.style.MozUserSelect= +"none",this.overlaidCanvas.style.msUserSelect="none",this.overlaidCanvas.style.userSelect="none",this.overlaidCanvas.getContext&&(this._canvasJSContainer.appendChild(this.overlaidCanvas),this.overlaidCanvasCtx=this.overlaidCanvas.getContext("2d"),this.overlaidCanvasCtx.textBaseline="top",Ea(this.overlaidCanvasCtx)),this._eventManager=new ha(this),this.windowResizeHandler=O(window,"resize",function(){b._updateSize()&&b.render()},this.allDOMEventHandlers),this._toolBar=document.createElement("div"), +this._toolBar.setAttribute("class","canvasjs-chart-toolbar"),this._toolBar.style.cssText="position: absolute; right: 1px; top: 1px;",this._canvasJSContainer.appendChild(this._toolBar),this.bounds={x1:0,y1:0,x2:this.width,y2:this.height},O(this.overlaidCanvas,"click",function(a){b._mouseEventHandler(a)},this.allDOMEventHandlers),O(this.overlaidCanvas,"mousemove",function(a){b._mouseEventHandler(a)},this.allDOMEventHandlers),O(this.overlaidCanvas,"mouseup",function(a){b._mouseEventHandler(a)},this.allDOMEventHandlers), +O(this.overlaidCanvas,"mousedown",function(a){b._mouseEventHandler(a);va(b._dropdownMenu)},this.allDOMEventHandlers),O(this.overlaidCanvas,"mouseout",function(a){b._mouseEventHandler(a)},this.allDOMEventHandlers),O(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerDown":"touchstart",function(a){b._touchEventHandler(a)},this.allDOMEventHandlers),O(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerMove":"touchmove",function(a){b._touchEventHandler(a)},this.allDOMEventHandlers), +O(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerUp":"touchend",function(a){b._touchEventHandler(a)},this.allDOMEventHandlers),O(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerCancel":"touchcancel",function(a){b._touchEventHandler(a)},this.allDOMEventHandlers),this.toolTip=new $(this,this.options.toolTip),this.data=null,this.axisX=[],this.axisX2=[],this.axisY=[],this.axisY2=[],this.sessionVariables={axisX:[],axisX2:[],axisY:[],axisY2:[]})}else window.console&&window.console.log('CanvasJS Error: Chart Container with id "'+ +this._containerId+'" was not found')}function v(a,d){for(var b=[],c,e=0;e<a.length;e++)if(0==e)b.push(a[0]);else{var g,m,l;l=e-1;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[m].x-a[l].x?0.01:a[m].x-a[l].x))*(d-1)/2+1;var w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0<w||a[l].x<a[g].x&&0>w?{x:a[l].x+w/3,y:a[l].y+c/3}:{x:a[l].x,y:a[l].y+c/9};l=e;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[l].x-a[g].x?0.01:a[l].x-a[g].x))*(d- +1)/2+1;w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0<w||a[l].x<a[g].x&&0>w?{x:a[l].x-w/3,y:a[l].y-c/3}:{x:a[l].x,y:a[l].y-c/9};b[b.length]=a[e]}return b}function E(a,d,b,c,e,g,m,l,w,h){var s=0;h?(m.color=g,l.color=g):h=1;s=w?Math.abs(e-b):Math.abs(c-d);s=0<m.trimLength?Math.abs(s*m.trimLength/100):Math.abs(s-m.length);w?(b+=s/2,e-=s/2):(d+=s/2,c-=s/2);var s=1===Math.round(m.thickness)%2?0.5:0,q=1===Math.round(l.thickness)%2?0.5:0;a.save();a.globalAlpha=h;a.strokeStyle=l.color|| +g;a.lineWidth=l.thickness||2;a.setLineDash&&a.setLineDash(R(l.dashType,l.thickness));a.beginPath();w&&0<l.thickness?(a.moveTo(c-m.thickness/2,Math.round((b+e)/2)-q),a.lineTo(d+m.thickness/2,Math.round((b+e)/2)-q)):0<l.thickness&&(a.moveTo(Math.round((d+c)/2)-q,b+m.thickness/2),a.lineTo(Math.round((d+c)/2)-q,e-m.thickness/2));a.stroke();a.strokeStyle=m.color||g;a.lineWidth=m.thickness||2;a.setLineDash&&a.setLineDash(R(m.dashType,m.thickness));a.beginPath();w&&0<m.thickness?(a.moveTo(c-s,b),a.lineTo(c- +s,e),a.moveTo(d+s,b),a.lineTo(d+s,e)):0<m.thickness&&(a.moveTo(d,b+s),a.lineTo(c,b+s),a.moveTo(d,e-s),a.lineTo(c,e-s));a.stroke();a.restore()}function I(a,d,b,c,e){if(null===a||"undefined"===typeof a)return"undefined"===typeof b?d:b;a=parseFloat(a.toString())*(0<=a.toString().indexOf("%")?d/100:1);"undefined"!==typeof c&&(a=Math.min(c,a),"undefined"!==typeof e&&(a=Math.max(e,a)));return!isNaN(a)&&a<=d&&0<=a?a:"undefined"===typeof b?d:b}function H(a,d){H.base.constructor.call(this,"Legend","legend", +d,null,a);this.chart=a;this.canvas=a.canvas;this.ctx=this.chart.ctx;this.ghostCtx=this.chart._eventManager.ghostCtx;this.items=[];this.optionsName="legend";this.height=this.width=0;this.orientation=null;this.dataSeries=[];this.bounds={x1:null,y1:null,x2:null,y2:null};"undefined"===typeof this.options.fontSize&&(this.fontSize=this.chart.getAutoFontSize(this.fontSize));this.lineHeight=Za(this.fontFamily,this.fontSize,this.fontWeight);this.horizontalSpacing=this.fontSize}function F(a,d,b,c){F.base.constructor.call(this, +"DataSeries","data",d,b,a);this.chart=a;this.canvas=a.canvas;this._ctx=a.canvas.ctx;this.index=b;this.noDataPointsInPlotArea=0;this.id=c;this.chart._eventManager.objectMap[c]={id:c,objectType:"dataSeries",dataSeriesIndex:b};a=d.dataPoints?d.dataPoints.length:0;this.dataPointEOs=[];for(d=0;d<a;d++)this.dataPointEOs[d]={};this.dataPointIds=[];this.plotUnit=[];this.axisY=this.axisX=null;this.optionsName="data";this.isOptionsInArray=!0;null===this.fillOpacity&&(this.type.match(/area/i)?this.fillOpacity= +0.7:this.fillOpacity=1);this.axisPlacement=this.getDefaultAxisPlacement();"undefined"===typeof this.options.indexLabelFontSize&&(this.indexLabelFontSize=this.chart.getAutoFontSize(this.indexLabelFontSize))}function z(a,d,b,c,e,g){z.base.constructor.call(this,"Axis",d,b,c,a);this.chart=a;this.canvas=a.canvas;this.ctx=a.ctx;this.intervalStartPosition=this.maxHeight=this.maxWidth=0;this.labels=[];this.dataSeries=[];this._stripLineLabels=this._ticks=this._labels=null;this.dataInfo={min:Infinity,max:-Infinity, +viewPortMin:Infinity,viewPortMax:-Infinity,minDiff:Infinity};this.isOptionsInArray=!0;"axisX"===e?("left"===g||"bottom"===g?(this.optionsName="axisX",u(this.chart.sessionVariables.axisX[c])&&(this.chart.sessionVariables.axisX[c]={}),this.sessionVariables=this.chart.sessionVariables.axisX[c]):(this.optionsName="axisX2",u(this.chart.sessionVariables.axisX2[c])&&(this.chart.sessionVariables.axisX2[c]={}),this.sessionVariables=this.chart.sessionVariables.axisX2[c]),this.options.interval||(this.intervalType= +null)):"left"===g||"bottom"===g?(this.optionsName="axisY",u(this.chart.sessionVariables.axisY[c])&&(this.chart.sessionVariables.axisY[c]={}),this.sessionVariables=this.chart.sessionVariables.axisY[c]):(this.optionsName="axisY2",u(this.chart.sessionVariables.axisY2[c])&&(this.chart.sessionVariables.axisY2[c]={}),this.sessionVariables=this.chart.sessionVariables.axisY2[c]);"undefined"===typeof this.options.titleFontSize&&(this.titleFontSize=this.chart.getAutoFontSize(this.titleFontSize));"undefined"=== +typeof this.options.labelFontSize&&(this.labelFontSize=this.chart.getAutoFontSize(this.labelFontSize));this.type=e;"axisX"!==e||b&&"undefined"!==typeof b.gridThickness||(this.gridThickness=0);this._position=g;this.lineCoordinates={x1:null,y1:null,x2:null,y2:null,width:null};this.labelAngle=(this.labelAngle%360+360)%360;90<this.labelAngle&&270>this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360);this.options.scaleBreaks&&(this.scaleBreaks=new Q(this.chart, +this.options.scaleBreaks,++this.chart._eventManager.lastObjectId,this));this.stripLines=[];if(this.options.stripLines&&0<this.options.stripLines.length)for(a=0;a<this.options.stripLines.length;a++)this.stripLines.push(new X(this.chart,this.options.stripLines[a],a,++this.chart._eventManager.lastObjectId,this));this.options.crosshair&&(this.crosshair=new fa(this.chart,this.options.crosshair,this));this._titleTextBlock=null;this.hasOptionChanged("viewportMinimum")&&null===this.viewportMinimum&&(this.options.viewportMinimum= +void 0,this.sessionVariables.viewportMinimum=null);this.hasOptionChanged("viewportMinimum")||isNaN(this.sessionVariables.newViewportMinimum)||null===this.sessionVariables.newViewportMinimum?this.sessionVariables.newViewportMinimum=null:this.viewportMinimum=this.sessionVariables.newViewportMinimum;this.hasOptionChanged("viewportMaximum")&&null===this.viewportMaximum&&(this.options.viewportMaximum=void 0,this.sessionVariables.viewportMaximum=null);this.hasOptionChanged("viewportMaximum")||isNaN(this.sessionVariables.newViewportMaximum)|| +null===this.sessionVariables.newViewportMaximum?this.sessionVariables.newViewportMaximum=null:this.viewportMaximum=this.sessionVariables.newViewportMaximum;null!==this.minimum&&null!==this.viewportMinimum&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));null!==this.maximum&&null!==this.viewportMaximum&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.trackChanges("viewportMinimum");this.trackChanges("viewportMaximum")}function Q(a,d,b,c){Q.base.constructor.call(this, +"ScaleBreaks","scaleBreaks",d,null,c);this.id=b;this.chart=a;this.ctx=this.chart.ctx;this.axis=c;this.optionsName="scaleBreaks";this.isOptionsInArray=!1;this._appliedBreaks=[];this.customBreaks=[];this.autoBreaks=[];"string"===typeof this.spacing?(this.spacing=parseFloat(this.spacing),this.spacing=isNaN(this.spacing)?8:(10<this.spacing?10:this.spacing)+"%"):"number"!==typeof this.spacing&&(this.spacing=8);this.autoCalculate&&(this.maxNumberOfAutoBreaks=Math.min(this.maxNumberOfAutoBreaks,5));if(this.options.customBreaks&& +0<this.options.customBreaks.length){for(a=0;a<this.options.customBreaks.length;a++)this.customBreaks.push(new L(this.chart,"customBreaks",this.options.customBreaks[a],a,++this.chart._eventManager.lastObjectId,this)),"number"===typeof this.customBreaks[a].startValue&&("number"===typeof this.customBreaks[a].endValue&&this.customBreaks[a].endValue!==this.customBreaks[a].startValue)&&this._appliedBreaks.push(this.customBreaks[a]);this._appliedBreaks.sort(function(a,c){return a.startValue-c.startValue}); +for(a=0;a<this._appliedBreaks.length-1;a++)this._appliedBreaks[a].endValue>=this._appliedBreaks[a+1].startValue&&(this._appliedBreaks[a].endValue=Math.max(this._appliedBreaks[a].endValue,this._appliedBreaks[a+1].endValue),window.console&&window.console.log("CanvasJS Error: Breaks "+a+" and "+(a+1)+" are overlapping."),this._appliedBreaks.splice(a,2),a--)}}function L(a,d,b,c,e,g){L.base.constructor.call(this,"Break",d,b,c,g);this.id=e;this.chart=a;this.ctx=this.chart.ctx;this.scaleBreaks=g;this.optionsName= +d;this.isOptionsInArray=!0;this.type=b.type?this.type:g.type;this.fillOpacity=u(b.fillOpacity)?g.fillOpacity:this.fillOpacity;this.lineThickness=u(b.lineThickness)?g.lineThickness:this.lineThickness;this.color=b.color?this.color:g.color;this.lineColor=b.lineColor?this.lineColor:g.lineColor;this.lineDashType=b.lineDashType?this.lineDashType:g.lineDashType;!u(this.startValue)&&this.startValue.getTime&&(this.startValue=this.startValue.getTime());!u(this.endValue)&&this.endValue.getTime&&(this.endValue= +this.endValue.getTime());"number"===typeof this.startValue&&("number"===typeof this.endValue&&this.endValue<this.startValue)&&(a=this.startValue,this.startValue=this.endValue,this.endValue=a);this.spacing="undefined"===typeof b.spacing?g.spacing:b.spacing;"string"===typeof this.options.spacing?(this.spacing=parseFloat(this.spacing),this.spacing=isNaN(this.spacing)?0:(10<this.spacing?10:this.spacing)+"%"):"number"!==typeof this.options.spacing&&(this.spacing=g.spacing);this.size=g.parent.logarithmic? +1:0}function X(a,d,b,c,e){X.base.constructor.call(this,"StripLine","stripLines",d,b,e);this.id=c;this.chart=a;this.ctx=this.chart.ctx;this.label=this.label;this.axis=e;this.optionsName="stripLines";this.isOptionsInArray=!0;this._thicknessType="pixel";null!==this.startValue&&null!==this.endValue&&(this.value=e.logarithmic?Math.sqrt((this.startValue.getTime?this.startValue.getTime():this.startValue)*(this.endValue.getTime?this.endValue.getTime():this.endValue)):((this.startValue.getTime?this.startValue.getTime(): +this.startValue)+(this.endValue.getTime?this.endValue.getTime():this.endValue))/2,this._thicknessType=null)}function fa(a,d,b){fa.base.constructor.call(this,"Crosshair","crosshair",d,null,b);this.chart=a;this.ctx=this.chart.ctx;this.axis=b;this.optionsName="crosshair";this._thicknessType="pixel"}function $(a,d){$.base.constructor.call(this,"ToolTip","toolTip",d,null,a);this.chart=a;this.canvas=a.canvas;this.ctx=this.chart.ctx;this.currentDataPointIndex=this.currentSeriesIndex=-1;this._prevY=this._prevX= +NaN;this.containerTransitionDuration=0.1;this.mozContainerTransition=this.getContainerTransition(this.containerTransitionDuration);this.optionsName="toolTip";this._initialize()}function ha(a){this.chart=a;this.lastObjectId=0;this.objectMap=[];this.rectangularRegionEventSubscriptions=[];this.previousDataPointEventObject=null;this.ghostCanvas=ta(this.chart.width,this.chart.height);this.ghostCtx=this.ghostCanvas.getContext("2d");this.mouseoveredObjectMaps=[]}function ga(a){this.chart=a;this.ctx=this.chart.plotArea.ctx; +this.animations=[];this.animationRequestId=null}qa(p,V);p.prototype.destroy=function(){var a=this.allDOMEventHandlers;this._animator&&this._animator.cancelAllAnimations();this._panTimerId&&clearTimeout(this._panTimerId);for(var d=0;d<a.length;d++){var b=a[d][0],c=a[d][1],e=a[d][2],g=a[d][3],g=g||!1;b.removeEventListener?b.removeEventListener(c,e,g):b.detachEvent&&b.detachEvent("on"+c,e)}this.allDOMEventHandlers=[];for(this.removeAllEventListeners();this._canvasJSContainer&&this._canvasJSContainer.hasChildNodes();)this._canvasJSContainer.removeChild(this._canvasJSContainer.lastChild); +for(;this.container&&this.container.hasChildNodes();)this.container.removeChild(this.container.lastChild);for(;this._dropdownMenu&&this._dropdownMenu.hasChildNodes();)this._dropdownMenu.removeChild(this._dropdownMenu.lastChild);this.overlaidCanvas=this.canvas=this.container=this._canvasJSContainer=null;this._toolBar=this._dropdownMenu=this._menuButton=this._resetButton=this._zoomButton=this._breaksCanvas=this._preRenderCanvas=this.toolTip.container=null};p.prototype._updateOptions=function(){var a= +this;this.updateOption("width");this.updateOption("height");this.updateOption("dataPointWidth");this.updateOption("dataPointMinWidth");this.updateOption("dataPointMaxWidth");this.updateOption("interactivityEnabled");this.updateOption("theme");this.updateOption("colorSet")&&(this._selectedColorSet="undefined"!==typeof Ba[this.colorSet]?Ba[this.colorSet]:Ba.colorSet1);this.updateOption("backgroundColor");this.backgroundColor||(this.backgroundColor="rgba(0,0,0,0)");this.updateOption("culture");this._cultureInfo= +new La(this.options.culture);this.updateOption("animationEnabled");this.animationEnabled=this.animationEnabled&&r;this.updateOption("animationDuration");this.updateOption("rangeChanging");this.updateOption("rangeChanged");this.updateOption("exportEnabled");this.updateOption("exportFileName");this.updateOption("zoomType");if(this.options.zoomEnabled){if(!this._zoomButton){var d=!1;va(this._zoomButton=document.createElement("button"));ua(this,this._zoomButton,"pan");this._toolBar.appendChild(this._zoomButton); +this._zoomButton.style.borderRight=this.toolbar.borderThickness+"px solid "+this.toolbar.borderColor;O(this._zoomButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(this._zoomButton,"click",function(){a.zoomEnabled?(a.zoomEnabled=!1,a.panEnabled=!0,ua(a,a._zoomButton,"zoom")):(a.zoomEnabled=!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"));a.render()},this.allDOMEventHandlers);O(this._zoomButton,"mouseover",function(){d?d=!1:(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColorOnHover, +color:a.toolbar.fontColorOnHover,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers);O(this._zoomButton,"mouseout",function(){d||(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(0%)", +filter:"invert(0%)"}))},this.allDOMEventHandlers)}this._resetButton||(d=!1,va(this._resetButton=document.createElement("button")),ua(this,this._resetButton,"reset"),this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor,this._toolBar.appendChild(this._resetButton),O(this._resetButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._resetButton,"click",function(){a.toolTip.hide();a.zoomEnabled||a.panEnabled?(a.zoomEnabled= +!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"),a._defaultCursor="default",a.overlaidCanvas.style.cursor=a._defaultCursor):(a.zoomEnabled=!1,a.panEnabled=!1);if(a.sessionVariables.axisX)for(var c=0;c<a.sessionVariables.axisX.length;c++)a.sessionVariables.axisX[c].newViewportMinimum=null,a.sessionVariables.axisX[c].newViewportMaximum=null;if(a.sessionVariables.axisX2)for(c=0;c<a.sessionVariables.axisX2.length;c++)a.sessionVariables.axisX2[c].newViewportMinimum=null,a.sessionVariables.axisX2[c].newViewportMaximum= +null;if(a.sessionVariables.axisY)for(c=0;c<a.sessionVariables.axisY.length;c++)a.sessionVariables.axisY[c].newViewportMinimum=null,a.sessionVariables.axisY[c].newViewportMaximum=null;if(a.sessionVariables.axisY2)for(c=0;c<a.sessionVariables.axisY2.length;c++)a.sessionVariables.axisY2[c].newViewportMinimum=null,a.sessionVariables.axisY2[c].newViewportMaximum=null;a.resetOverlayedCanvas();va(a._zoomButton,a._resetButton);a._dispatchRangeEvent("rangeChanging","reset");a.render();a._dispatchRangeEvent("rangeChanged", +"reset");a.syncCharts&&a.syncCharts(null,null)},this.allDOMEventHandlers),O(this._resetButton,"mouseover",function(){d||(sa(a,a._resetButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.hoverFfontColorOnHoverontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers),O(this._resetButton,"mouseout",function(){d||(sa(a,a._resetButton, +{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers),this.overlaidCanvas.style.cursor=a._defaultCursor);this.zoomEnabled||this.panEnabled||(this._zoomButton?(a._zoomButton.getAttribute("state")===a._cultureInfo.zoomText?(this.panEnabled=!0,this.zoomEnabled=!1):(this.zoomEnabled=!0,this.panEnabled= +!1),Qa(a._zoomButton,a._resetButton)):(this.zoomEnabled=!0,this.panEnabled=!1))}else this.panEnabled=this.zoomEnabled=!1;this._menuButton?this.exportEnabled?Qa(this._menuButton):va(this._menuButton):this.exportEnabled&&r&&(d=!1,this._menuButton=document.createElement("button"),ua(this,this._menuButton,"menu"),this._toolBar.appendChild(this._menuButton),O(this._menuButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._menuButton,"click",function(){"none"!==a._dropdownMenu.style.display|| +a._dropDownCloseTime&&500>=(new Date).getTime()-a._dropDownCloseTime.getTime()||(a._dropdownMenu.style.display="block",a._menuButton.blur(),a._dropdownMenu.focus())},this.allDOMEventHandlers,!0),O(this._menuButton,"mouseover",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.fontColorOnHover}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers,!0), +O(this._menuButton,"mouseout",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers,!0));if(!this._dropdownMenu&&this.exportEnabled&&r){d=!1;this._dropdownMenu=document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);var b=-1!==this.theme.indexOf("dark")?"black":"#888888";this._dropdownMenu.style.cssText= +"position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 0px;top: 25px;min-width: 120px;outline: 0;font-size: 14px; font-family: Arial, Helvetica, sans-serif;padding: 5px 0px 5px 0px;text-align: left;line-height: 10px;background-color:"+this.toolbar.backgroundColor+";box-shadow: 2px 2px 10px "+b;a._dropdownMenu.style.display="none";this._toolBar.appendChild(this._dropdownMenu);O(this._dropdownMenu,"blur",function(){va(a._dropdownMenu); +a._dropDownCloseTime=new Date},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.printText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers, +!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){a.print();va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.saveJPGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d= +!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"jpeg",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText= +"padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.savePNGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor, +this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"png",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0)}"none"!==this._toolBar.style.display&&this._zoomButton&&(this.panEnabled?ua(a,a._zoomButton,"zoom"):ua(a,a._zoomButton,"pan"),a._resetButton.getAttribute("state")!==a._cultureInfo.resetText&&ua(a,a._resetButton,"reset"));this.options.toolTip&&this.toolTip.options!==this.options.toolTip&&(this.toolTip.options=this.options.toolTip); +for(var c in this.toolTip.options)this.toolTip.options.hasOwnProperty(c)&&this.toolTip.updateOption(c)};p.prototype._updateSize=function(){var a;a=[this.canvas,this._preRenderCanvas,this.overlaidCanvas,this._eventManager.ghostCanvas];var d=0,b=0;this.options.width?d=this.width:this.width=d=0<this.container.clientWidth?this.container.clientWidth:this.width;this.options.height?b=this.height:this.height=b=0<this.container.clientHeight?this.container.clientHeight:this.height;if(this.canvas.width!==d* +W||this.canvas.height!==b*W){for(var c=0;c<a.length;c++)Oa(a[c],d,b);a=!0}else a=!1;return a};p.prototype._initialize=function(){this.isNavigator=u(this.parent)||u(this.parent._defaultsKey)||"Navigator"!==this.parent._defaultsKey?!1:!0;this.toolbar=new Va(this,this.options.toolbar);this._animator?this._animator.cancelAllAnimations():this._animator=new ga(this);this.removeAllEventListeners();this.disableToolTip=!1;this._axes=[];this.funnelPyramidClickHandler=this.pieDoughnutClickHandler=null;this._updateOptions(); +this.animatedRender=r&&this.animationEnabled&&0===this.renderCount;this._updateSize();this.clearCanvas();this.ctx.beginPath();this.axisX=[];this.axisX2=[];this.axisY=[];this.axisY2=[];this._indexLabels=[];this._dataInRenderedOrder=[];this._events=[];this._eventManager&&this._eventManager.reset();this.plotInfo={axisPlacement:null,plotTypes:[]};this.layoutManager=new Ga(0,0,this.width,this.height,this.isNavigator?0:2);this.plotArea.layoutManager&&this.plotArea.layoutManager.reset();this.data=[];var a= +0,d=null;if(this.options.data){for(var b=0;b<this.options.data.length;b++)if(a++,!this.options.data[b].type||0<=p._supportedChartTypes.indexOf(this.options.data[b].type)){var c=new F(this,this.options.data[b],a-1,++this._eventManager.lastObjectId);"error"===c.type&&(c.linkedDataSeriesIndex=u(this.options.data[b].linkedDataSeriesIndex)?b-1:this.options.data[b].linkedDataSeriesIndex,0>c.linkedDataSeriesIndex||c.linkedDataSeriesIndex>=this.options.data.length||"number"!==typeof c.linkedDataSeriesIndex|| +"error"===this.options.data[c.linkedDataSeriesIndex].type)&&(c.linkedDataSeriesIndex=null);null===c.name&&(c.name="DataSeries "+a);null===c.color?1<this.options.data.length?(c._colorSet=[this._selectedColorSet[c.index%this._selectedColorSet.length]],c.color=this._selectedColorSet[c.index%this._selectedColorSet.length]):c._colorSet="line"===c.type||"stepLine"===c.type||"spline"===c.type||"area"===c.type||"stepArea"===c.type||"splineArea"===c.type||"stackedArea"===c.type||"stackedArea100"===c.type|| +"rangeArea"===c.type||"rangeSplineArea"===c.type||"candlestick"===c.type||"ohlc"===c.type||"waterfall"===c.type||"boxAndWhisker"===c.type?[this._selectedColorSet[0]]:this._selectedColorSet:c._colorSet=[c.color];null===c.markerSize&&(("line"===c.type||"stepLine"===c.type||"spline"===c.type||0<=c.type.toLowerCase().indexOf("area"))&&c.dataPoints&&c.dataPoints.length<this.width/16||"scatter"===c.type)&&(c.markerSize=8);"bubble"!==c.type&&"scatter"!==c.type||!c.dataPoints||(c.dataPoints.some?c.dataPoints.some(function(a){return a.x})&& +c.dataPoints.sort(k):c.dataPoints.sort(k));this.data.push(c);var e=c.axisPlacement,d=d||e,g;"normal"===e?"xySwapped"===this.plotInfo.axisPlacement?g='You cannot combine "'+c.type+'" with bar chart':"none"===this.plotInfo.axisPlacement?g='You cannot combine "'+c.type+'" with pie chart':null===this.plotInfo.axisPlacement&&(this.plotInfo.axisPlacement="normal"):"xySwapped"===e?"normal"===this.plotInfo.axisPlacement?g='You cannot combine "'+c.type+'" with line, area, column or pie chart':"none"===this.plotInfo.axisPlacement? +g='You cannot combine "'+c.type+'" with pie chart':null===this.plotInfo.axisPlacement&&(this.plotInfo.axisPlacement="xySwapped"):"none"===e?"normal"===this.plotInfo.axisPlacement?g='You cannot combine "'+c.type+'" with line, area, column or bar chart':"xySwapped"===this.plotInfo.axisPlacement?g='You cannot combine "'+c.type+'" with bar chart':null===this.plotInfo.axisPlacement&&(this.plotInfo.axisPlacement="none"):null===e&&"none"===this.plotInfo.axisPlacement&&(g='You cannot combine "'+c.type+'" with pie chart'); +if(g&&window.console){window.console.log(g);return}}for(b=0;b<this.data.length;b++){if("none"==d&&"error"===this.data[b].type&&window.console){window.console.log('You cannot combine "'+c.type+'" with error chart');return}"error"===this.data[b].type&&(this.data[b].axisPlacement=this.plotInfo.axisPlacement=d||"normal",this.data[b]._linkedSeries=null===this.data[b].linkedDataSeriesIndex?null:this.data[this.data[b].linkedDataSeriesIndex])}}this._objectsInitialized=!0;this._plotAreaElements=[]};p._supportedChartTypes= +Fa("line stepLine spline column area stepArea splineArea bar bubble scatter stackedColumn stackedColumn100 stackedBar stackedBar100 stackedArea stackedArea100 candlestick ohlc boxAndWhisker rangeColumn error rangeBar rangeArea rangeSplineArea pie doughnut funnel pyramid waterfall".split(" "));p.prototype.setLayout=function(){for(var a=this._plotAreaElements,d=0;d<this.data.length;d++)if("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement){if(!this.data[d].axisYType|| +"primary"===this.data[d].axisYType)if(this.options.axisY&&0<this.options.axisY.length){if(!this.axisY.length)for(var b=0;b<this.options.axisY.length;b++)"normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisY[b]=new z(this,"axisY",this.options.axisY[b],b,"axisY","left")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisY[b]=new z(this,"axisY",this.options.axisY[b],b,"axisY","bottom"));this.data[d].axisY=this.axisY[0<=this.data[d].axisYIndex&&this.data[d].axisYIndex<this.axisY.length? +this.data[d].axisYIndex:0];this.axisY[0<=this.data[d].axisYIndex&&this.data[d].axisYIndex<this.axisY.length?this.data[d].axisYIndex:0].dataSeries.push(this.data[d])}else this.axisY.length||("normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisY[0]=new z(this,"axisY",this.options.axisY,0,"axisY","left")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisY[0]=new z(this,"axisY",this.options.axisY,0,"axisY","bottom"))),this.data[d].axisY=this.axisY[0],this.axisY[0].dataSeries.push(this.data[d]); +if("secondary"===this.data[d].axisYType)if(this.options.axisY2&&0<this.options.axisY2.length){if(!this.axisY2.length)for(b=0;b<this.options.axisY2.length;b++)"normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisY2[b]=new z(this,"axisY2",this.options.axisY2[b],b,"axisY","right")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisY2[b]=new z(this,"axisY2",this.options.axisY2[b],b,"axisY","top"));this.data[d].axisY=this.axisY2[0<=this.data[d].axisYIndex&&this.data[d].axisYIndex< +this.axisY2.length?this.data[d].axisYIndex:0];this.axisY2[0<=this.data[d].axisYIndex&&this.data[d].axisYIndex<this.axisY2.length?this.data[d].axisYIndex:0].dataSeries.push(this.data[d])}else this.axisY2.length||("normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisY2[0]=new z(this,"axisY2",this.options.axisY2,0,"axisY","right")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisY2[0]=new z(this,"axisY2",this.options.axisY2,0,"axisY","top"))),this.data[d].axisY=this.axisY2[0], +this.axisY2[0].dataSeries.push(this.data[d]);if(!this.data[d].axisXType||"primary"===this.data[d].axisXType)if(this.options.axisX&&0<this.options.axisX.length){if(!this.axisX.length)for(b=0;b<this.options.axisX.length;b++)"normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisX[b]=new z(this,"axisX",this.options.axisX[b],b,"axisX","bottom")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisX[b]=new z(this,"axisX",this.options.axisX[b],b,"axisX","left"));this.data[d].axisX= +this.axisX[0<=this.data[d].axisXIndex&&this.data[d].axisXIndex<this.axisX.length?this.data[d].axisXIndex:0];this.axisX[0<=this.data[d].axisXIndex&&this.data[d].axisXIndex<this.axisX.length?this.data[d].axisXIndex:0].dataSeries.push(this.data[d])}else this.axisX.length||("normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisX[0]=new z(this,"axisX",this.options.axisX,0,"axisX","bottom")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisX[0]=new z(this,"axisX",this.options.axisX, +0,"axisX","left"))),this.data[d].axisX=this.axisX[0],this.axisX[0].dataSeries.push(this.data[d]);if("secondary"===this.data[d].axisXType)if(this.options.axisX2&&0<this.options.axisX2.length){if(!this.axisX2.length)for(b=0;b<this.options.axisX2.length;b++)"normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisX2[b]=new z(this,"axisX2",this.options.axisX2[b],b,"axisX","top")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisX2[b]=new z(this,"axisX2",this.options.axisX2[b], +b,"axisX","right"));this.data[d].axisX=this.axisX2[0<=this.data[d].axisXIndex&&this.data[d].axisXIndex<this.axisX2.length?this.data[d].axisXIndex:0];this.axisX2[0<=this.data[d].axisXIndex&&this.data[d].axisXIndex<this.axisX2.length?this.data[d].axisXIndex:0].dataSeries.push(this.data[d])}else this.axisX2.length||("normal"===this.plotInfo.axisPlacement?this._axes.push(this.axisX2[0]=new z(this,"axisX2",this.options.axisX2,0,"axisX","top")):"xySwapped"===this.plotInfo.axisPlacement&&this._axes.push(this.axisX2[0]= +new z(this,"axisX2",this.options.axisX2,0,"axisX","right"))),this.data[d].axisX=this.axisX2[0],this.axisX2[0].dataSeries.push(this.data[d])}if(this.axisY){for(b=1;b<this.axisY.length;b++)"undefined"===typeof this.axisY[b].options.gridThickness&&(this.axisY[b].gridThickness=0);for(b=0;b<this.axisY.length-1;b++)"undefined"===typeof this.axisY[b].options.margin&&(this.axisY[b].margin=10)}if(this.axisY2){for(b=1;b<this.axisY2.length;b++)"undefined"===typeof this.axisY2[b].options.gridThickness&&(this.axisY2[b].gridThickness= +0);for(b=0;b<this.axisY2.length-1;b++)"undefined"===typeof this.axisY2[b].options.margin&&(this.axisY2[b].margin=10)}this.axisY&&0<this.axisY.length&&(this.axisY2&&0<this.axisY2.length)&&(0<this.axisY[0].gridThickness&&"undefined"===typeof this.axisY2[0].options.gridThickness?this.axisY2[0].gridThickness=0:0<this.axisY2[0].gridThickness&&"undefined"===typeof this.axisY[0].options.gridThickness&&(this.axisY[0].gridThickness=0));if(this.axisX)for(b=0;b<this.axisX.length;b++)"undefined"===typeof this.axisX[b].options.gridThickness&& +(this.axisX[b].gridThickness=0);if(this.axisX2)for(b=0;b<this.axisX2.length;b++)"undefined"===typeof this.axisX2[b].options.gridThickness&&(this.axisX2[b].gridThickness=0);this.axisX&&0<this.axisX.length&&(this.axisX2&&0<this.axisX2.length)&&(0<this.axisX[0].gridThickness&&"undefined"===typeof this.axisX2[0].options.gridThickness?this.axisX2[0].gridThickness=0:0<this.axisX2[0].gridThickness&&"undefined"===typeof this.axisX[0].options.gridThickness&&(this.axisX[0].gridThickness=0));b=!1;if(0<this._axes.length&& +(this.zoomEnabled||this.panEnabled))for(d=0;d<this._axes.length;d++)if(null!==this._axes[d].viewportMinimum||null!==this._axes[d].viewportMaximum){b=!0;break}b?(Qa(this._zoomButton,this._resetButton),this._toolBar.style.border=this.toolbar.borderThickness+"px solid "+this.toolbar.borderColor,this._zoomButton.style.borderRight=this.toolbar.borderThickness+"px solid "+this.toolbar.borderColor,this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor): +(va(this._zoomButton,this._resetButton),this._toolBar.style.border=this.toolbar.borderThickness+"px solid transparent",this.options.zoomEnabled&&(this.zoomEnabled=!0,this.panEnabled=!1));gb(this);this._processData();this.options.title&&(this.title=new Aa(this,this.options.title),this.title.dockInsidePlotArea?a.push(this.title):this.title.setLayout());this.subtitles=[];if(this.options.subtitles)for(d=0;d<this.options.subtitles.length;d++)b=new Ka(this,this.options.subtitles[d],d),this.subtitles.push(b), +b.dockInsidePlotArea?a.push(b):b.setLayout();this.legend=new H(this,this.options.legend);for(d=0;d<this.data.length;d++)(this.data[d].showInLegend||"pie"===this.data[d].type||"doughnut"===this.data[d].type||"funnel"===this.data[d].type||"pyramid"===this.data[d].type)&&this.legend.dataSeries.push(this.data[d]);this.legend.dockInsidePlotArea?a.push(this.legend):this.legend.setLayout();for(d=0;d<this._axes.length;d++)if(this._axes[d].scaleBreaks&&this._axes[d].scaleBreaks._appliedBreaks.length){r?(this._breaksCanvas= +ta(this.width,this.height,!0),this._breaksCanvasCtx=this._breaksCanvas.getContext("2d")):(this._breaksCanvas=this.canvas,this._breaksCanvasCtx=this.ctx);break}this._preRenderCanvas=u(this._preRenderCanvas)?ta(this.width,this.height):this._preRenderCanvas;this._preRenderCtx=this._preRenderCanvas.getContext("2d");"normal"!==this.plotInfo.axisPlacement&&"xySwapped"!==this.plotInfo.axisPlacement||z.setLayout(this.axisX,this.axisX2,this.axisY,this.axisY2,this.plotInfo.axisPlacement,this.layoutManager.getFreeSpace())}; +p.prototype.renderElements=function(){var a=this._plotAreaElements;this.title&&!this.title.dockInsidePlotArea&&this.title.render();for(var d=0;d<this.subtitles.length;d++)this.subtitles[d].dockInsidePlotArea||this.subtitles[d].render();this.legend.dockInsidePlotArea||this.legend.render();if("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)z.render(this.axisX,this.axisX2,this.axisY,this.axisY2,this.plotInfo.axisPlacement);else if("none"===this.plotInfo.axisPlacement)this.preparePlotArea(); +else return;for(d=0;d<a.length;d++)a[d].setLayout(),a[d].render();var b=[];if(this.animatedRender){var c=ta(this.width,this.height);c.getContext("2d").drawImage(this.canvas,0,0,this.width,this.height)}hb(this);var a=this.ctx.miterLimit,e;this.ctx.miterLimit=3;r&&this._breaksCanvas&&(this._preRenderCtx.drawImage(this.canvas,0,0,this.width,this.height),this._preRenderCtx.drawImage(this._breaksCanvas,0,0,this.width,this.height),this._breaksCanvasCtx.globalCompositeOperation="source-atop",this._breaksCanvasCtx.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),this._preRenderCtx.clearRect(0,0,this.width,this.height));for(d=0;d<this.plotInfo.plotTypes.length;d++)for(var g=this.plotInfo.plotTypes[d],m=0;m<g.plotUnits.length;m++){var l=g.plotUnits[m],w=null;l.targetCanvas=null;this.animatedRender&&(l.targetCanvas=ta(this.width,this.height),l.targetCanvasCtx=l.targetCanvas.getContext("2d"),e=l.targetCanvasCtx.miterLimit,l.targetCanvasCtx.miterLimit=3);"line"===l.type?w=this.renderLine(l):"stepLine"===l.type?w=this.renderStepLine(l): +"spline"===l.type?w=this.renderSpline(l):"column"===l.type?w=this.renderColumn(l):"bar"===l.type?w=this.renderBar(l):"area"===l.type?w=this.renderArea(l):"stepArea"===l.type?w=this.renderStepArea(l):"splineArea"===l.type?w=this.renderSplineArea(l):"stackedColumn"===l.type?w=this.renderStackedColumn(l):"stackedColumn100"===l.type?w=this.renderStackedColumn100(l):"stackedBar"===l.type?w=this.renderStackedBar(l):"stackedBar100"===l.type?w=this.renderStackedBar100(l):"stackedArea"===l.type?w=this.renderStackedArea(l): +"stackedArea100"===l.type?w=this.renderStackedArea100(l):"bubble"===l.type?w=w=this.renderBubble(l):"scatter"===l.type?w=this.renderScatter(l):"pie"===l.type?this.renderPie(l):"doughnut"===l.type?this.renderPie(l):"funnel"===l.type?w=this.renderFunnel(l):"pyramid"===l.type?w=this.renderFunnel(l):"candlestick"===l.type?w=this.renderCandlestick(l):"ohlc"===l.type?w=this.renderCandlestick(l):"rangeColumn"===l.type?w=this.renderRangeColumn(l):"error"===l.type?w=this.renderError(l):"rangeBar"===l.type? +w=this.renderRangeBar(l):"rangeArea"===l.type?w=this.renderRangeArea(l):"rangeSplineArea"===l.type?w=this.renderRangeSplineArea(l):"waterfall"===l.type?w=this.renderWaterfall(l):"boxAndWhisker"===l.type&&(w=this.renderBoxAndWhisker(l));for(var h=0;h<l.dataSeriesIndexes.length;h++)this._dataInRenderedOrder.push(this.data[l.dataSeriesIndexes[h]]);this.animatedRender&&(l.targetCanvasCtx.miterLimit=e,w&&b.push(w))}this.ctx.miterLimit=a;this.animatedRender&&this._breaksCanvasCtx&&b.push({source:this._breaksCanvasCtx, +dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0,startTimePercent:0.7});this.animatedRender&&0<this._indexLabels.length&&(e=ta(this.width,this.height).getContext("2d"),b.push(this.renderIndexLabels(e)));var s=this;if(0<b.length)s.disableToolTip=!0,s._animator.animate(200,s.animationDuration,function(a){s.ctx.clearRect(0,0,s.width,s.height);s.ctx.drawImage(c,0,0,Math.floor(s.width*W),Math.floor(s.height*W),0,0,s.width,s.height);for(var e= +0;e<b.length;e++)w=b[e],1>a&&"undefined"!==typeof w.startTimePercent?a>=w.startTimePercent&&w.animationCallback(w.easingFunction(a-w.startTimePercent,0,1,1-w.startTimePercent),w):w.animationCallback(w.easingFunction(a,0,1,1),w);s.dispatchEvent("dataAnimationIterationEnd",{chart:s})},function(){b=[];for(var a=0;a<s.plotInfo.plotTypes.length;a++)for(var e=s.plotInfo.plotTypes[a],d=0;d<e.plotUnits.length;d++)e.plotUnits[d].targetCanvas=null;c=null;s.disableToolTip=!1});else{if(s._breaksCanvas)if(r)s.plotArea.ctx.drawImage(s._breaksCanvas, +0,0,this.width,this.height);else for(h=0;h<s._axes.length;h++)s._axes[h].createMask();0<s._indexLabels.length&&s.renderIndexLabels();s.dispatchEvent("dataAnimationIterationEnd",{chart:s})}this.attachPlotAreaEventHandlers();this.zoomEnabled||(this.panEnabled||!this._zoomButton||"none"===this._zoomButton.style.display)||va(this._zoomButton,this._resetButton);this.toolTip._updateToolTip();this.renderCount++;Ja&&(s=this,setTimeout(function(){var a=document.getElementById("ghostCanvasCopy");a&&(Oa(a,s.width, +s.height),a.getContext("2d").drawImage(s._eventManager.ghostCanvas,0,0))},2E3));this._breaksCanvas&&(delete this._breaksCanvas,delete this._breaksCanvasCtx);for(h=0;h<this._axes.length;h++)this._axes[h].maskCanvas&&(delete this._axes[h].maskCanvas,delete this._axes[h].maskCtx)};p.prototype.render=function(a){a&&(this.options=a);this._initialize();this.setLayout();this.renderElements()};p.prototype.attachPlotAreaEventHandlers=function(){this.attachEvent({context:this,chart:this,mousedown:this._plotAreaMouseDown, +mouseup:this._plotAreaMouseUp,mousemove:this._plotAreaMouseMove,cursor:this.panEnabled?"move":"default",capture:!0,bounds:this.plotArea})};p.prototype.categoriseDataSeries=function(){for(var a="",d=0;d<this.data.length;d++)if(a=this.data[d],a.dataPoints&&(0!==a.dataPoints.length&&a.visible)&&0<=p._supportedChartTypes.indexOf(a.type)){for(var b=null,c=!1,e=null,g=!1,m=0;m<this.plotInfo.plotTypes.length;m++)if(this.plotInfo.plotTypes[m].type===a.type){c=!0;b=this.plotInfo.plotTypes[m];break}c||(b={type:a.type, +totalDataSeries:0,plotUnits:[]},this.plotInfo.plotTypes.push(b));for(m=0;m<b.plotUnits.length;m++)if(b.plotUnits[m].axisYType===a.axisYType&&b.plotUnits[m].axisXType===a.axisXType&&b.plotUnits[m].axisYIndex===a.axisYIndex&&b.plotUnits[m].axisXIndex===a.axisXIndex){g=!0;e=b.plotUnits[m];break}g||(e={type:a.type,previousDataSeriesCount:0,index:b.plotUnits.length,plotType:b,axisXType:a.axisXType,axisYType:a.axisYType,axisYIndex:a.axisYIndex,axisXIndex:a.axisXIndex,axisY:"primary"===a.axisYType?this.axisY[0<= +a.axisYIndex&&a.axisYIndex<this.axisY.length?a.axisYIndex:0]:this.axisY2[0<=a.axisYIndex&&a.axisYIndex<this.axisY2.length?a.axisYIndex:0],axisX:"primary"===a.axisXType?this.axisX[0<=a.axisXIndex&&a.axisXIndex<this.axisX.length?a.axisXIndex:0]:this.axisX2[0<=a.axisXIndex&&a.axisXIndex<this.axisX2.length?a.axisXIndex:0],dataSeriesIndexes:[],yTotals:[]},b.plotUnits.push(e));b.totalDataSeries++;e.dataSeriesIndexes.push(d);a.plotUnit=e}for(d=0;d<this.plotInfo.plotTypes.length;d++)for(b=this.plotInfo.plotTypes[d], +m=a=0;m<b.plotUnits.length;m++)b.plotUnits[m].previousDataSeriesCount=a,a+=b.plotUnits[m].dataSeriesIndexes.length};p.prototype.assignIdToDataPoints=function(){for(var a=0;a<this.data.length;a++){var d=this.data[a];if(d.dataPoints)for(var b=d.dataPoints.length,c=0;c<b;c++)d.dataPointIds[c]=++this._eventManager.lastObjectId}};p.prototype._processData=function(){this.assignIdToDataPoints();this.categoriseDataSeries();for(var a=0;a<this.plotInfo.plotTypes.length;a++)for(var d=this.plotInfo.plotTypes[a], +b=0;b<d.plotUnits.length;b++){var c=d.plotUnits[b];"line"===c.type||"stepLine"===c.type||"spline"===c.type||"column"===c.type||"area"===c.type||"stepArea"===c.type||"splineArea"===c.type||"bar"===c.type||"bubble"===c.type||"scatter"===c.type?this._processMultiseriesPlotUnit(c):"stackedColumn"===c.type||"stackedBar"===c.type||"stackedArea"===c.type?this._processStackedPlotUnit(c):"stackedColumn100"===c.type||"stackedBar100"===c.type||"stackedArea100"===c.type?this._processStacked100PlotUnit(c):"candlestick"=== +c.type||"ohlc"===c.type||"rangeColumn"===c.type||"rangeBar"===c.type||"rangeArea"===c.type||"rangeSplineArea"===c.type||"error"===c.type||"boxAndWhisker"===c.type?this._processMultiYPlotUnit(c):"waterfall"===c.type&&this._processSpecificPlotUnit(c)}this.calculateAutoBreaks()};p.prototype._processMultiseriesPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;m<a.dataSeriesIndexes.length;m++){var l=this.data[a.dataSeriesIndexes[m]], +w=0,h=!1,s=!1,q;if("normal"===l.axisPlacement||"xySwapped"===l.axisPlacement)var n=a.axisX.sessionVariables.newViewportMinimum?a.axisX.sessionVariables.newViewportMinimum:this.options.axisX&&this.options.axisX.viewportMinimum?this.options.axisX.viewportMinimum:this.options.axisX&&this.options.axisX.minimum?this.options.axisX.minimum:a.axisX.logarithmic?0:-Infinity,f=a.axisX.sessionVariables.newViewportMaximum?a.axisX.sessionVariables.newViewportMaximum:this.options.axisX&&this.options.axisX.viewportMaximum? +this.options.axisX.viewportMaximum:this.options.axisX&&this.options.axisX.maximum?this.options.axisX.maximum:Infinity;if(l.dataPoints[w].x&&l.dataPoints[w].x.getTime||"dateTime"===l.xValueType)g=!0;for(w=0;w<l.dataPoints.length;w++){"undefined"===typeof l.dataPoints[w].x&&(l.dataPoints[w].x=w+(a.axisX.logarithmic?1:0));l.dataPoints[w].x.getTime?(g=!0,c=l.dataPoints[w].x.getTime()):c=l.dataPoints[w].x;e=l.dataPoints[w].y;c<b.min&&(b.min=c);c>b.max&&(b.max=c);e<d.min&&"number"===typeof e&&(d.min=e); +e>d.max&&"number"===typeof e&&(d.max=e);if(0<w){if(a.axisX.logarithmic){var B=c/l.dataPoints[w-1].x;1>B&&(B=1/B);b.minDiff>B&&1!==B&&(b.minDiff=B)}else B=c-l.dataPoints[w-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B);null!==e&&null!==l.dataPoints[w-1].y&&(a.axisY.logarithmic?(B=e/l.dataPoints[w-1].y,1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e-l.dataPoints[w-1].y,0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B)))}if(c<n&&!h)null!==e&&(q=c);else{if(!h&&(h=!0,0<w)){w-=2;continue}if(c>f&& +!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);c<b.viewPortMin&&(b.viewPortMin=c);c>b.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&q<c&&(b.viewPortMin=q):(e<d.viewPortMin&&"number"===typeof e&&(d.viewPortMin=e),e>d.viewPortMax&&"number"===typeof e&&(d.viewPortMax=e))}}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype._processStackedPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d= +a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=[],l=[],w=Infinity,h=-Infinity,s=0;s<a.dataSeriesIndexes.length;s++){var q=this.data[a.dataSeriesIndexes[s]],n=0,f=!1,B=!1,k;if("normal"===q.axisPlacement||"xySwapped"===q.axisPlacement)var p=a.axisX.sessionVariables.newViewportMinimum?a.axisX.sessionVariables.newViewportMinimum:this.options.axisX&&this.options.axisX.viewportMinimum?this.options.axisX.viewportMinimum:this.options.axisX&&this.options.axisX.minimum?this.options.axisX.minimum:-Infinity, +t=a.axisX.sessionVariables.newViewportMaximum?a.axisX.sessionVariables.newViewportMaximum:this.options.axisX&&this.options.axisX.viewportMaximum?this.options.axisX.viewportMaximum:this.options.axisX&&this.options.axisX.maximum?this.options.axisX.maximum:Infinity;if(q.dataPoints[n].x&&q.dataPoints[n].x.getTime||"dateTime"===q.xValueType)g=!0;for(n=0;n<q.dataPoints.length;n++){"undefined"===typeof q.dataPoints[n].x&&(q.dataPoints[n].x=n+(a.axisX.logarithmic?1:0));q.dataPoints[n].x.getTime?(g=!0,c=q.dataPoints[n].x.getTime()): +c=q.dataPoints[n].x;e=u(q.dataPoints[n].y)?0:q.dataPoints[n].y;c<b.min&&(b.min=c);c>b.max&&(b.max=c);if(0<n){if(a.axisX.logarithmic){var r=c/q.dataPoints[n-1].x;1>r&&(r=1/r);b.minDiff>r&&1!==r&&(b.minDiff=r)}else r=c-q.dataPoints[n-1].x,0>r&&(r*=-1),b.minDiff>r&&0!==r&&(b.minDiff=r);null!==e&&null!==q.dataPoints[n-1].y&&(a.axisY.logarithmic?0<e&&(r=e/q.dataPoints[n-1].y,1>r&&(r=1/r),d.minDiff>r&&1!==r&&(d.minDiff=r)):(r=e-q.dataPoints[n-1].y,0>r&&(r*=-1),d.minDiff>r&&0!==r&&(d.minDiff=r)))}if(c<p&& +!f)null!==q.dataPoints[n].y&&(k=c);else{if(!f&&(f=!0,0<n)){n-=2;continue}if(c>t&&!B)B=!0;else if(c>t&&B)continue;q.dataPoints[n].label&&(a.axisX.labels[c]=q.dataPoints[n].label);c<b.viewPortMin&&(b.viewPortMin=c);c>b.viewPortMax&&(b.viewPortMax=c);null===q.dataPoints[n].y?b.viewPortMin===c&&k<c&&(b.viewPortMin=k):(a.yTotals[c]=(a.yTotals[c]?a.yTotals[c]:0)+e,0<=e?m[c]?m[c]+=e:(m[c]=e,w=Math.min(e,w)):l[c]?l[c]+=e:(l[c]=e,h=Math.max(e,h)))}}a.axisY.scaleBreaks&&(a.axisY.scaleBreaks.autoCalculate&& +1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks)&&(d.dataPointYPositiveSums?(d.dataPointYPositiveSums.push.apply(d.dataPointYPositiveSums,m),d.dataPointYNegativeSums.push.apply(d.dataPointYPositiveSums,l)):(d.dataPointYPositiveSums=m,d.dataPointYNegativeSums=l));q.axisX.valueType=q.xValueType=g?"dateTime":"number"}for(n in m)m.hasOwnProperty(n)&&!isNaN(n)&&(a=m[n],a<d.min&&(d.min=Math.min(a,w)),a>d.max&&(d.max=a),n<b.viewPortMin||n>b.viewPortMax||(a<d.viewPortMin&&(d.viewPortMin=Math.min(a,w)),a>d.viewPortMax&& +(d.viewPortMax=a)));for(n in l)l.hasOwnProperty(n)&&!isNaN(n)&&(a=l[n],a<d.min&&(d.min=a),a>d.max&&(d.max=Math.max(a,h)),n<b.viewPortMin||n>b.viewPortMax||(a<d.viewPortMin&&(d.viewPortMin=a),a>d.viewPortMax&&(d.viewPortMax=Math.max(a,h))))}};p.prototype._processStacked100PlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=!1,l=!1,w=[],h=0;h<a.dataSeriesIndexes.length;h++){var s=this.data[a.dataSeriesIndexes[h]],q=0, +n=!1,f=!1,B;if("normal"===s.axisPlacement||"xySwapped"===s.axisPlacement)var k=a.axisX.sessionVariables.newViewportMinimum?a.axisX.sessionVariables.newViewportMinimum:this.options.axisX&&this.options.axisX.viewportMinimum?this.options.axisX.viewportMinimum:this.options.axisX&&this.options.axisX.minimum?this.options.axisX.minimum:-Infinity,r=a.axisX.sessionVariables.newViewportMaximum?a.axisX.sessionVariables.newViewportMaximum:this.options.axisX&&this.options.axisX.viewportMaximum?this.options.axisX.viewportMaximum: +this.options.axisX&&this.options.axisX.maximum?this.options.axisX.maximum:Infinity;if(s.dataPoints[q].x&&s.dataPoints[q].x.getTime||"dateTime"===s.xValueType)g=!0;for(q=0;q<s.dataPoints.length;q++){"undefined"===typeof s.dataPoints[q].x&&(s.dataPoints[q].x=q+(a.axisX.logarithmic?1:0));s.dataPoints[q].x.getTime?(g=!0,c=s.dataPoints[q].x.getTime()):c=s.dataPoints[q].x;e=u(s.dataPoints[q].y)?null:s.dataPoints[q].y;c<b.min&&(b.min=c);c>b.max&&(b.max=c);if(0<q){if(a.axisX.logarithmic){var t=c/s.dataPoints[q- +1].x;1>t&&(t=1/t);b.minDiff>t&&1!==t&&(b.minDiff=t)}else t=c-s.dataPoints[q-1].x,0>t&&(t*=-1),b.minDiff>t&&0!==t&&(b.minDiff=t);u(e)||null===s.dataPoints[q-1].y||(a.axisY.logarithmic?0<e&&(t=e/s.dataPoints[q-1].y,1>t&&(t=1/t),d.minDiff>t&&1!==t&&(d.minDiff=t)):(t=e-s.dataPoints[q-1].y,0>t&&(t*=-1),d.minDiff>t&&0!==t&&(d.minDiff=t)))}if(c<k&&!n)null!==e&&(B=c);else{if(!n&&(n=!0,0<q)){q-=2;continue}if(c>r&&!f)f=!0;else if(c>r&&f)continue;s.dataPoints[q].label&&(a.axisX.labels[c]=s.dataPoints[q].label); +c<b.viewPortMin&&(b.viewPortMin=c);c>b.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&B<c&&(b.viewPortMin=B):(a.yTotals[c]=(a.yTotals[c]?a.yTotals[c]:0)+e,0<=e?m=!0:0>e&&(l=!0),w[c]=w[c]?w[c]+Math.abs(e):Math.abs(e))}}s.axisX.valueType=s.xValueType=g?"dateTime":"number"}a.axisY.logarithmic?(d.max=u(d.viewPortMax)?99*Math.pow(a.axisY.logarithmBase,-0.05):Math.max(d.viewPortMax,99*Math.pow(a.axisY.logarithmBase,-0.05)),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&!l?(d.max=u(d.viewPortMax)? +99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&l?(d.max=u(d.viewPortMax)?99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99)):!m&&l&&(d.max=u(d.viewPortMax)?-1:Math.max(d.viewPortMax,-1),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99));d.viewPortMin=d.min;d.viewPortMax=d.max;a.dataPointYSums=w}};p.prototype._processMultiYPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo, +b=a.axisX.dataInfo,c,e,g,m,l=!1,w=0;w<a.dataSeriesIndexes.length;w++){var h=this.data[a.dataSeriesIndexes[w]],s=0,q=!1,n=!1,f,B,k;if("normal"===h.axisPlacement||"xySwapped"===h.axisPlacement)var r=a.axisX.sessionVariables.newViewportMinimum?a.axisX.sessionVariables.newViewportMinimum:this.options.axisX&&this.options.axisX.viewportMinimum?this.options.axisX.viewportMinimum:this.options.axisX&&this.options.axisX.minimum?this.options.axisX.minimum:a.axisX.logarithmic?0:-Infinity,t=a.axisX.sessionVariables.newViewportMaximum? +a.axisX.sessionVariables.newViewportMaximum:this.options.axisX&&this.options.axisX.viewportMaximum?this.options.axisX.viewportMaximum:this.options.axisX&&this.options.axisX.maximum?this.options.axisX.maximum:Infinity;if(h.dataPoints[s].x&&h.dataPoints[s].x.getTime||"dateTime"===h.xValueType)l=!0;for(s=0;s<h.dataPoints.length;s++){"undefined"===typeof h.dataPoints[s].x&&(h.dataPoints[s].x=s+(a.axisX.logarithmic?1:0));h.dataPoints[s].x.getTime?(l=!0,c=h.dataPoints[s].x.getTime()):c=h.dataPoints[s].x; +if((e=h.dataPoints[s].y)&&e.length){g=Math.min.apply(null,e);m=Math.max.apply(null,e);B=!0;for(var p=0;p<e.length;p++)null===e.k&&(B=!1);B&&(q||(k=f),f=c)}c<b.min&&(b.min=c);c>b.max&&(b.max=c);g<d.min&&(d.min=g);m>d.max&&(d.max=m);0<s&&(a.axisX.logarithmic?(B=c/h.dataPoints[s-1].x,1>B&&(B=1/B),b.minDiff>B&&1!==B&&(b.minDiff=B)):(B=c-h.dataPoints[s-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B)),e&&(null!==e[0]&&h.dataPoints[s-1].y&&null!==h.dataPoints[s-1].y[0])&&(a.axisY.logarithmic?(B=e[0]/ +h.dataPoints[s-1].y[0],1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e[0]-h.dataPoints[s-1].y[0],0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B))));if(!(c<r)||q){if(!q&&(q=!0,0<s)){s-=2;f=k;continue}if(c>t&&!n)n=!0;else if(c>t&&n)continue;h.dataPoints[s].label&&(a.axisX.labels[c]=h.dataPoints[s].label);c<b.viewPortMin&&(b.viewPortMin=c);c>b.viewPortMax&&(b.viewPortMax=c);if(b.viewPortMin===c&&e)for(p=0;p<e.length;p++)if(null===e[p]&&f<c){b.viewPortMin=f;break}null===e?b.viewPortMin===c&&f<c&& +(b.viewPortMin=f):(g<d.viewPortMin&&(d.viewPortMin=g),m>d.viewPortMax&&(d.viewPortMax=m))}}h.axisX.valueType=h.xValueType=l?"dateTime":"number"}};p.prototype._processSpecificPlotUnit=function(a){if("waterfall"===a.type&&a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;m<a.dataSeriesIndexes.length;m++){var l=this.data[a.dataSeriesIndexes[m]],w=0,h=!1,s=!1,q=c=0;if("normal"===l.axisPlacement||"xySwapped"===l.axisPlacement)var n=a.axisX.sessionVariables.newViewportMinimum? +a.axisX.sessionVariables.newViewportMinimum:this.options.axisX&&this.options.axisX.viewportMinimum?this.options.axisX.viewportMinimum:this.options.axisX&&this.options.axisX.minimum?this.options.axisX.minimum:a.axisX.logarithmic?0:-Infinity,f=a.axisX.sessionVariables.newViewportMaximum?a.axisX.sessionVariables.newViewportMaximum:this.options.axisX&&this.options.axisX.viewportMaximum?this.options.axisX.viewportMaximum:this.options.axisX&&this.options.axisX.maximum?this.options.axisX.maximum:Infinity; +if(l.dataPoints[w].x&&l.dataPoints[w].x.getTime||"dateTime"===l.xValueType)g=!0;for(w=0;w<l.dataPoints.length;w++)"undefined"!==typeof l.dataPoints[w].isCumulativeSum&&!0===l.dataPoints[w].isCumulativeSum?(l.dataPointEOs[w].cumulativeSumYStartValue=0,l.dataPointEOs[w].cumulativeSum=0===w?0:l.dataPointEOs[w-1].cumulativeSum,l.dataPoints[w].y=0===w?0:l.dataPointEOs[w-1].cumulativeSum):"undefined"!==typeof l.dataPoints[w].isIntermediateSum&&!0===l.dataPoints[w].isIntermediateSum?(l.dataPointEOs[w].cumulativeSumYStartValue= +q,l.dataPointEOs[w].cumulativeSum=0===w?0:l.dataPointEOs[w-1].cumulativeSum,l.dataPoints[w].y=0===w?0:c,q=0===w?0:l.dataPointEOs[w-1].cumulativeSum,c=0):(e="number"!==typeof l.dataPoints[w].y?0:l.dataPoints[w].y,l.dataPointEOs[w].cumulativeSumYStartValue=0===w?0:l.dataPointEOs[w-1].cumulativeSum,l.dataPointEOs[w].cumulativeSum=0===w?e:l.dataPointEOs[w-1].cumulativeSum+e,c+=e);for(w=0;w<l.dataPoints.length;w++)if("undefined"===typeof l.dataPoints[w].x&&(l.dataPoints[w].x=w+(a.axisX.logarithmic?1:0)), +l.dataPoints[w].x.getTime?(g=!0,c=l.dataPoints[w].x.getTime()):c=l.dataPoints[w].x,e=l.dataPoints[w].y,c<b.min&&(b.min=c),c>b.max&&(b.max=c),l.dataPointEOs[w].cumulativeSum<d.min&&(d.min=l.dataPointEOs[w].cumulativeSum),l.dataPointEOs[w].cumulativeSum>d.max&&(d.max=l.dataPointEOs[w].cumulativeSum),0<w&&(a.axisX.logarithmic?(q=c/l.dataPoints[w-1].x,1>q&&(q=1/q),b.minDiff>q&&1!==q&&(b.minDiff=q)):(q=c-l.dataPoints[w-1].x,0>q&&(q*=-1),b.minDiff>q&&0!==q&&(b.minDiff=q)),null!==e&&null!==l.dataPoints[w- +1].y&&(a.axisY.logarithmic?(e=l.dataPointEOs[w].cumulativeSum/l.dataPointEOs[w-1].cumulativeSum,1>e&&(e=1/e),d.minDiff>e&&1!==e&&(d.minDiff=e)):(e=l.dataPointEOs[w].cumulativeSum-l.dataPointEOs[w-1].cumulativeSum,0>e&&(e*=-1),d.minDiff>e&&0!==e&&(d.minDiff=e)))),!(c<n)||h){if(!h&&(h=!0,0<w)){w-=2;continue}if(c>f&&!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);c<b.viewPortMin&&(b.viewPortMin=c);c>b.viewPortMax&&(b.viewPortMax=c);0<w&&(l.dataPointEOs[w- +1].cumulativeSum<d.viewPortMin&&(d.viewPortMin=l.dataPointEOs[w-1].cumulativeSum),l.dataPointEOs[w-1].cumulativeSum>d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w-1].cumulativeSum));l.dataPointEOs[w].cumulativeSum<d.viewPortMin&&(d.viewPortMin=l.dataPointEOs[w].cumulativeSum);l.dataPointEOs[w].cumulativeSum>d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w].cumulativeSum)}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype.calculateAutoBreaks=function(){function a(a,c,b,e){if(e)return b= +Math.pow(Math.min(b*a/c,c/a),0.2),1>=b&&(b=Math.pow(1>a?1/a:Math.min(c/a,a),0.25)),{startValue:a*b,endValue:c/b};b=0.2*Math.min(b-c+a,c-a);0>=b&&(b=0.25*Math.min(c-a,Math.abs(a)));return{startValue:a+b,endValue:c-b}}function d(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){var c=a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<=a.axisX.scaleBreaks.maxNumberOfAutoBreaks,b=a.axisY.scaleBreaks&&a.axisY.scaleBreaks.autoCalculate&&1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks;if(c|| +b)for(var d=a.axisY.dataInfo,f=a.axisX.dataInfo,g,h=f.min,l=f.max,m=d.min,n=d.max,f=f._dataRanges,d=d._dataRanges,q,w=0,s=0;s<a.dataSeriesIndexes.length;s++){var k=e.data[a.dataSeriesIndexes[s]];if(!(4>k.dataPoints.length))for(w=0;w<k.dataPoints.length;w++)if(c&&(q=(l+1-h)*Math.max(parseFloat(a.axisX.scaleBreaks.collapsibleThreshold)||10,10)/100,g=k.dataPoints[w].x.getTime?k.dataPoints[w].x.getTime():k.dataPoints[w].x,q=Math.floor((g-h)/q),g<f[q].min&&(f[q].min=g),g>f[q].max&&(f[q].max=g)),b){var r= +(n+1-m)*Math.max(parseFloat(a.axisY.scaleBreaks.collapsibleThreshold)||10,10)/100;if((g="waterfall"===a.type?k.dataPointEOs[w].cumulativeSum:k.dataPoints[w].y)&&g.length)for(var p=0;p<g.length;p++)q=Math.floor((g[p]-m)/r),g[p]<d[q].min&&(d[q].min=g[p]),g[p]>d[q].max&&(d[q].max=g[p]);else u(g)||(q=Math.floor((g-m)/r),g<d[q].min&&(d[q].min=g),g>d[q].max&&(d[q].max=g))}}}}function b(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)&&a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<= +a.axisX.scaleBreaks.maxNumberOfAutoBreaks)for(var c=a.axisX.dataInfo,b=c.min,d=c.max,f=c._dataRanges,g,h=0,l=0;l<a.dataSeriesIndexes.length;l++){var m=e.data[a.dataSeriesIndexes[l]];if(!(4>m.dataPoints.length))for(h=0;h<m.dataPoints.length;h++)g=(d+1-b)*Math.max(parseFloat(a.axisX.scaleBreaks.collapsibleThreshold)||10,10)/100,c=m.dataPoints[h].x.getTime?m.dataPoints[h].x.getTime():m.dataPoints[h].x,g=Math.floor((c-b)/g),c<f[g].min&&(f[g].min=c),c>f[g].max&&(f[g].max=c)}}for(var c,e=this,g=!1,m=0;m< +this._axes.length;m++)if(this._axes[m].scaleBreaks&&this._axes[m].scaleBreaks.autoCalculate&&1<=this._axes[m].scaleBreaks.maxNumberOfAutoBreaks){g=!0;this._axes[m].dataInfo._dataRanges=[];for(var l=0;l<100/Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10);l++)this._axes[m].dataInfo._dataRanges.push({min:Infinity,max:-Infinity})}if(g){for(m=0;m<this.plotInfo.plotTypes.length;m++)for(g=this.plotInfo.plotTypes[m],l=0;l<g.plotUnits.length;l++)c=g.plotUnits[l],"line"===c.type|| +"stepLine"===c.type||"spline"===c.type||"column"===c.type||"area"===c.type||"stepArea"===c.type||"splineArea"===c.type||"bar"===c.type||"bubble"===c.type||"scatter"===c.type||"candlestick"===c.type||"ohlc"===c.type||"rangeColumn"===c.type||"rangeBar"===c.type||"rangeArea"===c.type||"rangeSplineArea"===c.type||"waterfall"===c.type||"error"===c.type||"boxAndWhisker"===c.type?d(c):0<=c.type.indexOf("stacked")&&b(c);for(m=0;m<this._axes.length;m++)if(this._axes[m].dataInfo._dataRanges){var w=this._axes[m].dataInfo.min; +c=(this._axes[m].dataInfo.max+1-w)*Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10)/100;var h=this._axes[m].dataInfo._dataRanges,s,q,g=[];if(this._axes[m].dataInfo.dataPointYPositiveSums){var n=this._axes[m].dataInfo.dataPointYPositiveSums;s=h;for(l in n)if(n.hasOwnProperty(l)&&!isNaN(l)&&(q=n[l],!u(q))){var f=Math.floor((q-w)/c);q<s[f].min&&(s[f].min=q);q>s[f].max&&(s[f].max=q)}delete this._axes[m].dataInfo.dataPointYPositiveSums}if(this._axes[m].dataInfo.dataPointYNegativeSums){n= +this._axes[m].dataInfo.dataPointYNegativeSums;s=h;for(l in n)n.hasOwnProperty(l)&&!isNaN(l)&&(q=-1*n[l],u(q)||(f=Math.floor((q-w)/c),q<s[f].min&&(s[f].min=q),q>s[f].max&&(s[f].max=q)));delete this._axes[m].dataInfo.dataPointYNegativeSums}for(l=0;l<h.length-1;l++)if(s=h[l].max,isFinite(s))for(;l<h.length-1;)if(w=h[l+1].min,isFinite(w)){q=w-s;q>c&&g.push({diff:q,start:s,end:w});break}else l++;if(this._axes[m].scaleBreaks.customBreaks)for(l=0;l<this._axes[m].scaleBreaks.customBreaks.length;l++)for(c= +0;c<g.length;c++)if(this._axes[m].scaleBreaks.customBreaks[l].startValue<=g[c].start&&g[c].start<=this._axes[m].scaleBreaks.customBreaks[l].endValue||this._axes[m].scaleBreaks.customBreaks[l].startValue<=g[c].start&&g[c].start<=this._axes[m].scaleBreaks.customBreaks[l].endValue||g[c].start<=this._axes[m].scaleBreaks.customBreaks[l].startValue&&this._axes[m].scaleBreaks.customBreaks[l].startValue<=g[c].end||g[c].start<=this._axes[m].scaleBreaks.customBreaks[l].endValue&&this._axes[m].scaleBreaks.customBreaks[l].endValue<= +g[c].end)g.splice(c,1),c--;g.sort(function(a,c){return c.diff-a.diff});for(l=0;l<Math.min(g.length,this._axes[m].scaleBreaks.maxNumberOfAutoBreaks);l++)c=a(g[l].start,g[l].end,this._axes[m].logarithmic?this._axes[m].dataInfo.max/this._axes[m].dataInfo.min:this._axes[m].dataInfo.max-this._axes[m].dataInfo.min,this._axes[m].logarithmic),this._axes[m].scaleBreaks.autoBreaks.push(new L(this,"autoBreaks",c,l,++this._eventManager.lastObjectId,this._axes[m].scaleBreaks)),this._axes[m].scaleBreaks._appliedBreaks.push(this._axes[m].scaleBreaks.autoBreaks[this._axes[m].scaleBreaks.autoBreaks.length- +1]);this._axes[m].scaleBreaks._appliedBreaks.sort(function(a,c){return a.startValue-c.startValue})}}};p.prototype.getDataPointAtXY=function(a,d,b){b=b||!1;for(var c=[],e=this._dataInRenderedOrder.length-1;0<=e;e--){var g=null;(g=this._dataInRenderedOrder[e].getDataPointAtXY(a,d,b))&&c.push(g)}a=null;d=!1;for(b=0;b<c.length;b++)if("line"===c[b].dataSeries.type||"stepLine"===c[b].dataSeries.type||"area"===c[b].dataSeries.type||"stepArea"===c[b].dataSeries.type)if(e=na("markerSize",c[b].dataPoint,c[b].dataSeries)|| +8,c[b].distance<=e/2){d=!0;break}for(b=0;b<c.length;b++)d&&"line"!==c[b].dataSeries.type&&"stepLine"!==c[b].dataSeries.type&&"area"!==c[b].dataSeries.type&&"stepArea"!==c[b].dataSeries.type||(a?c[b].distance<=a.distance&&(a=c[b]):a=c[b]);return a};p.prototype.getObjectAtXY=function(a,d,b){var c=null;if(b=this.getDataPointAtXY(a,d,b||!1))c=b.dataSeries.dataPointIds[b.dataPointIndex];else if(r)c=ab(a,d,this._eventManager.ghostCtx);else for(b=0;b<this.legend.items.length;b++){var e=this.legend.items[b]; +a>=e.x1&&(a<=e.x2&&d>=e.y1&&d<=e.y2)&&(c=e.id)}return c};p.prototype.getAutoFontSize=lb;p.prototype.resetOverlayedCanvas=function(){this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height)};p.prototype.clearCanvas=kb;p.prototype.attachEvent=function(a){this._events.push(a)};p.prototype._touchEventHandler=function(a){if(a.changedTouches&&this.interactivityEnabled){var d=[],b=a.changedTouches,c=b?b[0]:a,e=null;switch(a.type){case "touchstart":case "MSPointerDown":d=["mousemove","mousedown"];this._lastTouchData= +Ra(c);this._lastTouchData.time=new Date;break;case "touchmove":case "MSPointerMove":d=["mousemove"];break;case "touchend":case "MSPointerUp":var g=this._lastTouchData&&this._lastTouchData.time?new Date-this._lastTouchData.time:0,d="touchstart"===this._lastTouchEventType||"MSPointerDown"===this._lastTouchEventType||300>g?["mouseup","click"]:["mouseup"];break;default:return}if(!(b&&1<b.length)){e=Ra(c);e.time=new Date;try{var m=e.y-this._lastTouchData.y,g=e.time-this._lastTouchData.time;if(1<Math.abs(m)&& +this._lastTouchData.scroll||5<Math.abs(m)&&250>g)this._lastTouchData.scroll=!0}catch(l){}this._lastTouchEventType=a.type;if(this._lastTouchData.scroll&&this.zoomEnabled)this.isDrag&&this.resetOverlayedCanvas(),this.isDrag=!1;else for(b=0;b<d.length;b++)if(e=d[b],m=document.createEvent("MouseEvent"),m.initMouseEvent(e,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),c.target.dispatchEvent(m),!u(this._lastTouchData.scroll)&&!this._lastTouchData.scroll||!this._lastTouchData.scroll&& +250<g||"click"===e)a.preventManipulation&&a.preventManipulation(),a.preventDefault&&a.preventDefault()}}};p.prototype._dispatchRangeEvent=function(a,d){var b={chart:this};b.type=a;b.trigger=d;var c=[];this.axisX&&0<this.axisX.length&&c.push("axisX");this.axisX2&&0<this.axisX2.length&&c.push("axisX2");this.axisY&&0<this.axisY.length&&c.push("axisY");this.axisY2&&0<this.axisY2.length&&c.push("axisY2");for(var e=0;e<c.length;e++)if(u(b[c[e]])&&(b[c[e]]=[]),"axisY"===c[e])for(var g=0;g<this.axisY.length;g++)b[c[e]].push({viewportMinimum:this[c[e]][g].sessionVariables.newViewportMinimum, +viewportMaximum:this[c[e]][g].sessionVariables.newViewportMaximum});else if("axisY2"===c[e])for(g=0;g<this.axisY2.length;g++)b[c[e]].push({viewportMinimum:this[c[e]][g].sessionVariables.newViewportMinimum,viewportMaximum:this[c[e]][g].sessionVariables.newViewportMaximum});else if("axisX"===c[e])for(g=0;g<this.axisX.length;g++)b[c[e]].push({viewportMinimum:this[c[e]][g].sessionVariables.newViewportMinimum,viewportMaximum:this[c[e]][g].sessionVariables.newViewportMaximum});else if("axisX2"===c[e])for(g= +0;g<this.axisX2.length;g++)b[c[e]].push({viewportMinimum:this[c[e]][g].sessionVariables.newViewportMinimum,viewportMaximum:this[c[e]][g].sessionVariables.newViewportMaximum});this.dispatchEvent(a,b,this)};p.prototype._mouseEventHandler=function(a){"undefined"===typeof a.target&&a.srcElement&&(a.target=a.srcElement);var d=Ra(a),b=a.type,c,e;a.which?e=3==a.which:a.button&&(e=2==a.button);p.capturedEventParam&&(c=p.capturedEventParam,"mouseup"===b&&(p.capturedEventParam=null,c.chart.overlaidCanvas.releaseCapture? +c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",c.chart._mouseEventHandler,!1)),c.hasOwnProperty(b)&&("mouseup"!==b||c.chart.overlaidCanvas.releaseCapture?a.target!==c.chart.overlaidCanvas&&r||c[b].call(c.context,d.x,d.y):a.target!==c.chart.overlaidCanvas&&(c.chart.isDrag=!1)));if(this.interactivityEnabled)if(this._ignoreNextEvent)this._ignoreNextEvent=!1;else if(a.preventManipulation&&a.preventManipulation(),a.preventDefault&&a.preventDefault(),Ja&& +window.console&&(window.console.log(b+" --\x3e x: "+d.x+"; y:"+d.y),e&&window.console.log(a.which),"mouseup"===b&&window.console.log("mouseup")),!e){if(!p.capturedEventParam&&this._events){for(var g=0;g<this._events.length;g++)if(this._events[g].hasOwnProperty(b))if(c=this._events[g],e=c.bounds,d.x>=e.x1&&d.x<=e.x2&&d.y>=e.y1&&d.y<=e.y2){c[b].call(c.context,d.x,d.y);"mousedown"===b&&!0===c.capture?(p.capturedEventParam=c,this.overlaidCanvas.setCapture?this.overlaidCanvas.setCapture():document.documentElement.addEventListener("mouseup", +this._mouseEventHandler,!1)):"mouseup"===b&&(c.chart.overlaidCanvas.releaseCapture?c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",this._mouseEventHandler,!1));break}else c=null;a.target.style.cursor=c&&c.cursor?c.cursor:this._defaultCursor}b=this.plotArea;if(d.x<b.x1||d.x>b.x2||d.y<b.y1||d.y>b.y2)this.toolTip&&this.toolTip.enabled?this.toolTip.hide():this.resetOverlayedCanvas();this.isDrag&&this.zoomEnabled||!this._eventManager||this._eventManager.mouseEventHandler(a)}}; +p.prototype._plotAreaMouseDown=function(a,d){this.isDrag=!0;this.dragStartPoint={x:a,y:d}};p.prototype._plotAreaMouseUp=function(a,d){if(("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)&&this.isDrag){var b=d-this.dragStartPoint.y,c=a-this.dragStartPoint.x,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=!1;this.resetOverlayedCanvas();if("xySwapped"===this.plotInfo.axisPlacement)var l=g,g=e,e=l;if(this.panEnabled||this.zoomEnabled){if(this.panEnabled)for(e= +g=0;e<this._axes.length;e++)b=this._axes[e],b.logarithmic?b.viewportMinimum<b.minimum?(g=b.minimum/b.viewportMinimum,b.sessionVariables.newViewportMinimum=b.viewportMinimum*g,b.sessionVariables.newViewportMaximum=b.viewportMaximum*g,m=!0):b.viewportMaximum>b.maximum&&(g=b.viewportMaximum/b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum/g,b.sessionVariables.newViewportMaximum=b.viewportMaximum/g,m=!0):b.viewportMinimum<b.minimum?(g=b.minimum-b.viewportMinimum,b.sessionVariables.newViewportMinimum= +b.viewportMinimum+g,b.sessionVariables.newViewportMaximum=b.viewportMaximum+g,m=!0):b.viewportMaximum>b.maximum&&(g=b.viewportMaximum-b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum-g,b.sessionVariables.newViewportMaximum=b.viewportMaximum-g,m=!0);else if((!e||2<Math.abs(c))&&(!g||2<Math.abs(b))&&this.zoomEnabled){if(!this.dragStartPoint)return;b=e?this.dragStartPoint.x:this.plotArea.x1;c=g?this.dragStartPoint.y:this.plotArea.y1;e=e?a:this.plotArea.x2;g=g?d:this.plotArea.y2;2<Math.abs(b- +e)&&2<Math.abs(c-g)&&this._zoomPanToSelectedRegion(b,c,e,g)&&(m=!0)}m&&(this._ignoreNextEvent=!0,this._dispatchRangeEvent("rangeChanging","zoom"),this.render(),this._dispatchRangeEvent("rangeChanged","zoom"),m&&(this.zoomEnabled&&"none"===this._zoomButton.style.display)&&(Qa(this._zoomButton,this._resetButton),ua(this,this._zoomButton,"pan"),ua(this,this._resetButton,"reset")))}}this.isDrag=!1;if("none"!==this.plotInfo.axisPlacement){this.resetOverlayedCanvas();if(this.axisX&&0<this.axisX.length)for(m= +0;m<this.axisX.length;m++)this.axisX[m].crosshair&&this.axisX[m].crosshair.enabled&&this.axisX[m].renderCrosshair(a,d);if(this.axisX2&&0<this.axisX2.length)for(m=0;m<this.axisX2.length;m++)this.axisX2[m].crosshair&&this.axisX2[m].crosshair.enabled&&this.axisX2[m].renderCrosshair(a,d);if(this.axisY&&0<this.axisY.length)for(m=0;m<this.axisY.length;m++)this.axisY[m].crosshair&&this.axisY[m].crosshair.enabled&&this.axisY[m].renderCrosshair(a,d);if(this.axisY2&&0<this.axisY2.length)for(m=0;m<this.axisY2.length;m++)this.axisY2[m].crosshair&& +this.axisY2[m].crosshair.enabled&&this.axisY2[m].renderCrosshair(a,d)}};p.prototype._plotAreaMouseMove=function(a,d){if(this.isDrag&&"none"!==this.plotInfo.axisPlacement){var b=0,c=0,e=b=null,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=this;"xySwapped"===this.plotInfo.axisPlacement&&(b=g,g=e,e=b);b=this.dragStartPoint.x-a;c=this.dragStartPoint.y-d;2<Math.abs(b)&&8>Math.abs(b)&&(this.panEnabled||this.zoomEnabled)?this.toolTip.hide():this.panEnabled||this.zoomEnabled||this.toolTip.mouseMoveHandler(a, +d);if((!e||2<Math.abs(b)||!g||2<Math.abs(c))&&(this.panEnabled||this.zoomEnabled))if(this.panEnabled)e={x1:e?this.plotArea.x1+b:this.plotArea.x1,y1:g?this.plotArea.y1+c:this.plotArea.y1,x2:e?this.plotArea.x2+b:this.plotArea.x2,y2:g?this.plotArea.y2+c:this.plotArea.y2},clearTimeout(m._panTimerId),m._panTimerId=setTimeout(function(c,b,e,f){return function(){m._zoomPanToSelectedRegion(c,b,e,f,!0)&&(m._dispatchRangeEvent("rangeChanging","pan"),m.render(),m._dispatchRangeEvent("rangeChanged","pan"),m.dragStartPoint.x= +a,m.dragStartPoint.y=d)}}(e.x1,e.y1,e.x2,e.y2),0);else if(this.zoomEnabled){this.resetOverlayedCanvas();b=this.overlaidCanvasCtx.globalAlpha;this.overlaidCanvasCtx.fillStyle="#A89896";var c=e?this.dragStartPoint.x:this.plotArea.x1,l=g?this.dragStartPoint.y:this.plotArea.y1,w=e?a-this.dragStartPoint.x:this.plotArea.x2-this.plotArea.x1,h=g?d-this.dragStartPoint.y:this.plotArea.y2-this.plotArea.y1;this.validateRegion(c,l,e?a:this.plotArea.x2-this.plotArea.x1,g?d:this.plotArea.y2-this.plotArea.y1,"xy"!== +this.zoomType).isValid&&(this.resetOverlayedCanvas(),this.overlaidCanvasCtx.fillStyle="#99B2B5");this.overlaidCanvasCtx.globalAlpha=0.7;this.overlaidCanvasCtx.fillRect(c,l,w,h);this.overlaidCanvasCtx.globalAlpha=b}}else if(this.toolTip.mouseMoveHandler(a,d),"none"!==this.plotInfo.axisPlacement){if(this.axisX&&0<this.axisX.length)for(e=0;e<this.axisX.length;e++)this.axisX[e].crosshair&&this.axisX[e].crosshair.enabled&&this.axisX[e].renderCrosshair(a,d);if(this.axisX2&&0<this.axisX2.length)for(e=0;e< +this.axisX2.length;e++)this.axisX2[e].crosshair&&this.axisX2[e].crosshair.enabled&&this.axisX2[e].renderCrosshair(a,d);if(this.axisY&&0<this.axisY.length)for(e=0;e<this.axisY.length;e++)this.axisY[e].crosshair&&this.axisY[e].crosshair.enabled&&this.axisY[e].renderCrosshair(a,d);if(this.axisY2&&0<this.axisY2.length)for(e=0;e<this.axisY2.length;e++)this.axisY2[e].crosshair&&this.axisY2[e].crosshair.enabled&&this.axisY2[e].renderCrosshair(a,d)}};p.prototype._zoomPanToSelectedRegion=function(a,d,b,c, +e){a=this.validateRegion(a,d,b,c,e);d=a.axesWithValidRange;b=a.axesRanges;if(a.isValid)for(c=0;c<d.length;c++)e=b[c],d[c].setViewPortRange(e.val1,e.val2),this.syncCharts&&this.syncCharts(e.val1,e.val2);return a.isValid};p.prototype.validateRegion=function(a,d,b,c,e){e=e||!1;for(var g=0<=this.zoomType.indexOf("x"),m=0<=this.zoomType.indexOf("y"),l=!1,w=[],h=[],s=[],q=0;q<this._axes.length;q++)("axisX"===this._axes[q].type&&g||"axisY"===this._axes[q].type&&m)&&h.push(this._axes[q]);for(m=0;m<h.length;m++){var q= +h[m],g=!1,n=q.convertPixelToValue({x:a,y:d}),f=q.convertPixelToValue({x:b,y:c});if(n>f)var B=f,f=n,n=B;if(q.scaleBreaks)for(B=0;!g&&B<q.scaleBreaks._appliedBreaks.length;B++)g=q.scaleBreaks._appliedBreaks[B].startValue<=n&&q.scaleBreaks._appliedBreaks[B].endValue>=f;if(isFinite(q.dataInfo.minDiff))if(B=q.getApparentDifference(n,f,null,!0),!(g||!(this.panEnabled&&q.scaleBreaks&&q.scaleBreaks._appliedBreaks.length)&&(q.logarithmic&&B<Math.pow(q.dataInfo.minDiff,3)||!q.logarithmic&&B<3*Math.abs(q.dataInfo.minDiff))|| +n<q.minimum||f>q.maximum))w.push(q),s.push({val1:n,val2:f}),l=!0;else if(!e){l=!1;break}}return{isValid:l,axesWithValidRange:w,axesRanges:s}};p.prototype.preparePlotArea=function(){var a=this.plotArea;!r&&(0<a.x1||0<a.y1)&&a.ctx.translate(a.x1,a.y1);if((this.axisX[0]||this.axisX2[0])&&(this.axisY[0]||this.axisY2[0])){var d=this.axisX[0]?this.axisX[0].lineCoordinates:this.axisX2[0].lineCoordinates;if(this.axisY&&0<this.axisY.length&&this.axisY[0]){var b=this.axisY[0];a.x1=d.x1<d.x2?d.x1:b.lineCoordinates.x1; +a.y1=d.y1<b.lineCoordinates.y1?d.y1:b.lineCoordinates.y1;a.x2=d.x2>b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2;a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2;a.width=a.x2-a.x1;a.height=a.y2-a.y1}this.axisY2&&0<this.axisY2.length&&this.axisY2[0]&&(b=this.axisY2[0],a.x1=d.x1<d.x2?d.x1:b.lineCoordinates.x1,a.y1=d.y1<b.lineCoordinates.y1?d.y1:b.lineCoordinates.y1,a.x2=d.x2>b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2,a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2,a.width=a.x2-a.x1,a.height=a.y2-a.y1)}else d= +this.layoutManager.getFreeSpace(),a.x1=d.x1,a.x2=d.x2,a.y1=d.y1,a.y2=d.y2,a.width=d.width,a.height=d.height;r||(a.canvas.width=a.width,a.canvas.height=a.height,a.canvas.style.left=a.x1+"px",a.canvas.style.top=a.y1+"px",(0<a.x1||0<a.y1)&&a.ctx.translate(-a.x1,-a.y1));a.layoutManager=new Ga(a.x1,a.y1,a.x2,a.y2,2)};p.prototype.renderIndexLabels=function(a){var d=a||this.plotArea.ctx,b=this.plotArea,c=0,e=0,g=0,m=0,l=c=m=e=g=0,w=0;for(a=0;a<this._indexLabels.length;a++){var h=this._indexLabels[a],s=h.chartType.toLowerCase(), +q,n,l=na("indexLabelFontColor",h.dataPoint,h.dataSeries),w=na("indexLabelFontSize",h.dataPoint,h.dataSeries);q=na("indexLabelFontFamily",h.dataPoint,h.dataSeries);n=na("indexLabelFontStyle",h.dataPoint,h.dataSeries);var m=na("indexLabelFontWeight",h.dataPoint,h.dataSeries),f=na("indexLabelBackgroundColor",h.dataPoint,h.dataSeries),e=na("indexLabelMaxWidth",h.dataPoint,h.dataSeries),g=na("indexLabelWrap",h.dataPoint,h.dataSeries),B=na("indexLabelLineDashType",h.dataPoint,h.dataSeries),k=na("indexLabelLineColor", +h.dataPoint,h.dataSeries),p=u(h.dataPoint.indexLabelLineThickness)?u(h.dataSeries.options.indexLabelLineThickness)?0:h.dataSeries.options.indexLabelLineThickness:h.dataPoint.indexLabelLineThickness,c=0<p?Math.min(10,("normal"===this.plotInfo.axisPlacement?this.plotArea.height:this.plotArea.width)<<0):0,t={percent:null,total:null},C=null;if(0<=h.dataSeries.type.indexOf("stacked")||"pie"===h.dataSeries.type||"doughnut"===h.dataSeries.type)t=this.getPercentAndTotal(h.dataSeries,h.dataPoint);if(h.dataSeries.indexLabelFormatter|| +h.dataPoint.indexLabelFormatter)C={chart:this,dataSeries:h.dataSeries,dataPoint:h.dataPoint,index:h.indexKeyword,total:t.total,percent:t.percent};var x=h.dataPoint.indexLabelFormatter?h.dataPoint.indexLabelFormatter(C):h.dataPoint.indexLabel?this.replaceKeywordsWithValue(h.dataPoint.indexLabel,h.dataPoint,h.dataSeries,null,h.indexKeyword):h.dataSeries.indexLabelFormatter?h.dataSeries.indexLabelFormatter(C):h.dataSeries.indexLabel?this.replaceKeywordsWithValue(h.dataSeries.indexLabel,h.dataPoint,h.dataSeries, +null,h.indexKeyword):null;if(null!==x&&""!==x){var t=na("indexLabelPlacement",h.dataPoint,h.dataSeries),C=na("indexLabelOrientation",h.dataPoint,h.dataSeries),ma=h.direction,y=h.dataSeries.axisX,A=h.dataSeries.axisY,v=!1,f=new ka(d,{x:0,y:0,maxWidth:e?e:0.5*this.width,maxHeight:g?5*w:1.5*w,angle:"horizontal"===C?0:-90,text:x,padding:0,backgroundColor:f,horizontalAlign:"left",fontSize:w,fontFamily:q,fontWeight:m,fontColor:l,fontStyle:n,textBaseline:"top"});f.measureText();h.dataSeries.indexLabelMaxWidth= +f.maxWidth;if("stackedarea100"===s){if(h.point.x<b.x1||h.point.x>b.x2||h.point.y<b.y1-1||h.point.y>b.y2+1)continue}else if("rangearea"===s||"rangesplinearea"===s){if(h.dataPoint.x<y.viewportMinimum||h.dataPoint.x>y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)<A.viewportMinimum||Math.min.apply(null,h.dataPoint.y)>A.viewportMaximum)continue}else if(0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("bubble")||0<=s.indexOf("scatter")){if(h.dataPoint.x<y.viewportMinimum||h.dataPoint.x>y.viewportMaximum|| +h.dataPoint.y<A.viewportMinimum||h.dataPoint.y>A.viewportMaximum)continue}else if(0<=s.indexOf("column")||"waterfall"===s||"error"===s&&!h.axisSwapped){if(h.dataPoint.x<y.viewportMinimum||h.dataPoint.x>y.viewportMaximum||h.bounds.y1>b.y2||h.bounds.y2<b.y1)continue}else if(0<=s.indexOf("bar")||"error"===s){if(h.dataPoint.x<y.viewportMinimum||h.dataPoint.x>y.viewportMaximum||h.bounds.x1>b.x2||h.bounds.x2<b.x1)continue}else if("candlestick"===s||"ohlc"===s){if(h.dataPoint.x<y.viewportMinimum||h.dataPoint.x> +y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)<A.viewportMinimum||Math.min.apply(null,h.dataPoint.y)>A.viewportMaximum)continue}else if(h.dataPoint.x<y.viewportMinimum||h.dataPoint.x>y.viewportMaximum)continue;e=m=2;"horizontal"===C?(l=f.width,w=f.height):(w=f.width,l=f.height);if("normal"===this.plotInfo.axisPlacement){if(0<=s.indexOf("line")||0<=s.indexOf("area"))t="auto",m=4;else if(0<=s.indexOf("stacked"))"auto"===t&&(t="inside");else if("bubble"===s||"scatter"===s)t="inside";q=h.point.x- +l/2;"inside"!==t?(e=b.y1,g=b.y2,0<ma?(n=h.point.y-w-m-c,n<e&&(n="auto"===t?Math.max(h.point.y,e)+m+c:e+m+c,v=n+w>h.point.y)):(n=h.point.y+m+c,n>g-w-m-c&&(n="auto"===t?Math.min(h.point.y,g)-w-m-c:g-w-m-c,v=n<h.point.y))):(e=Math.max(h.bounds.y1,b.y1),g=Math.min(h.bounds.y2,b.y2),c=0<=s.indexOf("range")||"error"===s?0<ma?Math.max(h.bounds.y1,b.y1)+w/2+m:Math.min(h.bounds.y2,b.y2)-w/2-m:(Math.max(h.bounds.y1,b.y1)+Math.min(h.bounds.y2,b.y2))/2,0<ma?(n=Math.max(h.point.y,c)-w/2,n<e&&("bubble"===s||"scatter"=== +s)&&(n=Math.max(h.point.y-w-m,b.y1+m))):(n=Math.min(h.point.y,c)-w/2,n>g-w-m&&("bubble"===s||"scatter"===s)&&(n=Math.min(h.point.y+m,b.y2-w-m))),n=Math.min(n,g-w))}else 0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("scatter")?(t="auto",e=4):0<=s.indexOf("stacked")?"auto"===t&&(t="inside"):"bubble"===s&&(t="inside"),n=h.point.y-w/2,"inside"!==t?(m=b.x1,g=b.x2,0>ma?(q=h.point.x-l-e-c,q<m&&(q="auto"===t?Math.max(h.point.x,m)+e+c:m+e+c,v=q+l>h.point.x)):(q=h.point.x+e+c,q>g-l-e-c&&(q="auto"=== +t?Math.min(h.point.x,g)-l-e-c:g-l-e-c,v=q<h.point.x))):(m=Math.max(h.bounds.x1,b.x1),Math.min(h.bounds.x2,b.x2),c=0<=s.indexOf("range")||"error"===s?0>ma?Math.max(h.bounds.x1,b.x1)+l/2+e:Math.min(h.bounds.x2,b.x2)-l/2-e:(Math.max(h.bounds.x1,b.x1)+Math.min(h.bounds.x2,b.x2))/2,q=0>ma?Math.max(h.point.x,c)-l/2:Math.min(h.point.x,c)-l/2,q=Math.max(q,m));"vertical"===C&&(n+=w);f.x=q;f.y=n;f.render(!0);p&&("inside"!==t&&(0>s.indexOf("bar")&&("error"!==s||!h.axisSwapped)&&h.point.x>b.x1&&h.point.x<b.x2|| +!v)&&(0>s.indexOf("column")&&("error"!==s||h.axisSwapped)&&h.point.y>b.y1&&h.point.y<b.y2||!v))&&(d.lineWidth=p,d.strokeStyle=k?k:"gray",d.setLineDash&&d.setLineDash(R(B,p)),d.beginPath(),d.moveTo(h.point.x,h.point.y),0<=s.indexOf("bar")||"error"===s&&h.axisSwapped?d.lineTo(q+(0<h.direction?0:l),n+("horizontal"===C?w:-w)/2):0<=s.indexOf("column")||"error"===s&&!h.axisSwapped?d.lineTo(q+l/2,n+((0<h.direction?w:-w)+("horizontal"===C?w:-w))/2):d.lineTo(q+l/2,n+((n<h.point.y?w:-w)+("horizontal"===C?w: +-w))/2),d.stroke())}}d={source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0,startTimePercent:0.7};for(a=0;a<this._indexLabels.length;a++)h=this._indexLabels[a],f=na("indexLabelBackgroundColor",h.dataPoint,h.dataSeries),h.dataSeries.indexLabelBackgroundColor=u(f)?r?"transparent":null:f;return d};p.prototype.renderLine=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= +this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;l<a.dataSeriesIndexes.length;l++){var w=a.dataSeriesIndexes[l],h=this.data[w];b.lineWidth=h.lineThickness;var s=h.dataPoints,q="solid";if(b.setLineDash){var n=R(h.nullDataLineDashType,h.lineThickness),q=h.lineDashType,f=R(q,h.lineThickness);b.setLineDash(f)}var B=h.id;this._eventManager.objectMap[B]={objectType:"dataSeries",dataSeriesIndex:w};B=N(B);c.strokeStyle=B; +c.lineWidth=0<h.lineThickness?Math.max(h.lineThickness,4):0;var B=h._colorSet,k=B=h.lineColor=h.options.lineColor?h.options.lineColor:B[0];b.strokeStyle=B;var p=!0,t=0,C,x;b.beginPath();if(0<s.length){for(var u=!1,t=0;t<s.length;t++)if(C=s[t].x.getTime?s[t].x.getTime():s[t].x,!(C<a.axisX.dataInfo.viewPortMin||C>a.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0<t&&!(h.connectNullData||u||p)&&(b.stroke(),r&&c.stroke()),u=!0;else{C=a.axisX.convertValueToPixel(C);x= +a.axisY.convertValueToPixel(s[t].y);var y=h.dataPointIds[t];this._eventManager.objectMap[y]={id:y,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:t,x1:C,y1:x};p||u?(!p&&h.connectNullData?(b.setLineDash&&(h.options.nullDataLineDashType||q===h.lineDashType&&h.lineDashType!==h.nullDataLineDashType)&&(b.stroke(),b.beginPath(),b.moveTo(m.x,m.y),q=h.nullDataLineDashType,b.setLineDash(n)),b.lineTo(C,x),r&&c.lineTo(C,x)):(b.beginPath(),b.moveTo(C,x),r&&(c.beginPath(),c.moveTo(C,x))),u=p=!1):(b.lineTo(C, +x),r&&c.lineTo(C,x),0==t%500&&(b.stroke(),b.beginPath(),b.moveTo(C,x),r&&(c.stroke(),c.beginPath(),c.moveTo(C,x))));m={x:C,y:x};t<s.length-1&&(k!==(s[t].lineColor||B)||q!==(s[t].lineDashType||h.lineDashType))&&(b.stroke(),b.beginPath(),b.moveTo(C,x),k=s[t].lineColor||B,b.strokeStyle=k,b.setLineDash&&(s[t].lineDashType?(q=s[t].lineDashType,b.setLineDash(R(q,h.lineThickness))):(q=h.lineDashType,b.setLineDash(f))));if(0<s[t].markerSize||0<h.markerSize){var A=h.getMarkerProperties(t,C,x,b);g.push(A); +y=N(y);r&&g.push({x:C,y:x,ctx:c,type:A.type,size:A.size,color:y,borderColor:y,borderThickness:A.borderThickness})}(s[t].indexLabel||h.indexLabel||s[t].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"line",dataPoint:s[t],dataSeries:h,point:{x:C,y:x},direction:0>s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepLine=function(a){var d=a.targetCanvasCtx|| +this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;l<a.dataSeriesIndexes.length;l++){var w=a.dataSeriesIndexes[l],h=this.data[w];b.lineWidth=h.lineThickness;var s=h.dataPoints,q="solid";if(b.setLineDash){var n=R(h.nullDataLineDashType,h.lineThickness),q=h.lineDashType,f=R(q,h.lineThickness);b.setLineDash(f)}var B=h.id;this._eventManager.objectMap[B]= +{objectType:"dataSeries",dataSeriesIndex:w};B=N(B);c.strokeStyle=B;c.lineWidth=0<h.lineThickness?Math.max(h.lineThickness,4):0;var B=h._colorSet,k=B=h.lineColor=h.options.lineColor?h.options.lineColor:B[0];b.strokeStyle=B;var p=!0,t=0,C,x;b.beginPath();if(0<s.length){for(var u=!1,t=0;t<s.length;t++)if(C=s[t].getTime?s[t].x.getTime():s[t].x,!(C<a.axisX.dataInfo.viewPortMin||C>a.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0<t&&!(h.connectNullData||u||p)&&(b.stroke(), +r&&c.stroke()),u=!0;else{var y=x;C=a.axisX.convertValueToPixel(C);x=a.axisY.convertValueToPixel(s[t].y);var A=h.dataPointIds[t];this._eventManager.objectMap[A]={id:A,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:t,x1:C,y1:x};p||u?(!p&&h.connectNullData?(b.setLineDash&&(h.options.nullDataLineDashType||q===h.lineDashType&&h.lineDashType!==h.nullDataLineDashType)&&(b.stroke(),b.beginPath(),b.moveTo(m.x,m.y),q=h.nullDataLineDashType,b.setLineDash(n)),b.lineTo(C,y),b.lineTo(C,x),r&&(c.lineTo(C, +y),c.lineTo(C,x))):(b.beginPath(),b.moveTo(C,x),r&&(c.beginPath(),c.moveTo(C,x))),u=p=!1):(b.lineTo(C,y),r&&c.lineTo(C,y),b.lineTo(C,x),r&&c.lineTo(C,x),0==t%500&&(b.stroke(),b.beginPath(),b.moveTo(C,x),r&&(c.stroke(),c.beginPath(),c.moveTo(C,x))));m={x:C,y:x};t<s.length-1&&(k!==(s[t].lineColor||B)||q!==(s[t].lineDashType||h.lineDashType))&&(b.stroke(),b.beginPath(),b.moveTo(C,x),k=s[t].lineColor||B,b.strokeStyle=k,b.setLineDash&&(s[t].lineDashType?(q=s[t].lineDashType,b.setLineDash(R(q,h.lineThickness))): +(q=h.lineDashType,b.setLineDash(f))));if(0<s[t].markerSize||0<h.markerSize)y=h.getMarkerProperties(t,C,x,b),g.push(y),A=N(A),r&&g.push({x:C,y:x,ctx:c,type:y.type,size:y.size,color:A,borderColor:A,borderThickness:y.borderThickness});(s[t].indexLabel||h.indexLabel||s[t].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"stepLine",dataPoint:s[t],dataSeries:h,point:{x:C,y:x},direction:0>s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&& +(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation, +easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderSpline=function(a){function d(a){a=v(a,2);if(0<a.length){c.beginPath();r&&e.beginPath();c.moveTo(a[0].x,a[0].y);a[0].newStrokeStyle&&(c.strokeStyle=a[0].newStrokeStyle);a[0].newLineDashArray&&c.setLineDash(a[0].newLineDashArray);r&&e.moveTo(a[0].x,a[0].y);for(var b=0;b<a.length-3;b+=3)if(c.bezierCurveTo(a[b+1].x,a[b+1].y,a[b+2].x,a[b+2].y,a[b+3].x,a[b+3].y),r&&e.bezierCurveTo(a[b+1].x,a[b+1].y,a[b+2].x,a[b+2].y,a[b+3].x,a[b+3].y), +0<b&&0===b%3E3||a[b+3].newStrokeStyle||a[b+3].newLineDashArray)c.stroke(),c.beginPath(),c.moveTo(a[b+3].x,a[b+3].y),a[b+3].newStrokeStyle&&(c.strokeStyle=a[b+3].newStrokeStyle),a[b+3].newLineDashArray&&c.setLineDash(a[b+3].newLineDashArray),r&&(e.stroke(),e.beginPath(),e.moveTo(a[b+3].x,a[b+3].y));c.stroke();r&&e.stroke()}}var b=a.targetCanvasCtx||this.plotArea.ctx,c=r?this._preRenderCtx:b;if(!(0>=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx;c.save();var g=this.plotArea;c.beginPath(); +c.rect(g.x1,g.y1,g.width,g.height);c.clip();for(var m=[],l=0;l<a.dataSeriesIndexes.length;l++){var w=a.dataSeriesIndexes[l],h=this.data[w];c.lineWidth=h.lineThickness;var s=h.dataPoints,q="solid";if(c.setLineDash){var n=R(h.nullDataLineDashType,h.lineThickness),q=h.lineDashType,f=R(q,h.lineThickness);c.setLineDash(f)}var B=h.id;this._eventManager.objectMap[B]={objectType:"dataSeries",dataSeriesIndex:w};B=N(B);e.strokeStyle=B;e.lineWidth=0<h.lineThickness?Math.max(h.lineThickness,4):0;var B=h._colorSet, +k=B=h.lineColor=h.options.lineColor?h.options.lineColor:B[0];c.strokeStyle=B;var p=0,t,u,x=[];c.beginPath();if(0<s.length)for(u=!1,p=0;p<s.length;p++)if(t=s[p].getTime?s[p].x.getTime():s[p].x,!(t<a.axisX.dataInfo.viewPortMin||t>a.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[p].y)0<p&&!u&&(h.connectNullData?c.setLineDash&&(0<x.length&&(h.options.nullDataLineDashType||!s[p-1].lineDashType))&&(x[x.length-1].newLineDashArray=n,q=h.nullDataLineDashType):(d(x),x=[])),u=!0; +else{t=a.axisX.convertValueToPixel(t);u=a.axisY.convertValueToPixel(s[p].y);var ma=h.dataPointIds[p];this._eventManager.objectMap[ma]={id:ma,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:p,x1:t,y1:u};x[x.length]={x:t,y:u};p<s.length-1&&(k!==(s[p].lineColor||B)||q!==(s[p].lineDashType||h.lineDashType))&&(k=s[p].lineColor||B,x[x.length-1].newStrokeStyle=k,c.setLineDash&&(s[p].lineDashType?(q=s[p].lineDashType,x[x.length-1].newLineDashArray=R(q,h.lineThickness)):(q=h.lineDashType,x[x.length- +1].newLineDashArray=f)));if(0<s[p].markerSize||0<h.markerSize){var y=h.getMarkerProperties(p,t,u,c);m.push(y);ma=N(ma);r&&m.push({x:t,y:u,ctx:e,type:y.type,size:y.size,color:ma,borderColor:ma,borderThickness:y.borderThickness})}(s[p].indexLabel||h.indexLabel||s[p].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"spline",dataPoint:s[p],dataSeries:h,point:{x:t,y:u},direction:0>s[p].y===a.axisY.reversed?1:-1,color:B});u=!1}d(x)}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(g.x1,g.y1,g.width,g.height),e.beginPath());c.restore();c.beginPath();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width, +0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.dataPointWidth=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&s<g)&&(s=Math.max(this.options.dataPointWidth? +this.dataPointWidth:-Infinity,g));q<g&&(q=g);q>s&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;s<a.dataSeriesIndexes.length;s++){var n=a.dataSeriesIndexes[s],f=this.data[n],B=f.dataPoints;if(0<B.length)for(var p=5<q&&f.bevelEnabled?!0:!1,g=0;g<B.length;g++)if(B[g].getTime?w=B[g].x.getTime(): +w=B[g].x,!(w<a.axisX.dataInfo.viewPortMin||w>a.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){m=a.axisX.convertValueToPixel(w);l=a.axisY.convertValueToPixel(B[g].y);m=a.axisX.reversed?m+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:m-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var k=a.axisX.reversed?m-q<<0:m+q<<0,t;0<=B[g].y?t=h:(t=l,l=h);l>t&&(c=l,l=t,t=c);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,l,k,t,c,0,null,p&&0<=B[g].y, +0>B[g].y&&p,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:m,y1:l,x2:k,y2:t};c=N(c);r&&ea(this._eventManager.ghostCtx,m,l,k,t,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"column",dataPoint:B[g],dataSeries:f,point:{x:m+(k-m)/2,y:0>B[g].y===a.axisY.reversed?l:t},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:m, +y1:Math.min(l,t),x2:k,y2:Math.max(l,t)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore(); +return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:h<a.axisY.bounds.y1?a.axisY.bounds.y1:h>a.axisY.bounds.y2?a.axisY.bounds.y2:h}}};p.prototype.renderStackedColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth? +this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&s<h)&&(s=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,h));f<h&&(f=h);f>s&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;B<a.dataSeriesIndexes.length;B++){var k=a.dataSeriesIndexes[B], +p=this.data[k],t=p.dataPoints;if(0<t.length){var u=5<f&&p.bevelEnabled?!0:!1;b.strokeStyle="#4572A7 ";for(h=0;h<t.length;h++)if(c=t[h].x.getTime?t[h].x.getTime():t[h].x,!(c<a.axisX.dataInfo.viewPortMin||c>a.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0<t[h].y)l[c]=t[h].y+(l[c]?l[c]:0),0<l[c]&&(q=a.axisY.convertValueToPixel(l[c]), +y="undefined"!==typeof g[c]?g[c]:n,g[c]=q);else if(a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0>=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q="undefined"!==typeof m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;g[c]=A+(y-q)}else A=m[c]?m[c]:0,y=q+A,q=n+A,m[c]=A+(y-q);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1, +!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedColumn",dataPoint:t[h],dataSeries:p,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q, +y)},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx, +animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:n<a.axisY.bounds.y1?a.axisY.bounds.y1:n>a.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderStackedColumn100=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth: +this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? +this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&s<h)&&(s=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,h));f<h&&(f=h);f>s&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;B<a.dataSeriesIndexes.length;B++){var p=a.dataSeriesIndexes[B], +k=this.data[p],t=k.dataPoints;if(0<t.length)for(var u=5<f&&k.bevelEnabled?!0:!1,h=0;h<t.length;h++)if(c=t[h].x.getTime?t[h].x.getTime():t[h].x,!(c<a.axisX.dataInfo.viewPortMin||c>a.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);q=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0<t[h].y){l[c]=q+ +("undefined"!==typeof l[c]?l[c]:0);if(0>=l[c])continue;q=a.axisY.convertValueToPixel(l[c]);y=g[c]?g[c]:n;g[c]=q}else if(a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0>=t[h].y)w[c]=q+("undefined"!==typeof w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q=m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(q),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y1-q)&&(q=e.y1);g[c]=A+(y-q)}else A="undefined"!==typeof m[c]? +m[c]:0,y=q+A,q=n+A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y2-y)&&(y=e.y2),m[c]=A+(y-q);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&& +this._indexLabels.push({chartType:"stackedColumn100",dataPoint:t[h],dataSeries:k,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q,y)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&& +this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:n<a.axisY.bounds.y1?a.axisY.bounds.y1:n>a.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= +null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.options.dataPointWidth? +this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&s<g)&&(s=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,g));q<g&&(q=g);q>s&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height); +b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;s<a.dataSeriesIndexes.length;s++){var n=a.dataSeriesIndexes[s],f=this.data[n],B=f.dataPoints;if(0<B.length){var k=5<q&&f.bevelEnabled?!0:!1;b.strokeStyle="#4572A7 ";for(g=0;g<B.length;g++)if(B[g].getTime?w=B[g].x.getTime():w=B[g].x,!(w<a.axisX.dataInfo.viewPortMin||w>a.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){l=a.axisX.convertValueToPixel(w); +m=a.axisY.convertValueToPixel(B[g].y);l=a.axisX.reversed?l+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:l-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var p=a.axisX.reversed?l-q<<0:l+q<<0,t;0<=B[g].y?t=h:(t=m,m=h);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,t,l,m,p,c,0,null,k,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:t,y1:l,x2:m,y2:p};c= +N(c);r&&ea(this._eventManager.ghostCtx,t,l,m,p,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"bar",dataPoint:B[g],dataSeries:f,point:{x:0<=B[g].y?m:t,y:l+(p-l)/2},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(t,m),y1:l,x2:Math.max(t,m),y2:p},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas, +0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:h<a.axisY.bounds.x1?a.axisY.bounds.x1:h>a.axisY.bounds.x2?a.axisY.bounds.x2: +h}}};p.prototype.renderStackedBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<< +0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&q<h)&&(q=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,h));f< +h&&(f=h);f>q&&(f=q);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;B<a.dataSeriesIndexes.length;B++){var p=a.dataSeriesIndexes[B],k=this.data[p],t=k.dataPoints;if(0<t.length){var u=5<f&&k.bevelEnabled?!0:!1;b.strokeStyle="#4572A7 ";for(h=0;h<t.length;h++)if(c=t[h].x.getTime?t[h].x.getTime(): +t[h].x,!(c<a.axisX.dataInfo.viewPortMin||c>a.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0<t[h].y)l[c]=t[h].y+(l[c]?l[c]:0),0<l[c]&&(y=g[c]?g[c]:n,g[c]=s=a.axisY.convertValueToPixel(l[c]));else if(a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0>=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),s=m[c]? +m[c]:n,m[c]=y=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A=g[c]?g[c]:0;y=n+A;s+=A;g[c]=A+(s-y)}else A=m[c]?m[c]:0,y=s-A,s=n-A,m[c]=A+(s-y);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,y,x,s,v,c,0,null,u,!1,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:y,y1:x,x2:s,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,y,x,s,v,c,0,null,!1,!1,!1, +!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar",dataPoint:t[h],dataSeries:k,point:{x:0<=t[h].y?s:y,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(y,s),y1:x,x2:Math.max(y,s),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:n<a.axisY.bounds.x1?a.axisY.bounds.x1:n>a.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderStackedBar100=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)|| +(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&q<h)&&(q=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,h));f<h&&(f=h);f>q&&(f=q);b.save();r&&this._eventManager.ghostCtx.save(); +b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;B<a.dataSeriesIndexes.length;B++){var k=a.dataSeriesIndexes[B],p=this.data[k],t=p.dataPoints;if(0<t.length){var u=5<f&&p.bevelEnabled?!0:!1;b.strokeStyle="#4572A7 ";for(h=0;h<t.length;h++)if(c=t[h].x.getTime?t[h].x.getTime():t[h].x,!(c<a.axisX.dataInfo.viewPortMin||c>a.axisX.dataInfo.viewPortMax)&& +"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x;x=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var v=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,y=v+f<<0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0<t[h].y){l[c]=x+(l[c]?l[c]:0);if(0>=l[c])continue;x=g[c]?g[c]:n;g[c]=s=a.axisY.convertValueToPixel(l[c])}else if(a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length&&0>=t[h].y)w[c]=x+(w[c]?w[c]:0),s=m[c]?m[c]: +n,m[c]=x=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(x),0<=t[h].y){var A=g[c]?g[c]:0;x=n+A;s+=A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x2-s)&&(s=e.x2);g[c]=A+(s-x)}else A=m[c]?m[c]:0,x=s-A,s=n-A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x1-x)&&(x=e.x1),m[c]=A+(s-x);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,v,s,y,c,0,null,u,!1,!1,!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k, +dataPointIndex:h,x1:x,y1:v,x2:s,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,v,s,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar100",dataPoint:t[h],dataSeries:p,point:{x:0<=t[h].y?s:x,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(x,s),y1:v,x2:Math.max(x,s),y2:y},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop", +a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:n<a.axisY.bounds.x1?a.axisY.bounds.x1: +n>a.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderArea=function(a){var d,b;function c(){A&&(0<B.lineThickness&&g.stroke(),a.axisY.logarithmic||0>=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0<a.axisY.viewportMinimum&&(y=l.y2),g.lineTo(t,y),g.lineTo(A.x,y),g.closePath(),g.globalAlpha=B.fillOpacity,g.fill(),g.globalAlpha=1,r&&(m.lineTo(t,y),m.lineTo(A.x,y),m.closePath(),m.fill()),g.beginPath(),g.moveTo(t,u),m.beginPath(),m.moveTo(t,u),A={x:t,y:u})} +var e=a.targetCanvasCtx||this.plotArea.ctx,g=r?this._preRenderCtx:e;if(!(0>=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;n<a.dataSeriesIndexes.length;n++){var f=a.dataSeriesIndexes[n],B=this.data[f],p=B.dataPoints,h=B.id;this._eventManager.objectMap[h]={objectType:"dataSeries", +dataSeriesIndex:f};h=N(h);m.fillStyle=h;h=[];d=!0;var k=0,t,u,x,v=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),y,A=null;if(0<p.length){var z=B._colorSet[k%B._colorSet.length],aa=B.lineColor=B.options.lineColor||z,T=aa;g.fillStyle=z;g.strokeStyle=aa;g.lineWidth=B.lineThickness;b="solid";if(g.setLineDash){var Y=R(B.nullDataLineDashType,B.lineThickness);b=B.lineDashType;var ca=R(b,B.lineThickness);g.setLineDash(ca)}for(var da=!0;k<p.length;k++)if(x=p[k].x.getTime?p[k].x.getTime(): +p[k].x,!(x<a.axisX.dataInfo.viewPortMin||x>a.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!da)))if("number"!==typeof p[k].y)B.connectNullData||(da||d)||c(),da=!0;else{t=a.axisX.convertValueToPixel(x);u=a.axisY.convertValueToPixel(p[k].y);d||da?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||b===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d=t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,b=B.nullDataLineDashType,g.setLineDash(Y)),g.lineTo(t,u),r&&m.lineTo(t, +u)):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),da=d=!1):(g.lineTo(t,u),r&&m.lineTo(t,u),0==k%250&&c());q={x:t,y:u};k<p.length-1&&(T!==(p[k].lineColor||aa)||b!==(p[k].lineDashType||B.lineDashType))&&(c(),T=p[k].lineColor||aa,g.strokeStyle=T,g.setLineDash&&(p[k].lineDashType?(b=p[k].lineDashType,g.setLineDash(R(b,B.lineThickness))):(b=B.lineDashType,g.setLineDash(ca))));var Z=B.dataPointIds[k];this._eventManager.objectMap[Z]={id:Z,objectType:"dataPoint",dataSeriesIndex:f, +dataPointIndex:k,x1:t,y1:u};0!==p[k].markerSize&&(0<p[k].markerSize||0<B.markerSize)&&(x=B.getMarkerProperties(k,t,u,g),h.push(x),Z=N(Z),r&&h.push({x:t,y:u,ctx:m,type:x.type,size:x.size,color:Z,borderColor:Z,borderThickness:x.borderThickness}));(p[k].indexLabel||B.indexLabel||p[k].indexLabelFormatter||B.indexLabelFormatter)&&this._indexLabels.push({chartType:"area",dataPoint:p[k],dataSeries:B,point:{x:t,y:u},direction:0>p[k].y===a.axisY.reversed?1:-1,color:z})}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, +animationBase:0}}};p.prototype.renderSplineArea=function(a){function d(){var b=v(x,2);if(0<b.length){if(0<q.lineThickness){c.beginPath();c.moveTo(b[0].x,b[0].y);b[0].newStrokeStyle&&(c.strokeStyle=b[0].newStrokeStyle);b[0].newLineDashArray&&c.setLineDash(b[0].newLineDashArray);for(var d=0;d<b.length-3;d+=3)if(c.bezierCurveTo(b[d+1].x,b[d+1].y,b[d+2].x,b[d+2].y,b[d+3].x,b[d+3].y),r&&e.bezierCurveTo(b[d+1].x,b[d+1].y,b[d+2].x,b[d+2].y,b[d+3].x,b[d+3].y),b[d+3].newStrokeStyle||b[d+3].newLineDashArray)c.stroke(), +c.beginPath(),c.moveTo(b[d+3].x,b[d+3].y),b[d+3].newStrokeStyle&&(c.strokeStyle=b[d+3].newStrokeStyle),b[d+3].newLineDashArray&&c.setLineDash(b[d+3].newLineDashArray);c.stroke()}c.beginPath();c.moveTo(b[0].x,b[0].y);r&&(e.beginPath(),e.moveTo(b[0].x,b[0].y));for(d=0;d<b.length-3;d+=3)c.bezierCurveTo(b[d+1].x,b[d+1].y,b[d+2].x,b[d+2].y,b[d+3].x,b[d+3].y),r&&e.bezierCurveTo(b[d+1].x,b[d+1].y,b[d+2].x,b[d+2].y,b[d+3].x,b[d+3].y);a.axisY.logarithmic||0>=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum? +t=p:0>a.axisY.viewportMaximum?t=m.y1:0<a.axisY.viewportMinimum&&(t=g.y2);u={x:b[0].x,y:b[0].y};c.lineTo(b[b.length-1].x,t);c.lineTo(u.x,t);c.closePath();c.globalAlpha=q.fillOpacity;c.fill();c.globalAlpha=1;r&&(e.lineTo(b[b.length-1].x,t),e.lineTo(u.x,t),e.closePath(),e.fill())}}var b=a.targetCanvasCtx||this.plotArea.ctx,c=r?this._preRenderCtx:b;if(!(0>=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=a.axisX.lineCoordinates,m=a.axisY.lineCoordinates,l=[],w=this.plotArea;c.save();r&& +e.save();c.beginPath();c.rect(w.x1,w.y1,w.width,w.height);c.clip();r&&(e.beginPath(),e.rect(w.x1,w.y1,w.width,w.height),e.clip());for(var h=0;h<a.dataSeriesIndexes.length;h++){var s=a.dataSeriesIndexes[h],q=this.data[s],n=q.dataPoints,l=q.id;this._eventManager.objectMap[l]={objectType:"dataSeries",dataSeriesIndex:s};l=N(l);e.fillStyle=l;var l=[],f=0,B,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),t,u=null,x=[];if(0<n.length){var ma=q._colorSet[f%q._colorSet.length], +y=q.lineColor=q.options.lineColor||ma,A=y;c.fillStyle=ma;c.strokeStyle=y;c.lineWidth=q.lineThickness;var z="solid";if(c.setLineDash){var aa=R(q.nullDataLineDashType,q.lineThickness),z=q.lineDashType,T=R(z,q.lineThickness);c.setLineDash(T)}for(k=!1;f<n.length;f++)if(B=n[f].x.getTime?n[f].x.getTime():n[f].x,!(B<a.axisX.dataInfo.viewPortMin||B>a.axisX.dataInfo.viewPortMax&&(!q.connectNullData||!k)))if("number"!==typeof n[f].y)0<f&&!k&&(q.connectNullData?c.setLineDash&&(0<x.length&&(q.options.nullDataLineDashType|| +!n[f-1].lineDashType))&&(x[x.length-1].newLineDashArray=aa,z=q.nullDataLineDashType):(d(),x=[])),k=!0;else{B=a.axisX.convertValueToPixel(B);k=a.axisY.convertValueToPixel(n[f].y);var Y=q.dataPointIds[f];this._eventManager.objectMap[Y]={id:Y,objectType:"dataPoint",dataSeriesIndex:s,dataPointIndex:f,x1:B,y1:k};x[x.length]={x:B,y:k};f<n.length-1&&(A!==(n[f].lineColor||y)||z!==(n[f].lineDashType||q.lineDashType))&&(A=n[f].lineColor||y,x[x.length-1].newStrokeStyle=A,c.setLineDash&&(n[f].lineDashType?(z= +n[f].lineDashType,x[x.length-1].newLineDashArray=R(z,q.lineThickness)):(z=q.lineDashType,x[x.length-1].newLineDashArray=T)));if(0!==n[f].markerSize&&(0<n[f].markerSize||0<q.markerSize)){var ca=q.getMarkerProperties(f,B,k,c);l.push(ca);Y=N(Y);r&&l.push({x:B,y:k,ctx:e,type:ca.type,size:ca.size,color:Y,borderColor:Y,borderThickness:ca.borderThickness})}(n[f].indexLabel||q.indexLabel||n[f].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"splineArea",dataPoint:n[f],dataSeries:q, +point:{x:B,y:k},direction:0>n[f].y===a.axisY.reversed?1:-1,color:ma});k=!1}d();ia.drawMarkers(l)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(w.x1,w.y1,w.width,w.height), +this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepArea=function(a){var d,b;function c(){A&&(0<B.lineThickness&&g.stroke(),a.axisY.logarithmic||0>=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0<a.axisY.viewportMinimum&&(y=l.y2),g.lineTo(t,y),g.lineTo(A.x,y),g.closePath(),g.globalAlpha=B.fillOpacity,g.fill(),g.globalAlpha= +1,r&&(m.lineTo(t,y),m.lineTo(A.x,y),m.closePath(),m.fill()),g.beginPath(),g.moveTo(t,u),m.beginPath(),m.moveTo(t,u),A={x:t,y:u})}var e=a.targetCanvasCtx||this.plotArea.ctx,g=r?this._preRenderCtx:e;if(!(0>=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;n<a.dataSeriesIndexes.length;n++){var f= +a.dataSeriesIndexes[n],B=this.data[f],k=B.dataPoints,h=B.id;this._eventManager.objectMap[h]={objectType:"dataSeries",dataSeriesIndex:f};h=N(h);m.fillStyle=h;h=[];d=!0;var p=0,t,u,x,v=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),y,A=null;b=!1;if(0<k.length){var z=B._colorSet[p%B._colorSet.length],aa=B.lineColor=B.options.lineColor||z,T=aa;g.fillStyle=z;g.strokeStyle=aa;g.lineWidth=B.lineThickness;var Y="solid";if(g.setLineDash){var ca=R(B.nullDataLineDashType,B.lineThickness), +Y=B.lineDashType,da=R(Y,B.lineThickness);g.setLineDash(da)}for(;p<k.length;p++)if(x=k[p].x.getTime?k[p].x.getTime():k[p].x,!(x<a.axisX.dataInfo.viewPortMin||x>a.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!b))){var Z=u;"number"!==typeof k[p].y?(B.connectNullData||(b||d)||c(),b=!0):(t=a.axisX.convertValueToPixel(x),u=a.axisY.convertValueToPixel(k[p].y),d||b?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||Y===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d= +t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,Y=B.nullDataLineDashType,g.setLineDash(ca)),g.lineTo(t,Z),g.lineTo(t,u),r&&(m.lineTo(t,Z),m.lineTo(t,u))):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),b=d=!1):(g.lineTo(t,Z),r&&m.lineTo(t,Z),g.lineTo(t,u),r&&m.lineTo(t,u),0==p%250&&c()),q={x:t,y:u},p<k.length-1&&(T!==(k[p].lineColor||aa)||Y!==(k[p].lineDashType||B.lineDashType))&&(c(),T=k[p].lineColor||aa,g.strokeStyle=T,g.setLineDash&&(k[p].lineDashType?(Y=k[p].lineDashType, +g.setLineDash(R(Y,B.lineThickness))):(Y=B.lineDashType,g.setLineDash(da)))),x=B.dataPointIds[p],this._eventManager.objectMap[x]={id:x,objectType:"dataPoint",dataSeriesIndex:f,dataPointIndex:p,x1:t,y1:u},0!==k[p].markerSize&&(0<k[p].markerSize||0<B.markerSize)&&(Z=B.getMarkerProperties(p,t,u,g),h.push(Z),x=N(x),r&&h.push({x:t,y:u,ctx:m,type:Z.type,size:Z.size,color:x,borderColor:x,borderThickness:Z.borderThickness})),(k[p].indexLabel||B.indexLabel||k[p].indexLabelFormatter||B.indexLabelFormatter)&& +this._indexLabels.push({chartType:"stepArea",dataPoint:k[p],dataSeries:B,point:{x:t,y:u},direction:0>k[p].y===a.axisY.reversed?1:-1,color:z}))}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea=function(a){function d(){if(!(1>h.length)){for(0<A.lineThickness&&c.stroke();0<h.length;){var a=h.pop();c.lineTo(a.x,a.y);r&&u.lineTo(a.x,a.y)}c.closePath();c.globalAlpha=A.fillOpacity;c.fill();c.globalAlpha=1;c.beginPath();r&&(u.closePath(), +u.fill(),u.beginPath());h=[]}}var b=a.targetCanvasCtx||this.plotArea.ctx,c=r?this._preRenderCtx:b;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=[],l=this.plotArea,w=[],h=[],s=[],q=[],n=0,f,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),u=this._eventManager.ghostCtx,t,C,x;r&&u.beginPath();c.save();r&&u.save();c.beginPath();c.rect(l.x1,l.y1,l.width,l.height);c.clip();r&&(u.beginPath(),u.rect(l.x1,l.y1,l.width,l.height),u.clip());for(var e=[],v=0;v<a.dataSeriesIndexes.length;v++){var y= +a.dataSeriesIndexes[v],A=this.data[y],z=A.dataPoints;A.dataPointIndexes=[];for(n=0;n<z.length;n++)y=z[n].x.getTime?z[n].x.getTime():z[n].x,A.dataPointIndexes[y]=n,e[y]||(s.push(y),e[y]=!0);s.sort(Sa)}for(v=0;v<a.dataSeriesIndexes.length;v++){y=a.dataSeriesIndexes[v];A=this.data[y];z=A.dataPoints;C=!0;h=[];n=A.id;this._eventManager.objectMap[n]={objectType:"dataSeries",dataSeriesIndex:y};n=N(n);u.fillStyle=n;if(0<s.length){var e=A._colorSet[0],aa=A.lineColor=A.options.lineColor||e,T=aa;c.fillStyle= +e;c.strokeStyle=aa;c.lineWidth=A.lineThickness;x="solid";if(c.setLineDash){var Y=R(A.nullDataLineDashType,A.lineThickness);x=A.lineDashType;var ca=R(x,A.lineThickness);c.setLineDash(ca)}for(var da=!0,n=0;n<s.length;n++){var g=s[n],Z=null,Z=0<=A.dataPointIndexes[g]?z[A.dataPointIndexes[g]]:{x:g,y:null};if(!(g<a.axisX.dataInfo.viewPortMin||g>a.axisX.dataInfo.viewPortMax&&(!A.connectNullData||!da)))if("number"!==typeof Z.y)A.connectNullData||(da||C)||d(),da=!0;else{f=a.axisX.convertValueToPixel(g);var oa= +w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length){q[g]=Z.y+(q[g]?q[g]:0);if(0>=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(Z.y),k-=oa;h.push({x:f,y:p-oa});w[g]=p-k;C||da?(!C&&A.connectNullData?(c.setLineDash&&(A.options.nullDataLineDashType||x===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(C=h.pop(),x=h[h.length-1],d(),c.moveTo(t.x,t.y),h.push(x),h.push(C),x=A.nullDataLineDashType, +c.setLineDash(Y)),c.lineTo(f,k),r&&u.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(u.beginPath(),u.moveTo(f,k))),da=C=!1):(c.lineTo(f,k),r&&u.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&u.moveTo(f,k),h.push({x:f,y:p-oa})));t={x:f,y:k};n<z.length-1&&(T!==(z[n].lineColor||aa)||x!==(z[n].lineDashType||A.lineDashType))&&(d(),c.beginPath(),c.moveTo(f,k),h.push({x:f,y:p-oa}),T=z[n].lineColor||aa,c.strokeStyle=T,c.setLineDash&&(z[n].lineDashType?(x=z[n].lineDashType,c.setLineDash(R(x,A.lineThickness))): +(x=A.lineDashType,c.setLineDash(ca))));if(0<=A.dataPointIndexes[g]){var la=A.dataPointIds[A.dataPointIndexes[g]];this._eventManager.objectMap[la]={id:la,objectType:"dataPoint",dataSeriesIndex:y,dataPointIndex:A.dataPointIndexes[g],x1:f,y1:k}}0<=A.dataPointIndexes[g]&&0!==Z.markerSize&&(0<Z.markerSize||0<A.markerSize)&&(oa=A.getMarkerProperties(A.dataPointIndexes[g],f,k,c),m.push(oa),g=N(la),r&&m.push({x:f,y:k,ctx:u,type:oa.type,size:oa.size,color:g,borderColor:g,borderThickness:oa.borderThickness})); +(Z.indexLabel||A.indexLabel||Z.indexLabelFormatter||A.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedArea",dataPoint:Z,dataSeries:A,point:{x:f,y:k},direction:0>z[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&u.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& +c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(l.x1,l.y1,l.width,l.height),u.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea100=function(a){function d(){for(0<A.lineThickness&&c.stroke();0<h.length;){var a=h.pop();c.lineTo(a.x,a.y);r&&x.lineTo(a.x, +a.y)}c.closePath();c.globalAlpha=A.fillOpacity;c.fill();c.globalAlpha=1;c.beginPath();r&&(x.closePath(),x.fill(),x.beginPath());h=[]}var b=a.targetCanvasCtx||this.plotArea.ctx,c=r?this._preRenderCtx:b;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=[],w=[],h=[],s=[],q=[],n=0,f,k,p,u,t,C=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),x=this._eventManager.ghostCtx;c.save();r&&x.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(x.beginPath(), +x.rect(m.x1,m.y1,m.width,m.height),x.clip());for(var e=[],v=0;v<a.dataSeriesIndexes.length;v++){var y=a.dataSeriesIndexes[v],A=this.data[y],z=A.dataPoints;A.dataPointIndexes=[];for(n=0;n<z.length;n++)y=z[n].x.getTime?z[n].x.getTime():z[n].x,A.dataPointIndexes[y]=n,e[y]||(s.push(y),e[y]=!0);s.sort(Sa)}for(v=0;v<a.dataSeriesIndexes.length;v++){y=a.dataSeriesIndexes[v];A=this.data[y];z=A.dataPoints;u=!0;e=A.id;this._eventManager.objectMap[e]={objectType:"dataSeries",dataSeriesIndex:y};e=N(e);x.fillStyle= +e;h=[];if(0<s.length){var e=A._colorSet[n%A._colorSet.length],aa=A.lineColor=A.options.lineColor||e,T=aa;c.fillStyle=e;c.strokeStyle=aa;c.lineWidth=A.lineThickness;t="solid";if(c.setLineDash){var Y=R(A.nullDataLineDashType,A.lineThickness);t=A.lineDashType;var ca=R(t,A.lineThickness);c.setLineDash(ca)}for(var da=!0,n=0;n<s.length;n++){var g=s[n],Z=null,Z=0<=A.dataPointIndexes[g]?z[A.dataPointIndexes[g]]:{x:g,y:null};if(!(g<a.axisX.dataInfo.viewPortMin||g>a.axisX.dataInfo.viewPortMax&&(!A.connectNullData|| +!da)))if("number"!==typeof Z.y)A.connectNullData||(da||u)||d(),da=!0;else{var oa;oa=0!==a.dataPointYSums[g]?100*(Z.y/a.dataPointYSums[g]):0;f=a.axisX.convertValueToPixel(g);var la=w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0<a.axisY.scaleBreaks._appliedBreaks.length){q[g]=oa+(q[g]?q[g]:0);if(0>=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(oa),k-=la;h.push({x:f,y:C-la});w[g]=C-k;u||da?(!u&&A.connectNullData?(c.setLineDash&& +(A.options.nullDataLineDashType||t===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(u=h.pop(),t=h[h.length-1],d(),c.moveTo(p.x,p.y),h.push(t),h.push(u),t=A.nullDataLineDashType,c.setLineDash(Y)),c.lineTo(f,k),r&&x.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(x.beginPath(),x.moveTo(f,k))),da=u=!1):(c.lineTo(f,k),r&&x.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&x.moveTo(f,k),h.push({x:f,y:C-la})));p={x:f,y:k};n<z.length-1&&(T!==(z[n].lineColor||aa)||t!==(z[n].lineDashType||A.lineDashType))&& +(d(),c.beginPath(),c.moveTo(f,k),h.push({x:f,y:C-la}),T=z[n].lineColor||aa,c.strokeStyle=T,c.setLineDash&&(z[n].lineDashType?(t=z[n].lineDashType,c.setLineDash(R(t,A.lineThickness))):(t=A.lineDashType,c.setLineDash(ca))));if(0<=A.dataPointIndexes[g]){var G=A.dataPointIds[A.dataPointIndexes[g]];this._eventManager.objectMap[G]={id:G,objectType:"dataPoint",dataSeriesIndex:y,dataPointIndex:A.dataPointIndexes[g],x1:f,y1:k}}0<=A.dataPointIndexes[g]&&0!==Z.markerSize&&(0<Z.markerSize||0<A.markerSize)&&(la= +A.getMarkerProperties(n,f,k,c),l.push(la),g=N(G),r&&l.push({x:f,y:k,ctx:x,type:la.type,size:la.size,color:g,borderColor:g,borderThickness:la.borderThickness}));(Z.indexLabel||A.indexLabel||Z.indexLabelFormatter||A.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedArea100",dataPoint:Z,dataSeries:A,point:{x:f,y:k},direction:0>z[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&x.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(l);r&&(b.drawImage(this._preRenderCanvas,0, +0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),x.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}}; +p.prototype.renderBubble=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=-Infinity,w=Infinity,h=0;h<a.dataSeriesIndexes.length;h++)for(var s=a.dataSeriesIndexes[h], +q=this.data[s],n=q.dataPoints,f=0,e=0;e<n.length;e++)g=n[e].getTime?g=n[e].x.getTime():g=n[e].x,g<a.axisX.dataInfo.viewPortMin||g>a.axisX.dataInfo.viewPortMax||"undefined"===typeof n[e].z||(f=n[e].z,f>l&&(l=f),f<w&&(w=f));for(var k=25*Math.PI,p=Math.max(Math.pow(0.25*Math.min(c.height,c.width)/2,2)*Math.PI,k),h=0;h<a.dataSeriesIndexes.length;h++)if(s=a.dataSeriesIndexes[h],q=this.data[s],n=q.dataPoints,0<n.length)for(b.strokeStyle="#4572A7 ",e=0;e<n.length;e++)if(g=n[e].getTime?g=n[e].x.getTime(): +g=n[e].x,!(g<a.axisX.dataInfo.viewPortMin||g>a.axisX.dataInfo.viewPortMax)&&"number"===typeof n[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(n[e].y);var f=n[e].z,u=2*Math.max(Math.sqrt((l===w?p/2:k+(p-k)/(l-w)*(f-w))/Math.PI)<<0,1),f=q.getMarkerProperties(e,b);f.size=u;b.globalAlpha=q.fillOpacity;ia.drawMarker(g,m,b,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;var t=q.dataPointIds[e];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:s, +dataPointIndex:e,x1:g,y1:m,size:u};u=N(t);r&&ia.drawMarker(g,m,this._eventManager.ghostCtx,f.type,f.size,u,u,f.borderThickness);(n[e].indexLabel||q.indexLabel||n[e].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"bubble",dataPoint:n[e],dataSeries:q,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/2,x2:g+f.size/2,y2:m+f.size/2},color:null})}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& +b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderScatter=function(a){var d= +a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=0;l<a.dataSeriesIndexes.length;l++){var w=a.dataSeriesIndexes[l],h=this.data[w],s=h.dataPoints;if(0<s.length){b.strokeStyle= +"#4572A7 ";Math.pow(0.3*Math.min(c.height,c.width)/2,2);for(var q=0,n=0,e=0;e<s.length;e++)if(g=s[e].getTime?g=s[e].x.getTime():g=s[e].x,!(g<a.axisX.dataInfo.viewPortMin||g>a.axisX.dataInfo.viewPortMax)&&"number"===typeof s[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(s[e].y);var f=h.getMarkerProperties(e,g,m,b);b.globalAlpha=h.fillOpacity;ia.drawMarker(f.x,f.y,f.ctx,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;Math.sqrt((q-g)*(q-g)+(n-m)*(n-m))<Math.min(f.size, +5)&&s.length>Math.min(this.plotArea.width,this.plotArea.height)||(q=h.dataPointIds[e],this._eventManager.objectMap[q]={id:q,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:e,x1:g,y1:m},q=N(q),r&&ia.drawMarker(f.x,f.y,this._eventManager.ghostCtx,f.type,f.size,q,q,f.borderThickness),(s[e].indexLabel||h.indexLabel||s[e].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"scatter",dataPoint:s[e],dataSeries:h,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/ +2,x2:g+f.size/2,y2:m+f.size/2},color:null}),q=g,n=m)}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore()); +b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderCandlestick=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=0,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,g=this.options.dataPointMaxWidth? +this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*m.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&&e>g&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,g));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&g<e)&&(g=Math.max(this.options.dataPointWidth? +this.dataPointWidth:-Infinity,e));k<e&&(k=e);k>g&&(k=g);b.save();r&&c.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(c.beginPath(),c.rect(m.x1,m.y1,m.width,m.height),c.clip());for(var p=0;p<a.dataSeriesIndexes.length;p++){var v=a.dataSeriesIndexes[p],t=this.data[v],C=t.dataPoints;if(0<C.length)for(var x=5<k&&t.bevelEnabled?!0:!1,l=0;l<C.length;l++)if(C[l].getTime?f=C[l].x.getTime():f=C[l].x,!(f<a.axisX.dataInfo.viewPortMin||f>a.axisX.dataInfo.viewPortMax)&&!u(C[l].y)&&C[l].y.length&& +"number"===typeof C[l].y[0]&&"number"===typeof C[l].y[1]&&"number"===typeof C[l].y[2]&&"number"===typeof C[l].y[3]){w=a.axisX.convertValueToPixel(f);h=a.axisY.convertValueToPixel(C[l].y[0]);s=a.axisY.convertValueToPixel(C[l].y[1]);q=a.axisY.convertValueToPixel(C[l].y[2]);n=a.axisY.convertValueToPixel(C[l].y[3]);var z=w-k/2<<0,y=z+k<<0,g=t.options.fallingColor?t.fallingColor:t._colorSet[0],e=C[l].color?C[l].color:t._colorSet[0],A=Math.round(Math.max(1,0.15*k)),D=0===A%2?0:0.5,aa=t.dataPointIds[l]; +this._eventManager.objectMap[aa]={id:aa,objectType:"dataPoint",dataSeriesIndex:v,dataPointIndex:l,x1:z,y1:h,x2:y,y2:s,x3:w,y3:q,x4:w,y4:n,borderThickness:A,color:e};b.strokeStyle=e;b.beginPath();b.lineWidth=A;c.lineWidth=Math.max(A,4);"candlestick"===t.type?(b.moveTo(w-D,s),b.lineTo(w-D,Math.min(h,n)),b.stroke(),b.moveTo(w-D,Math.max(h,n)),b.lineTo(w-D,q),b.stroke(),ea(b,z,Math.min(h,n),y,Math.max(h,n),C[l].y[0]<=C[l].y[3]?t.risingColor:g,A,e,x,x,!1,!1,t.fillOpacity),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w- +D,s),c.lineTo(w-D,Math.min(h,n)),c.stroke(),c.moveTo(w-D,Math.max(h,n)),c.lineTo(w-D,q),c.stroke(),ea(c,z,Math.min(h,n),y,Math.max(h,n),e,0,null,!1,!1,!1,!1))):"ohlc"===t.type&&(b.moveTo(w-D,s),b.lineTo(w-D,q),b.stroke(),b.beginPath(),b.moveTo(w,h),b.lineTo(z,h),b.stroke(),b.beginPath(),b.moveTo(w,n),b.lineTo(y,n),b.stroke(),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w-D,s),c.lineTo(w-D,q),c.stroke(),c.beginPath(),c.moveTo(w,h),c.lineTo(z,h),c.stroke(),c.beginPath(),c.moveTo(w,n),c.lineTo(y,n),c.stroke())); +(C[l].indexLabel||t.indexLabel||C[l].indexLabelFormatter||t.indexLabelFormatter)&&this._indexLabels.push({chartType:t.type,dataPoint:C[l],dataSeries:t,point:{x:z+(y-z)/2,y:a.axisY.reversed?q:s},direction:1,bounds:{x1:z,y1:Math.min(s,q),x2:y,y2:Math.max(s,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas, +0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderBoxAndWhisker=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e= +null,g=this.plotArea,m=0,l,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*g.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&& +e>m&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&m<e)&&(m=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,e));k<e&&(k=e);k>m&&(k=m);b.save();r&&c.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(c.beginPath(),c.rect(g.x1,g.y1,g.width,g.height),c.clip());for(var p=!1,p=!!a.axisY.reversed,v=0;v<a.dataSeriesIndexes.length;v++){var t=a.dataSeriesIndexes[v],C=this.data[t],x=C.dataPoints; +if(0<x.length)for(var z=5<k&&C.bevelEnabled?!0:!1,m=0;m<x.length;m++)if(x[m].getTime?f=x[m].x.getTime():f=x[m].x,!(f<a.axisX.dataInfo.viewPortMin||f>a.axisX.dataInfo.viewPortMax)&&!u(x[m].y)&&x[m].y.length&&"number"===typeof x[m].y[0]&&"number"===typeof x[m].y[1]&&"number"===typeof x[m].y[2]&&"number"===typeof x[m].y[3]&&"number"===typeof x[m].y[4]&&5===x[m].y.length){l=a.axisX.convertValueToPixel(f);w=a.axisY.convertValueToPixel(x[m].y[0]);h=a.axisY.convertValueToPixel(x[m].y[1]);s=a.axisY.convertValueToPixel(x[m].y[2]); +q=a.axisY.convertValueToPixel(x[m].y[3]);n=a.axisY.convertValueToPixel(x[m].y[4]);var y=l-k/2<<0,A=l+k/2<<0,e=x[m].color?x[m].color:C._colorSet[0],D=Math.round(Math.max(1,0.15*k)),aa=0===D%2?0:0.5,T=x[m].whiskerColor?x[m].whiskerColor:x[m].color?C.whiskerColor?C.whiskerColor:x[m].color:C.whiskerColor?C.whiskerColor:e,Y="number"===typeof x[m].whiskerThickness?x[m].whiskerThickness:"number"===typeof C.options.whiskerThickness?C.whiskerThickness:D,ca=x[m].whiskerDashType?x[m].whiskerDashType:C.whiskerDashType, +da=u(x[m].whiskerLength)?u(C.options.whiskerLength)?k:C.whiskerLength:x[m].whiskerLength,da="number"===typeof da?0>=da?0:da>=k?k:da:"string"===typeof da?parseInt(da)*k/100>k?k:parseInt(da)*k/100:k,Z=1===Math.round(Y)%2?0.5:0,oa=x[m].stemColor?x[m].stemColor:x[m].color?C.stemColor?C.stemColor:x[m].color:C.stemColor?C.stemColor:e,la="number"===typeof x[m].stemThickness?x[m].stemThickness:"number"===typeof C.options.stemThickness?C.stemThickness:D,G=1===Math.round(la)%2?0.5:0,F=x[m].stemDashType?x[m].stemDashType: +C.stemDashType,E=x[m].lineColor?x[m].lineColor:x[m].color?C.lineColor?C.lineColor:x[m].color:C.lineColor?C.lineColor:e,H="number"===typeof x[m].lineThickness?x[m].lineThickness:"number"===typeof C.options.lineThickness?C.lineThickness:D,I=x[m].lineDashType?x[m].lineDashType:C.lineDashType,K=1===Math.round(H)%2?0.5:0,L=C.upperBoxColor,O=C.lowerBoxColor,Q=u(C.options.fillOpacity)?1:C.fillOpacity,P=C.dataPointIds[m];this._eventManager.objectMap[P]={id:P,objectType:"dataPoint",dataSeriesIndex:t,dataPointIndex:m, +x1:y,y1:w,x2:A,y2:h,x3:l,y3:s,x4:l,y4:q,y5:n,borderThickness:D,color:e,stemThickness:la,stemColor:oa,whiskerThickness:Y,whiskerLength:da,whiskerColor:T,lineThickness:H,lineColor:E};b.save();0<la&&(b.beginPath(),b.strokeStyle=oa,b.lineWidth=la,b.setLineDash&&b.setLineDash(R(F,la)),b.moveTo(l-G,h),b.lineTo(l-G,w),b.stroke(),b.moveTo(l-G,q),b.lineTo(l-G,s),b.stroke());b.restore();c.lineWidth=Math.max(D,4);b.beginPath();ea(b,y,Math.min(n,h),A,Math.max(h,n),O,0,e,p?z:!1,p?!1:z,!1,!1,Q);b.beginPath();ea(b, +y,Math.min(s,n),A,Math.max(n,s),L,0,e,p?!1:z,p?z:!1,!1,!1,Q);b.beginPath();b.lineWidth=D;b.strokeStyle=e;b.rect(y-aa,Math.min(h,s)-aa,A-y+2*aa,Math.max(h,s)-Math.min(h,s)+2*aa);b.stroke();b.save();0<H&&(b.beginPath(),b.globalAlpha=1,b.setLineDash&&b.setLineDash(R(I,H)),b.strokeStyle=E,b.lineWidth=H,b.moveTo(y,n-K),b.lineTo(A,n-K),b.stroke());b.restore();b.save();0<Y&&(b.beginPath(),b.setLineDash&&b.setLineDash(R(ca,Y)),b.strokeStyle=T,b.lineWidth=Y,b.moveTo(l-da/2<<0,q-Z),b.lineTo(l+da/2<<0,q-Z), +b.stroke(),b.moveTo(l-da/2<<0,w+Z),b.lineTo(l+da/2<<0,w+Z),b.stroke());b.restore();r&&(e=N(P),c.strokeStyle=e,c.lineWidth=la,0<la&&(c.moveTo(l-aa-G,h),c.lineTo(l-aa-G,Math.max(w,q)),c.stroke(),c.moveTo(l-aa-G,Math.min(w,q)),c.lineTo(l-aa-G,s),c.stroke()),ea(c,y,Math.max(h,s),A,Math.min(h,s),e,0,null,!1,!1,!1,!1),0<Y&&(c.beginPath(),c.lineWidth=Y,c.moveTo(l+da/2,q-Z),c.lineTo(l-da/2,q-Z),c.stroke(),c.moveTo(l+da/2,w+Z),c.lineTo(l-da/2,w+Z),c.stroke()));(x[m].indexLabel||C.indexLabel||x[m].indexLabelFormatter|| +C.indexLabelFormatter)&&this._indexLabels.push({chartType:C.type,dataPoint:x[m],dataSeries:C,point:{x:y+(A-y)/2,y:a.axisY.reversed?w:q},direction:1,bounds:{x1:y,y1:Math.min(w,q),x2:A,y2:Math.max(w,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, +0,0,this.width,this.height),b.clearRect(g.x1,g.y1,g.width,g.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth: +1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.03*this.width;var h=a.axisX.dataInfo.minDiff;isFinite(h)||(h=0.3*Math.abs(a.axisX.range));h=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(h)/Math.log(a.axisX.range):Math.abs(h)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&& +(this.dataPointMinWidth&&m<g)&&(m=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,g));h<g&&(h=g);h>m&&(h=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var s=0;s<a.dataSeriesIndexes.length;s++){var q=a.dataSeriesIndexes[s],n=this.data[q],f=n.dataPoints;if(0<f.length)for(var k= +5<h&&n.bevelEnabled?!0:!1,g=0;g<f.length;g++)if(f[g].getTime?w=f[g].x.getTime():w=f[g].x,!(w<a.axisX.dataInfo.viewPortMin||w>a.axisX.dataInfo.viewPortMax)&&!u(f[g].y)&&f[g].y.length&&"number"===typeof f[g].y[0]&&"number"===typeof f[g].y[1]){c=a.axisX.convertValueToPixel(w);m=a.axisY.convertValueToPixel(f[g].y[0]);l=a.axisY.convertValueToPixel(f[g].y[1]);var p=a.axisX.reversed?c+a.plotType.totalDataSeries*h/2-(a.previousDataSeriesCount+s)*h<<0:c-a.plotType.totalDataSeries*h/2+(a.previousDataSeriesCount+ +s)*h<<0,v=a.axisX.reversed?p-h<<0:p+h<<0,c=f[g].color?f[g].color:n._colorSet[g%n._colorSet.length];if(m>l){var t=m;m=l;l=t}t=n.dataPointIds[g];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:q,dataPointIndex:g,x1:p,y1:m,x2:v,y2:l};ea(b,p,m,v,l,c,0,c,k,k,!1,!1,n.fillOpacity);c=N(t);r&&ea(this._eventManager.ghostCtx,p,m,v,l,c,0,null,!1,!1,!1,!1);if(f[g].indexLabel||n.indexLabel||f[g].indexLabelFormatter||n.indexLabelFormatter)this._indexLabels.push({chartType:"rangeColumn", +dataPoint:f[g],dataSeries:n,indexKeyword:0,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?l:m},direction:f[g].y[1]>=f[g].y[0]?-1:1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c}),this._indexLabels.push({chartType:"rangeColumn",dataPoint:f[g],dataSeries:n,indexKeyword:1,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?m:l},direction:f[g].y[1]>=f[g].y[0]?1:-1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation= +"source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderError= +function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=a.axisY._position?"left"===a.axisY._position||"right"===a.axisY._position?!1:!0:!1;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=!1,m=this.plotArea,l=0,w,h,s,q,n,f,k,p=a.axisX.dataInfo.minDiff;isFinite(p)||(p=0.3*Math.abs(a.axisX.range));b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(m.x1, +m.y1,m.width,m.height),this._eventManager.ghostCtx.clip());for(var v=0,t=0;t<this.data.length;t++)!this.data[t].type.match(/(bar|column)/ig)||!this.data[t].visible||this.data[t].type.match(/(stacked)/ig)&&v||v++;for(var C=0;C<a.dataSeriesIndexes.length;C++){var x=a.dataSeriesIndexes[C],z=this.data[x],y=z.dataPoints,A=u(z._linkedSeries)?!1:z._linkedSeries.type.match(/(bar|column)/ig)&&z._linkedSeries.visible?!0:!1,D=0;if(A)for(e=z._linkedSeries.id,t=0;t<e;t++)!this.data[t].type.match(/(bar|column)/ig)|| +!this.data[t].visible||this.data[t].type.match(/(stacked)/ig)&&D||(this.data[t].type.match(/(range)/ig)&&(g=!0),D++);e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;l=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:c?Math.min(0.15*this.height,0.9*(this.plotArea.height/(A?v:1)))<<0:0.3*this.width;g&&(l=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth: +c?Math.min(0.15*this.height,0.9*(this.plotArea.height/(A?v:1)))<<0:0.03*this.width);t=this.options.dataPointWidth?this.dataPointWidth:0.9*((c?m.height:m.width)*(a.axisX.logarithmic?Math.log(p)/Math.log(a.axisX.range):Math.abs(p)/Math.abs(a.axisX.range))/(A?v:1))<<0;this.dataPointMaxWidth&&e>l&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,l));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&l<e)&&(l=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,e));t<e&& +(t=e);t>l&&(t=l);if(0<y.length)for(var aa=z._colorSet,l=0;l<y.length;l++){var e=z.lineColor=z.options.color?z.options.color:aa[0],T={color:y[l].whiskerColor?y[l].whiskerColor:y[l].color?z.whiskerColor?z.whiskerColor:y[l].color:z.whiskerColor?z.whiskerColor:e,thickness:u(y[l].whiskerThickness)?z.whiskerThickness:y[l].whiskerThickness,dashType:y[l].whiskerDashType?y[l].whiskerDashType:z.whiskerDashType,length:u(y[l].whiskerLength)?u(z.options.whiskerLength)?t:z.options.whiskerLength:y[l].whiskerLength, +trimLength:u(y[l].whiskerLength)?u(z.options.whiskerLength)?50:0:0};T.length="number"===typeof T.length?0>=T.length?0:T.length>=t?t:T.length:"string"===typeof T.length?parseInt(T.length)*t/100>t?t:parseInt(T.length)*t/100>t:t;T.thickness="number"===typeof T.thickness?0>T.thickness?0:Math.round(T.thickness):2;var Y={color:y[l].stemColor?y[l].stemColor:y[l].color?z.stemColor?z.stemColor:y[l].color:z.stemColor?z.stemColor:e,thickness:y[l].stemThickness?y[l].stemThickness:z.stemThickness,dashType:y[l].stemDashType? +y[l].stemDashType:z.stemDashType};Y.thickness="number"===typeof Y.thickness?0>Y.thickness?0:Math.round(Y.thickness):2;y[l].getTime?k=y[l].x.getTime():k=y[l].x;if(!(k<a.axisX.dataInfo.viewPortMin||k>a.axisX.dataInfo.viewPortMax)&&!u(y[l].y)&&y[l].y.length&&"number"===typeof y[l].y[0]&&"number"===typeof y[l].y[1]){var ca=a.axisX.convertValueToPixel(k);c?h=ca:w=ca;ca=a.axisY.convertValueToPixel(y[l].y[0]);c?s=ca:n=ca;ca=a.axisY.convertValueToPixel(y[l].y[1]);c?q=ca:f=ca;c?(n=a.axisX.reversed?h+(A?v: +1)*t/2-(A?D-1:0)*t<<0:h-(A?v:1)*t/2+(A?D-1:0)*t<<0,f=a.axisX.reversed?n-t<<0:n+t<<0):(s=a.axisX.reversed?w+(A?v:1)*t/2-(A?D-1:0)*t<<0:w-(A?v:1)*t/2+(A?D-1:0)*t<<0,q=a.axisX.reversed?s-t<<0:s+t<<0);!c&&n>f&&(ca=n,n=f,f=ca);c&&s>q&&(ca=s,s=q,q=ca);ca=z.dataPointIds[l];this._eventManager.objectMap[ca]={id:ca,objectType:"dataPoint",dataSeriesIndex:x,dataPointIndex:l,x1:Math.min(s,q),y1:Math.min(n,f),x2:Math.max(q,s),y2:Math.max(f,n),isXYSwapped:c,stemProperties:Y,whiskerProperties:T};E(b,Math.min(s,q), +Math.min(n,f),Math.max(q,s),Math.max(f,n),e,T,Y,c);r&&E(this._eventManager.ghostCtx,s,n,q,f,e,T,Y,c);if(y[l].indexLabel||z.indexLabel||y[l].indexLabelFormatter||z.indexLabelFormatter)this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:0,point:{x:c?y[l].y[1]>=y[l].y[0]?s:q:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?f:n},direction:y[l].y[1]>=y[l].y[0]?-1:1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c}), +this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:1,point:{x:c?y[l].y[1]>=y[l].y[0]?q:s:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?n:f},direction:y[l].y[1]>=y[l].y[0]?1:-1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height), +a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx: +d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0;var s=a.axisX.dataInfo.minDiff;isFinite(s)||(s=0.3*Math.abs(a.axisX.range));s=this.options.dataPointWidth?this.dataPointWidth:0.9* +(e.height*(a.axisX.logarithmic?Math.log(s)/Math.log(a.axisX.range):Math.abs(s)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&m<g)&&(m=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,g));s<g&&(s=g);s>m&&(s=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(), +this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var q=0;q<a.dataSeriesIndexes.length;q++){var n=a.dataSeriesIndexes[q],f=this.data[n],k=f.dataPoints;if(0<k.length){var p=5<s&&f.bevelEnabled?!0:!1;b.strokeStyle="#4572A7 ";for(g=0;g<k.length;g++)if(k[g].getTime?h=k[g].x.getTime():h=k[g].x,!(h<a.axisX.dataInfo.viewPortMin||h>a.axisX.dataInfo.viewPortMax)&&!u(k[g].y)&&k[g].y.length&&"number"===typeof k[g].y[0]&&"number"===typeof k[g].y[1]){m=a.axisY.convertValueToPixel(k[g].y[0]); +l=a.axisY.convertValueToPixel(k[g].y[1]);w=a.axisX.convertValueToPixel(h);w=a.axisX.reversed?w+a.plotType.totalDataSeries*s/2-(a.previousDataSeriesCount+q)*s<<0:w-a.plotType.totalDataSeries*s/2+(a.previousDataSeriesCount+q)*s<<0;var v=a.axisX.reversed?w-s<<0:w+s<<0;m>l&&(c=m,m=l,l=c);c=k[g].color?k[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,w,l,v,c,0,null,p,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g, +x1:m,y1:w,x2:l,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,m,w,l,v,c,0,null,!1,!1,!1,!1);if(k[g].indexLabel||f.indexLabel||k[g].indexLabelFormatter||f.indexLabelFormatter)this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:0,point:{x:k[g].y[1]>=k[g].y[0]?m:l,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?-1:1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c}),this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:1,point:{x:k[g].y[1]>= +k[g].y[0]?l:m,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?1:-1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1, +e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeArea=function(a){function d(){if(C){var a=null;0<s.lineThickness&&c.stroke();for(var b=w.length-1;0<=b;b--)a=w[b],c.lineTo(a.x,a.y),e.lineTo(a.x,a.y);c.closePath();c.globalAlpha=s.fillOpacity;c.fill();c.globalAlpha=1;e.fill();if(0<s.lineThickness){c.beginPath();c.moveTo(a.x, +a.y);for(b=0;b<w.length;b++)a=w[b],c.lineTo(a.x,a.y);c.stroke()}c.beginPath();c.moveTo(k,p);e.beginPath();e.moveTo(k,p);C={x:k,y:p};w=[];w.push({x:k,y:u})}}var b=a.targetCanvasCtx||this.plotArea.ctx,c=r?this._preRenderCtx:b;if(!(0>=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width,m.height),e.clip());for(var l=0;l<a.dataSeriesIndexes.length;l++){var w= +[],h=a.dataSeriesIndexes[l],s=this.data[h],q=s.dataPoints,g=s.id;this._eventManager.objectMap[g]={objectType:"dataSeries",dataSeriesIndex:h};g=N(g);e.fillStyle=g;var g=[],n=!0,f=0,k,p,u,t,C=null;if(0<q.length){var x=s._colorSet[f%s._colorSet.length],v=s.lineColor=s.options.lineColor||x,y=v;c.fillStyle=x;c.strokeStyle=v;c.lineWidth=s.lineThickness;var A="solid";if(c.setLineDash){var z=R(s.nullDataLineDashType,s.lineThickness),A=s.lineDashType,D=R(A,s.lineThickness);c.setLineDash(D)}for(var T=!0;f< +q.length;f++)if(t=q[f].x.getTime?q[f].x.getTime():q[f].x,!(t<a.axisX.dataInfo.viewPortMin||t>a.axisX.dataInfo.viewPortMax&&(!s.connectNullData||!T)))if(null!==q[f].y&&q[f].y.length&&"number"===typeof q[f].y[0]&&"number"===typeof q[f].y[1]){k=a.axisX.convertValueToPixel(t);p=a.axisY.convertValueToPixel(q[f].y[0]);u=a.axisY.convertValueToPixel(q[f].y[1]);n||T?(s.connectNullData&&!n?(c.setLineDash&&(s.options.nullDataLineDashType||A===s.lineDashType&&s.lineDashType!==s.nullDataLineDashType)&&(w[w.length- +1].newLineDashArray=D,A=s.nullDataLineDashType,c.setLineDash(z)),c.lineTo(k,p),r&&e.lineTo(k,p),w.push({x:k,y:u})):(c.beginPath(),c.moveTo(k,p),C={x:k,y:p},w=[],w.push({x:k,y:u}),r&&(e.beginPath(),e.moveTo(k,p))),T=n=!1):(c.lineTo(k,p),w.push({x:k,y:u}),r&&e.lineTo(k,p),0==f%250&&d());t=s.dataPointIds[f];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:h,dataPointIndex:f,x1:k,y1:p,y2:u};f<q.length-1&&(y!==(q[f].lineColor||v)||A!==(q[f].lineDashType||s.lineDashType))&&(d(), +y=q[f].lineColor||v,w[w.length-1].newStrokeStyle=y,c.strokeStyle=y,c.setLineDash&&(q[f].lineDashType?(A=q[f].lineDashType,w[w.length-1].newLineDashArray=R(A,s.lineThickness),c.setLineDash(w[w.length-1].newLineDashArray)):(A=s.lineDashType,w[w.length-1].newLineDashArray=D,c.setLineDash(D))));if(0!==q[f].markerSize&&(0<q[f].markerSize||0<s.markerSize)){var Y=s.getMarkerProperties(f,k,u,c);g.push(Y);var ca=N(t);r&&g.push({x:k,y:u,ctx:e,type:Y.type,size:Y.size,color:ca,borderColor:ca,borderThickness:Y.borderThickness}); +Y=s.getMarkerProperties(f,k,p,c);g.push(Y);ca=N(t);r&&g.push({x:k,y:p,ctx:e,type:Y.type,size:Y.size,color:ca,borderColor:ca,borderThickness:Y.borderThickness})}if(q[f].indexLabel||s.indexLabel||q[f].indexLabelFormatter||s.indexLabelFormatter)this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:0,point:{x:k,y:p},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?-1:1,color:x}),this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:1,point:{x:k, +y:u},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?1:-1,color:x})}else T||n||d(),T=!0;d();ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1, +m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderRangeSplineArea=function(a){function d(a,b){var d=v(u,2);if(0<d.length){if(0<h.lineThickness){c.strokeStyle=b;c.setLineDash&&c.setLineDash(a);c.beginPath();c.moveTo(d[0].x,d[0].y);for(var f=0;f<d.length-3;f+=3){if(d[f].newStrokeStyle||d[f].newLineDashArray)c.stroke(),c.beginPath(),c.moveTo(d[f].x, +d[f].y),d[f].newStrokeStyle&&(c.strokeStyle=d[f].newStrokeStyle),d[f].newLineDashArray&&c.setLineDash(d[f].newLineDashArray);c.bezierCurveTo(d[f+1].x,d[f+1].y,d[f+2].x,d[f+2].y,d[f+3].x,d[f+3].y)}c.stroke()}c.beginPath();c.moveTo(d[0].x,d[0].y);r&&(e.beginPath(),e.moveTo(d[0].x,d[0].y));for(f=0;f<d.length-3;f+=3)c.bezierCurveTo(d[f+1].x,d[f+1].y,d[f+2].x,d[f+2].y,d[f+3].x,d[f+3].y),r&&e.bezierCurveTo(d[f+1].x,d[f+1].y,d[f+2].x,d[f+2].y,d[f+3].x,d[f+3].y);d=v(z,2);c.lineTo(z[z.length-1].x,z[z.length- +1].y);for(f=d.length-1;2<f;f-=3)c.bezierCurveTo(d[f-1].x,d[f-1].y,d[f-2].x,d[f-2].y,d[f-3].x,d[f-3].y),r&&e.bezierCurveTo(d[f-1].x,d[f-1].y,d[f-2].x,d[f-2].y,d[f-3].x,d[f-3].y);c.closePath();c.globalAlpha=h.fillOpacity;c.fill();r&&(e.closePath(),e.fill());c.globalAlpha=1;if(0<h.lineThickness){c.strokeStyle=b;c.setLineDash&&c.setLineDash(a);c.beginPath();c.moveTo(d[0].x,d[0].y);for(var g=f=0;f<d.length-3;f+=3,g++){if(u[g].newStrokeStyle||u[g].newLineDashArray)c.stroke(),c.beginPath(),c.moveTo(d[f].x, +d[f].y),u[g].newStrokeStyle&&(c.strokeStyle=u[g].newStrokeStyle),u[g].newLineDashArray&&c.setLineDash(u[g].newLineDashArray);c.bezierCurveTo(d[f+1].x,d[f+1].y,d[f+2].x,d[f+2].y,d[f+3].x,d[f+3].y)}c.stroke()}c.beginPath()}}var b=a.targetCanvasCtx||this.plotArea.ctx,c=r?this._preRenderCtx:b;if(!(0>=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width, +m.height),e.clip());for(var l=0;l<a.dataSeriesIndexes.length;l++){var w=a.dataSeriesIndexes[l],h=this.data[w],k=h.dataPoints,g=h.id;this._eventManager.objectMap[g]={objectType:"dataSeries",dataSeriesIndex:w};g=N(g);e.fillStyle=g;var g=[],q=0,n,f,p,u=[],z=[];if(0<k.length){var t=h._colorSet[q%h._colorSet.length],C=h.lineColor=h.options.lineColor||t,x=C;c.fillStyle=t;c.lineWidth=h.lineThickness;var F="solid",y;if(c.setLineDash){var A=R(h.nullDataLineDashType,h.lineThickness),F=h.lineDashType;y=R(F, +h.lineThickness)}for(f=!1;q<k.length;q++)if(n=k[q].x.getTime?k[q].x.getTime():k[q].x,!(n<a.axisX.dataInfo.viewPortMin||n>a.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!f)))if(null!==k[q].y&&k[q].y.length&&"number"===typeof k[q].y[0]&&"number"===typeof k[q].y[1]){n=a.axisX.convertValueToPixel(n);f=a.axisY.convertValueToPixel(k[q].y[0]);p=a.axisY.convertValueToPixel(k[q].y[1]);var E=h.dataPointIds[q];this._eventManager.objectMap[E]={id:E,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:q, +x1:n,y1:f,y2:p};u[u.length]={x:n,y:f};z[z.length]={x:n,y:p};q<k.length-1&&(x!==(k[q].lineColor||C)||F!==(k[q].lineDashType||h.lineDashType))&&(x=k[q].lineColor||C,u[u.length-1].newStrokeStyle=x,c.setLineDash&&(k[q].lineDashType?(F=k[q].lineDashType,u[u.length-1].newLineDashArray=R(F,h.lineThickness)):(F=h.lineDashType,u[u.length-1].newLineDashArray=y)));if(0!==k[q].markerSize&&(0<k[q].markerSize||0<h.markerSize)){var aa=h.getMarkerProperties(q,n,f,c);g.push(aa);var T=N(E);r&&g.push({x:n,y:f,ctx:e, +type:aa.type,size:aa.size,color:T,borderColor:T,borderThickness:aa.borderThickness});aa=h.getMarkerProperties(q,n,p,c);g.push(aa);T=N(E);r&&g.push({x:n,y:p,ctx:e,type:aa.type,size:aa.size,color:T,borderColor:T,borderThickness:aa.borderThickness})}if(k[q].indexLabel||h.indexLabel||k[q].indexLabelFormatter||h.indexLabelFormatter)this._indexLabels.push({chartType:"rangeSplineArea",dataPoint:k[q],dataSeries:h,indexKeyword:0,point:{x:n,y:f},direction:k[q].y[0]<=k[q].y[1]?-1:1,color:t}),this._indexLabels.push({chartType:"rangeSplineArea", +dataPoint:k[q],dataSeries:h,indexKeyword:1,point:{x:n,y:p},direction:k[q].y[0]<=k[q].y[1]?1:-1,color:t});f=!1}else 0<q&&!f&&(h.connectNullData?c.setLineDash&&(0<u.length&&(h.options.nullDataLineDashType||!k[q-1].lineDashType))&&(u[u.length-1].newLineDashArray=A,F=h.nullDataLineDashType):(d(y,C),u=[],z=[])),f=!0;d(y,C);ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0, +this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderWaterfall=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx, +b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx,e=null,g=this.plotArea,m=0,l,k,h,s,q=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),m=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;k=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width,0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0;var n= +a.axisX.dataInfo.minDiff;isFinite(n)||(n=0.3*Math.abs(a.axisX.range));n=this.options.dataPointWidth?this.dataPointWidth:0.6*(g.width*(a.axisX.logarithmic?Math.log(n)/Math.log(a.axisX.range):Math.abs(n)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&m>k&&(m=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,k));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&k<m)&&(k=Math.max(this.options.dataPointWidth?this.dataPointWidth:-Infinity,m));n<m&&(n=m); +n>k&&(n=k);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.clip());for(var f=0;f<a.dataSeriesIndexes.length;f++){var p=a.dataSeriesIndexes[f],u=this.data[p],v=u.dataPoints,e=u._colorSet[0];u.risingColor=u.options.risingColor?u.options.risingColor:e;u.fallingColor=u.options.fallingColor?u.options.fallingColor:"#e40a0a"; +var t="number"===typeof u.options.lineThickness?Math.round(u.lineThickness):1,C=1===Math.round(t)%2?-0.5:0;if(0<v.length)for(var x=5<n&&u.bevelEnabled?!0:!1,z=!1,y=null,A=null,m=0;m<v.length;m++)if(v[m].getTime?s=v[m].x.getTime():s=v[m].x,"number"!==typeof v[m].y){if(0<m&&!z&&u.connectNullData)var D=u.options.nullDataLineDashType||!v[m-1].lineDashType?u.nullDataLineDashType:v[m-1].lineDashType;z=!0}else{l=a.axisX.convertValueToPixel(s);k=0===u.dataPointEOs[m].cumulativeSum?q:a.axisY.convertValueToPixel(u.dataPointEOs[m].cumulativeSum); +h=0===u.dataPointEOs[m].cumulativeSumYStartValue?q:a.axisY.convertValueToPixel(u.dataPointEOs[m].cumulativeSumYStartValue);l=a.axisX.reversed?l+a.plotType.totalDataSeries*n/2-(a.previousDataSeriesCount+f)*n<<0:l-a.plotType.totalDataSeries*n/2+(a.previousDataSeriesCount+f)*n<<0;var F=a.axisX.reversed?l-n<<0:l+n<<0;k>h&&(e=k,k=h,h=e);a.axisY.reversed&&(e=k,k=h,h=e);e=u.dataPointIds[m];this._eventManager.objectMap[e]={id:e,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:m,x1:l,y1:k,x2:F,y2:h}; +var T=v[m].color?v[m].color:0<v[m].y?u.risingColor:u.fallingColor;ea(b,l,k,F,h,T,0,T,x,x,!1,!1,u.fillOpacity);e=N(e);r&&ea(this._eventManager.ghostCtx,l,k,F,h,e,0,null,!1,!1,!1,!1);var Y,T=l;Y="undefined"!==typeof v[m].isIntermediateSum&&!0===v[m].isIntermediateSum||"undefined"!==typeof v[m].isCumulativeSum&&!0===v[m].isCumulativeSum?0<v[m].y?k:h:0<v[m].y?h:k;0<m&&y&&(!z||u.connectNullData)&&(z&&b.setLineDash&&b.setLineDash(R(D,t)),b.beginPath(),b.moveTo(y,A-C),b.lineTo(T,Y-C),0<t&&b.stroke(),r&& +(c.beginPath(),c.moveTo(y,A-C),c.lineTo(T,Y-C),0<t&&c.stroke()));z=!1;y=F;A=0<v[m].y?k:h;T=v[m].lineDashType?v[m].lineDashType:u.options.lineDashType?u.options.lineDashType:"shortDash";b.strokeStyle=v[m].lineColor?v[m].lineColor:u.options.lineColor?u.options.lineColor:"#9e9e9e";b.lineWidth=t;b.setLineDash&&(T=R(T,t),b.setLineDash(T));(v[m].indexLabel||u.indexLabel||v[m].indexLabelFormatter||u.indexLabelFormatter)&&this._indexLabels.push({chartType:"waterfall",dataPoint:v[m],dataSeries:u,point:{x:l+ +(F-l)/2,y:0<=v[m].y?k:h},direction:0>v[m].y===a.axisY.reversed?1:-1,bounds:{x1:l,y1:Math.min(k,h),x2:F,y2:Math.max(k,h)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height), +b.clearRect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};var ja=function(a,d,b,c,e,g,m,l,k){if(!(0>b)){"undefined"===typeof l&&(l=1);if(!r){var h=Number((m%(2*Math.PI)).toFixed(8));Number((g%(2*Math.PI)).toFixed(8))===h&&(m-=1E-4)}a.save();a.globalAlpha=l;"pie"===e?(a.beginPath(),a.moveTo(d.x,d.y),a.arc(d.x,d.y,b,g,m,!1),a.fillStyle=c,a.strokeStyle= +"white",a.lineWidth=2,a.closePath(),a.fill()):"doughnut"===e&&(a.beginPath(),a.arc(d.x,d.y,b,g,m,!1),0<=k&&a.arc(d.x,d.y,k*b,m,g,!0),a.closePath(),a.fillStyle=c,a.strokeStyle="white",a.lineWidth=2,a.fill());a.globalAlpha=1;a.restore()}};p.prototype.renderPie=function(a){function d(){if(h&&s){for(var a=0,b=0,c=0,e=0,d=0;d<s.length;d++){var g=s[d],l=h.dataPointIds[d];f[d].id=l;f[d].objectType="dataPoint";f[d].dataPointIndex=d;f[d].dataSeriesIndex=0;var m=f[d],q={percent:null,total:null},p=null,q=k.getPercentAndTotal(h, +g);if(h.indexLabelFormatter||g.indexLabelFormatter)p={chart:k.options,dataSeries:h,dataPoint:g,total:q.total,percent:q.percent};q=g.indexLabelFormatter?g.indexLabelFormatter(p):g.indexLabel?k.replaceKeywordsWithValue(g.indexLabel,g,h,d):h.indexLabelFormatter?h.indexLabelFormatter(p):h.indexLabel?k.replaceKeywordsWithValue(h.indexLabel,g,h,d):g.label?g.label:"";k._eventManager.objectMap[l]=m;m.center={x:x.x,y:x.y};m.y=g.y;m.radius=A;m.percentInnerRadius=F;m.indexLabelText=q;m.indexLabelPlacement=h.indexLabelPlacement; +m.indexLabelLineColor=g.indexLabelLineColor?g.indexLabelLineColor:h.options.indexLabelLineColor?h.options.indexLabelLineColor:g.color?g.color:h._colorSet[d%h._colorSet.length];m.indexLabelLineThickness=u(g.indexLabelLineThickness)?h.indexLabelLineThickness:g.indexLabelLineThickness;m.indexLabelLineDashType=g.indexLabelLineDashType?g.indexLabelLineDashType:h.indexLabelLineDashType;m.indexLabelFontColor=g.indexLabelFontColor?g.indexLabelFontColor:h.indexLabelFontColor;m.indexLabelFontStyle=g.indexLabelFontStyle? +g.indexLabelFontStyle:h.indexLabelFontStyle;m.indexLabelFontWeight=g.indexLabelFontWeight?g.indexLabelFontWeight:h.indexLabelFontWeight;m.indexLabelFontSize=u(g.indexLabelFontSize)?h.indexLabelFontSize:g.indexLabelFontSize;m.indexLabelFontFamily=g.indexLabelFontFamily?g.indexLabelFontFamily:h.indexLabelFontFamily;m.indexLabelBackgroundColor=g.indexLabelBackgroundColor?g.indexLabelBackgroundColor:h.options.indexLabelBackgroundColor?h.options.indexLabelBackgroundColor:h.indexLabelBackgroundColor;m.indexLabelMaxWidth= +g.indexLabelMaxWidth?g.indexLabelMaxWidth:h.indexLabelMaxWidth?h.indexLabelMaxWidth:0.33*n.width;m.indexLabelWrap="undefined"!==typeof g.indexLabelWrap?g.indexLabelWrap:h.indexLabelWrap;m.startAngle=0===d?h.startAngle?h.startAngle/180*Math.PI:0:f[d-1].endAngle;m.startAngle=(m.startAngle+2*Math.PI)%(2*Math.PI);m.endAngle=m.startAngle+2*Math.PI/z*Math.abs(g.y);g=(m.endAngle+m.startAngle)/2;g=(g+2*Math.PI)%(2*Math.PI);m.midAngle=g;if(m.midAngle>Math.PI/2-t&&m.midAngle<Math.PI/2+t){if(0===a||f[c].midAngle> +m.midAngle)c=d;a++}else if(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t){if(0===b||f[e].midAngle>m.midAngle)e=d;b++}m.hemisphere=g>Math.PI/2&&g<=3*Math.PI/2?"left":"right";m.indexLabelTextBlock=new ka(k.plotArea.ctx,{fontSize:m.indexLabelFontSize,fontFamily:m.indexLabelFontFamily,fontColor:m.indexLabelFontColor,fontStyle:m.indexLabelFontStyle,fontWeight:m.indexLabelFontWeight,horizontalAlign:"left",backgroundColor:m.indexLabelBackgroundColor,maxWidth:m.indexLabelMaxWidth,maxHeight:m.indexLabelWrap? +5*m.indexLabelFontSize:1.5*m.indexLabelFontSize,text:m.indexLabelText,padding:0,textBaseline:"top"});m.indexLabelTextBlock.measureText()}l=g=0;q=!1;for(d=0;d<s.length;d++)m=f[(c+d)%s.length],1<a&&(m.midAngle>Math.PI/2-t&&m.midAngle<Math.PI/2+t)&&(g<=a/2&&!q?(m.hemisphere="right",g++):(m.hemisphere="left",q=!0));q=!1;for(d=0;d<s.length;d++)m=f[(e+d)%s.length],1<b&&(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t)&&(l<=b/2&&!q?(m.hemisphere="left",l++):(m.hemisphere="right",q=!0))}}function b(a){var b= +k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);for(b=0;b<s.length;b++){var c=f[b].startAngle,e=f[b].endAngle;if(e>c){var d=0.07*A*Math.cos(f[b].midAngle),g=0.07*A*Math.sin(f[b].midAngle),m=!1;if(s[b].exploded){if(1E-9<Math.abs(f[b].center.x-(x.x+d))||1E-9<Math.abs(f[b].center.y-(x.y+g)))f[b].center.x=x.x+d*a,f[b].center.y=x.y+g*a,m=!0}else if(0<Math.abs(f[b].center.x-x.x)||0<Math.abs(f[b].center.y-x.y))f[b].center.x=x.x+ +d*(1-a),f[b].center.y=x.y+g*(1-a),m=!0;m&&(d={},d.dataSeries=h,d.dataPoint=h.dataPoints[b],d.index=b,k.toolTip.highlightObjects([d]));ja(k.plotArea.ctx,f[b].center,f[b].radius,s[b].color?s[b].color:h._colorSet[b%h._colorSet.length],h.type,c,e,h.fillOpacity,f[b].percentInnerRadius)}}a=k.plotArea.ctx;a.save();a.fillStyle="black";a.strokeStyle="grey";a.textBaseline="middle";a.lineJoin="round";for(b=b=0;b<s.length;b++)c=f[b],c.indexLabelText&&(c.indexLabelTextBlock.y-=c.indexLabelTextBlock.height/2,e= +0,e="left"===c.hemisphere?"inside"!==h.indexLabelPlacement?-(c.indexLabelTextBlock.width+q):-c.indexLabelTextBlock.width/2:"inside"!==h.indexLabelPlacement?q:-c.indexLabelTextBlock.width/2,c.indexLabelTextBlock.x+=e,c.indexLabelTextBlock.render(!0),c.indexLabelTextBlock.x-=e,c.indexLabelTextBlock.y+=c.indexLabelTextBlock.height/2,"inside"!==c.indexLabelPlacement&&0<c.indexLabelLineThickness&&(e=c.center.x+A*Math.cos(c.midAngle),d=c.center.y+A*Math.sin(c.midAngle),a.strokeStyle=c.indexLabelLineColor, +a.lineWidth=c.indexLabelLineThickness,a.setLineDash&&a.setLineDash(R(c.indexLabelLineDashType,c.indexLabelLineThickness)),a.beginPath(),a.moveTo(e,d),a.lineTo(c.indexLabelTextBlock.x,c.indexLabelTextBlock.y),a.lineTo(c.indexLabelTextBlock.x+("left"===c.hemisphere?-q:q),c.indexLabelTextBlock.y),a.stroke()),a.lineJoin="miter");a.save()}function c(a,b){var c=0,c=a.indexLabelTextBlock.y-a.indexLabelTextBlock.height/2,e=a.indexLabelTextBlock.y+a.indexLabelTextBlock.height/2,d=b.indexLabelTextBlock.y-b.indexLabelTextBlock.height/ +2,f=b.indexLabelTextBlock.y+b.indexLabelTextBlock.height/2;return c=b.indexLabelTextBlock.y>a.indexLabelTextBlock.y?d-e:c-f}function e(a){for(var b=null,e=1;e<s.length;e++)if(b=(a+e+f.length)%f.length,f[b].hemisphere!==f[a].hemisphere){b=null;break}else if(f[b].indexLabelText&&b!==a&&(0>c(f[b],f[a])||("right"===f[a].hemisphere?f[b].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y:f[b].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y)))break;else b=null;return b}function g(a,b,d){d=(d||0)+1;if(1E3< +d)return 0;b=b||0;var m=0,h=x.y-1*r,l=x.y+1*r;if(0<=a&&a<s.length){var n=f[a];if(0>b&&n.indexLabelTextBlock.y<h||0<b&&n.indexLabelTextBlock.y>l)return 0;var k=0,q=0,q=k=k=0;0>b?n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2>h&&n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+b<h&&(b=-(h-(n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+b))):n.indexLabelTextBlock.y+n.indexLabelTextBlock.height/2<h&&n.indexLabelTextBlock.y+n.indexLabelTextBlock.height/2+b>l&&(b=n.indexLabelTextBlock.y+ +n.indexLabelTextBlock.height/2+b-l);b=n.indexLabelTextBlock.y+b;h=0;h="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2));q=x.x+A*Math.cos(n.midAngle);k=x.y+A*Math.sin(n.midAngle);k=Math.sqrt(Math.pow(h-q,2)+Math.pow(b-k,2));q=Math.acos(A/r);k=Math.acos((r*r+A*A-k*k)/(2*A*r));b=k<q?b-n.indexLabelTextBlock.y:0;h=null;for(l=1;l<s.length;l++)if(h=(a-l+f.length)%f.length,f[h].hemisphere!==f[a].hemisphere){h=null;break}else if(f[h].indexLabelText&& +f[h].hemisphere===f[a].hemisphere&&h!==a&&(0>c(f[h],f[a])||("right"===f[a].hemisphere?f[h].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y:f[h].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y)))break;else h=null;q=h;k=e(a);l=h=0;0>b?(l="right"===n.hemisphere?q:k,m=b,null!==l&&(q=-b,b=n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2-(f[l].indexLabelTextBlock.y+f[l].indexLabelTextBlock.height/2),b-q<p&&(h=-q,l=g(l,h,d+1),+l.toFixed(C)>+h.toFixed(C)&&(m=b>p?-(b-p):-(q-(l-h)))))):0<b&&(l="right"=== +n.hemisphere?k:q,m=b,null!==l&&(q=b,b=f[l].indexLabelTextBlock.y-f[l].indexLabelTextBlock.height/2-(n.indexLabelTextBlock.y+n.indexLabelTextBlock.height/2),b-q<p&&(h=q,l=g(l,h,d+1),+l.toFixed(C)<+h.toFixed(C)&&(m=b>p?b-p:q-(h-l)))));m&&(d=n.indexLabelTextBlock.y+m,b=0,b="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)),n.midAngle>Math.PI/2-t&&n.midAngle<Math.PI/2+t?(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"left"=== +n.hemisphere&&"right"===h.hemisphere&&b>h.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x-15:"right"===n.hemisphere&&("left"===a.hemisphere&&b<a.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x+15)):n.midAngle>3*Math.PI/2-t&&n.midAngle<3*Math.PI/2+t&&(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"right"===n.hemisphere&&"left"===h.hemisphere&&b<h.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x+15:"left"===n.hemisphere&&("right"===a.hemisphere&&b>a.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x- +15)),n.indexLabelTextBlock.y=d,n.indexLabelTextBlock.x=b,n.indexLabelAngle=Math.atan2(n.indexLabelTextBlock.y-x.y,n.indexLabelTextBlock.x-x.x))}return m}function m(){var a=k.plotArea.ctx;a.fillStyle="grey";a.strokeStyle="grey";a.font="16px Arial";a.textBaseline="middle";for(var b=a=0,d=0,m=!0,b=0;10>b&&(1>b||0<d);b++){if(h.radius||!h.radius&&"undefined"!==typeof h.innerRadius&&null!==h.innerRadius&&A-d<=D)m=!1;m&&(A-=d);d=0;if("inside"!==h.indexLabelPlacement){r=A*v;for(a=0;a<s.length;a++){var l= +f[a];l.indexLabelTextBlock.x=x.x+r*Math.cos(l.midAngle);l.indexLabelTextBlock.y=x.y+r*Math.sin(l.midAngle);l.indexLabelAngle=l.midAngle;l.radius=A;l.percentInnerRadius=F}for(var t,u,a=0;a<s.length;a++){var l=f[a],y=e(a);if(null!==y){t=f[a];u=f[y];var z=0,z=c(t,u)-p;if(0>z){for(var E=u=0,H=0;H<s.length;H++)H!==a&&f[H].hemisphere===l.hemisphere&&(f[H].indexLabelTextBlock.y<l.indexLabelTextBlock.y?u++:E++);u=z/(u+E||1)*E;var E=-1*(z-u),I=H=0;"right"===l.hemisphere?(H=g(a,u),E=-1*(z-H),I=g(y,E),+I.toFixed(C)< ++E.toFixed(C)&&+H.toFixed(C)<=+u.toFixed(C)&&g(a,-(E-I))):(H=g(y,u),E=-1*(z-H),I=g(a,E),+I.toFixed(C)<+E.toFixed(C)&&+H.toFixed(C)<=+u.toFixed(C)&&g(y,-(E-I)))}}}}else for(a=0;a<s.length;a++)l=f[a],r="pie"===h.type?0.7*A:0.8*A,y=x.x+r*Math.cos(l.midAngle),u=x.y+r*Math.sin(l.midAngle),l.indexLabelTextBlock.x=y,l.indexLabelTextBlock.y=u;for(a=0;a<s.length;a++)if(l=f[a],y=l.indexLabelTextBlock.measureText(),0!==y.height&&0!==y.width)y=y=0,"right"===l.hemisphere?(y=n.x2-(l.indexLabelTextBlock.x+l.indexLabelTextBlock.width+ +q),y*=-1):y=n.x1-(l.indexLabelTextBlock.x-l.indexLabelTextBlock.width-q),0<y&&(!m&&l.indexLabelText&&(u="right"===l.hemisphere?n.x2-l.indexLabelTextBlock.x:l.indexLabelTextBlock.x-n.x1,0.3*l.indexLabelTextBlock.maxWidth>u?l.indexLabelText="":l.indexLabelTextBlock.maxWidth=0.85*u,0.3*l.indexLabelTextBlock.maxWidth<u&&(l.indexLabelTextBlock.x-="right"===l.hemisphere?2:-2)),Math.abs(l.indexLabelTextBlock.y-l.indexLabelTextBlock.height/2-x.y)<A||Math.abs(l.indexLabelTextBlock.y+l.indexLabelTextBlock.height/ +2-x.y)<A)&&(y/=Math.abs(Math.cos(l.indexLabelAngle)),9<y&&(y*=0.3),y>d&&(d=y)),y=y=0,0<l.indexLabelAngle&&l.indexLabelAngle<Math.PI?(y=n.y2-(l.indexLabelTextBlock.y+l.indexLabelTextBlock.height/2+5),y*=-1):y=n.y1-(l.indexLabelTextBlock.y-l.indexLabelTextBlock.height/2-5),0<y&&(!m&&l.indexLabelText&&(u=0<l.indexLabelAngle&&l.indexLabelAngle<Math.PI?-1:1,0===g(a,y*u)&&g(a,2*u)),Math.abs(l.indexLabelTextBlock.x-x.x)<A&&(y/=Math.abs(Math.sin(l.indexLabelAngle)),9<y&&(y*=0.3),y>d&&(d=y)));var K=function(a, +b,c){for(var e=[],d=0;e.push(f[b]),b!==c;b=(b+1+s.length)%s.length);e.sort(function(a,b){return a.y-b.y});for(b=0;b<e.length;b++)if(c=e[b],d<0.7*a)d+=c.indexLabelTextBlock.height,c.indexLabelTextBlock.text="",c.indexLabelText="",c.indexLabelTextBlock.measureText();else break};(function(){for(var a=-1,b=-1,d=0,g=!1,l=0;l<s.length;l++)if(g=!1,t=f[l],t.indexLabelText){var m=e(l);if(null!==m){var h=f[m];z=0;z=c(t,h);var n;if(n=0>z){n=t.indexLabelTextBlock.x;var k=t.indexLabelTextBlock.y-t.indexLabelTextBlock.height/ +2,w=t.indexLabelTextBlock.y+t.indexLabelTextBlock.height/2,p=h.indexLabelTextBlock.y-h.indexLabelTextBlock.height/2,u=h.indexLabelTextBlock.x+h.indexLabelTextBlock.width,r=h.indexLabelTextBlock.y+h.indexLabelTextBlock.height/2;n=t.indexLabelTextBlock.x+t.indexLabelTextBlock.width<h.indexLabelTextBlock.x-q||n>u+q||k>r+q||w<p-q?!1:!0}n?(0>a&&(a=l),m!==a&&(b=m,d+=-z),0===l%Math.max(s.length/10,3)&&(g=!0)):g=!0;g&&(0<d&&0<=a&&0<=b)&&(K(d,a,b),b=a=-1,d=0)}}0<d&&K(d,a,b)})()}}function l(){k.plotArea.layoutManager.reset(); +k.title&&(k.title.dockInsidePlotArea||"center"===k.title.horizontalAlign&&"center"===k.title.verticalAlign)&&k.title.render();if(k.subtitles)for(var a=0;a<k.subtitles.length;a++){var b=k.subtitles[a];(b.dockInsidePlotArea||"center"===b.horizontalAlign&&"center"===b.verticalAlign)&&b.render()}k.legend&&(k.legend.dockInsidePlotArea||"center"===k.legend.horizontalAlign&&"center"===k.legend.verticalAlign)&&(k.legend.setLayout(),k.legend.render())}var k=this;if(!(0>=a.dataSeriesIndexes.length)){var h= +this.data[a.dataSeriesIndexes[0]],s=h.dataPoints,q=10,n=this.plotArea,f=h.dataPointEOs,p=2,r,v=1.3,t=20/180*Math.PI,C=6,x={x:(n.x2+n.x1)/2,y:(n.y2+n.y1)/2},z=0;a=!1;for(var y=0;y<s.length;y++)z+=Math.abs(s[y].y),!a&&("undefined"!==typeof s[y].indexLabel&&null!==s[y].indexLabel&&0<s[y].indexLabel.toString().length)&&(a=!0),!a&&("undefined"!==typeof s[y].label&&null!==s[y].label&&0<s[y].label.toString().length)&&(a=!0);if(0!==z){a=a||"undefined"!==typeof h.indexLabel&&null!==h.indexLabel&&0<h.indexLabel.toString().length; +var A="inside"!==h.indexLabelPlacement&&a?0.75*Math.min(n.width,n.height)/2:0.92*Math.min(n.width,n.height)/2;h.radius&&(A=I(h.radius,A));var D="undefined"!==typeof h.innerRadius&&null!==h.innerRadius?I(h.innerRadius,A):0.7*A;h.radius=A;"doughnut"===h.type&&(h.innerRadius=D);var F=Math.min(D/A,(A-1)/A);this.pieDoughnutClickHandler=function(a){k.isAnimating||!u(a.dataSeries.explodeOnClick)&&!a.dataSeries.explodeOnClick||(a=a.dataPoint,a.exploded=a.exploded?!1:!0,1<this.dataPoints.length&&k._animator.animate(0, +500,function(a){b(a);l()}))};d();m();m();m();m();this.disableToolTip=!0;this._animator.animate(0,this.animatedRender?this.animationDuration:0,function(a){var b=k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);a=f[0].startAngle+2*Math.PI*a;for(b=0;b<s.length;b++){var c=0===b?f[b].startAngle:e,e=c+(f[b].endAngle-f[b].startAngle),d=!1;e>a&&(e=a,d=!0);var g=s[b].color?s[b].color:h._colorSet[b%h._colorSet.length];e>c&&ja(k.plotArea.ctx, +f[b].center,f[b].radius,g,h.type,c,e,h.fillOpacity,f[b].percentInnerRadius);if(d)break}l()},function(){k.disableToolTip=!1;k._animator.animate(0,k.animatedRender?500:0,function(a){b(a);l()})})}}};var ra=function(a,d,b,c){"undefined"===typeof b&&(b=1);0>=Math.round(d.y4-d.y1)||(a.save(),a.globalAlpha=b,a.beginPath(),a.moveTo(Math.round(d.x1),Math.round(d.y1)),a.lineTo(Math.round(d.x2),Math.round(d.y2)),a.lineTo(Math.round(d.x3),Math.round(d.y3)),a.lineTo(Math.round(d.x4),Math.round(d.y4)),"undefined"!== +d.x5&&(a.lineTo(Math.round(d.x5),Math.round(d.y5)),a.lineTo(Math.round(d.x6),Math.round(d.y6))),a.closePath(),a.fillStyle=c?c:d.color,a.fill(),a.globalAplha=1,a.restore())};p.prototype.renderFunnel=function(a){function d(){for(var a=0,b=[],c=0;c<C.length;c++){if("undefined"===typeof C[c].y)return-1;C[c].y="number"===typeof C[c].y?C[c].y:0;a+=Math.abs(C[c].y)}if(0===a)return-1;for(c=b[0]=0;c<C.length;c++)b.push(Math.abs(C[c].y)*F/a);return b}function b(){var a=$,b=V,c=K,e=ea,d,f;d=O;f=Z-N;e=Math.abs((f- +d)*(b-a+(e-c))/2);c=ea-K;d=f-d;f=c*(f-Z);f=Math.abs(f);f=e+f;for(var e=[],g=0,l=0;l<C.length;l++){if("undefined"===typeof C[l].y)return-1;C[l].y="number"===typeof C[l].y?C[l].y:0;g+=Math.abs(C[l].y)}if(0===g)return-1;for(var m=e[0]=0,h=0,n,k,b=b-a,m=!1,l=0;l<C.length;l++)a=Math.abs(C[l].y)*f/g,m?n=0==Number(c.toFixed(3))?0:a/c:(k=ba*ba*b*b-4*Math.abs(ba)*a,0>k?(k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=0==k?0:a/k,h+=a/k,m=!0):(n=(Math.abs(ba)*b-Math.sqrt(k))/2,k=b-2*n/Math.abs(ba),h+=n,h>d&&(h-=n, +k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=a/k,h+=a/k,m=!0),b=k)),e.push(n);return e}function c(){if(t&&C){for(var a,b,c,e,d,g,l,h,m,n,k,q,s,w,p=[],B=[],x={percent:null,total:null},v=null,y=0;y<C.length;y++)w=P[y],w="undefined"!==typeof w.x5?(w.y2+w.y4)/2:(w.y2+w.y3)/2,w=f(w).x2+1,p[y]=L-w-S;w=0.5*S;for(var y=0,A=C.length-1;y<C.length||0<=A;y++,A--){b=t.reversed?C[A]:C[y];a=b.color?b.color:t.reversed?t._colorSet[(C.length-1-y)%t._colorSet.length]:t._colorSet[y%t._colorSet.length];c=b.indexLabelPlacement|| +t.indexLabelPlacement||"outside";e=b.indexLabelBackgroundColor||t.indexLabelBackgroundColor||(r?"transparent":null);d=b.indexLabelFontColor||t.indexLabelFontColor||"#979797";g=u(b.indexLabelFontSize)?t.indexLabelFontSize:b.indexLabelFontSize;l=b.indexLabelFontStyle||t.indexLabelFontStyle||"normal";h=b.indexLabelFontFamily||t.indexLabelFontFamily||"arial";m=b.indexLabelFontWeight||t.indexLabelFontWeight||"normal";a=b.indexLabelLineColor||t.options.indexLabelLineColor||a;n="number"===typeof b.indexLabelLineThickness? +b.indexLabelLineThickness:"number"===typeof t.indexLabelLineThickness?t.indexLabelLineThickness:2;k=b.indexLabelLineDashType||t.indexLabelLineDashType||"solid";q="undefined"!==typeof b.indexLabelWrap?b.indexLabelWrap:"undefined"!==typeof t.indexLabelWrap?t.indexLabelWrap:!0;s=t.dataPointIds[y];z._eventManager.objectMap[s]={id:s,objectType:"dataPoint",dataPointIndex:y,dataSeriesIndex:0,funnelSection:P[t.reversed?C.length-1-y:y]};"inside"===t.indexLabelPlacement&&(p[y]=y!==fa?t.reversed?P[y].x2-P[y].x1: +P[y].x3-P[y].x4:P[y].x3-P[y].x6,20>p[y]&&(p[y]=y!==fa?t.reversed?P[y].x3-P[y].x4:P[y].x2-P[y].x1:P[y].x2-P[y].x1,p[y]/=2));s=b.indexLabelMaxWidth?b.indexLabelMaxWidth:t.options.indexLabelMaxWidth?t.indexLabelMaxWidth:p[y];if(s>p[y]||0>s)s=p[y];B[y]="inside"===t.indexLabelPlacement?P[y].height:!1;x=z.getPercentAndTotal(t,b);if(t.indexLabelFormatter||b.indexLabelFormatter)v={chart:z.options,dataSeries:t,dataPoint:b,total:x.total,percent:x.percent};b=b.indexLabelFormatter?b.indexLabelFormatter(v):b.indexLabel? +z.replaceKeywordsWithValue(b.indexLabel,b,t,y):t.indexLabelFormatter?t.indexLabelFormatter(v):t.indexLabel?z.replaceKeywordsWithValue(t.indexLabel,b,t,y):b.label?b.label:"";0>=n&&(n=0);1E3>s&&1E3-s<w&&(s+=1E3-s);Q.roundRect||Ea(Q);c=new ka(Q,{fontSize:g,fontFamily:h,fontColor:d,fontStyle:l,fontWeight:m,horizontalAlign:c,backgroundColor:e,maxWidth:s,maxHeight:!1===B[y]?q?4.28571429*g:1.5*g:B[y],text:b,padding:ga});c.measureText();J.push({textBlock:c,id:t.reversed?A:y,isDirty:!1,lineColor:a,lineThickness:n, +lineDashType:k,height:c.height<c.maxHeight?c.height:c.maxHeight,width:c.width<c.maxWidth?c.width:c.maxWidth})}}}function e(){var a,b,c,e,d,f=[];d=!1;c=0;for(var g,l=L-V-S/2,l=t.options.indexLabelMaxWidth?t.indexLabelMaxWidth>l?l:t.indexLabelMaxWidth:l,h=J.length-1;0<=h;h--){g=C[J[h].id];c=J[h];e=c.textBlock;b=(a=n(h)<P.length?J[n(h)]:null)?a.textBlock:null;c=c.height;a&&e.y+c+ga>b.y&&(d=!0);c=g.indexLabelMaxWidth||l;if(c>l||0>c)c=l;f.push(c)}if(d)for(h=J.length-1;0<=h;h--)a=P[h],J[h].textBlock.maxWidth= +f[f.length-(h+1)],J[h].textBlock.measureText(),J[h].textBlock.x=L-l,c=J[h].textBlock.height<J[h].textBlock.maxHeight?J[h].textBlock.height:J[h].textBlock.maxHeight,d=J[h].textBlock.width<J[h].textBlock.maxWidth?J[h].textBlock.width:J[h].textBlock.maxWidth,J[h].height=c,J[h].width=d,c="undefined"!==typeof a.x5?(a.y2+a.y4)/2:(a.y2+a.y3)/2,J[h].textBlock.y=c-J[h].height/2,t.reversed?(J[h].textBlock.y+J[h].height>pa+D&&(J[h].textBlock.y=pa+D-J[h].height),J[h].textBlock.y<wa-D&&(J[h].textBlock.y=wa-D)): +(J[h].textBlock.y<pa-D&&(J[h].textBlock.y=pa-D),J[h].textBlock.y+J[h].height>wa+D&&(J[h].textBlock.y=wa+D-J[h].height))}function g(){var a,b,c,e;if("inside"!==t.indexLabelPlacement)for(var d=0;d<P.length;d++)0==J[d].textBlock.text.length?J[d].isDirty=!0:(a=P[d],c="undefined"!==typeof a.x5?(a.y2+a.y4)/2:(a.y2+a.y3)/2,b=t.reversed?"undefined"!==typeof a.x5?c>Da?f(c).x2+1:(a.x2+a.x3)/2+1:(a.x2+a.x3)/2+1:"undefined"!==typeof a.x5?c<Da?f(c).x2+1:(a.x4+a.x3)/2+1:(a.x2+a.x3)/2+1,J[d].textBlock.x=b+S,J[d].textBlock.y= +c-J[d].height/2,t.reversed?(J[d].textBlock.y+J[d].height>pa+D&&(J[d].textBlock.y=pa+D-J[d].height),J[d].textBlock.y<wa-D&&(J[d].textBlock.y=wa-D)):(J[d].textBlock.y<pa-D&&(J[d].textBlock.y=pa-D),J[d].textBlock.y+J[d].height>wa+D&&(J[d].textBlock.y=wa+D-J[d].height)));else for(d=0;d<P.length;d++)0==J[d].textBlock.text.length?J[d].isDirty=!0:(a=P[d],b=a.height,c=J[d].height,e=J[d].width,b>=c?(b=d!=fa?(a.x4+a.x3)/2-e/2:(a.x5+a.x4)/2-e/2,c=d!=fa?(a.y1+a.y3)/2-c/2:(a.y1+a.y4)/2-c/2,J[d].textBlock.x=b, +J[d].textBlock.y=c):J[d].isDirty=!0)}function m(){function a(b,c){var d;if(0>b||b>=J.length)return 0;var e,f=J[b].textBlock;if(0>c){c*=-1;e=q(b);d=l(e,b);if(d>=c)return f.y-=c,c;if(0==b)return 0<d&&(f.y-=d),d;d+=a(e,-(c-d));0<d&&(f.y-=d);return d}e=n(b);d=l(b,e);if(d>=c)return f.y+=c,c;if(b==P.length-1)return 0<d&&(f.y+=d),d;d+=a(e,c-d);0<d&&(f.y+=d);return d}function b(){var a,d,e,f,g=0,h;f=(Z-O+2*D)/k;h=k;for(var l,m=1;m<h;m++){e=m*f;for(var s=J.length-1;0<=s;s--)!J[s].isDirty&&(J[s].textBlock.y< +e&&J[s].textBlock.y+J[s].height>e)&&(l=n(s),!(l>=J.length-1)&&J[s].textBlock.y+J[s].height+ga>J[l].textBlock.y&&(J[s].textBlock.y=J[s].textBlock.y+J[s].height-e>e-J[s].textBlock.y?e+1:e-J[s].height-1))}for(l=P.length-1;0<l;l--)if(!J[l].isDirty){e=q(l);if(0>e&&(e=0,J[e].isDirty))break;if(J[l].textBlock.y<J[e].textBlock.y+J[e].height){d=d||l;f=l;for(h=0;J[f].textBlock.y<J[e].textBlock.y+J[e].height+ga;){a=a||J[f].textBlock.y+J[f].height;h+=J[f].height;h+=ga;f=e;if(0>=f){f=0;h+=J[f].height;break}e=q(f); +if(0>e){f=0;h+=J[f].height;break}}if(f!=l){g=J[f].textBlock.y;a-=g;a=h-a;g=c(a,d,f);break}}}return g}function c(a,b,d){var e=[],f=0,g=0;for(a=Math.abs(a);d<=b;d++)e.push(P[d]);e.sort(function(a,b){return a.height-b.height});for(d=0;d<e.length;d++)if(b=e[d],f<a)g++,f+=J[b.id].height+ga,J[b.id].textBlock.text="",J[b.id].indexLabelText="",J[b.id].isDirty=!0,J[b.id].textBlock.measureText();else break;return g}for(var d,e,f,g,h,m,k=1,s=0;s<2*k;s++){for(var w=J.length-1;0<=w&&!(0<=q(w)&&q(w),f=J[w],g=f.textBlock, +m=(h=n(w)<P.length?J[n(w)]:null)?h.textBlock:null,d=+f.height.toFixed(6),e=+g.y.toFixed(6),!f.isDirty&&(h&&e+d+ga>+m.y.toFixed(6))&&(d=g.y+d+ga-m.y,e=a(w,-d),e<d&&(0<e&&(d-=e),e=a(n(w),d),e!=d)));w--);b()}}function l(a,b){return(b<P.length?J[b].textBlock.y:t.reversed?pa+D:wa+D)-(0>a?t.reversed?wa-D:pa-D:J[a].textBlock.y+J[a].height+ga)}function k(a,b,c){var d,e,f,l=[],m=D,n=[];-1!==b&&(0<=W.indexOf(b)?(e=W.indexOf(b),W.splice(e,1)):(W.push(b),W=W.sort(function(a,b){return a-b})));if(0===W.length)l= +ia;else{e=D*(1!=W.length||0!=W[0]&&W[0]!=P.length-1?2:1)/h();for(var q=0;q<P.length;q++){if(1==W.length&&0==W[0]){if(0===q){l.push(ia[q]);d=m;continue}}else 0===q&&(d=-1*m);l.push(ia[q]+d);if(0<=W.indexOf(q)||q<P.length&&0<=W.indexOf(q+1))d+=e}}f=function(){for(var a=[],b=0;b<P.length;b++)a.push(l[b]-P[b].y1);return a}();var w={startTime:(new Date).getTime(),duration:c||500,easingFunction:function(a,b,c,d){return M.easing.easeOutQuart(a,b,c,d)},changeSection:function(a){for(var b,c,d=0;d<P.length;d++)b= +f[d],c=P[d],b*=a,"undefined"===typeof n[d]&&(n[d]=0),0>n&&(n*=-1),c.y1+=b-n[d],c.y2+=b-n[d],c.y3+=b-n[d],c.y4+=b-n[d],c.y5&&(c.y5+=b-n[d],c.y6+=b-n[d]),n[d]=b}};a._animator.animate(0,c,function(c){var d=a.plotArea.ctx||a.ctx;ja=!0;d.clearRect(x.x1,x.y1,x.x2-x.x1,x.y2-x.y1);d.fillStyle=a.backgroundColor;d.fillRect(x.x1,x.y1,x.width,x.height);w.changeSection(c,b);var e={};e.dataSeries=t;e.dataPoint=t.reversed?t.dataPoints[C.length-1-b]:t.dataPoints[b];e.index=t.reversed?C.length-1-b:b;a.toolTip.highlightObjects([e]); +for(e=0;e<P.length;e++)ra(d,P[e],t.fillOpacity);v(d);H&&("inside"!==t.indexLabelPlacement?s(d):g(),p(d));1<=c&&(ja=!1)},null,M.easing.easeOutQuart)}function h(){for(var a=0,b=0;b<P.length-1;b++)(0<=W.indexOf(b)||0<=W.indexOf(b+1))&&a++;return a}function s(a){for(var b,c,d,e,g=0;g<P.length;g++)e=1===J[g].lineThickness%2?0.5:0,c=((P[g].y2+P[g].y4)/2<<0)+e,b=f(c).x2-1,d=J[g].textBlock.x,e=(J[g].textBlock.y+J[g].height/2<<0)+e,J[g].isDirty||0==J[g].lineThickness||(a.strokeStyle=J[g].lineColor,a.lineWidth= +J[g].lineThickness,a.setLineDash&&a.setLineDash(R(J[g].lineDashType,J[g].lineThickness)),a.beginPath(),a.moveTo(b,c),a.lineTo(d,e),a.stroke())}function q(a){for(a-=1;-1<=a&&-1!=a&&J[a].isDirty;a--);return a}function n(a){for(a+=1;a<=P.length&&a!=P.length&&J[a].isDirty;a++);return a}function f(a){for(var b,c=0;c<C.length;c++)if(P[c].y1<a&&P[c].y4>a){b=P[c];break}return b?(a=b.y6?a>b.y6?b.x3+(b.x4-b.x3)/(b.y4-b.y3)*(a-b.y3):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2), +{x1:a,x2:a}):-1}function p(a){for(var b=0;b<P.length;b++)J[b].isDirty||(a&&(J[b].textBlock.ctx=a),J[b].textBlock.render(!0))}function v(a){z.plotArea.layoutManager.reset();a.roundRect||Ea(a);z.title&&(z.title.dockInsidePlotArea||"center"===z.title.horizontalAlign&&"center"===z.title.verticalAlign)&&(z.title.ctx=a,z.title.render());if(z.subtitles)for(var b=0;b<z.subtitles.length;b++){var c=z.subtitles[b];if(c.dockInsidePlotArea||"center"===c.horizontalAlign&&"center"===c.verticalAlign)z.subtitles.ctx= +a,c.render()}z.legend&&(z.legend.dockInsidePlotArea||"center"===z.legend.horizontalAlign&&"center"===z.legend.verticalAlign)&&(z.legend.ctx=a,z.legend.setLayout(),z.legend.render());U.fNg&&U.fNg(z)}var z=this;if(!(0>=a.dataSeriesIndexes.length)){for(var t=this.data[a.dataSeriesIndexes[0]],C=t.dataPoints,x=this.plotArea,D=0.025*x.width,y=0.01*x.width,A=0,F=x.height-2*D,E=Math.min(x.width-2*y,2.8*x.height),H=!1,I=0;I<C.length;I++)if(!H&&("undefined"!==typeof C[I].indexLabel&&null!==C[I].indexLabel&& +0<C[I].indexLabel.toString().length)&&(H=!0),!H&&("undefined"!==typeof C[I].label&&null!==C[I].label&&0<C[I].label.toString().length)&&(H=!0),!H&&"function"===typeof t.indexLabelFormatter||"function"===typeof C[I].indexLabelFormatter)H=!0;H=H||"undefined"!==typeof t.indexLabel&&null!==t.indexLabel&&0<t.indexLabel.toString().length;"inside"!==t.indexLabelPlacement&&H||(y=(x.width-0.75*E)/2);var I=x.x1+y,L=x.x2-y,O=x.y1+D,Z=x.y2-D,Q=a.targetCanvasCtx||this.plotArea.ctx||this.ctx;if(0!=t.length&&(t.dataPoints&& +t.visible)&&0!==C.length){var N,G;a=75*E/100;var S=30*(L-a)/100;"funnel"===t.type?(N=u(t.options.neckHeight)?0.35*F:t.neckHeight,G=u(t.options.neckWidth)?0.25*a:t.neckWidth,"string"===typeof N&&N.match(/%$/)?(N=parseInt(N),N=N*F/100):N=parseInt(N),"string"===typeof G&&G.match(/%$/)?(G=parseInt(G),G=G*a/100):G=parseInt(G),N>F?N=F:0>=N&&(N=0),G>a?G=a-0.5:0>=G&&(G=0)):"pyramid"===t.type&&(G=N=0,t.reversed=t.reversed?!1:!0);var y=I+a/2,$=I,V=I+a,pa=t.reversed?Z:O,K=y-G/2,ea=y+G/2,Da=t.reversed?O+N:Z- +N,wa=t.reversed?O:Z;a=[];var y=[],P=[],E=[],X=O,fa,ba=(Da-pa)/(K-$),ha=-ba,I="area"===(t.valueRepresents?t.valueRepresents:"height")?b():d();if(-1!==I){if(t.reversed)for(E.push(X),G=I.length-1;0<G;G--)X+=I[G],E.push(X);else for(G=0;G<I.length;G++)X+=I[G],E.push(X);if(t.reversed)for(G=0;G<I.length;G++)E[G]<Da?(a.push(K),y.push(ea),fa=G):(a.push((E[G]-pa+ba*$)/ba),y.push((E[G]-pa+ha*V)/ha));else for(G=0;G<I.length;G++)E[G]<Da?(a.push((E[G]-pa+ba*$)/ba),y.push((E[G]-pa+ha*V)/ha),fa=G):(a.push(K),y.push(ea)); +for(G=0;G<I.length-1;G++)X=t.reversed?C[C.length-1-G].color?C[C.length-1-G].color:t._colorSet[(C.length-1-G)%t._colorSet.length]:C[G].color?C[G].color:t._colorSet[G%t._colorSet.length],G===fa?P.push({x1:a[G],y1:E[G],x2:y[G],y2:E[G],x3:ea,y3:Da,x4:y[G+1],y4:E[G+1],x5:a[G+1],y5:E[G+1],x6:K,y6:Da,id:G,height:E[G+1]-E[G],color:X}):P.push({x1:a[G],y1:E[G],x2:y[G],y2:E[G],x3:y[G+1],y3:E[G+1],x4:a[G+1],y4:E[G+1],id:G,height:E[G+1]-E[G],color:X});var ga=2,J=[],ja=!1,W=[],ia=[],I=!1;a=a=0;Fa(W);for(G=0;G< +C.length;G++)C[G].exploded&&(I=!0,t.reversed?W.push(C.length-1-G):W.push(G));Q.clearRect(x.x1,x.y1,x.width,x.height);Q.fillStyle=z.backgroundColor;Q.fillRect(x.x1,x.y1,x.width,x.height);if(H&&t.visible&&(c(),g(),e(),"inside"!==t.indexLabelPlacement)){m();for(G=0;G<C.length;G++)J[G].isDirty||(a=J[G].textBlock.x+J[G].width,a=(L-a)/2,0==G&&(A=a),A>a&&(A=a));for(G=0;G<P.length;G++)P[G].x1+=A,P[G].x2+=A,P[G].x3+=A,P[G].x4+=A,P[G].x5&&(P[G].x5+=A,P[G].x6+=A),J[G].textBlock.x+=A}for(G=0;G<P.length;G++)A= +P[G],ra(Q,A,t.fillOpacity),ia.push(A.y1);v(Q);H&&t.visible&&("inside"===t.indexLabelPlacement||z.animationEnabled||s(Q),z.animationEnabled||p());if(!H)for(G=0;G<C.length;G++)A=t.dataPointIds[G],a={id:A,objectType:"dataPoint",dataPointIndex:G,dataSeriesIndex:0,funnelSection:P[t.reversed?C.length-1-G:G]},z._eventManager.objectMap[A]=a;!z.animationEnabled&&I?k(z,-1,0):z.animationEnabled&&!z.animatedRender&&k(z,-1,0);this.funnelPyramidClickHandler=function(a){var b=-1;if(!ja&&!z.isAnimating&&(u(a.dataSeries.explodeOnClick)|| +a.dataSeries.explodeOnClick)&&(b=t.reversed?C.length-1-a.dataPointIndex:a.dataPointIndex,0<=b)){a=b;if("funnel"===t.type||"pyramid"===t.type)t.reversed?C[C.length-1-a].exploded=C[C.length-1-a].exploded?!1:!0:C[a].exploded=C[a].exploded?!1:!0;k(z,b,500)}};return{source:Q,dest:this.plotArea.ctx,animationCallback:function(a,b){M.fadeInAnimation(a,b);1<=a&&(k(z,-1,500),v(z.plotArea.ctx||z.ctx))},easingFunction:M.easing.easeInQuad,animationBase:0}}}}};p.prototype.requestAnimFrame=function(){return window.requestAnimationFrame|| +window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){window.setTimeout(a,1E3/60)}}();p.prototype.cancelRequestAnimFrame=window.cancelAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame||window.oCancelRequestAnimationFrame||window.msCancelRequestAnimationFrame||clearTimeout;p.prototype.set=function(a,d,b){b="undefined"===typeof b?!0:b;"options"===a?(this.options=d, +b&&this.render()):p.base.set.call(this,a,d,b)};p.prototype.exportChart=function(a){a="undefined"===typeof a?{}:a;var d=a.format?a.format:"png",b=a.fileName?a.fileName:this.exportFileName;if(a.toDataURL)return this.canvas.toDataURL("image/"+d);Ta(this.canvas,d,b)};p.prototype.print=function(){var a=this.exportChart({toDataURL:!0}),d=document.createElement("iframe");d.setAttribute("class","canvasjs-chart-print-frame");d.setAttribute("style","position:absolute; width:100%; border: 0px; margin: 0px 0px 0px 0px; padding 0px 0px 0px 0px;"); +d.style.height=this.height+"px";this._canvasJSContainer.appendChild(d);var b=this,c=d.contentWindow||d.contentDocument.document||d.contentDocument;c.document.open();c.document.write('<!DOCTYPE HTML>\n<html><body style="margin: 0px 0px 0px 0px; padding: 0px 0px 0px 0px;"><img src="'+a+'"/><body/></html>');c.document.close();setTimeout(function(){c.focus();c.print();setTimeout(function(){b._canvasJSContainer.removeChild(d)},1E3)},500)};p.prototype.getPercentAndTotal=function(a,d){var b=null,c=null, +e=null;if(0<=a.type.indexOf("stacked"))c=0,b=d.x.getTime?d.x.getTime():d.x,b in a.plotUnit.yTotals&&(c=a.plotUnit.yTotals[b],e=isNaN(d.y)?0:100*(d.y/c));else if("pie"===a.type||"doughnut"===a.type||"funnel"===a.type||"pyramid"===a.type){for(b=c=0;b<a.dataPoints.length;b++)isNaN(a.dataPoints[b].y)||(c+=a.dataPoints[b].y);e=isNaN(d.y)?0:100*(d.y/c)}return{percent:e,total:c}};p.prototype.replaceKeywordsWithValue=function(a,d,b,c,e){var g=this;e="undefined"===typeof e?0:e;if((0<=b.type.indexOf("stacked")|| +"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type)&&(0<=a.indexOf("#percent")||0<=a.indexOf("#total"))){var m="#percent",l="#total",k=this.getPercentAndTotal(b,d),l=isNaN(k.total)?l:k.total,m=isNaN(k.percent)?m:k.percent;do{k="";if(b.percentFormatString)k=b.percentFormatString;else{var k="#,##0.",h=Math.max(Math.ceil(Math.log(1/Math.abs(m))/Math.LN10),2);if(isNaN(h)||!isFinite(h))h=2;for(var s=0;s<h;s++)k+="#";b.percentFormatString=k}a=a.replace("#percent",ba(m,k,g._cultureInfo)); +a=a.replace("#total",ba(l,b.yValueFormatString?b.yValueFormatString:"#,##0.########",g._cultureInfo))}while(0<=a.indexOf("#percent")||0<=a.indexOf("#total"))}return a.replace(/\{.*?\}|"[^"]*"|'[^']*'/g,function(a){if('"'===a[0]&&'"'===a[a.length-1]||"'"===a[0]&&"'"===a[a.length-1])return a.slice(1,a.length-1);a=Ia(a.slice(1,a.length-1));a=a.replace("#index",e);var h=null;try{var f=a.match(/(.*?)\s*\[\s*(.*?)\s*\]/);f&&0<f.length&&(h=Ia(f[2]),a=Ia(f[1]))}catch(l){}f=null;if("color"===a)return"waterfall"=== +b.type?d.color?d.color:0<d.y?b.risingColor:b.fallingColor:"error"===b.type?b.color?b.color:b._colorSet[h%b._colorSet.length]:d.color?d.color:b.color?b.color:b._colorSet[c%b._colorSet.length];if(d.hasOwnProperty(a))f=d;else if(b.hasOwnProperty(a))f=b;else return"";f=f[a];null!==h&&(f=f[h]);if("x"===a)if("dateTime"===b.axisX.valueType||"dateTime"===b.xValueType||d.x&&d.x.getTime){if(g.plotInfo.plotTypes[0].plotUnits[0].axisX&&!g.plotInfo.plotTypes[0].plotUnits[0].axisX.logarithmic)return Ca(f,d.xValueFormatString? +d.xValueFormatString:b.xValueFormatString?b.xValueFormatString:b.xValueFormatString=g.axisX&&g.axisX.autoValueFormatString?g.axisX.autoValueFormatString:"DD MMM YY",g._cultureInfo)}else return ba(f,d.xValueFormatString?d.xValueFormatString:b.xValueFormatString?b.xValueFormatString:b.xValueFormatString="#,##0.########",g._cultureInfo);else return"y"===a?ba(f,d.yValueFormatString?d.yValueFormatString:b.yValueFormatString?b.yValueFormatString:b.yValueFormatString="#,##0.########",g._cultureInfo):"z"=== +a?ba(f,d.zValueFormatString?d.zValueFormatString:b.zValueFormatString?b.zValueFormatString:b.zValueFormatString="#,##0.########",g._cultureInfo):f})};qa(H,V);H.prototype.setLayout=function(){var a=this.dockInsidePlotArea?this.chart.plotArea:this.chart,d=a.layoutManager.getFreeSpace(),b=null,c=0,e=0,g=0,m=0,l=this.markerMargin=this.chart.options.legend&&!u(this.chart.options.legend.markerMargin)?this.chart.options.legend.markerMargin:0.3*this.fontSize;this.height=0;var k=[],h=[];"top"===this.verticalAlign|| +"bottom"===this.verticalAlign?(this.orientation="horizontal",b=this.verticalAlign,g=this.maxWidth=null!==this.maxWidth?this.maxWidth:d.width,m=this.maxHeight=null!==this.maxHeight?this.maxHeight:0.5*d.height):"center"===this.verticalAlign&&(this.orientation="vertical",b=this.horizontalAlign,g=this.maxWidth=null!==this.maxWidth?this.maxWidth:0.5*d.width,m=this.maxHeight=null!==this.maxHeight?this.maxHeight:d.height);this.errorMarkerColor=[];for(var s=0;s<this.dataSeries.length;s++){var q=this.dataSeries[s]; +if(q.dataPoints&&q.dataPoints.length)if("pie"!==q.type&&"doughnut"!==q.type&&"funnel"!==q.type&&"pyramid"!==q.type){var n=q.legendMarkerType=q.legendMarkerType?q.legendMarkerType:"line"!==q.type&&"stepLine"!==q.type&&"spline"!==q.type&&"scatter"!==q.type&&"bubble"!==q.type||!q.markerType?"error"===q.type&&q._linkedSeries?q._linkedSeries.legendMarkerType?q._linkedSeries.legendMarkerType:F.getDefaultLegendMarker(q._linkedSeries.type):F.getDefaultLegendMarker(q.type):q.markerType,f=q.legendText?q.legendText: +this.itemTextFormatter?this.itemTextFormatter({chart:this.chart,legend:this.options,dataSeries:q,dataPoint:null}):q.name,p=q.legendMarkerColor=q.legendMarkerColor?q.legendMarkerColor:q.markerColor?q.markerColor:"error"===q.type?u(q.whiskerColor)?q._colorSet[0]:q.whiskerColor:q._colorSet[0],r=q.markerSize||"line"!==q.type&&"stepLine"!==q.type&&"spline"!==q.type?0.75*this.lineHeight:0,v=q.legendMarkerBorderColor?q.legendMarkerBorderColor:q.markerBorderColor,t=q.legendMarkerBorderThickness?q.legendMarkerBorderThickness: +q.markerBorderThickness?Math.max(1,Math.round(0.2*r)):0;"error"===q.type&&this.errorMarkerColor.push(p);f=this.chart.replaceKeywordsWithValue(f,q.dataPoints[0],q,s);n={markerType:n,markerColor:p,text:f,textBlock:null,chartType:q.type,markerSize:r,lineColor:q._colorSet[0],dataSeriesIndex:q.index,dataPointIndex:null,markerBorderColor:v,markerBorderThickness:t};k.push(n)}else for(var z=0;z<q.dataPoints.length;z++){var x=q.dataPoints[z],n=x.legendMarkerType?x.legendMarkerType:q.legendMarkerType?q.legendMarkerType: +F.getDefaultLegendMarker(q.type),f=x.legendText?x.legendText:q.legendText?q.legendText:this.itemTextFormatter?this.itemTextFormatter({chart:this.chart,legend:this.options,dataSeries:q,dataPoint:x}):x.name?x.name:"DataPoint: "+(z+1),p=x.legendMarkerColor?x.legendMarkerColor:q.legendMarkerColor?q.legendMarkerColor:x.color?x.color:q.color?q.color:q._colorSet[z%q._colorSet.length],r=0.75*this.lineHeight,v=x.legendMarkerBorderColor?x.legendMarkerBorderColor:q.legendMarkerBorderColor?q.legendMarkerBorderColor: +x.markerBorderColor?x.markerBorderColor:q.markerBorderColor,t=x.legendMarkerBorderThickness?x.legendMarkerBorderThickness:q.legendMarkerBorderThickness?q.legendMarkerBorderThickness:x.markerBorderThickness||q.markerBorderThickness?Math.max(1,Math.round(0.2*r)):0,f=this.chart.replaceKeywordsWithValue(f,x,q,z),n={markerType:n,markerColor:p,text:f,textBlock:null,chartType:q.type,markerSize:r,dataSeriesIndex:s,dataPointIndex:z,markerBorderColor:v,markerBorderThickness:t};(x.showInLegend||q.showInLegend&& +!1!==x.showInLegend)&&k.push(n)}}!0===this.reversed&&k.reverse();if(0<k.length){q=null;p=f=x=z=0;x=null!==this.itemWidth?null!==this.itemMaxWidth?Math.min(this.itemWidth,this.itemMaxWidth,g):this.itemMaxWidth=Math.min(this.itemWidth,g):null!==this.itemMaxWidth?Math.min(this.itemMaxWidth,g):this.itemMaxWidth=g;r=0===r?0.75*this.lineHeight:r;x-=r+l;for(s=0;s<k.length;s++){n=k[s];v=x;if("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType)v-=2*0.1*this.lineHeight;if(!(0>=m||"undefined"=== +typeof m||0>=v||"undefined"===typeof v)){if("horizontal"===this.orientation){n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:v,maxHeight:this.itemWrap?m:this.lineHeight,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"});n.textBlock.measureText();null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"=== +n.chartType?2*0.1*this.lineHeight:0)));if(!q||q.width+Math.round(n.textBlock.width+r+l+(0===q.width?0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))>g)q={items:[],width:0},h.push(q),this.height+=f,f=0;f=Math.max(f,n.textBlock.height)}else n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:x,maxHeight:!0===this.itemWrap?m:1.5*this.fontSize,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily, +fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"}),n.textBlock.measureText(),null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))),this.height<m-this.lineHeight?(q={items:[],width:0},h.push(q)):(q=h[z],z=(z+1)%h.length),this.height+=n.textBlock.height;n.textBlock.x=q.width;n.textBlock.y=0;q.width+=Math.round(n.textBlock.width+r+l+(0===q.width? +0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0));q.items.push(n);this.width=Math.max(q.width,this.width);p=n.textBlock.width+(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))}}this.itemWidth=p;this.height=!1===this.itemWrap?h.length*this.lineHeight:this.height+f;this.height=Math.min(m,this.height);this.width=Math.min(g,this.width)}"top"===this.verticalAlign?(e="left"===this.horizontalAlign? +d.x1:"right"===this.horizontalAlign?d.x2-this.width:d.x1+d.width/2-this.width/2,c=d.y1):"center"===this.verticalAlign?(e="left"===this.horizontalAlign?d.x1:"right"===this.horizontalAlign?d.x2-this.width:d.x1+d.width/2-this.width/2,c=d.y1+d.height/2-this.height/2):"bottom"===this.verticalAlign&&(e="left"===this.horizontalAlign?d.x1:"right"===this.horizontalAlign?d.x2-this.width:d.x1+d.width/2-this.width/2,c=d.y2-this.height);this.items=k;for(s=0;s<this.items.length;s++)n=k[s],n.id=++this.chart._eventManager.lastObjectId, +this.chart._eventManager.objectMap[n.id]={id:n.id,objectType:"legendItem",legendItemIndex:s,dataSeriesIndex:n.dataSeriesIndex,dataPointIndex:n.dataPointIndex};this.markerSize=r;this.rows=h;0<k.length&&a.layoutManager.registerSpace(b,{width:this.width+2+2,height:this.height+5+5});this.bounds={x1:e,y1:c,x2:e+this.width,y2:c+this.height}};H.prototype.render=function(){var a=this.bounds.x1,d=this.bounds.y1,b=this.markerMargin,c=this.maxWidth,e=this.maxHeight,g=this.markerSize,m=this.rows;(0<this.borderThickness&& +this.borderColor||this.backgroundColor)&&this.ctx.roundRect(a,d,this.width,this.height,this.cornerRadius,this.borderThickness,this.backgroundColor,this.borderColor);for(var l=0,k=0;k<m.length;k++){for(var h=m[k],s=0,q=0;q<h.items.length;q++){var n=h.items[q],f=n.textBlock.x+a+(0===q?0.2*g:this.horizontalSpacing),p=d+l,u=f;this.chart.data[n.dataSeriesIndex].visible||(this.ctx.globalAlpha=0.5);this.ctx.save();this.ctx.beginPath();this.ctx.rect(a,d,c,Math.max(e-e%this.lineHeight,0));this.ctx.clip(); +if("line"===n.chartType||"stepLine"===n.chartType||"spline"===n.chartType)this.ctx.strokeStyle=n.lineColor,this.ctx.lineWidth=Math.ceil(this.lineHeight/8),this.ctx.beginPath(),this.ctx.moveTo(f-0.1*this.lineHeight,p+this.lineHeight/2),this.ctx.lineTo(f+0.85*this.lineHeight,p+this.lineHeight/2),this.ctx.stroke(),u-=0.1*this.lineHeight;if("error"===n.chartType){this.ctx.strokeStyle=this.errorMarkerColor[0];this.ctx.lineWidth=g/8;this.ctx.beginPath();var r=f-0.08*this.lineHeight+0.1*this.lineHeight, +t=p+0.15*this.lineHeight,v=0.7*this.lineHeight,x=v+0.02*this.lineHeight;this.ctx.moveTo(r,t);this.ctx.lineTo(r+v,t);this.ctx.stroke();this.ctx.beginPath();this.ctx.moveTo(r+v/2,t);this.ctx.lineTo(r+v/2,t+x);this.ctx.stroke();this.ctx.beginPath();this.ctx.moveTo(r,t+x);this.ctx.lineTo(r+v,t+x);this.ctx.stroke();this.errorMarkerColor.shift()}ia.drawMarker(f+g/2,p+this.lineHeight/2,this.ctx,n.markerType,"error"===n.chartType||"line"===n.chartType||"spline"===n.chartType?n.markerSize/2:n.markerSize,n.markerColor, +n.markerBorderColor,n.markerBorderThickness);n.textBlock.x=f+b+g;if("line"===n.chartType||"stepLine"===n.chartType||"spline"===n.chartType)n.textBlock.x+=0.1*this.lineHeight;n.textBlock.y=Math.round(p+this.lineHeight/2);n.textBlock.render(!0);this.ctx.restore();s=0<q?Math.max(s,n.textBlock.height):n.textBlock.height;this.chart.data[n.dataSeriesIndex].visible||(this.ctx.globalAlpha=1);f=N(n.id);this.ghostCtx.fillStyle=f;this.ghostCtx.beginPath();this.ghostCtx.fillRect(u,n.textBlock.y-this.lineHeight/ +2,n.textBlock.x+n.textBlock.width-u,n.textBlock.height);n.x1=this.chart._eventManager.objectMap[n.id].x1=u;n.y1=this.chart._eventManager.objectMap[n.id].y1=n.textBlock.y-this.lineHeight/2;n.x2=this.chart._eventManager.objectMap[n.id].x2=n.textBlock.x+n.textBlock.width;n.y2=this.chart._eventManager.objectMap[n.id].y2=n.textBlock.y+n.textBlock.height-this.lineHeight/2}l+=s}};qa(F,V);F.prototype.getDefaultAxisPlacement=function(){var a=this.type;if("column"===a||"line"===a||"stepLine"===a||"spline"=== +a||"area"===a||"stepArea"===a||"splineArea"===a||"stackedColumn"===a||"stackedLine"===a||"bubble"===a||"scatter"===a||"stackedArea"===a||"stackedColumn100"===a||"stackedLine100"===a||"stackedArea100"===a||"candlestick"===a||"ohlc"===a||"rangeColumn"===a||"rangeArea"===a||"rangeSplineArea"===a||"boxAndWhisker"===a||"waterfall"===a)return"normal";if("bar"===a||"stackedBar"===a||"stackedBar100"===a||"rangeBar"===a)return"xySwapped";if("pie"===a||"doughnut"===a||"funnel"===a||"pyramid"===a)return"none"; +"error"!==a&&window.console.log("Unknown Chart Type: "+a);return null};F.getDefaultLegendMarker=function(a){if("column"===a||"stackedColumn"===a||"stackedLine"===a||"bar"===a||"stackedBar"===a||"stackedBar100"===a||"bubble"===a||"scatter"===a||"stackedColumn100"===a||"stackedLine100"===a||"stepArea"===a||"candlestick"===a||"ohlc"===a||"rangeColumn"===a||"rangeBar"===a||"rangeArea"===a||"rangeSplineArea"===a||"boxAndWhisker"===a||"waterfall"===a)return"square";if("line"===a||"stepLine"===a||"spline"=== +a||"pie"===a||"doughnut"===a)return"circle";if("area"===a||"splineArea"===a||"stackedArea"===a||"stackedArea100"===a||"funnel"===a||"pyramid"===a)return"triangle";if("error"===a)return"none";window.console.log("Unknown Chart Type: "+a);return null};F.prototype.getDataPointAtX=function(a,d){if(!this.dataPoints||0===this.dataPoints.length)return null;var b={dataPoint:null,distance:Infinity,index:NaN},c=null,e=0,g=0,m=1,l=Infinity,k=0,h=0,s=0;"none"!==this.chart.plotInfo.axisPlacement&&(this.axisX.logarithmic? +(s=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),s=1<s?Math.min(Math.max((this.dataPoints.length-1)/s*Math.log(a/this.dataPoints[0].x)>>0,0),this.dataPoints.length):0):(s=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,s=0<s?Math.min(Math.max((this.dataPoints.length-1)/s*(a-this.dataPoints[0].x)>>0,0),this.dataPoints.length):0));for(;;){g=0<m?s+e:s-e;if(0<=g&&g<this.dataPoints.length){var c=this.dataPoints[g],q=this.axisX.logarithmic?c.x>a?c.x/a:a/c.x: +Math.abs(c.x-a);q<b.distance&&(b.dataPoint=c,b.distance=q,b.index=g);c=q;c<=l?l=c:0<m?k++:h++;if(1E3<k&&1E3<h)break}else if(0>s-e&&s+e>=this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}return d||b.dataPoint.x!==a?d&&null!==b.dataPoint?b:null:b};F.prototype.getDataPointAtXY=function(a,d,b){if(!this.dataPoints||0===this.dataPoints.length||a<this.chart.plotArea.x1||a>this.chart.plotArea.x2||d<this.chart.plotArea.y1||d>this.chart.plotArea.y2)return null;b=b||!1;var c=[],e=0,g=0,m=1,l=!1,k=Infinity, +h=0,s=0,q=0;if("none"!==this.chart.plotInfo.axisPlacement)if(q=(this.chart.axisX[0]?this.chart.axisX[0]:this.chart.axisX2[0]).getXValueAt({x:a,y:d}),this.axisX.logarithmic)var n=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),q=1<n?Math.min(Math.max((this.dataPoints.length-1)/n*Math.log(q/this.dataPoints[0].x)>>0,0),this.dataPoints.length):0;else n=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,q=0<n?Math.min(Math.max((this.dataPoints.length-1)/n*(q-this.dataPoints[0].x)>> +0,0),this.dataPoints.length):0;for(;;){g=0<m?q+e:q-e;if(0<=g&&g<this.dataPoints.length){var n=this.chart._eventManager.objectMap[this.dataPointIds[g]],f=this.dataPoints[g],p=null;if(n){switch(this.type){case "column":case "stackedColumn":case "stackedColumn100":case "bar":case "stackedBar":case "stackedBar100":case "rangeColumn":case "rangeBar":case "waterfall":case "error":a>=n.x1&&(a<=n.x2&&d>=n.y1&&d<=n.y2)&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1- +a),Math.abs(n.x2-a),Math.abs(n.y1-d),Math.abs(n.y2-d))}),l=!0);break;case "line":case "stepLine":case "spline":case "area":case "stepArea":case "stackedArea":case "stackedArea100":case "splineArea":case "scatter":var u=na("markerSize",f,this)||4,r=b?20:u,p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0<m?h++:s++;p<=u/2&&(l=!0);break;case "rangeArea":case "rangeSplineArea":u=na("markerSize",f,this)|| +4;r=b?20:u;p=Math.min(Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2)),Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y2-d,2)));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0<m?h++:s++;p<=u/2&&(l=!0);break;case "bubble":u=n.size;p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=u/2&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p}),l=!0);break;case "pie":case "doughnut":u=n.center;r="doughnut"===this.type?n.percentInnerRadius*n.radius: +0;p=Math.sqrt(Math.pow(u.x-a,2)+Math.pow(u.y-d,2));p<n.radius&&p>r&&(p=Math.atan2(d-u.y,a-u.x),0>p&&(p+=2*Math.PI),p=Number(((180*(p/Math.PI)%360+360)%360).toFixed(12)),u=Number(((180*(n.startAngle/Math.PI)%360+360)%360).toFixed(12)),r=Number(((180*(n.endAngle/Math.PI)%360+360)%360).toFixed(12)),0===r&&1<n.endAngle&&(r=360),u>=r&&0!==f.y&&(r+=360,p<u&&(p+=360)),p>u&&p<r&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:0}),l=!0));break;case "funnel":case "pyramid":p=n.funnelSection; +d>p.y1&&d<p.y4&&(p.y6?d>p.y6?(g=p.x6+(p.x5-p.x6)/(p.y5-p.y6)*(d-p.y6),p=p.x3+(p.x4-p.x3)/(p.y4-p.y3)*(d-p.y3)):(g=p.x1+(p.x6-p.x1)/(p.y6-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)):(g=p.x1+(p.x4-p.x1)/(p.y4-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)),a>g&&a<p&&(c.push({dataPoint:f,dataPointIndex:n.dataPointIndex,dataSeries:this,distance:0}),l=!0));break;case "boxAndWhisker":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y4-n.borderThickness/2&&d<=n.y1+n.borderThickness/ +2||Math.abs(n.x2-a+n.x1-a)<n.borderThickness&&d>=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "candlestick":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y2-n.borderThickness/2&&d<=n.y3+n.borderThickness/2||Math.abs(n.x2-a+n.x1-a)<n.borderThickness&&d>=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a), +Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "ohlc":if(Math.abs(n.x2-a+n.x1-a)<n.borderThickness&&d>=n.y2&&d<=n.y3||a>=n.x1&&a<=(n.x2+n.x1)/2&&d>=n.y1-n.borderThickness/2&&d<=n.y1+n.borderThickness/2||a>=(n.x1+n.x2)/2&&a<=n.x2&&d>=n.y4-n.borderThickness/2&&d<=n.y4+n.borderThickness/2)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0}if(l||1E3<h&&1E3<s)break}}else if(0>q-e&&q+e>= +this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}a=null;for(d=0;d<c.length;d++)a?c[d].distance<=a.distance&&(a=c[d]):a=c[d];return a};F.prototype.getMarkerProperties=function(a,d,b,c){var e=this.dataPoints;return{x:d,y:b,ctx:c,type:e[a].markerType?e[a].markerType:this.markerType,size:e[a].markerSize?e[a].markerSize:this.markerSize,color:e[a].markerColor?e[a].markerColor:this.markerColor?this.markerColor:e[a].color?e[a].color:this.color?this.color:this._colorSet[a%this._colorSet.length],borderColor:e[a].markerBorderColor? +e[a].markerBorderColor:this.markerBorderColor?this.markerBorderColor:null,borderThickness:e[a].markerBorderThickness?e[a].markerBorderThickness:this.markerBorderThickness?this.markerBorderThickness:null}};qa(z,V);z.prototype.createExtraLabelsForLog=function(a){a=(a||0)+1;if(!(5<a)){var d=this.logLabelValues[0]||this.intervalStartPosition;if(Math.log(this.range)/Math.log(d/this.viewportMinimum)<this.noTicks-1){for(var b=z.getNiceNumber((d-this.viewportMinimum)/Math.min(Math.max(2,this.noTicks-this.logLabelValues.length), +3),!0),c=Math.ceil(this.viewportMinimum/b)*b;c<d;c+=b)c<this.viewportMinimum||this.logLabelValues.push(c);this.logLabelValues.sort(Sa);this.createExtraLabelsForLog(a)}}};z.prototype.createLabels=function(){var a,d,b=0,c=0,e,g=0,m=0,c=0,c=this.interval,l=0,k,h=0.6*this.chart.height,p;a=!1;var q=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],n=q.length?u(this.scaleBreaks.firstBreakIndex)?0:this.scaleBreaks.firstBreakIndex:0;if("axisX"!==this.type||"dateTime"!==this.valueType||this.logarithmic){e= +this.viewportMaximum;if(this.labels){a=Math.ceil(c);for(var c=Math.ceil(this.intervalStartPosition),f=!1,b=c;b<this.viewportMaximum;b+=a)if(this.labels[b])f=!0;else{f=!1;break}f&&(this.interval=a,this.intervalStartPosition=c)}if(this.logarithmic&&!this.equidistantInterval)for(this.logLabelValues||(this.logLabelValues=[],this.createExtraLabelsForLog()),c=0,f=n;c<this.logLabelValues.length;c++)if(b=this.logLabelValues[c],b<this.viewportMinimum)c++;else{for(;f<q.length&&b>q[f].endValue;f++);a=f<q.length&& +b>=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius, +horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle",borderThickness:0}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}f=n;for(b=this.intervalStartPosition;b<=e;b=parseFloat(1E-12>this.interval?this.logarithmic&&this.equidistantInterval?b*Math.pow(this.logarithmBase,this.interval):b+this.interval:(this.logarithmic&&this.equidistantInterval? +b*Math.pow(this.logarithmBase,this.interval):b+this.interval).toFixed(12))){for(;f<q.length&&b>q[f].endValue;f++);a=f<q.length&&b>=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix, +horizontalAlign:"left",backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}}else for(this.intervalStartPosition=this.getLabelStartPoint(new Date(this.viewportMinimum), +this.intervalType,this.interval),e=Ya(new Date(this.viewportMaximum),this.interval,this.intervalType),f=n,b=this.intervalStartPosition;b<e;Ya(b,c,this.intervalType)){for(a=b.getTime();f<q.length&&a>q[f].endValue;f++);p=a;a=f<q.length&&a>=q[f].startValue&&a<=q[f].endValue;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:new Date(p),label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:Ca(p,this.valueFormatString,this.chart._cultureInfo), +a=new ka(this.ctx,{x:0,y:0,maxWidth:g,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null, +breaksLabelType:void 0}))}if("bottom"===this._position||"top"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.width*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length-2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.width/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+ +"Duration"]*this.interval,g="undefined"===typeof this.options.labelMaxWidth?0.5*this.chart.width>>0:this.options.labelMaxWidth,this.chart.panEnabled||(m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize);else if("left"===this._position||"right"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.height*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length- +2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.height/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+"Duration"]*this.interval,this.chart.panEnabled||(g="undefined"===typeof this.options.labelMaxWidth?0.3*this.chart.width>>0:this.options.labelMaxWidth),m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize; +for(c=0;c<this._labels.length;c++){a=this._labels[c].textBlock;a.maxWidth=g;a.maxHeight=m;var B=a.measureText();k=B.height}e=[];n=q=0;if(this.labelAutoFit||this.options.labelAutoFit)if(u(this.labelAngle)||(this.labelAngle=(this.labelAngle%360+360)%360,90<this.labelAngle&&270>this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360)),"bottom"===this._position||"top"===this._position)if(g=0.9*l>>0,n=0,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize= +this.labelFontSize;this.sessionVariables.labelMaxWidth=g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=this.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b<this._labels.length;b++)if(!this._labels[b].breaksLabelType){a=this._labels[b].textBlock;for(var v,f=a.text.split(" "),c=0;c<f.length;c++)p=f[c],this.ctx.font=a.fontStyle+" "+a.fontWeight+" "+a.fontSize+"px "+a.fontFamily,p=this.ctx.measureText(p),p.width>n&&(v=b,n=p.width)}b=0;for(b=this.intervalStartPosition< +this.viewportMinimum?1:0;b<this._labels.length;b++)if(!this._labels[b].breaksLabelType){a=this._labels[b].textBlock;B=a.measureText();for(f=b+1;f<this._labels.length;f++)if(!this._labels[f].breaksLabelType){d=this._labels[f].textBlock;d=d.measureText();break}e.push(a.height);this.sessionVariables.labelMaxHeight=Math.max.apply(Math,e);Math.cos(Math.PI/180*Math.abs(this.labelAngle));Math.sin(Math.PI/180*Math.abs(this.labelAngle));c=g*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(m-a.fontSize/2)* +Math.cos(Math.PI/180*Math.abs(this.labelAngle));if(u(this.options.labelAngle)&&isNaN(this.options.labelAngle)&&0!==this.options.labelAngle)if(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(-25)))/Math.sin(Math.PI/180*Math.abs(-25)),!u(this.options.labelWrap))this.labelWrap?u(this.options.labelMaxWidth)?(this.sessionVariables.labelMaxWidth= +Math.min(Math.max(g,n),p),this.sessionVariables.labelWrap=this.labelWrap,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25)):(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle):u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth= +g,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p)):(this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=this.labelWrap);else{if(u(this.options.labelWrap))if(!u(this.options.labelMaxWidth))this.options.labelMaxWidth<g?(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth, +this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m);else if(!u(d))if(c=B.width+d.width>>0,f=this.labelFontSize,n<g)c-2*g>q&&(q=c-2*g,c>=2*g&&c<2.2*g?(this.sessionVariables.labelMaxWidth=g,u(this.options.labelFontSize)&&12<f&&(f=Math.floor(12/13*f),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelAngle= +this.labelAngle):c>=2.2*g&&c<2.8*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=f):c>=2.8*g&&c<3.2*g?(this.sessionVariables.labelMaxWidth=Math.max(g,n),this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12<this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelAngle= +this.labelAngle):c>=3.2*g&&c<3.6*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=this.labelFontSize):c>3.6*g&&c<5*g?(u(this.options.labelFontSize)&&12<f&&(f=Math.floor(12/13*f),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p): +c>5*g&&(this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelFontSize=f,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=this.labelAngle));else if(v===b&&(0===v&&n+this._labels[v+1].textBlock.measureText().width-2*g>q||v===this._labels.length-1&&n+this._labels[v-1].textBlock.measureText().width-2*g>q||0<v&&v<this._labels.length-1&&n+this._labels[v+1].textBlock.measureText().width-2*g>q&&n+this._labels[v-1].textBlock.measureText().width- +2*g>q))q=0===v?n+this._labels[v+1].textBlock.measureText().width-2*g:n+this._labels[v-1].textBlock.measureText().width-2*g,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p;else if(0===q)for(this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,c=0;c<this._labels.length;c++)a= +this._labels[c].textBlock,a.maxWidth=this.sessionVariables.labelMaxWidth=Math.min(Math.max(g,n),p),B=a.measureText(),c<this._labels.length-1&&(f=c+1,d=this._labels[f].textBlock,d.maxWidth=this.sessionVariables.labelMaxWidth=Math.min(Math.max(g,n),p),d=d.measureText(),B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25))}else(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/ +Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=0!=this.labelAngle?(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)):g,this.sessionVariables.labelMaxHeight=m=this.labelWrap?(h-p*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)):1.5*this.labelFontSize,u(this.options.labelWrap))?u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap= +this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelMaxHeight=c<0.9*l?0.9*l:c,this.sessionVariables.labelWrap=this.labelWrap)):(this.options.labelWrap?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p): +(u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelWrap=this.labelWrap),this.sessionVariables.labelMaxHeight=m)}for(c=0;c<this._labels.length;c++)a=this._labels[c].textBlock,a.maxWidth=this.labelMaxWidth=this.sessionVariables.labelMaxWidth,a.fontSize=this.sessionVariables.labelFontSize,a.angle=this.labelAngle=this.sessionVariables.labelAngle,a.wrap=this.labelWrap=this.sessionVariables.labelWrap,a.maxHeight= +this.sessionVariables.labelMaxHeight,a.measureText()}else for(b=0;b<this._labels.length;b++)a=this._labels[b].textBlock,a.maxWidth=this.labelMaxWidth=u(this.options.labelMaxWidth)?this.sessionVariables.labelMaxWidth:this.options.labelMaxWidth,a.fontSize=this.labelFontSize=u(this.options.labelFontSize)?this.sessionVariables.labelFontSize:this.options.labelFontSize,a.angle=this.labelAngle=u(this.options.labelAngle)?this.sessionVariables.labelAngle:this.labelAngle,a.wrap=this.labelWrap=u(this.options.labelWrap)? +this.sessionVariables.labelWrap:this.options.labelWrap,a.maxHeight=this.sessionVariables.labelMaxHeight,a.measureText();else if("left"===this._position||"right"===this._position)if(g=u(this.options.labelMaxWidth)?0.3*this.chart.width>>0:this.options.labelMaxWidth,m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize=this.labelFontSize;this.sessionVariables.labelMaxWidth= +g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b<this._labels.length;b++)if(!this._labels[b].breaksLabelType){a=this._labels[b].textBlock;B=a.measureText();for(f=b+1;f<this._labels.length;f++)if(!this._labels[f].breaksLabelType){d=this._labels[f].textBlock;d=d.measureText();break}e.push(a.height);this.sessionVariables.labelMaxHeight=Math.max.apply(Math, +e);c=g*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(m-a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle));Math.cos(Math.PI/180*Math.abs(this.labelAngle));Math.sin(Math.PI/180*Math.abs(this.labelAngle));u(this.options.labelAngle)&&isNaN(this.options.labelAngle)&&0!==this.options.labelAngle?u(this.options.labelWrap)?u(this.options.labelWrap)&&(u(this.options.labelMaxWidth)?u(d)||(l=B.height+d.height>>0,l-2*m>n&&(n=l-2*m,l>=2*m&&l<2.4*m?(u(this.options.labelFontSize)&&12<this.labelFontSize&& +(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize):l>=2.4*m&&l<2.8*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelFontSize=this.labelFontSize,this.sessionVariables.labelWrap=!0):l>=2.8*m&&l<3.2*m?(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12< +this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>=3.2*m&&l<3.6*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelFontSize=this.labelFontSize):l>3.6*m&&l<10*m?(u(this.options.labelFontSize)&& +12<this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>10*m&&l<50*m&&(u(this.options.labelFontSize)&&12<this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize), +a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle))):(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth)):(this.sessionVariables.labelMaxWidth= +this.labelWrap?this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth:this.labelMaxWidth?this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=0===this.labelAngle?g:Math.min((c-m*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)),m),u(this.options.labelWrap))? +u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth>this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,u(this.options.labelMaxWidth)&& +(this.sessionVariables.labelAngle=this.labelAngle))):this.options.labelWrap?(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=g):(this.sessionVariables.labelMaxHeight=m,u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap)}for(c=0;c<this._labels.length;c++)a= +this._labels[c].textBlock,a.maxWidth=this.labelMaxWidth=this.sessionVariables.labelMaxWidth,a.fontSize=this.labelFontSize=this.sessionVariables.labelFontSize,a.angle=this.labelAngle=this.sessionVariables.labelAngle,a.wrap=this.labelWrap=this.sessionVariables.labelWrap,a.maxHeight=this.sessionVariables.labelMaxHeight,a.measureText()}else for(b=0;b<this._labels.length;b++)a=this._labels[b].textBlock,a.maxWidth=this.labelMaxWidth=u(this.options.labelMaxWidth)?this.sessionVariables.labelMaxWidth:this.options.labelMaxWidth, +a.fontSize=this.labelFontSize=u(this.options.labelFontSize)?this.sessionVariables.labelFontSize:this.options.labelFontSize,a.angle=this.labelAngle=u(this.options.labelAngle)?this.sessionVariables.labelAngle:this.labelAngle,a.wrap=this.labelWrap=u(this.options.labelWrap)?this.sessionVariables.labelWrap:this.options.labelWrap,a.maxHeight=this.sessionVariables.labelMaxHeight,a.measureText();for(b=0;b<this.stripLines.length;b++){var g=this.stripLines[b],z;if("outside"===g.labelPlacement){m=this.sessionVariables.labelMaxWidth; +if("bottom"===this._position||"top"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize;if("left"===this._position||"right"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.width>>0:1.5*this.labelFontSize;u(g.labelBackgroundColor)&&(g.labelBackgroundColor="#EEEEEE")}else m="bottom"===this._position||"top"===this._position?0.9*this.chart.width>>0:0.9*this.chart.height>> +0,z=u(g.options.labelWrap)||g.labelWrap?"bottom"===this._position||"top"===this._position?0.8*this.chart.width>>0:0.8*this.chart.height>>0:1.5*this.labelFontSize,u(g.labelBackgroundColor)&&(u(g.startValue)&&0!==g.startValue?g.labelBackgroundColor=r?"transparent":null:g.labelBackgroundColor="#EEEEEE");a=new ka(this.ctx,{x:0,y:0,backgroundColor:g.labelBackgroundColor,borderColor:g.labelBorderColor,borderThickness:g.labelBorderThickness,cornerRadius:g.labelCornerRadius,maxWidth:g.options.labelMaxWidth? +g.options.labelMaxWidth:m,maxHeight:z,angle:this.labelAngle,text:g.labelFormatter?g.labelFormatter({chart:this.chart,axis:this,stripLine:g}):g.label,horizontalAlign:"left",fontSize:"outside"===g.labelPlacement?g.options.labelFontSize?g.labelFontSize:this.labelFontSize:g.labelFontSize,fontFamily:"outside"===g.labelPlacement?g.options.labelFontFamily?g.labelFontFamily:this.labelFontFamily:g.labelFontFamily,fontWeight:"outside"===g.labelPlacement?g.options.labelFontWeight?g.labelFontWeight:this.labelFontWeight: +g.labelFontWeight,fontColor:g.labelFontColor||g.color,fontStyle:"outside"===g.labelPlacement?g.options.labelFontStyle?g.labelFontStyle:this.fontWeight:g.labelFontStyle,textBaseline:"middle"});this._stripLineLabels.push({position:g.value,textBlock:a,effectiveHeight:null,stripLine:g})}};z.prototype.createLabelsAndCalculateWidth=function(){var a=0,d=0;this._labels=[];this._stripLineLabels=[];var b=this.chart.isNavigator?0:5;if("left"===this._position||"right"===this._position){this.createLabels();for(d= +0;d<this._labels.length;d++){var c=this._labels[d].textBlock,e=c.measureText(),g=0,g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle));a<g&&(a=g);this._labels[d].effectiveWidth=g}for(d=0;d<this._stripLineLabels.length;d++)"outside"===this._stripLineLabels[d].stripLine.labelPlacement&&(this._stripLineLabels[d].stripLine.value>=this.viewportMinimum&&this._stripLineLabels[d].stripLine.value<=this.viewportMaximum)&& +(c=this._stripLineLabels[d].textBlock,e=c.measureText(),g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle)),a<g&&(a=g),this._stripLineLabels[d].effectiveWidth=g)}d=this.title?this._titleTextBlock.measureText().height+2:0;return c="inside"===this.labelPlacement?c=d+b:d+a+this.tickLength+b};z.prototype.createLabelsAndCalculateHeight=function(){var a=0;this._labels=[];this._stripLineLabels=[];var d, +b=0,c=this.chart.isNavigator?0:5;this.createLabels();if("bottom"===this._position||"top"===this._position){for(b=0;b<this._labels.length;b++){d=this._labels[b].textBlock;var e=d.measureText(),g=0,g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle));a<g&&(a=g);this._labels[b].effectiveHeight=g}for(b=0;b<this._stripLineLabels.length;b++)"outside"===this._stripLineLabels[b].stripLine.labelPlacement&& +(this._stripLineLabels[b].stripLine.value>=this.viewportMinimum&&this._stripLineLabels[b].stripLine.value<=this.viewportMaximum)&&(d=this._stripLineLabels[b].textBlock,e=d.measureText(),g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)),a<g&&(a=g),this._stripLineLabels[b].effectiveHeight=g)}d=this.title?this._titleTextBlock.measureText().height+2:0;return b="inside"===this.labelPlacement?b= +d+c:d+a+this.tickLength+c};z.setLayout=function(a,d,b,c,e,g){var m,l,k,h,p=a[0]?a[0].chart:d[0].chart,q=p.isNavigator?0:10,n=p._axes;if(a&&0<a.length)for(var f=0;f<a.length;f++)a[f]&&a[f].calculateAxisParameters();if(d&&0<d.length)for(f=0;f<d.length;f++)d[f].calculateAxisParameters();if(b&&0<b.length)for(f=0;f<b.length;f++)b[f].calculateAxisParameters();if(c&&0<c.length)for(f=0;f<c.length;f++)c[f].calculateAxisParameters();for(f=0;f<n.length;f++)if(n[f]&&n[f].scaleBreaks&&n[f].scaleBreaks._appliedBreaks.length)for(var r= +n[f].scaleBreaks._appliedBreaks,v=0;v<r.length&&!(r[v].startValue>n[f].viewportMaximum);v++)r[v].endValue<n[f].viewportMinimum||(u(n[f].scaleBreaks.firstBreakIndex)&&(n[f].scaleBreaks.firstBreakIndex=v),r[v].startValue>=n[f].viewPortMinimum&&(n[f].scaleBreaks.lastBreakIndex=v));for(var z=v=0,t=0,C=0,x=0,D=0,y=0,A,E,F=l=0,H,I,L,r=H=I=L=!1,f=0;f<n.length;f++)n[f]&&n[f].title&&(n[f]._titleTextBlock=new ka(n[f].ctx,{text:n[f].title,horizontalAlign:"center",fontSize:n[f].titleFontSize,fontFamily:n[f].titleFontFamily, +fontWeight:n[f].titleFontWeight,fontColor:n[f].titleFontColor,fontStyle:n[f].titleFontStyle,borderColor:n[f].titleBorderColor,borderThickness:n[f].titleBorderThickness,backgroundColor:n[f].titleBackgroundColor,cornerRadius:n[f].titleCornerRadius,textBaseline:"top"}));for(f=0;f<n.length;f++)if(n[f].title)switch(n[f]._position){case "left":n[f]._titleTextBlock.maxWidth=n[f].titleMaxWidth||g.height;n[f]._titleTextBlock.maxHeight=n[f].titleWrap?0.8*g.width:1.5*n[f].titleFontSize;n[f]._titleTextBlock.angle= +-90;break;case "right":n[f]._titleTextBlock.maxWidth=n[f].titleMaxWidth||g.height;n[f]._titleTextBlock.maxHeight=n[f].titleWrap?0.8*g.width:1.5*n[f].titleFontSize;n[f]._titleTextBlock.angle=90;break;default:n[f]._titleTextBlock.maxWidth=n[f].titleMaxWidth||g.width,n[f]._titleTextBlock.maxHeight=n[f].titleWrap?0.8*g.height:1.5*n[f].titleFontSize,n[f]._titleTextBlock.angle=0}if("normal"===e){for(var C=[],x=[],D=[],y=[],M=[],N=[],O=[],Q=[];4>v;){var G=0,R=0,S=0,U=0,W=e=0,K=0,$=0,V=0,X=0,P=0,ba=0;if(b&& +0<b.length)for(D=[],f=P=0;f<b.length;f++)D.push(Math.ceil(b[f]?b[f].createLabelsAndCalculateWidth():0)),P+=D[f],K+=b[f]&&!p.isNavigator?b[f].margin:0;else D.push(Math.ceil(b[0]?b[0].createLabelsAndCalculateWidth():0));O.push(D);if(c&&0<c.length)for(y=[],f=ba=0;f<c.length;f++)y.push(Math.ceil(c[f]?c[f].createLabelsAndCalculateWidth():0)),ba+=y[f],$+=c[f]?c[f].margin:0;else y.push(Math.ceil(c[0]?c[0].createLabelsAndCalculateWidth():0));Q.push(y);m=Math.round(g.x1+P+K);k=Math.round(g.x2-ba-$>p.width- +q?p.width-q:g.x2-ba-$);if(a&&0<a.length)for(C=[],f=V=0;f<a.length;f++)a[f]&&(a[f].lineCoordinates={}),a[f].lineCoordinates.width=Math.abs(k-m),a[f].title&&(a[f]._titleTextBlock.maxWidth=0<a[f].titleMaxWidth&&a[f].titleMaxWidth<a[f].lineCoordinates.width?a[f].titleMaxWidth:a[f].lineCoordinates.width),C.push(Math.ceil(a[f]?a[f].createLabelsAndCalculateHeight():0)),V+=C[f],e+=a[f]&&!p.isNavigator?a[f].margin:0;else C.push(Math.ceil(a[0]?a[0].createLabelsAndCalculateHeight():0));M.push(C);if(d&&0<d.length)for(x= +[],f=X=0;f<d.length;f++)d[f]&&(d[f].lineCoordinates={}),d[f].lineCoordinates.width=Math.abs(k-m),d[f].title&&(d[f]._titleTextBlock.maxWidth=0<d[f].titleMaxWidth&&d[f].titleMaxWidth<d[f].lineCoordinates.width?d[f].titleMaxWidth:d[f].lineCoordinates.width),x.push(Math.ceil(d[f]?d[f].createLabelsAndCalculateHeight():0)),X+=x[f],W+=d[f]&&!p.isNavigator?d[f].margin:0;else x.push(Math.ceil(d[0]?d[0].createLabelsAndCalculateHeight():0));N.push(x);if(a&&0<a.length)for(f=0;f<a.length;f++)a[f]&&(a[f].lineCoordinates.x1= +m,k=Math.round(g.x2-ba-$>p.width-q?p.width-q:g.x2-ba-$),a[f]._labels&&1<a[f]._labels.length&&(l=h=0,h=a[f]._labels[1],l="dateTime"===a[f].valueType?a[f]._labels[a[f]._labels.length-2]:a[f]._labels[a[f]._labels.length-1],z=h.textBlock.width*Math.cos(Math.PI/180*Math.abs(h.textBlock.angle))+(h.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/180*Math.abs(h.textBlock.angle)),t=l.textBlock.width*Math.cos(Math.PI/180*Math.abs(l.textBlock.angle))+(l.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/ +180*Math.abs(l.textBlock.angle))),!a[f]||(!a[f].labelAutoFit||u(A)||u(E)||p.isNavigator)||(l=0,0<a[f].labelAngle?E+t>k&&(l+=0<a[f].labelAngle?E+t-k-ba:0):0>a[f].labelAngle?A-z<m&&A-z<a[f].viewportMinimum&&(F=m-(K+a[f].tickLength+D+A-z+a[f].labelFontSize/2)):0===a[f].labelAngle&&(E+t>k&&(l=E+t/2-k-ba),A-z<m&&A-z<a[f].viewportMinimum&&(F=m-K-a[f].tickLength-D-A+z/2)),a[f].viewportMaximum===a[f].maximum&&a[f].viewportMinimum===a[f].minimum&&0<a[f].labelAngle&&0<l?k-=l:a[f].viewportMaximum===a[f].maximum&& +a[f].viewportMinimum===a[f].minimum&&0>a[f].labelAngle&&0<F?m+=F:a[f].viewportMaximum===a[f].maximum&&a[f].viewportMinimum===a[f].minimum&&0===a[f].labelAngle&&(0<F&&(m+=F),0<l&&(k-=l))),p.panEnabled?V=p.sessionVariables.axisX.height:p.sessionVariables.axisX.height=V,l=Math.round(g.y2-V-e+G),h=Math.round(g.y2),a[f].lineCoordinates.x2=k,a[f].lineCoordinates.width=k-m,a[f].lineCoordinates.y1=l,a[f].lineCoordinates.y2=l,a[f].bounds={x1:m,y1:l,x2:k,y2:h-(V+e-C[f]-G),width:k-m,height:h-l}),G+=C[f]+a[f].margin; +if(d&&0<d.length)for(f=0;f<d.length;f++)d[f].lineCoordinates.x1=Math.round(g.x1+P+K),d[f].lineCoordinates.x2=Math.round(g.x2-ba-$>p.width-q?p.width-q:g.x2-ba-$),d[f].lineCoordinates.width=Math.abs(k-m),d[f]._labels&&1<d[f]._labels.length&&(h=d[f]._labels[1],l="dateTime"===d[f].valueType?d[f]._labels[d[f]._labels.length-2]:d[f]._labels[d[f]._labels.length-1],z=h.textBlock.width*Math.cos(Math.PI/180*Math.abs(h.textBlock.angle))+(h.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/180*Math.abs(h.textBlock.angle)), +t=l.textBlock.width*Math.cos(Math.PI/180*Math.abs(l.textBlock.angle))+(l.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/180*Math.abs(l.textBlock.angle))),p.panEnabled?X=p.sessionVariables.axisX2.height:p.sessionVariables.axisX2.height=X,l=Math.round(g.y1),h=Math.round(g.y2+d[f].margin),d[f].lineCoordinates.y1=l+X+W-R,d[f].lineCoordinates.y2=l,d[f].bounds={x1:m,y1:l+(X+W-x[f]-R),x2:k,y2:h,width:k-m,height:h-l},R+=x[f]+d[f].margin;if(b&&0<b.length)for(f=0;f<b.length;f++)K=p.isNavigator?0: +10,b[f]&&(m=Math.round(a[0]?a[0].lineCoordinates.x1:d[0].lineCoordinates.x1),K=b[f]._labels&&0<b[f]._labels.length?b[f]._labels[b[f]._labels.length-1].textBlock.height/2:q,l=Math.round(g.y1+X+W<Math.max(K,q)?Math.max(K,q):g.y1+X+W),k=Math.round(a[0]?a[0].lineCoordinates.x1:d[0].lineCoordinates.x1),K=0<a.length?0:b[f]._labels&&0<b[f]._labels.length?b[f]._labels[0].textBlock.height/2:q,h=Math.round(g.y2-V-e-K),b[f].lineCoordinates={x1:k-S,y1:l,x2:k-S,y2:h,height:Math.abs(h-l)},b[f].bounds={x1:m-(D[f]+ +S),y1:l,x2:k,y2:h,width:k-m,height:h-l},b[f].title&&(b[f]._titleTextBlock.maxWidth=0<b[f].titleMaxWidth&&b[f].titleMaxWidth<b[f].lineCoordinates.height?b[f].titleMaxWidth:b[f].lineCoordinates.height),S+=D[f]+b[f].margin);if(c&&0<c.length)for(f=0;f<c.length;f++)c[f]&&(m=Math.round(a[0]?a[0].lineCoordinates.x2:d[0].lineCoordinates.x2),k=Math.round(m),K=c[f]._labels&&0<c[f]._labels.length?c[f]._labels[c[f]._labels.length-1].textBlock.height/2:0,l=Math.round(g.y1+X+W<Math.max(K,q)?Math.max(K,q):g.y1+ +X+W),K=0<a.length?0:c[f]._labels&&0<c[f]._labels.length?c[f]._labels[0].textBlock.height/2:0,h=Math.round(g.y2-(V+e+K)),c[f].lineCoordinates={x1:m+U,y1:l,x2:m+U,y2:h,height:Math.abs(h-l)},c[f].bounds={x1:m,y1:l,x2:k+(y[f]+U),y2:h,width:k-m,height:h-l},c[f].title&&(c[f]._titleTextBlock.maxWidth=0<c[f].titleMaxWidth&&c[f].titleMaxWidth<c[f].lineCoordinates.height?c[f].titleMaxWidth:c[f].lineCoordinates.height),U+=y[f]+c[f].margin);if(a&&0<a.length)for(f=0;f<a.length;f++)a[f]&&(a[f].calculateValueToPixelConversionParameters(), +a[f].calculateBreaksSizeInValues(),a[f]._labels&&1<a[f]._labels.length&&(A=(a[f].logarithmic?Math.log(a[f]._labels[1].position/a[f].viewportMinimum)/a[f].conversionParameters.lnLogarithmBase:a[f]._labels[1].position-a[f].viewportMinimum)*Math.abs(a[f].conversionParameters.pixelPerUnit)+a[f].lineCoordinates.x1,m=a[f]._labels[a[f]._labels.length-("dateTime"===a[f].valueType?2:1)].position,m=a[f].getApparentDifference(a[f].viewportMinimum,m),E=a[f].logarithmic?(1<m?Math.log(m)/a[f].conversionParameters.lnLogarithmBase* +Math.abs(a[f].conversionParameters.pixelPerUnit):0)+a[f].lineCoordinates.x1:(0<m?m*Math.abs(a[f].conversionParameters.pixelPerUnit):0)+a[f].lineCoordinates.x1));if(d&&0<d.length)for(f=0;f<d.length;f++)d[f].calculateValueToPixelConversionParameters(),d[f].calculateBreaksSizeInValues(),d[f]._labels&&1<d[f]._labels.length&&(A=(d[f].logarithmic?Math.log(d[f]._labels[1].position/d[f].viewportMinimum)/d[f].conversionParameters.lnLogarithmBase:d[f]._labels[1].position-d[f].viewportMinimum)*Math.abs(d[f].conversionParameters.pixelPerUnit)+ +d[f].lineCoordinates.x1,m=d[f]._labels[d[f]._labels.length-("dateTime"===d[f].valueType?2:1)].position,m=d[f].getApparentDifference(d[f].viewportMinimum,m),E=d[f].logarithmic?(1<m?Math.log(m)/d[f].conversionParameters.lnLogarithmBase*Math.abs(d[f].conversionParameters.pixelPerUnit):0)+d[f].lineCoordinates.x1:(0<m?m*Math.abs(d[f].conversionParameters.pixelPerUnit):0)+d[f].lineCoordinates.x1);for(f=0;f<n.length;f++)"axisY"===n[f].type&&(n[f].calculateValueToPixelConversionParameters(),n[f].calculateBreaksSizeInValues()); +if(0<v){if(a&&0<a.length)for(f=0;f<a.length;f++)r=M[v-1][f]===M[v][f]?!0:!1;else r=!0;if(d&&0<d.length)for(f=0;f<d.length;f++)H=N[v-1][f]===N[v][f]?!0:!1;else H=!0;if(b&&0<b.length)for(f=0;f<b.length;f++)I=O[v-1][f]===O[v][f]?!0:!1;else I=!0;if(c&&0<c.length)for(f=0;f<c.length;f++)L=Q[v-1][f]===Q[v][f]?!0:!1;else L=!0}if(r&&H&&I&&L)break;v++}if(a&&0<a.length)for(f=0;f<a.length;f++)a[f].calculateStripLinesThicknessInValues(),a[f].calculateBreaksInPixels();if(d&&0<d.length)for(f=0;f<d.length;f++)d[f].calculateStripLinesThicknessInValues(), +d[f].calculateBreaksInPixels();if(b&&0<b.length)for(f=0;f<b.length;f++)b[f].calculateStripLinesThicknessInValues(),b[f].calculateBreaksInPixels();if(c&&0<c.length)for(f=0;f<c.length;f++)c[f].calculateStripLinesThicknessInValues(),c[f].calculateBreaksInPixels()}else{q=[];A=[];F=[];z=[];E=[];t=[];M=[];for(N=[];4>v;){V=U=R=S=$=K=W=e=Q=O=G=X=0;if(a&&0<a.length)for(F=[],f=U=0;f<a.length;f++)F.push(Math.ceil(a[f]?a[f].createLabelsAndCalculateWidth():0)),U+=F[f],e+=a[f]&&!p.isNavigator?a[f].margin:0;else F.push(Math.ceil(a[0]? +a[0].createLabelsAndCalculateWidth():0));M.push(F);if(d&&0<d.length)for(z=[],f=V=0;f<d.length;f++)z.push(Math.ceil(d[f]?d[f].createLabelsAndCalculateWidth():0)),V+=z[f],W+=d[f]?d[f].margin:0;else z.push(Math.ceil(d[0]?d[0].createLabelsAndCalculateWidth():0));N.push(z);if(b&&0<b.length)for(f=0;f<b.length;f++)b[f].lineCoordinates={},m=Math.round(g.x1+U+e),k=Math.round(g.x2-V-W>p.width-10?p.width-10:g.x2-V-W),b[f].labelAutoFit&&!u(C)&&(0<!a.length&&(m=0>b[f].labelAngle?Math.max(m,C):0===b[f].labelAngle? +Math.max(m,C/2):m),0<!d.length&&(k=0<b[f].labelAngle?k-x/2:0===b[f].labelAngle?k-x/2:k)),b[f].lineCoordinates.x1=m,b[f].lineCoordinates.x2=k,b[f].lineCoordinates.width=Math.abs(k-m),b[f].title&&(b[f]._titleTextBlock.maxWidth=0<b[f].titleMaxWidth&&b[f].titleMaxWidth<b[f].lineCoordinates.width?b[f].titleMaxWidth:b[f].lineCoordinates.width);if(c&&0<c.length)for(f=0;f<c.length;f++)c[f].lineCoordinates={},m=Math.round(g.x1+U+e),k=Math.round(g.x2-V-W>c[f].chart.width-10?c[f].chart.width-10:g.x2-V-W),c[f]&& +c[f].labelAutoFit&&!u(D)&&(0<!a.length&&(m=0<c[f].labelAngle?Math.max(m,D):0===c[f].labelAngle?Math.max(m,D/2):m),0<!d.length&&(k-=y/2)),c[f].lineCoordinates.x1=m,c[f].lineCoordinates.x2=k,c[f].lineCoordinates.width=Math.abs(k-m),c[f].title&&(c[f]._titleTextBlock.maxWidth=0<c[f].titleMaxWidth&&c[f].titleMaxWidth<c[f].lineCoordinates.width?c[f].titleMaxWidth:c[f].lineCoordinates.width);if(b&&0<b.length)for(q=[],f=S=0;f<b.length;f++)q.push(Math.ceil(b[f]?b[f].createLabelsAndCalculateHeight():0)),S+= +q[f]+b[f].margin,K+=b[f].margin;else q.push(Math.ceil(b[0]?b[0].createLabelsAndCalculateHeight():0));E.push(q);if(c&&0<c.length)for(A=[],f=R=0;f<c.length;f++)A.push(Math.ceil(c[f]?c[f].createLabelsAndCalculateHeight():0)),R+=A[f],$+=c[f].margin;else A.push(Math.ceil(c[0]?c[0].createLabelsAndCalculateHeight():0));t.push(A);if(b&&0<b.length)for(f=0;f<b.length;f++)0<b[f]._labels.length&&(h=b[f]._labels[0],l=b[f]._labels[b[f]._labels.length-1],C=h.textBlock.width*Math.cos(Math.PI/180*Math.abs(h.textBlock.angle))+ +(h.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/180*Math.abs(h.textBlock.angle)),x=l.textBlock.width*Math.cos(Math.PI/180*Math.abs(l.textBlock.angle))+(l.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/180*Math.abs(l.textBlock.angle)));if(c&&0<c.length)for(f=0;f<c.length;f++)c[f]&&0<c[f]._labels.length&&(h=c[f]._labels[0],l=c[f]._labels[c[f]._labels.length-1],D=h.textBlock.width*Math.cos(Math.PI/180*Math.abs(h.textBlock.angle))+(h.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/ +180*Math.abs(h.textBlock.angle)),y=l.textBlock.width*Math.cos(Math.PI/180*Math.abs(l.textBlock.angle))+(l.textBlock.height-l.textBlock.fontSize/2)*Math.sin(Math.PI/180*Math.abs(l.textBlock.angle)));if(p.panEnabled)for(f=0;f<b.length;f++)q[f]=p.sessionVariables.axisY.height;else for(f=0;f<b.length;f++)p.sessionVariables.axisY.height=q[f];if(b&&0<b.length)for(f=b.length-1;0<=f;f--)l=Math.round(g.y2),h=Math.round(g.y2>b[f].chart.height-10?b[f].chart.height-10:g.y2),b[f].lineCoordinates.y1=l-(q[f]+b[f].margin+ +X),b[f].lineCoordinates.y2=l-(q[f]+b[f].margin+X),b[f].bounds={x1:m,y1:l-(q[f]+X+b[f].margin),x2:k,y2:h-(X+b[f].margin),width:k-m,height:q[f]},b[f].title&&(b[f]._titleTextBlock.maxWidth=0<b[f].titleMaxWidth&&b[f].titleMaxWidth<b[f].lineCoordinates.width?b[f].titleMaxWidth:b[f].lineCoordinates.width),X+=q[f]+b[f].margin;if(c&&0<c.length)for(f=c.length-1;0<=f;f--)c[f]&&(l=Math.round(g.y1),h=Math.round(g.y1+(A[f]+c[f].margin+G)),c[f].lineCoordinates.y1=h,c[f].lineCoordinates.y2=h,c[f].bounds={x1:m,y1:l+ +(c[f].margin+G),x2:k,y2:h,width:k-m,height:R},c[f].title&&(c[f]._titleTextBlock.maxWidth=0<c[f].titleMaxWidth&&c[f].titleMaxWidth<c[f].lineCoordinates.width?c[f].titleMaxWidth:c[f].lineCoordinates.width),G+=A[f]+c[f].margin);if(a&&0<a.length)for(f=0;f<a.length;f++){K=a[f]._labels&&0<a[f]._labels.length?a[f]._labels[0].textBlock.fontSize/2:0;m=Math.round(g.x1+e);l=c&&0<c.length?Math.round(c[0]?c[0].lineCoordinates.y2:g.y1<Math.max(K,10)?Math.max(K,10):g.y1):g.y1<Math.max(K,10)?Math.max(K,10):g.y1; +k=Math.round(g.x1+U+e);h=b&&0<b.length?Math.round(b[0]?b[0].lineCoordinates.y1:g.y2-S>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0<b.length)for(K=0;K<b.length;K++)b[K]&&b[K].labelAutoFit&&(k=0>b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0===b[K].labelAngle?k-U:m);if(c&&0<c.length)for(K=0;K<c.length;K++)c[K]&&c[K].labelAutoFit&&(k=c[K].lineCoordinates.x1,m=k-U);a[f].lineCoordinates= +{x1:k-O,y1:l,x2:k-O,y2:h,height:Math.abs(h-l)};a[f].bounds={x1:k-(F[f]+O),y1:l,x2:k,y2:h,width:k-m,height:h-l};a[f].title&&(a[f]._titleTextBlock.maxWidth=0<a[f].titleMaxWidth&&a[f].titleMaxWidth<a[f].lineCoordinates.height?a[f].titleMaxWidth:a[f].lineCoordinates.height);a[f].calculateValueToPixelConversionParameters();a[f].calculateBreaksSizeInValues();O+=F[f]+a[f].margin}if(d&&0<d.length)for(f=0;f<d.length;f++){K=d[f]._labels&&0<d[f]._labels.length?d[f]._labels[0].textBlock.fontSize/2:0;m=Math.round(g.x1- +e);l=c&&0<c.length?Math.round(c[0]?c[0].lineCoordinates.y2:g.y1<Math.max(K,10)?Math.max(K,10):g.y1):g.y1<Math.max(K,10)?Math.max(K,10):g.y1;k=Math.round(g.x2-V-W);h=b&&0<b.length?Math.round(b[0]?b[0].lineCoordinates.y1:g.y2-S>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0<b.length)for(K=0;K<b.length;K++)b[K]&&b[K].labelAutoFit&&(k=0>b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0=== +b[K].labelAngle?k-V:m);if(c&&0<c.length)for(K=0;K<c.length;K++)c[K]&&c[K].labelAutoFit&&(k=c[K].lineCoordinates.x2,m=k-V);d[f].lineCoordinates={x1:k+Q,y1:l,x2:k+Q,y2:h,height:Math.abs(h-l)};d[f].bounds={x1:m,y1:l,x2:k+z[f]+Q,y2:h,width:k-m,height:h-l};d[f].title&&(d[f]._titleTextBlock.maxWidth=0<d[f].titleMaxWidth&&d[f].titleMaxWidth<d[f].lineCoordinates.height?d[f].titleMaxWidth:d[f].lineCoordinates.height);d[f].calculateValueToPixelConversionParameters();d[f].calculateBreaksSizeInValues();Q+=z[f]+ +d[f].margin}for(f=0;f<n.length;f++)"axisY"===n[f].type&&(n[f].calculateValueToPixelConversionParameters(),n[f].calculateBreaksSizeInValues());if(0<v){if(a&&0<a.length)for(f=0;f<a.length;f++)r=M[v-1][f]===M[v][f]?!0:!1;else r=!0;if(d&&0<d.length)for(f=0;f<d.length;f++)H=N[v-1][f]===N[v][f]?!0:!1;else H=!0;if(b&&0<b.length)for(f=0;f<b.length;f++)I=E[v-1][f]===E[v][f]?!0:!1;else I=!0;if(c&&0<c.length)for(f=0;f<c.length;f++)L=t[v-1][f]===t[v][f]?!0:!1;else L=!0}if(r&&H&&I&&L)break;v++}if(b&&0<b.length)for(f= +0;f<b.length;f++)b[f].calculateStripLinesThicknessInValues(),b[f].calculateBreaksInPixels();if(c&&0<c.length)for(f=0;f<c.length;f++)c[f].calculateStripLinesThicknessInValues(),c[f].calculateBreaksInPixels();if(a&&0<a.length)for(f=0;f<a.length;f++)a[f].calculateStripLinesThicknessInValues(),a[f].calculateBreaksInPixels();if(d&&0<d.length)for(f=0;f<d.length;f++)d[f].calculateStripLinesThicknessInValues(),d[f].calculateBreaksInPixels()}};z.render=function(a,d,b,c,e){var g=a[0]?a[0].chart:d[0].chart; +e=g.ctx;var m=g._axes;g.alignVerticalAxes&&g.alignVerticalAxes();e.save();e.beginPath();a[0]&&e.rect(5,a[0].bounds.y1,a[0].chart.width-10,a[0].bounds.height);d[0]&&e.rect(5,d[d.length-1].bounds.y1,d[0].chart.width-10,d[0].bounds.height);e.clip();if(a&&0<a.length)for(var l=0;l<a.length;l++)a[l].renderLabelsTicksAndTitle();if(d&&0<d.length)for(l=0;l<d.length;l++)d[l].renderLabelsTicksAndTitle();e.restore();if(b&&0<b.length)for(l=0;l<b.length;l++)b[l].renderLabelsTicksAndTitle();if(c&&0<c.length)for(l= +0;l<c.length;l++)c[l].renderLabelsTicksAndTitle();g.preparePlotArea();g=g.plotArea;e.save();e.beginPath();e.rect(g.x1,g.y1,Math.abs(g.x2-g.x1),Math.abs(g.y2-g.y1));e.clip();if(a&&0<a.length)for(l=0;l<m.length;l++)m[l].renderStripLinesOfThicknessType("value");if(d&&0<d.length)for(l=0;l<d.length;l++)d[l].renderStripLinesOfThicknessType("value");if(b&&0<b.length)for(l=0;l<b.length;l++)b[l].renderStripLinesOfThicknessType("value");if(c&&0<c.length)for(l=0;l<c.length;l++)c[l].renderStripLinesOfThicknessType("value"); +if(a&&0<a.length)for(l=0;l<a.length;l++)a[l].renderInterlacedColors();if(d&&0<d.length)for(l=0;l<d.length;l++)d[l].renderInterlacedColors();if(b&&0<b.length)for(l=0;l<b.length;l++)b[l].renderInterlacedColors();if(c&&0<c.length)for(l=0;l<c.length;l++)c[l].renderInterlacedColors();e.restore();if(a&&0<a.length)for(l=0;l<a.length;l++)a[l].renderGrid(),r&&(a[l].createMask(),a[l].renderBreaksBackground());if(d&&0<d.length)for(l=0;l<d.length;l++)d[l].renderGrid(),r&&(d[l].createMask(),d[l].renderBreaksBackground()); +if(b&&0<b.length)for(l=0;l<b.length;l++)b[l].renderGrid(),r&&(b[l].createMask(),b[l].renderBreaksBackground());if(c&&0<c.length)for(l=0;l<c.length;l++)c[l].renderGrid(),r&&(c[l].createMask(),c[l].renderBreaksBackground());if(a&&0<a.length)for(l=0;l<a.length;l++)a[l].renderAxisLine();if(d&&0<d.length)for(l=0;l<d.length;l++)d[l].renderAxisLine();if(b&&0<b.length)for(l=0;l<b.length;l++)b[l].renderAxisLine();if(c&&0<c.length)for(l=0;l<c.length;l++)c[l].renderAxisLine();if(a&&0<a.length)for(l=0;l<a.length;l++)a[l].renderStripLinesOfThicknessType("pixel"); +if(d&&0<d.length)for(l=0;l<d.length;l++)d[l].renderStripLinesOfThicknessType("pixel");if(b&&0<b.length)for(l=0;l<b.length;l++)b[l].renderStripLinesOfThicknessType("pixel");if(c&&0<c.length)for(l=0;l<c.length;l++)c[l].renderStripLinesOfThicknessType("pixel")};z.prototype.calculateStripLinesThicknessInValues=function(){for(var a=0;a<this.stripLines.length;a++)if(null!==this.stripLines[a].startValue&&null!==this.stripLines[a].endValue){var d=Math.min(this.stripLines[a].startValue,this.stripLines[a].endValue), +b=Math.max(this.stripLines[a].startValue,this.stripLines[a].endValue),d=this.getApparentDifference(d,b);this.stripLines[a].value=this.logarithmic?this.stripLines[a].value*Math.sqrt(Math.log(this.stripLines[a].endValue/this.stripLines[a].startValue)/Math.log(d)):this.stripLines[a].value+(Math.abs(this.stripLines[a].endValue-this.stripLines[a].startValue)-d)/2;this.stripLines[a].thickness=d;this.stripLines[a]._thicknessType="value"}};z.prototype.calculateBreaksSizeInValues=function(){for(var a="left"=== +this._position||"right"===this._position?this.lineCoordinates.height||this.chart.height:this.lineCoordinates.width||this.chart.width,d=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b=this.conversionParameters.pixelPerUnit||a/(this.logarithmic?this.conversionParameters.maximum/this.conversionParameters.minimum:this.conversionParameters.maximum-this.conversionParameters.minimum),c=this.scaleBreaks&&!u(this.scaleBreaks.options.spacing),e,g=0;g<d.length;g++)e=c||!u(d[g].options.spacing),d[g].spacing= +I(d[g].spacing,a,8,e?0.1*a:8,e?0:3)<<0,d[g].size=0>d[g].spacing?0:Math.abs(d[g].spacing/b),this.logarithmic&&(d[g].size=Math.pow(this.logarithmBase,d[g].size))};z.prototype.calculateBreaksInPixels=function(){if(!(this.scaleBreaks&&0>=this.scaleBreaks._appliedBreaks.length)){var a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];a.length&&(this.scaleBreaks.firstBreakIndex=this.scaleBreaks.lastBreakIndex=null);for(var d=0;d<a.length&&!(a[d].startValue>this.conversionParameters.maximum);d++)a[d].endValue< +this.conversionParameters.minimum||(u(this.scaleBreaks.firstBreakIndex)&&(this.scaleBreaks.firstBreakIndex=d),a[d].startValue>=this.conversionParameters.minimum&&(a[d].startPixel=this.convertValueToPixel(a[d].startValue),this.scaleBreaks.lastBreakIndex=d),a[d].endValue<=this.conversionParameters.maximum&&(a[d].endPixel=this.convertValueToPixel(a[d].endValue)))}};z.prototype.renderLabelsTicksAndTitle=function(){var a=this,d=!1,b=0,c=0,e=1,g=0;0!==this.labelAngle&&360!==this.labelAngle&&(e=1.2);if("undefined"=== +typeof this.options.interval){if("bottom"===this._position||"top"===this._position)if(this.logarithmic&&!this.equidistantInterval&&this.labelAutoFit){for(var b=[],e=0!==this.labelAngle&&360!==this.labelAngle?1:1.2,m,l=this.viewportMaximum,k=this.lineCoordinates.width/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.position<this.viewportMinimum)break;q.position>this.viewportMaximum||!(h===this._labels.length-1||m<Math.log(l/q.position)*k/e)||(b.push(q),l=q.position,m= +q.textBlock.width*Math.abs(Math.cos(Math.PI/180*this.labelAngle))+q.textBlock.height*Math.abs(Math.sin(Math.PI/180*this.labelAngle)))}this._labels=b}else{for(h=0;h<this._labels.length;h++)q=this._labels[h],q.position<this.viewportMinimum||(m=q.textBlock.width*Math.abs(Math.cos(Math.PI/180*this.labelAngle))+q.textBlock.height*Math.abs(Math.sin(Math.PI/180*this.labelAngle)),b+=m);b>this.lineCoordinates.width*e&&this.labelAutoFit&&(d=!0)}if("left"===this._position||"right"===this._position)if(this.logarithmic&& +!this.equidistantInterval&&this.labelAutoFit){for(var b=[],p,l=this.viewportMaximum,k=this.lineCoordinates.height/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.position<this.viewportMinimum)break;q.position>this.viewportMaximum||!(h===this._labels.length-1||p<Math.log(l/q.position)*k)||(b.push(q),l=q.position,p=q.textBlock.height*Math.abs(Math.cos(Math.PI/180*this.labelAngle))+q.textBlock.width*Math.abs(Math.sin(Math.PI/180*this.labelAngle)))}this._labels=b}else{for(h= +0;h<this._labels.length;h++)q=this._labels[h],q.position<this.viewportMinimum||(p=q.textBlock.height*Math.abs(Math.cos(Math.PI/180*this.labelAngle))+q.textBlock.width*Math.abs(Math.sin(Math.PI/180*this.labelAngle)),c+=p);c>this.lineCoordinates.height*e&&this.labelAutoFit&&(d=!0)}}this.logarithmic&&(!this.equidistantInterval&&this.labelAutoFit)&&this._labels.sort(function(a,b){return a.position-b.position});var h=0,q,n;if("bottom"===this._position){for(h=0;h<this._labels.length;h++)q=this._labels[h], +q.position<this.viewportMinimum||(q.position>this.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y+this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y-(this.tickLength+q.textBlock.fontSize/2):n.y+this.tickLength+q.textBlock.fontSize/2):(n.x="inside"===this.labelPlacement?0>this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x-(0>this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0>this.labelAngle?n.y-this.tickLength-5:n.y-this.tickLength-Math.abs(q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle)+5):n.y+this.tickLength+Math.abs(0>this.labelAngle?q.textBlock.width* +Math.sin(Math.PI/180*this.labelAngle)-5:5)),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;h<a._labels.length;h++)if(q=a._labels[h],!(q.position<a.viewportMinimum||q.position>a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save(); +a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y-a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y2-this._titleTextBlock.height-3,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("top"===this._position){for(h=0;h<this._labels.length;h++)q=this._labels[h], +q.position<this.viewportMinimum||(q.position>this.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y-this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? +n.y+this.labelFontSize/2+this.tickLength+5:n.y-(this.tickLength+q.textBlock.height-q.textBlock.fontSize/2)):(n.x="inside"===this.labelPlacement?0<this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x+(q.textBlock.height-this.tickLength-this.labelFontSize)*Math.sin(Math.PI/180*this.labelAngle)-(0<this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0<this.labelAngle?n.y+this.tickLength+5:n.y-q.textBlock.width*Math.sin(Math.PI/ +180*this.labelAngle)+this.tickLength+5:n.y-(this.tickLength+((q.textBlock.height-q.textBlock.fontSize/2)*Math.cos(Math.PI/180*this.labelAngle)+(0<this.labelAngle?q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0)))),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;h<a._labels.length;h++)if(q=a._labels[h],!(q.position<a.viewportMinimum||q.position>a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&& +(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y+a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y1+1,this.titleMaxWidth= +this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("left"===this._position){for(h=0;h<this._labels.length;h++)q=this._labels[h],q.position<this.viewportMinimum||(q.position>this.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<< +0,c),this.ctx.lineTo(n.x-this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle?(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5):(q.textBlock.y="inside"===this.labelPlacement?n.y:n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:0<this.labelAngle?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)- +this.tickLength-5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)+(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.sin(Math.PI/180*this.labelAngle)-this.tickLength));"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;h<a._labels.length;h++)if(q=a._labels[h],!(q.position<a.viewportMinimum||q.position>a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness; +a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x+a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x1+1,this._titleTextBlock.y=this.lineCoordinates.height/2+this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("right"=== +this._position){for(h=0;h<this._labels.length;h++)q=this._labels[h],q.position<this.viewportMinimum||(q.position>this.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<<0,c),this.ctx.lineTo(n.x+this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle? +(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width-this.tickLength-5:n.x+this.tickLength+5):(q.textBlock.y="inside"===this.labelPlacement?n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0>this.labelAngle?n.y:n.y-(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.cos(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:0<this.labelAngle?n.x+(q.textBlock.height- +q.textBlock.fontSize/2-5)*Math.sin(Math.PI/180*this.labelAngle)+this.tickLength:n.x+this.tickLength+5));"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;h<a._labels.length;h++)if(q=a._labels[h],!(q.position<a.viewportMinimum||q.position>a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<< +0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x-a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x2-1,this._titleTextBlock.y=this.lineCoordinates.height/2-this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}g=0;if("inside"===this.labelPlacement)this.chart.addEventListener("dataAnimationIterationEnd", +function(){for(h=0;h<a._labels.length;h++)q=a._labels[h],q.position<a.viewportMinimum||(q.position>a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)||(a.ctx.save(),a.ctx.beginPath(),q.textBlock.render(!0),a.ctx.restore())},this);else for(h=0;h<this._labels.length;h++)q=this._labels[h],q.position<this.viewportMinimum||(q.position>this.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||q.textBlock.render(!0)};z.prototype.renderInterlacedColors=function(){var a=this.chart.plotArea.ctx,d,b,c=this.chart.plotArea, +e=0;d=!0;if(("bottom"===this._position||"top"===this._position)&&this.interlacedColor)for(a.fillStyle=this.interlacedColor,e=0;e<this._labels.length;e++)d?(d=this.getPixelCoordinatesOnAxis(this._labels[e].position),b=e+1>this._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(Math.min(b.x,d.x),c.y1,Math.abs(b.x-d.x),Math.abs(c.y1-c.y2)),d=!1):d=!0;else if(("left"===this._position||"right"===this._position)&&this.interlacedColor)for(a.fillStyle= +this.interlacedColor,e=0;e<this._labels.length;e++)d?(b=this.getPixelCoordinatesOnAxis(this._labels[e].position),d=e+1>this._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(c.x1,Math.min(b.y,d.y),Math.abs(c.x1-c.x2),Math.abs(d.y-b.y)),d=!1):d=!0;a.beginPath()};z.prototype.renderStripLinesOfThicknessType=function(a){if(this.stripLines&&0<this.stripLines.length&&a){for(var d=this,b,c=0,e=0,g=!1,m=!1,l=[],k=[], +m=!1,c=0;c<this.stripLines.length;c++){var h=this.stripLines[c];h._thicknessType===a&&("pixel"===a&&(h.value<this.viewportMinimum||h.value>this.viewportMaximum||u(h.value)||isNaN(this.range))||l.push(h))}for(c=0;c<this._stripLineLabels.length;c++)if(h=this.stripLines[c],b=this._stripLineLabels[c],!(b.position<this.viewportMinimum||b.position>this.viewportMaximum||isNaN(this.range))){a=this.getPixelCoordinatesOnAxis(b.position);if("outside"===b.stripLine.labelPlacement)if(h&&(this.ctx.strokeStyle= +h.color,"pixel"===h._thicknessType&&(this.ctx.lineWidth=h.thickness)),"bottom"===this._position){var p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0;this.ctx.beginPath();this.ctx.moveTo(p,a.y<<0);this.ctx.lineTo(p,a.y+this.tickLength<<0);this.ctx.stroke();0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y+=this.tickLength+b.textBlock.fontSize/2):(a.x-=0>this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0,a.y+=this.tickLength+Math.abs(0>this.labelAngle?b.textBlock.width*Math.sin(Math.PI/ +180*this.labelAngle)-5:5))}else"top"===this._position?(p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,this.ctx.beginPath(),this.ctx.moveTo(p,a.y<<0),this.ctx.lineTo(p,a.y-this.tickLength<<0),this.ctx.stroke(),0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y-=this.tickLength+b.textBlock.height):(a.x+=(b.textBlock.height-this.tickLength-this.labelFontSize/2)*Math.sin(Math.PI/180*this.labelAngle)-(0<this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),a.y-=this.tickLength+(b.textBlock.height* +Math.cos(Math.PI/180*this.labelAngle)+(0<this.labelAngle?b.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0)))):"left"===this._position?(p=1===this.ctx.lineWidth%2?(a.y<<0)+0.5:a.y<<0,this.ctx.beginPath(),this.ctx.moveTo(a.x<<0,p),this.ctx.lineTo(a.x-this.tickLength<<0,p),this.ctx.stroke(),0===this.labelAngle?a.x=a.x-b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:(a.y-=b.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),a.x=0<this.labelAngle?a.x-b.textBlock.width* +Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:a.x-b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)+(b.textBlock.height-b.textBlock.fontSize/2-5)*Math.sin(Math.PI/180*this.labelAngle)-this.tickLength)):"right"===this._position&&(p=1===this.ctx.lineWidth%2?(a.y<<0)+0.5:a.y<<0,this.ctx.beginPath(),this.ctx.moveTo(a.x<<0,p),this.ctx.lineTo(a.x+this.tickLength<<0,p),this.ctx.stroke(),0===this.labelAngle?a.x=a.x+this.tickLength+5:(a.y=0>this.labelAngle?a.y:a.y-(b.textBlock.height-b.textBlock.fontSize/ +2-5)*Math.cos(Math.PI/180*this.labelAngle),a.x=0<this.labelAngle?a.x+(b.textBlock.height-b.textBlock.fontSize/2-5)*Math.sin(Math.PI/180*this.labelAngle)+this.tickLength:a.x+this.tickLength+5));else b.textBlock.angle=-90,"bottom"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/ +2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+=b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y1+b.textBlock.width+3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-b.textBlock.width-3:"center"=== +b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y1+3):"top"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+= +b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+b.textBlock.width+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y2-3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y2- +b.textBlock.width-3):"left"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-b.textBlock.height>this.chart.plotArea.y1?u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3:a.y-b.textBlock.height<this.chart.plotArea.y2?a.y+=b.textBlock.fontSize/2+3:u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/ +2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3,a.x="near"===b.stripLine.labelAlign?this.chart.plotArea.x1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.x2+this.chart.plotArea.x1)/2-b.textBlock.width/2:this.chart.plotArea.x2-b.textBlock.width-3):"right"===this._position&&(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-+b.textBlock.height>this.chart.plotArea.y1? +u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2-3:a.y-b.textBlock.height<this.chart.plotArea.y2?a.y+=b.textBlock.fontSize/2+3:u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2+3,a.x="near"===b.stripLine.labelAlign?this.chart.plotArea.x2-b.textBlock.width-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.x2+this.chart.plotArea.x1)/2-b.textBlock.width/2:this.chart.plotArea.x1+ +3);b.textBlock.x=a.x;b.textBlock.y=a.y;k.push(b)}if(!m){m=!1;this.ctx.save();this.ctx.beginPath();this.ctx.rect(this.chart.plotArea.x1,this.chart.plotArea.y1,this.chart.plotArea.width,this.chart.plotArea.height);this.ctx.clip();for(c=0;c<l.length;c++)h=l[c],h.showOnTop?g||(g=!0,this.chart.addEventListener("dataAnimationIterationEnd",function(){this.ctx.save();this.ctx.beginPath();this.ctx.rect(this.chart.plotArea.x1,this.chart.plotArea.y1,this.chart.plotArea.width,this.chart.plotArea.height);this.ctx.clip(); +for(e=0;e<l.length;e++)h=l[e],h.showOnTop&&h.render();this.ctx.restore()},h)):h.render();for(c=0;c<k.length;c++)b=k[c],b.stripLine.showOnTop?m||(m=!0,this.chart.addEventListener("dataAnimationIterationEnd",function(){for(e=0;e<k.length;e++)b=k[e],"inside"===b.stripLine.labelPlacement&&b.stripLine.showOnTop&&(d.ctx.save(),d.ctx.beginPath(),d.ctx.rect(d.chart.plotArea.x1,d.chart.plotArea.y1,d.chart.plotArea.width,d.chart.plotArea.height),d.ctx.clip(),b.textBlock.render(!0),d.ctx.restore())},b.textBlock)): +"inside"===b.stripLine.labelPlacement&&b.textBlock.render(!0);this.ctx.restore();m=!0}if(m)for(m=!1,c=0;c<k.length;c++)b=k[c],b.stripLine.showOnTop?m||(m=!0,this.chart.addEventListener("dataAnimationIterationEnd",function(){for(e=0;e<k.length;e++)b=k[e],"outside"===b.stripLine.labelPlacement&&b.stripLine.showOnTop&&b.textBlock.render(!0)},b.textBlock)):"outside"===b.stripLine.labelPlacement&&b.textBlock.render(!0)}};z.prototype.renderBreaksBackground=function(){this.chart._breaksCanvas&&(this.scaleBreaks&& +0<this.scaleBreaks._appliedBreaks.length&&this.maskCanvas)&&(this.chart._breaksCanvasCtx.save(),this.chart._breaksCanvasCtx.beginPath(),this.chart._breaksCanvasCtx.rect(this.chart.plotArea.x1,this.chart.plotArea.y1,this.chart.plotArea.width,this.chart.plotArea.height),this.chart._breaksCanvasCtx.clip(),this.chart._breaksCanvasCtx.drawImage(this.maskCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx.restore())};z.prototype.createMask=function(){if(this.scaleBreaks&&0<this.scaleBreaks._appliedBreaks.length){var a= +this.scaleBreaks._appliedBreaks;r?(this.maskCanvas=ta(this.chart.width,this.chart.height),this.maskCtx=this.maskCanvas.getContext("2d")):(this.maskCanvas=this.chart.plotArea.canvas,this.maskCtx=this.chart.plotArea.ctx);this.maskCtx.save();this.maskCtx.beginPath();this.maskCtx.rect(this.chart.plotArea.x1,this.chart.plotArea.y1,this.chart.plotArea.width,this.chart.plotArea.height);this.maskCtx.clip();for(var d=0;d<a.length;d++)a[d].endValue<this.viewportMinimum||(a[d].startValue>this.viewportMaximum|| +isNaN(this.range))||a[d].render(this.maskCtx);this.maskCtx.restore()}};z.prototype.renderCrosshair=function(a,d){this.crosshair.render(a,d)};z.prototype.renderGrid=function(){if(this.gridThickness&&0<this.gridThickness){var a=this.chart.ctx;a.save();var d,b=this.chart.plotArea;a.lineWidth=this.gridThickness;a.strokeStyle=this.gridColor;a.setLineDash&&a.setLineDash(R(this.gridDashType,this.gridThickness));if("bottom"===this._position||"top"===this._position)for(c=0;c<this._labels.length;c++)this._labels[c].position< +this.viewportMinimum||(this._labels[c].position>this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(),d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.x<<0)+0.5:d.x<<0,a.moveTo(d,b.y1<<0),a.lineTo(d,b.y2<<0),a.stroke());else if("left"===this._position||"right"===this._position)for(var c=0;c<this._labels.length;c++)this._labels[c].position<this.viewportMinimum||(this._labels[c].position>this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(), +d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.y<<0)+0.5:d.y<<0,a.moveTo(b.x1<<0,d),a.lineTo(b.x2<<0,d),a.stroke());a.restore()}};z.prototype.renderAxisLine=function(){var a=this.chart.ctx,d=r?this.chart._preRenderCtx:a,b=Math.ceil(this.tickThickness/(this.reversed?-2:2)),c=Math.ceil(this.tickThickness/(this.reversed?2:-2)),e,g;d.save();if("bottom"===this._position||"top"===this._position){if(this.lineThickness){this.reversed?(e=this.lineCoordinates.x2,g=this.lineCoordinates.x1): +(e=this.lineCoordinates.x1,g=this.lineCoordinates.x2);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor?this.lineColor:"black";d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));var m=1===this.lineThickness%2?(this.lineCoordinates.y1<<0)+0.5:this.lineCoordinates.y1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+c;else for(var l= +this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(e,m),d.lineTo(this.scaleBreaks._appliedBreaks[l].startPixel+b,m),e=this.scaleBreaks._appliedBreaks[l].endPixel+c;e&&(d.moveTo(e,m),d.lineTo(g,m));d.stroke()}}else if(("left"===this._position||"right"===this._position)&&this.lineThickness){this.reversed?(e=this.lineCoordinates.y1,g=this.lineCoordinates.y2):(e=this.lineCoordinates.y2,g=this.lineCoordinates.y1);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor; +d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));m=1===this.lineThickness%2?(this.lineCoordinates.x1<<0)+0.5:this.lineCoordinates.x1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+b;else for(l=this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(m,e),d.lineTo(m,this.scaleBreaks._appliedBreaks[l].startPixel+c), +e=this.scaleBreaks._appliedBreaks[l].endPixel+b;e&&(d.moveTo(m,e),d.lineTo(m,g));d.stroke()}r&&(a.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx&&this.chart._breaksCanvasCtx.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),d.clearRect(0,0,this.chart.width,this.chart.height));d.restore()};z.prototype.getPixelCoordinatesOnAxis=function(a){var d={};if("bottom"===this._position||"top"===this._position)d.x=this.convertValueToPixel(a), +d.y=this.lineCoordinates.y1;if("left"===this._position||"right"===this._position)d.y=this.convertValueToPixel(a),d.x=this.lineCoordinates.x2;return d};z.prototype.convertPixelToValue=function(a){if("undefined"===typeof a)return null;var d=0,b=0,c,d=!0,e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b="number"===typeof a?a:"left"===this._position||"right"===this._position?a.y:a.x;if(this.logarithmic){a=c=Math.pow(this.logarithmBase,(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit); +if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b<e.length;b++){if(!(e[b].endValue<this.conversionParameters.minimum))if(d)if(e[b].startValue<this.conversionParameters.minimum){if(1<e[b].size&&this.conversionParameters.minimum*Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size))<e[b].endValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].endValue/this.conversionParameters.minimum/ +Math.pow(e[b].size,Math.log(e[b].endValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue)),c/=Math.pow(e[b].size,Math.log(e[b].endValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c>e[b].startValue/this.conversionParameters.minimum){c/=e[b].startValue/this.conversionParameters.minimum;if(c<e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1===e[b].size?1:Math.log(c)/Math.log(e[b].size))/c;break}else a*=e[b].endValue/e[b].startValue/ +e[b].size;c/=e[b].size;d=!1}else break;else if(c>e[b].startValue/e[b-1].endValue){c/=e[b].startValue/e[b-1].endValue;if(c<e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1===e[b].size?1:Math.log(c)/Math.log(e[b].size))/c;break}else a*=e[b].endValue/e[b].startValue/e[b].size;c/=e[b].size}else break}else for(b=e.length-1;0<=b;b--)if(!(e[b].startValue>this.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum){if(1<e[b].size&&this.conversionParameters.minimum*Math.pow(e[b].endValue/ +e[b].startValue,Math.log(c)/Math.log(e[b].size))>e[b].startValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].startValue/this.conversionParameters.minimum*Math.pow(e[b].size,Math.log(e[b].startValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue))*c,c*=Math.pow(e[b].size,Math.log(this.conversionParameters.minimum/e[b].startValue)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c<e[b].endValue/this.conversionParameters.minimum){c/= +e[b].endValue/this.conversionParameters.minimum;if(c>1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size;d=!1}else break;else if(c<e[b].endValue/e[b+1].startValue){c/=e[b].endValue/e[b+1].startValue;if(c>1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size}else break; +d=a*this.viewportMinimum}else{a=c=(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit;if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b<e.length;b++){if(!(e[b].endValue<this.conversionParameters.minimum))if(d)if(e[b].startValue<this.conversionParameters.minimum){if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue-e[b].startValue)/e[b].size<e[b].endValue){a=0>=e[b].size?0:c*(e[b].endValue- +e[b].startValue)/e[b].size;break}else a+=e[b].endValue-this.conversionParameters.minimum-e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue),c-=e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue);d=!1}else if(c>e[b].startValue-this.conversionParameters.minimum){c-=e[b].startValue-this.conversionParameters.minimum;if(c<e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)-c;break}else a+=e[b].endValue- +e[b].startValue-e[b].size;c-=e[b].size;d=!1}else break;else if(c>e[b].startValue-e[b-1].endValue){c-=e[b].startValue-e[b-1].endValue;if(c<e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)-c;break}else a+=e[b].endValue-e[b].startValue-e[b].size;c-=e[b].size}else break}else for(b=e.length-1;0<=b;b--)if(!(e[b].startValue>this.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum)if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue- +e[b].startValue)/e[b].size>e[b].startValue){a=0>=e[b].size?0:c*(e[b].endValue-e[b].startValue)/e[b].size;break}else a+=e[b].startValue-this.conversionParameters.minimum+e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),c+=e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),d=!1;else if(c<e[b].endValue-this.conversionParameters.minimum){c-=e[b].endValue-this.conversionParameters.minimum;if(c>-1*e[b].size){a+=(e[b].endValue- +e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size;d=!1}else break;else if(c<e[b].endValue-e[b+1].startValue){c-=e[b].endValue-e[b+1].startValue;if(c>-1*e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size}else break;d=this.conversionParameters.minimum+a}return d};z.prototype.convertValueToPixel=function(a){a=this.getApparentDifference(this.conversionParameters.minimum, +a,a);return this.logarithmic?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*Math.log(a/this.conversionParameters.minimum)/this.conversionParameters.lnLogarithmBase+0.5<<0:"axisX"===this.type?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5<<0:this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5};z.prototype.getApparentDifference=function(a, +d,b,c){var e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];if(this.logarithmic){b=u(b)?d/a:b;for(var g=0;g<e.length&&!(d<e[g].startValue);g++)a>e[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*e[g].startValue*e[g].size:a>=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*a*Math.pow(e[g].size,Math.log(e[g].endValue/a)/Math.log(e[g].endValue/e[g].startValue)):a<=e[g].startValue&&d<=e[g].endValue?b=b/d*e[g].startValue*Math.pow(e[g].size,Math.log(d/e[g].startValue)/Math.log(e[g].endValue/ +e[g].startValue)):!c&&(a>e[g].startValue&&d<e[g].endValue)&&(b=a*Math.pow(e[g].size,Math.log(d/a)/Math.log(e[g].endValue/e[g].startValue))))}else for(b=u(b)?Math.abs(d-a):b,g=0;g<e.length&&!(d<e[g].startValue);g++)a>e[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+e[g].startValue+e[g].size:a>e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+a+e[g].size*(e[g].endValue-a)/(e[g].endValue-e[g].startValue):a<=e[g].startValue&&d<e[g].endValue?b=b-d+e[g].startValue+e[g].size*(d-e[g].startValue)/ +(e[g].endValue-e[g].startValue):!c&&(a>e[g].startValue&&d<e[g].endValue)&&(b=a+e[g].size*(d-a)/(e[g].endValue-e[g].startValue)));return b};z.prototype.setViewPortRange=function(a,d){this.sessionVariables.newViewportMinimum=this.viewportMinimum=Math.min(a,d);this.sessionVariables.newViewportMaximum=this.viewportMaximum=Math.max(a,d)};z.prototype.getXValueAt=function(a){if(!a)return null;var d=null;"left"===this._position?d=this.convertPixelToValue(a.y):"bottom"===this._position&&(d=this.convertPixelToValue(a.x)); +return d};z.prototype.calculateValueToPixelConversionParameters=function(a){a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];var d={pixelPerUnit:null,minimum:null,reference:null},b=this.lineCoordinates.width,c=this.lineCoordinates.height,b="bottom"===this._position||"top"===this._position?b:c,c=Math.abs(this.range);if(this.logarithmic)for(var e=0;e<a.length&&!(this.viewportMaximum<a[e].startValue);e++)this.viewportMinimum>a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<= +a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*a[e].startValue,b=0<a[e].spacing.toString().indexOf("%")?b*(1-parseFloat(a[e].spacing)/100):b-Math.min(a[e].spacing,0.1*b)):this.viewportMinimum>a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*this.viewportMinimum,b=0<a[e].spacing.toString().indexOf("%")?b*(1-parseFloat(a[e].spacing)/100*Math.log(a[e].endValue/this.viewportMinimum)/Math.log(a[e].endValue/a[e].startValue)): +b-Math.min(a[e].spacing,0.1*b)*Math.log(a[e].endValue/this.viewportMinimum)/Math.log(a[e].endValue/a[e].startValue)):this.viewportMinimum<=a[e].startValue&&this.viewportMaximum<a[e].endValue&&(c=c/this.viewportMaximum*a[e].startValue,b=0<a[e].spacing.toString().indexOf("%")?b*(1-parseFloat(a[e].spacing)/100*Math.log(this.viewportMaximum/a[e].startValue)/Math.log(a[e].endValue/a[e].startValue)):b-Math.min(a[e].spacing,0.1*b)*Math.log(this.viewportMaximum/a[e].startValue)/Math.log(a[e].endValue/a[e].startValue))); +else for(e=0;e<a.length&&!(this.viewportMaximum<a[e].startValue);e++)this.viewportMinimum>a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<=a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+a[e].startValue,b=0<a[e].spacing.toString().indexOf("%")?b*(1-parseFloat(a[e].spacing)/100):b-Math.min(a[e].spacing,0.1*b)):this.viewportMinimum>a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+this.viewportMinimum, +b=0<a[e].spacing.toString().indexOf("%")?b*(1-parseFloat(a[e].spacing)/100*(a[e].endValue-this.viewportMinimum)/(a[e].endValue-a[e].startValue)):b-Math.min(a[e].spacing,0.1*b)*(a[e].endValue-this.viewportMinimum)/(a[e].endValue-a[e].startValue)):this.viewportMinimum<=a[e].startValue&&this.viewportMaximum<a[e].endValue&&(c=c-this.viewportMaximum+a[e].startValue,b=0<a[e].spacing.toString().indexOf("%")?b*(1-parseFloat(a[e].spacing)/100*(this.viewportMaximum-a[e].startValue)/(a[e].endValue-a[e].startValue)): +b-Math.min(a[e].spacing,0.1*b)*(this.viewportMaximum-a[e].startValue)/(a[e].endValue-a[e].startValue)));d.minimum=this.viewportMinimum;d.maximum=this.viewportMaximum;d.range=c;if("bottom"===this._position||"top"===this._position)this.logarithmic?(d.lnLogarithmBase=Math.log(this.logarithmBase),d.pixelPerUnit=(this.reversed?-1:1)*b*d.lnLogarithmBase/Math.log(Math.abs(c))):d.pixelPerUnit=(this.reversed?-1:1)*b/Math.abs(c),d.reference=this.reversed?this.lineCoordinates.x2:this.lineCoordinates.x1;if("left"=== +this._position||"right"===this._position)this.logarithmic?(d.lnLogarithmBase=Math.log(this.logarithmBase),d.pixelPerUnit=(this.reversed?1:-1)*b*d.lnLogarithmBase/Math.log(Math.abs(c))):d.pixelPerUnit=(this.reversed?1:-1)*b/Math.abs(c),d.reference=this.reversed?this.lineCoordinates.y1:this.lineCoordinates.y2;this.conversionParameters=d};z.prototype.calculateAxisParameters=function(){if(this.logarithmic)this.calculateLogarithmicAxisParameters();else{var a=this.chart.layoutManager.getFreeSpace(),d=!1, +b=!1;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?"xySwapped"===this.chart.plotInfo.axisPlacement?62:70:"xySwapped"===this.chart.plotInfo.axisPlacement?50:40,c=4;"axisX"===this.type&&(c=600>this.maxWidth?8:6);var a=Math.max(c,Math.floor(this.maxWidth/a)),e,g,m,c=0;!u(this.options.viewportMinimum)&&(!u(this.options.viewportMaximum)&&this.options.viewportMinimum>=this.options.viewportMaximum)&& +(this.viewportMinimum=this.viewportMaximum=null);if(u(this.options.viewportMinimum)&&!u(this.sessionVariables.newViewportMinimum)&&!isNaN(this.sessionVariables.newViewportMinimum))this.viewportMinimum=this.sessionVariables.newViewportMinimum;else if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(u(this.options.viewportMaximum)&&!u(this.sessionVariables.newViewportMaximum)&&!isNaN(this.sessionVariables.newViewportMaximum))this.viewportMaximum=this.sessionVariables.newViewportMaximum; +else if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(c=0;c<this.scaleBreaks._appliedBreaks.length;c++)if((!u(this.sessionVariables.newViewportMinimum)&&this.sessionVariables.newViewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue)&& +(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue)){this.scaleBreaks._appliedBreaks.splice(c,1);break}if("axisX"===this.type){if(this.dataSeries&&0<this.dataSeries.length)for(e=0;e<this.dataSeries.length;e++)"dateTime"===this.dataSeries[e].xValueType&& +(b=!0);e=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin;g=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax;0===g-e&&(c="undefined"===typeof this.options.interval?0.4:this.options.interval,g+=c,e-=c);Infinity!==this.dataInfo.minDiff?m=this.dataInfo.minDiff:1<g-e?m=0.5*Math.abs(g-e):(m=1,b&&(d=!0))}else"axisY"===this.type&&(e=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,g=null!==this.viewportMaximum?this.viewportMaximum: +this.dataInfo.viewPortMax,isFinite(e)||isFinite(g)?isFinite(e)?isFinite(g)||(g=e):e=g:(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),0===e&&0===g?(g+=9,e=0):0===g-e?(c=Math.min(Math.abs(0.01*Math.abs(g)),5),g+=c,e-=c):e>g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g, +null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1<g-e?0.5*Math.abs(g-e):1,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&0<e&&(e=0),this.includeZero&&(null===this.viewportMaximum||isNaN(this.viewportMaximum))&&0>g&&(g=0));c=this.getApparentDifference(isNaN(this.viewportMinimum)||null===this.viewportMinimum?e:this.viewportMinimum,isNaN(this.viewportMaximum)||null===this.viewportMaximum?g:this.viewportMaximum,null, +!0);if("axisX"===this.type&&b){this.intervalType||(c/1<=a?(this.interval=1,this.intervalType="millisecond"):c/2<=a?(this.interval=2,this.intervalType="millisecond"):c/5<=a?(this.interval=5,this.intervalType="millisecond"):c/10<=a?(this.interval=10,this.intervalType="millisecond"):c/20<=a?(this.interval=20,this.intervalType="millisecond"):c/50<=a?(this.interval=50,this.intervalType="millisecond"):c/100<=a?(this.interval=100,this.intervalType="millisecond"):c/200<=a?(this.interval=200,this.intervalType= +"millisecond"):c/250<=a?(this.interval=250,this.intervalType="millisecond"):c/300<=a?(this.interval=300,this.intervalType="millisecond"):c/400<=a?(this.interval=400,this.intervalType="millisecond"):c/500<=a?(this.interval=500,this.intervalType="millisecond"):c/(1*S.secondDuration)<=a?(this.interval=1,this.intervalType="second"):c/(2*S.secondDuration)<=a?(this.interval=2,this.intervalType="second"):c/(5*S.secondDuration)<=a?(this.interval=5,this.intervalType="second"):c/(10*S.secondDuration)<=a?(this.interval= +10,this.intervalType="second"):c/(15*S.secondDuration)<=a?(this.interval=15,this.intervalType="second"):c/(20*S.secondDuration)<=a?(this.interval=20,this.intervalType="second"):c/(30*S.secondDuration)<=a?(this.interval=30,this.intervalType="second"):c/(1*S.minuteDuration)<=a?(this.interval=1,this.intervalType="minute"):c/(2*S.minuteDuration)<=a?(this.interval=2,this.intervalType="minute"):c/(5*S.minuteDuration)<=a?(this.interval=5,this.intervalType="minute"):c/(10*S.minuteDuration)<=a?(this.interval= +10,this.intervalType="minute"):c/(15*S.minuteDuration)<=a?(this.interval=15,this.intervalType="minute"):c/(20*S.minuteDuration)<=a?(this.interval=20,this.intervalType="minute"):c/(30*S.minuteDuration)<=a?(this.interval=30,this.intervalType="minute"):c/(1*S.hourDuration)<=a?(this.interval=1,this.intervalType="hour"):c/(2*S.hourDuration)<=a?(this.interval=2,this.intervalType="hour"):c/(3*S.hourDuration)<=a?(this.interval=3,this.intervalType="hour"):c/(6*S.hourDuration)<=a?(this.interval=6,this.intervalType= +"hour"):c/(1*S.dayDuration)<=a?(this.interval=1,this.intervalType="day"):c/(2*S.dayDuration)<=a?(this.interval=2,this.intervalType="day"):c/(4*S.dayDuration)<=a?(this.interval=4,this.intervalType="day"):c/(1*S.weekDuration)<=a?(this.interval=1,this.intervalType="week"):c/(2*S.weekDuration)<=a?(this.interval=2,this.intervalType="week"):c/(3*S.weekDuration)<=a?(this.interval=3,this.intervalType="week"):c/(1*S.monthDuration)<=a?(this.interval=1,this.intervalType="month"):c/(2*S.monthDuration)<=a?(this.interval= +2,this.intervalType="month"):c/(3*S.monthDuration)<=a?(this.interval=3,this.intervalType="month"):c/(6*S.monthDuration)<=a?(this.interval=6,this.intervalType="month"):(this.interval=c/(1*S.yearDuration)<=a?1:c/(2*S.yearDuration)<=a?2:c/(4*S.yearDuration)<=a?4:Math.floor(z.getNiceNumber(c/(a-1),!0)/S.yearDuration),this.intervalType="year"));if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=e-m/2;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum= +g+m/2;d?this.autoValueFormatString="MMM DD YYYY HH:mm":"year"===this.intervalType?this.autoValueFormatString="YYYY":"month"===this.intervalType?this.autoValueFormatString="MMM YYYY":"week"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"day"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"hour"===this.intervalType?this.autoValueFormatString="hh:mm TT":"minute"===this.intervalType?this.autoValueFormatString="hh:mm TT":"second"===this.intervalType?this.autoValueFormatString= +"hh:mm:ss TT":"millisecond"===this.intervalType&&(this.autoValueFormatString="fff'ms'");this.valueFormatString||(this.valueFormatString=this.autoValueFormatString)}else{this.intervalType="number";c=z.getNiceNumber(c,!1);this.interval=this.options&&0<this.options.interval?this.options.interval:z.getNiceNumber(c/(a-1),!0);if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval;if(null===this.viewportMaximum|| +isNaN(this.viewportMaximum))this.viewportMaximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval;0===this.viewportMaximum&&0===this.viewportMinimum&&(0===this.options.viewportMinimum?this.viewportMaximum+=10:0===this.options.viewportMaximum&&(this.viewportMinimum-=10),this.options&&"undefined"===typeof this.options.interval&&(this.interval=z.getNiceNumber((this.viewportMaximum-this.viewportMinimum)/(a-1),!0)))}if(null===this.minimum||null===this.maximum)if("axisX"===this.type?(e= +null!==this.minimum?this.minimum:this.dataInfo.min,g=null!==this.maximum?this.maximum:this.dataInfo.max,0===g-e&&(c="undefined"===typeof this.options.interval?0.4:this.options.interval,g+=c,e-=c),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1<g-e?0.5*Math.abs(g-e):1):"axisY"===this.type&&(e=null!==this.minimum?this.minimum:this.dataInfo.min,g=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(e)||isFinite(g)?0===e&&0===g?(g+=9,e=0):0===g-e?(c=Math.min(Math.abs(0.01*Math.abs(g)), +5),g+=c,e-=c):e>g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g,null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)):(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1<g-e?0.5*Math.abs(g-e):1,this.includeZero&&(null===this.minimum|| +isNaN(this.minimum))&&0<e&&(e=0),this.includeZero&&(null===this.maximum||isNaN(this.maximum))&&0>g&&(g=0)),Math.abs(this.getApparentDifference(e,g,null,!0)),"axisX"===this.type&&b){this.valueType="dateTime";if(null===this.minimum||isNaN(this.minimum))this.minimum=e-m/2;if(null===this.maximum||isNaN(this.maximum))this.maximum=g+m/2}else this.intervalType=this.valueType="number",null===this.minimum&&(this.minimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval,this.minimum=Math.min(this.minimum, +null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?Infinity:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval,this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?-Infinity:this.sessionVariables.viewportMaximum)),0===this.maximum&&0===this.minimum&&(0===this.options.minimum?this.maximum+=10:0=== +this.options.maximum&&(this.minimum-=10));u(this.sessionVariables.newViewportMinimum)&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));u(this.sessionVariables.newViewportMaximum)&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.range=this.viewportMaximum-this.viewportMinimum;this.intervalStartPosition="axisX"===this.type&&b?this.getLabelStartPoint(new Date(this.viewportMinimum),this.intervalType,this.interval):Math.floor((this.viewportMinimum+0.2*this.interval)/ +this.interval)*this.interval;this.valueFormatString||(this.valueFormatString=z.generateValueFormatString(this.range,2))}};z.prototype.calculateLogarithmicAxisParameters=function(){var a=this.chart.layoutManager.getFreeSpace(),d=Math.log(this.logarithmBase),b;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?500>this.maxWidth?7:Math.max(7,Math.floor(this.maxWidth/100)):Math.max(Math.floor(this.maxWidth/ +50),3),c,e,g,m;m=1;if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(m=0;m<this.scaleBreaks._appliedBreaks.length;m++)if((!u(this.sessionVariables.newViewportMinimum)&&this.sessionVariables.newViewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[m].startValue|| +!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue)&&(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue)){this.scaleBreaks._appliedBreaks.splice(m,1);break}"axisX"===this.type? +(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,1===e/c&&(m=Math.pow(this.logarithmBase,"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin, +e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,0>=c&&!isFinite(e)?(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1):0>=c?c=e:isFinite(e)||(e=c),1===c&&1===e?(e*=this.logarithmBase-1/this.logarithmBase,c=1):1===e/c?(m=Math.min(e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),e*=m,c/=m):c>e?(m=Math.min(c/e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase, +0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&1<c&&(c=1),this.includeZero&&(null===this.viewportMaximum||isNaN(this.viewportMaximum))&&1>e&&(e=1));m=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)/(isNaN(this.viewportMinimum)||null=== +this.viewportMinimum?c:this.viewportMinimum);var l=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)-(isNaN(this.viewportMinimum)||null===this.viewportMinimum?c:this.viewportMinimum);this.intervalType="number";m=Math.pow(this.logarithmBase,z.getNiceNumber(Math.abs(Math.log(m)/d),!1));this.options&&0<this.options.interval?this.interval=this.options.interval:(this.interval=z.getNiceExponent(Math.log(m)/d/(a-1),!0),b=z.getNiceNumber(l/(a-1),!0));if(null===this.viewportMinimum|| +isNaN(this.viewportMinimum))this.viewportMinimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval));if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum="axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval));1===this.viewportMaximum&&1===this.viewportMinimum&&(1===this.options.viewportMinimum?this.viewportMaximum*=this.logarithmBase-1/this.logarithmBase: +1===this.options.viewportMaximum&&(this.viewportMinimum/=this.logarithmBase-1/this.logarithmBase),this.options&&"undefined"===typeof this.options.interval&&(this.interval=z.getNiceExponent(Math.ceil(Math.log(m)/d)/(a-1)),b=z.getNiceNumber((this.viewportMaximum-this.viewportMinimum)/(a-1),!0)));if(null===this.minimum||null===this.maximum)"axisX"===this.type?(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,1===e/c&&(m=Math.pow(this.logarithmBase, +"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(c)||isFinite(e)?1===c&&1===e?(e*=this.logarithmBase,c/=this.logarithmBase):1===e/c?(m=Math.pow(this.logarithmBase,this.interval),e*=m,c/=m):c>e?(m= +Math.min(0.01*(c/e),5),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)):(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.minimum||isNaN(this.minimum))&&1<c&&(c=1),this.includeZero&&(null===this.maximum||isNaN(this.maximum))&& +1>e&&(e=1)),this.intervalType="number",null===this.minimum&&(this.minimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval)),this.minimum=Math.min(this.minimum,null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?"undefined"===typeof this.sessionVariables.newViewportMinimum?Infinity:this.sessionVariables.newViewportMinimum:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum= +"axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval)),this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?"undefined"===typeof this.sessionVariables.newViewportMaximum?0:this.sessionVariables.newViewportMaximum:this.sessionVariables.viewportMaximum)),1===this.maximum&&1===this.minimum&&(1===this.options.minimum?this.maximum*=this.logarithmBase-1/this.logarithmBase: +1===this.options.maximum&&(this.minimum/=this.logarithmBase-1/this.logarithmBase));this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum);this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum);this.viewportMinimum>this.viewportMaximum&&(!this.options.viewportMinimum&&!this.options.minimum||this.options.viewportMaximum||this.options.maximum?this.options.viewportMinimum||this.options.minimum||!this.options.viewportMaximum&&!this.options.maximum||(this.viewportMinimum=this.minimum= +(this.options.viewportMaximum||this.options.maximum)/Math.pow(this.logarithmBase,2*Math.ceil(this.interval))):this.viewportMaximum=this.maximum=this.options.viewportMinimum||this.options.minimum);c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval);this.range=this.viewportMaximum/this.viewportMinimum;this.noTicks=a;if(!this.options.interval&&this.range<Math.pow(this.logarithmBase,8>this.viewportMaximum||3>a?2:3)){for(d=Math.floor(this.viewportMinimum/ +b+0.5)*b;d<this.viewportMinimum;)d+=b;this.equidistantInterval=!1;this.intervalStartPosition=d;this.interval=b}else this.options.interval||(b=Math.ceil(this.interval),this.range>this.interval&&(this.interval=b,c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval))),this.equidistantInterval=!0,this.intervalStartPosition=c;if(!this.valueFormatString&&(this.valueFormatString="#,##0.##",1>this.viewportMinimum)){d=Math.floor(Math.abs(Math.log(this.viewportMinimum)/ +Math.LN10))+2;if(isNaN(d)||!isFinite(d))d=2;if(2<d)for(m=0;m<d-2;m++)this.valueFormatString+="#"}};z.generateValueFormatString=function(a,d){var b="#,##0.",c=d;1>a&&(c+=Math.floor(Math.abs(Math.log(a)/Math.LN10)),isNaN(c)||!isFinite(c))&&(c=d);for(var e=0;e<c;e++)b+="#";return b};z.getNiceExponent=function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=0>b?1>=c?1:5>=c?5:10:Math.max(Math.floor(c),1);return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.getNiceNumber= +function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=d?1.5>c?1:3>c?2:7>c?5:10:1>=c?1:2>=c?2:5>=c?5:10;return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.prototype.getLabelStartPoint=function(){var a=S[this.intervalType+"Duration"]*this.interval,a=new Date(Math.floor(this.viewportMinimum/a)*a);if("millisecond"!==this.intervalType)if("second"===this.intervalType)0<a.getMilliseconds()&&(a.setSeconds(a.getSeconds()+1),a.setMilliseconds(0));else if("minute"=== +this.intervalType){if(0<a.getSeconds()||0<a.getMilliseconds())a.setMinutes(a.getMinutes()+1),a.setSeconds(0),a.setMilliseconds(0)}else if("hour"===this.intervalType){if(0<a.getMinutes()||0<a.getSeconds()||0<a.getMilliseconds())a.setHours(a.getHours()+1),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)}else if("day"===this.intervalType){if(0<a.getHours()||0<a.getMinutes()||0<a.getSeconds()||0<a.getMilliseconds())a.setDate(a.getDate()+1),a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)}else if("week"=== +this.intervalType){if(0<a.getDay()||0<a.getHours()||0<a.getMinutes()||0<a.getSeconds()||0<a.getMilliseconds())a.setDate(a.getDate()+(7-a.getDay())),a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)}else if("month"===this.intervalType){if(1<a.getDate()||0<a.getHours()||0<a.getMinutes()||0<a.getSeconds()||0<a.getMilliseconds())a.setMonth(a.getMonth()+1),a.setDate(1),a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)}else"year"===this.intervalType&&(0<a.getMonth()||1< +a.getDate()||0<a.getHours()||0<a.getMinutes()||0<a.getSeconds()||0<a.getMilliseconds())&&(a.setFullYear(a.getFullYear()+1),a.setMonth(0),a.setDate(1),a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0));return a};qa(Q,V);qa(L,V);L.prototype.createUserOptions=function(a){if("undefined"!==typeof a||this.options._isPlaceholder){var d=0;this.parent.options._isPlaceholder&&this.parent.createUserOptions();this.options._isPlaceholder||(Fa(this.parent[this.optionsName]),d=this.parent.options[this.optionsName].indexOf(this.options)); +this.options="undefined"===typeof a?{}:a;this.parent.options[this.optionsName][d]=this.options}};L.prototype.render=function(a){if(0!==this.spacing||0!==this.options.lineThickness&&("undefined"!==typeof this.options.lineThickness||0!==this.parent.lineThickness)){var d=this.ctx,b=this.ctx.globalAlpha;this.ctx=a||this.ctx;this.ctx.save();this.ctx.beginPath();this.ctx.rect(this.chart.plotArea.x1,this.chart.plotArea.y1,this.chart.plotArea.width,this.chart.plotArea.height);this.ctx.clip();var c=this.scaleBreaks.parent.getPixelCoordinatesOnAxis(this.startValue), +e=this.scaleBreaks.parent.getPixelCoordinatesOnAxis(this.endValue);this.ctx.strokeStyle=this.lineColor;this.ctx.fillStyle=this.color;this.ctx.beginPath();this.ctx.globalAlpha=1;N(this.id);var g,m,l,k,h,p;a=Math.max(this.spacing,3);var q=Math.max(0,this.lineThickness);this.ctx.lineWidth=q;this.ctx.setLineDash&&this.ctx.setLineDash(R(this.lineDashType,q));if("bottom"===this.scaleBreaks.parent._position||"top"===this.scaleBreaks.parent._position)if(c=1===q%2?(c.x<<0)+0.5:c.x<<0,m=1===q%2?(e.x<<0)+0.5: +e.x<<0,"top"===this.scaleBreaks.parent._position?(e=this.chart.plotArea.y1,l=this.chart.plotArea.y2+q/2+0.5<<0):(e=this.chart.plotArea.y2,l=this.chart.plotArea.y1-q/2+0.5<<0,a*=-1),this.bounds={x1:c-q/2,y1:e,x2:m+q/2,y2:l},this.ctx.moveTo(c,e),"straight"===this.type||"top"===this.scaleBreaks.parent._position&&0>=a||"bottom"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(c,l),this.ctx.lineTo(m,l),this.ctx.lineTo(m,e);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(l-h)/a/3;for(var n=0;n<p;n++)this.ctx.bezierCurveTo(k+ +g*a,h+a,k+g*a,h+2*a,k,h+3*a),h+=3*a,g*=-1;this.ctx.bezierCurveTo(k+g*a,h+a,k+g*a,h+2*a,k,h+3*a);k=m;g*=-1;this.ctx.lineTo(k,h);for(n=0;n<p;n++)this.ctx.bezierCurveTo(k+g*a,h-a,k+g*a,h-2*a,k,h-3*a),h-=3*a,g*=-1}else{if("zigzag"===this.type){g=-1;h=e+a;k=c+a;p=(l-h)/a/2;for(n=0;n<p;n++)this.ctx.lineTo(k,h),k+=2*g*a,h+=2*a,g*=-1;this.ctx.lineTo(k,h);k+=m-c;for(n=0;n<p+1;n++)this.ctx.lineTo(k,h),k+=2*g*a,h-=2*a,g*=-1;this.ctx.lineTo(k+g*a,h+a)}}else if("left"===this.scaleBreaks.parent._position||"right"=== +this.scaleBreaks.parent._position)if(e=1===q%2?(e.y<<0)+0.5:e.y<<0,l=1===q%2?(c.y<<0)+0.5:c.y<<0,"left"===this.scaleBreaks.parent._position?(c=this.chart.plotArea.x1,m=this.chart.plotArea.x2+q/2+0.5<<0):(c=this.chart.plotArea.x2,m=this.chart.plotArea.x1-q/2+0.5<<0,a*=-1),this.bounds={x1:c,y1:e-q/2,x2:m,y2:l+q/2},this.ctx.moveTo(c,e),"straight"===this.type||"left"===this.scaleBreaks.parent._position&&0>=a||"right"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(m,e),this.ctx.lineTo(m,l), +this.ctx.lineTo(c,l);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(m-k)/a/3;for(n=0;n<p;n++)this.ctx.bezierCurveTo(k+a,h+g*a,k+2*a,h+g*a,k+3*a,h),k+=3*a,g*=-1;this.ctx.bezierCurveTo(k+a,h+g*a,k+2*a,h+g*a,k+3*a,h);h=l;g*=-1;this.ctx.lineTo(k,h);for(n=0;n<p;n++)this.ctx.bezierCurveTo(k-a,h+g*a,k-2*a,h+g*a,k-3*a,h),k-=3*a,g*=-1}else if("zigzag"===this.type){g=1;h=e-a;k=c+a;p=(m-k)/a/2;for(n=0;n<p;n++)this.ctx.lineTo(k,h),h+=2*g*a,k+=2*a,g*=-1;this.ctx.lineTo(k,h);h+=l-e;for(n=0;n<p+1;n++)this.ctx.lineTo(k, +h),h+=2*g*a,k-=2*a,g*=-1;this.ctx.lineTo(k+a,h+g*a)}0<q&&this.ctx.stroke();this.ctx.closePath();this.ctx.globalAlpha=this.fillOpacity;this.ctx.globalCompositeOperation="destination-over";this.ctx.fill();this.ctx.restore();this.ctx.globalAlpha=b;this.ctx=d}};qa(X,V);X.prototype.createUserOptions=function(a){if("undefined"!==typeof a||this.options._isPlaceholder){var d=0;this.parent.options._isPlaceholder&&this.parent.createUserOptions();this.options._isPlaceholder||(Fa(this.parent.stripLines),d=this.parent.options.stripLines.indexOf(this.options)); +this.options="undefined"===typeof a?{}:a;this.parent.options.stripLines[d]=this.options}};X.prototype.render=function(){this.ctx.save();var a=this.parent.getPixelCoordinatesOnAxis(this.value),d=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness);if(0<d){var b=null===this.opacity?1:this.opacity;this.ctx.strokeStyle=this.color;this.ctx.beginPath();var c=this.ctx.globalAlpha;this.ctx.globalAlpha=b;N(this.id);var e,g,m,l;this.ctx.lineWidth= +d;this.ctx.setLineDash&&this.ctx.setLineDash(R(this.lineDashType,d));if("bottom"===this.parent._position||"top"===this.parent._position)e=g=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,m=this.chart.plotArea.y1,l=this.chart.plotArea.y2,this.bounds={x1:e-d/2,y1:m,x2:g+d/2,y2:l};else if("left"===this.parent._position||"right"===this.parent._position)m=l=1===this.ctx.lineWidth%2?(a.y<<0)+0.5:a.y<<0,e=this.chart.plotArea.x1,g=this.chart.plotArea.x2,this.bounds={x1:e,y1:m-d/2,x2:g,y2:l+d/2};this.ctx.moveTo(e, +m);this.ctx.lineTo(g,l);this.ctx.stroke();this.ctx.globalAlpha=c}this.ctx.restore()};qa(fa,V);fa.prototype.render=function(a,d){var b,c,e,g,m=null,l=m=null,k="";if(!this.valueFormatString)if("dateTime"===this.parent.valueType)this.valueFormatString=this.parent.valueFormatString;else{var h=0,h="xySwapped"===this.chart.plotInfo.axisPlacement?50<this.parent.range?0:500<this.chart.width&&25>this.parent.range?2:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range? +1:0):50<this.parent.range?0:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range?1:0);this.valueFormatString=z.generateValueFormatString(this.parent.range,h)}var l=null===this.opacity?1:this.opacity,h=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness),p=this.chart.overlaidCanvasCtx,q=p.globalAlpha;p.globalAlpha=l;p.beginPath();p.strokeStyle=this.color;p.lineWidth=h;p.save();this.labelFontSize= +u(this.options.labelFontSize)?this.parent.labelFontSize:this.labelFontSize;if("left"===this.parent._position||"right"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?this.parent.bounds.x2-this.parent.bounds.x1:this.labelMaxWidth,this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?3*this.chart.height:2*this.labelFontSize;else if("top"===this.parent._position||"bottom"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?3*this.chart.width:this.labelMaxWidth, +this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?this.parent.bounds.height:2*this.labelFontSize;0<h&&p.setLineDash&&p.setLineDash(R(this.lineDashType,h));l=new ka(p,{x:0,y:0,padding:{top:2,right:3,bottom:2,left:4},backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxWidth:this.labelMaxWidth,maxHeight:this.labelMaxHeight,angle:this.labelAngle,text:k,horizontalAlign:"left",fontSize:this.labelFontSize, +fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"});if(this.snapToDataPoint){var n=0,m=[];if("xySwapped"===this.chart.plotInfo.axisPlacement){var f=null;if("bottom"===this.parent._position||"top"===this.parent._position)n=this.parent.dataSeries[0].axisX.convertPixelToValue({y:d});else if("left"===this.parent._position||"right"===this.parent._position)n=this.parent.convertPixelToValue({y:d});for(var r=0;r< +this.parent.dataSeries.length;r++)(f=this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&&(f.dataSeries=this.parent.dataSeries[r],null!==f.dataPoint.y&&m.push(f));f=null;if(0===m.length)return;m.sort(function(a,b){return a.distance-b.distance});f=Math.abs(a-this.parent.convertValueToPixel(m[0].dataPoint.y));r=0;if("rangeBar"===m[0].dataSeries.type||"error"===m[0].dataSeries.type)for(var f=Math.abs(a-this.parent.convertValueToPixel(m[r].dataPoint.y[0])),v=0,n=0;n<m.length;n++)if(m[n].dataPoint.y&& +m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(a-this.parent.convertValueToPixel(m[n].dataPoint.y[k])),v<f&&(f=v,r=n);else v=Math.abs(a-this.parent.convertValueToPixel(m[n].dataPoint.y)),v<f&&(f=v,r=n);else if("stackedBar"===m[0].dataSeries.type)for(var f=Math.abs(a-this.parent.convertValueToPixel(m[0].dataPoint.y)),D=v=0,n=r=0;n<m.length;n++)if(m[n].dataPoint.y&&m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(a-this.parent.convertValueToPixel(m[n].dataPoint.y[k])), +v<f&&(f=v,r=n);else D+=m[n].dataPoint.y,v=Math.abs(a-this.parent.convertValueToPixel(D)),v<f&&(f=v,r=n);else if("stackedBar100"===m[0].dataSeries.type)for(var f=Math.abs(a-this.parent.convertValueToPixel(m[0].dataPoint.y)),t=D=v=0,n=0;n<m.length;n++)if(m[n].dataPoint.y&&m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(a-this.parent.convertValueToPixel(m[n].dataPoint.y[k])),v<f&&(f=v,r=n);else D+=m[n].dataPoint.y,t=m[n].dataPoint.x.getTime?m[n].dataPoint.x.getTime():m[n].dataPoint.x, +t=100*(D/m[n].dataSeries.plotUnit.dataPointYSums[t]),v=Math.abs(a-this.parent.convertValueToPixel(t)),v<f&&(f=v,r=n);else for(f=Math.abs(a-this.parent.convertValueToPixel(m[0].dataPoint.y)),n=r=v=0;n<m.length;n++)if(m[n].dataPoint.y&&m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(a-this.parent.convertValueToPixel(m[n].dataPoint.y[k])),v<f&&(f=v,r=n);else v=Math.abs(a-this.parent.convertValueToPixel(m[n].dataPoint.y)),v<f&&(f=v,r=n);k=m[r];if("bottom"===this.parent._position|| +"top"===this.parent._position){b=0;if("rangeBar"===this.parent.dataSeries[r].type||"error"===this.parent.dataSeries[r].type){f=Math.abs(a-this.parent.convertValueToPixel(k.dataPoint.y[0]));for(n=v=0;n<k.dataPoint.y.length;n++)v=Math.abs(a-this.parent.convertValueToPixel(k.dataPoint.y[n])),v<f&&(f=v,b=n);m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataPoint.y[b])<<0)+0.5:this.parent.convertValueToPixel(k.dataPoint.y[b])<<0;l.text=this.labelFormatter?this.labelFormatter({chart:this.chart, +axis:this.parent.options,crosshair:this.options,value:k.dataPoint.y[b]}):u(this.options.label)?ba(k.dataPoint.y[b],this.valueFormatString,this.chart._cultureInfo):this.label}else if("stackedBar"===this.parent.dataSeries[r].type){f=Math.abs(a-this.parent.convertValueToPixel(m[0].dataPoint.y));D=v=0;for(n=r;0<=n;n--)D+=m[n].dataPoint.y,v=Math.abs(a-this.parent.convertValueToPixel(D)),v<f&&(f=v,b=n);m=1===p.lineWidth%2?(this.parent.convertValueToPixel(D)<<0)+0.5:this.parent.convertValueToPixel(D)<<0; +l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.y}):u(this.options.label)?ba(k.dataPoint.y,this.valueFormatString,this.chart._cultureInfo):this.label}else if("stackedBar100"===this.parent.dataSeries[r].type){f=Math.abs(a-this.parent.convertValueToPixel(m[0].dataPoint.y));t=D=v=0;for(n=r;0<=n;n--)D+=m[n].dataPoint.y,t=m[n].dataPoint.x.getTime?m[n].dataPoint.x.getTime():m[n].dataPoint.x,t=100*(D/m[n].dataSeries.plotUnit.dataPointYSums[t]), +v=Math.abs(a-this.parent.convertValueToPixel(t)),v<f&&(f=v,b=n);m=1===p.lineWidth%2?(this.parent.convertValueToPixel(t)<<0)+0.5:this.parent.convertValueToPixel(t)<<0;l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:t}):u(this.options.label)?ba(t,this.valueFormatString,this.chart._cultureInfo):this.label}else m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataPoint.y)<<0)+0.5:this.parent.convertValueToPixel(k.dataPoint.y)<< +0,l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.y}):u(this.options.label)?ba(k.dataPoint.y,this.valueFormatString,this.chart._cultureInfo):this.label;b=c=m;e=this.chart.plotArea.y1;g=this.chart.plotArea.y2;this.bounds={x1:b-h/2,y1:e,x2:c+h/2,y2:g};l.x=b-l.measureText().width/2;l.x+l.width>this.chart.bounds.x2?l.x=this.chart.bounds.x2-l.width:l.x<this.chart.bounds.x1&&(l.x=this.chart.bounds.x1);l.y=this.parent.lineCoordinates.y2+ +l.fontSize/2+2}else if("left"===this.parent._position||"right"===this.parent._position){e=g=m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataPoint.x)<<0)+0.5:this.parent.convertValueToPixel(k.dataPoint.x)<<0;b=this.chart.plotArea.x1;c=this.chart.plotArea.x2;this.bounds={x1:b,y1:e-h/2,x2:c,y2:g+h/2};t=!1;if(this.parent.labels)for(m=Math.ceil(this.parent.interval),n=0;n<this.parent.viewportMaximum;n+=m)if(this.parent.labels[n])t=!0;else{t=!1;break}if(t){if("axisX"===this.parent.type)for(n= +this.parent.convertPixelToValue({y:d}),f=null,r=0;r<this.parent.dataSeries.length;r++)(f=this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.x}):u(this.options.label)?f.dataPoint.label:this.label)}else"dateTime"===this.parent.valueType?l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.x}): +u(this.options.label)?Ca(k.dataPoint.x,this.valueFormatString,this.chart._cultureInfo):this.label:"number"===this.parent.valueType&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.x}):u(this.options.label)?ba(k.dataPoint.x,this.valueFormatString,this.chart._cultureInfo):this.label);l.y=g+l.fontSize/2-l.measureText().height/2+2;l.y-l.fontSize/2<this.chart.bounds.y1?l.y=this.chart.bounds.y1+l.fontSize/2+2:l.y+l.measureText().height- +l.fontSize/2>this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}}else if("bottom"===this.parent._position||"top"===this.parent._position){n=this.parent.convertPixelToValue({x:a});for(r=0;r<this.parent.dataSeries.length;r++)(f=this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&&(f.dataSeries=this.parent.dataSeries[r], +null!==f.dataPoint.y&&m.push(f));if(0===m.length)return;m.sort(function(a,b){return a.distance-b.distance});k=m[0];b=c=m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataPoint.x)<<0)+0.5:this.parent.convertValueToPixel(k.dataPoint.x)<<0;e=this.chart.plotArea.y1;g=this.chart.plotArea.y2;this.bounds={x1:b-h/2,y1:e,x2:c+h/2,y2:g};t=!1;if(this.parent.labels)for(m=Math.ceil(this.parent.interval),n=0;n<this.parent.viewportMaximum;n+=m)if(this.parent.labels[n])t=!0;else{t=!1;break}if(t){if("axisX"=== +this.parent.type)for(n=this.parent.convertPixelToValue({x:a}),f=null,r=0;r<this.parent.dataSeries.length;r++)(f=this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.x}):u(this.options.label)?f.dataPoint.label:this.label)}else"dateTime"===this.parent.valueType?l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options, +value:k.dataPoint.x}):u(this.options.label)?Ca(k.dataPoint.x,this.valueFormatString,this.chart._cultureInfo):this.label:"number"===this.parent.valueType&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.x}):u(this.options.label)?ba(k.dataPoint.x,this.valueFormatString,this.chart._cultureInfo):this.label);l.x=b-l.measureText().width/2;l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.x<this.chart.bounds.x1&& +(l.x=this.chart.bounds.x1);"bottom"===this.parent._position?l.y=this.parent.lineCoordinates.y2+l.fontSize/2+2:"top"===this.parent._position&&(l.y=this.parent.lineCoordinates.y1-l.height+l.fontSize/2+2)}else if("left"===this.parent._position||"right"===this.parent._position){!u(this.parent.dataSeries)&&0<this.parent.dataSeries.length&&(n=this.parent.dataSeries[0].axisX.convertPixelToValue({x:a}));for(r=0;r<this.parent.dataSeries.length;r++)(f=this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&& +(f.dataSeries=this.parent.dataSeries[r],null!==f.dataPoint.y&&m.push(f));if(0===m.length)return;m.sort(function(a,b){return a.distance-b.distance});r=0;if("rangeColumn"===m[0].dataSeries.type||"rangeArea"===m[0].dataSeries.type||"error"===m[0].dataSeries.type||"rangeSplineArea"===m[0].dataSeries.type||"candlestick"===m[0].dataSeries.type||"ohlc"===m[0].dataSeries.type||"boxAndWhisker"===m[0].dataSeries.type)for(f=Math.abs(d-this.parent.convertValueToPixel(m[0].dataPoint.y[0])),n=v=0;n<m.length;n++)if(m[n].dataPoint.y&& +m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(d-this.parent.convertValueToPixel(m[n].dataPoint.y[k])),v<f&&(f=v,r=n);else v=Math.abs(d-this.parent.convertValueToPixel(m[n].dataPoint.y)),v<f&&(f=v,r=n);else if("stackedColumn"===m[0].dataSeries.type||"stackedArea"===m[0].dataSeries.type)for(f=Math.abs(d-this.parent.convertValueToPixel(m[0].dataPoint.y)),n=D=v=0;n<m.length;n++)if(m[n].dataPoint.y&&m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(d-this.parent.convertValueToPixel(m[n].dataPoint.y[k])), +v<f&&(f=v,r=n);else D+=m[n].dataPoint.y,v=Math.abs(d-this.parent.convertValueToPixel(D)),v<f&&(f=v,r=n);else if("stackedColumn100"===m[0].dataSeries.type||"stackedArea100"===m[0].dataSeries.type)for(f=Math.abs(d-this.parent.convertValueToPixel(m[0].dataPoint.y)),n=t=D=v=0;n<m.length;n++)if(m[n].dataPoint.y&&m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(d-this.parent.convertValueToPixel(m[n].dataPoint.y[k])),v<f&&(f=v,r=n);else D+=m[n].dataPoint.y,t=m[n].dataPoint.x.getTime? +m[n].dataPoint.x.getTime():m[n].dataPoint.x,t=100*(D/m[n].dataSeries.plotUnit.dataPointYSums[t]),v=Math.abs(d-this.parent.convertValueToPixel(t)),v<f&&(f=v,r=n);else for(f=Math.abs(d-this.parent.convertValueToPixel(m[0].dataPoint.y)),n=v=0;n<m.length;n++)if(m[n].dataPoint.y&&m[n].dataPoint.y.length)for(k=0;k<m[n].dataPoint.y.length;k++)v=Math.abs(d-this.parent.convertValueToPixel(m[n].dataPoint.y[k])),v<f&&(f=v,r=n);else v=Math.abs(d-this.parent.convertValueToPixel(m[n].dataPoint.y)),v<f&&(f=v,r= +n);k=m[r];b=0;if("rangeColumn"===this.parent.dataSeries[r].type||"rangeArea"===this.parent.dataSeries[r].type||"error"===this.parent.dataSeries[r].type||"rangeSplineArea"===this.parent.dataSeries[r].type||"candlestick"===this.parent.dataSeries[r].type||"ohlc"===this.parent.dataSeries[r].type||"boxAndWhisker"===this.parent.dataSeries[r].type){f=Math.abs(d-this.parent.convertValueToPixel(k.dataPoint.y[0]));for(n=v=0;n<k.dataPoint.y.length;n++)v=Math.abs(d-this.parent.convertValueToPixel(k.dataPoint.y[n])), +v<f&&(f=v,b=n);m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataPoint.y[b])<<0)+0.5:this.parent.convertValueToPixel(k.dataPoint.y[b])<<0;l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.y[b]}):u(this.options.label)?ba(k.dataPoint.y[b],this.valueFormatString,this.chart._cultureInfo):this.label}else if("stackedColumn"===this.parent.dataSeries[r].type||"stackedArea"===this.parent.dataSeries[r].type){f=Math.abs(d- +this.parent.convertValueToPixel(m[0].dataPoint.y));D=v=0;for(n=r;0<=n;n--)D+=m[n].dataPoint.y,v=Math.abs(d-this.parent.convertValueToPixel(D)),v<f&&(f=v,b=n);m=1===p.lineWidth%2?(this.parent.convertValueToPixel(D)<<0)+0.5:this.parent.convertValueToPixel(D)<<0;l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.y}):u(this.options.label)?ba(k.dataPoint.y,this.valueFormatString,this.chart._cultureInfo):this.label}else if("stackedColumn100"=== +this.parent.dataSeries[r].type||"stackedArea100"===this.parent.dataSeries[r].type){f=Math.abs(d-this.parent.convertValueToPixel(m[0].dataPoint.y));D=v=0;for(n=r;0<=n;n--)D+=m[n].dataPoint.y,t=m[n].dataPoint.x.getTime?m[n].dataPoint.x.getTime():m[n].dataPoint.x,t=100*(D/m[n].dataSeries.plotUnit.dataPointYSums[t]),v=Math.abs(d-this.parent.convertValueToPixel(t)),v<f&&(f=v,b=n);m=1===p.lineWidth%2?(this.parent.convertValueToPixel(t)<<0)+0.5:this.parent.convertValueToPixel(t)<<0;l.text=this.labelFormatter? +this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:t}):u(this.options.label)?ba(t,this.valueFormatString,this.chart._cultureInfo):this.label}else"waterfall"===this.parent.dataSeries[r].type?(m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataSeries.dataPointEOs[k.index].cumulativeSum)<<0)+0.5:this.parent.convertValueToPixel(k.dataSeries.dataPointEOs[k.index].cumulativeSum)<<0,l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options, +crosshair:this.options,value:k.dataSeries.dataPointEOs[k.index].cumulativeSum}):u(this.options.label)?ba(k.dataSeries.dataPointEOs[k.index].cumulativeSum,this.valueFormatString,this.chart._cultureInfo):this.label):(m=1===p.lineWidth%2?(this.parent.convertValueToPixel(k.dataPoint.y)<<0)+0.5:this.parent.convertValueToPixel(k.dataPoint.y)<<0,l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:k.dataPoint.y}):u(this.options.label)?ba(k.dataPoint.y, +this.valueFormatString,this.chart._cultureInfo):this.label);e=g=m;b=this.chart.plotArea.x1;c=this.chart.plotArea.x2;this.bounds={x1:b,y1:e-h/2,x2:c,y2:g+h/2};l.y=g+l.fontSize/2-l.measureText().height/2+2;l.y-l.fontSize/2<this.chart.bounds.y1?l.y=this.chart.bounds.y1+l.fontSize/2+2:l.y+l.measureText().height-l.fontSize/2>this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"=== +this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}m=null;("bottom"===this.parent._position||"top"===this.parent._position)&&(b>=this.parent.convertValueToPixel(this.parent.viewportMinimum)&&c<=this.parent.convertValueToPixel(this.parent.viewportMaximum))&&(0<h&&(p.moveTo(b,e),p.lineTo(c,g),p.stroke()),p.restore(),!u(l.text)&&("number"===typeof l.text.valueOf()||0<l.text.length)&&l.render(!0));("left"===this.parent._position||"right"===this.parent._position)&&(g>=this.parent.convertValueToPixel(this.parent.viewportMaximum)&& +e<=this.parent.convertValueToPixel(this.parent.viewportMinimum))&&(0<h&&(p.moveTo(b,e),p.lineTo(c,g),p.stroke()),p.restore(),!u(l.text)&&("number"===typeof l.text.valueOf()||0<l.text.length)&&l.render(!0))}else{if("bottom"===this.parent._position||"top"===this.parent._position)b=c=m=1===p.lineWidth%2?(a<<0)+0.5:a<<0,e=this.chart.plotArea.y1,g=this.chart.plotArea.y2,this.bounds={x1:b-h/2,y1:e,x2:c+h/2,y2:g};else if("left"===this.parent._position||"right"===this.parent._position)e=g=m=1===p.lineWidth% +2?(d<<0)+0.5:d<<0,b=this.chart.plotArea.x1,c=this.chart.plotArea.x2,this.bounds={x1:b,y1:e-h/2,x2:c,y2:g+h/2};if("xySwapped"===this.chart.plotInfo.axisPlacement)if("left"===this.parent._position||"right"===this.parent._position){t=!1;if(this.parent.labels)for(m=Math.ceil(this.parent.interval),n=0;n<this.parent.viewportMaximum;n+=m)if(this.parent.labels[n])t=!0;else{t=!1;break}if(t){if("axisX"===this.parent.type)for(n=this.parent.convertPixelToValue({y:d}),f=null,r=0;r<this.parent.dataSeries.length;r++)(f= +this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)?f.dataPoint.label:this.label)}else"dateTime"===this.parent.valueType?l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(d)}):u(this.options.label)?Ca(this.parent.convertPixelToValue(d), +this.valueFormatString,this.chart._cultureInfo):this.label:"number"===this.parent.valueType&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(d)}):u(this.options.label)?ba(this.parent.convertPixelToValue(d),this.valueFormatString,this.chart._cultureInfo):this.label);l.y=d+l.fontSize/2-l.measureText().height/2+2;l.y-l.fontSize/2<this.chart.bounds.y1?l.y=this.chart.bounds.y1+l.fontSize/2+2:l.y+l.measureText().height- +l.fontSize/2>this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x1-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}else{if("bottom"===this.parent._position||"top"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)? +ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label,l.x=b-l.measureText().width/2,l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width),l.x<this.chart.bounds.x1&&(l.x=this.chart.bounds.x1),"bottom"===this.parent._position&&(l.y=this.parent.lineCoordinates.y2+l.fontSize/2+2),"top"===this.parent._position&&(l.y=this.parent.lineCoordinates.y1-l.height+l.fontSize/2+2)}else if("bottom"===this.parent._position||"top"===this.parent._position){t= +!1;k="";if(this.parent.labels)for(m=Math.ceil(this.parent.interval),n=0;n<this.parent.viewportMaximum;n+=m)if(this.parent.labels[n])t=!0;else{t=!1;break}if(t){if("axisX"===this.parent.type)for(n=this.parent.convertPixelToValue({x:a}),f=null,r=0;r<this.parent.dataSeries.length;r++)(f=this.parent.dataSeries[r].getDataPointAtX(n,!0))&&0<=f.index&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}): +u(this.options.label)?f.dataPoint.label:this.label)}else"dateTime"===this.parent.valueType?l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)?Ca(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label:"number"===this.parent.valueType&&(l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options, +value:0<this.parent.dataSeries.length?this.parent.convertPixelToValue(a):""}):u(this.options.label)?ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label);l.x=b-l.measureText().width/2;l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.x<this.chart.bounds.x1&&(l.x=this.chart.bounds.x1);"bottom"===this.parent._position?l.y=this.parent.lineCoordinates.y2+l.fontSize/2+2:"top"===this.parent._position&&(l.y=this.parent.lineCoordinates.y1-l.height+ +l.fontSize/2+2)}else if("left"===this.parent._position||"right"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(d)}):u(this.options.label)?ba(this.parent.convertPixelToValue(d),this.valueFormatString,this.chart._cultureInfo):this.label,l.y=d+l.fontSize/2-l.measureText().height/2+2,l.y-l.fontSize/2<this.chart.bounds.y1?l.y=this.chart.bounds.y1+l.fontSize/2+2:l.y+l.measureText().height- +l.fontSize/2>this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2),"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2);0<h&&(p.moveTo(b,e),p.lineTo(c,g),p.stroke());p.restore();!u(l.text)&&("number"===typeof l.text.valueOf()||0<l.text.length)&&l.render(!0)}p.globalAlpha=q};qa($,V);$.prototype._initialize=function(){if(this.enabled){this.container=document.createElement("div"); +this.container.setAttribute("class","canvasjs-chart-tooltip");this.container.style.position="absolute";this.container.style.height="auto";this.container.style.boxShadow="1px 1px 2px 2px rgba(0,0,0,0.1)";this.container.style.zIndex="1000";this.container.style.pointerEvents="none";this.container.style.display="none";var a;a='<div style=" width: auto;height: auto;min-width: 50px;';a+="line-height: auto;";a+="margin: 0px 0px 0px 0px;";a+="padding: 5px;";a+="font-family: Calibri, Arial, Georgia, serif;"; +a+="font-weight: normal;";a+="font-style: "+(r?"italic;":"normal;");a+="font-size: 14px;";a+="color: #000000;";a+="text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1);";a+="text-align: left;";a+="border: 2px solid gray;";a+=r?"background: rgba(255,255,255,.9);":"background: rgb(255,255,255);";a+="text-indent: 0px;";a+="white-space: nowrap;";a+="border-radius: 5px;";a+="-moz-user-select:none;";a+="-khtml-user-select: none;";a+="-webkit-user-select: none;";a+="-ms-user-select: none;";a+="user-select: none;"; +r||(a+="filter: alpha(opacity = 90);",a+="filter: progid:DXImageTransform.Microsoft.Shadow(Strength=3, Direction=135, Color='#666666');");a+='} "> Sample Tooltip</div>';this.container.innerHTML=a;this.contentDiv=this.container.firstChild;this.container.style.borderRadius=this.contentDiv.style.borderRadius;this.chart._canvasJSContainer.appendChild(this.container)}};$.prototype.mouseMoveHandler=function(a,d){this._lastUpdated&&4>(new Date).getTime()-this._lastUpdated||(this._lastUpdated=(new Date).getTime(), +this.chart.resetOverlayedCanvas(),this._updateToolTip(a,d))};$.prototype._updateToolTip=function(a,d,b){b="undefined"===typeof b?!0:b;this.container||this._initialize();this.enabled||this.hide();if(!this.chart.disableToolTip){if("undefined"===typeof a||"undefined"===typeof d){if(isNaN(this._prevX)||isNaN(this._prevY))return;a=this._prevX;d=this._prevY}else this._prevX=a,this._prevY=d;var c=null,e=null,g=[],k=0;if(this.shared&&this.enabled&&"none"!==this.chart.plotInfo.axisPlacement){if("xySwapped"=== +this.chart.plotInfo.axisPlacement){var l=[];if(this.chart.axisX)for(var p=0;p<this.chart.axisX.length;p++){for(var k=this.chart.axisX[p].convertPixelToValue({y:d}),h=null,c=0;c<this.chart.axisX[p].dataSeries.length;c++)(h=this.chart.axisX[p].dataSeries[c].getDataPointAtX(k,b))&&0<=h.index&&(h.dataSeries=this.chart.axisX[p].dataSeries[c],null!==h.dataPoint.y&&l.push(h));h=null}if(this.chart.axisX2)for(p=0;p<this.chart.axisX2.length;p++){k=this.chart.axisX2[p].convertPixelToValue({y:d});h=null;for(c= +0;c<this.chart.axisX2[p].dataSeries.length;c++)(h=this.chart.axisX2[p].dataSeries[c].getDataPointAtX(k,b))&&0<=h.index&&(h.dataSeries=this.chart.axisX2[p].dataSeries[c],null!==h.dataPoint.y&&l.push(h));h=null}}else{l=[];if(this.chart.axisX)for(p=0;p<this.chart.axisX.length;p++)for(k=this.chart.axisX[p].convertPixelToValue({x:a}),h=null,c=0;c<this.chart.axisX[p].dataSeries.length;c++)(h=this.chart.axisX[p].dataSeries[c].getDataPointAtX(k,b))&&0<=h.index&&(h.dataSeries=this.chart.axisX[p].dataSeries[c], +null!==h.dataPoint.y&&l.push(h));if(this.chart.axisX2)for(p=0;p<this.chart.axisX2.length;p++)for(k=this.chart.axisX2[p].convertPixelToValue({x:a}),h=null,c=0;c<this.chart.axisX2[p].dataSeries.length;c++)(h=this.chart.axisX2[p].dataSeries[c].getDataPointAtX(k,b))&&0<=h.index&&(h.dataSeries=this.chart.axisX2[p].dataSeries[c],null!==h.dataPoint.y&&l.push(h))}if(0===l.length)return;l.sort(function(a,b){return a.distance-b.distance});b=l[0];for(c=0;c<l.length;c++)l[c].dataPoint.x.valueOf()===b.dataPoint.x.valueOf()&& +g.push(l[c]);l=null}else{if(h=this.chart.getDataPointAtXY(a,d,b))this.currentDataPointIndex=h.dataPointIndex,this.currentSeriesIndex=h.dataSeries.index;else if(r)if(h=ab(a,d,this.chart._eventManager.ghostCtx),0<h&&"undefined"!==typeof this.chart._eventManager.objectMap[h]){h=this.chart._eventManager.objectMap[h];if("legendItem"===h.objectType)return;this.currentSeriesIndex=h.dataSeriesIndex;this.currentDataPointIndex=0<=h.dataPointIndex?h.dataPointIndex:-1}else this.currentDataPointIndex=-1;else this.currentDataPointIndex= +-1;if(0<=this.currentSeriesIndex){e=this.chart.data[this.currentSeriesIndex];h={};if(0<=this.currentDataPointIndex)c=e.dataPoints[this.currentDataPointIndex],h.dataSeries=e,h.dataPoint=c,h.index=this.currentDataPointIndex,h.distance=Math.abs(c.x-k),"waterfall"===e.type&&(h.cumulativeSumYStartValue=e.dataPointEOs[this.currentDataPointIndex].cumulativeSumYStartValue,h.cumulativeSum=e.dataPointEOs[this.currentDataPointIndex].cumulativeSum);else{if(!this.enabled||"line"!==e.type&&"stepLine"!==e.type&& +"spline"!==e.type&&"area"!==e.type&&"stepArea"!==e.type&&"splineArea"!==e.type&&"stackedArea"!==e.type&&"stackedArea100"!==e.type&&"rangeArea"!==e.type&&"rangeSplineArea"!==e.type&&"candlestick"!==e.type&&"ohlc"!==e.type&&"boxAndWhisker"!==e.type)return;k=e.axisX.convertPixelToValue({x:a});h=e.getDataPointAtX(k,b);h.dataSeries=e;this.currentDataPointIndex=h.index;c=h.dataPoint}if(!u(h.dataPoint.y))if(h.dataSeries.axisY)if(0<h.dataPoint.y.length){for(c=b=0;c<h.dataPoint.y.length;c++)h.dataPoint.y[c]< +h.dataSeries.axisY.viewportMinimum?b--:h.dataPoint.y[c]>h.dataSeries.axisY.viewportMaximum&&b++;b<h.dataPoint.y.length&&b>-h.dataPoint.y.length&&g.push(h)}else"column"===e.type||"bar"===e.type?0>h.dataPoint.y?0>h.dataSeries.axisY.viewportMinimum&&h.dataSeries.axisY.viewportMaximum>=h.dataPoint.y&&g.push(h):h.dataSeries.axisY.viewportMinimum<=h.dataPoint.y&&0<=h.dataSeries.axisY.viewportMaximum&&g.push(h):"bubble"===e.type?(b=this.chart._eventManager.objectMap[e.dataPointIds[h.index]].size/2,h.dataPoint.y>= +h.dataSeries.axisY.viewportMinimum-b&&h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum+b&&g.push(h)):"waterfall"===e.type?(b=0,h.cumulativeSumYStartValue<h.dataSeries.axisY.viewportMinimum?b--:h.cumulativeSumYStartValue>h.dataSeries.axisY.viewportMaximum&&b++,h.cumulativeSum<h.dataSeries.axisY.viewportMinimum?b--:h.cumulativeSum>h.dataSeries.axisY.viewportMaximum&&b++,2>b&&-2<b&&g.push(h)):(0<=h.dataSeries.type.indexOf("100")||"stackedColumn"===e.type||"stackedBar"===e.type||h.dataPoint.y>=h.dataSeries.axisY.viewportMinimum&& +h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum)&&g.push(h);else g.push(h)}}if(0<g.length&&(this.highlightObjects(g),this.enabled))if(b="",b=this.getToolTipInnerHTML({entries:g}),null!==b){this.contentDiv.innerHTML=b;b=!1;"none"===this.container.style.display&&(b=!0,this.container.style.display="block");try{this.contentDiv.style.background=this.backgroundColor?this.backgroundColor:r?"rgba(255,255,255,.9)":"rgb(255,255,255)",this.borderColor="waterfall"===g[0].dataSeries.type?this.contentDiv.style.borderRightColor= +this.contentDiv.style.borderLeftColor=this.contentDiv.style.borderColor=this.options.borderColor?this.options.borderColor:g[0].dataPoint.color?g[0].dataPoint.color:0<g[0].dataPoint.y?g[0].dataSeries.risingColor:g[0].dataSeries.fallingColor:"error"===g[0].dataSeries.type?this.contentDiv.style.borderRightColor=this.contentDiv.style.borderLeftColor=this.contentDiv.style.borderColor=this.options.borderColor?this.options.borderColor:g[0].dataSeries.color?g[0].dataSeries.color:g[0].dataSeries._colorSet[e.index% +g[0].dataSeries._colorSet.length]:this.contentDiv.style.borderRightColor=this.contentDiv.style.borderLeftColor=this.contentDiv.style.borderColor=this.options.borderColor?this.options.borderColor:g[0].dataPoint.color?g[0].dataPoint.color:g[0].dataSeries.color?g[0].dataSeries.color:g[0].dataSeries._colorSet[g[0].index%g[0].dataSeries._colorSet.length],this.contentDiv.style.borderWidth=this.borderThickness||0===this.borderThickness?this.borderThickness+"px":"2px",this.contentDiv.style.borderRadius=this.cornerRadius|| +0===this.cornerRadius?this.cornerRadius+"px":"5px",this.container.style.borderRadius=this.contentDiv.style.borderRadius,this.contentDiv.style.fontSize=this.fontSize||0===this.fontSize?this.fontSize+"px":"14px",this.contentDiv.style.color=this.fontColor?this.fontColor:"#000000",this.contentDiv.style.fontFamily=this.fontFamily?this.fontFamily:"Calibri, Arial, Georgia, serif;",this.contentDiv.style.fontWeight=this.fontWeight?this.fontWeight:"normal",this.contentDiv.style.fontStyle=this.fontStyle?this.fontStyle: +r?"italic":"normal"}catch(s){}"pie"===g[0].dataSeries.type||"doughnut"===g[0].dataSeries.type||"funnel"===g[0].dataSeries.type||"pyramid"===g[0].dataSeries.type||"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"===g[0].dataSeries.type?a=a-10-this.container.clientWidth:(a=g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x)-this.container.clientWidth<<0,a-=10);0>a&&(a+=this.container.clientWidth+20);a+this.container.clientWidth> +Math.max(this.chart.container.clientWidth,this.chart.width)&&(a=Math.max(0,Math.max(this.chart.container.clientWidth,this.chart.width)-this.container.clientWidth));d=1!==g.length||this.shared||"line"!==g[0].dataSeries.type&&"stepLine"!==g[0].dataSeries.type&&"spline"!==g[0].dataSeries.type&&"area"!==g[0].dataSeries.type&&"stepArea"!==g[0].dataSeries.type&&"splineArea"!==g[0].dataSeries.type?"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"=== +g[0].dataSeries.type?g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x):d:g[0].dataSeries.axisY.convertValueToPixel(g[0].dataPoint.y);d=-d+10;0<d+this.container.clientHeight+5&&(d-=d+this.container.clientHeight+5-0);this.fixMozTransitionDelay(a,d);!this.animationEnabled||b?this.disableAnimation():(this.enableAnimation(),this.container.style.MozTransition=this.mozContainerTransition);this.container.style.left=a+"px";this.container.style.bottom=d+"px"}else this.hide(!1)}};$.prototype.highlightObjects= +function(a){var d=this.chart.overlaidCanvasCtx;this.chart.resetOverlayedCanvas();d.clearRect(0,0,this.chart.width,this.chart.height);d.save();var b=this.chart.plotArea,c=0;d.beginPath();d.rect(b.x1,b.y1,b.x2-b.x1,b.y2-b.y1);d.clip();for(b=0;b<a.length;b++){var e=a[b];if((e=this.chart._eventManager.objectMap[e.dataSeries.dataPointIds[e.index]])&&e.objectType&&"dataPoint"===e.objectType){var c=this.chart.data[e.dataSeriesIndex],g=c.dataPoints[e.dataPointIndex],k=e.dataPointIndex;!1===g.highlightEnabled|| +!0!==c.highlightEnabled&&!0!==g.highlightEnabled||("line"===c.type||"stepLine"===c.type||"spline"===c.type||"scatter"===c.type||"area"===c.type||"stepArea"===c.type||"splineArea"===c.type||"stackedArea"===c.type||"stackedArea100"===c.type||"rangeArea"===c.type||"rangeSplineArea"===c.type?(g=c.getMarkerProperties(k,e.x1,e.y1,this.chart.overlaidCanvasCtx),g.size=Math.max(1.5*g.size<<0,10),g.borderColor=g.borderColor||"#FFFFFF",g.borderThickness=g.borderThickness||Math.ceil(0.1*g.size),ia.drawMarkers([g]), +"undefined"!==typeof e.y2&&(g=c.getMarkerProperties(k,e.x1,e.y2,this.chart.overlaidCanvasCtx),g.size=Math.max(1.5*g.size<<0,10),g.borderColor=g.borderColor||"#FFFFFF",g.borderThickness=g.borderThickness||Math.ceil(0.1*g.size),ia.drawMarkers([g]))):"bubble"===c.type?(g=c.getMarkerProperties(k,e.x1,e.y1,this.chart.overlaidCanvasCtx),g.size=e.size,g.color="white",g.borderColor="white",d.globalAlpha=0.3,ia.drawMarkers([g]),d.globalAlpha=1):"column"===c.type||"stackedColumn"===c.type||"stackedColumn100"=== +c.type||"bar"===c.type||"rangeBar"===c.type||"stackedBar"===c.type||"stackedBar100"===c.type||"rangeColumn"===c.type||"waterfall"===c.type?ea(d,e.x1,e.y1,e.x2,e.y2,"white",0,null,!1,!1,!1,!1,0.3):"pie"===c.type||"doughnut"===c.type?ja(d,e.center,e.radius,"white",c.type,e.startAngle,e.endAngle,0.3,e.percentInnerRadius):"funnel"===c.type||"pyramid"===c.type?ra(d,e.funnelSection,0.3,"white"):"candlestick"===c.type?(d.globalAlpha=1,d.strokeStyle=e.color,d.lineWidth=2*e.borderThickness,c=0===d.lineWidth% +2?0:0.5,d.beginPath(),d.moveTo(e.x3-c,Math.min(e.y2,e.y3)),d.lineTo(e.x3-c,Math.min(e.y1,e.y4)),d.stroke(),d.beginPath(),d.moveTo(e.x3-c,Math.max(e.y1,e.y4)),d.lineTo(e.x3-c,Math.max(e.y2,e.y3)),d.stroke(),ea(d,e.x1,Math.min(e.y1,e.y4),e.x2,Math.max(e.y1,e.y4),"transparent",2*e.borderThickness,e.color,!1,!1,!1,!1),d.globalAlpha=1):"ohlc"===c.type?(d.globalAlpha=1,d.strokeStyle=e.color,d.lineWidth=2*e.borderThickness,c=0===d.lineWidth%2?0:0.5,d.beginPath(),d.moveTo(e.x3-c,e.y2),d.lineTo(e.x3-c,e.y3), +d.stroke(),d.beginPath(),d.moveTo(e.x3,e.y1),d.lineTo(e.x1,e.y1),d.stroke(),d.beginPath(),d.moveTo(e.x3,e.y4),d.lineTo(e.x2,e.y4),d.stroke(),d.globalAlpha=1):"boxAndWhisker"===c.type?(d.save(),d.globalAlpha=1,d.strokeStyle=e.stemColor,d.lineWidth=2*e.stemThickness,0<e.stemThickness&&(d.beginPath(),d.moveTo(e.x3,e.y2+e.borderThickness/2),d.lineTo(e.x3,e.y1+e.whiskerThickness/2),d.stroke(),d.beginPath(),d.moveTo(e.x3,e.y4-e.whiskerThickness/2),d.lineTo(e.x3,e.y3-e.borderThickness/2),d.stroke()),d.beginPath(), +ea(d,e.x1-e.borderThickness/2,Math.max(e.y2+e.borderThickness/2,e.y3+e.borderThickness/2),e.x2+e.borderThickness/2,Math.min(e.y2-e.borderThickness/2,e.y3-e.borderThickness/2),"transparent",e.borderThickness,e.color,!1,!1,!1,!1),d.globalAlpha=1,d.strokeStyle=e.whiskerColor,d.lineWidth=2*e.whiskerThickness,0<e.whiskerThickness&&(d.beginPath(),d.moveTo(Math.floor(e.x3-e.whiskerLength/2),e.y4),d.lineTo(Math.ceil(e.x3+e.whiskerLength/2),e.y4),d.stroke(),d.beginPath(),d.moveTo(Math.floor(e.x3-e.whiskerLength/ +2),e.y1),d.lineTo(Math.ceil(e.x3+e.whiskerLength/2),e.y1),d.stroke()),d.globalAlpha=1,d.strokeStyle=e.lineColor,d.lineWidth=2*e.lineThickness,0<e.lineThickness&&(d.beginPath(),d.moveTo(e.x1,e.y5),d.lineTo(e.x2,e.y5),d.stroke()),d.restore(),d.globalAlpha=1):"error"===c.type&&E(d,e.x1,e.y1,e.x2,e.y2,"white",e.whiskerProperties,e.stemProperties,e.isXYSwapped,0.3))}}d.restore();d.globalAlpha=1;d.beginPath()};$.prototype.getToolTipInnerHTML=function(a){a=a.entries;for(var d=null,b=null,c=null,e=0,g="", +k=!0,l=0;l<a.length;l++)if(a[l].dataSeries.toolTipContent||a[l].dataPoint.toolTipContent){k=!1;break}if(k&&(this.content&&"function"===typeof this.content||this.contentFormatter))a={chart:this.chart,toolTip:this.options,entries:a},d=this.contentFormatter?this.contentFormatter(a):this.content(a);else if(this.shared&&"none"!==this.chart.plotInfo.axisPlacement){for(var p=null,h="",l=0;l<a.length;l++)b=a[l].dataSeries,c=a[l].dataPoint,e=a[l].index,g="",0===l&&(k&&!this.content)&&(this.chart.axisX&&0< +this.chart.axisX.length?h+="undefined"!==typeof this.chart.axisX[0].labels[c.x]?this.chart.axisX[0].labels[c.x]:"{x}":this.chart.axisX2&&0<this.chart.axisX2.length&&(h+="undefined"!==typeof this.chart.axisX2[0].labels[c.x]?this.chart.axisX2[0].labels[c.x]:"{x}"),h+="</br>",h=this.chart.replaceKeywordsWithValue(h,c,b,e)),null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent||("line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"=== +b.type||"splineArea"===b.type||"column"===b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?(this.chart.axisX&&1<this.chart.axisX.length&&(g+=p!=b.axisXIndex?b.axisX.title?b.axisX.title+"<br/>":"X:{axisXIndex}<br/>":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content? +this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>{name}:</span>  {y}",p=b.axisXIndex):"bubble"===b.type?(this.chart.axisX&&1<this.chart.axisX.length&&(g+=p!=b.axisXIndex?b.axisX.title?b.axisX.title+"<br/>":"X:{axisXIndex}<br/>":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>{name}:</span>  {y},   {z}"): +"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?(this.chart.axisX&&1<this.chart.axisX.length&&(g+=p!=b.axisXIndex?b.axisX.title?b.axisX.title+"<br/>":"X:{axisXIndex}<br/>":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>{name}:</span>  {y[0]}, {y[1]}"):"candlestick"=== +b.type||"ohlc"===b.type?(this.chart.axisX&&1<this.chart.axisX.length&&(g+=p!=b.axisXIndex?b.axisX.title?b.axisX.title+"<br/>":"X:{axisXIndex}<br/>":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>{name}:</span><br/>Open:   {y[0]}<br/>High:    {y[1]}<br/>Low:   {y[2]}<br/>Close:   {y[3]}"):"boxAndWhisker"=== +b.type&&(this.chart.axisX&&1<this.chart.axisX.length&&(g+=p!=b.axisXIndex?b.axisX.title?b.axisX.title+"<br/>":"X:{axisXIndex}<br/>":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>{name}:</span><br/>Minimum:   {y[0]}<br/>Q1:               {y[1]}<br/>Q2:               {y[4]}<br/>Q3:               {y[2]}<br/>Maximum:  {y[3]}"), +null===d&&(d=""),!0===this.reversed?(d=this.chart.replaceKeywordsWithValue(g,c,b,e)+d,l<a.length-1&&(d="</br>"+d)):(d+=this.chart.replaceKeywordsWithValue(g,c,b,e),l<a.length-1&&(d+="</br>")));null!==d&&(d=h+d)}else{b=a[0].dataSeries;c=a[0].dataPoint;e=a[0].index;if(null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent)return null;"line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"===b.type||"splineArea"===b.type||"column"=== +b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>"+(c.label?"{label}":"{x}")+":</span>  {y}":"bubble"===b.type?g=c.toolTipContent? +c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>"+(c.label?"{label}":"{x}")+":</span>  {y},   {z}":"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"": +"'color:{color};'")+"\"'>"+(c.name?"{name}:</span>  ":c.label?"{label}:</span>  ":"</span>")+"{y}":"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>"+(c.label?"{label}":"{x}")+" :</span>  {y[0]},  {y[1]}": +"candlestick"===b.type||"ohlc"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>"+(c.label?"{label}":"{x}")+"</span><br/>Open:   {y[0]}<br/>High:    {y[1]}<br/>Low:     {y[2]}<br/>Close:   {y[3]}":"boxAndWhisker"===b.type&&(g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent: +this.content&&"function"!==typeof this.content?this.content:"<span style='\""+(this.options.fontColor?"":"'color:{color};'")+"\"'>"+(c.label?"{label}":"{x}")+"</span><br/>Minimum:   {y[0]}<br/>Q1:               {y[1]}<br/>Q2:               {y[4]}<br/>Q3:               {y[2]}<br/>Maximum:  {y[3]}"); +null===d&&(d="");d+=this.chart.replaceKeywordsWithValue(g,c,b,e)}return d};$.prototype.enableAnimation=function(){if(!this.container.style.WebkitTransition){var a=this.getContainerTransition(this.containerTransitionDuration);this.container.style.WebkitTransition=a;this.container.style.MsTransition=a;this.container.style.transition=a;this.container.style.MozTransition=this.mozContainerTransition}};$.prototype.disableAnimation=function(){this.container.style.WebkitTransition&&(this.container.style.WebkitTransition= +"",this.container.style.MozTransition="",this.container.style.MsTransition="",this.container.style.transition="")};$.prototype.hide=function(a){this.container&&(this.container.style.display="none",this.currentSeriesIndex=-1,this._prevY=this._prevX=NaN,("undefined"===typeof a||a)&&this.chart.resetOverlayedCanvas())};$.prototype.show=function(a,d,b){this._updateToolTip(a,d,"undefined"===typeof b?!1:b)};$.prototype.fixMozTransitionDelay=function(a,d){if(20<this.chart._eventManager.lastObjectId)this.mozContainerTransition= +this.getContainerTransition(0);else{var b=parseFloat(this.container.style.left),b=isNaN(b)?0:b,c=parseFloat(this.container.style.bottom),c=isNaN(c)?0:c;10<Math.sqrt(Math.pow(b-a,2)+Math.pow(c-d,2))?this.mozContainerTransition=this.getContainerTransition(0.1):this.mozContainerTransition=this.getContainerTransition(0)}};$.prototype.getContainerTransition=function(a){return"left "+a+"s ease-out 0s, bottom "+a+"s ease-out 0s"};ha.prototype.reset=function(){this.lastObjectId=0;this.objectMap=[];this.rectangularRegionEventSubscriptions= +[];this.previousDataPointEventObject=null;this.eventObjects=[];r&&(this.ghostCtx.clearRect(0,0,this.chart.width,this.chart.height),this.ghostCtx.beginPath())};ha.prototype.getNewObjectTrackingId=function(){return++this.lastObjectId};ha.prototype.mouseEventHandler=function(a){if("mousemove"===a.type||"click"===a.type){var d=[],b=Ra(a),c=null;if((c=this.chart.getObjectAtXY(b.x,b.y,!1))&&"undefined"!==typeof this.objectMap[c])if(c=this.objectMap[c],"dataPoint"===c.objectType){var e=this.chart.data[c.dataSeriesIndex], +g=e.dataPoints[c.dataPointIndex],k=c.dataPointIndex;c.eventParameter={x:b.x,y:b.y,dataPoint:g,dataSeries:e.options,dataPointIndex:k,dataSeriesIndex:e.index,chart:this.chart};c.eventContext={context:g,userContext:g,mouseover:"mouseover",mousemove:"mousemove",mouseout:"mouseout",click:"click"};d.push(c);c=this.objectMap[e.id];c.eventParameter={x:b.x,y:b.y,dataPoint:g,dataSeries:e.options,dataPointIndex:k,dataSeriesIndex:e.index,chart:this.chart};c.eventContext={context:e,userContext:e.options,mouseover:"mouseover", +mousemove:"mousemove",mouseout:"mouseout",click:"click"};d.push(this.objectMap[e.id])}else"legendItem"===c.objectType&&(e=this.chart.data[c.dataSeriesIndex],g=null!==c.dataPointIndex?e.dataPoints[c.dataPointIndex]:null,c.eventParameter={x:b.x,y:b.y,dataSeries:e.options,dataPoint:g,dataPointIndex:c.dataPointIndex,dataSeriesIndex:c.dataSeriesIndex,chart:this.chart},c.eventContext={context:this.chart.legend,userContext:this.chart.legend.options,mouseover:"itemmouseover",mousemove:"itemmousemove",mouseout:"itemmouseout", +click:"itemclick"},d.push(c));e=[];for(b=0;b<this.mouseoveredObjectMaps.length;b++){g=!0;for(c=0;c<d.length;c++)if(d[c].id===this.mouseoveredObjectMaps[b].id){g=!1;break}g?this.fireEvent(this.mouseoveredObjectMaps[b],"mouseout",a):e.push(this.mouseoveredObjectMaps[b])}this.mouseoveredObjectMaps=e;for(b=0;b<d.length;b++){e=!1;for(c=0;c<this.mouseoveredObjectMaps.length;c++)if(d[b].id===this.mouseoveredObjectMaps[c].id){e=!0;break}e||(this.fireEvent(d[b],"mouseover",a),this.mouseoveredObjectMaps.push(d[b])); +"click"===a.type?this.fireEvent(d[b],"click",a):"mousemove"===a.type&&this.fireEvent(d[b],"mousemove",a)}}};ha.prototype.fireEvent=function(a,d,b){if(a&&d){var c=a.eventParameter,e=a.eventContext,g=a.eventContext.userContext;g&&(e&&g[e[d]])&&g[e[d]].call(g,c);"mouseout"!==d?g.cursor&&g.cursor!==b.target.style.cursor&&(b.target.style.cursor=g.cursor):(b.target.style.cursor=this.chart._defaultCursor,delete a.eventParameter,delete a.eventContext);"click"===d&&("dataPoint"===a.objectType&&this.chart.pieDoughnutClickHandler)&& +this.chart.pieDoughnutClickHandler.call(this.chart.data[a.dataSeriesIndex],c);"click"===d&&("dataPoint"===a.objectType&&this.chart.funnelPyramidClickHandler)&&this.chart.funnelPyramidClickHandler.call(this.chart.data[a.dataSeriesIndex],c)}};ga.prototype.animate=function(a,d,b,c,e){var g=this;this.chart.isAnimating=!0;e=e||M.easing.linear;b&&this.animations.push({startTime:(new Date).getTime()+(a?a:0),duration:d,animationCallback:b,onComplete:c});for(a=[];0<this.animations.length;)if(d=this.animations.shift(), +b=(new Date).getTime(),c=0,d.startTime<=b&&(c=e(Math.min(b-d.startTime,d.duration),0,1,d.duration),c=Math.min(c,1),isNaN(c)||!isFinite(c))&&(c=1),1>c&&a.push(d),d.animationCallback(c),1<=c&&d.onComplete)d.onComplete();this.animations=a;0<this.animations.length?this.animationRequestId=this.chart.requestAnimFrame.call(window,function(){g.animate.call(g)}):this.chart.isAnimating=!1};ga.prototype.cancelAllAnimations=function(){this.animations=[];this.animationRequestId&&this.chart.cancelRequestAnimFrame.call(window, +this.animationRequestId);this.animationRequestId=null;this.chart.isAnimating=!1};var M={yScaleAnimation:function(a,d){if(0!==a){var b=d.dest,c=d.source.canvas,e=d.animationBase;b.drawImage(c,0,0,c.width,c.height,0,e-e*a,b.canvas.width/W,a*b.canvas.height/W)}},xScaleAnimation:function(a,d){if(0!==a){var b=d.dest,c=d.source.canvas,e=d.animationBase;b.drawImage(c,0,0,c.width,c.height,e-e*a,0,a*b.canvas.width/W,b.canvas.height/W)}},xClipAnimation:function(a,d){if(0!==a){var b=d.dest,c=d.source.canvas; +b.save();0<a&&b.drawImage(c,0,0,c.width*a,c.height,0,0,c.width*a/W,c.height/W);b.restore()}},fadeInAnimation:function(a,d){if(0!==a){var b=d.dest,c=d.source.canvas;b.save();b.globalAlpha=a;b.drawImage(c,0,0,c.width,c.height,0,0,b.canvas.width/W,b.canvas.height/W);b.restore()}},easing:{linear:function(a,d,b,c){return b*a/c+d},easeOutQuad:function(a,d,b,c){return-b*(a/=c)*(a-2)+d},easeOutQuart:function(a,d,b,c){return-b*((a=a/c-1)*a*a*a-1)+d},easeInQuad:function(a,d,b,c){return b*(a/=c)*a+d},easeInQuart:function(a, +d,b,c){return b*(a/=c)*a*a*a+d}}},ia={drawMarker:function(a,d,b,c,e,g,k,l){if(b){var p=1;b.fillStyle=g?g:"#000000";b.strokeStyle=k?k:"#000000";b.lineWidth=l?l:0;b.setLineDash&&b.setLineDash(R("solid",l));"circle"===c?(b.moveTo(a,d),b.beginPath(),b.arc(a,d,e/2,0,2*Math.PI,!1),g&&b.fill(),l&&(k?b.stroke():(p=b.globalAlpha,b.globalAlpha=0.15,b.strokeStyle="black",b.stroke(),b.globalAlpha=p))):"square"===c?(b.beginPath(),b.rect(a-e/2,d-e/2,e,e),g&&b.fill(),l&&(k?b.stroke():(p=b.globalAlpha,b.globalAlpha= +0.15,b.strokeStyle="black",b.stroke(),b.globalAlpha=p))):"triangle"===c?(b.beginPath(),b.moveTo(a-e/2,d+e/2),b.lineTo(a+e/2,d+e/2),b.lineTo(a,d-e/2),b.closePath(),g&&b.fill(),l&&(k?b.stroke():(p=b.globalAlpha,b.globalAlpha=0.15,b.strokeStyle="black",b.stroke(),b.globalAlpha=p)),b.beginPath()):"cross"===c&&(b.strokeStyle=g,b.lineWidth=e/4,b.beginPath(),b.moveTo(a-e/2,d-e/2),b.lineTo(a+e/2,d+e/2),b.stroke(),b.moveTo(a+e/2,d-e/2),b.lineTo(a-e/2,d+e/2),b.stroke())}},drawMarkers:function(a){for(var d= +0;d<a.length;d++){var b=a[d];ia.drawMarker(b.x,b.y,b.ctx,b.type,b.size,b.color,b.borderColor,b.borderThickness)}}};return p}();Na.Chart.version="v2.3.1 GA"})(); + +/* + excanvas is used to support IE678 which do not implement HTML5 Canvas Element. You can safely remove the following excanvas code if you don't need to support older browsers. + + Copyright 2006 Google Inc. https://code.google.com/p/explorercanvas/ + Licensed under the Apache License, Version 2.0 +*/ +document.createElement("canvas").getContext||function(){function V(){return this.context_||(this.context_=new C(this))}function W(a,b,c){var g=M.call(arguments,2);return function(){return a.apply(b,g.concat(M.call(arguments)))}}function N(a){return String(a).replace(/&/g,"&").replace(/"/g,""")}function O(a){a.namespaces.g_vml_||a.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML");a.namespaces.g_o_||a.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML"); +a.styleSheets.ex_canvas_||(a=a.createStyleSheet(),a.owningElement.id="ex_canvas_",a.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}")}function X(a){var b=a.srcElement;switch(a.propertyName){case "width":b.getContext().clearRect();b.style.width=b.attributes.width.nodeValue+"px";b.firstChild.style.width=b.clientWidth+"px";break;case "height":b.getContext().clearRect(),b.style.height=b.attributes.height.nodeValue+"px",b.firstChild.style.height=b.clientHeight+ +"px"}}function Y(a){a=a.srcElement;a.firstChild&&(a.firstChild.style.width=a.clientWidth+"px",a.firstChild.style.height=a.clientHeight+"px")}function D(){return[[1,0,0],[0,1,0],[0,0,1]]}function t(a,b){for(var c=D(),g=0;3>g;g++)for(var e=0;3>e;e++){for(var f=0,d=0;3>d;d++)f+=a[g][d]*b[d][e];c[g][e]=f}return c}function P(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX= +a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha;b.font=a.font;b.textAlign=a.textAlign;b.textBaseline=a.textBaseline;b.arcScaleX_=a.arcScaleX_;b.arcScaleY_=a.arcScaleY_;b.lineScale_=a.lineScale_}function Q(a){var b=a.indexOf("(",3),c=a.indexOf(")",b+1),b=a.substring(b+1,c).split(",");if(4!=b.length||"a"!=a.charAt(3))b[3]=1;return b}function E(a,b,c){return Math.min(c,Math.max(b,a))}function F(a,b,c){0>c&&c++;1<c&&c--;return 1>6*c?a+6*(b-a)*c: +1>2*c?b:2>3*c?a+6*(b-a)*(2/3-c):a}function G(a){if(a in H)return H[a];var b,c=1;a=String(a);if("#"==a.charAt(0))b=a;else if(/^rgb/.test(a)){c=Q(a);b="#";for(var g,e=0;3>e;e++)g=-1!=c[e].indexOf("%")?Math.floor(255*(parseFloat(c[e])/100)):+c[e],b+=v[E(g,0,255)];c=+c[3]}else if(/^hsl/.test(a)){e=c=Q(a);b=parseFloat(e[0])/360%360;0>b&&b++;g=E(parseFloat(e[1])/100,0,1);e=E(parseFloat(e[2])/100,0,1);if(0==g)g=e=b=e;else{var f=0.5>e?e*(1+g):e+g-e*g,d=2*e-f;g=F(d,f,b+1/3);e=F(d,f,b);b=F(d,f,b-1/3)}b="#"+ +v[Math.floor(255*g)]+v[Math.floor(255*e)]+v[Math.floor(255*b)];c=c[3]}else b=Z[a]||a;return H[a]={color:b,alpha:c}}function C(a){this.m_=D();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=1*q;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=a;var b="width:"+a.clientWidth+"px;height:"+a.clientHeight+"px;overflow:hidden;position:absolute", +c=a.ownerDocument.createElement("div");c.style.cssText=b;a.appendChild(c);b=c.cloneNode(!1);b.style.backgroundColor="red";b.style.filter="alpha(opacity=0)";a.appendChild(b);this.element_=c;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}function R(a,b,c,g){a.currentPath_.push({type:"bezierCurveTo",cp1x:b.x,cp1y:b.y,cp2x:c.x,cp2y:c.y,x:g.x,y:g.y});a.currentX_=g.x;a.currentY_=g.y}function S(a,b){var c=G(a.strokeStyle),g=c.color,c=c.alpha*a.globalAlpha,e=a.lineScale_*a.lineWidth;1>e&&(c*=e);b.push("<g_vml_:stroke", +' opacity="',c,'"',' joinstyle="',a.lineJoin,'"',' miterlimit="',a.miterLimit,'"',' endcap="',$[a.lineCap]||"square",'"',' weight="',e,'px"',' color="',g,'" />')}function T(a,b,c,g){var e=a.fillStyle,f=a.arcScaleX_,d=a.arcScaleY_,k=g.x-c.x,n=g.y-c.y;if(e instanceof w){var h=0,l=g=0,u=0,m=1;if("gradient"==e.type_){h=e.x1_/f;c=e.y1_/d;var p=s(a,e.x0_/f,e.y0_/d),h=s(a,h,c),h=180*Math.atan2(h.x-p.x,h.y-p.y)/Math.PI;0>h&&(h+=360);1E-6>h&&(h=0)}else p=s(a,e.x0_,e.y0_),g=(p.x-c.x)/k,l=(p.y-c.y)/n,k/=f*q, +n/=d*q,m=x.max(k,n),u=2*e.r0_/m,m=2*e.r1_/m-u;f=e.colors_;f.sort(function(a,b){return a.offset-b.offset});d=f.length;p=f[0].color;c=f[d-1].color;k=f[0].alpha*a.globalAlpha;a=f[d-1].alpha*a.globalAlpha;for(var n=[],r=0;r<d;r++){var t=f[r];n.push(t.offset*m+u+" "+t.color)}b.push('<g_vml_:fill type="',e.type_,'"',' method="none" focus="100%"',' color="',p,'"',' color2="',c,'"',' colors="',n.join(","),'"',' opacity="',a,'"',' g_o_:opacity2="',k,'"',' angle="',h,'"',' focusposition="',g,",",l,'" />')}else e instanceof +I?k&&n&&b.push("<g_vml_:fill",' position="',-c.x/k*f*f,",",-c.y/n*d*d,'"',' type="tile"',' src="',e.src_,'" />'):(e=G(a.fillStyle),b.push('<g_vml_:fill color="',e.color,'" opacity="',e.alpha*a.globalAlpha,'" />'))}function s(a,b,c){a=a.m_;return{x:q*(b*a[0][0]+c*a[1][0]+a[2][0])-r,y:q*(b*a[0][1]+c*a[1][1]+a[2][1])-r}}function z(a,b,c){isFinite(b[0][0])&&(isFinite(b[0][1])&&isFinite(b[1][0])&&isFinite(b[1][1])&&isFinite(b[2][0])&&isFinite(b[2][1]))&&(a.m_=b,c&&(a.lineScale_=aa(ba(b[0][0]*b[1][1]-b[0][1]* +b[1][0]))))}function w(a){this.type_=a;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}function I(a,b){if(!a||1!=a.nodeType||"IMG"!=a.tagName)throw new A("TYPE_MISMATCH_ERR");if("complete"!=a.readyState)throw new A("INVALID_STATE_ERR");switch(b){case "repeat":case null:case "":this.repetition_="repeat";break;case "repeat-x":case "repeat-y":case "no-repeat":this.repetition_=b;break;default:throw new A("SYNTAX_ERR");}this.src_=a.src;this.width_=a.width;this.height_=a.height} +function A(a){this.code=this[a];this.message=a+": DOM Exception "+this.code}var x=Math,k=x.round,J=x.sin,K=x.cos,ba=x.abs,aa=x.sqrt,q=10,r=q/2;navigator.userAgent.match(/MSIE ([\d.]+)?/);var M=Array.prototype.slice;O(document);var U={init:function(a){a=a||document;a.createElement("canvas");a.attachEvent("onreadystatechange",W(this.init_,this,a))},init_:function(a){a=a.getElementsByTagName("canvas");for(var b=0;b<a.length;b++)this.initElement(a[b])},initElement:function(a){if(!a.getContext){a.getContext= +V;O(a.ownerDocument);a.innerHTML="";a.attachEvent("onpropertychange",X);a.attachEvent("onresize",Y);var b=a.attributes;b.width&&b.width.specified?a.style.width=b.width.nodeValue+"px":a.width=a.clientWidth;b.height&&b.height.specified?a.style.height=b.height.nodeValue+"px":a.height=a.clientHeight}return a}};U.init();for(var v=[],d=0;16>d;d++)for(var B=0;16>B;B++)v[16*d+B]=d.toString(16)+B.toString(16);var Z={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC", +bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000", +darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082", +ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA", +mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5", +peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"}, +H={},L={},$={butt:"flat",round:"round"},d=C.prototype;d.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null);this.element_.innerHTML=""};d.beginPath=function(){this.currentPath_=[]};d.moveTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.lineTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.bezierCurveTo= +function(a,b,c,g,e,f){e=s(this,e,f);a=s(this,a,b);c=s(this,c,g);R(this,a,c,e)};d.quadraticCurveTo=function(a,b,c,g){a=s(this,a,b);c=s(this,c,g);g={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)};R(this,g,{x:g.x+(c.x-this.currentX_)/3,y:g.y+(c.y-this.currentY_)/3},c)};d.arc=function(a,b,c,g,e,f){c*=q;var d=f?"at":"wa",k=a+K(g)*c-r,n=b+J(g)*c-r;g=a+K(e)*c-r;e=b+J(e)*c-r;k!=g||f||(k+=0.125);a=s(this,a,b);k=s(this,k,n);g=s(this,g,e);this.currentPath_.push({type:d, +x:a.x,y:a.y,radius:c,xStart:k.x,yStart:k.y,xEnd:g.x,yEnd:g.y})};d.rect=function(a,b,c,g){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath()};d.strokeRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath();this.stroke();this.currentPath_=e};d.fillRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+ +c,b+g);this.lineTo(a,b+g);this.closePath();this.fill();this.currentPath_=e};d.createLinearGradient=function(a,b,c,g){var e=new w("gradient");e.x0_=a;e.y0_=b;e.x1_=c;e.y1_=g;return e};d.createRadialGradient=function(a,b,c,g,e,f){var d=new w("gradientradial");d.x0_=a;d.y0_=b;d.r0_=c;d.x1_=g;d.y1_=e;d.r1_=f;return d};d.drawImage=function(a,b){var c,g,e,d,r,y,n,h;e=a.runtimeStyle.width;d=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var l=a.width,u=a.height;a.runtimeStyle.width= +e;a.runtimeStyle.height=d;if(3==arguments.length)c=arguments[1],g=arguments[2],r=y=0,n=e=l,h=d=u;else if(5==arguments.length)c=arguments[1],g=arguments[2],e=arguments[3],d=arguments[4],r=y=0,n=l,h=u;else if(9==arguments.length)r=arguments[1],y=arguments[2],n=arguments[3],h=arguments[4],c=arguments[5],g=arguments[6],e=arguments[7],d=arguments[8];else throw Error("Invalid number of arguments");var m=s(this,c,g),p=[];p.push(" <g_vml_:group",' coordsize="',10*q,",",10*q,'"',' coordorigin="0,0"',' style="width:', +10,"px;height:",10,"px;position:absolute;");if(1!=this.m_[0][0]||this.m_[0][1]||1!=this.m_[1][1]||this.m_[1][0]){var t=[];t.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",k(m.x/q),",","Dy=",k(m.y/q),"");var v=s(this,c+e,g),w=s(this,c,g+d);c=s(this,c+e,g+d);m.x=x.max(m.x,v.x,w.x,c.x);m.y=x.max(m.y,v.y,w.y,c.y);p.push("padding:0 ",k(m.x/q),"px ",k(m.y/q),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",t.join(""),", sizingmethod='clip');")}else p.push("top:", +k(m.y/q),"px;left:",k(m.x/q),"px;");p.push(' ">','<g_vml_:image src="',a.src,'"',' style="width:',q*e,"px;"," height:",q*d,'px"',' cropleft="',r/l,'"',' croptop="',y/u,'"',' cropright="',(l-r-n)/l,'"',' cropbottom="',(u-y-h)/u,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))};d.stroke=function(a){var b=[];b.push("<g_vml_:shape",' filled="',!!a,'"',' style="position:absolute;width:',10,"px;height:",10,'px;"',' coordorigin="0,0"',' coordsize="',10*q,",",10*q,'"', +' stroked="',!a,'"',' path="');for(var c={x:null,y:null},d={x:null,y:null},e=0;e<this.currentPath_.length;e++){var f=this.currentPath_[e];switch(f.type){case "moveTo":b.push(" m ",k(f.x),",",k(f.y));break;case "lineTo":b.push(" l ",k(f.x),",",k(f.y));break;case "close":b.push(" x ");f=null;break;case "bezierCurveTo":b.push(" c ",k(f.cp1x),",",k(f.cp1y),",",k(f.cp2x),",",k(f.cp2y),",",k(f.x),",",k(f.y));break;case "at":case "wa":b.push(" ",f.type," ",k(f.x-this.arcScaleX_*f.radius),",",k(f.y-this.arcScaleY_* +f.radius)," ",k(f.x+this.arcScaleX_*f.radius),",",k(f.y+this.arcScaleY_*f.radius)," ",k(f.xStart),",",k(f.yStart)," ",k(f.xEnd),",",k(f.yEnd))}if(f){if(null==c.x||f.x<c.x)c.x=f.x;if(null==d.x||f.x>d.x)d.x=f.x;if(null==c.y||f.y<c.y)c.y=f.y;if(null==d.y||f.y>d.y)d.y=f.y}}b.push(' ">');a?T(this,b,c,d):S(this,b);b.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",b.join(""))};d.fill=function(){this.stroke(!0)};d.closePath=function(){this.currentPath_.push({type:"close"})};d.save=function(){var a= +{};P(this,a);this.aStack_.push(a);this.mStack_.push(this.m_);this.m_=t(D(),this.m_)};d.restore=function(){this.aStack_.length&&(P(this.aStack_.pop(),this),this.m_=this.mStack_.pop())};d.translate=function(a,b){z(this,t([[1,0,0],[0,1,0],[a,b,1]],this.m_),!1)};d.rotate=function(a){var b=K(a);a=J(a);z(this,t([[b,a,0],[-a,b,0],[0,0,1]],this.m_),!1)};d.scale=function(a,b){this.arcScaleX_*=a;this.arcScaleY_*=b;z(this,t([[a,0,0],[0,b,0],[0,0,1]],this.m_),!0)};d.transform=function(a,b,c,d,e,f){z(this,t([[a, +b,0],[c,d,0],[e,f,1]],this.m_),!0)};d.setTransform=function(a,b,c,d,e,f){z(this,[[a,b,0],[c,d,0],[e,f,1]],!0)};d.drawText_=function(a,b,c,d,e){var f=this.m_;d=0;var r=1E3,t=0,n=[],h;h=this.font;if(L[h])h=L[h];else{var l=document.createElement("div").style;try{l.font=h}catch(u){}h=L[h]={style:l.fontStyle||"normal",variant:l.fontVariant||"normal",weight:l.fontWeight||"normal",size:l.fontSize||10,family:l.fontFamily||"sans-serif"}}var l=h,m=this.element_;h={};for(var p in l)h[p]=l[p];p=parseFloat(m.currentStyle.fontSize); +m=parseFloat(l.size);"number"==typeof l.size?h.size=l.size:-1!=l.size.indexOf("px")?h.size=m:-1!=l.size.indexOf("em")?h.size=p*m:-1!=l.size.indexOf("%")?h.size=p/100*m:-1!=l.size.indexOf("pt")?h.size=m/0.75:h.size=p;h.size*=0.981;p=h.style+" "+h.variant+" "+h.weight+" "+h.size+"px "+h.family;m=this.element_.currentStyle;l=this.textAlign.toLowerCase();switch(l){case "left":case "center":case "right":break;case "end":l="ltr"==m.direction?"right":"left";break;case "start":l="rtl"==m.direction?"right": +"left";break;default:l="left"}switch(this.textBaseline){case "hanging":case "top":t=h.size/1.75;break;case "middle":break;default:case null:case "alphabetic":case "ideographic":case "bottom":t=-h.size/2.25}switch(l){case "right":d=1E3;r=0.05;break;case "center":d=r=500}b=s(this,b+0,c+t);n.push('<g_vml_:line from="',-d,' 0" to="',r,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!e,'" stroked="',!!e,'" style="position:absolute;width:1px;height:1px;">');e?S(this,n):T(this,n,{x:-d,y:0}, +{x:r,y:h.size});e=f[0][0].toFixed(3)+","+f[1][0].toFixed(3)+","+f[0][1].toFixed(3)+","+f[1][1].toFixed(3)+",0,0";b=k(b.x/q)+","+k(b.y/q);n.push('<g_vml_:skew on="t" matrix="',e,'" ',' offset="',b,'" origin="',d,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',N(a),'" style="v-text-align:',l,";font:",N(p),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",n.join(""))};d.fillText=function(a,b,c,d){this.drawText_(a,b,c,d,!1)};d.strokeText=function(a, +b,c,d){this.drawText_(a,b,c,d,!0)};d.measureText=function(a){this.textMeasureEl_||(this.element_.insertAdjacentHTML("beforeEnd",'<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>'),this.textMeasureEl_=this.element_.lastChild);var b=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(b.createTextNode(a));return{width:this.textMeasureEl_.offsetWidth}};d.clip=function(){}; +d.arcTo=function(){};d.createPattern=function(a,b){return new I(a,b)};w.prototype.addColorStop=function(a,b){b=G(b);this.colors_.push({offset:a,color:b.color,alpha:b.alpha})};d=A.prototype=Error();d.INDEX_SIZE_ERR=1;d.DOMSTRING_SIZE_ERR=2;d.HIERARCHY_REQUEST_ERR=3;d.WRONG_DOCUMENT_ERR=4;d.INVALID_CHARACTER_ERR=5;d.NO_DATA_ALLOWED_ERR=6;d.NO_MODIFICATION_ALLOWED_ERR=7;d.NOT_FOUND_ERR=8;d.NOT_SUPPORTED_ERR=9;d.INUSE_ATTRIBUTE_ERR=10;d.INVALID_STATE_ERR=11;d.SYNTAX_ERR=12;d.INVALID_MODIFICATION_ERR= +13;d.NAMESPACE_ERR=14;d.INVALID_ACCESS_ERR=15;d.VALIDATION_ERR=16;d.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=U;CanvasRenderingContext2D=C;CanvasGradient=w;CanvasPattern=I;DOMException=A}(); + +/* + CanvasJS jQuery Charting Plugin - https://canvasjs.com/ + Copyright 2017 fenopix + + --------------------- License Information -------------------- + CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. + https://canvasjs.com/license/ + +*/ +(function(b,c,d,e){b.fn.CanvasJSChart=function(a){if(a){var b=this.first();a=new CanvasJS.Chart(this[0],a);b.children(".canvasjs-chart-container").data("canvasjsChartRef",a);a.render();return this}return this.first().children(".canvasjs-chart-container").data("canvasjsChartRef")}})(jQuery,window,document); +/*eslint-enable*/ +/*jshint ignore:end*/ \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/license.txt b/SRIP/Libraries/canvasjs-2.3.1/license.txt new file mode 100644 index 00000000..f9882a14 --- /dev/null +++ b/SRIP/Libraries/canvasjs-2.3.1/license.txt @@ -0,0 +1,9 @@ +* +* @preserve CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ +* Copyright 2018 fenopix +* +* --------------------- License Information -------------------- +* CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. +* https://canvasjs.com/license/ +* +* \ No newline at end of file diff --git a/SRIP/Quiz/JSONquestions.js b/SRIP/Quiz/JSONquestions.js new file mode 100644 index 00000000..7c4b6fec --- /dev/null +++ b/SRIP/Quiz/JSONquestions.js @@ -0,0 +1,15 @@ +var questions = []; + +function shuffle(array) { + var currentIndex = array.length, temporaryValue, randomIndex; + while (0 !== currentIndex) { + randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex -= 1; + temporaryValue = array[currentIndex]; + array[currentIndex] = array[randomIndex]; + array[randomIndex] = temporaryValue; + } + return array; +} + +shuffle(questions); \ No newline at end of file diff --git a/SRIP/Quiz/quiz.css b/SRIP/Quiz/quiz.css new file mode 100644 index 00000000..c5e1ae85 --- /dev/null +++ b/SRIP/Quiz/quiz.css @@ -0,0 +1,190 @@ +body +{ + +background-repeat: no-repeat; + +background-size: 1600px 800px + +} + +#heading +{ + +position: absolute; + +left:20%; + +width: 60%; + +background: rgba(255,255,255,0.5); + +padding: 20px; + +border: 1px solid #00038c; + +box-shadow: 0 0 8px 3px #fff; + +} + +#text +{ + +text-align: center; + +} + +#quiz +{ + +height: 330px; + +width: 60%; + +position: absolute; + +left:20%; + +top: 30%; + +transform: translateX(-50) translateY(-50); + +background: rgba(255,255,255,0.5); + +padding: 20px; + +border: 1px solid #00038c; + +box-shadow: 0 0 8px 3px #fff; +} + +#question +{ + +padding: 20px; + +font-size: 22px; + +background: #08038C; + +border-radius: 10px; + +margin: 10px 0 10px 0; + +color: #f6f6f6; + +} + +.option{ + +width: 470px; + +display: inline-block; + +padding: 10px 0 10px 0; + +background: rgba(255,255,255,0.5); + +margin: 10px 0 10px 10px; + +color: #0000000; + +border: 2px solid #008CBA; + +border-radius: 5px; + +} + +.option:hover +{ + +background: #08038C; + +color: #f6f6f6; + +} + +#next +{ + +background-color: #4CAF50; + +width:10%; + +height: 4%px; + +border: 1px solid #00038c; + +box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); + +cursor: pointer; + +float: right; + +padding: 10px 10px; + +} + +#next:hover{ + +background-color:rgb(106, 90, 205); + +} + +#quit +{ + +position: absolute; + +right: 0; + +bottom: 0; + +background-color: #4CAF50; + +border: 1px solid #00038c; + +box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); + +cursor: pointer; + +float: right; + +padding: 5px 5px; + +} + +#quit:hover{ + +background-color:rgb(106, 90, 205); + +} + +#result +{ + +font-size:100px; + +text-align: center; + +height: 100px; + +width: 60%; + +position: absolute; + +left:20%; + +top: 30%; + +transform: translateX(-50) translateY(-50); + +background: rgba(255,255,255,0.5); + +padding: 20px; + +border: 1px solid #00038c; + +box-shadow: 0 0 8px 3px #fff; + +} + diff --git a/SRIP/Quiz/quiz.html b/SRIP/Quiz/quiz.html new file mode 100644 index 00000000..167c972a --- /dev/null +++ b/SRIP/Quiz/quiz.html @@ -0,0 +1,27 @@ +<!DOCTYPE HTML> +<html> +<head> + <link rel="stylesheet" type="text/css" href="quiz.css"> + <title>QUIZ + + + +
+

Quiz on Experiment: Feature Representation

+

+
+
+ + + + + +
+ + + + + + + \ No newline at end of file diff --git a/SRIP/Quiz/quiz.js b/SRIP/Quiz/quiz.js new file mode 100644 index 00000000..d89861ea --- /dev/null +++ b/SRIP/Quiz/quiz.js @@ -0,0 +1,61 @@ +var quiz = document.getElementById("quiz"); +var ques = document.getElementById("question"); +var opt1 = document.getElementById("option1"); +var opt2 = document.getElementById("option2"); +var opt3 = document.getElementById("option3"); +var opt4 = document.getElementById("option4"); +var res = document.getElementById("result"); +var nextbutton = document.getElementById("next"); +var q = document.getElementById("quit"); + +var tques = questions.length; +var score = 0; +var quesindex = 0; + +//finish the quiz +function quit(){ + quiz.style.display = "none"; + result.style.display = ""; + var f = score / tques; + result.textContent = "SCORE = " + score; + q.style.display = "none"; +} + +//start the quiz +function giveQues(quesindex){ + ques.textContent = quesindex + 1 + ". " + questions[quesindex][0]; + opt1.textContent = questions[quesindex][1]; + opt2.textContent = questions[quesindex][2]; + opt3.textContent = questions[quesindex][3]; + opt4.textContent = questions[quesindex][4]; + return; +} + +giveQues(0); + +//next question +function nextques(){ + var selectedAns = document.querySelector("input[type=radio]:checked"); + if(!selectedAns){ + alert("SELECT AN OPTION"); + return; + } + + if(selectedAns.value == questions[quesindex][5]){ + score = score + 1; + } + selectedAns.checked = false; + quesindex++; + if(quesindex == tques - 1){ + nextbutton.textContent = "Finish"; + } + var f = score / tques; + if(quesindex == tques){ + q.style.display = "none"; + quiz.style.display = "none"; + result.style.display = ""; + result.textContent = "SCORED: " + score + " out of 25 " + String.fromCodePoint(0x1F3C6) +String.fromCodePoint(0x1F973); + return; + } + giveQues(quesindex); +} diff --git a/SRIP/README.txt b/SRIP/README.txt new file mode 100644 index 00000000..a4b10dfd --- /dev/null +++ b/SRIP/README.txt @@ -0,0 +1,15 @@ +This is Readme file containing instruction for running the experiment: Generation of Random Variables + +TO RUN THE EXPERIMENT: +1. Download the SRIP folder +2. Go to Codes folder +3. Run the .html file + +HTML file will open in the browser and all functionalities will run from the HTML file. + + +TAKE A QUIZ OF THE EXPERIMENT: +1. Go to Quiz folder +2. Run quiz.html +3. Quiz will open in the browser +4. Give the quiz From 6e6458b402c96794162cd6a401e293ca35f9df0a Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Fri, 12 Jul 2019 17:47:50 +0530 Subject: [PATCH 152/166] initial ui commit --- SRIP/Codes/exp1.css | 44 + SRIP/Codes/exp1.html | 83 +- SRIP/Codes/exp1.js | 50 + SRIP/Libraries/Chart.js | 14680 ---------------- SRIP/Libraries/Exp1/Data/T1/Config.txt | 13 + SRIP/Libraries/Exp1/Data/T1/Data.txt | 213 + SRIP/Libraries/Exp1/Data/T1/images/100.gif | Bin 0 -> 946 bytes SRIP/Libraries/Exp1/Data/T1/images/103.gif | Bin 0 -> 909 bytes SRIP/Libraries/Exp1/Data/T1/images/105.gif | Bin 0 -> 926 bytes SRIP/Libraries/Exp1/Data/T1/images/106.gif | Bin 0 -> 944 bytes SRIP/Libraries/Exp1/Data/T1/images/109.gif | Bin 0 -> 1053 bytes SRIP/Libraries/Exp1/Data/T1/images/113.gif | Bin 0 -> 917 bytes SRIP/Libraries/Exp1/Data/T1/images/114.gif | Bin 0 -> 946 bytes SRIP/Libraries/Exp1/Data/T1/images/115.gif | Bin 0 -> 1048 bytes SRIP/Libraries/Exp1/Data/T1/images/119.gif | Bin 0 -> 1039 bytes SRIP/Libraries/Exp1/Data/T1/images/120.gif | Bin 0 -> 1037 bytes SRIP/Libraries/Exp1/Data/T1/images/122.gif | Bin 0 -> 1028 bytes SRIP/Libraries/Exp1/Data/T1/images/125.gif | Bin 0 -> 917 bytes SRIP/Libraries/Exp1/Data/T1/images/129.gif | Bin 0 -> 927 bytes SRIP/Libraries/Exp1/Data/T1/images/135.gif | Bin 0 -> 959 bytes SRIP/Libraries/Exp1/Data/T1/images/15.gif | Bin 0 -> 917 bytes SRIP/Libraries/Exp1/Data/T1/images/153.gif | Bin 0 -> 941 bytes SRIP/Libraries/Exp1/Data/T1/images/157.gif | Bin 0 -> 1016 bytes SRIP/Libraries/Exp1/Data/T1/images/170.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T1/images/175.gif | Bin 0 -> 923 bytes SRIP/Libraries/Exp1/Data/T1/images/178.gif | Bin 0 -> 940 bytes SRIP/Libraries/Exp1/Data/T1/images/185.gif | Bin 0 -> 915 bytes SRIP/Libraries/Exp1/Data/T1/images/193.gif | Bin 0 -> 1022 bytes SRIP/Libraries/Exp1/Data/T1/images/2.gif | Bin 0 -> 1033 bytes SRIP/Libraries/Exp1/Data/T1/images/201.gif | Bin 0 -> 925 bytes SRIP/Libraries/Exp1/Data/T1/images/202.gif | Bin 0 -> 962 bytes SRIP/Libraries/Exp1/Data/T1/images/206.gif | Bin 0 -> 965 bytes SRIP/Libraries/Exp1/Data/T1/images/207.gif | Bin 0 -> 1045 bytes SRIP/Libraries/Exp1/Data/T1/images/209.gif | Bin 0 -> 933 bytes SRIP/Libraries/Exp1/Data/T1/images/210.gif | Bin 0 -> 1048 bytes SRIP/Libraries/Exp1/Data/T1/images/211.gif | Bin 0 -> 997 bytes SRIP/Libraries/Exp1/Data/T1/images/212.gif | Bin 0 -> 919 bytes SRIP/Libraries/Exp1/Data/T1/images/217.gif | Bin 0 -> 1024 bytes SRIP/Libraries/Exp1/Data/T1/images/22.gif | Bin 0 -> 1033 bytes SRIP/Libraries/Exp1/Data/T1/images/225.gif | Bin 0 -> 1025 bytes SRIP/Libraries/Exp1/Data/T1/images/230.gif | Bin 0 -> 1042 bytes SRIP/Libraries/Exp1/Data/T1/images/232.gif | Bin 0 -> 931 bytes SRIP/Libraries/Exp1/Data/T1/images/233.gif | Bin 0 -> 992 bytes SRIP/Libraries/Exp1/Data/T1/images/235.gif | Bin 0 -> 1048 bytes SRIP/Libraries/Exp1/Data/T1/images/24.gif | Bin 0 -> 954 bytes SRIP/Libraries/Exp1/Data/T1/images/247.gif | Bin 0 -> 1039 bytes SRIP/Libraries/Exp1/Data/T1/images/249.gif | Bin 0 -> 942 bytes SRIP/Libraries/Exp1/Data/T1/images/25.gif | Bin 0 -> 989 bytes SRIP/Libraries/Exp1/Data/T1/images/250.gif | Bin 0 -> 1053 bytes SRIP/Libraries/Exp1/Data/T1/images/252.gif | Bin 0 -> 936 bytes SRIP/Libraries/Exp1/Data/T1/images/261.gif | Bin 0 -> 995 bytes SRIP/Libraries/Exp1/Data/T1/images/270.gif | Bin 0 -> 941 bytes SRIP/Libraries/Exp1/Data/T1/images/271.gif | Bin 0 -> 923 bytes SRIP/Libraries/Exp1/Data/T1/images/277.gif | Bin 0 -> 926 bytes SRIP/Libraries/Exp1/Data/T1/images/284.gif | Bin 0 -> 1049 bytes SRIP/Libraries/Exp1/Data/T1/images/291.gif | Bin 0 -> 935 bytes SRIP/Libraries/Exp1/Data/T1/images/294.gif | Bin 0 -> 1019 bytes SRIP/Libraries/Exp1/Data/T1/images/297.gif | Bin 0 -> 1030 bytes SRIP/Libraries/Exp1/Data/T1/images/304.gif | Bin 0 -> 1037 bytes SRIP/Libraries/Exp1/Data/T1/images/310.gif | Bin 0 -> 941 bytes SRIP/Libraries/Exp1/Data/T1/images/311.gif | Bin 0 -> 913 bytes SRIP/Libraries/Exp1/Data/T1/images/316.gif | Bin 0 -> 950 bytes SRIP/Libraries/Exp1/Data/T1/images/321.gif | Bin 0 -> 989 bytes SRIP/Libraries/Exp1/Data/T1/images/327.gif | Bin 0 -> 1028 bytes SRIP/Libraries/Exp1/Data/T1/images/346.gif | Bin 0 -> 950 bytes SRIP/Libraries/Exp1/Data/T1/images/35.gif | Bin 0 -> 997 bytes SRIP/Libraries/Exp1/Data/T1/images/352.gif | Bin 0 -> 949 bytes SRIP/Libraries/Exp1/Data/T1/images/356.gif | Bin 0 -> 949 bytes SRIP/Libraries/Exp1/Data/T1/images/358.gif | Bin 0 -> 945 bytes SRIP/Libraries/Exp1/Data/T1/images/359.gif | Bin 0 -> 928 bytes SRIP/Libraries/Exp1/Data/T1/images/360.gif | Bin 0 -> 1034 bytes SRIP/Libraries/Exp1/Data/T1/images/367.gif | Bin 0 -> 917 bytes SRIP/Libraries/Exp1/Data/T1/images/38.gif | Bin 0 -> 1022 bytes SRIP/Libraries/Exp1/Data/T1/images/383.gif | Bin 0 -> 906 bytes SRIP/Libraries/Exp1/Data/T1/images/395.gif | Bin 0 -> 925 bytes SRIP/Libraries/Exp1/Data/T1/images/398.gif | Bin 0 -> 949 bytes SRIP/Libraries/Exp1/Data/T1/images/399.gif | Bin 0 -> 914 bytes SRIP/Libraries/Exp1/Data/T1/images/4.gif | Bin 0 -> 950 bytes SRIP/Libraries/Exp1/Data/T1/images/400.gif | Bin 0 -> 1040 bytes SRIP/Libraries/Exp1/Data/T1/images/407.gif | Bin 0 -> 922 bytes SRIP/Libraries/Exp1/Data/T1/images/409.gif | Bin 0 -> 920 bytes SRIP/Libraries/Exp1/Data/T1/images/41.gif | Bin 0 -> 923 bytes SRIP/Libraries/Exp1/Data/T1/images/417.gif | Bin 0 -> 938 bytes SRIP/Libraries/Exp1/Data/T1/images/428.gif | Bin 0 -> 1030 bytes SRIP/Libraries/Exp1/Data/T1/images/430.gif | Bin 0 -> 1036 bytes SRIP/Libraries/Exp1/Data/T1/images/436.gif | Bin 0 -> 1039 bytes SRIP/Libraries/Exp1/Data/T1/images/441.gif | Bin 0 -> 1034 bytes SRIP/Libraries/Exp1/Data/T1/images/444.gif | Bin 0 -> 942 bytes SRIP/Libraries/Exp1/Data/T1/images/448.gif | Bin 0 -> 946 bytes SRIP/Libraries/Exp1/Data/T1/images/451.gif | Bin 0 -> 931 bytes SRIP/Libraries/Exp1/Data/T1/images/452.gif | Bin 0 -> 1019 bytes SRIP/Libraries/Exp1/Data/T1/images/454.gif | Bin 0 -> 1040 bytes SRIP/Libraries/Exp1/Data/T1/images/455.gif | Bin 0 -> 910 bytes SRIP/Libraries/Exp1/Data/T1/images/456.gif | Bin 0 -> 944 bytes SRIP/Libraries/Exp1/Data/T1/images/459.gif | Bin 0 -> 1039 bytes SRIP/Libraries/Exp1/Data/T1/images/463.gif | Bin 0 -> 1050 bytes SRIP/Libraries/Exp1/Data/T1/images/465.gif | Bin 0 -> 1034 bytes SRIP/Libraries/Exp1/Data/T1/images/467.gif | Bin 0 -> 931 bytes SRIP/Libraries/Exp1/Data/T1/images/471.gif | Bin 0 -> 941 bytes SRIP/Libraries/Exp1/Data/T1/images/474.gif | Bin 0 -> 1041 bytes SRIP/Libraries/Exp1/Data/T1/images/476.gif | Bin 0 -> 947 bytes SRIP/Libraries/Exp1/Data/T1/images/485.gif | Bin 0 -> 915 bytes SRIP/Libraries/Exp1/Data/T1/images/490.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T1/images/492.gif | Bin 0 -> 904 bytes SRIP/Libraries/Exp1/Data/T1/images/493.gif | Bin 0 -> 944 bytes SRIP/Libraries/Exp1/Data/T1/images/508.gif | Bin 0 -> 950 bytes SRIP/Libraries/Exp1/Data/T1/images/509.gif | Bin 0 -> 952 bytes SRIP/Libraries/Exp1/Data/T1/images/511.gif | Bin 0 -> 929 bytes SRIP/Libraries/Exp1/Data/T1/images/52.gif | Bin 0 -> 1030 bytes SRIP/Libraries/Exp1/Data/T1/images/520.gif | Bin 0 -> 1028 bytes SRIP/Libraries/Exp1/Data/T1/images/525.gif | Bin 0 -> 1039 bytes SRIP/Libraries/Exp1/Data/T1/images/527.gif | Bin 0 -> 1048 bytes SRIP/Libraries/Exp1/Data/T1/images/528.gif | Bin 0 -> 1025 bytes SRIP/Libraries/Exp1/Data/T1/images/534.gif | Bin 0 -> 953 bytes SRIP/Libraries/Exp1/Data/T1/images/536.gif | Bin 0 -> 961 bytes SRIP/Libraries/Exp1/Data/T1/images/539.gif | Bin 0 -> 940 bytes SRIP/Libraries/Exp1/Data/T1/images/543.gif | Bin 0 -> 1015 bytes SRIP/Libraries/Exp1/Data/T1/images/553.gif | Bin 0 -> 955 bytes SRIP/Libraries/Exp1/Data/T1/images/554.gif | Bin 0 -> 949 bytes SRIP/Libraries/Exp1/Data/T1/images/557.gif | Bin 0 -> 923 bytes SRIP/Libraries/Exp1/Data/T1/images/57.gif | Bin 0 -> 1044 bytes SRIP/Libraries/Exp1/Data/T1/images/573.gif | Bin 0 -> 902 bytes SRIP/Libraries/Exp1/Data/T1/images/574.gif | Bin 0 -> 956 bytes SRIP/Libraries/Exp1/Data/T1/images/578.gif | Bin 0 -> 1059 bytes SRIP/Libraries/Exp1/Data/T1/images/583.gif | Bin 0 -> 1008 bytes SRIP/Libraries/Exp1/Data/T1/images/588.gif | Bin 0 -> 963 bytes SRIP/Libraries/Exp1/Data/T1/images/594.gif | Bin 0 -> 953 bytes SRIP/Libraries/Exp1/Data/T1/images/597.gif | Bin 0 -> 1039 bytes SRIP/Libraries/Exp1/Data/T1/images/60.gif | Bin 0 -> 953 bytes SRIP/Libraries/Exp1/Data/T1/images/604.gif | Bin 0 -> 947 bytes SRIP/Libraries/Exp1/Data/T1/images/605.gif | Bin 0 -> 915 bytes SRIP/Libraries/Exp1/Data/T1/images/610.gif | Bin 0 -> 959 bytes SRIP/Libraries/Exp1/Data/T1/images/613.gif | Bin 0 -> 1027 bytes SRIP/Libraries/Exp1/Data/T1/images/619.gif | Bin 0 -> 920 bytes SRIP/Libraries/Exp1/Data/T1/images/634.gif | Bin 0 -> 1065 bytes SRIP/Libraries/Exp1/Data/T1/images/638.gif | Bin 0 -> 962 bytes SRIP/Libraries/Exp1/Data/T1/images/639.gif | Bin 0 -> 937 bytes SRIP/Libraries/Exp1/Data/T1/images/64.gif | Bin 0 -> 1040 bytes SRIP/Libraries/Exp1/Data/T1/images/640.gif | Bin 0 -> 1042 bytes SRIP/Libraries/Exp1/Data/T1/images/649.gif | Bin 0 -> 937 bytes SRIP/Libraries/Exp1/Data/T1/images/657.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T1/images/663.gif | Bin 0 -> 1032 bytes SRIP/Libraries/Exp1/Data/T1/images/667.gif | Bin 0 -> 1022 bytes SRIP/Libraries/Exp1/Data/T1/images/668.gif | Bin 0 -> 934 bytes SRIP/Libraries/Exp1/Data/T1/images/669.gif | Bin 0 -> 1033 bytes SRIP/Libraries/Exp1/Data/T1/images/670.gif | Bin 0 -> 1036 bytes SRIP/Libraries/Exp1/Data/T1/images/672.gif | Bin 0 -> 958 bytes SRIP/Libraries/Exp1/Data/T1/images/677.gif | Bin 0 -> 942 bytes SRIP/Libraries/Exp1/Data/T1/images/679.gif | Bin 0 -> 918 bytes SRIP/Libraries/Exp1/Data/T1/images/68.gif | Bin 0 -> 962 bytes SRIP/Libraries/Exp1/Data/T1/images/69.gif | Bin 0 -> 976 bytes SRIP/Libraries/Exp1/Data/T1/images/690.gif | Bin 0 -> 1045 bytes SRIP/Libraries/Exp1/Data/T1/images/692.gif | Bin 0 -> 958 bytes SRIP/Libraries/Exp1/Data/T1/images/699.gif | Bin 0 -> 951 bytes SRIP/Libraries/Exp1/Data/T1/images/7.gif | Bin 0 -> 933 bytes SRIP/Libraries/Exp1/Data/T1/images/70.gif | Bin 0 -> 1013 bytes SRIP/Libraries/Exp1/Data/T1/images/703.gif | Bin 0 -> 1039 bytes SRIP/Libraries/Exp1/Data/T1/images/71.gif | Bin 0 -> 973 bytes SRIP/Libraries/Exp1/Data/T1/images/710.gif | Bin 0 -> 1032 bytes SRIP/Libraries/Exp1/Data/T1/images/711.gif | Bin 0 -> 928 bytes SRIP/Libraries/Exp1/Data/T1/images/712.gif | Bin 0 -> 954 bytes SRIP/Libraries/Exp1/Data/T1/images/713.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T1/images/73.gif | Bin 0 -> 920 bytes SRIP/Libraries/Exp1/Data/T1/images/734.gif | Bin 0 -> 1051 bytes SRIP/Libraries/Exp1/Data/T1/images/739.gif | Bin 0 -> 924 bytes SRIP/Libraries/Exp1/Data/T1/images/744.gif | Bin 0 -> 1036 bytes SRIP/Libraries/Exp1/Data/T1/images/746.gif | Bin 0 -> 1037 bytes SRIP/Libraries/Exp1/Data/T1/images/748.gif | Bin 0 -> 963 bytes SRIP/Libraries/Exp1/Data/T1/images/76.gif | Bin 0 -> 1022 bytes SRIP/Libraries/Exp1/Data/T1/images/766.gif | Bin 0 -> 952 bytes SRIP/Libraries/Exp1/Data/T1/images/777.gif | Bin 0 -> 995 bytes SRIP/Libraries/Exp1/Data/T1/images/78.gif | Bin 0 -> 935 bytes SRIP/Libraries/Exp1/Data/T1/images/780.gif | Bin 0 -> 955 bytes SRIP/Libraries/Exp1/Data/T1/images/781.gif | Bin 0 -> 931 bytes SRIP/Libraries/Exp1/Data/T1/images/782.gif | Bin 0 -> 1050 bytes SRIP/Libraries/Exp1/Data/T1/images/784.gif | Bin 0 -> 951 bytes SRIP/Libraries/Exp1/Data/T1/images/788.gif | Bin 0 -> 1046 bytes SRIP/Libraries/Exp1/Data/T1/images/79.gif | Bin 0 -> 947 bytes SRIP/Libraries/Exp1/Data/T1/images/791.gif | Bin 0 -> 1048 bytes SRIP/Libraries/Exp1/Data/T1/images/810.gif | Bin 0 -> 952 bytes SRIP/Libraries/Exp1/Data/T1/images/819.gif | Bin 0 -> 1036 bytes SRIP/Libraries/Exp1/Data/T1/images/82.gif | Bin 0 -> 1018 bytes SRIP/Libraries/Exp1/Data/T1/images/822.gif | Bin 0 -> 967 bytes SRIP/Libraries/Exp1/Data/T1/images/826.gif | Bin 0 -> 951 bytes SRIP/Libraries/Exp1/Data/T1/images/834.gif | Bin 0 -> 947 bytes SRIP/Libraries/Exp1/Data/T1/images/836.gif | Bin 0 -> 950 bytes SRIP/Libraries/Exp1/Data/T1/images/839.gif | Bin 0 -> 927 bytes SRIP/Libraries/Exp1/Data/T1/images/850.gif | Bin 0 -> 944 bytes SRIP/Libraries/Exp1/Data/T1/images/860.gif | Bin 0 -> 1044 bytes SRIP/Libraries/Exp1/Data/T1/images/861.gif | Bin 0 -> 1031 bytes SRIP/Libraries/Exp1/Data/T1/images/870.gif | Bin 0 -> 1040 bytes SRIP/Libraries/Exp1/Data/T1/images/871.gif | Bin 0 -> 942 bytes SRIP/Libraries/Exp1/Data/T1/images/872.gif | Bin 0 -> 950 bytes SRIP/Libraries/Exp1/Data/T1/images/873.gif | Bin 0 -> 1035 bytes SRIP/Libraries/Exp1/Data/T1/images/89.gif | Bin 0 -> 1046 bytes SRIP/Libraries/Exp1/Data/T1/images/890.gif | Bin 0 -> 1050 bytes SRIP/Libraries/Exp1/Data/T1/images/892.gif | Bin 0 -> 954 bytes SRIP/Libraries/Exp1/Data/T1/images/9.gif | Bin 0 -> 924 bytes SRIP/Libraries/Exp1/Data/T1/images/904.gif | Bin 0 -> 1051 bytes SRIP/Libraries/Exp1/Data/T1/images/906.gif | Bin 0 -> 956 bytes SRIP/Libraries/Exp1/Data/T1/images/920.gif | Bin 0 -> 958 bytes SRIP/Libraries/Exp1/Data/T1/images/921.gif | Bin 0 -> 932 bytes SRIP/Libraries/Exp1/Data/T1/images/928.gif | Bin 0 -> 1055 bytes SRIP/Libraries/Exp1/Data/T1/images/942.gif | Bin 0 -> 937 bytes SRIP/Libraries/Exp1/Data/T1/images/944.gif | Bin 0 -> 1031 bytes SRIP/Libraries/Exp1/Data/T1/images/950.gif | Bin 0 -> 1046 bytes SRIP/Libraries/Exp1/Data/T1/images/952.gif | Bin 0 -> 956 bytes SRIP/Libraries/Exp1/Data/T1/images/953.gif | Bin 0 -> 1012 bytes SRIP/Libraries/Exp1/Data/T1/images/958.gif | Bin 0 -> 1040 bytes SRIP/Libraries/Exp1/Data/T1/images/96.gif | Bin 0 -> 1008 bytes SRIP/Libraries/Exp1/Data/T1/images/960.gif | Bin 0 -> 963 bytes SRIP/Libraries/Exp1/Data/T1/images/962.gif | Bin 0 -> 944 bytes SRIP/Libraries/Exp1/Data/T1/images/966.gif | Bin 0 -> 1057 bytes SRIP/Libraries/Exp1/Data/T1/images/979.gif | Bin 0 -> 924 bytes SRIP/Libraries/Exp1/Data/T1/images/980.gif | Bin 0 -> 1043 bytes SRIP/Libraries/Exp1/Data/T1/images/983.gif | Bin 0 -> 943 bytes SRIP/Libraries/Exp1/Data/T1/images/985.gif | Bin 0 -> 1032 bytes SRIP/Libraries/Exp1/Data/T1/images/994.gif | Bin 0 -> 946 bytes SRIP/Libraries/Exp1/Data/T1/images/998.gif | Bin 0 -> 1037 bytes SRIP/Libraries/Exp1/Data/T2/Config.txt | 13 + SRIP/Libraries/Exp1/Data/T2/Data.txt | 192 + SRIP/Libraries/Exp1/Data/T2/images/108.gif | Bin 0 -> 1000 bytes SRIP/Libraries/Exp1/Data/T2/images/11.gif | Bin 0 -> 990 bytes SRIP/Libraries/Exp1/Data/T2/images/110.gif | Bin 0 -> 979 bytes SRIP/Libraries/Exp1/Data/T2/images/112.gif | Bin 0 -> 1044 bytes SRIP/Libraries/Exp1/Data/T2/images/118.gif | Bin 0 -> 1030 bytes SRIP/Libraries/Exp1/Data/T2/images/121.gif | Bin 0 -> 1006 bytes SRIP/Libraries/Exp1/Data/T2/images/123.gif | Bin 0 -> 989 bytes SRIP/Libraries/Exp1/Data/T2/images/13.gif | Bin 0 -> 1027 bytes SRIP/Libraries/Exp1/Data/T2/images/131.gif | Bin 0 -> 991 bytes SRIP/Libraries/Exp1/Data/T2/images/136.gif | Bin 0 -> 1016 bytes SRIP/Libraries/Exp1/Data/T2/images/137.gif | Bin 0 -> 988 bytes SRIP/Libraries/Exp1/Data/T2/images/144.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T2/images/150.gif | Bin 0 -> 1017 bytes SRIP/Libraries/Exp1/Data/T2/images/158.gif | Bin 0 -> 1016 bytes SRIP/Libraries/Exp1/Data/T2/images/160.gif | Bin 0 -> 1018 bytes SRIP/Libraries/Exp1/Data/T2/images/162.gif | Bin 0 -> 1031 bytes SRIP/Libraries/Exp1/Data/T2/images/17.gif | Bin 0 -> 1023 bytes SRIP/Libraries/Exp1/Data/T2/images/172.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T2/images/179.gif | Bin 0 -> 952 bytes SRIP/Libraries/Exp1/Data/T2/images/180.gif | Bin 0 -> 1028 bytes SRIP/Libraries/Exp1/Data/T2/images/181.gif | Bin 0 -> 953 bytes SRIP/Libraries/Exp1/Data/T2/images/182.gif | Bin 0 -> 1015 bytes SRIP/Libraries/Exp1/Data/T2/images/188.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T2/images/190.gif | Bin 0 -> 999 bytes SRIP/Libraries/Exp1/Data/T2/images/191.gif | Bin 0 -> 1017 bytes SRIP/Libraries/Exp1/Data/T2/images/199.gif | Bin 0 -> 1012 bytes SRIP/Libraries/Exp1/Data/T2/images/200.gif | Bin 0 -> 1000 bytes SRIP/Libraries/Exp1/Data/T2/images/204.gif | Bin 0 -> 1025 bytes SRIP/Libraries/Exp1/Data/T2/images/208.gif | Bin 0 -> 1008 bytes SRIP/Libraries/Exp1/Data/T2/images/214.gif | Bin 0 -> 1027 bytes SRIP/Libraries/Exp1/Data/T2/images/216.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T2/images/221.gif | Bin 0 -> 1010 bytes SRIP/Libraries/Exp1/Data/T2/images/229.gif | Bin 0 -> 996 bytes SRIP/Libraries/Exp1/Data/T2/images/234.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T2/images/236.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T2/images/243.gif | Bin 0 -> 1024 bytes SRIP/Libraries/Exp1/Data/T2/images/251.gif | Bin 0 -> 995 bytes SRIP/Libraries/Exp1/Data/T2/images/253.gif | Bin 0 -> 991 bytes SRIP/Libraries/Exp1/Data/T2/images/254.gif | Bin 0 -> 1037 bytes SRIP/Libraries/Exp1/Data/T2/images/255.gif | Bin 0 -> 1028 bytes SRIP/Libraries/Exp1/Data/T2/images/256.gif | Bin 0 -> 1022 bytes SRIP/Libraries/Exp1/Data/T2/images/26.gif | Bin 0 -> 1031 bytes SRIP/Libraries/Exp1/Data/T2/images/263.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T2/images/269.gif | Bin 0 -> 989 bytes SRIP/Libraries/Exp1/Data/T2/images/278.gif | Bin 0 -> 1039 bytes SRIP/Libraries/Exp1/Data/T2/images/28.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T2/images/280.gif | Bin 0 -> 937 bytes SRIP/Libraries/Exp1/Data/T2/images/282.gif | Bin 0 -> 1012 bytes SRIP/Libraries/Exp1/Data/T2/images/29.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T2/images/292.gif | Bin 0 -> 1008 bytes SRIP/Libraries/Exp1/Data/T2/images/299.gif | Bin 0 -> 996 bytes SRIP/Libraries/Exp1/Data/T2/images/309.gif | Bin 0 -> 1014 bytes SRIP/Libraries/Exp1/Data/T2/images/31.gif | Bin 0 -> 991 bytes SRIP/Libraries/Exp1/Data/T2/images/318.gif | Bin 0 -> 1040 bytes SRIP/Libraries/Exp1/Data/T2/images/319.gif | Bin 0 -> 1030 bytes SRIP/Libraries/Exp1/Data/T2/images/322.gif | Bin 0 -> 1022 bytes SRIP/Libraries/Exp1/Data/T2/images/326.gif | Bin 0 -> 1019 bytes SRIP/Libraries/Exp1/Data/T2/images/328.gif | Bin 0 -> 1017 bytes SRIP/Libraries/Exp1/Data/T2/images/331.gif | Bin 0 -> 973 bytes SRIP/Libraries/Exp1/Data/T2/images/340.gif | Bin 0 -> 1040 bytes SRIP/Libraries/Exp1/Data/T2/images/342.gif | Bin 0 -> 1012 bytes SRIP/Libraries/Exp1/Data/T2/images/348.gif | Bin 0 -> 1043 bytes SRIP/Libraries/Exp1/Data/T2/images/357.gif | Bin 0 -> 976 bytes SRIP/Libraries/Exp1/Data/T2/images/361.gif | Bin 0 -> 990 bytes SRIP/Libraries/Exp1/Data/T2/images/362.gif | Bin 0 -> 1013 bytes SRIP/Libraries/Exp1/Data/T2/images/366.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T2/images/376.gif | Bin 0 -> 1052 bytes SRIP/Libraries/Exp1/Data/T2/images/379.gif | Bin 0 -> 1041 bytes SRIP/Libraries/Exp1/Data/T2/images/382.gif | Bin 0 -> 1042 bytes SRIP/Libraries/Exp1/Data/T2/images/386.gif | Bin 0 -> 1030 bytes SRIP/Libraries/Exp1/Data/T2/images/391.gif | Bin 0 -> 1028 bytes SRIP/Libraries/Exp1/Data/T2/images/392.gif | Bin 0 -> 1055 bytes SRIP/Libraries/Exp1/Data/T2/images/393.gif | Bin 0 -> 1026 bytes SRIP/Libraries/Exp1/Data/T2/images/401.gif | Bin 0 -> 1017 bytes SRIP/Libraries/Exp1/Data/T2/images/406.gif | Bin 0 -> 1036 bytes SRIP/Libraries/Exp1/Data/T2/images/411.gif | Bin 0 -> 1005 bytes SRIP/Libraries/Exp1/Data/T2/images/426.gif | Bin 0 -> 1033 bytes SRIP/Libraries/Exp1/Data/T2/images/433.gif | Bin 0 -> 1026 bytes SRIP/Libraries/Exp1/Data/T2/images/434.gif | Bin 0 -> 1003 bytes SRIP/Libraries/Exp1/Data/T2/images/445.gif | Bin 0 -> 969 bytes SRIP/Libraries/Exp1/Data/T2/images/449.gif | Bin 0 -> 968 bytes SRIP/Libraries/Exp1/Data/T2/images/45.gif | Bin 0 -> 956 bytes SRIP/Libraries/Exp1/Data/T2/images/453.gif | Bin 0 -> 1010 bytes SRIP/Libraries/Exp1/Data/T2/images/458.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T2/images/460.gif | Bin 0 -> 1006 bytes SRIP/Libraries/Exp1/Data/T2/images/473.gif | Bin 0 -> 980 bytes SRIP/Libraries/Exp1/Data/T2/images/477.gif | Bin 0 -> 999 bytes SRIP/Libraries/Exp1/Data/T2/images/478.gif | Bin 0 -> 1036 bytes SRIP/Libraries/Exp1/Data/T2/images/480.gif | Bin 0 -> 1015 bytes SRIP/Libraries/Exp1/Data/T2/images/487.gif | Bin 0 -> 1031 bytes SRIP/Libraries/Exp1/Data/T2/images/491.gif | Bin 0 -> 1027 bytes SRIP/Libraries/Exp1/Data/T2/images/494.gif | Bin 0 -> 1008 bytes SRIP/Libraries/Exp1/Data/T2/images/496.gif | Bin 0 -> 1030 bytes SRIP/Libraries/Exp1/Data/T2/images/50.gif | Bin 0 -> 1018 bytes SRIP/Libraries/Exp1/Data/T2/images/501.gif | Bin 0 -> 980 bytes SRIP/Libraries/Exp1/Data/T2/images/51.gif | Bin 0 -> 1001 bytes SRIP/Libraries/Exp1/Data/T2/images/510.gif | Bin 0 -> 1022 bytes SRIP/Libraries/Exp1/Data/T2/images/516.gif | Bin 0 -> 1000 bytes SRIP/Libraries/Exp1/Data/T2/images/531.gif | Bin 0 -> 989 bytes SRIP/Libraries/Exp1/Data/T2/images/541.gif | Bin 0 -> 947 bytes SRIP/Libraries/Exp1/Data/T2/images/547.gif | Bin 0 -> 1016 bytes SRIP/Libraries/Exp1/Data/T2/images/549.gif | Bin 0 -> 1051 bytes SRIP/Libraries/Exp1/Data/T2/images/550.gif | Bin 0 -> 1031 bytes SRIP/Libraries/Exp1/Data/T2/images/552.gif | Bin 0 -> 1023 bytes SRIP/Libraries/Exp1/Data/T2/images/556.gif | Bin 0 -> 1040 bytes SRIP/Libraries/Exp1/Data/T2/images/558.gif | Bin 0 -> 1033 bytes SRIP/Libraries/Exp1/Data/T2/images/559.gif | Bin 0 -> 945 bytes SRIP/Libraries/Exp1/Data/T2/images/562.gif | Bin 0 -> 1019 bytes SRIP/Libraries/Exp1/Data/T2/images/564.gif | Bin 0 -> 1035 bytes SRIP/Libraries/Exp1/Data/T2/images/569.gif | Bin 0 -> 1019 bytes SRIP/Libraries/Exp1/Data/T2/images/571.gif | Bin 0 -> 981 bytes SRIP/Libraries/Exp1/Data/T2/images/575.gif | Bin 0 -> 967 bytes SRIP/Libraries/Exp1/Data/T2/images/582.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T2/images/585.gif | Bin 0 -> 986 bytes SRIP/Libraries/Exp1/Data/T2/images/589.gif | Bin 0 -> 972 bytes SRIP/Libraries/Exp1/Data/T2/images/592.gif | Bin 0 -> 1039 bytes SRIP/Libraries/Exp1/Data/T2/images/6.gif | Bin 0 -> 1043 bytes SRIP/Libraries/Exp1/Data/T2/images/614.gif | Bin 0 -> 1013 bytes SRIP/Libraries/Exp1/Data/T2/images/620.gif | Bin 0 -> 1001 bytes SRIP/Libraries/Exp1/Data/T2/images/630.gif | Bin 0 -> 1025 bytes SRIP/Libraries/Exp1/Data/T2/images/643.gif | Bin 0 -> 1010 bytes SRIP/Libraries/Exp1/Data/T2/images/644.gif | Bin 0 -> 1019 bytes SRIP/Libraries/Exp1/Data/T2/images/646.gif | Bin 0 -> 1028 bytes SRIP/Libraries/Exp1/Data/T2/images/647.gif | Bin 0 -> 978 bytes SRIP/Libraries/Exp1/Data/T2/images/651.gif | Bin 0 -> 978 bytes SRIP/Libraries/Exp1/Data/T2/images/658.gif | Bin 0 -> 1001 bytes SRIP/Libraries/Exp1/Data/T2/images/660.gif | Bin 0 -> 1026 bytes SRIP/Libraries/Exp1/Data/T2/images/665.gif | Bin 0 -> 981 bytes SRIP/Libraries/Exp1/Data/T2/images/671.gif | Bin 0 -> 1045 bytes SRIP/Libraries/Exp1/Data/T2/images/674.gif | Bin 0 -> 1013 bytes SRIP/Libraries/Exp1/Data/T2/images/675.gif | Bin 0 -> 976 bytes SRIP/Libraries/Exp1/Data/T2/images/676.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T2/images/685.gif | Bin 0 -> 933 bytes SRIP/Libraries/Exp1/Data/T2/images/689.gif | Bin 0 -> 998 bytes SRIP/Libraries/Exp1/Data/T2/images/694.gif | Bin 0 -> 1001 bytes SRIP/Libraries/Exp1/Data/T2/images/696.gif | Bin 0 -> 1001 bytes SRIP/Libraries/Exp1/Data/T2/images/697.gif | Bin 0 -> 995 bytes SRIP/Libraries/Exp1/Data/T2/images/714.gif | Bin 0 -> 1026 bytes SRIP/Libraries/Exp1/Data/T2/images/715.gif | Bin 0 -> 997 bytes SRIP/Libraries/Exp1/Data/T2/images/716.gif | Bin 0 -> 1018 bytes SRIP/Libraries/Exp1/Data/T2/images/717.gif | Bin 0 -> 1037 bytes SRIP/Libraries/Exp1/Data/T2/images/732.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T2/images/733.gif | Bin 0 -> 1014 bytes SRIP/Libraries/Exp1/Data/T2/images/75.gif | Bin 0 -> 990 bytes SRIP/Libraries/Exp1/Data/T2/images/753.gif | Bin 0 -> 1033 bytes SRIP/Libraries/Exp1/Data/T2/images/761.gif | Bin 0 -> 1014 bytes SRIP/Libraries/Exp1/Data/T2/images/768.gif | Bin 0 -> 1010 bytes SRIP/Libraries/Exp1/Data/T2/images/77.gif | Bin 0 -> 1010 bytes SRIP/Libraries/Exp1/Data/T2/images/775.gif | Bin 0 -> 1032 bytes SRIP/Libraries/Exp1/Data/T2/images/790.gif | Bin 0 -> 1001 bytes SRIP/Libraries/Exp1/Data/T2/images/8.gif | Bin 0 -> 1017 bytes SRIP/Libraries/Exp1/Data/T2/images/802.gif | Bin 0 -> 970 bytes SRIP/Libraries/Exp1/Data/T2/images/808.gif | Bin 0 -> 992 bytes SRIP/Libraries/Exp1/Data/T2/images/809.gif | Bin 0 -> 949 bytes SRIP/Libraries/Exp1/Data/T2/images/812.gif | Bin 0 -> 1012 bytes SRIP/Libraries/Exp1/Data/T2/images/814.gif | Bin 0 -> 995 bytes SRIP/Libraries/Exp1/Data/T2/images/815.gif | Bin 0 -> 992 bytes SRIP/Libraries/Exp1/Data/T2/images/83.gif | Bin 0 -> 1024 bytes SRIP/Libraries/Exp1/Data/T2/images/831.gif | Bin 0 -> 1019 bytes SRIP/Libraries/Exp1/Data/T2/images/841.gif | Bin 0 -> 1006 bytes SRIP/Libraries/Exp1/Data/T2/images/844.gif | Bin 0 -> 1014 bytes SRIP/Libraries/Exp1/Data/T2/images/845.gif | Bin 0 -> 1052 bytes SRIP/Libraries/Exp1/Data/T2/images/855.gif | Bin 0 -> 1007 bytes SRIP/Libraries/Exp1/Data/T2/images/857.gif | Bin 0 -> 969 bytes SRIP/Libraries/Exp1/Data/T2/images/858.gif | Bin 0 -> 1028 bytes SRIP/Libraries/Exp1/Data/T2/images/862.gif | Bin 0 -> 1018 bytes SRIP/Libraries/Exp1/Data/T2/images/863.gif | Bin 0 -> 1016 bytes SRIP/Libraries/Exp1/Data/T2/images/864.gif | Bin 0 -> 976 bytes SRIP/Libraries/Exp1/Data/T2/images/867.gif | Bin 0 -> 998 bytes SRIP/Libraries/Exp1/Data/T2/images/868.gif | Bin 0 -> 1019 bytes SRIP/Libraries/Exp1/Data/T2/images/87.gif | Bin 0 -> 997 bytes SRIP/Libraries/Exp1/Data/T2/images/874.gif | Bin 0 -> 1041 bytes SRIP/Libraries/Exp1/Data/T2/images/875.gif | Bin 0 -> 1016 bytes SRIP/Libraries/Exp1/Data/T2/images/876.gif | Bin 0 -> 1034 bytes SRIP/Libraries/Exp1/Data/T2/images/879.gif | Bin 0 -> 981 bytes SRIP/Libraries/Exp1/Data/T2/images/891.gif | Bin 0 -> 998 bytes SRIP/Libraries/Exp1/Data/T2/images/894.gif | Bin 0 -> 1048 bytes SRIP/Libraries/Exp1/Data/T2/images/896.gif | Bin 0 -> 1059 bytes SRIP/Libraries/Exp1/Data/T2/images/908.gif | Bin 0 -> 1040 bytes SRIP/Libraries/Exp1/Data/T2/images/910.gif | Bin 0 -> 1045 bytes SRIP/Libraries/Exp1/Data/T2/images/918.gif | Bin 0 -> 1032 bytes SRIP/Libraries/Exp1/Data/T2/images/932.gif | Bin 0 -> 1048 bytes SRIP/Libraries/Exp1/Data/T2/images/939.gif | Bin 0 -> 1003 bytes SRIP/Libraries/Exp1/Data/T2/images/947.gif | Bin 0 -> 1019 bytes SRIP/Libraries/Exp1/Data/T2/images/954.gif | Bin 0 -> 1035 bytes SRIP/Libraries/Exp1/Data/T2/images/967.gif | Bin 0 -> 1003 bytes SRIP/Libraries/Exp1/Data/T2/images/976.gif | Bin 0 -> 1024 bytes SRIP/Libraries/Exp1/Data/T2/images/984.gif | Bin 0 -> 1035 bytes SRIP/Libraries/Exp1/Data/T2/images/99.gif | Bin 0 -> 991 bytes SRIP/Libraries/Exp1/Data/T2/images/990.gif | Bin 0 -> 1044 bytes SRIP/Libraries/Exp1/Data/T2/images/993.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T2/images/999.gif | Bin 0 -> 1032 bytes SRIP/Libraries/Exp1/Data/T3/Config.txt | 13 + SRIP/Libraries/Exp1/Data/T3/Data.txt | 187 + SRIP/Libraries/Exp1/Data/T3/images/111.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T3/images/117.gif | Bin 0 -> 995 bytes SRIP/Libraries/Exp1/Data/T3/images/126.gif | Bin 0 -> 1025 bytes SRIP/Libraries/Exp1/Data/T3/images/134.gif | Bin 0 -> 973 bytes SRIP/Libraries/Exp1/Data/T3/images/138.gif | Bin 0 -> 922 bytes SRIP/Libraries/Exp1/Data/T3/images/145.gif | Bin 0 -> 1019 bytes SRIP/Libraries/Exp1/Data/T3/images/147.gif | Bin 0 -> 1035 bytes SRIP/Libraries/Exp1/Data/T3/images/154.gif | Bin 0 -> 979 bytes SRIP/Libraries/Exp1/Data/T3/images/155.gif | Bin 0 -> 1016 bytes SRIP/Libraries/Exp1/Data/T3/images/161.gif | Bin 0 -> 1004 bytes SRIP/Libraries/Exp1/Data/T3/images/163.gif | Bin 0 -> 980 bytes SRIP/Libraries/Exp1/Data/T3/images/168.gif | Bin 0 -> 1013 bytes SRIP/Libraries/Exp1/Data/T3/images/171.gif | Bin 0 -> 999 bytes SRIP/Libraries/Exp1/Data/T3/images/173.gif | Bin 0 -> 1008 bytes SRIP/Libraries/Exp1/Data/T3/images/177.gif | Bin 0 -> 973 bytes SRIP/Libraries/Exp1/Data/T3/images/18.gif | Bin 0 -> 1022 bytes SRIP/Libraries/Exp1/Data/T3/images/184.gif | Bin 0 -> 926 bytes SRIP/Libraries/Exp1/Data/T3/images/189.gif | Bin 0 -> 1037 bytes SRIP/Libraries/Exp1/Data/T3/images/196.gif | Bin 0 -> 992 bytes SRIP/Libraries/Exp1/Data/T3/images/198.gif | Bin 0 -> 1022 bytes SRIP/Libraries/Exp1/Data/T3/images/20.gif | Bin 0 -> 974 bytes SRIP/Libraries/Exp1/Data/T3/images/203.gif | Bin 0 -> 1035 bytes SRIP/Libraries/Exp1/Data/T3/images/226.gif | Bin 0 -> 1023 bytes SRIP/Libraries/Exp1/Data/T3/images/227.gif | Bin 0 -> 978 bytes SRIP/Libraries/Exp1/Data/T3/images/228.gif | Bin 0 -> 992 bytes SRIP/Libraries/Exp1/Data/T3/images/23.gif | Bin 0 -> 988 bytes SRIP/Libraries/Exp1/Data/T3/images/241.gif | Bin 0 -> 977 bytes SRIP/Libraries/Exp1/Data/T3/images/246.gif | Bin 0 -> 938 bytes SRIP/Libraries/Exp1/Data/T3/images/248.gif | Bin 0 -> 999 bytes SRIP/Libraries/Exp1/Data/T3/images/265.gif | Bin 0 -> 1012 bytes SRIP/Libraries/Exp1/Data/T3/images/266.gif | Bin 0 -> 1013 bytes SRIP/Libraries/Exp1/Data/T3/images/268.gif | Bin 0 -> 985 bytes SRIP/Libraries/Exp1/Data/T3/images/281.gif | Bin 0 -> 991 bytes SRIP/Libraries/Exp1/Data/T3/images/283.gif | Bin 0 -> 980 bytes SRIP/Libraries/Exp1/Data/T3/images/286.gif | Bin 0 -> 974 bytes SRIP/Libraries/Exp1/Data/T3/images/296.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T3/images/301.gif | Bin 0 -> 991 bytes SRIP/Libraries/Exp1/Data/T3/images/305.gif | Bin 0 -> 924 bytes SRIP/Libraries/Exp1/Data/T3/images/313.gif | Bin 0 -> 1014 bytes SRIP/Libraries/Exp1/Data/T3/images/314.gif | Bin 0 -> 991 bytes SRIP/Libraries/Exp1/Data/T3/images/32.gif | Bin 0 -> 1003 bytes SRIP/Libraries/Exp1/Data/T3/images/320.gif | Bin 0 -> 999 bytes SRIP/Libraries/Exp1/Data/T3/images/323.gif | Bin 0 -> 1005 bytes SRIP/Libraries/Exp1/Data/T3/images/334.gif | Bin 0 -> 1043 bytes SRIP/Libraries/Exp1/Data/T3/images/335.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T3/images/34.gif | Bin 0 -> 988 bytes SRIP/Libraries/Exp1/Data/T3/images/344.gif | Bin 0 -> 1036 bytes SRIP/Libraries/Exp1/Data/T3/images/345.gif | Bin 0 -> 945 bytes SRIP/Libraries/Exp1/Data/T3/images/347.gif | Bin 0 -> 1015 bytes SRIP/Libraries/Exp1/Data/T3/images/349.gif | Bin 0 -> 1023 bytes SRIP/Libraries/Exp1/Data/T3/images/351.gif | Bin 0 -> 998 bytes SRIP/Libraries/Exp1/Data/T3/images/353.gif | Bin 0 -> 1073 bytes SRIP/Libraries/Exp1/Data/T3/images/363.gif | Bin 0 -> 982 bytes SRIP/Libraries/Exp1/Data/T3/images/365.gif | Bin 0 -> 994 bytes SRIP/Libraries/Exp1/Data/T3/images/369.gif | Bin 0 -> 1010 bytes SRIP/Libraries/Exp1/Data/T3/images/375.gif | Bin 0 -> 986 bytes SRIP/Libraries/Exp1/Data/T3/images/384.gif | Bin 0 -> 1004 bytes SRIP/Libraries/Exp1/Data/T3/images/387.gif | Bin 0 -> 1057 bytes SRIP/Libraries/Exp1/Data/T3/images/390.gif | Bin 0 -> 992 bytes SRIP/Libraries/Exp1/Data/T3/images/394.gif | Bin 0 -> 942 bytes SRIP/Libraries/Exp1/Data/T3/images/405.gif | Bin 0 -> 1072 bytes SRIP/Libraries/Exp1/Data/T3/images/410.gif | Bin 0 -> 1007 bytes SRIP/Libraries/Exp1/Data/T3/images/416.gif | Bin 0 -> 942 bytes SRIP/Libraries/Exp1/Data/T3/images/419.gif | Bin 0 -> 970 bytes SRIP/Libraries/Exp1/Data/T3/images/42.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T3/images/420.gif | Bin 0 -> 996 bytes SRIP/Libraries/Exp1/Data/T3/images/424.gif | Bin 0 -> 989 bytes SRIP/Libraries/Exp1/Data/T3/images/425.gif | Bin 0 -> 979 bytes SRIP/Libraries/Exp1/Data/T3/images/429.gif | Bin 0 -> 987 bytes SRIP/Libraries/Exp1/Data/T3/images/435.gif | Bin 0 -> 1003 bytes SRIP/Libraries/Exp1/Data/T3/images/44.gif | Bin 0 -> 967 bytes SRIP/Libraries/Exp1/Data/T3/images/440.gif | Bin 0 -> 1022 bytes SRIP/Libraries/Exp1/Data/T3/images/442.gif | Bin 0 -> 985 bytes SRIP/Libraries/Exp1/Data/T3/images/446.gif | Bin 0 -> 1028 bytes SRIP/Libraries/Exp1/Data/T3/images/457.gif | Bin 0 -> 1001 bytes SRIP/Libraries/Exp1/Data/T3/images/46.gif | Bin 0 -> 1007 bytes SRIP/Libraries/Exp1/Data/T3/images/461.gif | Bin 0 -> 1014 bytes SRIP/Libraries/Exp1/Data/T3/images/47.gif | Bin 0 -> 1033 bytes SRIP/Libraries/Exp1/Data/T3/images/470.gif | Bin 0 -> 1049 bytes SRIP/Libraries/Exp1/Data/T3/images/472.gif | Bin 0 -> 986 bytes SRIP/Libraries/Exp1/Data/T3/images/483.gif | Bin 0 -> 990 bytes SRIP/Libraries/Exp1/Data/T3/images/486.gif | Bin 0 -> 1039 bytes SRIP/Libraries/Exp1/Data/T3/images/488.gif | Bin 0 -> 1003 bytes SRIP/Libraries/Exp1/Data/T3/images/49.gif | Bin 0 -> 973 bytes SRIP/Libraries/Exp1/Data/T3/images/5.gif | Bin 0 -> 999 bytes SRIP/Libraries/Exp1/Data/T3/images/500.gif | Bin 0 -> 1037 bytes SRIP/Libraries/Exp1/Data/T3/images/502.gif | Bin 0 -> 999 bytes SRIP/Libraries/Exp1/Data/T3/images/504.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T3/images/518.gif | Bin 0 -> 1043 bytes SRIP/Libraries/Exp1/Data/T3/images/521.gif | Bin 0 -> 1005 bytes SRIP/Libraries/Exp1/Data/T3/images/526.gif | Bin 0 -> 1010 bytes SRIP/Libraries/Exp1/Data/T3/images/529.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T3/images/530.gif | Bin 0 -> 974 bytes SRIP/Libraries/Exp1/Data/T3/images/533.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T3/images/540.gif | Bin 0 -> 1055 bytes SRIP/Libraries/Exp1/Data/T3/images/546.gif | Bin 0 -> 1040 bytes SRIP/Libraries/Exp1/Data/T3/images/55.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T3/images/551.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T3/images/56.gif | Bin 0 -> 1025 bytes SRIP/Libraries/Exp1/Data/T3/images/560.gif | Bin 0 -> 1053 bytes SRIP/Libraries/Exp1/Data/T3/images/567.gif | Bin 0 -> 985 bytes SRIP/Libraries/Exp1/Data/T3/images/572.gif | Bin 0 -> 1035 bytes SRIP/Libraries/Exp1/Data/T3/images/576.gif | Bin 0 -> 1034 bytes SRIP/Libraries/Exp1/Data/T3/images/58.gif | Bin 0 -> 977 bytes SRIP/Libraries/Exp1/Data/T3/images/581.gif | Bin 0 -> 999 bytes SRIP/Libraries/Exp1/Data/T3/images/584.gif | Bin 0 -> 994 bytes SRIP/Libraries/Exp1/Data/T3/images/590.gif | Bin 0 -> 995 bytes SRIP/Libraries/Exp1/Data/T3/images/595.gif | Bin 0 -> 1022 bytes SRIP/Libraries/Exp1/Data/T3/images/596.gif | Bin 0 -> 990 bytes SRIP/Libraries/Exp1/Data/T3/images/601.gif | Bin 0 -> 969 bytes SRIP/Libraries/Exp1/Data/T3/images/602.gif | Bin 0 -> 1001 bytes SRIP/Libraries/Exp1/Data/T3/images/603.gif | Bin 0 -> 1041 bytes SRIP/Libraries/Exp1/Data/T3/images/616.gif | Bin 0 -> 1031 bytes SRIP/Libraries/Exp1/Data/T3/images/622.gif | Bin 0 -> 1006 bytes SRIP/Libraries/Exp1/Data/T3/images/627.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T3/images/628.gif | Bin 0 -> 1030 bytes SRIP/Libraries/Exp1/Data/T3/images/629.gif | Bin 0 -> 1019 bytes SRIP/Libraries/Exp1/Data/T3/images/632.gif | Bin 0 -> 1017 bytes SRIP/Libraries/Exp1/Data/T3/images/642.gif | Bin 0 -> 986 bytes SRIP/Libraries/Exp1/Data/T3/images/686.gif | Bin 0 -> 1003 bytes SRIP/Libraries/Exp1/Data/T3/images/688.gif | Bin 0 -> 988 bytes SRIP/Libraries/Exp1/Data/T3/images/695.gif | Bin 0 -> 1014 bytes SRIP/Libraries/Exp1/Data/T3/images/705.gif | Bin 0 -> 1077 bytes SRIP/Libraries/Exp1/Data/T3/images/706.gif | Bin 0 -> 1021 bytes SRIP/Libraries/Exp1/Data/T3/images/708.gif | Bin 0 -> 986 bytes SRIP/Libraries/Exp1/Data/T3/images/709.gif | Bin 0 -> 1001 bytes SRIP/Libraries/Exp1/Data/T3/images/721.gif | Bin 0 -> 974 bytes SRIP/Libraries/Exp1/Data/T3/images/726.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T3/images/727.gif | Bin 0 -> 1026 bytes SRIP/Libraries/Exp1/Data/T3/images/728.gif | Bin 0 -> 1009 bytes SRIP/Libraries/Exp1/Data/T3/images/735.gif | Bin 0 -> 1045 bytes SRIP/Libraries/Exp1/Data/T3/images/737.gif | Bin 0 -> 963 bytes SRIP/Libraries/Exp1/Data/T3/images/741.gif | Bin 0 -> 1003 bytes SRIP/Libraries/Exp1/Data/T3/images/742.gif | Bin 0 -> 1017 bytes SRIP/Libraries/Exp1/Data/T3/images/745.gif | Bin 0 -> 943 bytes SRIP/Libraries/Exp1/Data/T3/images/756.gif | Bin 0 -> 1014 bytes SRIP/Libraries/Exp1/Data/T3/images/757.gif | Bin 0 -> 1035 bytes SRIP/Libraries/Exp1/Data/T3/images/759.gif | Bin 0 -> 1049 bytes SRIP/Libraries/Exp1/Data/T3/images/762.gif | Bin 0 -> 1024 bytes SRIP/Libraries/Exp1/Data/T3/images/764.gif | Bin 0 -> 1015 bytes SRIP/Libraries/Exp1/Data/T3/images/765.gif | Bin 0 -> 1005 bytes SRIP/Libraries/Exp1/Data/T3/images/767.gif | Bin 0 -> 1028 bytes SRIP/Libraries/Exp1/Data/T3/images/770.gif | Bin 0 -> 1030 bytes SRIP/Libraries/Exp1/Data/T3/images/773.gif | Bin 0 -> 1025 bytes SRIP/Libraries/Exp1/Data/T3/images/778.gif | Bin 0 -> 1032 bytes SRIP/Libraries/Exp1/Data/T3/images/783.gif | Bin 0 -> 992 bytes SRIP/Libraries/Exp1/Data/T3/images/785.gif | Bin 0 -> 1014 bytes SRIP/Libraries/Exp1/Data/T3/images/789.gif | Bin 0 -> 1022 bytes SRIP/Libraries/Exp1/Data/T3/images/792.gif | Bin 0 -> 1028 bytes SRIP/Libraries/Exp1/Data/T3/images/793.gif | Bin 0 -> 1070 bytes SRIP/Libraries/Exp1/Data/T3/images/794.gif | Bin 0 -> 1023 bytes SRIP/Libraries/Exp1/Data/T3/images/797.gif | Bin 0 -> 1013 bytes SRIP/Libraries/Exp1/Data/T3/images/801.gif | Bin 0 -> 1003 bytes SRIP/Libraries/Exp1/Data/T3/images/807.gif | Bin 0 -> 989 bytes SRIP/Libraries/Exp1/Data/T3/images/81.gif | Bin 0 -> 1033 bytes SRIP/Libraries/Exp1/Data/T3/images/813.gif | Bin 0 -> 987 bytes SRIP/Libraries/Exp1/Data/T3/images/818.gif | Bin 0 -> 1001 bytes SRIP/Libraries/Exp1/Data/T3/images/823.gif | Bin 0 -> 970 bytes SRIP/Libraries/Exp1/Data/T3/images/824.gif | Bin 0 -> 1037 bytes SRIP/Libraries/Exp1/Data/T3/images/827.gif | Bin 0 -> 1013 bytes SRIP/Libraries/Exp1/Data/T3/images/828.gif | Bin 0 -> 997 bytes SRIP/Libraries/Exp1/Data/T3/images/832.gif | Bin 0 -> 1040 bytes SRIP/Libraries/Exp1/Data/T3/images/859.gif | Bin 0 -> 1008 bytes SRIP/Libraries/Exp1/Data/T3/images/86.gif | Bin 0 -> 1039 bytes SRIP/Libraries/Exp1/Data/T3/images/865.gif | Bin 0 -> 960 bytes SRIP/Libraries/Exp1/Data/T3/images/866.gif | Bin 0 -> 1051 bytes SRIP/Libraries/Exp1/Data/T3/images/877.gif | Bin 0 -> 1001 bytes SRIP/Libraries/Exp1/Data/T3/images/88.gif | Bin 0 -> 1023 bytes SRIP/Libraries/Exp1/Data/T3/images/886.gif | Bin 0 -> 1000 bytes SRIP/Libraries/Exp1/Data/T3/images/888.gif | Bin 0 -> 1034 bytes SRIP/Libraries/Exp1/Data/T3/images/901.gif | Bin 0 -> 969 bytes SRIP/Libraries/Exp1/Data/T3/images/903.gif | Bin 0 -> 1041 bytes SRIP/Libraries/Exp1/Data/T3/images/914.gif | Bin 0 -> 1028 bytes SRIP/Libraries/Exp1/Data/T3/images/924.gif | Bin 0 -> 1024 bytes SRIP/Libraries/Exp1/Data/T3/images/926.gif | Bin 0 -> 965 bytes SRIP/Libraries/Exp1/Data/T3/images/930.gif | Bin 0 -> 1043 bytes SRIP/Libraries/Exp1/Data/T3/images/931.gif | Bin 0 -> 1018 bytes SRIP/Libraries/Exp1/Data/T3/images/933.gif | Bin 0 -> 995 bytes SRIP/Libraries/Exp1/Data/T3/images/936.gif | Bin 0 -> 981 bytes SRIP/Libraries/Exp1/Data/T3/images/941.gif | Bin 0 -> 1001 bytes SRIP/Libraries/Exp1/Data/T3/images/95.gif | Bin 0 -> 1018 bytes SRIP/Libraries/Exp1/Data/T3/images/964.gif | Bin 0 -> 1024 bytes SRIP/Libraries/Exp1/Data/T3/images/973.gif | Bin 0 -> 1052 bytes SRIP/Libraries/Exp1/Data/T3/images/975.gif | Bin 0 -> 1031 bytes SRIP/Libraries/Exp1/Data/T3/images/977.gif | Bin 0 -> 1019 bytes SRIP/Libraries/Exp1/Data/T3/images/98.gif | Bin 0 -> 1032 bytes SRIP/Libraries/Exp1/Data/T3/images/981.gif | Bin 0 -> 983 bytes SRIP/Libraries/Exp1/MyPackage/Chart1.class | Bin 0 -> 3211 bytes .../Exp1/MyPackage/Experiment1$1$1.class | Bin 0 -> 731 bytes .../Exp1/MyPackage/Experiment1$1.class | Bin 0 -> 1389 bytes .../Exp1/MyPackage/Experiment1$2.class | Bin 0 -> 765 bytes .../Exp1/MyPackage/Experiment1$3.class | Bin 0 -> 758 bytes .../Exp1/MyPackage/Experiment1$4.class | Bin 0 -> 758 bytes .../Exp1/MyPackage/Experiment1$5.class | Bin 0 -> 765 bytes .../Exp1/MyPackage/Experiment1$6.class | Bin 0 -> 780 bytes .../Exp1/MyPackage/Experiment1$7.class | Bin 0 -> 765 bytes .../MyPackage/Experiment1$RowListener.class | Bin 0 -> 1385 bytes .../Experiment1$ValueComparator.class | Bin 0 -> 954 bytes .../Exp1/MyPackage/Experiment1.class | Bin 0 -> 18526 bytes .../Libraries/Exp1/MyPackage/MathParser.class | Bin 0 -> 2199 bytes SRIP/Libraries/T1/100.gif | Bin 0 -> 946 bytes SRIP/Libraries/T1/103.gif | Bin 0 -> 909 bytes SRIP/Libraries/T1/105.gif | Bin 0 -> 926 bytes SRIP/Libraries/T1/106.gif | Bin 0 -> 944 bytes SRIP/Libraries/T1/109.gif | Bin 0 -> 1053 bytes SRIP/Libraries/T1/113.gif | Bin 0 -> 917 bytes SRIP/Libraries/T1/114.gif | Bin 0 -> 946 bytes SRIP/Libraries/T1/115.gif | Bin 0 -> 1048 bytes SRIP/Libraries/T1/119.gif | Bin 0 -> 1039 bytes SRIP/Libraries/T1/120.gif | Bin 0 -> 1037 bytes SRIP/Libraries/T1/122.gif | Bin 0 -> 1028 bytes SRIP/Libraries/T1/125.gif | Bin 0 -> 917 bytes SRIP/Libraries/T1/129.gif | Bin 0 -> 927 bytes SRIP/Libraries/T1/135.gif | Bin 0 -> 959 bytes SRIP/Libraries/T1/15.gif | Bin 0 -> 917 bytes SRIP/Libraries/T1/153.gif | Bin 0 -> 941 bytes SRIP/Libraries/T1/157.gif | Bin 0 -> 1016 bytes SRIP/Libraries/T1/170.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T1/175.gif | Bin 0 -> 923 bytes SRIP/Libraries/T1/178.gif | Bin 0 -> 940 bytes SRIP/Libraries/T1/185.gif | Bin 0 -> 915 bytes SRIP/Libraries/T1/193.gif | Bin 0 -> 1022 bytes SRIP/Libraries/T1/2.gif | Bin 0 -> 1033 bytes SRIP/Libraries/T1/201.gif | Bin 0 -> 925 bytes SRIP/Libraries/T1/202.gif | Bin 0 -> 962 bytes SRIP/Libraries/T1/206.gif | Bin 0 -> 965 bytes SRIP/Libraries/T1/207.gif | Bin 0 -> 1045 bytes SRIP/Libraries/T1/209.gif | Bin 0 -> 933 bytes SRIP/Libraries/T1/210.gif | Bin 0 -> 1048 bytes SRIP/Libraries/T1/211.gif | Bin 0 -> 997 bytes SRIP/Libraries/T1/212.gif | Bin 0 -> 919 bytes SRIP/Libraries/T1/217.gif | Bin 0 -> 1024 bytes SRIP/Libraries/T1/22.gif | Bin 0 -> 1033 bytes SRIP/Libraries/T1/225.gif | Bin 0 -> 1025 bytes SRIP/Libraries/T1/230.gif | Bin 0 -> 1042 bytes SRIP/Libraries/T1/232.gif | Bin 0 -> 931 bytes SRIP/Libraries/T1/233.gif | Bin 0 -> 992 bytes SRIP/Libraries/T1/235.gif | Bin 0 -> 1048 bytes SRIP/Libraries/T1/24.gif | Bin 0 -> 954 bytes SRIP/Libraries/T1/247.gif | Bin 0 -> 1039 bytes SRIP/Libraries/T1/249.gif | Bin 0 -> 942 bytes SRIP/Libraries/T1/25.gif | Bin 0 -> 989 bytes SRIP/Libraries/T1/250.gif | Bin 0 -> 1053 bytes SRIP/Libraries/T1/252.gif | Bin 0 -> 936 bytes SRIP/Libraries/T1/261.gif | Bin 0 -> 995 bytes SRIP/Libraries/T1/270.gif | Bin 0 -> 941 bytes SRIP/Libraries/T1/271.gif | Bin 0 -> 923 bytes SRIP/Libraries/T1/277.gif | Bin 0 -> 926 bytes SRIP/Libraries/T1/284.gif | Bin 0 -> 1049 bytes SRIP/Libraries/T1/291.gif | Bin 0 -> 935 bytes SRIP/Libraries/T1/294.gif | Bin 0 -> 1019 bytes SRIP/Libraries/T1/297.gif | Bin 0 -> 1030 bytes SRIP/Libraries/T1/304.gif | Bin 0 -> 1037 bytes SRIP/Libraries/T1/310.gif | Bin 0 -> 941 bytes SRIP/Libraries/T1/311.gif | Bin 0 -> 913 bytes SRIP/Libraries/T1/316.gif | Bin 0 -> 950 bytes SRIP/Libraries/T1/321.gif | Bin 0 -> 989 bytes SRIP/Libraries/T1/327.gif | Bin 0 -> 1028 bytes SRIP/Libraries/T1/346.gif | Bin 0 -> 950 bytes SRIP/Libraries/T1/35.gif | Bin 0 -> 997 bytes SRIP/Libraries/T1/352.gif | Bin 0 -> 949 bytes SRIP/Libraries/T1/356.gif | Bin 0 -> 949 bytes SRIP/Libraries/T1/358.gif | Bin 0 -> 945 bytes SRIP/Libraries/T1/359.gif | Bin 0 -> 928 bytes SRIP/Libraries/T1/360.gif | Bin 0 -> 1034 bytes SRIP/Libraries/T1/367.gif | Bin 0 -> 917 bytes SRIP/Libraries/T1/38.gif | Bin 0 -> 1022 bytes SRIP/Libraries/T1/383.gif | Bin 0 -> 906 bytes SRIP/Libraries/T1/395.gif | Bin 0 -> 925 bytes SRIP/Libraries/T1/398.gif | Bin 0 -> 949 bytes SRIP/Libraries/T1/399.gif | Bin 0 -> 914 bytes SRIP/Libraries/T1/4.gif | Bin 0 -> 950 bytes SRIP/Libraries/T1/400.gif | Bin 0 -> 1040 bytes SRIP/Libraries/T1/407.gif | Bin 0 -> 922 bytes SRIP/Libraries/T1/409.gif | Bin 0 -> 920 bytes SRIP/Libraries/T1/41.gif | Bin 0 -> 923 bytes SRIP/Libraries/T1/417.gif | Bin 0 -> 938 bytes SRIP/Libraries/T1/428.gif | Bin 0 -> 1030 bytes SRIP/Libraries/T1/430.gif | Bin 0 -> 1036 bytes SRIP/Libraries/T1/436.gif | Bin 0 -> 1039 bytes SRIP/Libraries/T1/441.gif | Bin 0 -> 1034 bytes SRIP/Libraries/T1/444.gif | Bin 0 -> 942 bytes SRIP/Libraries/T1/448.gif | Bin 0 -> 946 bytes SRIP/Libraries/T1/451.gif | Bin 0 -> 931 bytes SRIP/Libraries/T1/452.gif | Bin 0 -> 1019 bytes SRIP/Libraries/T1/454.gif | Bin 0 -> 1040 bytes SRIP/Libraries/T1/455.gif | Bin 0 -> 910 bytes SRIP/Libraries/T1/456.gif | Bin 0 -> 944 bytes SRIP/Libraries/T1/459.gif | Bin 0 -> 1039 bytes SRIP/Libraries/T1/463.gif | Bin 0 -> 1050 bytes SRIP/Libraries/T1/465.gif | Bin 0 -> 1034 bytes SRIP/Libraries/T1/467.gif | Bin 0 -> 931 bytes SRIP/Libraries/T1/471.gif | Bin 0 -> 941 bytes SRIP/Libraries/T1/474.gif | Bin 0 -> 1041 bytes SRIP/Libraries/T1/476.gif | Bin 0 -> 947 bytes SRIP/Libraries/T1/485.gif | Bin 0 -> 915 bytes SRIP/Libraries/T1/490.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T1/492.gif | Bin 0 -> 904 bytes SRIP/Libraries/T1/493.gif | Bin 0 -> 944 bytes SRIP/Libraries/T1/508.gif | Bin 0 -> 950 bytes SRIP/Libraries/T1/509.gif | Bin 0 -> 952 bytes SRIP/Libraries/T1/511.gif | Bin 0 -> 929 bytes SRIP/Libraries/T1/52.gif | Bin 0 -> 1030 bytes SRIP/Libraries/T1/520.gif | Bin 0 -> 1028 bytes SRIP/Libraries/T1/525.gif | Bin 0 -> 1039 bytes SRIP/Libraries/T1/527.gif | Bin 0 -> 1048 bytes SRIP/Libraries/T1/528.gif | Bin 0 -> 1025 bytes SRIP/Libraries/T1/534.gif | Bin 0 -> 953 bytes SRIP/Libraries/T1/536.gif | Bin 0 -> 961 bytes SRIP/Libraries/T1/539.gif | Bin 0 -> 940 bytes SRIP/Libraries/T1/543.gif | Bin 0 -> 1015 bytes SRIP/Libraries/T1/553.gif | Bin 0 -> 955 bytes SRIP/Libraries/T1/554.gif | Bin 0 -> 949 bytes SRIP/Libraries/T1/557.gif | Bin 0 -> 923 bytes SRIP/Libraries/T1/57.gif | Bin 0 -> 1044 bytes SRIP/Libraries/T1/573.gif | Bin 0 -> 902 bytes SRIP/Libraries/T1/574.gif | Bin 0 -> 956 bytes SRIP/Libraries/T1/578.gif | Bin 0 -> 1059 bytes SRIP/Libraries/T1/583.gif | Bin 0 -> 1008 bytes SRIP/Libraries/T1/588.gif | Bin 0 -> 963 bytes SRIP/Libraries/T1/594.gif | Bin 0 -> 953 bytes SRIP/Libraries/T1/597.gif | Bin 0 -> 1039 bytes SRIP/Libraries/T1/60.gif | Bin 0 -> 953 bytes SRIP/Libraries/T1/604.gif | Bin 0 -> 947 bytes SRIP/Libraries/T1/605.gif | Bin 0 -> 915 bytes SRIP/Libraries/T1/610.gif | Bin 0 -> 959 bytes SRIP/Libraries/T1/613.gif | Bin 0 -> 1027 bytes SRIP/Libraries/T1/619.gif | Bin 0 -> 920 bytes SRIP/Libraries/T1/634.gif | Bin 0 -> 1065 bytes SRIP/Libraries/T1/638.gif | Bin 0 -> 962 bytes SRIP/Libraries/T1/639.gif | Bin 0 -> 937 bytes SRIP/Libraries/T1/64.gif | Bin 0 -> 1040 bytes SRIP/Libraries/T1/640.gif | Bin 0 -> 1042 bytes SRIP/Libraries/T1/649.gif | Bin 0 -> 937 bytes SRIP/Libraries/T1/657.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T1/663.gif | Bin 0 -> 1032 bytes SRIP/Libraries/T1/667.gif | Bin 0 -> 1022 bytes SRIP/Libraries/T1/668.gif | Bin 0 -> 934 bytes SRIP/Libraries/T1/669.gif | Bin 0 -> 1033 bytes SRIP/Libraries/T1/670.gif | Bin 0 -> 1036 bytes SRIP/Libraries/T1/672.gif | Bin 0 -> 958 bytes SRIP/Libraries/T1/677.gif | Bin 0 -> 942 bytes SRIP/Libraries/T1/679.gif | Bin 0 -> 918 bytes SRIP/Libraries/T1/68.gif | Bin 0 -> 962 bytes SRIP/Libraries/T1/69.gif | Bin 0 -> 976 bytes SRIP/Libraries/T1/690.gif | Bin 0 -> 1045 bytes SRIP/Libraries/T1/692.gif | Bin 0 -> 958 bytes SRIP/Libraries/T1/699.gif | Bin 0 -> 951 bytes SRIP/Libraries/T1/7.gif | Bin 0 -> 933 bytes SRIP/Libraries/T1/70.gif | Bin 0 -> 1013 bytes SRIP/Libraries/T1/703.gif | Bin 0 -> 1039 bytes SRIP/Libraries/T1/71.gif | Bin 0 -> 973 bytes SRIP/Libraries/T1/710.gif | Bin 0 -> 1032 bytes SRIP/Libraries/T1/711.gif | Bin 0 -> 928 bytes SRIP/Libraries/T1/712.gif | Bin 0 -> 954 bytes SRIP/Libraries/T1/713.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T1/73.gif | Bin 0 -> 920 bytes SRIP/Libraries/T1/734.gif | Bin 0 -> 1051 bytes SRIP/Libraries/T1/739.gif | Bin 0 -> 924 bytes SRIP/Libraries/T1/744.gif | Bin 0 -> 1036 bytes SRIP/Libraries/T1/746.gif | Bin 0 -> 1037 bytes SRIP/Libraries/T1/748.gif | Bin 0 -> 963 bytes SRIP/Libraries/T1/76.gif | Bin 0 -> 1022 bytes SRIP/Libraries/T1/766.gif | Bin 0 -> 952 bytes SRIP/Libraries/T1/777.gif | Bin 0 -> 995 bytes SRIP/Libraries/T1/78.gif | Bin 0 -> 935 bytes SRIP/Libraries/T1/780.gif | Bin 0 -> 955 bytes SRIP/Libraries/T1/781.gif | Bin 0 -> 931 bytes SRIP/Libraries/T1/782.gif | Bin 0 -> 1050 bytes SRIP/Libraries/T1/784.gif | Bin 0 -> 951 bytes SRIP/Libraries/T1/788.gif | Bin 0 -> 1046 bytes SRIP/Libraries/T1/79.gif | Bin 0 -> 947 bytes SRIP/Libraries/T1/791.gif | Bin 0 -> 1048 bytes SRIP/Libraries/T1/810.gif | Bin 0 -> 952 bytes SRIP/Libraries/T1/819.gif | Bin 0 -> 1036 bytes SRIP/Libraries/T1/82.gif | Bin 0 -> 1018 bytes SRIP/Libraries/T1/822.gif | Bin 0 -> 967 bytes SRIP/Libraries/T1/826.gif | Bin 0 -> 951 bytes SRIP/Libraries/T1/834.gif | Bin 0 -> 947 bytes SRIP/Libraries/T1/836.gif | Bin 0 -> 950 bytes SRIP/Libraries/T1/839.gif | Bin 0 -> 927 bytes SRIP/Libraries/T1/850.gif | Bin 0 -> 944 bytes SRIP/Libraries/T1/860.gif | Bin 0 -> 1044 bytes SRIP/Libraries/T1/861.gif | Bin 0 -> 1031 bytes SRIP/Libraries/T1/870.gif | Bin 0 -> 1040 bytes SRIP/Libraries/T1/871.gif | Bin 0 -> 942 bytes SRIP/Libraries/T1/872.gif | Bin 0 -> 950 bytes SRIP/Libraries/T1/873.gif | Bin 0 -> 1035 bytes SRIP/Libraries/T1/89.gif | Bin 0 -> 1046 bytes SRIP/Libraries/T1/890.gif | Bin 0 -> 1050 bytes SRIP/Libraries/T1/892.gif | Bin 0 -> 954 bytes SRIP/Libraries/T1/9.gif | Bin 0 -> 924 bytes SRIP/Libraries/T1/904.gif | Bin 0 -> 1051 bytes SRIP/Libraries/T1/906.gif | Bin 0 -> 956 bytes SRIP/Libraries/T1/920.gif | Bin 0 -> 958 bytes SRIP/Libraries/T1/921.gif | Bin 0 -> 932 bytes SRIP/Libraries/T1/928.gif | Bin 0 -> 1055 bytes SRIP/Libraries/T1/942.gif | Bin 0 -> 937 bytes SRIP/Libraries/T1/944.gif | Bin 0 -> 1031 bytes SRIP/Libraries/T1/950.gif | Bin 0 -> 1046 bytes SRIP/Libraries/T1/952.gif | Bin 0 -> 956 bytes SRIP/Libraries/T1/953.gif | Bin 0 -> 1012 bytes SRIP/Libraries/T1/958.gif | Bin 0 -> 1040 bytes SRIP/Libraries/T1/96.gif | Bin 0 -> 1008 bytes SRIP/Libraries/T1/960.gif | Bin 0 -> 963 bytes SRIP/Libraries/T1/962.gif | Bin 0 -> 944 bytes SRIP/Libraries/T1/966.gif | Bin 0 -> 1057 bytes SRIP/Libraries/T1/979.gif | Bin 0 -> 924 bytes SRIP/Libraries/T1/980.gif | Bin 0 -> 1043 bytes SRIP/Libraries/T1/983.gif | Bin 0 -> 943 bytes SRIP/Libraries/T1/985.gif | Bin 0 -> 1032 bytes SRIP/Libraries/T1/994.gif | Bin 0 -> 946 bytes SRIP/Libraries/T1/998.gif | Bin 0 -> 1037 bytes SRIP/Libraries/T2/108.gif | Bin 0 -> 1000 bytes SRIP/Libraries/T2/11.gif | Bin 0 -> 990 bytes SRIP/Libraries/T2/110.gif | Bin 0 -> 979 bytes SRIP/Libraries/T2/112.gif | Bin 0 -> 1044 bytes SRIP/Libraries/T2/118.gif | Bin 0 -> 1030 bytes SRIP/Libraries/T2/121.gif | Bin 0 -> 1006 bytes SRIP/Libraries/T2/123.gif | Bin 0 -> 989 bytes SRIP/Libraries/T2/13.gif | Bin 0 -> 1027 bytes SRIP/Libraries/T2/131.gif | Bin 0 -> 991 bytes SRIP/Libraries/T2/136.gif | Bin 0 -> 1016 bytes SRIP/Libraries/T2/137.gif | Bin 0 -> 988 bytes SRIP/Libraries/T2/144.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T2/150.gif | Bin 0 -> 1017 bytes SRIP/Libraries/T2/158.gif | Bin 0 -> 1016 bytes SRIP/Libraries/T2/160.gif | Bin 0 -> 1018 bytes SRIP/Libraries/T2/162.gif | Bin 0 -> 1031 bytes SRIP/Libraries/T2/17.gif | Bin 0 -> 1023 bytes SRIP/Libraries/T2/172.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T2/179.gif | Bin 0 -> 952 bytes SRIP/Libraries/T2/180.gif | Bin 0 -> 1028 bytes SRIP/Libraries/T2/181.gif | Bin 0 -> 953 bytes SRIP/Libraries/T2/182.gif | Bin 0 -> 1015 bytes SRIP/Libraries/T2/188.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T2/190.gif | Bin 0 -> 999 bytes SRIP/Libraries/T2/191.gif | Bin 0 -> 1017 bytes SRIP/Libraries/T2/199.gif | Bin 0 -> 1012 bytes SRIP/Libraries/T2/200.gif | Bin 0 -> 1000 bytes SRIP/Libraries/T2/204.gif | Bin 0 -> 1025 bytes SRIP/Libraries/T2/208.gif | Bin 0 -> 1008 bytes SRIP/Libraries/T2/214.gif | Bin 0 -> 1027 bytes SRIP/Libraries/T2/216.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T2/221.gif | Bin 0 -> 1010 bytes SRIP/Libraries/T2/229.gif | Bin 0 -> 996 bytes SRIP/Libraries/T2/234.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T2/236.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T2/243.gif | Bin 0 -> 1024 bytes SRIP/Libraries/T2/251.gif | Bin 0 -> 995 bytes SRIP/Libraries/T2/253.gif | Bin 0 -> 991 bytes SRIP/Libraries/T2/254.gif | Bin 0 -> 1037 bytes SRIP/Libraries/T2/255.gif | Bin 0 -> 1028 bytes SRIP/Libraries/T2/256.gif | Bin 0 -> 1022 bytes SRIP/Libraries/T2/26.gif | Bin 0 -> 1031 bytes SRIP/Libraries/T2/263.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T2/269.gif | Bin 0 -> 989 bytes SRIP/Libraries/T2/278.gif | Bin 0 -> 1039 bytes SRIP/Libraries/T2/28.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T2/280.gif | Bin 0 -> 937 bytes SRIP/Libraries/T2/282.gif | Bin 0 -> 1012 bytes SRIP/Libraries/T2/29.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T2/292.gif | Bin 0 -> 1008 bytes SRIP/Libraries/T2/299.gif | Bin 0 -> 996 bytes SRIP/Libraries/T2/309.gif | Bin 0 -> 1014 bytes SRIP/Libraries/T2/31.gif | Bin 0 -> 991 bytes SRIP/Libraries/T2/318.gif | Bin 0 -> 1040 bytes SRIP/Libraries/T2/319.gif | Bin 0 -> 1030 bytes SRIP/Libraries/T2/322.gif | Bin 0 -> 1022 bytes SRIP/Libraries/T2/326.gif | Bin 0 -> 1019 bytes SRIP/Libraries/T2/328.gif | Bin 0 -> 1017 bytes SRIP/Libraries/T2/331.gif | Bin 0 -> 973 bytes SRIP/Libraries/T2/340.gif | Bin 0 -> 1040 bytes SRIP/Libraries/T2/342.gif | Bin 0 -> 1012 bytes SRIP/Libraries/T2/348.gif | Bin 0 -> 1043 bytes SRIP/Libraries/T2/357.gif | Bin 0 -> 976 bytes SRIP/Libraries/T2/361.gif | Bin 0 -> 990 bytes SRIP/Libraries/T2/362.gif | Bin 0 -> 1013 bytes SRIP/Libraries/T2/366.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T2/376.gif | Bin 0 -> 1052 bytes SRIP/Libraries/T2/379.gif | Bin 0 -> 1041 bytes SRIP/Libraries/T2/382.gif | Bin 0 -> 1042 bytes SRIP/Libraries/T2/386.gif | Bin 0 -> 1030 bytes SRIP/Libraries/T2/391.gif | Bin 0 -> 1028 bytes SRIP/Libraries/T2/392.gif | Bin 0 -> 1055 bytes SRIP/Libraries/T2/393.gif | Bin 0 -> 1026 bytes SRIP/Libraries/T2/401.gif | Bin 0 -> 1017 bytes SRIP/Libraries/T2/406.gif | Bin 0 -> 1036 bytes SRIP/Libraries/T2/411.gif | Bin 0 -> 1005 bytes SRIP/Libraries/T2/426.gif | Bin 0 -> 1033 bytes SRIP/Libraries/T2/433.gif | Bin 0 -> 1026 bytes SRIP/Libraries/T2/434.gif | Bin 0 -> 1003 bytes SRIP/Libraries/T2/445.gif | Bin 0 -> 969 bytes SRIP/Libraries/T2/449.gif | Bin 0 -> 968 bytes SRIP/Libraries/T2/45.gif | Bin 0 -> 956 bytes SRIP/Libraries/T2/453.gif | Bin 0 -> 1010 bytes SRIP/Libraries/T2/458.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T2/460.gif | Bin 0 -> 1006 bytes SRIP/Libraries/T2/473.gif | Bin 0 -> 980 bytes SRIP/Libraries/T2/477.gif | Bin 0 -> 999 bytes SRIP/Libraries/T2/478.gif | Bin 0 -> 1036 bytes SRIP/Libraries/T2/480.gif | Bin 0 -> 1015 bytes SRIP/Libraries/T2/487.gif | Bin 0 -> 1031 bytes SRIP/Libraries/T2/491.gif | Bin 0 -> 1027 bytes SRIP/Libraries/T2/494.gif | Bin 0 -> 1008 bytes SRIP/Libraries/T2/496.gif | Bin 0 -> 1030 bytes SRIP/Libraries/T2/50.gif | Bin 0 -> 1018 bytes SRIP/Libraries/T2/501.gif | Bin 0 -> 980 bytes SRIP/Libraries/T2/51.gif | Bin 0 -> 1001 bytes SRIP/Libraries/T2/510.gif | Bin 0 -> 1022 bytes SRIP/Libraries/T2/516.gif | Bin 0 -> 1000 bytes SRIP/Libraries/T2/531.gif | Bin 0 -> 989 bytes SRIP/Libraries/T2/541.gif | Bin 0 -> 947 bytes SRIP/Libraries/T2/547.gif | Bin 0 -> 1016 bytes SRIP/Libraries/T2/549.gif | Bin 0 -> 1051 bytes SRIP/Libraries/T2/550.gif | Bin 0 -> 1031 bytes SRIP/Libraries/T2/552.gif | Bin 0 -> 1023 bytes SRIP/Libraries/T2/556.gif | Bin 0 -> 1040 bytes SRIP/Libraries/T2/558.gif | Bin 0 -> 1033 bytes SRIP/Libraries/T2/559.gif | Bin 0 -> 945 bytes SRIP/Libraries/T2/562.gif | Bin 0 -> 1019 bytes SRIP/Libraries/T2/564.gif | Bin 0 -> 1035 bytes SRIP/Libraries/T2/569.gif | Bin 0 -> 1019 bytes SRIP/Libraries/T2/571.gif | Bin 0 -> 981 bytes SRIP/Libraries/T2/575.gif | Bin 0 -> 967 bytes SRIP/Libraries/T2/582.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T2/585.gif | Bin 0 -> 986 bytes SRIP/Libraries/T2/589.gif | Bin 0 -> 972 bytes SRIP/Libraries/T2/592.gif | Bin 0 -> 1039 bytes SRIP/Libraries/T2/6.gif | Bin 0 -> 1043 bytes SRIP/Libraries/T2/614.gif | Bin 0 -> 1013 bytes SRIP/Libraries/T2/620.gif | Bin 0 -> 1001 bytes SRIP/Libraries/T2/630.gif | Bin 0 -> 1025 bytes SRIP/Libraries/T2/643.gif | Bin 0 -> 1010 bytes SRIP/Libraries/T2/644.gif | Bin 0 -> 1019 bytes SRIP/Libraries/T2/646.gif | Bin 0 -> 1028 bytes SRIP/Libraries/T2/647.gif | Bin 0 -> 978 bytes SRIP/Libraries/T2/651.gif | Bin 0 -> 978 bytes SRIP/Libraries/T2/658.gif | Bin 0 -> 1001 bytes SRIP/Libraries/T2/660.gif | Bin 0 -> 1026 bytes SRIP/Libraries/T2/665.gif | Bin 0 -> 981 bytes SRIP/Libraries/T2/671.gif | Bin 0 -> 1045 bytes SRIP/Libraries/T2/674.gif | Bin 0 -> 1013 bytes SRIP/Libraries/T2/675.gif | Bin 0 -> 976 bytes SRIP/Libraries/T2/676.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T2/685.gif | Bin 0 -> 933 bytes SRIP/Libraries/T2/689.gif | Bin 0 -> 998 bytes SRIP/Libraries/T2/694.gif | Bin 0 -> 1001 bytes SRIP/Libraries/T2/696.gif | Bin 0 -> 1001 bytes SRIP/Libraries/T2/697.gif | Bin 0 -> 995 bytes SRIP/Libraries/T2/714.gif | Bin 0 -> 1026 bytes SRIP/Libraries/T2/715.gif | Bin 0 -> 997 bytes SRIP/Libraries/T2/716.gif | Bin 0 -> 1018 bytes SRIP/Libraries/T2/717.gif | Bin 0 -> 1037 bytes SRIP/Libraries/T2/732.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T2/733.gif | Bin 0 -> 1014 bytes SRIP/Libraries/T2/75.gif | Bin 0 -> 990 bytes SRIP/Libraries/T2/753.gif | Bin 0 -> 1033 bytes SRIP/Libraries/T2/761.gif | Bin 0 -> 1014 bytes SRIP/Libraries/T2/768.gif | Bin 0 -> 1010 bytes SRIP/Libraries/T2/77.gif | Bin 0 -> 1010 bytes SRIP/Libraries/T2/775.gif | Bin 0 -> 1032 bytes SRIP/Libraries/T2/790.gif | Bin 0 -> 1001 bytes SRIP/Libraries/T2/8.gif | Bin 0 -> 1017 bytes SRIP/Libraries/T2/802.gif | Bin 0 -> 970 bytes SRIP/Libraries/T2/808.gif | Bin 0 -> 992 bytes SRIP/Libraries/T2/809.gif | Bin 0 -> 949 bytes SRIP/Libraries/T2/812.gif | Bin 0 -> 1012 bytes SRIP/Libraries/T2/814.gif | Bin 0 -> 995 bytes SRIP/Libraries/T2/815.gif | Bin 0 -> 992 bytes SRIP/Libraries/T2/83.gif | Bin 0 -> 1024 bytes SRIP/Libraries/T2/831.gif | Bin 0 -> 1019 bytes SRIP/Libraries/T2/841.gif | Bin 0 -> 1006 bytes SRIP/Libraries/T2/844.gif | Bin 0 -> 1014 bytes SRIP/Libraries/T2/845.gif | Bin 0 -> 1052 bytes SRIP/Libraries/T2/855.gif | Bin 0 -> 1007 bytes SRIP/Libraries/T2/857.gif | Bin 0 -> 969 bytes SRIP/Libraries/T2/858.gif | Bin 0 -> 1028 bytes SRIP/Libraries/T2/862.gif | Bin 0 -> 1018 bytes SRIP/Libraries/T2/863.gif | Bin 0 -> 1016 bytes SRIP/Libraries/T2/864.gif | Bin 0 -> 976 bytes SRIP/Libraries/T2/867.gif | Bin 0 -> 998 bytes SRIP/Libraries/T2/868.gif | Bin 0 -> 1019 bytes SRIP/Libraries/T2/87.gif | Bin 0 -> 997 bytes SRIP/Libraries/T2/874.gif | Bin 0 -> 1041 bytes SRIP/Libraries/T2/875.gif | Bin 0 -> 1016 bytes SRIP/Libraries/T2/876.gif | Bin 0 -> 1034 bytes SRIP/Libraries/T2/879.gif | Bin 0 -> 981 bytes SRIP/Libraries/T2/891.gif | Bin 0 -> 998 bytes SRIP/Libraries/T2/894.gif | Bin 0 -> 1048 bytes SRIP/Libraries/T2/896.gif | Bin 0 -> 1059 bytes SRIP/Libraries/T2/908.gif | Bin 0 -> 1040 bytes SRIP/Libraries/T2/910.gif | Bin 0 -> 1045 bytes SRIP/Libraries/T2/918.gif | Bin 0 -> 1032 bytes SRIP/Libraries/T2/932.gif | Bin 0 -> 1048 bytes SRIP/Libraries/T2/939.gif | Bin 0 -> 1003 bytes SRIP/Libraries/T2/947.gif | Bin 0 -> 1019 bytes SRIP/Libraries/T2/954.gif | Bin 0 -> 1035 bytes SRIP/Libraries/T2/967.gif | Bin 0 -> 1003 bytes SRIP/Libraries/T2/976.gif | Bin 0 -> 1024 bytes SRIP/Libraries/T2/984.gif | Bin 0 -> 1035 bytes SRIP/Libraries/T2/99.gif | Bin 0 -> 991 bytes SRIP/Libraries/T2/990.gif | Bin 0 -> 1044 bytes SRIP/Libraries/T2/993.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T2/999.gif | Bin 0 -> 1032 bytes SRIP/Libraries/T3/111.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T3/117.gif | Bin 0 -> 995 bytes SRIP/Libraries/T3/126.gif | Bin 0 -> 1025 bytes SRIP/Libraries/T3/134.gif | Bin 0 -> 973 bytes SRIP/Libraries/T3/138.gif | Bin 0 -> 922 bytes SRIP/Libraries/T3/145.gif | Bin 0 -> 1019 bytes SRIP/Libraries/T3/147.gif | Bin 0 -> 1035 bytes SRIP/Libraries/T3/154.gif | Bin 0 -> 979 bytes SRIP/Libraries/T3/155.gif | Bin 0 -> 1016 bytes SRIP/Libraries/T3/161.gif | Bin 0 -> 1004 bytes SRIP/Libraries/T3/163.gif | Bin 0 -> 980 bytes SRIP/Libraries/T3/168.gif | Bin 0 -> 1013 bytes SRIP/Libraries/T3/171.gif | Bin 0 -> 999 bytes SRIP/Libraries/T3/173.gif | Bin 0 -> 1008 bytes SRIP/Libraries/T3/177.gif | Bin 0 -> 973 bytes SRIP/Libraries/T3/18.gif | Bin 0 -> 1022 bytes SRIP/Libraries/T3/184.gif | Bin 0 -> 926 bytes SRIP/Libraries/T3/189.gif | Bin 0 -> 1037 bytes SRIP/Libraries/T3/196.gif | Bin 0 -> 992 bytes SRIP/Libraries/T3/198.gif | Bin 0 -> 1022 bytes SRIP/Libraries/T3/20.gif | Bin 0 -> 974 bytes SRIP/Libraries/T3/203.gif | Bin 0 -> 1035 bytes SRIP/Libraries/T3/226.gif | Bin 0 -> 1023 bytes SRIP/Libraries/T3/227.gif | Bin 0 -> 978 bytes SRIP/Libraries/T3/228.gif | Bin 0 -> 992 bytes SRIP/Libraries/T3/23.gif | Bin 0 -> 988 bytes SRIP/Libraries/T3/241.gif | Bin 0 -> 977 bytes SRIP/Libraries/T3/246.gif | Bin 0 -> 938 bytes SRIP/Libraries/T3/248.gif | Bin 0 -> 999 bytes SRIP/Libraries/T3/265.gif | Bin 0 -> 1012 bytes SRIP/Libraries/T3/266.gif | Bin 0 -> 1013 bytes SRIP/Libraries/T3/268.gif | Bin 0 -> 985 bytes SRIP/Libraries/T3/281.gif | Bin 0 -> 991 bytes SRIP/Libraries/T3/283.gif | Bin 0 -> 980 bytes SRIP/Libraries/T3/286.gif | Bin 0 -> 974 bytes SRIP/Libraries/T3/296.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T3/301.gif | Bin 0 -> 991 bytes SRIP/Libraries/T3/305.gif | Bin 0 -> 924 bytes SRIP/Libraries/T3/313.gif | Bin 0 -> 1014 bytes SRIP/Libraries/T3/314.gif | Bin 0 -> 991 bytes SRIP/Libraries/T3/32.gif | Bin 0 -> 1003 bytes SRIP/Libraries/T3/320.gif | Bin 0 -> 999 bytes SRIP/Libraries/T3/323.gif | Bin 0 -> 1005 bytes SRIP/Libraries/T3/334.gif | Bin 0 -> 1043 bytes SRIP/Libraries/T3/335.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T3/34.gif | Bin 0 -> 988 bytes SRIP/Libraries/T3/344.gif | Bin 0 -> 1036 bytes SRIP/Libraries/T3/345.gif | Bin 0 -> 945 bytes SRIP/Libraries/T3/347.gif | Bin 0 -> 1015 bytes SRIP/Libraries/T3/349.gif | Bin 0 -> 1023 bytes SRIP/Libraries/T3/351.gif | Bin 0 -> 998 bytes SRIP/Libraries/T3/353.gif | Bin 0 -> 1073 bytes SRIP/Libraries/T3/363.gif | Bin 0 -> 982 bytes SRIP/Libraries/T3/365.gif | Bin 0 -> 994 bytes SRIP/Libraries/T3/369.gif | Bin 0 -> 1010 bytes SRIP/Libraries/T3/375.gif | Bin 0 -> 986 bytes SRIP/Libraries/T3/384.gif | Bin 0 -> 1004 bytes SRIP/Libraries/T3/387.gif | Bin 0 -> 1057 bytes SRIP/Libraries/T3/390.gif | Bin 0 -> 992 bytes SRIP/Libraries/T3/394.gif | Bin 0 -> 942 bytes SRIP/Libraries/T3/405.gif | Bin 0 -> 1072 bytes SRIP/Libraries/T3/410.gif | Bin 0 -> 1007 bytes SRIP/Libraries/T3/416.gif | Bin 0 -> 942 bytes SRIP/Libraries/T3/419.gif | Bin 0 -> 970 bytes SRIP/Libraries/T3/42.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T3/420.gif | Bin 0 -> 996 bytes SRIP/Libraries/T3/424.gif | Bin 0 -> 989 bytes SRIP/Libraries/T3/425.gif | Bin 0 -> 979 bytes SRIP/Libraries/T3/429.gif | Bin 0 -> 987 bytes SRIP/Libraries/T3/435.gif | Bin 0 -> 1003 bytes SRIP/Libraries/T3/44.gif | Bin 0 -> 967 bytes SRIP/Libraries/T3/440.gif | Bin 0 -> 1022 bytes SRIP/Libraries/T3/442.gif | Bin 0 -> 985 bytes SRIP/Libraries/T3/446.gif | Bin 0 -> 1028 bytes SRIP/Libraries/T3/457.gif | Bin 0 -> 1001 bytes SRIP/Libraries/T3/46.gif | Bin 0 -> 1007 bytes SRIP/Libraries/T3/461.gif | Bin 0 -> 1014 bytes SRIP/Libraries/T3/47.gif | Bin 0 -> 1033 bytes SRIP/Libraries/T3/470.gif | Bin 0 -> 1049 bytes SRIP/Libraries/T3/472.gif | Bin 0 -> 986 bytes SRIP/Libraries/T3/483.gif | Bin 0 -> 990 bytes SRIP/Libraries/T3/486.gif | Bin 0 -> 1039 bytes SRIP/Libraries/T3/488.gif | Bin 0 -> 1003 bytes SRIP/Libraries/T3/49.gif | Bin 0 -> 973 bytes SRIP/Libraries/T3/5.gif | Bin 0 -> 999 bytes SRIP/Libraries/T3/500.gif | Bin 0 -> 1037 bytes SRIP/Libraries/T3/502.gif | Bin 0 -> 999 bytes SRIP/Libraries/T3/504.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T3/518.gif | Bin 0 -> 1043 bytes SRIP/Libraries/T3/521.gif | Bin 0 -> 1005 bytes SRIP/Libraries/T3/526.gif | Bin 0 -> 1010 bytes SRIP/Libraries/T3/529.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T3/530.gif | Bin 0 -> 974 bytes SRIP/Libraries/T3/533.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T3/540.gif | Bin 0 -> 1055 bytes SRIP/Libraries/T3/546.gif | Bin 0 -> 1040 bytes SRIP/Libraries/T3/55.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T3/551.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T3/56.gif | Bin 0 -> 1025 bytes SRIP/Libraries/T3/560.gif | Bin 0 -> 1053 bytes SRIP/Libraries/T3/567.gif | Bin 0 -> 985 bytes SRIP/Libraries/T3/572.gif | Bin 0 -> 1035 bytes SRIP/Libraries/T3/576.gif | Bin 0 -> 1034 bytes SRIP/Libraries/T3/58.gif | Bin 0 -> 977 bytes SRIP/Libraries/T3/581.gif | Bin 0 -> 999 bytes SRIP/Libraries/T3/584.gif | Bin 0 -> 994 bytes SRIP/Libraries/T3/590.gif | Bin 0 -> 995 bytes SRIP/Libraries/T3/595.gif | Bin 0 -> 1022 bytes SRIP/Libraries/T3/596.gif | Bin 0 -> 990 bytes SRIP/Libraries/T3/601.gif | Bin 0 -> 969 bytes SRIP/Libraries/T3/602.gif | Bin 0 -> 1001 bytes SRIP/Libraries/T3/603.gif | Bin 0 -> 1041 bytes SRIP/Libraries/T3/616.gif | Bin 0 -> 1031 bytes SRIP/Libraries/T3/622.gif | Bin 0 -> 1006 bytes SRIP/Libraries/T3/627.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T3/628.gif | Bin 0 -> 1030 bytes SRIP/Libraries/T3/629.gif | Bin 0 -> 1019 bytes SRIP/Libraries/T3/632.gif | Bin 0 -> 1017 bytes SRIP/Libraries/T3/642.gif | Bin 0 -> 986 bytes SRIP/Libraries/T3/686.gif | Bin 0 -> 1003 bytes SRIP/Libraries/T3/688.gif | Bin 0 -> 988 bytes SRIP/Libraries/T3/695.gif | Bin 0 -> 1014 bytes SRIP/Libraries/T3/705.gif | Bin 0 -> 1077 bytes SRIP/Libraries/T3/706.gif | Bin 0 -> 1021 bytes SRIP/Libraries/T3/708.gif | Bin 0 -> 986 bytes SRIP/Libraries/T3/709.gif | Bin 0 -> 1001 bytes SRIP/Libraries/T3/721.gif | Bin 0 -> 974 bytes SRIP/Libraries/T3/726.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T3/727.gif | Bin 0 -> 1026 bytes SRIP/Libraries/T3/728.gif | Bin 0 -> 1009 bytes SRIP/Libraries/T3/735.gif | Bin 0 -> 1045 bytes SRIP/Libraries/T3/737.gif | Bin 0 -> 963 bytes SRIP/Libraries/T3/741.gif | Bin 0 -> 1003 bytes SRIP/Libraries/T3/742.gif | Bin 0 -> 1017 bytes SRIP/Libraries/T3/745.gif | Bin 0 -> 943 bytes SRIP/Libraries/T3/756.gif | Bin 0 -> 1014 bytes SRIP/Libraries/T3/757.gif | Bin 0 -> 1035 bytes SRIP/Libraries/T3/759.gif | Bin 0 -> 1049 bytes SRIP/Libraries/T3/762.gif | Bin 0 -> 1024 bytes SRIP/Libraries/T3/764.gif | Bin 0 -> 1015 bytes SRIP/Libraries/T3/765.gif | Bin 0 -> 1005 bytes SRIP/Libraries/T3/767.gif | Bin 0 -> 1028 bytes SRIP/Libraries/T3/770.gif | Bin 0 -> 1030 bytes SRIP/Libraries/T3/773.gif | Bin 0 -> 1025 bytes SRIP/Libraries/T3/778.gif | Bin 0 -> 1032 bytes SRIP/Libraries/T3/783.gif | Bin 0 -> 992 bytes SRIP/Libraries/T3/785.gif | Bin 0 -> 1014 bytes SRIP/Libraries/T3/789.gif | Bin 0 -> 1022 bytes SRIP/Libraries/T3/792.gif | Bin 0 -> 1028 bytes SRIP/Libraries/T3/793.gif | Bin 0 -> 1070 bytes SRIP/Libraries/T3/794.gif | Bin 0 -> 1023 bytes SRIP/Libraries/T3/797.gif | Bin 0 -> 1013 bytes SRIP/Libraries/T3/801.gif | Bin 0 -> 1003 bytes SRIP/Libraries/T3/807.gif | Bin 0 -> 989 bytes SRIP/Libraries/T3/81.gif | Bin 0 -> 1033 bytes SRIP/Libraries/T3/813.gif | Bin 0 -> 987 bytes SRIP/Libraries/T3/818.gif | Bin 0 -> 1001 bytes SRIP/Libraries/T3/823.gif | Bin 0 -> 970 bytes SRIP/Libraries/T3/824.gif | Bin 0 -> 1037 bytes SRIP/Libraries/T3/827.gif | Bin 0 -> 1013 bytes SRIP/Libraries/T3/828.gif | Bin 0 -> 997 bytes SRIP/Libraries/T3/832.gif | Bin 0 -> 1040 bytes SRIP/Libraries/T3/859.gif | Bin 0 -> 1008 bytes SRIP/Libraries/T3/86.gif | Bin 0 -> 1039 bytes SRIP/Libraries/T3/865.gif | Bin 0 -> 960 bytes SRIP/Libraries/T3/866.gif | Bin 0 -> 1051 bytes SRIP/Libraries/T3/877.gif | Bin 0 -> 1001 bytes SRIP/Libraries/T3/88.gif | Bin 0 -> 1023 bytes SRIP/Libraries/T3/886.gif | Bin 0 -> 1000 bytes SRIP/Libraries/T3/888.gif | Bin 0 -> 1034 bytes SRIP/Libraries/T3/901.gif | Bin 0 -> 969 bytes SRIP/Libraries/T3/903.gif | Bin 0 -> 1041 bytes SRIP/Libraries/T3/914.gif | Bin 0 -> 1028 bytes SRIP/Libraries/T3/924.gif | Bin 0 -> 1024 bytes SRIP/Libraries/T3/926.gif | Bin 0 -> 965 bytes SRIP/Libraries/T3/930.gif | Bin 0 -> 1043 bytes SRIP/Libraries/T3/931.gif | Bin 0 -> 1018 bytes SRIP/Libraries/T3/933.gif | Bin 0 -> 995 bytes SRIP/Libraries/T3/936.gif | Bin 0 -> 981 bytes SRIP/Libraries/T3/941.gif | Bin 0 -> 1001 bytes SRIP/Libraries/T3/95.gif | Bin 0 -> 1018 bytes SRIP/Libraries/T3/964.gif | Bin 0 -> 1024 bytes SRIP/Libraries/T3/973.gif | Bin 0 -> 1052 bytes SRIP/Libraries/T3/975.gif | Bin 0 -> 1031 bytes SRIP/Libraries/T3/977.gif | Bin 0 -> 1019 bytes SRIP/Libraries/T3/98.gif | Bin 0 -> 1032 bytes SRIP/Libraries/T3/981.gif | Bin 0 -> 983 bytes SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js | 911 - .../canvasjs-2.3.1/canvasjs.react.js | 48 - .../examples/01-overview/animated-chart.html | 43 - .../01-overview/chart-from-json-data.html | 50 - .../chart-with-axis-scale-breaks.html | 51 - .../01-overview/chart-with-crosshair.html | 72 - .../chart-with-custom-legend-chart.html | 233 - .../01-overview/chart-with-image-overlay.html | 108 - .../chart-with-index-data-label.html | 46 - .../chart-with-inverted-reversed-axis.html | 46 - .../chart-with-logarithmic-axis.html | 128 - .../chart-with-secondary-axis.html | 87 - .../01-overview/chart-with-zoom-pan.html | 40 - .../examples/01-overview/dynamic-chart.html | 57 - .../interactive-draggable-chart.html | 115 - .../01-overview/multi-series-chart.html | 94 - .../examples/01-overview/null-data-chart.html | 62 - .../01-overview/performance-demo.html | 43 - .../dashed-line-chart.html | 102 - .../dynamic-spline-chart.html | 56 - .../line-chart-with-axis-scale-breaks.html | 71 - .../line-chart-with-data-markers.html | 53 - .../line-chart-with-logarithmic-axis.html | 107 - .../line-chart-with-multiple-axis.html | 125 - .../line-chart-with-zoom-pan.html | 46 - .../line-chart.html | 44 - .../multi-series-line-chart.html | 257 - .../multi-series-spline-chart.html | 171 - .../multi-series-step-line-chart.html | 67 - .../spline-chart-with-legends.html | 123 - .../spline-chart-with-secondary-axis.html | 100 - .../spline-chart.html | 55 - .../step-line-chart.html | 57 - .../area-chart.html | 50 - .../multi-series-area-chart.html | 73 - .../multi-series-range-area-chart.html | 127 - .../multi-series-spline-area-chart.html | 113 - .../range-area-chart.html | 72 - .../range-spline-area-chart.html | 51 - .../spline-area-chart.html | 55 - ...ed-area-100-chart-with-date-time-axis.html | 120 - .../stacked-area-100-chart.html | 78 - .../stacked-area-chart.html | 68 - .../step-area-chart.html | 42 - .../bar-chart-with-axis-scale-break.html | 58 - .../bar-chart.html | 58 - .../column-chart-with-multiple-axis.html | 83 - .../column-chart.html | 43 - .../multi-series-bar-chart.html | 104 - .../multi-series-range-column-chart.html | 89 - .../multi-series-waterfall-chart.html | 98 - .../range-bar-chart.html | 49 - .../range-column-chart.html | 49 - .../stacked-bar-100-chart.html | 76 - .../stacked-bar-chart.html | 126 - .../stacked-column-100-chart.html | 103 - .../stacked-column-chart.html | 113 - .../waterfall-chart-with-custom-color.html | 51 - .../waterfall-chart.html | 48 - .../doughnut-Chart.html | 40 - ...ughnut-chart-with-custom-inner-radius.html | 55 - .../funnel-chart-with-custom-neck.html | 52 - .../funnel-chart.html | 52 - .../inverted-reversed-funnel-chart.html | 54 - .../pie-chart-with-custom-radius.html | 51 - .../pie-chart-with-legends.html | 52 - .../pie-chart.html | 36 - ...mid-chart-where-area-represents-value.html | 39 - ...-chart-with-index-label-placed-Inside.html | 40 - .../pyramid-chart.html | 40 - .../candlestick-line-chart.html | 108 - .../multi-series-candlestick-chart.html | 90 - .../ohlc-chart-from-json-data.html | 58 - .../ohlc-stock-chart.html | 54 - .../bubble-chart-with-data-marker.html | 59 - .../bubble-chart-with-zoom-pan.html | 60 - .../bubble-chart.html | 69 - .../multi-series-scatter-point-chart.html | 73 - ...catter-point-chart-with-custom-marker.html | 129 - .../scatter-point-chart.html | 63 - ...x-and-whisker-chart-with-custom-color.html | 43 - .../box-and-whisker-chart-with-outliers.html | 81 - .../box-and-whisker-chart.html | 43 - .../column-line-area-chart.html | 122 - .../error-bar-chart.html | 54 - .../09-combination-charts/error-chart.html | 58 - .../error-line-chart.html | 73 - .../ohlc-line-chart.html | 106 - .../pareto-chart-with-index-data-label.html | 68 - .../09-combination-charts/pareto-chart.html | 66 - .../range-area-line-chart.html | 108 - .../dynamic-column-chart.html | 54 - .../10-dynamic-charts/dynamic-line-chart.html | 58 - .../dynamic-multi-series-chart.html | 113 - .../11-integration/jquery-charts.html | 42 - .../jquery-line-chart-with-zoom-pan.html | 49 - .../jquery-resizable-chart.html | 55 - .../jquery-spline-area-chart-in-tab.html | 98 - ...jquery-spline-chart-with-image-export.html | 41 - SRIP/Libraries/canvasjs-2.3.1/instruction.txt | 4 - .../canvasjs-2.3.1/jquery.canvasjs.min.js | 922 - SRIP/Libraries/canvasjs-2.3.1/license.txt | 9 - 1309 files changed, 806 insertions(+), 23888 deletions(-) delete mode 100644 SRIP/Libraries/Chart.js create mode 100755 SRIP/Libraries/Exp1/Data/T1/Config.txt create mode 100755 SRIP/Libraries/Exp1/Data/T1/Data.txt create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/100.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/103.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/105.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/106.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/109.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/113.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/114.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/115.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/119.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/120.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/122.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/125.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/129.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/135.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/15.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/153.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/157.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/170.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/175.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/178.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/185.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/193.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/2.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/201.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/202.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/206.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/207.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/209.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/210.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/211.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/212.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/217.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/22.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/225.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/230.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/232.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/233.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/235.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/24.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/247.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/249.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/25.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/250.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/252.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/261.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/270.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/271.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/277.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/284.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/291.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/294.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/297.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/304.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/310.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/311.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/316.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/321.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/327.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/346.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/35.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/352.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/356.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/358.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/359.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/360.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/367.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/38.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/383.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/395.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/398.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/399.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/4.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/400.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/407.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/409.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/41.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/417.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/428.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/430.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/436.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/441.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/444.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/448.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/451.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/452.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/454.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/455.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/456.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/459.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/463.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/465.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/467.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/471.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/474.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/476.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/485.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/490.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/492.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/493.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/508.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/509.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/511.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/52.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/520.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/525.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/527.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/528.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/534.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/536.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/539.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/543.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/553.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/554.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/557.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/57.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/573.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/574.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/578.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/583.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/588.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/594.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/597.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/60.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/604.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/605.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/610.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/613.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/619.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/634.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/638.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/639.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/64.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/640.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/649.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/657.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/663.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/667.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/668.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/669.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/670.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/672.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/677.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/679.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/68.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/69.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/690.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/692.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/699.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/7.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/70.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/703.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/71.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/710.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/711.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/712.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/713.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/73.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/734.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/739.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/744.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/746.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/748.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/76.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/766.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/777.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/78.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/780.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/781.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/782.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/784.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/788.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/79.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/791.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/810.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/819.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/82.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/822.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/826.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/834.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/836.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/839.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/850.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/860.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/861.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/870.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/871.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/872.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/873.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/89.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/890.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/892.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/9.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/904.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/906.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/920.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/921.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/928.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/942.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/944.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/950.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/952.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/953.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/958.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/96.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/960.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/962.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/966.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/979.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/980.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/983.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/985.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/994.gif create mode 100755 SRIP/Libraries/Exp1/Data/T1/images/998.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/Config.txt create mode 100755 SRIP/Libraries/Exp1/Data/T2/Data.txt create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/108.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/11.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/110.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/112.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/118.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/121.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/123.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/13.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/131.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/136.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/137.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/144.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/150.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/158.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/160.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/162.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/17.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/172.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/179.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/180.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/181.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/182.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/188.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/190.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/191.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/199.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/200.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/204.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/208.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/214.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/216.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/221.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/229.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/234.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/236.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/243.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/251.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/253.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/254.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/255.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/256.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/26.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/263.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/269.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/278.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/28.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/280.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/282.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/29.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/292.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/299.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/309.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/31.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/318.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/319.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/322.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/326.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/328.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/331.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/340.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/342.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/348.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/357.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/361.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/362.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/366.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/376.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/379.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/382.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/386.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/391.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/392.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/393.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/401.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/406.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/411.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/426.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/433.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/434.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/445.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/449.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/45.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/453.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/458.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/460.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/473.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/477.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/478.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/480.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/487.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/491.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/494.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/496.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/50.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/501.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/51.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/510.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/516.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/531.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/541.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/547.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/549.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/550.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/552.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/556.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/558.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/559.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/562.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/564.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/569.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/571.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/575.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/582.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/585.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/589.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/592.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/6.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/614.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/620.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/630.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/643.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/644.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/646.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/647.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/651.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/658.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/660.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/665.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/671.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/674.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/675.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/676.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/685.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/689.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/694.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/696.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/697.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/714.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/715.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/716.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/717.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/732.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/733.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/75.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/753.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/761.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/768.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/77.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/775.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/790.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/8.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/802.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/808.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/809.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/812.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/814.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/815.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/83.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/831.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/841.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/844.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/845.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/855.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/857.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/858.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/862.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/863.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/864.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/867.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/868.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/87.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/874.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/875.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/876.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/879.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/891.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/894.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/896.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/908.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/910.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/918.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/932.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/939.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/947.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/954.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/967.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/976.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/984.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/99.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/990.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/993.gif create mode 100755 SRIP/Libraries/Exp1/Data/T2/images/999.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/Config.txt create mode 100755 SRIP/Libraries/Exp1/Data/T3/Data.txt create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/111.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/117.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/126.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/134.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/138.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/145.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/147.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/154.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/155.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/161.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/163.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/168.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/171.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/173.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/177.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/18.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/184.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/189.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/196.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/198.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/20.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/203.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/226.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/227.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/228.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/23.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/241.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/246.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/248.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/265.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/266.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/268.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/281.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/283.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/286.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/296.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/301.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/305.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/313.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/314.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/32.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/320.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/323.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/334.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/335.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/34.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/344.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/345.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/347.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/349.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/351.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/353.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/363.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/365.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/369.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/375.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/384.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/387.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/390.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/394.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/405.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/410.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/416.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/419.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/42.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/420.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/424.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/425.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/429.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/435.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/44.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/440.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/442.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/446.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/457.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/46.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/461.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/47.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/470.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/472.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/483.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/486.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/488.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/49.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/5.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/500.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/502.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/504.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/518.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/521.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/526.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/529.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/530.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/533.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/540.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/546.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/55.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/551.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/56.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/560.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/567.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/572.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/576.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/58.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/581.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/584.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/590.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/595.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/596.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/601.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/602.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/603.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/616.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/622.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/627.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/628.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/629.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/632.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/642.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/686.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/688.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/695.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/705.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/706.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/708.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/709.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/721.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/726.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/727.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/728.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/735.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/737.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/741.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/742.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/745.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/756.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/757.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/759.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/762.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/764.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/765.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/767.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/770.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/773.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/778.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/783.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/785.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/789.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/792.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/793.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/794.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/797.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/801.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/807.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/81.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/813.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/818.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/823.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/824.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/827.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/828.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/832.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/859.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/86.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/865.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/866.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/877.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/88.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/886.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/888.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/901.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/903.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/914.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/924.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/926.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/930.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/931.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/933.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/936.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/941.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/95.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/964.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/973.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/975.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/977.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/98.gif create mode 100755 SRIP/Libraries/Exp1/Data/T3/images/981.gif create mode 100755 SRIP/Libraries/Exp1/MyPackage/Chart1.class create mode 100755 SRIP/Libraries/Exp1/MyPackage/Experiment1$1$1.class create mode 100755 SRIP/Libraries/Exp1/MyPackage/Experiment1$1.class create mode 100755 SRIP/Libraries/Exp1/MyPackage/Experiment1$2.class create mode 100755 SRIP/Libraries/Exp1/MyPackage/Experiment1$3.class create mode 100755 SRIP/Libraries/Exp1/MyPackage/Experiment1$4.class create mode 100755 SRIP/Libraries/Exp1/MyPackage/Experiment1$5.class create mode 100755 SRIP/Libraries/Exp1/MyPackage/Experiment1$6.class create mode 100755 SRIP/Libraries/Exp1/MyPackage/Experiment1$7.class create mode 100755 SRIP/Libraries/Exp1/MyPackage/Experiment1$RowListener.class create mode 100755 SRIP/Libraries/Exp1/MyPackage/Experiment1$ValueComparator.class create mode 100755 SRIP/Libraries/Exp1/MyPackage/Experiment1.class create mode 100755 SRIP/Libraries/Exp1/MyPackage/MathParser.class create mode 100644 SRIP/Libraries/T1/100.gif create mode 100644 SRIP/Libraries/T1/103.gif create mode 100644 SRIP/Libraries/T1/105.gif create mode 100644 SRIP/Libraries/T1/106.gif create mode 100644 SRIP/Libraries/T1/109.gif create mode 100644 SRIP/Libraries/T1/113.gif create mode 100644 SRIP/Libraries/T1/114.gif create mode 100644 SRIP/Libraries/T1/115.gif create mode 100644 SRIP/Libraries/T1/119.gif create mode 100644 SRIP/Libraries/T1/120.gif create mode 100644 SRIP/Libraries/T1/122.gif create mode 100644 SRIP/Libraries/T1/125.gif create mode 100644 SRIP/Libraries/T1/129.gif create mode 100644 SRIP/Libraries/T1/135.gif create mode 100644 SRIP/Libraries/T1/15.gif create mode 100644 SRIP/Libraries/T1/153.gif create mode 100644 SRIP/Libraries/T1/157.gif create mode 100644 SRIP/Libraries/T1/170.gif create mode 100644 SRIP/Libraries/T1/175.gif create mode 100644 SRIP/Libraries/T1/178.gif create mode 100644 SRIP/Libraries/T1/185.gif create mode 100644 SRIP/Libraries/T1/193.gif create mode 100644 SRIP/Libraries/T1/2.gif create mode 100644 SRIP/Libraries/T1/201.gif create mode 100644 SRIP/Libraries/T1/202.gif create mode 100644 SRIP/Libraries/T1/206.gif create mode 100644 SRIP/Libraries/T1/207.gif create mode 100644 SRIP/Libraries/T1/209.gif create mode 100644 SRIP/Libraries/T1/210.gif create mode 100644 SRIP/Libraries/T1/211.gif create mode 100644 SRIP/Libraries/T1/212.gif create mode 100644 SRIP/Libraries/T1/217.gif create mode 100644 SRIP/Libraries/T1/22.gif create mode 100644 SRIP/Libraries/T1/225.gif create mode 100644 SRIP/Libraries/T1/230.gif create mode 100644 SRIP/Libraries/T1/232.gif create mode 100644 SRIP/Libraries/T1/233.gif create mode 100644 SRIP/Libraries/T1/235.gif create mode 100644 SRIP/Libraries/T1/24.gif create mode 100644 SRIP/Libraries/T1/247.gif create mode 100644 SRIP/Libraries/T1/249.gif create mode 100644 SRIP/Libraries/T1/25.gif create mode 100644 SRIP/Libraries/T1/250.gif create mode 100644 SRIP/Libraries/T1/252.gif create mode 100644 SRIP/Libraries/T1/261.gif create mode 100644 SRIP/Libraries/T1/270.gif create mode 100644 SRIP/Libraries/T1/271.gif create mode 100644 SRIP/Libraries/T1/277.gif create mode 100644 SRIP/Libraries/T1/284.gif create mode 100644 SRIP/Libraries/T1/291.gif create mode 100644 SRIP/Libraries/T1/294.gif create mode 100644 SRIP/Libraries/T1/297.gif create mode 100644 SRIP/Libraries/T1/304.gif create mode 100644 SRIP/Libraries/T1/310.gif create mode 100644 SRIP/Libraries/T1/311.gif create mode 100644 SRIP/Libraries/T1/316.gif create mode 100644 SRIP/Libraries/T1/321.gif create mode 100644 SRIP/Libraries/T1/327.gif create mode 100644 SRIP/Libraries/T1/346.gif create mode 100644 SRIP/Libraries/T1/35.gif create mode 100644 SRIP/Libraries/T1/352.gif create mode 100644 SRIP/Libraries/T1/356.gif create mode 100644 SRIP/Libraries/T1/358.gif create mode 100644 SRIP/Libraries/T1/359.gif create mode 100644 SRIP/Libraries/T1/360.gif create mode 100644 SRIP/Libraries/T1/367.gif create mode 100644 SRIP/Libraries/T1/38.gif create mode 100644 SRIP/Libraries/T1/383.gif create mode 100644 SRIP/Libraries/T1/395.gif create mode 100644 SRIP/Libraries/T1/398.gif create mode 100644 SRIP/Libraries/T1/399.gif create mode 100644 SRIP/Libraries/T1/4.gif create mode 100644 SRIP/Libraries/T1/400.gif create mode 100644 SRIP/Libraries/T1/407.gif create mode 100644 SRIP/Libraries/T1/409.gif create mode 100644 SRIP/Libraries/T1/41.gif create mode 100644 SRIP/Libraries/T1/417.gif create mode 100644 SRIP/Libraries/T1/428.gif create mode 100644 SRIP/Libraries/T1/430.gif create mode 100644 SRIP/Libraries/T1/436.gif create mode 100644 SRIP/Libraries/T1/441.gif create mode 100644 SRIP/Libraries/T1/444.gif create mode 100644 SRIP/Libraries/T1/448.gif create mode 100644 SRIP/Libraries/T1/451.gif create mode 100644 SRIP/Libraries/T1/452.gif create mode 100644 SRIP/Libraries/T1/454.gif create mode 100644 SRIP/Libraries/T1/455.gif create mode 100644 SRIP/Libraries/T1/456.gif create mode 100644 SRIP/Libraries/T1/459.gif create mode 100644 SRIP/Libraries/T1/463.gif create mode 100644 SRIP/Libraries/T1/465.gif create mode 100644 SRIP/Libraries/T1/467.gif create mode 100644 SRIP/Libraries/T1/471.gif create mode 100644 SRIP/Libraries/T1/474.gif create mode 100644 SRIP/Libraries/T1/476.gif create mode 100644 SRIP/Libraries/T1/485.gif create mode 100644 SRIP/Libraries/T1/490.gif create mode 100644 SRIP/Libraries/T1/492.gif create mode 100644 SRIP/Libraries/T1/493.gif create mode 100644 SRIP/Libraries/T1/508.gif create mode 100644 SRIP/Libraries/T1/509.gif create mode 100644 SRIP/Libraries/T1/511.gif create mode 100644 SRIP/Libraries/T1/52.gif create mode 100644 SRIP/Libraries/T1/520.gif create mode 100644 SRIP/Libraries/T1/525.gif create mode 100644 SRIP/Libraries/T1/527.gif create mode 100644 SRIP/Libraries/T1/528.gif create mode 100644 SRIP/Libraries/T1/534.gif create mode 100644 SRIP/Libraries/T1/536.gif create mode 100644 SRIP/Libraries/T1/539.gif create mode 100644 SRIP/Libraries/T1/543.gif create mode 100644 SRIP/Libraries/T1/553.gif create mode 100644 SRIP/Libraries/T1/554.gif create mode 100644 SRIP/Libraries/T1/557.gif create mode 100644 SRIP/Libraries/T1/57.gif create mode 100644 SRIP/Libraries/T1/573.gif create mode 100644 SRIP/Libraries/T1/574.gif create mode 100644 SRIP/Libraries/T1/578.gif create mode 100644 SRIP/Libraries/T1/583.gif create mode 100644 SRIP/Libraries/T1/588.gif create mode 100644 SRIP/Libraries/T1/594.gif create mode 100644 SRIP/Libraries/T1/597.gif create mode 100644 SRIP/Libraries/T1/60.gif create mode 100644 SRIP/Libraries/T1/604.gif create mode 100644 SRIP/Libraries/T1/605.gif create mode 100644 SRIP/Libraries/T1/610.gif create mode 100644 SRIP/Libraries/T1/613.gif create mode 100644 SRIP/Libraries/T1/619.gif create mode 100644 SRIP/Libraries/T1/634.gif create mode 100644 SRIP/Libraries/T1/638.gif create mode 100644 SRIP/Libraries/T1/639.gif create mode 100644 SRIP/Libraries/T1/64.gif create mode 100644 SRIP/Libraries/T1/640.gif create mode 100644 SRIP/Libraries/T1/649.gif create mode 100644 SRIP/Libraries/T1/657.gif create mode 100644 SRIP/Libraries/T1/663.gif create mode 100644 SRIP/Libraries/T1/667.gif create mode 100644 SRIP/Libraries/T1/668.gif create mode 100644 SRIP/Libraries/T1/669.gif create mode 100644 SRIP/Libraries/T1/670.gif create mode 100644 SRIP/Libraries/T1/672.gif create mode 100644 SRIP/Libraries/T1/677.gif create mode 100644 SRIP/Libraries/T1/679.gif create mode 100644 SRIP/Libraries/T1/68.gif create mode 100644 SRIP/Libraries/T1/69.gif create mode 100644 SRIP/Libraries/T1/690.gif create mode 100644 SRIP/Libraries/T1/692.gif create mode 100644 SRIP/Libraries/T1/699.gif create mode 100644 SRIP/Libraries/T1/7.gif create mode 100644 SRIP/Libraries/T1/70.gif create mode 100644 SRIP/Libraries/T1/703.gif create mode 100644 SRIP/Libraries/T1/71.gif create mode 100644 SRIP/Libraries/T1/710.gif create mode 100644 SRIP/Libraries/T1/711.gif create mode 100644 SRIP/Libraries/T1/712.gif create mode 100644 SRIP/Libraries/T1/713.gif create mode 100644 SRIP/Libraries/T1/73.gif create mode 100644 SRIP/Libraries/T1/734.gif create mode 100644 SRIP/Libraries/T1/739.gif create mode 100644 SRIP/Libraries/T1/744.gif create mode 100644 SRIP/Libraries/T1/746.gif create mode 100644 SRIP/Libraries/T1/748.gif create mode 100644 SRIP/Libraries/T1/76.gif create mode 100644 SRIP/Libraries/T1/766.gif create mode 100644 SRIP/Libraries/T1/777.gif create mode 100644 SRIP/Libraries/T1/78.gif create mode 100644 SRIP/Libraries/T1/780.gif create mode 100644 SRIP/Libraries/T1/781.gif create mode 100644 SRIP/Libraries/T1/782.gif create mode 100644 SRIP/Libraries/T1/784.gif create mode 100644 SRIP/Libraries/T1/788.gif create mode 100644 SRIP/Libraries/T1/79.gif create mode 100644 SRIP/Libraries/T1/791.gif create mode 100644 SRIP/Libraries/T1/810.gif create mode 100644 SRIP/Libraries/T1/819.gif create mode 100644 SRIP/Libraries/T1/82.gif create mode 100644 SRIP/Libraries/T1/822.gif create mode 100644 SRIP/Libraries/T1/826.gif create mode 100644 SRIP/Libraries/T1/834.gif create mode 100644 SRIP/Libraries/T1/836.gif create mode 100644 SRIP/Libraries/T1/839.gif create mode 100644 SRIP/Libraries/T1/850.gif create mode 100644 SRIP/Libraries/T1/860.gif create mode 100644 SRIP/Libraries/T1/861.gif create mode 100644 SRIP/Libraries/T1/870.gif create mode 100644 SRIP/Libraries/T1/871.gif create mode 100644 SRIP/Libraries/T1/872.gif create mode 100644 SRIP/Libraries/T1/873.gif create mode 100644 SRIP/Libraries/T1/89.gif create mode 100644 SRIP/Libraries/T1/890.gif create mode 100644 SRIP/Libraries/T1/892.gif create mode 100644 SRIP/Libraries/T1/9.gif create mode 100644 SRIP/Libraries/T1/904.gif create mode 100644 SRIP/Libraries/T1/906.gif create mode 100644 SRIP/Libraries/T1/920.gif create mode 100644 SRIP/Libraries/T1/921.gif create mode 100644 SRIP/Libraries/T1/928.gif create mode 100644 SRIP/Libraries/T1/942.gif create mode 100644 SRIP/Libraries/T1/944.gif create mode 100644 SRIP/Libraries/T1/950.gif create mode 100644 SRIP/Libraries/T1/952.gif create mode 100644 SRIP/Libraries/T1/953.gif create mode 100644 SRIP/Libraries/T1/958.gif create mode 100644 SRIP/Libraries/T1/96.gif create mode 100644 SRIP/Libraries/T1/960.gif create mode 100644 SRIP/Libraries/T1/962.gif create mode 100644 SRIP/Libraries/T1/966.gif create mode 100644 SRIP/Libraries/T1/979.gif create mode 100644 SRIP/Libraries/T1/980.gif create mode 100644 SRIP/Libraries/T1/983.gif create mode 100644 SRIP/Libraries/T1/985.gif create mode 100644 SRIP/Libraries/T1/994.gif create mode 100644 SRIP/Libraries/T1/998.gif create mode 100644 SRIP/Libraries/T2/108.gif create mode 100644 SRIP/Libraries/T2/11.gif create mode 100644 SRIP/Libraries/T2/110.gif create mode 100644 SRIP/Libraries/T2/112.gif create mode 100644 SRIP/Libraries/T2/118.gif create mode 100644 SRIP/Libraries/T2/121.gif create mode 100644 SRIP/Libraries/T2/123.gif create mode 100644 SRIP/Libraries/T2/13.gif create mode 100644 SRIP/Libraries/T2/131.gif create mode 100644 SRIP/Libraries/T2/136.gif create mode 100644 SRIP/Libraries/T2/137.gif create mode 100644 SRIP/Libraries/T2/144.gif create mode 100644 SRIP/Libraries/T2/150.gif create mode 100644 SRIP/Libraries/T2/158.gif create mode 100644 SRIP/Libraries/T2/160.gif create mode 100644 SRIP/Libraries/T2/162.gif create mode 100644 SRIP/Libraries/T2/17.gif create mode 100644 SRIP/Libraries/T2/172.gif create mode 100644 SRIP/Libraries/T2/179.gif create mode 100644 SRIP/Libraries/T2/180.gif create mode 100644 SRIP/Libraries/T2/181.gif create mode 100644 SRIP/Libraries/T2/182.gif create mode 100644 SRIP/Libraries/T2/188.gif create mode 100644 SRIP/Libraries/T2/190.gif create mode 100644 SRIP/Libraries/T2/191.gif create mode 100644 SRIP/Libraries/T2/199.gif create mode 100644 SRIP/Libraries/T2/200.gif create mode 100644 SRIP/Libraries/T2/204.gif create mode 100644 SRIP/Libraries/T2/208.gif create mode 100644 SRIP/Libraries/T2/214.gif create mode 100644 SRIP/Libraries/T2/216.gif create mode 100644 SRIP/Libraries/T2/221.gif create mode 100644 SRIP/Libraries/T2/229.gif create mode 100644 SRIP/Libraries/T2/234.gif create mode 100644 SRIP/Libraries/T2/236.gif create mode 100644 SRIP/Libraries/T2/243.gif create mode 100644 SRIP/Libraries/T2/251.gif create mode 100644 SRIP/Libraries/T2/253.gif create mode 100644 SRIP/Libraries/T2/254.gif create mode 100644 SRIP/Libraries/T2/255.gif create mode 100644 SRIP/Libraries/T2/256.gif create mode 100644 SRIP/Libraries/T2/26.gif create mode 100644 SRIP/Libraries/T2/263.gif create mode 100644 SRIP/Libraries/T2/269.gif create mode 100644 SRIP/Libraries/T2/278.gif create mode 100644 SRIP/Libraries/T2/28.gif create mode 100644 SRIP/Libraries/T2/280.gif create mode 100644 SRIP/Libraries/T2/282.gif create mode 100644 SRIP/Libraries/T2/29.gif create mode 100644 SRIP/Libraries/T2/292.gif create mode 100644 SRIP/Libraries/T2/299.gif create mode 100644 SRIP/Libraries/T2/309.gif create mode 100644 SRIP/Libraries/T2/31.gif create mode 100644 SRIP/Libraries/T2/318.gif create mode 100644 SRIP/Libraries/T2/319.gif create mode 100644 SRIP/Libraries/T2/322.gif create mode 100644 SRIP/Libraries/T2/326.gif create mode 100644 SRIP/Libraries/T2/328.gif create mode 100644 SRIP/Libraries/T2/331.gif create mode 100644 SRIP/Libraries/T2/340.gif create mode 100644 SRIP/Libraries/T2/342.gif create mode 100644 SRIP/Libraries/T2/348.gif create mode 100644 SRIP/Libraries/T2/357.gif create mode 100644 SRIP/Libraries/T2/361.gif create mode 100644 SRIP/Libraries/T2/362.gif create mode 100644 SRIP/Libraries/T2/366.gif create mode 100644 SRIP/Libraries/T2/376.gif create mode 100644 SRIP/Libraries/T2/379.gif create mode 100644 SRIP/Libraries/T2/382.gif create mode 100644 SRIP/Libraries/T2/386.gif create mode 100644 SRIP/Libraries/T2/391.gif create mode 100644 SRIP/Libraries/T2/392.gif create mode 100644 SRIP/Libraries/T2/393.gif create mode 100644 SRIP/Libraries/T2/401.gif create mode 100644 SRIP/Libraries/T2/406.gif create mode 100644 SRIP/Libraries/T2/411.gif create mode 100644 SRIP/Libraries/T2/426.gif create mode 100644 SRIP/Libraries/T2/433.gif create mode 100644 SRIP/Libraries/T2/434.gif create mode 100644 SRIP/Libraries/T2/445.gif create mode 100644 SRIP/Libraries/T2/449.gif create mode 100644 SRIP/Libraries/T2/45.gif create mode 100644 SRIP/Libraries/T2/453.gif create mode 100644 SRIP/Libraries/T2/458.gif create mode 100644 SRIP/Libraries/T2/460.gif create mode 100644 SRIP/Libraries/T2/473.gif create mode 100644 SRIP/Libraries/T2/477.gif create mode 100644 SRIP/Libraries/T2/478.gif create mode 100644 SRIP/Libraries/T2/480.gif create mode 100644 SRIP/Libraries/T2/487.gif create mode 100644 SRIP/Libraries/T2/491.gif create mode 100644 SRIP/Libraries/T2/494.gif create mode 100644 SRIP/Libraries/T2/496.gif create mode 100644 SRIP/Libraries/T2/50.gif create mode 100644 SRIP/Libraries/T2/501.gif create mode 100644 SRIP/Libraries/T2/51.gif create mode 100644 SRIP/Libraries/T2/510.gif create mode 100644 SRIP/Libraries/T2/516.gif create mode 100644 SRIP/Libraries/T2/531.gif create mode 100644 SRIP/Libraries/T2/541.gif create mode 100644 SRIP/Libraries/T2/547.gif create mode 100644 SRIP/Libraries/T2/549.gif create mode 100644 SRIP/Libraries/T2/550.gif create mode 100644 SRIP/Libraries/T2/552.gif create mode 100644 SRIP/Libraries/T2/556.gif create mode 100644 SRIP/Libraries/T2/558.gif create mode 100644 SRIP/Libraries/T2/559.gif create mode 100644 SRIP/Libraries/T2/562.gif create mode 100644 SRIP/Libraries/T2/564.gif create mode 100644 SRIP/Libraries/T2/569.gif create mode 100644 SRIP/Libraries/T2/571.gif create mode 100644 SRIP/Libraries/T2/575.gif create mode 100644 SRIP/Libraries/T2/582.gif create mode 100644 SRIP/Libraries/T2/585.gif create mode 100644 SRIP/Libraries/T2/589.gif create mode 100644 SRIP/Libraries/T2/592.gif create mode 100644 SRIP/Libraries/T2/6.gif create mode 100644 SRIP/Libraries/T2/614.gif create mode 100644 SRIP/Libraries/T2/620.gif create mode 100644 SRIP/Libraries/T2/630.gif create mode 100644 SRIP/Libraries/T2/643.gif create mode 100644 SRIP/Libraries/T2/644.gif create mode 100644 SRIP/Libraries/T2/646.gif create mode 100644 SRIP/Libraries/T2/647.gif create mode 100644 SRIP/Libraries/T2/651.gif create mode 100644 SRIP/Libraries/T2/658.gif create mode 100644 SRIP/Libraries/T2/660.gif create mode 100644 SRIP/Libraries/T2/665.gif create mode 100644 SRIP/Libraries/T2/671.gif create mode 100644 SRIP/Libraries/T2/674.gif create mode 100644 SRIP/Libraries/T2/675.gif create mode 100644 SRIP/Libraries/T2/676.gif create mode 100644 SRIP/Libraries/T2/685.gif create mode 100644 SRIP/Libraries/T2/689.gif create mode 100644 SRIP/Libraries/T2/694.gif create mode 100644 SRIP/Libraries/T2/696.gif create mode 100644 SRIP/Libraries/T2/697.gif create mode 100644 SRIP/Libraries/T2/714.gif create mode 100644 SRIP/Libraries/T2/715.gif create mode 100644 SRIP/Libraries/T2/716.gif create mode 100644 SRIP/Libraries/T2/717.gif create mode 100644 SRIP/Libraries/T2/732.gif create mode 100644 SRIP/Libraries/T2/733.gif create mode 100644 SRIP/Libraries/T2/75.gif create mode 100644 SRIP/Libraries/T2/753.gif create mode 100644 SRIP/Libraries/T2/761.gif create mode 100644 SRIP/Libraries/T2/768.gif create mode 100644 SRIP/Libraries/T2/77.gif create mode 100644 SRIP/Libraries/T2/775.gif create mode 100644 SRIP/Libraries/T2/790.gif create mode 100644 SRIP/Libraries/T2/8.gif create mode 100644 SRIP/Libraries/T2/802.gif create mode 100644 SRIP/Libraries/T2/808.gif create mode 100644 SRIP/Libraries/T2/809.gif create mode 100644 SRIP/Libraries/T2/812.gif create mode 100644 SRIP/Libraries/T2/814.gif create mode 100644 SRIP/Libraries/T2/815.gif create mode 100644 SRIP/Libraries/T2/83.gif create mode 100644 SRIP/Libraries/T2/831.gif create mode 100644 SRIP/Libraries/T2/841.gif create mode 100644 SRIP/Libraries/T2/844.gif create mode 100644 SRIP/Libraries/T2/845.gif create mode 100644 SRIP/Libraries/T2/855.gif create mode 100644 SRIP/Libraries/T2/857.gif create mode 100644 SRIP/Libraries/T2/858.gif create mode 100644 SRIP/Libraries/T2/862.gif create mode 100644 SRIP/Libraries/T2/863.gif create mode 100644 SRIP/Libraries/T2/864.gif create mode 100644 SRIP/Libraries/T2/867.gif create mode 100644 SRIP/Libraries/T2/868.gif create mode 100644 SRIP/Libraries/T2/87.gif create mode 100644 SRIP/Libraries/T2/874.gif create mode 100644 SRIP/Libraries/T2/875.gif create mode 100644 SRIP/Libraries/T2/876.gif create mode 100644 SRIP/Libraries/T2/879.gif create mode 100644 SRIP/Libraries/T2/891.gif create mode 100644 SRIP/Libraries/T2/894.gif create mode 100644 SRIP/Libraries/T2/896.gif create mode 100644 SRIP/Libraries/T2/908.gif create mode 100644 SRIP/Libraries/T2/910.gif create mode 100644 SRIP/Libraries/T2/918.gif create mode 100644 SRIP/Libraries/T2/932.gif create mode 100644 SRIP/Libraries/T2/939.gif create mode 100644 SRIP/Libraries/T2/947.gif create mode 100644 SRIP/Libraries/T2/954.gif create mode 100644 SRIP/Libraries/T2/967.gif create mode 100644 SRIP/Libraries/T2/976.gif create mode 100644 SRIP/Libraries/T2/984.gif create mode 100644 SRIP/Libraries/T2/99.gif create mode 100644 SRIP/Libraries/T2/990.gif create mode 100644 SRIP/Libraries/T2/993.gif create mode 100644 SRIP/Libraries/T2/999.gif create mode 100644 SRIP/Libraries/T3/111.gif create mode 100644 SRIP/Libraries/T3/117.gif create mode 100644 SRIP/Libraries/T3/126.gif create mode 100644 SRIP/Libraries/T3/134.gif create mode 100644 SRIP/Libraries/T3/138.gif create mode 100644 SRIP/Libraries/T3/145.gif create mode 100644 SRIP/Libraries/T3/147.gif create mode 100644 SRIP/Libraries/T3/154.gif create mode 100644 SRIP/Libraries/T3/155.gif create mode 100644 SRIP/Libraries/T3/161.gif create mode 100644 SRIP/Libraries/T3/163.gif create mode 100644 SRIP/Libraries/T3/168.gif create mode 100644 SRIP/Libraries/T3/171.gif create mode 100644 SRIP/Libraries/T3/173.gif create mode 100644 SRIP/Libraries/T3/177.gif create mode 100644 SRIP/Libraries/T3/18.gif create mode 100644 SRIP/Libraries/T3/184.gif create mode 100644 SRIP/Libraries/T3/189.gif create mode 100644 SRIP/Libraries/T3/196.gif create mode 100644 SRIP/Libraries/T3/198.gif create mode 100644 SRIP/Libraries/T3/20.gif create mode 100644 SRIP/Libraries/T3/203.gif create mode 100644 SRIP/Libraries/T3/226.gif create mode 100644 SRIP/Libraries/T3/227.gif create mode 100644 SRIP/Libraries/T3/228.gif create mode 100644 SRIP/Libraries/T3/23.gif create mode 100644 SRIP/Libraries/T3/241.gif create mode 100644 SRIP/Libraries/T3/246.gif create mode 100644 SRIP/Libraries/T3/248.gif create mode 100644 SRIP/Libraries/T3/265.gif create mode 100644 SRIP/Libraries/T3/266.gif create mode 100644 SRIP/Libraries/T3/268.gif create mode 100644 SRIP/Libraries/T3/281.gif create mode 100644 SRIP/Libraries/T3/283.gif create mode 100644 SRIP/Libraries/T3/286.gif create mode 100644 SRIP/Libraries/T3/296.gif create mode 100644 SRIP/Libraries/T3/301.gif create mode 100644 SRIP/Libraries/T3/305.gif create mode 100644 SRIP/Libraries/T3/313.gif create mode 100644 SRIP/Libraries/T3/314.gif create mode 100644 SRIP/Libraries/T3/32.gif create mode 100644 SRIP/Libraries/T3/320.gif create mode 100644 SRIP/Libraries/T3/323.gif create mode 100644 SRIP/Libraries/T3/334.gif create mode 100644 SRIP/Libraries/T3/335.gif create mode 100644 SRIP/Libraries/T3/34.gif create mode 100644 SRIP/Libraries/T3/344.gif create mode 100644 SRIP/Libraries/T3/345.gif create mode 100644 SRIP/Libraries/T3/347.gif create mode 100644 SRIP/Libraries/T3/349.gif create mode 100644 SRIP/Libraries/T3/351.gif create mode 100644 SRIP/Libraries/T3/353.gif create mode 100644 SRIP/Libraries/T3/363.gif create mode 100644 SRIP/Libraries/T3/365.gif create mode 100644 SRIP/Libraries/T3/369.gif create mode 100644 SRIP/Libraries/T3/375.gif create mode 100644 SRIP/Libraries/T3/384.gif create mode 100644 SRIP/Libraries/T3/387.gif create mode 100644 SRIP/Libraries/T3/390.gif create mode 100644 SRIP/Libraries/T3/394.gif create mode 100644 SRIP/Libraries/T3/405.gif create mode 100644 SRIP/Libraries/T3/410.gif create mode 100644 SRIP/Libraries/T3/416.gif create mode 100644 SRIP/Libraries/T3/419.gif create mode 100644 SRIP/Libraries/T3/42.gif create mode 100644 SRIP/Libraries/T3/420.gif create mode 100644 SRIP/Libraries/T3/424.gif create mode 100644 SRIP/Libraries/T3/425.gif create mode 100644 SRIP/Libraries/T3/429.gif create mode 100644 SRIP/Libraries/T3/435.gif create mode 100644 SRIP/Libraries/T3/44.gif create mode 100644 SRIP/Libraries/T3/440.gif create mode 100644 SRIP/Libraries/T3/442.gif create mode 100644 SRIP/Libraries/T3/446.gif create mode 100644 SRIP/Libraries/T3/457.gif create mode 100644 SRIP/Libraries/T3/46.gif create mode 100644 SRIP/Libraries/T3/461.gif create mode 100644 SRIP/Libraries/T3/47.gif create mode 100644 SRIP/Libraries/T3/470.gif create mode 100644 SRIP/Libraries/T3/472.gif create mode 100644 SRIP/Libraries/T3/483.gif create mode 100644 SRIP/Libraries/T3/486.gif create mode 100644 SRIP/Libraries/T3/488.gif create mode 100644 SRIP/Libraries/T3/49.gif create mode 100644 SRIP/Libraries/T3/5.gif create mode 100644 SRIP/Libraries/T3/500.gif create mode 100644 SRIP/Libraries/T3/502.gif create mode 100644 SRIP/Libraries/T3/504.gif create mode 100644 SRIP/Libraries/T3/518.gif create mode 100644 SRIP/Libraries/T3/521.gif create mode 100644 SRIP/Libraries/T3/526.gif create mode 100644 SRIP/Libraries/T3/529.gif create mode 100644 SRIP/Libraries/T3/530.gif create mode 100644 SRIP/Libraries/T3/533.gif create mode 100644 SRIP/Libraries/T3/540.gif create mode 100644 SRIP/Libraries/T3/546.gif create mode 100644 SRIP/Libraries/T3/55.gif create mode 100644 SRIP/Libraries/T3/551.gif create mode 100644 SRIP/Libraries/T3/56.gif create mode 100644 SRIP/Libraries/T3/560.gif create mode 100644 SRIP/Libraries/T3/567.gif create mode 100644 SRIP/Libraries/T3/572.gif create mode 100644 SRIP/Libraries/T3/576.gif create mode 100644 SRIP/Libraries/T3/58.gif create mode 100644 SRIP/Libraries/T3/581.gif create mode 100644 SRIP/Libraries/T3/584.gif create mode 100644 SRIP/Libraries/T3/590.gif create mode 100644 SRIP/Libraries/T3/595.gif create mode 100644 SRIP/Libraries/T3/596.gif create mode 100644 SRIP/Libraries/T3/601.gif create mode 100644 SRIP/Libraries/T3/602.gif create mode 100644 SRIP/Libraries/T3/603.gif create mode 100644 SRIP/Libraries/T3/616.gif create mode 100644 SRIP/Libraries/T3/622.gif create mode 100644 SRIP/Libraries/T3/627.gif create mode 100644 SRIP/Libraries/T3/628.gif create mode 100644 SRIP/Libraries/T3/629.gif create mode 100644 SRIP/Libraries/T3/632.gif create mode 100644 SRIP/Libraries/T3/642.gif create mode 100644 SRIP/Libraries/T3/686.gif create mode 100644 SRIP/Libraries/T3/688.gif create mode 100644 SRIP/Libraries/T3/695.gif create mode 100644 SRIP/Libraries/T3/705.gif create mode 100644 SRIP/Libraries/T3/706.gif create mode 100644 SRIP/Libraries/T3/708.gif create mode 100644 SRIP/Libraries/T3/709.gif create mode 100644 SRIP/Libraries/T3/721.gif create mode 100644 SRIP/Libraries/T3/726.gif create mode 100644 SRIP/Libraries/T3/727.gif create mode 100644 SRIP/Libraries/T3/728.gif create mode 100644 SRIP/Libraries/T3/735.gif create mode 100644 SRIP/Libraries/T3/737.gif create mode 100644 SRIP/Libraries/T3/741.gif create mode 100644 SRIP/Libraries/T3/742.gif create mode 100644 SRIP/Libraries/T3/745.gif create mode 100644 SRIP/Libraries/T3/756.gif create mode 100644 SRIP/Libraries/T3/757.gif create mode 100644 SRIP/Libraries/T3/759.gif create mode 100644 SRIP/Libraries/T3/762.gif create mode 100644 SRIP/Libraries/T3/764.gif create mode 100644 SRIP/Libraries/T3/765.gif create mode 100644 SRIP/Libraries/T3/767.gif create mode 100644 SRIP/Libraries/T3/770.gif create mode 100644 SRIP/Libraries/T3/773.gif create mode 100644 SRIP/Libraries/T3/778.gif create mode 100644 SRIP/Libraries/T3/783.gif create mode 100644 SRIP/Libraries/T3/785.gif create mode 100644 SRIP/Libraries/T3/789.gif create mode 100644 SRIP/Libraries/T3/792.gif create mode 100644 SRIP/Libraries/T3/793.gif create mode 100644 SRIP/Libraries/T3/794.gif create mode 100644 SRIP/Libraries/T3/797.gif create mode 100644 SRIP/Libraries/T3/801.gif create mode 100644 SRIP/Libraries/T3/807.gif create mode 100644 SRIP/Libraries/T3/81.gif create mode 100644 SRIP/Libraries/T3/813.gif create mode 100644 SRIP/Libraries/T3/818.gif create mode 100644 SRIP/Libraries/T3/823.gif create mode 100644 SRIP/Libraries/T3/824.gif create mode 100644 SRIP/Libraries/T3/827.gif create mode 100644 SRIP/Libraries/T3/828.gif create mode 100644 SRIP/Libraries/T3/832.gif create mode 100644 SRIP/Libraries/T3/859.gif create mode 100644 SRIP/Libraries/T3/86.gif create mode 100644 SRIP/Libraries/T3/865.gif create mode 100644 SRIP/Libraries/T3/866.gif create mode 100644 SRIP/Libraries/T3/877.gif create mode 100644 SRIP/Libraries/T3/88.gif create mode 100644 SRIP/Libraries/T3/886.gif create mode 100644 SRIP/Libraries/T3/888.gif create mode 100644 SRIP/Libraries/T3/901.gif create mode 100644 SRIP/Libraries/T3/903.gif create mode 100644 SRIP/Libraries/T3/914.gif create mode 100644 SRIP/Libraries/T3/924.gif create mode 100644 SRIP/Libraries/T3/926.gif create mode 100644 SRIP/Libraries/T3/930.gif create mode 100644 SRIP/Libraries/T3/931.gif create mode 100644 SRIP/Libraries/T3/933.gif create mode 100644 SRIP/Libraries/T3/936.gif create mode 100644 SRIP/Libraries/T3/941.gif create mode 100644 SRIP/Libraries/T3/95.gif create mode 100644 SRIP/Libraries/T3/964.gif create mode 100644 SRIP/Libraries/T3/973.gif create mode 100644 SRIP/Libraries/T3/975.gif create mode 100644 SRIP/Libraries/T3/977.gif create mode 100644 SRIP/Libraries/T3/98.gif create mode 100644 SRIP/Libraries/T3/981.gif delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/canvasjs.min.js delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/instruction.txt delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js delete mode 100644 SRIP/Libraries/canvasjs-2.3.1/license.txt diff --git a/SRIP/Codes/exp1.css b/SRIP/Codes/exp1.css index 3d2e7868..6097a79d 100644 --- a/SRIP/Codes/exp1.css +++ b/SRIP/Codes/exp1.css @@ -9,4 +9,48 @@ body { margin: 0; +} + + +.row:after { + +content: ""; + +display: table; + +clear: both; + +} + +/* Left column */ +.leftcolumn { + +float: left; + +width: 50%; + +} + +/* Right column */ +.rightcolumn { + +float: left; + +width: 50%; + +padding-left: 20px; + +} + +/* Responsive layout - when the screen is less than 800px wide, make the two columns stack on top of each other instead of next to each other */ +@media screen and (max-width: 800px) { + +.leftcolumn, .rightcolumn { + +width: 100%; + +padding: 0; + +} + } \ No newline at end of file diff --git a/SRIP/Codes/exp1.html b/SRIP/Codes/exp1.html index 8f7cf9d5..8aa8de69 100644 --- a/SRIP/Codes/exp1.html +++ b/SRIP/Codes/exp1.html @@ -1,14 +1,93 @@ - + - Pattern Recognition: Experiment 1- Feature Representation<title> + <title>Pattern Recognition: Feature Representation +
+
+
+
+
+
+

Dataset + + +

+ +

Feature 1 + + +

+ +

Feature 2 + + +

+
+ + +
+ +

+ Target Accuracy: +

+ +

+ Current Accuracy: +

+ +

+ Maximum Accuracy: +

+ +

+ hellloooo +

+ +

+ Class: +

+ +

+ F1: +

+ +

+ F2: +

+
+
+ +
+ +
\ No newline at end of file diff --git a/SRIP/Codes/exp1.js b/SRIP/Codes/exp1.js index e69de29b..95afa841 100644 --- a/SRIP/Codes/exp1.js +++ b/SRIP/Codes/exp1.js @@ -0,0 +1,50 @@ +window.onload = function() { + var series1 = []; //stores class 1 points and plots on chart + var series2 = []; //stores class 2 points and plots on chart + var chart = new CanvasJS.Chart("chartContainer", { + title: {text: "Chart"}, + axisX:{ + title: "X-axis", + }, + axisY: { + title: "Y-axis", + }, + data: [{ + showInLegend: true, + legendText: "Class 1", + color: "red", + type: "scatter", + dataPoints: series1 + }, + { + showInLegend: true, + legendText: "Class 2", + color: "blue", + type: "scatter", + dataPoints: series2 + }] + }); + + function plotfunction(){ + var xValue = 1; + var yValue = 2; + series1.push({ + x: xValue, + y: yValue + }); + chart.render(); + } + + var plo = document.getElementById("plot"); + plo.addEventListener("click", plotfunction); + /*var addClass2 = document.getElementById("add-class-2"); + addClass2.addEventListener("click", addDataPointsAndRender2); + var addClass1 = document.getElementById("add-class-1"); + addClass1.addEventListener("click", addDataPointsAndRender1); + var addClass2 = document.getElementById("add-class-2"); + addClass2.addEventListener("click", addDataPointsAndRender2); + var addClass1 = document.getElementById("add-class-1"); + addClass1.addEventListener("click", addDataPointsAndRender1); + var addClass2 = document.getElementById("add-class-2"); + addClass2.addEventListener("click", addDataPointsAndRender2);*/ +}; \ No newline at end of file diff --git a/SRIP/Libraries/Chart.js b/SRIP/Libraries/Chart.js deleted file mode 100644 index 4c50e09b..00000000 --- a/SRIP/Libraries/Chart.js +++ /dev/null @@ -1,14680 +0,0 @@ -/*! - * Chart.js v2.8.0 - * https://www.chartjs.org - * (c) 2019 Chart.js Contributors - * Released under the MIT License - */ -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(function() { try { return require('moment'); } catch(e) { } }()) : -typeof define === 'function' && define.amd ? define(['require'], function(require) { return factory(function() { try { return require('moment'); } catch(e) { } }()); }) : -(global.Chart = factory(global.moment)); -}(this, (function (moment) { 'use strict'; - -moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment; - -/* MIT license */ - -var conversions = { - rgb2hsl: rgb2hsl, - rgb2hsv: rgb2hsv, - rgb2hwb: rgb2hwb, - rgb2cmyk: rgb2cmyk, - rgb2keyword: rgb2keyword, - rgb2xyz: rgb2xyz, - rgb2lab: rgb2lab, - rgb2lch: rgb2lch, - - hsl2rgb: hsl2rgb, - hsl2hsv: hsl2hsv, - hsl2hwb: hsl2hwb, - hsl2cmyk: hsl2cmyk, - hsl2keyword: hsl2keyword, - - hsv2rgb: hsv2rgb, - hsv2hsl: hsv2hsl, - hsv2hwb: hsv2hwb, - hsv2cmyk: hsv2cmyk, - hsv2keyword: hsv2keyword, - - hwb2rgb: hwb2rgb, - hwb2hsl: hwb2hsl, - hwb2hsv: hwb2hsv, - hwb2cmyk: hwb2cmyk, - hwb2keyword: hwb2keyword, - - cmyk2rgb: cmyk2rgb, - cmyk2hsl: cmyk2hsl, - cmyk2hsv: cmyk2hsv, - cmyk2hwb: cmyk2hwb, - cmyk2keyword: cmyk2keyword, - - keyword2rgb: keyword2rgb, - keyword2hsl: keyword2hsl, - keyword2hsv: keyword2hsv, - keyword2hwb: keyword2hwb, - keyword2cmyk: keyword2cmyk, - keyword2lab: keyword2lab, - keyword2xyz: keyword2xyz, - - xyz2rgb: xyz2rgb, - xyz2lab: xyz2lab, - xyz2lch: xyz2lch, - - lab2xyz: lab2xyz, - lab2rgb: lab2rgb, - lab2lch: lab2lch, - - lch2lab: lch2lab, - lch2xyz: lch2xyz, - lch2rgb: lch2rgb -}; - - -function rgb2hsl(rgb) { - var r = rgb[0]/255, - g = rgb[1]/255, - b = rgb[2]/255, - min = Math.min(r, g, b), - max = Math.max(r, g, b), - delta = max - min, - h, s, l; - - if (max == min) - h = 0; - else if (r == max) - h = (g - b) / delta; - else if (g == max) - h = 2 + (b - r) / delta; - else if (b == max) - h = 4 + (r - g)/ delta; - - h = Math.min(h * 60, 360); - - if (h < 0) - h += 360; - - l = (min + max) / 2; - - if (max == min) - s = 0; - else if (l <= 0.5) - s = delta / (max + min); - else - s = delta / (2 - max - min); - - return [h, s * 100, l * 100]; -} - -function rgb2hsv(rgb) { - var r = rgb[0], - g = rgb[1], - b = rgb[2], - min = Math.min(r, g, b), - max = Math.max(r, g, b), - delta = max - min, - h, s, v; - - if (max == 0) - s = 0; - else - s = (delta/max * 1000)/10; - - if (max == min) - h = 0; - else if (r == max) - h = (g - b) / delta; - else if (g == max) - h = 2 + (b - r) / delta; - else if (b == max) - h = 4 + (r - g) / delta; - - h = Math.min(h * 60, 360); - - if (h < 0) - h += 360; - - v = ((max / 255) * 1000) / 10; - - return [h, s, v]; -} - -function rgb2hwb(rgb) { - var r = rgb[0], - g = rgb[1], - b = rgb[2], - h = rgb2hsl(rgb)[0], - w = 1/255 * Math.min(r, Math.min(g, b)), - b = 1 - 1/255 * Math.max(r, Math.max(g, b)); - - return [h, w * 100, b * 100]; -} - -function rgb2cmyk(rgb) { - var r = rgb[0] / 255, - g = rgb[1] / 255, - b = rgb[2] / 255, - c, m, y, k; - - k = Math.min(1 - r, 1 - g, 1 - b); - c = (1 - r - k) / (1 - k) || 0; - m = (1 - g - k) / (1 - k) || 0; - y = (1 - b - k) / (1 - k) || 0; - return [c * 100, m * 100, y * 100, k * 100]; -} - -function rgb2keyword(rgb) { - return reverseKeywords[JSON.stringify(rgb)]; -} - -function rgb2xyz(rgb) { - var r = rgb[0] / 255, - g = rgb[1] / 255, - b = rgb[2] / 255; - - // assume sRGB - r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); - g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); - b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); - - var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); - var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); - var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); - - return [x * 100, y *100, z * 100]; -} - -function rgb2lab(rgb) { - var xyz = rgb2xyz(rgb), - x = xyz[0], - y = xyz[1], - z = xyz[2], - l, a, b; - - x /= 95.047; - y /= 100; - z /= 108.883; - - x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); - - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); - - return [l, a, b]; -} - -function rgb2lch(args) { - return lab2lch(rgb2lab(args)); -} - -function hsl2rgb(hsl) { - var h = hsl[0] / 360, - s = hsl[1] / 100, - l = hsl[2] / 100, - t1, t2, t3, rgb, val; - - if (s == 0) { - val = l * 255; - return [val, val, val]; - } - - if (l < 0.5) - t2 = l * (1 + s); - else - t2 = l + s - l * s; - t1 = 2 * l - t2; - - rgb = [0, 0, 0]; - for (var i = 0; i < 3; i++) { - t3 = h + 1 / 3 * - (i - 1); - t3 < 0 && t3++; - t3 > 1 && t3--; - - if (6 * t3 < 1) - val = t1 + (t2 - t1) * 6 * t3; - else if (2 * t3 < 1) - val = t2; - else if (3 * t3 < 2) - val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; - else - val = t1; - - rgb[i] = val * 255; - } - - return rgb; -} - -function hsl2hsv(hsl) { - var h = hsl[0], - s = hsl[1] / 100, - l = hsl[2] / 100, - sv, v; - - if(l === 0) { - // no need to do calc on black - // also avoids divide by 0 error - return [0, 0, 0]; - } - - l *= 2; - s *= (l <= 1) ? l : 2 - l; - v = (l + s) / 2; - sv = (2 * s) / (l + s); - return [h, sv * 100, v * 100]; -} - -function hsl2hwb(args) { - return rgb2hwb(hsl2rgb(args)); -} - -function hsl2cmyk(args) { - return rgb2cmyk(hsl2rgb(args)); -} - -function hsl2keyword(args) { - return rgb2keyword(hsl2rgb(args)); -} - - -function hsv2rgb(hsv) { - var h = hsv[0] / 60, - s = hsv[1] / 100, - v = hsv[2] / 100, - hi = Math.floor(h) % 6; - - var f = h - Math.floor(h), - p = 255 * v * (1 - s), - q = 255 * v * (1 - (s * f)), - t = 255 * v * (1 - (s * (1 - f))), - v = 255 * v; - - switch(hi) { - case 0: - return [v, t, p]; - case 1: - return [q, v, p]; - case 2: - return [p, v, t]; - case 3: - return [p, q, v]; - case 4: - return [t, p, v]; - case 5: - return [v, p, q]; - } -} - -function hsv2hsl(hsv) { - var h = hsv[0], - s = hsv[1] / 100, - v = hsv[2] / 100, - sl, l; - - l = (2 - s) * v; - sl = s * v; - sl /= (l <= 1) ? l : 2 - l; - sl = sl || 0; - l /= 2; - return [h, sl * 100, l * 100]; -} - -function hsv2hwb(args) { - return rgb2hwb(hsv2rgb(args)) -} - -function hsv2cmyk(args) { - return rgb2cmyk(hsv2rgb(args)); -} - -function hsv2keyword(args) { - return rgb2keyword(hsv2rgb(args)); -} - -// http://dev.w3.org/csswg/css-color/#hwb-to-rgb -function hwb2rgb(hwb) { - var h = hwb[0] / 360, - wh = hwb[1] / 100, - bl = hwb[2] / 100, - ratio = wh + bl, - i, v, f, n; - - // wh + bl cant be > 1 - if (ratio > 1) { - wh /= ratio; - bl /= ratio; - } - - i = Math.floor(6 * h); - v = 1 - bl; - f = 6 * h - i; - if ((i & 0x01) != 0) { - f = 1 - f; - } - n = wh + f * (v - wh); // linear interpolation - - switch (i) { - default: - case 6: - case 0: r = v; g = n; b = wh; break; - case 1: r = n; g = v; b = wh; break; - case 2: r = wh; g = v; b = n; break; - case 3: r = wh; g = n; b = v; break; - case 4: r = n; g = wh; b = v; break; - case 5: r = v; g = wh; b = n; break; - } - - return [r * 255, g * 255, b * 255]; -} - -function hwb2hsl(args) { - return rgb2hsl(hwb2rgb(args)); -} - -function hwb2hsv(args) { - return rgb2hsv(hwb2rgb(args)); -} - -function hwb2cmyk(args) { - return rgb2cmyk(hwb2rgb(args)); -} - -function hwb2keyword(args) { - return rgb2keyword(hwb2rgb(args)); -} - -function cmyk2rgb(cmyk) { - var c = cmyk[0] / 100, - m = cmyk[1] / 100, - y = cmyk[2] / 100, - k = cmyk[3] / 100, - r, g, b; - - r = 1 - Math.min(1, c * (1 - k) + k); - g = 1 - Math.min(1, m * (1 - k) + k); - b = 1 - Math.min(1, y * (1 - k) + k); - return [r * 255, g * 255, b * 255]; -} - -function cmyk2hsl(args) { - return rgb2hsl(cmyk2rgb(args)); -} - -function cmyk2hsv(args) { - return rgb2hsv(cmyk2rgb(args)); -} - -function cmyk2hwb(args) { - return rgb2hwb(cmyk2rgb(args)); -} - -function cmyk2keyword(args) { - return rgb2keyword(cmyk2rgb(args)); -} - - -function xyz2rgb(xyz) { - var x = xyz[0] / 100, - y = xyz[1] / 100, - z = xyz[2] / 100, - r, g, b; - - r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); - g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); - b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); - - // assume sRGB - r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) - : r = (r * 12.92); - - g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) - : g = (g * 12.92); - - b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) - : b = (b * 12.92); - - r = Math.min(Math.max(0, r), 1); - g = Math.min(Math.max(0, g), 1); - b = Math.min(Math.max(0, b), 1); - - return [r * 255, g * 255, b * 255]; -} - -function xyz2lab(xyz) { - var x = xyz[0], - y = xyz[1], - z = xyz[2], - l, a, b; - - x /= 95.047; - y /= 100; - z /= 108.883; - - x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); - - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); - - return [l, a, b]; -} - -function xyz2lch(args) { - return lab2lch(xyz2lab(args)); -} - -function lab2xyz(lab) { - var l = lab[0], - a = lab[1], - b = lab[2], - x, y, z, y2; - - if (l <= 8) { - y = (l * 100) / 903.3; - y2 = (7.787 * (y / 100)) + (16 / 116); - } else { - y = 100 * Math.pow((l + 16) / 116, 3); - y2 = Math.pow(y / 100, 1/3); - } - - x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); - - z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); - - return [x, y, z]; -} - -function lab2lch(lab) { - var l = lab[0], - a = lab[1], - b = lab[2], - hr, h, c; - - hr = Math.atan2(b, a); - h = hr * 360 / 2 / Math.PI; - if (h < 0) { - h += 360; - } - c = Math.sqrt(a * a + b * b); - return [l, c, h]; -} - -function lab2rgb(args) { - return xyz2rgb(lab2xyz(args)); -} - -function lch2lab(lch) { - var l = lch[0], - c = lch[1], - h = lch[2], - a, b, hr; - - hr = h / 360 * 2 * Math.PI; - a = c * Math.cos(hr); - b = c * Math.sin(hr); - return [l, a, b]; -} - -function lch2xyz(args) { - return lab2xyz(lch2lab(args)); -} - -function lch2rgb(args) { - return lab2rgb(lch2lab(args)); -} - -function keyword2rgb(keyword) { - return cssKeywords[keyword]; -} - -function keyword2hsl(args) { - return rgb2hsl(keyword2rgb(args)); -} - -function keyword2hsv(args) { - return rgb2hsv(keyword2rgb(args)); -} - -function keyword2hwb(args) { - return rgb2hwb(keyword2rgb(args)); -} - -function keyword2cmyk(args) { - return rgb2cmyk(keyword2rgb(args)); -} - -function keyword2lab(args) { - return rgb2lab(keyword2rgb(args)); -} - -function keyword2xyz(args) { - return rgb2xyz(keyword2rgb(args)); -} - -var cssKeywords = { - aliceblue: [240,248,255], - antiquewhite: [250,235,215], - aqua: [0,255,255], - aquamarine: [127,255,212], - azure: [240,255,255], - beige: [245,245,220], - bisque: [255,228,196], - black: [0,0,0], - blanchedalmond: [255,235,205], - blue: [0,0,255], - blueviolet: [138,43,226], - brown: [165,42,42], - burlywood: [222,184,135], - cadetblue: [95,158,160], - chartreuse: [127,255,0], - chocolate: [210,105,30], - coral: [255,127,80], - cornflowerblue: [100,149,237], - cornsilk: [255,248,220], - crimson: [220,20,60], - cyan: [0,255,255], - darkblue: [0,0,139], - darkcyan: [0,139,139], - darkgoldenrod: [184,134,11], - darkgray: [169,169,169], - darkgreen: [0,100,0], - darkgrey: [169,169,169], - darkkhaki: [189,183,107], - darkmagenta: [139,0,139], - darkolivegreen: [85,107,47], - darkorange: [255,140,0], - darkorchid: [153,50,204], - darkred: [139,0,0], - darksalmon: [233,150,122], - darkseagreen: [143,188,143], - darkslateblue: [72,61,139], - darkslategray: [47,79,79], - darkslategrey: [47,79,79], - darkturquoise: [0,206,209], - darkviolet: [148,0,211], - deeppink: [255,20,147], - deepskyblue: [0,191,255], - dimgray: [105,105,105], - dimgrey: [105,105,105], - dodgerblue: [30,144,255], - firebrick: [178,34,34], - floralwhite: [255,250,240], - forestgreen: [34,139,34], - fuchsia: [255,0,255], - gainsboro: [220,220,220], - ghostwhite: [248,248,255], - gold: [255,215,0], - goldenrod: [218,165,32], - gray: [128,128,128], - green: [0,128,0], - greenyellow: [173,255,47], - grey: [128,128,128], - honeydew: [240,255,240], - hotpink: [255,105,180], - indianred: [205,92,92], - indigo: [75,0,130], - ivory: [255,255,240], - khaki: [240,230,140], - lavender: [230,230,250], - lavenderblush: [255,240,245], - lawngreen: [124,252,0], - lemonchiffon: [255,250,205], - lightblue: [173,216,230], - lightcoral: [240,128,128], - lightcyan: [224,255,255], - lightgoldenrodyellow: [250,250,210], - lightgray: [211,211,211], - lightgreen: [144,238,144], - lightgrey: [211,211,211], - lightpink: [255,182,193], - lightsalmon: [255,160,122], - lightseagreen: [32,178,170], - lightskyblue: [135,206,250], - lightslategray: [119,136,153], - lightslategrey: [119,136,153], - lightsteelblue: [176,196,222], - lightyellow: [255,255,224], - lime: [0,255,0], - limegreen: [50,205,50], - linen: [250,240,230], - magenta: [255,0,255], - maroon: [128,0,0], - mediumaquamarine: [102,205,170], - mediumblue: [0,0,205], - mediumorchid: [186,85,211], - mediumpurple: [147,112,219], - mediumseagreen: [60,179,113], - mediumslateblue: [123,104,238], - mediumspringgreen: [0,250,154], - mediumturquoise: [72,209,204], - mediumvioletred: [199,21,133], - midnightblue: [25,25,112], - mintcream: [245,255,250], - mistyrose: [255,228,225], - moccasin: [255,228,181], - navajowhite: [255,222,173], - navy: [0,0,128], - oldlace: [253,245,230], - olive: [128,128,0], - olivedrab: [107,142,35], - orange: [255,165,0], - orangered: [255,69,0], - orchid: [218,112,214], - palegoldenrod: [238,232,170], - palegreen: [152,251,152], - paleturquoise: [175,238,238], - palevioletred: [219,112,147], - papayawhip: [255,239,213], - peachpuff: [255,218,185], - peru: [205,133,63], - pink: [255,192,203], - plum: [221,160,221], - powderblue: [176,224,230], - purple: [128,0,128], - rebeccapurple: [102, 51, 153], - red: [255,0,0], - rosybrown: [188,143,143], - royalblue: [65,105,225], - saddlebrown: [139,69,19], - salmon: [250,128,114], - sandybrown: [244,164,96], - seagreen: [46,139,87], - seashell: [255,245,238], - sienna: [160,82,45], - silver: [192,192,192], - skyblue: [135,206,235], - slateblue: [106,90,205], - slategray: [112,128,144], - slategrey: [112,128,144], - snow: [255,250,250], - springgreen: [0,255,127], - steelblue: [70,130,180], - tan: [210,180,140], - teal: [0,128,128], - thistle: [216,191,216], - tomato: [255,99,71], - turquoise: [64,224,208], - violet: [238,130,238], - wheat: [245,222,179], - white: [255,255,255], - whitesmoke: [245,245,245], - yellow: [255,255,0], - yellowgreen: [154,205,50] -}; - -var reverseKeywords = {}; -for (var key in cssKeywords) { - reverseKeywords[JSON.stringify(cssKeywords[key])] = key; -} - -var convert = function() { - return new Converter(); -}; - -for (var func in conversions) { - // export Raw versions - convert[func + "Raw"] = (function(func) { - // accept array or plain args - return function(arg) { - if (typeof arg == "number") - arg = Array.prototype.slice.call(arguments); - return conversions[func](arg); - } - })(func); - - var pair = /(\w+)2(\w+)/.exec(func), - from = pair[1], - to = pair[2]; - - // export rgb2hsl and ["rgb"]["hsl"] - convert[from] = convert[from] || {}; - - convert[from][to] = convert[func] = (function(func) { - return function(arg) { - if (typeof arg == "number") - arg = Array.prototype.slice.call(arguments); - - var val = conversions[func](arg); - if (typeof val == "string" || val === undefined) - return val; // keyword - - for (var i = 0; i < val.length; i++) - val[i] = Math.round(val[i]); - return val; - } - })(func); -} - - -/* Converter does lazy conversion and caching */ -var Converter = function() { - this.convs = {}; -}; - -/* Either get the values for a space or - set the values for a space, depending on args */ -Converter.prototype.routeSpace = function(space, args) { - var values = args[0]; - if (values === undefined) { - // color.rgb() - return this.getValues(space); - } - // color.rgb(10, 10, 10) - if (typeof values == "number") { - values = Array.prototype.slice.call(args); - } - - return this.setValues(space, values); -}; - -/* Set the values for a space, invalidating cache */ -Converter.prototype.setValues = function(space, values) { - this.space = space; - this.convs = {}; - this.convs[space] = values; - return this; -}; - -/* Get the values for a space. If there's already - a conversion for the space, fetch it, otherwise - compute it */ -Converter.prototype.getValues = function(space) { - var vals = this.convs[space]; - if (!vals) { - var fspace = this.space, - from = this.convs[fspace]; - vals = convert[fspace][space](from); - - this.convs[space] = vals; - } - return vals; -}; - -["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { - Converter.prototype[space] = function(vals) { - return this.routeSpace(space, arguments); - }; -}); - -var colorConvert = convert; - -var colorName = { - "aliceblue": [240, 248, 255], - "antiquewhite": [250, 235, 215], - "aqua": [0, 255, 255], - "aquamarine": [127, 255, 212], - "azure": [240, 255, 255], - "beige": [245, 245, 220], - "bisque": [255, 228, 196], - "black": [0, 0, 0], - "blanchedalmond": [255, 235, 205], - "blue": [0, 0, 255], - "blueviolet": [138, 43, 226], - "brown": [165, 42, 42], - "burlywood": [222, 184, 135], - "cadetblue": [95, 158, 160], - "chartreuse": [127, 255, 0], - "chocolate": [210, 105, 30], - "coral": [255, 127, 80], - "cornflowerblue": [100, 149, 237], - "cornsilk": [255, 248, 220], - "crimson": [220, 20, 60], - "cyan": [0, 255, 255], - "darkblue": [0, 0, 139], - "darkcyan": [0, 139, 139], - "darkgoldenrod": [184, 134, 11], - "darkgray": [169, 169, 169], - "darkgreen": [0, 100, 0], - "darkgrey": [169, 169, 169], - "darkkhaki": [189, 183, 107], - "darkmagenta": [139, 0, 139], - "darkolivegreen": [85, 107, 47], - "darkorange": [255, 140, 0], - "darkorchid": [153, 50, 204], - "darkred": [139, 0, 0], - "darksalmon": [233, 150, 122], - "darkseagreen": [143, 188, 143], - "darkslateblue": [72, 61, 139], - "darkslategray": [47, 79, 79], - "darkslategrey": [47, 79, 79], - "darkturquoise": [0, 206, 209], - "darkviolet": [148, 0, 211], - "deeppink": [255, 20, 147], - "deepskyblue": [0, 191, 255], - "dimgray": [105, 105, 105], - "dimgrey": [105, 105, 105], - "dodgerblue": [30, 144, 255], - "firebrick": [178, 34, 34], - "floralwhite": [255, 250, 240], - "forestgreen": [34, 139, 34], - "fuchsia": [255, 0, 255], - "gainsboro": [220, 220, 220], - "ghostwhite": [248, 248, 255], - "gold": [255, 215, 0], - "goldenrod": [218, 165, 32], - "gray": [128, 128, 128], - "green": [0, 128, 0], - "greenyellow": [173, 255, 47], - "grey": [128, 128, 128], - "honeydew": [240, 255, 240], - "hotpink": [255, 105, 180], - "indianred": [205, 92, 92], - "indigo": [75, 0, 130], - "ivory": [255, 255, 240], - "khaki": [240, 230, 140], - "lavender": [230, 230, 250], - "lavenderblush": [255, 240, 245], - "lawngreen": [124, 252, 0], - "lemonchiffon": [255, 250, 205], - "lightblue": [173, 216, 230], - "lightcoral": [240, 128, 128], - "lightcyan": [224, 255, 255], - "lightgoldenrodyellow": [250, 250, 210], - "lightgray": [211, 211, 211], - "lightgreen": [144, 238, 144], - "lightgrey": [211, 211, 211], - "lightpink": [255, 182, 193], - "lightsalmon": [255, 160, 122], - "lightseagreen": [32, 178, 170], - "lightskyblue": [135, 206, 250], - "lightslategray": [119, 136, 153], - "lightslategrey": [119, 136, 153], - "lightsteelblue": [176, 196, 222], - "lightyellow": [255, 255, 224], - "lime": [0, 255, 0], - "limegreen": [50, 205, 50], - "linen": [250, 240, 230], - "magenta": [255, 0, 255], - "maroon": [128, 0, 0], - "mediumaquamarine": [102, 205, 170], - "mediumblue": [0, 0, 205], - "mediumorchid": [186, 85, 211], - "mediumpurple": [147, 112, 219], - "mediumseagreen": [60, 179, 113], - "mediumslateblue": [123, 104, 238], - "mediumspringgreen": [0, 250, 154], - "mediumturquoise": [72, 209, 204], - "mediumvioletred": [199, 21, 133], - "midnightblue": [25, 25, 112], - "mintcream": [245, 255, 250], - "mistyrose": [255, 228, 225], - "moccasin": [255, 228, 181], - "navajowhite": [255, 222, 173], - "navy": [0, 0, 128], - "oldlace": [253, 245, 230], - "olive": [128, 128, 0], - "olivedrab": [107, 142, 35], - "orange": [255, 165, 0], - "orangered": [255, 69, 0], - "orchid": [218, 112, 214], - "palegoldenrod": [238, 232, 170], - "palegreen": [152, 251, 152], - "paleturquoise": [175, 238, 238], - "palevioletred": [219, 112, 147], - "papayawhip": [255, 239, 213], - "peachpuff": [255, 218, 185], - "peru": [205, 133, 63], - "pink": [255, 192, 203], - "plum": [221, 160, 221], - "powderblue": [176, 224, 230], - "purple": [128, 0, 128], - "rebeccapurple": [102, 51, 153], - "red": [255, 0, 0], - "rosybrown": [188, 143, 143], - "royalblue": [65, 105, 225], - "saddlebrown": [139, 69, 19], - "salmon": [250, 128, 114], - "sandybrown": [244, 164, 96], - "seagreen": [46, 139, 87], - "seashell": [255, 245, 238], - "sienna": [160, 82, 45], - "silver": [192, 192, 192], - "skyblue": [135, 206, 235], - "slateblue": [106, 90, 205], - "slategray": [112, 128, 144], - "slategrey": [112, 128, 144], - "snow": [255, 250, 250], - "springgreen": [0, 255, 127], - "steelblue": [70, 130, 180], - "tan": [210, 180, 140], - "teal": [0, 128, 128], - "thistle": [216, 191, 216], - "tomato": [255, 99, 71], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "wheat": [245, 222, 179], - "white": [255, 255, 255], - "whitesmoke": [245, 245, 245], - "yellow": [255, 255, 0], - "yellowgreen": [154, 205, 50] -}; - -/* MIT license */ - - -var colorString = { - getRgba: getRgba, - getHsla: getHsla, - getRgb: getRgb, - getHsl: getHsl, - getHwb: getHwb, - getAlpha: getAlpha, - - hexString: hexString, - rgbString: rgbString, - rgbaString: rgbaString, - percentString: percentString, - percentaString: percentaString, - hslString: hslString, - hslaString: hslaString, - hwbString: hwbString, - keyword: keyword -}; - -function getRgba(string) { - if (!string) { - return; - } - var abbr = /^#([a-fA-F0-9]{3,4})$/i, - hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i, - rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, - per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, - keyword = /(\w+)/; - - var rgb = [0, 0, 0], - a = 1, - match = string.match(abbr), - hexAlpha = ""; - if (match) { - match = match[1]; - hexAlpha = match[3]; - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match[i] + match[i], 16); - } - if (hexAlpha) { - a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100; - } - } - else if (match = string.match(hex)) { - hexAlpha = match[2]; - match = match[1]; - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); - } - if (hexAlpha) { - a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100; - } - } - else if (match = string.match(rgba)) { - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match[i + 1]); - } - a = parseFloat(match[4]); - } - else if (match = string.match(per)) { - for (var i = 0; i < rgb.length; i++) { - rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); - } - a = parseFloat(match[4]); - } - else if (match = string.match(keyword)) { - if (match[1] == "transparent") { - return [0, 0, 0, 0]; - } - rgb = colorName[match[1]]; - if (!rgb) { - return; - } - } - - for (var i = 0; i < rgb.length; i++) { - rgb[i] = scale(rgb[i], 0, 255); - } - if (!a && a != 0) { - a = 1; - } - else { - a = scale(a, 0, 1); - } - rgb[3] = a; - return rgb; -} - -function getHsla(string) { - if (!string) { - return; - } - var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; - var match = string.match(hsl); - if (match) { - var alpha = parseFloat(match[4]); - var h = scale(parseInt(match[1]), 0, 360), - s = scale(parseFloat(match[2]), 0, 100), - l = scale(parseFloat(match[3]), 0, 100), - a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); - return [h, s, l, a]; - } -} - -function getHwb(string) { - if (!string) { - return; - } - var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; - var match = string.match(hwb); - if (match) { - var alpha = parseFloat(match[4]); - var h = scale(parseInt(match[1]), 0, 360), - w = scale(parseFloat(match[2]), 0, 100), - b = scale(parseFloat(match[3]), 0, 100), - a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); - return [h, w, b, a]; - } -} - -function getRgb(string) { - var rgba = getRgba(string); - return rgba && rgba.slice(0, 3); -} - -function getHsl(string) { - var hsla = getHsla(string); - return hsla && hsla.slice(0, 3); -} - -function getAlpha(string) { - var vals = getRgba(string); - if (vals) { - return vals[3]; - } - else if (vals = getHsla(string)) { - return vals[3]; - } - else if (vals = getHwb(string)) { - return vals[3]; - } -} - -// generators -function hexString(rgba, a) { - var a = (a !== undefined && rgba.length === 3) ? a : rgba[3]; - return "#" + hexDouble(rgba[0]) - + hexDouble(rgba[1]) - + hexDouble(rgba[2]) - + ( - (a >= 0 && a < 1) - ? hexDouble(Math.round(a * 255)) - : "" - ); -} - -function rgbString(rgba, alpha) { - if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { - return rgbaString(rgba, alpha); - } - return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; -} - -function rgbaString(rgba, alpha) { - if (alpha === undefined) { - alpha = (rgba[3] !== undefined ? rgba[3] : 1); - } - return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] - + ", " + alpha + ")"; -} - -function percentString(rgba, alpha) { - if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { - return percentaString(rgba, alpha); - } - var r = Math.round(rgba[0]/255 * 100), - g = Math.round(rgba[1]/255 * 100), - b = Math.round(rgba[2]/255 * 100); - - return "rgb(" + r + "%, " + g + "%, " + b + "%)"; -} - -function percentaString(rgba, alpha) { - var r = Math.round(rgba[0]/255 * 100), - g = Math.round(rgba[1]/255 * 100), - b = Math.round(rgba[2]/255 * 100); - return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; -} - -function hslString(hsla, alpha) { - if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { - return hslaString(hsla, alpha); - } - return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; -} - -function hslaString(hsla, alpha) { - if (alpha === undefined) { - alpha = (hsla[3] !== undefined ? hsla[3] : 1); - } - return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " - + alpha + ")"; -} - -// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax -// (hwb have alpha optional & 1 is default value) -function hwbString(hwb, alpha) { - if (alpha === undefined) { - alpha = (hwb[3] !== undefined ? hwb[3] : 1); - } - return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" - + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; -} - -function keyword(rgb) { - return reverseNames[rgb.slice(0, 3)]; -} - -// helpers -function scale(num, min, max) { - return Math.min(Math.max(min, num), max); -} - -function hexDouble(num) { - var str = num.toString(16).toUpperCase(); - return (str.length < 2) ? "0" + str : str; -} - - -//create a list of reverse color names -var reverseNames = {}; -for (var name in colorName) { - reverseNames[colorName[name]] = name; -} - -/* MIT license */ - - - -var Color = function (obj) { - if (obj instanceof Color) { - return obj; - } - if (!(this instanceof Color)) { - return new Color(obj); - } - - this.valid = false; - this.values = { - rgb: [0, 0, 0], - hsl: [0, 0, 0], - hsv: [0, 0, 0], - hwb: [0, 0, 0], - cmyk: [0, 0, 0, 0], - alpha: 1 - }; - - // parse Color() argument - var vals; - if (typeof obj === 'string') { - vals = colorString.getRgba(obj); - if (vals) { - this.setValues('rgb', vals); - } else if (vals = colorString.getHsla(obj)) { - this.setValues('hsl', vals); - } else if (vals = colorString.getHwb(obj)) { - this.setValues('hwb', vals); - } - } else if (typeof obj === 'object') { - vals = obj; - if (vals.r !== undefined || vals.red !== undefined) { - this.setValues('rgb', vals); - } else if (vals.l !== undefined || vals.lightness !== undefined) { - this.setValues('hsl', vals); - } else if (vals.v !== undefined || vals.value !== undefined) { - this.setValues('hsv', vals); - } else if (vals.w !== undefined || vals.whiteness !== undefined) { - this.setValues('hwb', vals); - } else if (vals.c !== undefined || vals.cyan !== undefined) { - this.setValues('cmyk', vals); - } - } -}; - -Color.prototype = { - isValid: function () { - return this.valid; - }, - rgb: function () { - return this.setSpace('rgb', arguments); - }, - hsl: function () { - return this.setSpace('hsl', arguments); - }, - hsv: function () { - return this.setSpace('hsv', arguments); - }, - hwb: function () { - return this.setSpace('hwb', arguments); - }, - cmyk: function () { - return this.setSpace('cmyk', arguments); - }, - - rgbArray: function () { - return this.values.rgb; - }, - hslArray: function () { - return this.values.hsl; - }, - hsvArray: function () { - return this.values.hsv; - }, - hwbArray: function () { - var values = this.values; - if (values.alpha !== 1) { - return values.hwb.concat([values.alpha]); - } - return values.hwb; - }, - cmykArray: function () { - return this.values.cmyk; - }, - rgbaArray: function () { - var values = this.values; - return values.rgb.concat([values.alpha]); - }, - hslaArray: function () { - var values = this.values; - return values.hsl.concat([values.alpha]); - }, - alpha: function (val) { - if (val === undefined) { - return this.values.alpha; - } - this.setValues('alpha', val); - return this; - }, - - red: function (val) { - return this.setChannel('rgb', 0, val); - }, - green: function (val) { - return this.setChannel('rgb', 1, val); - }, - blue: function (val) { - return this.setChannel('rgb', 2, val); - }, - hue: function (val) { - if (val) { - val %= 360; - val = val < 0 ? 360 + val : val; - } - return this.setChannel('hsl', 0, val); - }, - saturation: function (val) { - return this.setChannel('hsl', 1, val); - }, - lightness: function (val) { - return this.setChannel('hsl', 2, val); - }, - saturationv: function (val) { - return this.setChannel('hsv', 1, val); - }, - whiteness: function (val) { - return this.setChannel('hwb', 1, val); - }, - blackness: function (val) { - return this.setChannel('hwb', 2, val); - }, - value: function (val) { - return this.setChannel('hsv', 2, val); - }, - cyan: function (val) { - return this.setChannel('cmyk', 0, val); - }, - magenta: function (val) { - return this.setChannel('cmyk', 1, val); - }, - yellow: function (val) { - return this.setChannel('cmyk', 2, val); - }, - black: function (val) { - return this.setChannel('cmyk', 3, val); - }, - - hexString: function () { - return colorString.hexString(this.values.rgb); - }, - rgbString: function () { - return colorString.rgbString(this.values.rgb, this.values.alpha); - }, - rgbaString: function () { - return colorString.rgbaString(this.values.rgb, this.values.alpha); - }, - percentString: function () { - return colorString.percentString(this.values.rgb, this.values.alpha); - }, - hslString: function () { - return colorString.hslString(this.values.hsl, this.values.alpha); - }, - hslaString: function () { - return colorString.hslaString(this.values.hsl, this.values.alpha); - }, - hwbString: function () { - return colorString.hwbString(this.values.hwb, this.values.alpha); - }, - keyword: function () { - return colorString.keyword(this.values.rgb, this.values.alpha); - }, - - rgbNumber: function () { - var rgb = this.values.rgb; - return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; - }, - - luminosity: function () { - // http://www.w3.org/TR/WCAG20/#relativeluminancedef - var rgb = this.values.rgb; - var lum = []; - for (var i = 0; i < rgb.length; i++) { - var chan = rgb[i] / 255; - lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); - } - return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; - }, - - contrast: function (color2) { - // http://www.w3.org/TR/WCAG20/#contrast-ratiodef - var lum1 = this.luminosity(); - var lum2 = color2.luminosity(); - if (lum1 > lum2) { - return (lum1 + 0.05) / (lum2 + 0.05); - } - return (lum2 + 0.05) / (lum1 + 0.05); - }, - - level: function (color2) { - var contrastRatio = this.contrast(color2); - if (contrastRatio >= 7.1) { - return 'AAA'; - } - - return (contrastRatio >= 4.5) ? 'AA' : ''; - }, - - dark: function () { - // YIQ equation from http://24ways.org/2010/calculating-color-contrast - var rgb = this.values.rgb; - var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; - return yiq < 128; - }, - - light: function () { - return !this.dark(); - }, - - negate: function () { - var rgb = []; - for (var i = 0; i < 3; i++) { - rgb[i] = 255 - this.values.rgb[i]; - } - this.setValues('rgb', rgb); - return this; - }, - - lighten: function (ratio) { - var hsl = this.values.hsl; - hsl[2] += hsl[2] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - darken: function (ratio) { - var hsl = this.values.hsl; - hsl[2] -= hsl[2] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - saturate: function (ratio) { - var hsl = this.values.hsl; - hsl[1] += hsl[1] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - desaturate: function (ratio) { - var hsl = this.values.hsl; - hsl[1] -= hsl[1] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - whiten: function (ratio) { - var hwb = this.values.hwb; - hwb[1] += hwb[1] * ratio; - this.setValues('hwb', hwb); - return this; - }, - - blacken: function (ratio) { - var hwb = this.values.hwb; - hwb[2] += hwb[2] * ratio; - this.setValues('hwb', hwb); - return this; - }, - - greyscale: function () { - var rgb = this.values.rgb; - // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale - var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; - this.setValues('rgb', [val, val, val]); - return this; - }, - - clearer: function (ratio) { - var alpha = this.values.alpha; - this.setValues('alpha', alpha - (alpha * ratio)); - return this; - }, - - opaquer: function (ratio) { - var alpha = this.values.alpha; - this.setValues('alpha', alpha + (alpha * ratio)); - return this; - }, - - rotate: function (degrees) { - var hsl = this.values.hsl; - var hue = (hsl[0] + degrees) % 360; - hsl[0] = hue < 0 ? 360 + hue : hue; - this.setValues('hsl', hsl); - return this; - }, - - /** - * Ported from sass implementation in C - * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 - */ - mix: function (mixinColor, weight) { - var color1 = this; - var color2 = mixinColor; - var p = weight === undefined ? 0.5 : weight; - - var w = 2 * p - 1; - var a = color1.alpha() - color2.alpha(); - - var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; - var w2 = 1 - w1; - - return this - .rgb( - w1 * color1.red() + w2 * color2.red(), - w1 * color1.green() + w2 * color2.green(), - w1 * color1.blue() + w2 * color2.blue() - ) - .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); - }, - - toJSON: function () { - return this.rgb(); - }, - - clone: function () { - // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, - // making the final build way to big to embed in Chart.js. So let's do it manually, - // assuming that values to clone are 1 dimension arrays containing only numbers, - // except 'alpha' which is a number. - var result = new Color(); - var source = this.values; - var target = result.values; - var value, type; - - for (var prop in source) { - if (source.hasOwnProperty(prop)) { - value = source[prop]; - type = ({}).toString.call(value); - if (type === '[object Array]') { - target[prop] = value.slice(0); - } else if (type === '[object Number]') { - target[prop] = value; - } else { - console.error('unexpected color value:', value); - } - } - } - - return result; - } -}; - -Color.prototype.spaces = { - rgb: ['red', 'green', 'blue'], - hsl: ['hue', 'saturation', 'lightness'], - hsv: ['hue', 'saturation', 'value'], - hwb: ['hue', 'whiteness', 'blackness'], - cmyk: ['cyan', 'magenta', 'yellow', 'black'] -}; - -Color.prototype.maxes = { - rgb: [255, 255, 255], - hsl: [360, 100, 100], - hsv: [360, 100, 100], - hwb: [360, 100, 100], - cmyk: [100, 100, 100, 100] -}; - -Color.prototype.getValues = function (space) { - var values = this.values; - var vals = {}; - - for (var i = 0; i < space.length; i++) { - vals[space.charAt(i)] = values[space][i]; - } - - if (values.alpha !== 1) { - vals.a = values.alpha; - } - - // {r: 255, g: 255, b: 255, a: 0.4} - return vals; -}; - -Color.prototype.setValues = function (space, vals) { - var values = this.values; - var spaces = this.spaces; - var maxes = this.maxes; - var alpha = 1; - var i; - - this.valid = true; - - if (space === 'alpha') { - alpha = vals; - } else if (vals.length) { - // [10, 10, 10] - values[space] = vals.slice(0, space.length); - alpha = vals[space.length]; - } else if (vals[space.charAt(0)] !== undefined) { - // {r: 10, g: 10, b: 10} - for (i = 0; i < space.length; i++) { - values[space][i] = vals[space.charAt(i)]; - } - - alpha = vals.a; - } else if (vals[spaces[space][0]] !== undefined) { - // {red: 10, green: 10, blue: 10} - var chans = spaces[space]; - - for (i = 0; i < space.length; i++) { - values[space][i] = vals[chans[i]]; - } - - alpha = vals.alpha; - } - - values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); - - if (space === 'alpha') { - return false; - } - - var capped; - - // cap values of the space prior converting all values - for (i = 0; i < space.length; i++) { - capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); - values[space][i] = Math.round(capped); - } - - // convert to all the other color spaces - for (var sname in spaces) { - if (sname !== space) { - values[sname] = colorConvert[space][sname](values[space]); - } - } - - return true; -}; - -Color.prototype.setSpace = function (space, args) { - var vals = args[0]; - - if (vals === undefined) { - // color.rgb() - return this.getValues(space); - } - - // color.rgb(10, 10, 10) - if (typeof vals === 'number') { - vals = Array.prototype.slice.call(args); - } - - this.setValues(space, vals); - return this; -}; - -Color.prototype.setChannel = function (space, index, val) { - var svalues = this.values[space]; - if (val === undefined) { - // color.red() - return svalues[index]; - } else if (val === svalues[index]) { - // color.red(color.red()) - return this; - } - - // color.red(100) - svalues[index] = val; - this.setValues(space, svalues); - - return this; -}; - -if (typeof window !== 'undefined') { - window.Color = Color; -} - -var chartjsColor = Color; - -/** - * @namespace Chart.helpers - */ -var helpers = { - /** - * An empty function that can be used, for example, for optional callback. - */ - noop: function() {}, - - /** - * Returns a unique id, sequentially generated from a global variable. - * @returns {number} - * @function - */ - uid: (function() { - var id = 0; - return function() { - return id++; - }; - }()), - - /** - * Returns true if `value` is neither null nor undefined, else returns false. - * @param {*} value - The value to test. - * @returns {boolean} - * @since 2.7.0 - */ - isNullOrUndef: function(value) { - return value === null || typeof value === 'undefined'; - }, - - /** - * Returns true if `value` is an array (including typed arrays), else returns false. - * @param {*} value - The value to test. - * @returns {boolean} - * @function - */ - isArray: function(value) { - if (Array.isArray && Array.isArray(value)) { - return true; - } - var type = Object.prototype.toString.call(value); - if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { - return true; - } - return false; - }, - - /** - * Returns true if `value` is an object (excluding null), else returns false. - * @param {*} value - The value to test. - * @returns {boolean} - * @since 2.7.0 - */ - isObject: function(value) { - return value !== null && Object.prototype.toString.call(value) === '[object Object]'; - }, - - /** - * Returns true if `value` is a finite number, else returns false - * @param {*} value - The value to test. - * @returns {boolean} - */ - isFinite: function(value) { - return (typeof value === 'number' || value instanceof Number) && isFinite(value); - }, - - /** - * Returns `value` if defined, else returns `defaultValue`. - * @param {*} value - The value to return if defined. - * @param {*} defaultValue - The value to return if `value` is undefined. - * @returns {*} - */ - valueOrDefault: function(value, defaultValue) { - return typeof value === 'undefined' ? defaultValue : value; - }, - - /** - * Returns value at the given `index` in array if defined, else returns `defaultValue`. - * @param {Array} value - The array to lookup for value at `index`. - * @param {number} index - The index in `value` to lookup for value. - * @param {*} defaultValue - The value to return if `value[index]` is undefined. - * @returns {*} - */ - valueAtIndexOrDefault: function(value, index, defaultValue) { - return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); - }, - - /** - * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the - * value returned by `fn`. If `fn` is not a function, this method returns undefined. - * @param {function} fn - The function to call. - * @param {Array|undefined|null} args - The arguments with which `fn` should be called. - * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. - * @returns {*} - */ - callback: function(fn, args, thisArg) { - if (fn && typeof fn.call === 'function') { - return fn.apply(thisArg, args); - } - }, - - /** - * Note(SB) for performance sake, this method should only be used when loopable type - * is unknown or in none intensive code (not called often and small loopable). Else - * it's preferable to use a regular for() loop and save extra function calls. - * @param {object|Array} loopable - The object or array to be iterated. - * @param {function} fn - The function to call for each item. - * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. - * @param {boolean} [reverse] - If true, iterates backward on the loopable. - */ - each: function(loopable, fn, thisArg, reverse) { - var i, len, keys; - if (helpers.isArray(loopable)) { - len = loopable.length; - if (reverse) { - for (i = len - 1; i >= 0; i--) { - fn.call(thisArg, loopable[i], i); - } - } else { - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[i], i); - } - } - } else if (helpers.isObject(loopable)) { - keys = Object.keys(loopable); - len = keys.length; - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[keys[i]], keys[i]); - } - } - }, - - /** - * Returns true if the `a0` and `a1` arrays have the same content, else returns false. - * @see https://stackoverflow.com/a/14853974 - * @param {Array} a0 - The array to compare - * @param {Array} a1 - The array to compare - * @returns {boolean} - */ - arrayEquals: function(a0, a1) { - var i, ilen, v0, v1; - - if (!a0 || !a1 || a0.length !== a1.length) { - return false; - } - - for (i = 0, ilen = a0.length; i < ilen; ++i) { - v0 = a0[i]; - v1 = a1[i]; - - if (v0 instanceof Array && v1 instanceof Array) { - if (!helpers.arrayEquals(v0, v1)) { - return false; - } - } else if (v0 !== v1) { - // NOTE: two different object instances will never be equal: {x:20} != {x:20} - return false; - } - } - - return true; - }, - - /** - * Returns a deep copy of `source` without keeping references on objects and arrays. - * @param {*} source - The value to clone. - * @returns {*} - */ - clone: function(source) { - if (helpers.isArray(source)) { - return source.map(helpers.clone); - } - - if (helpers.isObject(source)) { - var target = {}; - var keys = Object.keys(source); - var klen = keys.length; - var k = 0; - - for (; k < klen; ++k) { - target[keys[k]] = helpers.clone(source[keys[k]]); - } - - return target; - } - - return source; - }, - - /** - * The default merger when Chart.helpers.merge is called without merger option. - * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. - * @private - */ - _merger: function(key, target, source, options) { - var tval = target[key]; - var sval = source[key]; - - if (helpers.isObject(tval) && helpers.isObject(sval)) { - helpers.merge(tval, sval, options); - } else { - target[key] = helpers.clone(sval); - } - }, - - /** - * Merges source[key] in target[key] only if target[key] is undefined. - * @private - */ - _mergerIf: function(key, target, source) { - var tval = target[key]; - var sval = source[key]; - - if (helpers.isObject(tval) && helpers.isObject(sval)) { - helpers.mergeIf(tval, sval); - } else if (!target.hasOwnProperty(key)) { - target[key] = helpers.clone(sval); - } - }, - - /** - * Recursively deep copies `source` properties into `target` with the given `options`. - * IMPORTANT: `target` is not cloned and will be updated with `source` properties. - * @param {object} target - The target object in which all sources are merged into. - * @param {object|object[]} source - Object(s) to merge into `target`. - * @param {object} [options] - Merging options: - * @param {function} [options.merger] - The merge method (key, target, source, options) - * @returns {object} The `target` object. - */ - merge: function(target, source, options) { - var sources = helpers.isArray(source) ? source : [source]; - var ilen = sources.length; - var merge, i, keys, klen, k; - - if (!helpers.isObject(target)) { - return target; - } - - options = options || {}; - merge = options.merger || helpers._merger; - - for (i = 0; i < ilen; ++i) { - source = sources[i]; - if (!helpers.isObject(source)) { - continue; - } - - keys = Object.keys(source); - for (k = 0, klen = keys.length; k < klen; ++k) { - merge(keys[k], target, source, options); - } - } - - return target; - }, - - /** - * Recursively deep copies `source` properties into `target` *only* if not defined in target. - * IMPORTANT: `target` is not cloned and will be updated with `source` properties. - * @param {object} target - The target object in which all sources are merged into. - * @param {object|object[]} source - Object(s) to merge into `target`. - * @returns {object} The `target` object. - */ - mergeIf: function(target, source) { - return helpers.merge(target, source, {merger: helpers._mergerIf}); - }, - - /** - * Applies the contents of two or more objects together into the first object. - * @param {object} target - The target object in which all objects are merged into. - * @param {object} arg1 - Object containing additional properties to merge in target. - * @param {object} argN - Additional objects containing properties to merge in target. - * @returns {object} The `target` object. - */ - extend: function(target) { - var setFn = function(value, key) { - target[key] = value; - }; - for (var i = 1, ilen = arguments.length; i < ilen; ++i) { - helpers.each(arguments[i], setFn); - } - return target; - }, - - /** - * Basic javascript inheritance based on the model created in Backbone.js - */ - inherits: function(extensions) { - var me = this; - var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { - return me.apply(this, arguments); - }; - - var Surrogate = function() { - this.constructor = ChartElement; - }; - - Surrogate.prototype = me.prototype; - ChartElement.prototype = new Surrogate(); - ChartElement.extend = helpers.inherits; - - if (extensions) { - helpers.extend(ChartElement.prototype, extensions); - } - - ChartElement.__super__ = me.prototype; - return ChartElement; - } -}; - -var helpers_core = helpers; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.helpers.callback instead. - * @function Chart.helpers.callCallback - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ -helpers.callCallback = helpers.callback; - -/** - * Provided for backward compatibility, use Array.prototype.indexOf instead. - * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ - * @function Chart.helpers.indexOf - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers.indexOf = function(array, item, fromIndex) { - return Array.prototype.indexOf.call(array, item, fromIndex); -}; - -/** - * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. - * @function Chart.helpers.getValueOrDefault - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers.getValueOrDefault = helpers.valueOrDefault; - -/** - * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. - * @function Chart.helpers.getValueAtIndexOrDefault - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; - -/** - * Easing functions adapted from Robert Penner's easing equations. - * @namespace Chart.helpers.easingEffects - * @see http://www.robertpenner.com/easing/ - */ -var effects = { - linear: function(t) { - return t; - }, - - easeInQuad: function(t) { - return t * t; - }, - - easeOutQuad: function(t) { - return -t * (t - 2); - }, - - easeInOutQuad: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t; - } - return -0.5 * ((--t) * (t - 2) - 1); - }, - - easeInCubic: function(t) { - return t * t * t; - }, - - easeOutCubic: function(t) { - return (t = t - 1) * t * t + 1; - }, - - easeInOutCubic: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t; - } - return 0.5 * ((t -= 2) * t * t + 2); - }, - - easeInQuart: function(t) { - return t * t * t * t; - }, - - easeOutQuart: function(t) { - return -((t = t - 1) * t * t * t - 1); - }, - - easeInOutQuart: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t * t; - } - return -0.5 * ((t -= 2) * t * t * t - 2); - }, - - easeInQuint: function(t) { - return t * t * t * t * t; - }, - - easeOutQuint: function(t) { - return (t = t - 1) * t * t * t * t + 1; - }, - - easeInOutQuint: function(t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t * t * t; - } - return 0.5 * ((t -= 2) * t * t * t * t + 2); - }, - - easeInSine: function(t) { - return -Math.cos(t * (Math.PI / 2)) + 1; - }, - - easeOutSine: function(t) { - return Math.sin(t * (Math.PI / 2)); - }, - - easeInOutSine: function(t) { - return -0.5 * (Math.cos(Math.PI * t) - 1); - }, - - easeInExpo: function(t) { - return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); - }, - - easeOutExpo: function(t) { - return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; - }, - - easeInOutExpo: function(t) { - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if ((t /= 0.5) < 1) { - return 0.5 * Math.pow(2, 10 * (t - 1)); - } - return 0.5 * (-Math.pow(2, -10 * --t) + 2); - }, - - easeInCirc: function(t) { - if (t >= 1) { - return t; - } - return -(Math.sqrt(1 - t * t) - 1); - }, - - easeOutCirc: function(t) { - return Math.sqrt(1 - (t = t - 1) * t); - }, - - easeInOutCirc: function(t) { - if ((t /= 0.5) < 1) { - return -0.5 * (Math.sqrt(1 - t * t) - 1); - } - return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); - }, - - easeInElastic: function(t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if (!p) { - p = 0.3; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); - }, - - easeOutElastic: function(t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if (!p) { - p = 0.3; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; - }, - - easeInOutElastic: function(t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if ((t /= 0.5) === 2) { - return 1; - } - if (!p) { - p = 0.45; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - if (t < 1) { - return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); - } - return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; - }, - easeInBack: function(t) { - var s = 1.70158; - return t * t * ((s + 1) * t - s); - }, - - easeOutBack: function(t) { - var s = 1.70158; - return (t = t - 1) * t * ((s + 1) * t + s) + 1; - }, - - easeInOutBack: function(t) { - var s = 1.70158; - if ((t /= 0.5) < 1) { - return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); - } - return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); - }, - - easeInBounce: function(t) { - return 1 - effects.easeOutBounce(1 - t); - }, - - easeOutBounce: function(t) { - if (t < (1 / 2.75)) { - return 7.5625 * t * t; - } - if (t < (2 / 2.75)) { - return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; - } - if (t < (2.5 / 2.75)) { - return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; - } - return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; - }, - - easeInOutBounce: function(t) { - if (t < 0.5) { - return effects.easeInBounce(t * 2) * 0.5; - } - return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; - } -}; - -var helpers_easing = { - effects: effects -}; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.helpers.easing.effects instead. - * @function Chart.helpers.easingEffects - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers_core.easingEffects = effects; - -var PI = Math.PI; -var RAD_PER_DEG = PI / 180; -var DOUBLE_PI = PI * 2; -var HALF_PI = PI / 2; -var QUARTER_PI = PI / 4; -var TWO_THIRDS_PI = PI * 2 / 3; - -/** - * @namespace Chart.helpers.canvas - */ -var exports$1 = { - /** - * Clears the entire canvas associated to the given `chart`. - * @param {Chart} chart - The chart for which to clear the canvas. - */ - clear: function(chart) { - chart.ctx.clearRect(0, 0, chart.width, chart.height); - }, - - /** - * Creates a "path" for a rectangle with rounded corners at position (x, y) with a - * given size (width, height) and the same `radius` for all corners. - * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. - * @param {number} x - The x axis of the coordinate for the rectangle starting point. - * @param {number} y - The y axis of the coordinate for the rectangle starting point. - * @param {number} width - The rectangle's width. - * @param {number} height - The rectangle's height. - * @param {number} radius - The rounded amount (in pixels) for the four corners. - * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? - */ - roundedRect: function(ctx, x, y, width, height, radius) { - if (radius) { - var r = Math.min(radius, height / 2, width / 2); - var left = x + r; - var top = y + r; - var right = x + width - r; - var bottom = y + height - r; - - ctx.moveTo(x, top); - if (left < right && top < bottom) { - ctx.arc(left, top, r, -PI, -HALF_PI); - ctx.arc(right, top, r, -HALF_PI, 0); - ctx.arc(right, bottom, r, 0, HALF_PI); - ctx.arc(left, bottom, r, HALF_PI, PI); - } else if (left < right) { - ctx.moveTo(left, y); - ctx.arc(right, top, r, -HALF_PI, HALF_PI); - ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); - } else if (top < bottom) { - ctx.arc(left, top, r, -PI, 0); - ctx.arc(left, bottom, r, 0, PI); - } else { - ctx.arc(left, top, r, -PI, PI); - } - ctx.closePath(); - ctx.moveTo(x, y); - } else { - ctx.rect(x, y, width, height); - } - }, - - drawPoint: function(ctx, style, radius, x, y, rotation) { - var type, xOffset, yOffset, size, cornerRadius; - var rad = (rotation || 0) * RAD_PER_DEG; - - if (style && typeof style === 'object') { - type = style.toString(); - if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { - ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); - return; - } - } - - if (isNaN(radius) || radius <= 0) { - return; - } - - ctx.beginPath(); - - switch (style) { - // Default includes circle - default: - ctx.arc(x, y, radius, 0, DOUBLE_PI); - ctx.closePath(); - break; - case 'triangle': - ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); - rad += TWO_THIRDS_PI; - ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); - rad += TWO_THIRDS_PI; - ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); - ctx.closePath(); - break; - case 'rectRounded': - // NOTE: the rounded rect implementation changed to use `arc` instead of - // `quadraticCurveTo` since it generates better results when rect is - // almost a circle. 0.516 (instead of 0.5) produces results with visually - // closer proportion to the previous impl and it is inscribed in the - // circle with `radius`. For more details, see the following PRs: - // https://github.com/chartjs/Chart.js/issues/5597 - // https://github.com/chartjs/Chart.js/issues/5858 - cornerRadius = radius * 0.516; - size = radius - cornerRadius; - xOffset = Math.cos(rad + QUARTER_PI) * size; - yOffset = Math.sin(rad + QUARTER_PI) * size; - ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); - ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); - ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); - ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); - ctx.closePath(); - break; - case 'rect': - if (!rotation) { - size = Math.SQRT1_2 * radius; - ctx.rect(x - size, y - size, 2 * size, 2 * size); - break; - } - rad += QUARTER_PI; - /* falls through */ - case 'rectRot': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + yOffset, y - xOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.lineTo(x - yOffset, y + xOffset); - ctx.closePath(); - break; - case 'crossRot': - rad += QUARTER_PI; - /* falls through */ - case 'cross': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); - break; - case 'star': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); - rad += QUARTER_PI; - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); - break; - case 'line': - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - break; - case 'dash': - ctx.moveTo(x, y); - ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); - break; - } - - ctx.fill(); - ctx.stroke(); - }, - - /** - * Returns true if the point is inside the rectangle - * @param {object} point - The point to test - * @param {object} area - The rectangle - * @returns {boolean} - * @private - */ - _isPointInArea: function(point, area) { - var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error. - - return point.x > area.left - epsilon && point.x < area.right + epsilon && - point.y > area.top - epsilon && point.y < area.bottom + epsilon; - }, - - clipArea: function(ctx, area) { - ctx.save(); - ctx.beginPath(); - ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); - ctx.clip(); - }, - - unclipArea: function(ctx) { - ctx.restore(); - }, - - lineTo: function(ctx, previous, target, flip) { - var stepped = target.steppedLine; - if (stepped) { - if (stepped === 'middle') { - var midpoint = (previous.x + target.x) / 2.0; - ctx.lineTo(midpoint, flip ? target.y : previous.y); - ctx.lineTo(midpoint, flip ? previous.y : target.y); - } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) { - ctx.lineTo(previous.x, target.y); - } else { - ctx.lineTo(target.x, previous.y); - } - ctx.lineTo(target.x, target.y); - return; - } - - if (!target.tension) { - ctx.lineTo(target.x, target.y); - return; - } - - ctx.bezierCurveTo( - flip ? previous.controlPointPreviousX : previous.controlPointNextX, - flip ? previous.controlPointPreviousY : previous.controlPointNextY, - flip ? target.controlPointNextX : target.controlPointPreviousX, - flip ? target.controlPointNextY : target.controlPointPreviousY, - target.x, - target.y); - } -}; - -var helpers_canvas = exports$1; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. - * @namespace Chart.helpers.clear - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers_core.clear = exports$1.clear; - -/** - * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. - * @namespace Chart.helpers.drawRoundedRectangle - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers_core.drawRoundedRectangle = function(ctx) { - ctx.beginPath(); - exports$1.roundedRect.apply(exports$1, arguments); -}; - -var defaults = { - /** - * @private - */ - _set: function(scope, values) { - return helpers_core.merge(this[scope] || (this[scope] = {}), values); - } -}; - -defaults._set('global', { - defaultColor: 'rgba(0,0,0,0.1)', - defaultFontColor: '#666', - defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", - defaultFontSize: 12, - defaultFontStyle: 'normal', - defaultLineHeight: 1.2, - showLines: true -}); - -var core_defaults = defaults; - -var valueOrDefault = helpers_core.valueOrDefault; - -/** - * Converts the given font object into a CSS font string. - * @param {object} font - A font object. - * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font - * @private - */ -function toFontString(font) { - if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) { - return null; - } - - return (font.style ? font.style + ' ' : '') - + (font.weight ? font.weight + ' ' : '') - + font.size + 'px ' - + font.family; -} - -/** - * @alias Chart.helpers.options - * @namespace - */ -var helpers_options = { - /** - * Converts the given line height `value` in pixels for a specific font `size`. - * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). - * @param {number} size - The font size (in pixels) used to resolve relative `value`. - * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid). - * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height - * @since 2.7.0 - */ - toLineHeight: function(value, size) { - var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); - if (!matches || matches[1] === 'normal') { - return size * 1.2; - } - - value = +matches[2]; - - switch (matches[3]) { - case 'px': - return value; - case '%': - value /= 100; - break; - default: - break; - } - - return size * value; - }, - - /** - * Converts the given value into a padding object with pre-computed width/height. - * @param {number|object} value - If a number, set the value to all TRBL component, - * else, if and object, use defined properties and sets undefined ones to 0. - * @returns {object} The padding values (top, right, bottom, left, width, height) - * @since 2.7.0 - */ - toPadding: function(value) { - var t, r, b, l; - - if (helpers_core.isObject(value)) { - t = +value.top || 0; - r = +value.right || 0; - b = +value.bottom || 0; - l = +value.left || 0; - } else { - t = r = b = l = +value || 0; - } - - return { - top: t, - right: r, - bottom: b, - left: l, - height: t + b, - width: l + r - }; - }, - - /** - * Parses font options and returns the font object. - * @param {object} options - A object that contains font options to be parsed. - * @return {object} The font object. - * @todo Support font.* options and renamed to toFont(). - * @private - */ - _parseFont: function(options) { - var globalDefaults = core_defaults.global; - var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); - var font = { - family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily), - lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size), - size: size, - style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle), - weight: null, - string: '' - }; - - font.string = toFontString(font); - return font; - }, - - /** - * Evaluates the given `inputs` sequentially and returns the first defined value. - * @param {Array} inputs - An array of values, falling back to the last value. - * @param {object} [context] - If defined and the current value is a function, the value - * is called with `context` as first argument and the result becomes the new input. - * @param {number} [index] - If defined and the current value is an array, the value - * at `index` become the new input. - * @since 2.7.0 - */ - resolve: function(inputs, context, index) { - var i, ilen, value; - - for (i = 0, ilen = inputs.length; i < ilen; ++i) { - value = inputs[i]; - if (value === undefined) { - continue; - } - if (context !== undefined && typeof value === 'function') { - value = value(context); - } - if (index !== undefined && helpers_core.isArray(value)) { - value = value[index]; - } - if (value !== undefined) { - return value; - } - } - } -}; - -var helpers$1 = helpers_core; -var easing = helpers_easing; -var canvas = helpers_canvas; -var options = helpers_options; -helpers$1.easing = easing; -helpers$1.canvas = canvas; -helpers$1.options = options; - -function interpolate(start, view, model, ease) { - var keys = Object.keys(model); - var i, ilen, key, actual, origin, target, type, c0, c1; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - - target = model[key]; - - // if a value is added to the model after pivot() has been called, the view - // doesn't contain it, so let's initialize the view to the target value. - if (!view.hasOwnProperty(key)) { - view[key] = target; - } - - actual = view[key]; - - if (actual === target || key[0] === '_') { - continue; - } - - if (!start.hasOwnProperty(key)) { - start[key] = actual; - } - - origin = start[key]; - - type = typeof target; - - if (type === typeof origin) { - if (type === 'string') { - c0 = chartjsColor(origin); - if (c0.valid) { - c1 = chartjsColor(target); - if (c1.valid) { - view[key] = c1.mix(c0, ease).rgbString(); - continue; - } - } - } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) { - view[key] = origin + (target - origin) * ease; - continue; - } - } - - view[key] = target; - } -} - -var Element = function(configuration) { - helpers$1.extend(this, configuration); - this.initialize.apply(this, arguments); -}; - -helpers$1.extend(Element.prototype, { - - initialize: function() { - this.hidden = false; - }, - - pivot: function() { - var me = this; - if (!me._view) { - me._view = helpers$1.clone(me._model); - } - me._start = {}; - return me; - }, - - transition: function(ease) { - var me = this; - var model = me._model; - var start = me._start; - var view = me._view; - - // No animation -> No Transition - if (!model || ease === 1) { - me._view = model; - me._start = null; - return me; - } - - if (!view) { - view = me._view = {}; - } - - if (!start) { - start = me._start = {}; - } - - interpolate(start, view, model, ease); - - return me; - }, - - tooltipPosition: function() { - return { - x: this._model.x, - y: this._model.y - }; - }, - - hasValue: function() { - return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y); - } -}); - -Element.extend = helpers$1.inherits; - -var core_element = Element; - -var exports$2 = core_element.extend({ - chart: null, // the animation associated chart instance - currentStep: 0, // the current animation step - numSteps: 60, // default number of steps - easing: '', // the easing to use for this animation - render: null, // render function used by the animation service - - onAnimationProgress: null, // user specified callback to fire on each step of the animation - onAnimationComplete: null, // user specified callback to fire when the animation finishes -}); - -var core_animation = exports$2; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart.Animation instead - * @prop Chart.Animation#animationObject - * @deprecated since version 2.6.0 - * @todo remove at version 3 - */ -Object.defineProperty(exports$2.prototype, 'animationObject', { - get: function() { - return this; - } -}); - -/** - * Provided for backward compatibility, use Chart.Animation#chart instead - * @prop Chart.Animation#chartInstance - * @deprecated since version 2.6.0 - * @todo remove at version 3 - */ -Object.defineProperty(exports$2.prototype, 'chartInstance', { - get: function() { - return this.chart; - }, - set: function(value) { - this.chart = value; - } -}); - -core_defaults._set('global', { - animation: { - duration: 1000, - easing: 'easeOutQuart', - onProgress: helpers$1.noop, - onComplete: helpers$1.noop - } -}); - -var core_animations = { - animations: [], - request: null, - - /** - * @param {Chart} chart - The chart to animate. - * @param {Chart.Animation} animation - The animation that we will animate. - * @param {number} duration - The animation duration in ms. - * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions - */ - addAnimation: function(chart, animation, duration, lazy) { - var animations = this.animations; - var i, ilen; - - animation.chart = chart; - animation.startTime = Date.now(); - animation.duration = duration; - - if (!lazy) { - chart.animating = true; - } - - for (i = 0, ilen = animations.length; i < ilen; ++i) { - if (animations[i].chart === chart) { - animations[i] = animation; - return; - } - } - - animations.push(animation); - - // If there are no animations queued, manually kickstart a digest, for lack of a better word - if (animations.length === 1) { - this.requestAnimationFrame(); - } - }, - - cancelAnimation: function(chart) { - var index = helpers$1.findIndex(this.animations, function(animation) { - return animation.chart === chart; - }); - - if (index !== -1) { - this.animations.splice(index, 1); - chart.animating = false; - } - }, - - requestAnimationFrame: function() { - var me = this; - if (me.request === null) { - // Skip animation frame requests until the active one is executed. - // This can happen when processing mouse events, e.g. 'mousemove' - // and 'mouseout' events will trigger multiple renders. - me.request = helpers$1.requestAnimFrame.call(window, function() { - me.request = null; - me.startDigest(); - }); - } - }, - - /** - * @private - */ - startDigest: function() { - var me = this; - - me.advance(); - - // Do we have more stuff to animate? - if (me.animations.length > 0) { - me.requestAnimationFrame(); - } - }, - - /** - * @private - */ - advance: function() { - var animations = this.animations; - var animation, chart, numSteps, nextStep; - var i = 0; - - // 1 animation per chart, so we are looping charts here - while (i < animations.length) { - animation = animations[i]; - chart = animation.chart; - numSteps = animation.numSteps; - - // Make sure that currentStep starts at 1 - // https://github.com/chartjs/Chart.js/issues/6104 - nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1; - animation.currentStep = Math.min(nextStep, numSteps); - - helpers$1.callback(animation.render, [chart, animation], chart); - helpers$1.callback(animation.onAnimationProgress, [animation], chart); - - if (animation.currentStep >= numSteps) { - helpers$1.callback(animation.onAnimationComplete, [animation], chart); - chart.animating = false; - animations.splice(i, 1); - } else { - ++i; - } - } - } -}; - -var resolve = helpers$1.options.resolve; - -var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; - -/** - * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', - * 'unshift') and notify the listener AFTER the array has been altered. Listeners are - * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. - */ -function listenArrayEvents(array, listener) { - if (array._chartjs) { - array._chartjs.listeners.push(listener); - return; - } - - Object.defineProperty(array, '_chartjs', { - configurable: true, - enumerable: false, - value: { - listeners: [listener] - } - }); - - arrayEvents.forEach(function(key) { - var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); - var base = array[key]; - - Object.defineProperty(array, key, { - configurable: true, - enumerable: false, - value: function() { - var args = Array.prototype.slice.call(arguments); - var res = base.apply(this, args); - - helpers$1.each(array._chartjs.listeners, function(object) { - if (typeof object[method] === 'function') { - object[method].apply(object, args); - } - }); - - return res; - } - }); - }); -} - -/** - * Removes the given array event listener and cleanup extra attached properties (such as - * the _chartjs stub and overridden methods) if array doesn't have any more listeners. - */ -function unlistenArrayEvents(array, listener) { - var stub = array._chartjs; - if (!stub) { - return; - } - - var listeners = stub.listeners; - var index = listeners.indexOf(listener); - if (index !== -1) { - listeners.splice(index, 1); - } - - if (listeners.length > 0) { - return; - } - - arrayEvents.forEach(function(key) { - delete array[key]; - }); - - delete array._chartjs; -} - -// Base class for all dataset controllers (line, bar, etc) -var DatasetController = function(chart, datasetIndex) { - this.initialize(chart, datasetIndex); -}; - -helpers$1.extend(DatasetController.prototype, { - - /** - * Element type used to generate a meta dataset (e.g. Chart.element.Line). - * @type {Chart.core.element} - */ - datasetElementType: null, - - /** - * Element type used to generate a meta data (e.g. Chart.element.Point). - * @type {Chart.core.element} - */ - dataElementType: null, - - initialize: function(chart, datasetIndex) { - var me = this; - me.chart = chart; - me.index = datasetIndex; - me.linkScales(); - me.addElements(); - }, - - updateIndex: function(datasetIndex) { - this.index = datasetIndex; - }, - - linkScales: function() { - var me = this; - var meta = me.getMeta(); - var dataset = me.getDataset(); - - if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) { - meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; - } - if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) { - meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; - } - }, - - getDataset: function() { - return this.chart.data.datasets[this.index]; - }, - - getMeta: function() { - return this.chart.getDatasetMeta(this.index); - }, - - getScaleForId: function(scaleID) { - return this.chart.scales[scaleID]; - }, - - /** - * @private - */ - _getValueScaleId: function() { - return this.getMeta().yAxisID; - }, - - /** - * @private - */ - _getIndexScaleId: function() { - return this.getMeta().xAxisID; - }, - - /** - * @private - */ - _getValueScale: function() { - return this.getScaleForId(this._getValueScaleId()); - }, - - /** - * @private - */ - _getIndexScale: function() { - return this.getScaleForId(this._getIndexScaleId()); - }, - - reset: function() { - this.update(true); - }, - - /** - * @private - */ - destroy: function() { - if (this._data) { - unlistenArrayEvents(this._data, this); - } - }, - - createMetaDataset: function() { - var me = this; - var type = me.datasetElementType; - return type && new type({ - _chart: me.chart, - _datasetIndex: me.index - }); - }, - - createMetaData: function(index) { - var me = this; - var type = me.dataElementType; - return type && new type({ - _chart: me.chart, - _datasetIndex: me.index, - _index: index - }); - }, - - addElements: function() { - var me = this; - var meta = me.getMeta(); - var data = me.getDataset().data || []; - var metaData = meta.data; - var i, ilen; - - for (i = 0, ilen = data.length; i < ilen; ++i) { - metaData[i] = metaData[i] || me.createMetaData(i); - } - - meta.dataset = meta.dataset || me.createMetaDataset(); - }, - - addElementAndReset: function(index) { - var element = this.createMetaData(index); - this.getMeta().data.splice(index, 0, element); - this.updateElement(element, index, true); - }, - - buildOrUpdateElements: function() { - var me = this; - var dataset = me.getDataset(); - var data = dataset.data || (dataset.data = []); - - // In order to correctly handle data addition/deletion animation (an thus simulate - // real-time charts), we need to monitor these data modifications and synchronize - // the internal meta data accordingly. - if (me._data !== data) { - if (me._data) { - // This case happens when the user replaced the data array instance. - unlistenArrayEvents(me._data, me); - } - - if (data && Object.isExtensible(data)) { - listenArrayEvents(data, me); - } - me._data = data; - } - - // Re-sync meta data in case the user replaced the data array or if we missed - // any updates and so make sure that we handle number of datapoints changing. - me.resyncElements(); - }, - - update: helpers$1.noop, - - transition: function(easingValue) { - var meta = this.getMeta(); - var elements = meta.data || []; - var ilen = elements.length; - var i = 0; - - for (; i < ilen; ++i) { - elements[i].transition(easingValue); - } - - if (meta.dataset) { - meta.dataset.transition(easingValue); - } - }, - - draw: function() { - var meta = this.getMeta(); - var elements = meta.data || []; - var ilen = elements.length; - var i = 0; - - if (meta.dataset) { - meta.dataset.draw(); - } - - for (; i < ilen; ++i) { - elements[i].draw(); - } - }, - - removeHoverStyle: function(element) { - helpers$1.merge(element._model, element.$previousStyle || {}); - delete element.$previousStyle; - }, - - setHoverStyle: function(element) { - var dataset = this.chart.data.datasets[element._datasetIndex]; - var index = element._index; - var custom = element.custom || {}; - var model = element._model; - var getHoverColor = helpers$1.getHoverColor; - - element.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth - }; - - model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index); - model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index); - model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index); - }, - - /** - * @private - */ - resyncElements: function() { - var me = this; - var meta = me.getMeta(); - var data = me.getDataset().data; - var numMeta = meta.data.length; - var numData = data.length; - - if (numData < numMeta) { - meta.data.splice(numData, numMeta - numData); - } else if (numData > numMeta) { - me.insertElements(numMeta, numData - numMeta); - } - }, - - /** - * @private - */ - insertElements: function(start, count) { - for (var i = 0; i < count; ++i) { - this.addElementAndReset(start + i); - } - }, - - /** - * @private - */ - onDataPush: function() { - var count = arguments.length; - this.insertElements(this.getDataset().data.length - count, count); - }, - - /** - * @private - */ - onDataPop: function() { - this.getMeta().data.pop(); - }, - - /** - * @private - */ - onDataShift: function() { - this.getMeta().data.shift(); - }, - - /** - * @private - */ - onDataSplice: function(start, count) { - this.getMeta().data.splice(start, count); - this.insertElements(start, arguments.length - 2); - }, - - /** - * @private - */ - onDataUnshift: function() { - this.insertElements(0, arguments.length); - } -}); - -DatasetController.extend = helpers$1.inherits; - -var core_datasetController = DatasetController; - -core_defaults._set('global', { - elements: { - arc: { - backgroundColor: core_defaults.global.defaultColor, - borderColor: '#fff', - borderWidth: 2, - borderAlign: 'center' - } - } -}); - -var element_arc = core_element.extend({ - inLabelRange: function(mouseX) { - var vm = this._view; - - if (vm) { - return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); - } - return false; - }, - - inRange: function(chartX, chartY) { - var vm = this._view; - - if (vm) { - var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY}); - var angle = pointRelativePosition.angle; - var distance = pointRelativePosition.distance; - - // Sanitise angle range - var startAngle = vm.startAngle; - var endAngle = vm.endAngle; - while (endAngle < startAngle) { - endAngle += 2.0 * Math.PI; - } - while (angle > endAngle) { - angle -= 2.0 * Math.PI; - } - while (angle < startAngle) { - angle += 2.0 * Math.PI; - } - - // Check if within the range of the open/close angle - var betweenAngles = (angle >= startAngle && angle <= endAngle); - var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); - - return (betweenAngles && withinRadius); - } - return false; - }, - - getCenterPoint: function() { - var vm = this._view; - var halfAngle = (vm.startAngle + vm.endAngle) / 2; - var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; - return { - x: vm.x + Math.cos(halfAngle) * halfRadius, - y: vm.y + Math.sin(halfAngle) * halfRadius - }; - }, - - getArea: function() { - var vm = this._view; - return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); - }, - - tooltipPosition: function() { - var vm = this._view; - var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); - var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; - - return { - x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), - y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) - }; - }, - - draw: function() { - var ctx = this._chart.ctx; - var vm = this._view; - var sA = vm.startAngle; - var eA = vm.endAngle; - var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0; - var angleMargin; - - ctx.save(); - - ctx.beginPath(); - ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA); - ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); - ctx.closePath(); - - ctx.fillStyle = vm.backgroundColor; - ctx.fill(); - - if (vm.borderWidth) { - if (vm.borderAlign === 'inner') { - // Draw an inner border by cliping the arc and drawing a double-width border - // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders - ctx.beginPath(); - angleMargin = pixelMargin / vm.outerRadius; - ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin); - if (vm.innerRadius > pixelMargin) { - angleMargin = pixelMargin / vm.innerRadius; - ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true); - } else { - ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2); - } - ctx.closePath(); - ctx.clip(); - - ctx.beginPath(); - ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); - ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); - ctx.closePath(); - - ctx.lineWidth = vm.borderWidth * 2; - ctx.lineJoin = 'round'; - } else { - ctx.lineWidth = vm.borderWidth; - ctx.lineJoin = 'bevel'; - } - - ctx.strokeStyle = vm.borderColor; - ctx.stroke(); - } - - ctx.restore(); - } -}); - -var valueOrDefault$1 = helpers$1.valueOrDefault; - -var defaultColor = core_defaults.global.defaultColor; - -core_defaults._set('global', { - elements: { - line: { - tension: 0.4, - backgroundColor: defaultColor, - borderWidth: 3, - borderColor: defaultColor, - borderCapStyle: 'butt', - borderDash: [], - borderDashOffset: 0.0, - borderJoinStyle: 'miter', - capBezierPoints: true, - fill: true, // do we fill in the area between the line and its base axis - } - } -}); - -var element_line = core_element.extend({ - draw: function() { - var me = this; - var vm = me._view; - var ctx = me._chart.ctx; - var spanGaps = vm.spanGaps; - var points = me._children.slice(); // clone array - var globalDefaults = core_defaults.global; - var globalOptionLineElements = globalDefaults.elements.line; - var lastDrawnIndex = -1; - var index, current, previous, currentVM; - - // If we are looping, adding the first point again - if (me._loop && points.length) { - points.push(points[0]); - } - - ctx.save(); - - // Stroke Line Options - ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; - - // IE 9 and 10 do not support line dash - if (ctx.setLineDash) { - ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); - } - - ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset); - ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; - ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth); - ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; - - // Stroke Line - ctx.beginPath(); - lastDrawnIndex = -1; - - for (index = 0; index < points.length; ++index) { - current = points[index]; - previous = helpers$1.previousItem(points, index); - currentVM = current._view; - - // First point moves to it's starting position no matter what - if (index === 0) { - if (!currentVM.skip) { - ctx.moveTo(currentVM.x, currentVM.y); - lastDrawnIndex = index; - } - } else { - previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; - - if (!currentVM.skip) { - if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { - // There was a gap and this is the first point after the gap - ctx.moveTo(currentVM.x, currentVM.y); - } else { - // Line to next point - helpers$1.canvas.lineTo(ctx, previous._view, current._view); - } - lastDrawnIndex = index; - } - } - } - - ctx.stroke(); - ctx.restore(); - } -}); - -var valueOrDefault$2 = helpers$1.valueOrDefault; - -var defaultColor$1 = core_defaults.global.defaultColor; - -core_defaults._set('global', { - elements: { - point: { - radius: 3, - pointStyle: 'circle', - backgroundColor: defaultColor$1, - borderColor: defaultColor$1, - borderWidth: 1, - // Hover - hitRadius: 1, - hoverRadius: 4, - hoverBorderWidth: 1 - } - } -}); - -function xRange(mouseX) { - var vm = this._view; - return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false; -} - -function yRange(mouseY) { - var vm = this._view; - return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false; -} - -var element_point = core_element.extend({ - inRange: function(mouseX, mouseY) { - var vm = this._view; - return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; - }, - - inLabelRange: xRange, - inXRange: xRange, - inYRange: yRange, - - getCenterPoint: function() { - var vm = this._view; - return { - x: vm.x, - y: vm.y - }; - }, - - getArea: function() { - return Math.PI * Math.pow(this._view.radius, 2); - }, - - tooltipPosition: function() { - var vm = this._view; - return { - x: vm.x, - y: vm.y, - padding: vm.radius + vm.borderWidth - }; - }, - - draw: function(chartArea) { - var vm = this._view; - var ctx = this._chart.ctx; - var pointStyle = vm.pointStyle; - var rotation = vm.rotation; - var radius = vm.radius; - var x = vm.x; - var y = vm.y; - var globalDefaults = core_defaults.global; - var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow - - if (vm.skip) { - return; - } - - // Clipping for Points. - if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) { - ctx.strokeStyle = vm.borderColor || defaultColor; - ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth); - ctx.fillStyle = vm.backgroundColor || defaultColor; - helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation); - } - } -}); - -var defaultColor$2 = core_defaults.global.defaultColor; - -core_defaults._set('global', { - elements: { - rectangle: { - backgroundColor: defaultColor$2, - borderColor: defaultColor$2, - borderSkipped: 'bottom', - borderWidth: 0 - } - } -}); - -function isVertical(vm) { - return vm && vm.width !== undefined; -} - -/** - * Helper function to get the bounds of the bar regardless of the orientation - * @param bar {Chart.Element.Rectangle} the bar - * @return {Bounds} bounds of the bar - * @private - */ -function getBarBounds(vm) { - var x1, x2, y1, y2, half; - - if (isVertical(vm)) { - half = vm.width / 2; - x1 = vm.x - half; - x2 = vm.x + half; - y1 = Math.min(vm.y, vm.base); - y2 = Math.max(vm.y, vm.base); - } else { - half = vm.height / 2; - x1 = Math.min(vm.x, vm.base); - x2 = Math.max(vm.x, vm.base); - y1 = vm.y - half; - y2 = vm.y + half; - } - - return { - left: x1, - top: y1, - right: x2, - bottom: y2 - }; -} - -function swap(orig, v1, v2) { - return orig === v1 ? v2 : orig === v2 ? v1 : orig; -} - -function parseBorderSkipped(vm) { - var edge = vm.borderSkipped; - var res = {}; - - if (!edge) { - return res; - } - - if (vm.horizontal) { - if (vm.base > vm.x) { - edge = swap(edge, 'left', 'right'); - } - } else if (vm.base < vm.y) { - edge = swap(edge, 'bottom', 'top'); - } - - res[edge] = true; - return res; -} - -function parseBorderWidth(vm, maxW, maxH) { - var value = vm.borderWidth; - var skip = parseBorderSkipped(vm); - var t, r, b, l; - - if (helpers$1.isObject(value)) { - t = +value.top || 0; - r = +value.right || 0; - b = +value.bottom || 0; - l = +value.left || 0; - } else { - t = r = b = l = +value || 0; - } - - return { - t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t, - r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r, - b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b, - l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l - }; -} - -function boundingRects(vm) { - var bounds = getBarBounds(vm); - var width = bounds.right - bounds.left; - var height = bounds.bottom - bounds.top; - var border = parseBorderWidth(vm, width / 2, height / 2); - - return { - outer: { - x: bounds.left, - y: bounds.top, - w: width, - h: height - }, - inner: { - x: bounds.left + border.l, - y: bounds.top + border.t, - w: width - border.l - border.r, - h: height - border.t - border.b - } - }; -} - -function inRange(vm, x, y) { - var skipX = x === null; - var skipY = y === null; - var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm); - - return bounds - && (skipX || x >= bounds.left && x <= bounds.right) - && (skipY || y >= bounds.top && y <= bounds.bottom); -} - -var element_rectangle = core_element.extend({ - draw: function() { - var ctx = this._chart.ctx; - var vm = this._view; - var rects = boundingRects(vm); - var outer = rects.outer; - var inner = rects.inner; - - ctx.fillStyle = vm.backgroundColor; - ctx.fillRect(outer.x, outer.y, outer.w, outer.h); - - if (outer.w === inner.w && outer.h === inner.h) { - return; - } - - ctx.save(); - ctx.beginPath(); - ctx.rect(outer.x, outer.y, outer.w, outer.h); - ctx.clip(); - ctx.fillStyle = vm.borderColor; - ctx.rect(inner.x, inner.y, inner.w, inner.h); - ctx.fill('evenodd'); - ctx.restore(); - }, - - height: function() { - var vm = this._view; - return vm.base - vm.y; - }, - - inRange: function(mouseX, mouseY) { - return inRange(this._view, mouseX, mouseY); - }, - - inLabelRange: function(mouseX, mouseY) { - var vm = this._view; - return isVertical(vm) - ? inRange(vm, mouseX, null) - : inRange(vm, null, mouseY); - }, - - inXRange: function(mouseX) { - return inRange(this._view, mouseX, null); - }, - - inYRange: function(mouseY) { - return inRange(this._view, null, mouseY); - }, - - getCenterPoint: function() { - var vm = this._view; - var x, y; - if (isVertical(vm)) { - x = vm.x; - y = (vm.y + vm.base) / 2; - } else { - x = (vm.x + vm.base) / 2; - y = vm.y; - } - - return {x: x, y: y}; - }, - - getArea: function() { - var vm = this._view; - - return isVertical(vm) - ? vm.width * Math.abs(vm.y - vm.base) - : vm.height * Math.abs(vm.x - vm.base); - }, - - tooltipPosition: function() { - var vm = this._view; - return { - x: vm.x, - y: vm.y - }; - } -}); - -var elements = {}; -var Arc = element_arc; -var Line = element_line; -var Point = element_point; -var Rectangle = element_rectangle; -elements.Arc = Arc; -elements.Line = Line; -elements.Point = Point; -elements.Rectangle = Rectangle; - -var resolve$1 = helpers$1.options.resolve; - -core_defaults._set('bar', { - hover: { - mode: 'label' - }, - - scales: { - xAxes: [{ - type: 'category', - categoryPercentage: 0.8, - barPercentage: 0.9, - offset: true, - gridLines: { - offsetGridLines: true - } - }], - - yAxes: [{ - type: 'linear' - }] - } -}); - -/** - * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. - * @private - */ -function computeMinSampleSize(scale, pixels) { - var min = scale.isHorizontal() ? scale.width : scale.height; - var ticks = scale.getTicks(); - var prev, curr, i, ilen; - - for (i = 1, ilen = pixels.length; i < ilen; ++i) { - min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1])); - } - - for (i = 0, ilen = ticks.length; i < ilen; ++i) { - curr = scale.getPixelForTick(i); - min = i > 0 ? Math.min(min, curr - prev) : min; - prev = curr; - } - - return min; -} - -/** - * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, - * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This - * mode currently always generates bars equally sized (until we introduce scriptable options?). - * @private - */ -function computeFitCategoryTraits(index, ruler, options) { - var thickness = options.barThickness; - var count = ruler.stackCount; - var curr = ruler.pixels[index]; - var size, ratio; - - if (helpers$1.isNullOrUndef(thickness)) { - size = ruler.min * options.categoryPercentage; - ratio = options.barPercentage; - } else { - // When bar thickness is enforced, category and bar percentages are ignored. - // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') - // and deprecate barPercentage since this value is ignored when thickness is absolute. - size = thickness * count; - ratio = 1; - } - - return { - chunk: size / count, - ratio: ratio, - start: curr - (size / 2) - }; -} - -/** - * Computes an "optimal" category that globally arranges bars side by side (no gap when - * percentage options are 1), based on the previous and following categories. This mode - * generates bars with different widths when data are not evenly spaced. - * @private - */ -function computeFlexCategoryTraits(index, ruler, options) { - var pixels = ruler.pixels; - var curr = pixels[index]; - var prev = index > 0 ? pixels[index - 1] : null; - var next = index < pixels.length - 1 ? pixels[index + 1] : null; - var percent = options.categoryPercentage; - var start, size; - - if (prev === null) { - // first data: its size is double based on the next point or, - // if it's also the last data, we use the scale size. - prev = curr - (next === null ? ruler.end - ruler.start : next - curr); - } - - if (next === null) { - // last data: its size is also double based on the previous point. - next = curr + curr - prev; - } - - start = curr - (curr - Math.min(prev, next)) / 2 * percent; - size = Math.abs(next - prev) / 2 * percent; - - return { - chunk: size / ruler.stackCount, - ratio: options.barPercentage, - start: start - }; -} - -var controller_bar = core_datasetController.extend({ - - dataElementType: elements.Rectangle, - - initialize: function() { - var me = this; - var meta; - - core_datasetController.prototype.initialize.apply(me, arguments); - - meta = me.getMeta(); - meta.stack = me.getDataset().stack; - meta.bar = true; - }, - - update: function(reset) { - var me = this; - var rects = me.getMeta().data; - var i, ilen; - - me._ruler = me.getRuler(); - - for (i = 0, ilen = rects.length; i < ilen; ++i) { - me.updateElement(rects[i], i, reset); - } - }, - - updateElement: function(rectangle, index, reset) { - var me = this; - var meta = me.getMeta(); - var dataset = me.getDataset(); - var options = me._resolveElementOptions(rectangle, index); - - rectangle._xScale = me.getScaleForId(meta.xAxisID); - rectangle._yScale = me.getScaleForId(meta.yAxisID); - rectangle._datasetIndex = me.index; - rectangle._index = index; - rectangle._model = { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderSkipped: options.borderSkipped, - borderWidth: options.borderWidth, - datasetLabel: dataset.label, - label: me.chart.data.labels[index] - }; - - me._updateElementGeometry(rectangle, index, reset); - - rectangle.pivot(); - }, - - /** - * @private - */ - _updateElementGeometry: function(rectangle, index, reset) { - var me = this; - var model = rectangle._model; - var vscale = me._getValueScale(); - var base = vscale.getBasePixel(); - var horizontal = vscale.isHorizontal(); - var ruler = me._ruler || me.getRuler(); - var vpixels = me.calculateBarValuePixels(me.index, index); - var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); - - model.horizontal = horizontal; - model.base = reset ? base : vpixels.base; - model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; - model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; - model.height = horizontal ? ipixels.size : undefined; - model.width = horizontal ? undefined : ipixels.size; - }, - - /** - * Returns the stacks based on groups and bar visibility. - * @param {number} [last] - The dataset index - * @returns {string[]} The list of stack IDs - * @private - */ - _getStacks: function(last) { - var me = this; - var chart = me.chart; - var scale = me._getIndexScale(); - var stacked = scale.options.stacked; - var ilen = last === undefined ? chart.data.datasets.length : last + 1; - var stacks = []; - var i, meta; - - for (i = 0; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - if (meta.bar && chart.isDatasetVisible(i) && - (stacked === false || - (stacked === true && stacks.indexOf(meta.stack) === -1) || - (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { - stacks.push(meta.stack); - } - } - - return stacks; - }, - - /** - * Returns the effective number of stacks based on groups and bar visibility. - * @private - */ - getStackCount: function() { - return this._getStacks().length; - }, - - /** - * Returns the stack index for the given dataset based on groups and bar visibility. - * @param {number} [datasetIndex] - The dataset index - * @param {string} [name] - The stack name to find - * @returns {number} The stack index - * @private - */ - getStackIndex: function(datasetIndex, name) { - var stacks = this._getStacks(datasetIndex); - var index = (name !== undefined) - ? stacks.indexOf(name) - : -1; // indexOf returns -1 if element is not present - - return (index === -1) - ? stacks.length - 1 - : index; - }, - - /** - * @private - */ - getRuler: function() { - var me = this; - var scale = me._getIndexScale(); - var stackCount = me.getStackCount(); - var datasetIndex = me.index; - var isHorizontal = scale.isHorizontal(); - var start = isHorizontal ? scale.left : scale.top; - var end = start + (isHorizontal ? scale.width : scale.height); - var pixels = []; - var i, ilen, min; - - for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { - pixels.push(scale.getPixelForValue(null, i, datasetIndex)); - } - - min = helpers$1.isNullOrUndef(scale.options.barThickness) - ? computeMinSampleSize(scale, pixels) - : -1; - - return { - min: min, - pixels: pixels, - start: start, - end: end, - stackCount: stackCount, - scale: scale - }; - }, - - /** - * Note: pixel values are not clamped to the scale area. - * @private - */ - calculateBarValuePixels: function(datasetIndex, index) { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var scale = me._getValueScale(); - var isHorizontal = scale.isHorizontal(); - var datasets = chart.data.datasets; - var value = +scale.getRightValue(datasets[datasetIndex].data[index]); - var minBarLength = scale.options.minBarLength; - var stacked = scale.options.stacked; - var stack = meta.stack; - var start = 0; - var i, imeta, ivalue, base, head, size; - - if (stacked || (stacked === undefined && stack !== undefined)) { - for (i = 0; i < datasetIndex; ++i) { - imeta = chart.getDatasetMeta(i); - - if (imeta.bar && - imeta.stack === stack && - imeta.controller._getValueScaleId() === scale.id && - chart.isDatasetVisible(i)) { - - ivalue = +scale.getRightValue(datasets[i].data[index]); - if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { - start += ivalue; - } - } - } - } - - base = scale.getPixelForValue(start); - head = scale.getPixelForValue(start + value); - size = head - base; - - if (minBarLength !== undefined && Math.abs(size) < minBarLength) { - size = minBarLength; - if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) { - head = base - minBarLength; - } else { - head = base + minBarLength; - } - } - - return { - size: size, - base: base, - head: head, - center: head + size / 2 - }; - }, - - /** - * @private - */ - calculateBarIndexPixels: function(datasetIndex, index, ruler) { - var me = this; - var options = ruler.scale.options; - var range = options.barThickness === 'flex' - ? computeFlexCategoryTraits(index, ruler, options) - : computeFitCategoryTraits(index, ruler, options); - - var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); - var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); - var size = Math.min( - helpers$1.valueOrDefault(options.maxBarThickness, Infinity), - range.chunk * range.ratio); - - return { - base: center - size / 2, - head: center + size / 2, - center: center, - size: size - }; - }, - - draw: function() { - var me = this; - var chart = me.chart; - var scale = me._getValueScale(); - var rects = me.getMeta().data; - var dataset = me.getDataset(); - var ilen = rects.length; - var i = 0; - - helpers$1.canvas.clipArea(chart.ctx, chart.chartArea); - - for (; i < ilen; ++i) { - if (!isNaN(scale.getRightValue(dataset.data[i]))) { - rects[i].draw(); - } - } - - helpers$1.canvas.unclipArea(chart.ctx); - }, - - /** - * @private - */ - _resolveElementOptions: function(rectangle, index) { - var me = this; - var chart = me.chart; - var datasets = chart.data.datasets; - var dataset = datasets[me.index]; - var custom = rectangle.custom || {}; - var options = chart.options.elements.rectangle; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var keys = [ - 'backgroundColor', - 'borderColor', - 'borderSkipped', - 'borderWidth' - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$1([ - custom[key], - dataset[key], - options[key] - ], context, index); - } - - return values; - } -}); - -var valueOrDefault$3 = helpers$1.valueOrDefault; -var resolve$2 = helpers$1.options.resolve; - -core_defaults._set('bubble', { - hover: { - mode: 'single' - }, - - scales: { - xAxes: [{ - type: 'linear', // bubble should probably use a linear scale by default - position: 'bottom', - id: 'x-axis-0' // need an ID so datasets can reference the scale - }], - yAxes: [{ - type: 'linear', - position: 'left', - id: 'y-axis-0' - }] - }, - - tooltips: { - callbacks: { - title: function() { - // Title doesn't make sense for scatter since we format the data as a point - return ''; - }, - label: function(item, data) { - var datasetLabel = data.datasets[item.datasetIndex].label || ''; - var dataPoint = data.datasets[item.datasetIndex].data[item.index]; - return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; - } - } - } -}); - -var controller_bubble = core_datasetController.extend({ - /** - * @protected - */ - dataElementType: elements.Point, - - /** - * @protected - */ - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var points = meta.data; - - // Update Points - helpers$1.each(points, function(point, index) { - me.updateElement(point, index, reset); - }); - }, - - /** - * @protected - */ - updateElement: function(point, index, reset) { - var me = this; - var meta = me.getMeta(); - var custom = point.custom || {}; - var xScale = me.getScaleForId(meta.xAxisID); - var yScale = me.getScaleForId(meta.yAxisID); - var options = me._resolveElementOptions(point, index); - var data = me.getDataset().data[index]; - var dsIndex = me.index; - - var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); - var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); - - point._xScale = xScale; - point._yScale = yScale; - point._options = options; - point._datasetIndex = dsIndex; - point._index = index; - point._model = { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - hitRadius: options.hitRadius, - pointStyle: options.pointStyle, - rotation: options.rotation, - radius: reset ? 0 : options.radius, - skip: custom.skip || isNaN(x) || isNaN(y), - x: x, - y: y, - }; - - point.pivot(); - }, - - /** - * @protected - */ - setHoverStyle: function(point) { - var model = point._model; - var options = point._options; - var getHoverColor = helpers$1.getHoverColor; - - point.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - radius: model.radius - }; - - model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth); - model.radius = options.radius + options.hoverRadius; - }, - - /** - * @private - */ - _resolveElementOptions: function(point, index) { - var me = this; - var chart = me.chart; - var datasets = chart.data.datasets; - var dataset = datasets[me.index]; - var custom = point.custom || {}; - var options = chart.options.elements.point; - var data = dataset.data[index]; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var keys = [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'hoverBackgroundColor', - 'hoverBorderColor', - 'hoverBorderWidth', - 'hoverRadius', - 'hitRadius', - 'pointStyle', - 'rotation' - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$2([ - custom[key], - dataset[key], - options[key] - ], context, index); - } - - // Custom radius resolution - values.radius = resolve$2([ - custom.radius, - data ? data.r : undefined, - dataset.radius, - options.radius - ], context, index); - - return values; - } -}); - -var resolve$3 = helpers$1.options.resolve; -var valueOrDefault$4 = helpers$1.valueOrDefault; - -core_defaults._set('doughnut', { - animation: { - // Boolean - Whether we animate the rotation of the Doughnut - animateRotate: true, - // Boolean - Whether we animate scaling the Doughnut from the centre - animateScale: false - }, - hover: { - mode: 'single' - }, - legendCallback: function(chart) { - var text = []; - text.push('
    '); - - var data = chart.data; - var datasets = data.datasets; - var labels = data.labels; - - if (datasets.length) { - for (var i = 0; i < datasets[0].data.length; ++i) { - text.push('
  • '); - if (labels[i]) { - text.push(labels[i]); - } - text.push('
  • '); - } - } - - text.push('
'); - return text.join(''); - }, - legend: { - labels: { - generateLabels: function(chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function(label, i) { - var meta = chart.getDatasetMeta(0); - var ds = data.datasets[0]; - var arc = meta.data[i]; - var custom = arc && arc.custom || {}; - var arcOpts = chart.options.elements.arc; - var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); - var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); - var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); - - return { - text: label, - fillStyle: fill, - strokeStyle: stroke, - lineWidth: bw, - hidden: isNaN(ds.data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }); - } - return []; - } - }, - - onClick: function(e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - // toggle visibility of index if exists - if (meta.data[index]) { - meta.data[index].hidden = !meta.data[index].hidden; - } - } - - chart.update(); - } - }, - - // The percentage of the chart that we cut out of the middle. - cutoutPercentage: 50, - - // The rotation of the chart, where the first data arc begins. - rotation: Math.PI * -0.5, - - // The total circumference of the chart. - circumference: Math.PI * 2.0, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function() { - return ''; - }, - label: function(tooltipItem, data) { - var dataLabel = data.labels[tooltipItem.index]; - var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; - - if (helpers$1.isArray(dataLabel)) { - // show value on first line of multiline label - // need to clone because we are changing the value - dataLabel = dataLabel.slice(); - dataLabel[0] += value; - } else { - dataLabel += value; - } - - return dataLabel; - } - } - } -}); - -var controller_doughnut = core_datasetController.extend({ - - dataElementType: elements.Arc, - - linkScales: helpers$1.noop, - - // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly - getRingIndex: function(datasetIndex) { - var ringIndex = 0; - - for (var j = 0; j < datasetIndex; ++j) { - if (this.chart.isDatasetVisible(j)) { - ++ringIndex; - } - } - - return ringIndex; - }, - - update: function(reset) { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var availableWidth = chartArea.right - chartArea.left; - var availableHeight = chartArea.bottom - chartArea.top; - var minSize = Math.min(availableWidth, availableHeight); - var offset = {x: 0, y: 0}; - var meta = me.getMeta(); - var arcs = meta.data; - var cutoutPercentage = opts.cutoutPercentage; - var circumference = opts.circumference; - var chartWeight = me._getRingWeight(me.index); - var i, ilen; - - // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc - if (circumference < Math.PI * 2.0) { - var startAngle = opts.rotation % (Math.PI * 2.0); - startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); - var endAngle = startAngle + circumference; - var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; - var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; - var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); - var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); - var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); - var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); - var cutout = cutoutPercentage / 100.0; - var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; - var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; - var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; - minSize = Math.min(availableWidth / size.width, availableHeight / size.height); - offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; - } - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - arcs[i]._options = me._resolveElementOptions(arcs[i], i); - } - - chart.borderWidth = me.getMaxBorderWidth(); - chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); - chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); - chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1); - chart.offsetX = offset.x * chart.outerRadius; - chart.offsetY = offset.y * chart.outerRadius; - - meta.total = me.calculateTotal(); - - me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index); - me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0); - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - me.updateElement(arcs[i], i, reset); - } - }, - - updateElement: function(arc, index, reset) { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var animationOpts = opts.animation; - var centerX = (chartArea.left + chartArea.right) / 2; - var centerY = (chartArea.top + chartArea.bottom) / 2; - var startAngle = opts.rotation; // non reset case handled later - var endAngle = opts.rotation; // non reset case handled later - var dataset = me.getDataset(); - var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); - var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; - var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; - var options = arc._options || {}; - - helpers$1.extend(arc, { - // Utility - _datasetIndex: me.index, - _index: index, - - // Desired view properties - _model: { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - borderAlign: options.borderAlign, - x: centerX + chart.offsetX, - y: centerY + chart.offsetY, - startAngle: startAngle, - endAngle: endAngle, - circumference: circumference, - outerRadius: outerRadius, - innerRadius: innerRadius, - label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) - } - }); - - var model = arc._model; - - // Set correct angles if not resetting - if (!reset || !animationOpts.animateRotate) { - if (index === 0) { - model.startAngle = opts.rotation; - } else { - model.startAngle = me.getMeta().data[index - 1]._model.endAngle; - } - - model.endAngle = model.startAngle + model.circumference; - } - - arc.pivot(); - }, - - calculateTotal: function() { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var total = 0; - var value; - - helpers$1.each(meta.data, function(element, index) { - value = dataset.data[index]; - if (!isNaN(value) && !element.hidden) { - total += Math.abs(value); - } - }); - - /* if (total === 0) { - total = NaN; - }*/ - - return total; - }, - - calculateCircumference: function(value) { - var total = this.getMeta().total; - if (total > 0 && !isNaN(value)) { - return (Math.PI * 2.0) * (Math.abs(value) / total); - } - return 0; - }, - - // gets the max border or hover width to properly scale pie charts - getMaxBorderWidth: function(arcs) { - var me = this; - var max = 0; - var chart = me.chart; - var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth; - - if (!arcs) { - // Find the outmost visible dataset - for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { - if (chart.isDatasetVisible(i)) { - meta = chart.getDatasetMeta(i); - arcs = meta.data; - if (i !== me.index) { - controller = meta.controller; - } - break; - } - } - } - - if (!arcs) { - return 0; - } - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - arc = arcs[i]; - options = controller ? controller._resolveElementOptions(arc, i) : arc._options; - if (options.borderAlign !== 'inner') { - borderWidth = options.borderWidth; - hoverWidth = options.hoverBorderWidth; - - max = borderWidth > max ? borderWidth : max; - max = hoverWidth > max ? hoverWidth : max; - } - } - return max; - }, - - /** - * @protected - */ - setHoverStyle: function(arc) { - var model = arc._model; - var options = arc._options; - var getHoverColor = helpers$1.getHoverColor; - - arc.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - }; - - model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth); - }, - - /** - * @private - */ - _resolveElementOptions: function(arc, index) { - var me = this; - var chart = me.chart; - var dataset = me.getDataset(); - var custom = arc.custom || {}; - var options = chart.options.elements.arc; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var keys = [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'borderAlign', - 'hoverBackgroundColor', - 'hoverBorderColor', - 'hoverBorderWidth', - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$3([ - custom[key], - dataset[key], - options[key] - ], context, index); - } - - return values; - }, - - /** - * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly - * @private - */ - _getRingWeightOffset: function(datasetIndex) { - var ringWeightOffset = 0; - - for (var i = 0; i < datasetIndex; ++i) { - if (this.chart.isDatasetVisible(i)) { - ringWeightOffset += this._getRingWeight(i); - } - } - - return ringWeightOffset; - }, - - /** - * @private - */ - _getRingWeight: function(dataSetIndex) { - return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0); - }, - - /** - * Returns the sum of all visibile data set weights. This value can be 0. - * @private - */ - _getVisibleDatasetWeightTotal: function() { - return this._getRingWeightOffset(this.chart.data.datasets.length); - } -}); - -core_defaults._set('horizontalBar', { - hover: { - mode: 'index', - axis: 'y' - }, - - scales: { - xAxes: [{ - type: 'linear', - position: 'bottom' - }], - - yAxes: [{ - type: 'category', - position: 'left', - categoryPercentage: 0.8, - barPercentage: 0.9, - offset: true, - gridLines: { - offsetGridLines: true - } - }] - }, - - elements: { - rectangle: { - borderSkipped: 'left' - } - }, - - tooltips: { - mode: 'index', - axis: 'y' - } -}); - -var controller_horizontalBar = controller_bar.extend({ - /** - * @private - */ - _getValueScaleId: function() { - return this.getMeta().xAxisID; - }, - - /** - * @private - */ - _getIndexScaleId: function() { - return this.getMeta().yAxisID; - } -}); - -var valueOrDefault$5 = helpers$1.valueOrDefault; -var resolve$4 = helpers$1.options.resolve; -var isPointInArea = helpers$1.canvas._isPointInArea; - -core_defaults._set('line', { - showLines: true, - spanGaps: false, - - hover: { - mode: 'label' - }, - - scales: { - xAxes: [{ - type: 'category', - id: 'x-axis-0' - }], - yAxes: [{ - type: 'linear', - id: 'y-axis-0' - }] - } -}); - -function lineEnabled(dataset, options) { - return valueOrDefault$5(dataset.showLine, options.showLines); -} - -var controller_line = core_datasetController.extend({ - - datasetElementType: elements.Line, - - dataElementType: elements.Point, - - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var line = meta.dataset; - var points = meta.data || []; - var scale = me.getScaleForId(meta.yAxisID); - var dataset = me.getDataset(); - var showLine = lineEnabled(dataset, me.chart.options); - var i, ilen; - - // Update Line - if (showLine) { - // Compatibility: If the properties are defined with only the old name, use those values - if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { - dataset.lineTension = dataset.tension; - } - - // Utility - line._scale = scale; - line._datasetIndex = me.index; - // Data - line._children = points; - // Model - line._model = me._resolveLineOptions(line); - - line.pivot(); - } - - // Update Points - for (i = 0, ilen = points.length; i < ilen; ++i) { - me.updateElement(points[i], i, reset); - } - - if (showLine && line._model.tension !== 0) { - me.updateBezierControlPoints(); - } - - // Now pivot the point for animation - for (i = 0, ilen = points.length; i < ilen; ++i) { - points[i].pivot(); - } - }, - - updateElement: function(point, index, reset) { - var me = this; - var meta = me.getMeta(); - var custom = point.custom || {}; - var dataset = me.getDataset(); - var datasetIndex = me.index; - var value = dataset.data[index]; - var yScale = me.getScaleForId(meta.yAxisID); - var xScale = me.getScaleForId(meta.xAxisID); - var lineModel = meta.dataset._model; - var x, y; - - var options = me._resolvePointOptions(point, index); - - x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); - y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); - - // Utility - point._xScale = xScale; - point._yScale = yScale; - point._options = options; - point._datasetIndex = datasetIndex; - point._index = index; - - // Desired view properties - point._model = { - x: x, - y: y, - skip: custom.skip || isNaN(x) || isNaN(y), - // Appearance - radius: options.radius, - pointStyle: options.pointStyle, - rotation: options.rotation, - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0), - steppedLine: lineModel ? lineModel.steppedLine : false, - // Tooltip - hitRadius: options.hitRadius - }; - }, - - /** - * @private - */ - _resolvePointOptions: function(element, index) { - var me = this; - var chart = me.chart; - var dataset = chart.data.datasets[me.index]; - var custom = element.custom || {}; - var options = chart.options.elements.point; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var ELEMENT_OPTIONS = { - backgroundColor: 'pointBackgroundColor', - borderColor: 'pointBorderColor', - borderWidth: 'pointBorderWidth', - hitRadius: 'pointHitRadius', - hoverBackgroundColor: 'pointHoverBackgroundColor', - hoverBorderColor: 'pointHoverBorderColor', - hoverBorderWidth: 'pointHoverBorderWidth', - hoverRadius: 'pointHoverRadius', - pointStyle: 'pointStyle', - radius: 'pointRadius', - rotation: 'pointRotation' - }; - var keys = Object.keys(ELEMENT_OPTIONS); - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$4([ - custom[key], - dataset[ELEMENT_OPTIONS[key]], - dataset[key], - options[key] - ], context, index); - } - - return values; - }, - - /** - * @private - */ - _resolveLineOptions: function(element) { - var me = this; - var chart = me.chart; - var dataset = chart.data.datasets[me.index]; - var custom = element.custom || {}; - var options = chart.options; - var elementOptions = options.elements.line; - var values = {}; - var i, ilen, key; - - var keys = [ - 'backgroundColor', - 'borderWidth', - 'borderColor', - 'borderCapStyle', - 'borderDash', - 'borderDashOffset', - 'borderJoinStyle', - 'fill', - 'cubicInterpolationMode' - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$4([ - custom[key], - dataset[key], - elementOptions[key] - ]); - } - - // The default behavior of lines is to break at null values, according - // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 - // This option gives lines the ability to span gaps - values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps); - values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension); - values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]); - - return values; - }, - - calculatePointY: function(value, index, datasetIndex) { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var yScale = me.getScaleForId(meta.yAxisID); - var sumPos = 0; - var sumNeg = 0; - var i, ds, dsMeta; - - if (yScale.options.stacked) { - for (i = 0; i < datasetIndex; i++) { - ds = chart.data.datasets[i]; - dsMeta = chart.getDatasetMeta(i); - if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { - var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); - if (stackedRightValue < 0) { - sumNeg += stackedRightValue || 0; - } else { - sumPos += stackedRightValue || 0; - } - } - } - - var rightValue = Number(yScale.getRightValue(value)); - if (rightValue < 0) { - return yScale.getPixelForValue(sumNeg + rightValue); - } - return yScale.getPixelForValue(sumPos + rightValue); - } - - return yScale.getPixelForValue(value); - }, - - updateBezierControlPoints: function() { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var lineModel = meta.dataset._model; - var area = chart.chartArea; - var points = meta.data || []; - var i, ilen, model, controlPoints; - - // Only consider points that are drawn in case the spanGaps option is used - if (lineModel.spanGaps) { - points = points.filter(function(pt) { - return !pt._model.skip; - }); - } - - function capControlPoint(pt, min, max) { - return Math.max(Math.min(pt, max), min); - } - - if (lineModel.cubicInterpolationMode === 'monotone') { - helpers$1.splineCurveMonotone(points); - } else { - for (i = 0, ilen = points.length; i < ilen; ++i) { - model = points[i]._model; - controlPoints = helpers$1.splineCurve( - helpers$1.previousItem(points, i)._model, - model, - helpers$1.nextItem(points, i)._model, - lineModel.tension - ); - model.controlPointPreviousX = controlPoints.previous.x; - model.controlPointPreviousY = controlPoints.previous.y; - model.controlPointNextX = controlPoints.next.x; - model.controlPointNextY = controlPoints.next.y; - } - } - - if (chart.options.elements.line.capBezierPoints) { - for (i = 0, ilen = points.length; i < ilen; ++i) { - model = points[i]._model; - if (isPointInArea(model, area)) { - if (i > 0 && isPointInArea(points[i - 1]._model, area)) { - model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); - model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); - } - if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) { - model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); - model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); - } - } - } - } - }, - - draw: function() { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var points = meta.data || []; - var area = chart.chartArea; - var ilen = points.length; - var halfBorderWidth; - var i = 0; - - if (lineEnabled(me.getDataset(), chart.options)) { - halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2; - - helpers$1.canvas.clipArea(chart.ctx, { - left: area.left, - right: area.right, - top: area.top - halfBorderWidth, - bottom: area.bottom + halfBorderWidth - }); - - meta.dataset.draw(); - - helpers$1.canvas.unclipArea(chart.ctx); - } - - // Draw the points - for (; i < ilen; ++i) { - points[i].draw(area); - } - }, - - /** - * @protected - */ - setHoverStyle: function(point) { - var model = point._model; - var options = point._options; - var getHoverColor = helpers$1.getHoverColor; - - point.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - radius: model.radius - }; - - model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth); - model.radius = valueOrDefault$5(options.hoverRadius, options.radius); - }, -}); - -var resolve$5 = helpers$1.options.resolve; - -core_defaults._set('polarArea', { - scale: { - type: 'radialLinear', - angleLines: { - display: false - }, - gridLines: { - circular: true - }, - pointLabels: { - display: false - }, - ticks: { - beginAtZero: true - } - }, - - // Boolean - Whether to animate the rotation of the chart - animation: { - animateRotate: true, - animateScale: true - }, - - startAngle: -0.5 * Math.PI, - legendCallback: function(chart) { - var text = []; - text.push('
    '); - - var data = chart.data; - var datasets = data.datasets; - var labels = data.labels; - - if (datasets.length) { - for (var i = 0; i < datasets[0].data.length; ++i) { - text.push('
  • '); - if (labels[i]) { - text.push(labels[i]); - } - text.push('
  • '); - } - } - - text.push('
'); - return text.join(''); - }, - legend: { - labels: { - generateLabels: function(chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function(label, i) { - var meta = chart.getDatasetMeta(0); - var ds = data.datasets[0]; - var arc = meta.data[i]; - var custom = arc.custom || {}; - var arcOpts = chart.options.elements.arc; - var fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); - var stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); - var bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); - - return { - text: label, - fillStyle: fill, - strokeStyle: stroke, - lineWidth: bw, - hidden: isNaN(ds.data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }); - } - return []; - } - }, - - onClick: function(e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - meta.data[index].hidden = !meta.data[index].hidden; - } - - chart.update(); - } - }, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function() { - return ''; - }, - label: function(item, data) { - return data.labels[item.index] + ': ' + item.yLabel; - } - } - } -}); - -var controller_polarArea = core_datasetController.extend({ - - dataElementType: elements.Arc, - - linkScales: helpers$1.noop, - - update: function(reset) { - var me = this; - var dataset = me.getDataset(); - var meta = me.getMeta(); - var start = me.chart.options.startAngle || 0; - var starts = me._starts = []; - var angles = me._angles = []; - var arcs = meta.data; - var i, ilen, angle; - - me._updateRadius(); - - meta.count = me.countVisibleElements(); - - for (i = 0, ilen = dataset.data.length; i < ilen; i++) { - starts[i] = start; - angle = me._computeAngle(i); - angles[i] = angle; - start += angle; - } - - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - arcs[i]._options = me._resolveElementOptions(arcs[i], i); - me.updateElement(arcs[i], i, reset); - } - }, - - /** - * @private - */ - _updateRadius: function() { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); - - chart.outerRadius = Math.max(minSize / 2, 0); - chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); - chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); - - me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); - me.innerRadius = me.outerRadius - chart.radiusLength; - }, - - updateElement: function(arc, index, reset) { - var me = this; - var chart = me.chart; - var dataset = me.getDataset(); - var opts = chart.options; - var animationOpts = opts.animation; - var scale = chart.scale; - var labels = chart.data.labels; - - var centerX = scale.xCenter; - var centerY = scale.yCenter; - - // var negHalfPI = -0.5 * Math.PI; - var datasetStartAngle = opts.startAngle; - var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); - var startAngle = me._starts[index]; - var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]); - - var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); - var options = arc._options || {}; - - helpers$1.extend(arc, { - // Utility - _datasetIndex: me.index, - _index: index, - _scale: scale, - - // Desired view properties - _model: { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - borderAlign: options.borderAlign, - x: centerX, - y: centerY, - innerRadius: 0, - outerRadius: reset ? resetRadius : distance, - startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, - endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, - label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index]) - } - }); - - arc.pivot(); - }, - - countVisibleElements: function() { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var count = 0; - - helpers$1.each(meta.data, function(element, index) { - if (!isNaN(dataset.data[index]) && !element.hidden) { - count++; - } - }); - - return count; - }, - - /** - * @protected - */ - setHoverStyle: function(arc) { - var model = arc._model; - var options = arc._options; - var getHoverColor = helpers$1.getHoverColor; - var valueOrDefault = helpers$1.valueOrDefault; - - arc.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - }; - - model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth); - }, - - /** - * @private - */ - _resolveElementOptions: function(arc, index) { - var me = this; - var chart = me.chart; - var dataset = me.getDataset(); - var custom = arc.custom || {}; - var options = chart.options.elements.arc; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var keys = [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'borderAlign', - 'hoverBackgroundColor', - 'hoverBorderColor', - 'hoverBorderWidth', - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$5([ - custom[key], - dataset[key], - options[key] - ], context, index); - } - - return values; - }, - - /** - * @private - */ - _computeAngle: function(index) { - var me = this; - var count = this.getMeta().count; - var dataset = me.getDataset(); - var meta = me.getMeta(); - - if (isNaN(dataset.data[index]) || meta.data[index].hidden) { - return 0; - } - - // Scriptable options - var context = { - chart: me.chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - return resolve$5([ - me.chart.options.elements.arc.angle, - (2 * Math.PI) / count - ], context, index); - } -}); - -core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut)); -core_defaults._set('pie', { - cutoutPercentage: 0 -}); - -// Pie charts are Doughnut chart with different defaults -var controller_pie = controller_doughnut; - -var valueOrDefault$6 = helpers$1.valueOrDefault; -var resolve$6 = helpers$1.options.resolve; - -core_defaults._set('radar', { - scale: { - type: 'radialLinear' - }, - elements: { - line: { - tension: 0 // no bezier in radar - } - } -}); - -var controller_radar = core_datasetController.extend({ - - datasetElementType: elements.Line, - - dataElementType: elements.Point, - - linkScales: helpers$1.noop, - - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var line = meta.dataset; - var points = meta.data || []; - var scale = me.chart.scale; - var dataset = me.getDataset(); - var i, ilen; - - // Compatibility: If the properties are defined with only the old name, use those values - if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { - dataset.lineTension = dataset.tension; - } - - // Utility - line._scale = scale; - line._datasetIndex = me.index; - // Data - line._children = points; - line._loop = true; - // Model - line._model = me._resolveLineOptions(line); - - line.pivot(); - - // Update Points - for (i = 0, ilen = points.length; i < ilen; ++i) { - me.updateElement(points[i], i, reset); - } - - // Update bezier control points - me.updateBezierControlPoints(); - - // Now pivot the point for animation - for (i = 0, ilen = points.length; i < ilen; ++i) { - points[i].pivot(); - } - }, - - updateElement: function(point, index, reset) { - var me = this; - var custom = point.custom || {}; - var dataset = me.getDataset(); - var scale = me.chart.scale; - var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); - var options = me._resolvePointOptions(point, index); - var lineModel = me.getMeta().dataset._model; - var x = reset ? scale.xCenter : pointPosition.x; - var y = reset ? scale.yCenter : pointPosition.y; - - // Utility - point._scale = scale; - point._options = options; - point._datasetIndex = me.index; - point._index = index; - - // Desired view properties - point._model = { - x: x, // value not used in dataset scale, but we want a consistent API between scales - y: y, - skip: custom.skip || isNaN(x) || isNaN(y), - // Appearance - radius: options.radius, - pointStyle: options.pointStyle, - rotation: options.rotation, - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0), - - // Tooltip - hitRadius: options.hitRadius - }; - }, - - /** - * @private - */ - _resolvePointOptions: function(element, index) { - var me = this; - var chart = me.chart; - var dataset = chart.data.datasets[me.index]; - var custom = element.custom || {}; - var options = chart.options.elements.point; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var ELEMENT_OPTIONS = { - backgroundColor: 'pointBackgroundColor', - borderColor: 'pointBorderColor', - borderWidth: 'pointBorderWidth', - hitRadius: 'pointHitRadius', - hoverBackgroundColor: 'pointHoverBackgroundColor', - hoverBorderColor: 'pointHoverBorderColor', - hoverBorderWidth: 'pointHoverBorderWidth', - hoverRadius: 'pointHoverRadius', - pointStyle: 'pointStyle', - radius: 'pointRadius', - rotation: 'pointRotation' - }; - var keys = Object.keys(ELEMENT_OPTIONS); - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$6([ - custom[key], - dataset[ELEMENT_OPTIONS[key]], - dataset[key], - options[key] - ], context, index); - } - - return values; - }, - - /** - * @private - */ - _resolveLineOptions: function(element) { - var me = this; - var chart = me.chart; - var dataset = chart.data.datasets[me.index]; - var custom = element.custom || {}; - var options = chart.options.elements.line; - var values = {}; - var i, ilen, key; - - var keys = [ - 'backgroundColor', - 'borderWidth', - 'borderColor', - 'borderCapStyle', - 'borderDash', - 'borderDashOffset', - 'borderJoinStyle', - 'fill' - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve$6([ - custom[key], - dataset[key], - options[key] - ]); - } - - values.tension = valueOrDefault$6(dataset.lineTension, options.tension); - - return values; - }, - - updateBezierControlPoints: function() { - var me = this; - var meta = me.getMeta(); - var area = me.chart.chartArea; - var points = meta.data || []; - var i, ilen, model, controlPoints; - - function capControlPoint(pt, min, max) { - return Math.max(Math.min(pt, max), min); - } - - for (i = 0, ilen = points.length; i < ilen; ++i) { - model = points[i]._model; - controlPoints = helpers$1.splineCurve( - helpers$1.previousItem(points, i, true)._model, - model, - helpers$1.nextItem(points, i, true)._model, - model.tension - ); - - // Prevent the bezier going outside of the bounds of the graph - model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right); - model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom); - model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right); - model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom); - } - }, - - setHoverStyle: function(point) { - var model = point._model; - var options = point._options; - var getHoverColor = helpers$1.getHoverColor; - - point.$previousStyle = { - backgroundColor: model.backgroundColor, - borderColor: model.borderColor, - borderWidth: model.borderWidth, - radius: model.radius - }; - - model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); - model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor)); - model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth); - model.radius = valueOrDefault$6(options.hoverRadius, options.radius); - } -}); - -core_defaults._set('scatter', { - hover: { - mode: 'single' - }, - - scales: { - xAxes: [{ - id: 'x-axis-1', // need an ID so datasets can reference the scale - type: 'linear', // scatter should not use a category axis - position: 'bottom' - }], - yAxes: [{ - id: 'y-axis-1', - type: 'linear', - position: 'left' - }] - }, - - showLines: false, - - tooltips: { - callbacks: { - title: function() { - return ''; // doesn't make sense for scatter since data are formatted as a point - }, - label: function(item) { - return '(' + item.xLabel + ', ' + item.yLabel + ')'; - } - } - } -}); - -// Scatter charts use line controllers -var controller_scatter = controller_line; - -// NOTE export a map in which the key represents the controller type, not -// the class, and so must be CamelCase in order to be correctly retrieved -// by the controller in core.controller.js (`controllers[meta.type]`). - -var controllers = { - bar: controller_bar, - bubble: controller_bubble, - doughnut: controller_doughnut, - horizontalBar: controller_horizontalBar, - line: controller_line, - polarArea: controller_polarArea, - pie: controller_pie, - radar: controller_radar, - scatter: controller_scatter -}; - -/** - * Helper function to get relative position for an event - * @param {Event|IEvent} event - The event to get the position for - * @param {Chart} chart - The chart - * @returns {object} the event position - */ -function getRelativePosition(e, chart) { - if (e.native) { - return { - x: e.x, - y: e.y - }; - } - - return helpers$1.getRelativePosition(e, chart); -} - -/** - * Helper function to traverse all of the visible elements in the chart - * @param {Chart} chart - the chart - * @param {function} handler - the callback to execute for each visible item - */ -function parseVisibleItems(chart, handler) { - var datasets = chart.data.datasets; - var meta, i, j, ilen, jlen; - - for (i = 0, ilen = datasets.length; i < ilen; ++i) { - if (!chart.isDatasetVisible(i)) { - continue; - } - - meta = chart.getDatasetMeta(i); - for (j = 0, jlen = meta.data.length; j < jlen; ++j) { - var element = meta.data[j]; - if (!element._view.skip) { - handler(element); - } - } - } -} - -/** - * Helper function to get the items that intersect the event position - * @param {ChartElement[]} items - elements to filter - * @param {object} position - the point to be nearest to - * @return {ChartElement[]} the nearest items - */ -function getIntersectItems(chart, position) { - var elements = []; - - parseVisibleItems(chart, function(element) { - if (element.inRange(position.x, position.y)) { - elements.push(element); - } - }); - - return elements; -} - -/** - * Helper function to get the items nearest to the event position considering all visible items in teh chart - * @param {Chart} chart - the chart to look at elements from - * @param {object} position - the point to be nearest to - * @param {boolean} intersect - if true, only consider items that intersect the position - * @param {function} distanceMetric - function to provide the distance between points - * @return {ChartElement[]} the nearest items - */ -function getNearestItems(chart, position, intersect, distanceMetric) { - var minDistance = Number.POSITIVE_INFINITY; - var nearestItems = []; - - parseVisibleItems(chart, function(element) { - if (intersect && !element.inRange(position.x, position.y)) { - return; - } - - var center = element.getCenterPoint(); - var distance = distanceMetric(position, center); - if (distance < minDistance) { - nearestItems = [element]; - minDistance = distance; - } else if (distance === minDistance) { - // Can have multiple items at the same distance in which case we sort by size - nearestItems.push(element); - } - }); - - return nearestItems; -} - -/** - * Get a distance metric function for two points based on the - * axis mode setting - * @param {string} axis - the axis mode. x|y|xy - */ -function getDistanceMetricForAxis(axis) { - var useX = axis.indexOf('x') !== -1; - var useY = axis.indexOf('y') !== -1; - - return function(pt1, pt2) { - var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; - var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; - return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); - }; -} - -function indexMode(chart, e, options) { - var position = getRelativePosition(e, chart); - // Default axis for index mode is 'x' to match old behaviour - options.axis = options.axis || 'x'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); - var elements = []; - - if (!items.length) { - return []; - } - - chart.data.datasets.forEach(function(dataset, datasetIndex) { - if (chart.isDatasetVisible(datasetIndex)) { - var meta = chart.getDatasetMeta(datasetIndex); - var element = meta.data[items[0]._index]; - - // don't count items that are skipped (null data) - if (element && !element._view.skip) { - elements.push(element); - } - } - }); - - return elements; -} - -/** - * @interface IInteractionOptions - */ -/** - * If true, only consider items that intersect the point - * @name IInterfaceOptions#boolean - * @type Boolean - */ - -/** - * Contains interaction related functions - * @namespace Chart.Interaction - */ -var core_interaction = { - // Helper function for different modes - modes: { - single: function(chart, e) { - var position = getRelativePosition(e, chart); - var elements = []; - - parseVisibleItems(chart, function(element) { - if (element.inRange(position.x, position.y)) { - elements.push(element); - return elements; - } - }); - - return elements.slice(0, 1); - }, - - /** - * @function Chart.Interaction.modes.label - * @deprecated since version 2.4.0 - * @todo remove at version 3 - * @private - */ - label: indexMode, - - /** - * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something - * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item - * @function Chart.Interaction.modes.index - * @since v2.4.0 - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use during interaction - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - index: indexMode, - - /** - * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something - * If the options.intersect is false, we find the nearest item and return the items in that dataset - * @function Chart.Interaction.modes.dataset - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use during interaction - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - dataset: function(chart, e, options) { - var position = getRelativePosition(e, chart); - options.axis = options.axis || 'xy'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); - - if (items.length > 0) { - items = chart.getDatasetMeta(items[0]._datasetIndex).data; - } - - return items; - }, - - /** - * @function Chart.Interaction.modes.x-axis - * @deprecated since version 2.4.0. Use index mode and intersect == true - * @todo remove at version 3 - * @private - */ - 'x-axis': function(chart, e) { - return indexMode(chart, e, {intersect: false}); - }, - - /** - * Point mode returns all elements that hit test based on the event position - * of the event - * @function Chart.Interaction.modes.intersect - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - point: function(chart, e) { - var position = getRelativePosition(e, chart); - return getIntersectItems(chart, position); - }, - - /** - * nearest mode returns the element closest to the point - * @function Chart.Interaction.modes.intersect - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - nearest: function(chart, e, options) { - var position = getRelativePosition(e, chart); - options.axis = options.axis || 'xy'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - return getNearestItems(chart, position, options.intersect, distanceMetric); - }, - - /** - * x mode returns the elements that hit-test at the current x coordinate - * @function Chart.Interaction.modes.x - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - x: function(chart, e, options) { - var position = getRelativePosition(e, chart); - var items = []; - var intersectsItem = false; - - parseVisibleItems(chart, function(element) { - if (element.inXRange(position.x)) { - items.push(element); - } - - if (element.inRange(position.x, position.y)) { - intersectsItem = true; - } - }); - - // If we want to trigger on an intersect and we don't have any items - // that intersect the position, return nothing - if (options.intersect && !intersectsItem) { - items = []; - } - return items; - }, - - /** - * y mode returns the elements that hit-test at the current y coordinate - * @function Chart.Interaction.modes.y - * @param {Chart} chart - the chart we are returning items from - * @param {Event} e - the event we are find things at - * @param {IInteractionOptions} options - options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - y: function(chart, e, options) { - var position = getRelativePosition(e, chart); - var items = []; - var intersectsItem = false; - - parseVisibleItems(chart, function(element) { - if (element.inYRange(position.y)) { - items.push(element); - } - - if (element.inRange(position.x, position.y)) { - intersectsItem = true; - } - }); - - // If we want to trigger on an intersect and we don't have any items - // that intersect the position, return nothing - if (options.intersect && !intersectsItem) { - items = []; - } - return items; - } - } -}; - -function filterByPosition(array, position) { - return helpers$1.where(array, function(v) { - return v.position === position; - }); -} - -function sortByWeight(array, reverse) { - array.forEach(function(v, i) { - v._tmpIndex_ = i; - return v; - }); - array.sort(function(a, b) { - var v0 = reverse ? b : a; - var v1 = reverse ? a : b; - return v0.weight === v1.weight ? - v0._tmpIndex_ - v1._tmpIndex_ : - v0.weight - v1.weight; - }); - array.forEach(function(v) { - delete v._tmpIndex_; - }); -} - -function findMaxPadding(boxes) { - var top = 0; - var left = 0; - var bottom = 0; - var right = 0; - helpers$1.each(boxes, function(box) { - if (box.getPadding) { - var boxPadding = box.getPadding(); - top = Math.max(top, boxPadding.top); - left = Math.max(left, boxPadding.left); - bottom = Math.max(bottom, boxPadding.bottom); - right = Math.max(right, boxPadding.right); - } - }); - return { - top: top, - left: left, - bottom: bottom, - right: right - }; -} - -function addSizeByPosition(boxes, size) { - helpers$1.each(boxes, function(box) { - size[box.position] += box.isHorizontal() ? box.height : box.width; - }); -} - -core_defaults._set('global', { - layout: { - padding: { - top: 0, - right: 0, - bottom: 0, - left: 0 - } - } -}); - -/** - * @interface ILayoutItem - * @prop {string} position - The position of the item in the chart layout. Possible values are - * 'left', 'top', 'right', 'bottom', and 'chartArea' - * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area - * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down - * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) - * @prop {function} update - Takes two parameters: width and height. Returns size of item - * @prop {function} getPadding - Returns an object with padding on the edges - * @prop {number} width - Width of item. Must be valid after update() - * @prop {number} height - Height of item. Must be valid after update() - * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update - * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update - * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update - * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update - */ - -// The layout service is very self explanatory. It's responsible for the layout within a chart. -// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need -// It is this service's responsibility of carrying out that layout. -var core_layouts = { - defaults: {}, - - /** - * Register a box to a chart. - * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. - * @param {Chart} chart - the chart to use - * @param {ILayoutItem} item - the item to add to be layed out - */ - addBox: function(chart, item) { - if (!chart.boxes) { - chart.boxes = []; - } - - // initialize item with default values - item.fullWidth = item.fullWidth || false; - item.position = item.position || 'top'; - item.weight = item.weight || 0; - - chart.boxes.push(item); - }, - - /** - * Remove a layoutItem from a chart - * @param {Chart} chart - the chart to remove the box from - * @param {ILayoutItem} layoutItem - the item to remove from the layout - */ - removeBox: function(chart, layoutItem) { - var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; - if (index !== -1) { - chart.boxes.splice(index, 1); - } - }, - - /** - * Sets (or updates) options on the given `item`. - * @param {Chart} chart - the chart in which the item lives (or will be added to) - * @param {ILayoutItem} item - the item to configure with the given options - * @param {object} options - the new item options. - */ - configure: function(chart, item, options) { - var props = ['fullWidth', 'position', 'weight']; - var ilen = props.length; - var i = 0; - var prop; - - for (; i < ilen; ++i) { - prop = props[i]; - if (options.hasOwnProperty(prop)) { - item[prop] = options[prop]; - } - } - }, - - /** - * Fits boxes of the given chart into the given size by having each box measure itself - * then running a fitting algorithm - * @param {Chart} chart - the chart - * @param {number} width - the width to fit into - * @param {number} height - the height to fit into - */ - update: function(chart, width, height) { - if (!chart) { - return; - } - - var layoutOptions = chart.options.layout || {}; - var padding = helpers$1.options.toPadding(layoutOptions.padding); - var leftPadding = padding.left; - var rightPadding = padding.right; - var topPadding = padding.top; - var bottomPadding = padding.bottom; - - var leftBoxes = filterByPosition(chart.boxes, 'left'); - var rightBoxes = filterByPosition(chart.boxes, 'right'); - var topBoxes = filterByPosition(chart.boxes, 'top'); - var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); - var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); - - // Sort boxes by weight. A higher weight is further away from the chart area - sortByWeight(leftBoxes, true); - sortByWeight(rightBoxes, false); - sortByWeight(topBoxes, true); - sortByWeight(bottomBoxes, false); - - var verticalBoxes = leftBoxes.concat(rightBoxes); - var horizontalBoxes = topBoxes.concat(bottomBoxes); - var outerBoxes = verticalBoxes.concat(horizontalBoxes); - - // Essentially we now have any number of boxes on each of the 4 sides. - // Our canvas looks like the following. - // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and - // B1 is the bottom axis - // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays - // These locations are single-box locations only, when trying to register a chartArea location that is already taken, - // an error will be thrown. - // - // |----------------------------------------------------| - // | T1 (Full Width) | - // |----------------------------------------------------| - // | | | T2 | | - // | |----|-------------------------------------|----| - // | | | C1 | | C2 | | - // | | |----| |----| | - // | | | | | - // | L1 | L2 | ChartArea (C0) | R1 | - // | | | | | - // | | |----| |----| | - // | | | C3 | | C4 | | - // | |----|-------------------------------------|----| - // | | | B1 | | - // |----------------------------------------------------| - // | B2 (Full Width) | - // |----------------------------------------------------| - // - // What we do to find the best sizing, we do the following - // 1. Determine the minimum size of the chart area. - // 2. Split the remaining width equally between each vertical axis - // 3. Split the remaining height equally between each horizontal axis - // 4. Give each layout the maximum size it can be. The layout will return it's minimum size - // 5. Adjust the sizes of each axis based on it's minimum reported size. - // 6. Refit each axis - // 7. Position each axis in the final location - // 8. Tell the chart the final location of the chart area - // 9. Tell any axes that overlay the chart area the positions of the chart area - - // Step 1 - var chartWidth = width - leftPadding - rightPadding; - var chartHeight = height - topPadding - bottomPadding; - var chartAreaWidth = chartWidth / 2; // min 50% - - // Step 2 - var verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length; - - // Step 3 - // TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837) - // var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length; - - // Step 4 - var maxChartAreaWidth = chartWidth; - var maxChartAreaHeight = chartHeight; - var outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; - var minBoxSizes = []; - var maxPadding; - - function getMinimumBoxSize(box) { - var minSize; - var isHorizontal = box.isHorizontal(); - - if (isHorizontal) { - minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2); - maxChartAreaHeight -= minSize.height; - } else { - minSize = box.update(verticalBoxWidth, maxChartAreaHeight); - maxChartAreaWidth -= minSize.width; - } - - minBoxSizes.push({ - horizontal: isHorizontal, - width: minSize.width, - box: box, - }); - } - - helpers$1.each(outerBoxes, getMinimumBoxSize); - - // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) - maxPadding = findMaxPadding(outerBoxes); - - // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could - // be if the axes are drawn at their minimum sizes. - // Steps 5 & 6 - - // Function to fit a box - function fitBox(box) { - var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minBox) { - return minBox.box === box; - }); - - if (minBoxSize) { - if (minBoxSize.horizontal) { - var scaleMargin = { - left: Math.max(outerBoxSizes.left, maxPadding.left), - right: Math.max(outerBoxSizes.right, maxPadding.right), - top: 0, - bottom: 0 - }; - - // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends - // on the margin. Sometimes they need to increase in size slightly - box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); - } else { - box.update(minBoxSize.width, maxChartAreaHeight); - } - } - } - - // Update, and calculate the left and right margins for the horizontal boxes - helpers$1.each(verticalBoxes, fitBox); - addSizeByPosition(verticalBoxes, outerBoxSizes); - - // Set the Left and Right margins for the horizontal boxes - helpers$1.each(horizontalBoxes, fitBox); - addSizeByPosition(horizontalBoxes, outerBoxSizes); - - function finalFitVerticalBox(box) { - var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minSize) { - return minSize.box === box; - }); - - var scaleMargin = { - left: 0, - right: 0, - top: outerBoxSizes.top, - bottom: outerBoxSizes.bottom - }; - - if (minBoxSize) { - box.update(minBoxSize.width, maxChartAreaHeight, scaleMargin); - } - } - - // Let the left layout know the final margin - helpers$1.each(verticalBoxes, finalFitVerticalBox); - - // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) - outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding}; - addSizeByPosition(outerBoxes, outerBoxSizes); - - // We may be adding some padding to account for rotated x axis labels - var leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0); - outerBoxSizes.left += leftPaddingAddition; - outerBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0); - - var topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0); - outerBoxSizes.top += topPaddingAddition; - outerBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 0); - - // Figure out if our chart area changed. This would occur if the dataset layout label rotation - // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do - // without calling `fit` again - var newMaxChartAreaHeight = height - outerBoxSizes.top - outerBoxSizes.bottom; - var newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right; - - if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { - helpers$1.each(verticalBoxes, function(box) { - box.height = newMaxChartAreaHeight; - }); - - helpers$1.each(horizontalBoxes, function(box) { - if (!box.fullWidth) { - box.width = newMaxChartAreaWidth; - } - }); - - maxChartAreaHeight = newMaxChartAreaHeight; - maxChartAreaWidth = newMaxChartAreaWidth; - } - - // Step 7 - Position the boxes - var left = leftPadding + leftPaddingAddition; - var top = topPadding + topPaddingAddition; - - function placeBox(box) { - if (box.isHorizontal()) { - box.left = box.fullWidth ? leftPadding : outerBoxSizes.left; - box.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + maxChartAreaWidth; - box.top = top; - box.bottom = top + box.height; - - // Move to next point - top = box.bottom; - - } else { - - box.left = left; - box.right = left + box.width; - box.top = outerBoxSizes.top; - box.bottom = outerBoxSizes.top + maxChartAreaHeight; - - // Move to next point - left = box.right; - } - } - - helpers$1.each(leftBoxes.concat(topBoxes), placeBox); - - // Account for chart width and height - left += maxChartAreaWidth; - top += maxChartAreaHeight; - - helpers$1.each(rightBoxes, placeBox); - helpers$1.each(bottomBoxes, placeBox); - - // Step 8 - chart.chartArea = { - left: outerBoxSizes.left, - top: outerBoxSizes.top, - right: outerBoxSizes.left + maxChartAreaWidth, - bottom: outerBoxSizes.top + maxChartAreaHeight - }; - - // Step 9 - helpers$1.each(chartAreaBoxes, function(box) { - box.left = chart.chartArea.left; - box.top = chart.chartArea.top; - box.right = chart.chartArea.right; - box.bottom = chart.chartArea.bottom; - - box.update(maxChartAreaWidth, maxChartAreaHeight); - }); - } -}; - -/** - * Platform fallback implementation (minimal). - * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 - */ - -var platform_basic = { - acquireContext: function(item) { - if (item && item.canvas) { - // Support for any object associated to a canvas (including a context2d) - item = item.canvas; - } - - return item && item.getContext('2d') || null; - } -}; - -var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n"; - -var platform_dom$1 = /*#__PURE__*/Object.freeze({ -default: platform_dom -}); - -function getCjsExportFromNamespace (n) { - return n && n.default || n; -} - -var stylesheet = getCjsExportFromNamespace(platform_dom$1); - -var EXPANDO_KEY = '$chartjs'; -var CSS_PREFIX = 'chartjs-'; -var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor'; -var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; -var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; -var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; - -/** - * DOM event types -> Chart.js event types. - * Note: only events with different types are mapped. - * @see https://developer.mozilla.org/en-US/docs/Web/Events - */ -var EVENT_TYPES = { - touchstart: 'mousedown', - touchmove: 'mousemove', - touchend: 'mouseup', - pointerenter: 'mouseenter', - pointerdown: 'mousedown', - pointermove: 'mousemove', - pointerup: 'mouseup', - pointerleave: 'mouseout', - pointerout: 'mouseout' -}; - -/** - * The "used" size is the final value of a dimension property after all calculations have - * been performed. This method uses the computed style of `element` but returns undefined - * if the computed style is not expressed in pixels. That can happen in some cases where - * `element` has a size relative to its parent and this last one is not yet displayed, - * for example because of `display: none` on a parent node. - * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value - * @returns {number} Size in pixels or undefined if unknown. - */ -function readUsedSize(element, property) { - var value = helpers$1.getStyle(element, property); - var matches = value && value.match(/^(\d+)(\.\d+)?px$/); - return matches ? Number(matches[1]) : undefined; -} - -/** - * Initializes the canvas style and render size without modifying the canvas display size, - * since responsiveness is handled by the controller.resize() method. The config is used - * to determine the aspect ratio to apply in case no explicit height has been specified. - */ -function initCanvas(canvas, config) { - var style = canvas.style; - - // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it - // returns null or '' if no explicit value has been set to the canvas attribute. - var renderHeight = canvas.getAttribute('height'); - var renderWidth = canvas.getAttribute('width'); - - // Chart.js modifies some canvas values that we want to restore on destroy - canvas[EXPANDO_KEY] = { - initial: { - height: renderHeight, - width: renderWidth, - style: { - display: style.display, - height: style.height, - width: style.width - } - } - }; - - // Force canvas to display as block to avoid extra space caused by inline - // elements, which would interfere with the responsive resize process. - // https://github.com/chartjs/Chart.js/issues/2538 - style.display = style.display || 'block'; - - if (renderWidth === null || renderWidth === '') { - var displayWidth = readUsedSize(canvas, 'width'); - if (displayWidth !== undefined) { - canvas.width = displayWidth; - } - } - - if (renderHeight === null || renderHeight === '') { - if (canvas.style.height === '') { - // If no explicit render height and style height, let's apply the aspect ratio, - // which one can be specified by the user but also by charts as default option - // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. - canvas.height = canvas.width / (config.options.aspectRatio || 2); - } else { - var displayHeight = readUsedSize(canvas, 'height'); - if (displayWidth !== undefined) { - canvas.height = displayHeight; - } - } - } - - return canvas; -} - -/** - * Detects support for options object argument in addEventListener. - * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support - * @private - */ -var supportsEventListenerOptions = (function() { - var supports = false; - try { - var options = Object.defineProperty({}, 'passive', { - // eslint-disable-next-line getter-return - get: function() { - supports = true; - } - }); - window.addEventListener('e', null, options); - } catch (e) { - // continue regardless of error - } - return supports; -}()); - -// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. -// https://github.com/chartjs/Chart.js/issues/4287 -var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; - -function addListener(node, type, listener) { - node.addEventListener(type, listener, eventListenerOptions); -} - -function removeListener(node, type, listener) { - node.removeEventListener(type, listener, eventListenerOptions); -} - -function createEvent(type, chart, x, y, nativeEvent) { - return { - type: type, - chart: chart, - native: nativeEvent || null, - x: x !== undefined ? x : null, - y: y !== undefined ? y : null, - }; -} - -function fromNativeEvent(event, chart) { - var type = EVENT_TYPES[event.type] || event.type; - var pos = helpers$1.getRelativePosition(event, chart); - return createEvent(type, chart, pos.x, pos.y, event); -} - -function throttled(fn, thisArg) { - var ticking = false; - var args = []; - - return function() { - args = Array.prototype.slice.call(arguments); - thisArg = thisArg || this; - - if (!ticking) { - ticking = true; - helpers$1.requestAnimFrame.call(window, function() { - ticking = false; - fn.apply(thisArg, args); - }); - } - }; -} - -function createDiv(cls) { - var el = document.createElement('div'); - el.className = cls || ''; - return el; -} - -// Implementation based on https://github.com/marcj/css-element-queries -function createResizer(handler) { - var maxSize = 1000000; - - // NOTE(SB) Don't use innerHTML because it could be considered unsafe. - // https://github.com/chartjs/Chart.js/issues/5902 - var resizer = createDiv(CSS_SIZE_MONITOR); - var expand = createDiv(CSS_SIZE_MONITOR + '-expand'); - var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink'); - - expand.appendChild(createDiv()); - shrink.appendChild(createDiv()); - - resizer.appendChild(expand); - resizer.appendChild(shrink); - resizer._reset = function() { - expand.scrollLeft = maxSize; - expand.scrollTop = maxSize; - shrink.scrollLeft = maxSize; - shrink.scrollTop = maxSize; - }; - - var onScroll = function() { - resizer._reset(); - handler(); - }; - - addListener(expand, 'scroll', onScroll.bind(expand, 'expand')); - addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); - - return resizer; -} - -// https://davidwalsh.name/detect-node-insertion -function watchForRender(node, handler) { - var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); - var proxy = expando.renderProxy = function(e) { - if (e.animationName === CSS_RENDER_ANIMATION) { - handler(); - } - }; - - helpers$1.each(ANIMATION_START_EVENTS, function(type) { - addListener(node, type, proxy); - }); - - // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class - // is removed then added back immediately (same animation frame?). Accessing the - // `offsetParent` property will force a reflow and re-evaluate the CSS animation. - // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics - // https://github.com/chartjs/Chart.js/issues/4737 - expando.reflow = !!node.offsetParent; - - node.classList.add(CSS_RENDER_MONITOR); -} - -function unwatchForRender(node) { - var expando = node[EXPANDO_KEY] || {}; - var proxy = expando.renderProxy; - - if (proxy) { - helpers$1.each(ANIMATION_START_EVENTS, function(type) { - removeListener(node, type, proxy); - }); - - delete expando.renderProxy; - } - - node.classList.remove(CSS_RENDER_MONITOR); -} - -function addResizeListener(node, listener, chart) { - var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); - - // Let's keep track of this added resizer and thus avoid DOM query when removing it. - var resizer = expando.resizer = createResizer(throttled(function() { - if (expando.resizer) { - var container = chart.options.maintainAspectRatio && node.parentNode; - var w = container ? container.clientWidth : 0; - listener(createEvent('resize', chart)); - if (container && container.clientWidth < w && chart.canvas) { - // If the container size shrank during chart resize, let's assume - // scrollbar appeared. So we resize again with the scrollbar visible - - // effectively making chart smaller and the scrollbar hidden again. - // Because we are inside `throttled`, and currently `ticking`, scroll - // events are ignored during this whole 2 resize process. - // If we assumed wrong and something else happened, we are resizing - // twice in a frame (potential performance issue) - listener(createEvent('resize', chart)); - } - } - })); - - // The resizer needs to be attached to the node parent, so we first need to be - // sure that `node` is attached to the DOM before injecting the resizer element. - watchForRender(node, function() { - if (expando.resizer) { - var container = node.parentNode; - if (container && container !== resizer.parentNode) { - container.insertBefore(resizer, container.firstChild); - } - - // The container size might have changed, let's reset the resizer state. - resizer._reset(); - } - }); -} - -function removeResizeListener(node) { - var expando = node[EXPANDO_KEY] || {}; - var resizer = expando.resizer; - - delete expando.resizer; - unwatchForRender(node); - - if (resizer && resizer.parentNode) { - resizer.parentNode.removeChild(resizer); - } -} - -function injectCSS(platform, css) { - // https://stackoverflow.com/q/3922139 - var style = platform._style || document.createElement('style'); - if (!platform._style) { - platform._style = style; - css = '/* Chart.js */\n' + css; - style.setAttribute('type', 'text/css'); - document.getElementsByTagName('head')[0].appendChild(style); - } - - style.appendChild(document.createTextNode(css)); -} - -var platform_dom$2 = { - /** - * When `true`, prevents the automatic injection of the stylesheet required to - * correctly detect when the chart is added to the DOM and then resized. This - * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`) - * to be manually imported to make this library compatible with any CSP. - * See https://github.com/chartjs/Chart.js/issues/5208 - */ - disableCSSInjection: false, - - /** - * This property holds whether this platform is enabled for the current environment. - * Currently used by platform.js to select the proper implementation. - * @private - */ - _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', - - /** - * @private - */ - _ensureLoaded: function() { - if (this._loaded) { - return; - } - - this._loaded = true; - - // https://github.com/chartjs/Chart.js/issues/5208 - if (!this.disableCSSInjection) { - injectCSS(this, stylesheet); - } - }, - - acquireContext: function(item, config) { - if (typeof item === 'string') { - item = document.getElementById(item); - } else if (item.length) { - // Support for array based queries (such as jQuery) - item = item[0]; - } - - if (item && item.canvas) { - // Support for any object associated to a canvas (including a context2d) - item = item.canvas; - } - - // To prevent canvas fingerprinting, some add-ons undefine the getContext - // method, for example: https://github.com/kkapsner/CanvasBlocker - // https://github.com/chartjs/Chart.js/issues/2807 - var context = item && item.getContext && item.getContext('2d'); - - // Load platform resources on first chart creation, to make possible to change - // platform options after importing the library (e.g. `disableCSSInjection`). - this._ensureLoaded(); - - // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is - // inside an iframe or when running in a protected environment. We could guess the - // types from their toString() value but let's keep things flexible and assume it's - // a sufficient condition if the item has a context2D which has item as `canvas`. - // https://github.com/chartjs/Chart.js/issues/3887 - // https://github.com/chartjs/Chart.js/issues/4102 - // https://github.com/chartjs/Chart.js/issues/4152 - if (context && context.canvas === item) { - initCanvas(item, config); - return context; - } - - return null; - }, - - releaseContext: function(context) { - var canvas = context.canvas; - if (!canvas[EXPANDO_KEY]) { - return; - } - - var initial = canvas[EXPANDO_KEY].initial; - ['height', 'width'].forEach(function(prop) { - var value = initial[prop]; - if (helpers$1.isNullOrUndef(value)) { - canvas.removeAttribute(prop); - } else { - canvas.setAttribute(prop, value); - } - }); - - helpers$1.each(initial.style || {}, function(value, key) { - canvas.style[key] = value; - }); - - // The canvas render size might have been changed (and thus the state stack discarded), - // we can't use save() and restore() to restore the initial state. So make sure that at - // least the canvas context is reset to the default state by setting the canvas width. - // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html - // eslint-disable-next-line no-self-assign - canvas.width = canvas.width; - - delete canvas[EXPANDO_KEY]; - }, - - addEventListener: function(chart, type, listener) { - var canvas = chart.canvas; - if (type === 'resize') { - // Note: the resize event is not supported on all browsers. - addResizeListener(canvas, listener, chart); - return; - } - - var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); - var proxies = expando.proxies || (expando.proxies = {}); - var proxy = proxies[chart.id + '_' + type] = function(event) { - listener(fromNativeEvent(event, chart)); - }; - - addListener(canvas, type, proxy); - }, - - removeEventListener: function(chart, type, listener) { - var canvas = chart.canvas; - if (type === 'resize') { - // Note: the resize event is not supported on all browsers. - removeResizeListener(canvas); - return; - } - - var expando = listener[EXPANDO_KEY] || {}; - var proxies = expando.proxies || {}; - var proxy = proxies[chart.id + '_' + type]; - if (!proxy) { - return; - } - - removeListener(canvas, type, proxy); - } -}; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use EventTarget.addEventListener instead. - * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ - * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener - * @function Chart.helpers.addEvent - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers$1.addEvent = addListener; - -/** - * Provided for backward compatibility, use EventTarget.removeEventListener instead. - * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ - * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener - * @function Chart.helpers.removeEvent - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ -helpers$1.removeEvent = removeListener; - -// @TODO Make possible to select another platform at build time. -var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic; - -/** - * @namespace Chart.platform - * @see https://chartjs.gitbooks.io/proposals/content/Platform.html - * @since 2.4.0 - */ -var platform = helpers$1.extend({ - /** - * @since 2.7.0 - */ - initialize: function() {}, - - /** - * Called at chart construction time, returns a context2d instance implementing - * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. - * @param {*} item - The native item from which to acquire context (platform specific) - * @param {object} options - The chart options - * @returns {CanvasRenderingContext2D} context2d instance - */ - acquireContext: function() {}, - - /** - * Called at chart destruction time, releases any resources associated to the context - * previously returned by the acquireContext() method. - * @param {CanvasRenderingContext2D} context - The context2d instance - * @returns {boolean} true if the method succeeded, else false - */ - releaseContext: function() {}, - - /** - * Registers the specified listener on the given chart. - * @param {Chart} chart - Chart from which to listen for event - * @param {string} type - The ({@link IEvent}) type to listen for - * @param {function} listener - Receives a notification (an object that implements - * the {@link IEvent} interface) when an event of the specified type occurs. - */ - addEventListener: function() {}, - - /** - * Removes the specified listener previously registered with addEventListener. - * @param {Chart} chart - Chart from which to remove the listener - * @param {string} type - The ({@link IEvent}) type to remove - * @param {function} listener - The listener function to remove from the event target. - */ - removeEventListener: function() {} - -}, implementation); - -core_defaults._set('global', { - plugins: {} -}); - -/** - * The plugin service singleton - * @namespace Chart.plugins - * @since 2.1.0 - */ -var core_plugins = { - /** - * Globally registered plugins. - * @private - */ - _plugins: [], - - /** - * This identifier is used to invalidate the descriptors cache attached to each chart - * when a global plugin is registered or unregistered. In this case, the cache ID is - * incremented and descriptors are regenerated during following API calls. - * @private - */ - _cacheId: 0, - - /** - * Registers the given plugin(s) if not already registered. - * @param {IPlugin[]|IPlugin} plugins plugin instance(s). - */ - register: function(plugins) { - var p = this._plugins; - ([]).concat(plugins).forEach(function(plugin) { - if (p.indexOf(plugin) === -1) { - p.push(plugin); - } - }); - - this._cacheId++; - }, - - /** - * Unregisters the given plugin(s) only if registered. - * @param {IPlugin[]|IPlugin} plugins plugin instance(s). - */ - unregister: function(plugins) { - var p = this._plugins; - ([]).concat(plugins).forEach(function(plugin) { - var idx = p.indexOf(plugin); - if (idx !== -1) { - p.splice(idx, 1); - } - }); - - this._cacheId++; - }, - - /** - * Remove all registered plugins. - * @since 2.1.5 - */ - clear: function() { - this._plugins = []; - this._cacheId++; - }, - - /** - * Returns the number of registered plugins? - * @returns {number} - * @since 2.1.5 - */ - count: function() { - return this._plugins.length; - }, - - /** - * Returns all registered plugin instances. - * @returns {IPlugin[]} array of plugin objects. - * @since 2.1.5 - */ - getAll: function() { - return this._plugins; - }, - - /** - * Calls enabled plugins for `chart` on the specified hook and with the given args. - * This method immediately returns as soon as a plugin explicitly returns false. The - * returned value can be used, for instance, to interrupt the current action. - * @param {Chart} chart - The chart instance for which plugins should be called. - * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). - * @param {Array} [args] - Extra arguments to apply to the hook call. - * @returns {boolean} false if any of the plugins return false, else returns true. - */ - notify: function(chart, hook, args) { - var descriptors = this.descriptors(chart); - var ilen = descriptors.length; - var i, descriptor, plugin, params, method; - - for (i = 0; i < ilen; ++i) { - descriptor = descriptors[i]; - plugin = descriptor.plugin; - method = plugin[hook]; - if (typeof method === 'function') { - params = [chart].concat(args || []); - params.push(descriptor.options); - if (method.apply(plugin, params) === false) { - return false; - } - } - } - - return true; - }, - - /** - * Returns descriptors of enabled plugins for the given chart. - * @returns {object[]} [{ plugin, options }] - * @private - */ - descriptors: function(chart) { - var cache = chart.$plugins || (chart.$plugins = {}); - if (cache.id === this._cacheId) { - return cache.descriptors; - } - - var plugins = []; - var descriptors = []; - var config = (chart && chart.config) || {}; - var options = (config.options && config.options.plugins) || {}; - - this._plugins.concat(config.plugins || []).forEach(function(plugin) { - var idx = plugins.indexOf(plugin); - if (idx !== -1) { - return; - } - - var id = plugin.id; - var opts = options[id]; - if (opts === false) { - return; - } - - if (opts === true) { - opts = helpers$1.clone(core_defaults.global.plugins[id]); - } - - plugins.push(plugin); - descriptors.push({ - plugin: plugin, - options: opts || {} - }); - }); - - cache.descriptors = descriptors; - cache.id = this._cacheId; - return descriptors; - }, - - /** - * Invalidates cache for the given chart: descriptors hold a reference on plugin option, - * but in some cases, this reference can be changed by the user when updating options. - * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 - * @private - */ - _invalidate: function(chart) { - delete chart.$plugins; - } -}; - -var core_scaleService = { - // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then - // use the new chart options to grab the correct scale - constructors: {}, - // Use a registration function so that we can move to an ES6 map when we no longer need to support - // old browsers - - // Scale config defaults - defaults: {}, - registerScaleType: function(type, scaleConstructor, scaleDefaults) { - this.constructors[type] = scaleConstructor; - this.defaults[type] = helpers$1.clone(scaleDefaults); - }, - getScaleConstructor: function(type) { - return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; - }, - getScaleDefaults: function(type) { - // Return the scale defaults merged with the global settings so that we always use the latest ones - return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {}; - }, - updateScaleDefaults: function(type, additions) { - var me = this; - if (me.defaults.hasOwnProperty(type)) { - me.defaults[type] = helpers$1.extend(me.defaults[type], additions); - } - }, - addScalesToLayout: function(chart) { - // Adds each scale to the chart.boxes array to be sized accordingly - helpers$1.each(chart.scales, function(scale) { - // Set ILayoutItem parameters for backwards compatibility - scale.fullWidth = scale.options.fullWidth; - scale.position = scale.options.position; - scale.weight = scale.options.weight; - core_layouts.addBox(chart, scale); - }); - } -}; - -var valueOrDefault$7 = helpers$1.valueOrDefault; - -core_defaults._set('global', { - tooltips: { - enabled: true, - custom: null, - mode: 'nearest', - position: 'average', - intersect: true, - backgroundColor: 'rgba(0,0,0,0.8)', - titleFontStyle: 'bold', - titleSpacing: 2, - titleMarginBottom: 6, - titleFontColor: '#fff', - titleAlign: 'left', - bodySpacing: 2, - bodyFontColor: '#fff', - bodyAlign: 'left', - footerFontStyle: 'bold', - footerSpacing: 2, - footerMarginTop: 6, - footerFontColor: '#fff', - footerAlign: 'left', - yPadding: 6, - xPadding: 6, - caretPadding: 2, - caretSize: 5, - cornerRadius: 6, - multiKeyBackground: '#fff', - displayColors: true, - borderColor: 'rgba(0,0,0,0)', - borderWidth: 0, - callbacks: { - // Args are: (tooltipItems, data) - beforeTitle: helpers$1.noop, - title: function(tooltipItems, data) { - var title = ''; - var labels = data.labels; - var labelCount = labels ? labels.length : 0; - - if (tooltipItems.length > 0) { - var item = tooltipItems[0]; - if (item.label) { - title = item.label; - } else if (item.xLabel) { - title = item.xLabel; - } else if (labelCount > 0 && item.index < labelCount) { - title = labels[item.index]; - } - } - - return title; - }, - afterTitle: helpers$1.noop, - - // Args are: (tooltipItems, data) - beforeBody: helpers$1.noop, - - // Args are: (tooltipItem, data) - beforeLabel: helpers$1.noop, - label: function(tooltipItem, data) { - var label = data.datasets[tooltipItem.datasetIndex].label || ''; - - if (label) { - label += ': '; - } - if (!helpers$1.isNullOrUndef(tooltipItem.value)) { - label += tooltipItem.value; - } else { - label += tooltipItem.yLabel; - } - return label; - }, - labelColor: function(tooltipItem, chart) { - var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); - var activeElement = meta.data[tooltipItem.index]; - var view = activeElement._view; - return { - borderColor: view.borderColor, - backgroundColor: view.backgroundColor - }; - }, - labelTextColor: function() { - return this._options.bodyFontColor; - }, - afterLabel: helpers$1.noop, - - // Args are: (tooltipItems, data) - afterBody: helpers$1.noop, - - // Args are: (tooltipItems, data) - beforeFooter: helpers$1.noop, - footer: helpers$1.noop, - afterFooter: helpers$1.noop - } - } -}); - -var positioners = { - /** - * Average mode places the tooltip at the average position of the elements shown - * @function Chart.Tooltip.positioners.average - * @param elements {ChartElement[]} the elements being displayed in the tooltip - * @returns {object} tooltip position - */ - average: function(elements) { - if (!elements.length) { - return false; - } - - var i, len; - var x = 0; - var y = 0; - var count = 0; - - for (i = 0, len = elements.length; i < len; ++i) { - var el = elements[i]; - if (el && el.hasValue()) { - var pos = el.tooltipPosition(); - x += pos.x; - y += pos.y; - ++count; - } - } - - return { - x: x / count, - y: y / count - }; - }, - - /** - * Gets the tooltip position nearest of the item nearest to the event position - * @function Chart.Tooltip.positioners.nearest - * @param elements {Chart.Element[]} the tooltip elements - * @param eventPosition {object} the position of the event in canvas coordinates - * @returns {object} the tooltip position - */ - nearest: function(elements, eventPosition) { - var x = eventPosition.x; - var y = eventPosition.y; - var minDistance = Number.POSITIVE_INFINITY; - var i, len, nearestElement; - - for (i = 0, len = elements.length; i < len; ++i) { - var el = elements[i]; - if (el && el.hasValue()) { - var center = el.getCenterPoint(); - var d = helpers$1.distanceBetweenPoints(eventPosition, center); - - if (d < minDistance) { - minDistance = d; - nearestElement = el; - } - } - } - - if (nearestElement) { - var tp = nearestElement.tooltipPosition(); - x = tp.x; - y = tp.y; - } - - return { - x: x, - y: y - }; - } -}; - -// Helper to push or concat based on if the 2nd parameter is an array or not -function pushOrConcat(base, toPush) { - if (toPush) { - if (helpers$1.isArray(toPush)) { - // base = base.concat(toPush); - Array.prototype.push.apply(base, toPush); - } else { - base.push(toPush); - } - } - - return base; -} - -/** - * Returns array of strings split by newline - * @param {string} value - The value to split by newline. - * @returns {string[]} value if newline present - Returned from String split() method - * @function - */ -function splitNewlines(str) { - if ((typeof str === 'string' || str instanceof String) && str.indexOf('\n') > -1) { - return str.split('\n'); - } - return str; -} - - -/** - * Private helper to create a tooltip item model - * @param element - the chart element (point, arc, bar) to create the tooltip item for - * @return new tooltip item - */ -function createTooltipItem(element) { - var xScale = element._xScale; - var yScale = element._yScale || element._scale; // handle radar || polarArea charts - var index = element._index; - var datasetIndex = element._datasetIndex; - var controller = element._chart.getDatasetMeta(datasetIndex).controller; - var indexScale = controller._getIndexScale(); - var valueScale = controller._getValueScale(); - - return { - xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', - yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', - label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '', - value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '', - index: index, - datasetIndex: datasetIndex, - x: element._model.x, - y: element._model.y - }; -} - -/** - * Helper to get the reset model for the tooltip - * @param tooltipOpts {object} the tooltip options - */ -function getBaseModel(tooltipOpts) { - var globalDefaults = core_defaults.global; - - return { - // Positioning - xPadding: tooltipOpts.xPadding, - yPadding: tooltipOpts.yPadding, - xAlign: tooltipOpts.xAlign, - yAlign: tooltipOpts.yAlign, - - // Body - bodyFontColor: tooltipOpts.bodyFontColor, - _bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), - _bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), - _bodyAlign: tooltipOpts.bodyAlign, - bodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), - bodySpacing: tooltipOpts.bodySpacing, - - // Title - titleFontColor: tooltipOpts.titleFontColor, - _titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), - _titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), - titleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), - _titleAlign: tooltipOpts.titleAlign, - titleSpacing: tooltipOpts.titleSpacing, - titleMarginBottom: tooltipOpts.titleMarginBottom, - - // Footer - footerFontColor: tooltipOpts.footerFontColor, - _footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), - _footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), - footerFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), - _footerAlign: tooltipOpts.footerAlign, - footerSpacing: tooltipOpts.footerSpacing, - footerMarginTop: tooltipOpts.footerMarginTop, - - // Appearance - caretSize: tooltipOpts.caretSize, - cornerRadius: tooltipOpts.cornerRadius, - backgroundColor: tooltipOpts.backgroundColor, - opacity: 0, - legendColorBackground: tooltipOpts.multiKeyBackground, - displayColors: tooltipOpts.displayColors, - borderColor: tooltipOpts.borderColor, - borderWidth: tooltipOpts.borderWidth - }; -} - -/** - * Get the size of the tooltip - */ -function getTooltipSize(tooltip, model) { - var ctx = tooltip._chart.ctx; - - var height = model.yPadding * 2; // Tooltip Padding - var width = 0; - - // Count of all lines in the body - var body = model.body; - var combinedBodyLength = body.reduce(function(count, bodyItem) { - return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; - }, 0); - combinedBodyLength += model.beforeBody.length + model.afterBody.length; - - var titleLineCount = model.title.length; - var footerLineCount = model.footer.length; - var titleFontSize = model.titleFontSize; - var bodyFontSize = model.bodyFontSize; - var footerFontSize = model.footerFontSize; - - height += titleLineCount * titleFontSize; // Title Lines - height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing - height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin - height += combinedBodyLength * bodyFontSize; // Body Lines - height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing - height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin - height += footerLineCount * (footerFontSize); // Footer Lines - height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing - - // Title width - var widthPadding = 0; - var maxLineWidth = function(line) { - width = Math.max(width, ctx.measureText(line).width + widthPadding); - }; - - ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); - helpers$1.each(model.title, maxLineWidth); - - // Body width - ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); - helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth); - - // Body lines may include some extra width due to the color box - widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; - helpers$1.each(body, function(bodyItem) { - helpers$1.each(bodyItem.before, maxLineWidth); - helpers$1.each(bodyItem.lines, maxLineWidth); - helpers$1.each(bodyItem.after, maxLineWidth); - }); - - // Reset back to 0 - widthPadding = 0; - - // Footer width - ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); - helpers$1.each(model.footer, maxLineWidth); - - // Add padding - width += 2 * model.xPadding; - - return { - width: width, - height: height - }; -} - -/** - * Helper to get the alignment of a tooltip given the size - */ -function determineAlignment(tooltip, size) { - var model = tooltip._model; - var chart = tooltip._chart; - var chartArea = tooltip._chart.chartArea; - var xAlign = 'center'; - var yAlign = 'center'; - - if (model.y < size.height) { - yAlign = 'top'; - } else if (model.y > (chart.height - size.height)) { - yAlign = 'bottom'; - } - - var lf, rf; // functions to determine left, right alignment - var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart - var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges - var midX = (chartArea.left + chartArea.right) / 2; - var midY = (chartArea.top + chartArea.bottom) / 2; - - if (yAlign === 'center') { - lf = function(x) { - return x <= midX; - }; - rf = function(x) { - return x > midX; - }; - } else { - lf = function(x) { - return x <= (size.width / 2); - }; - rf = function(x) { - return x >= (chart.width - (size.width / 2)); - }; - } - - olf = function(x) { - return x + size.width + model.caretSize + model.caretPadding > chart.width; - }; - orf = function(x) { - return x - size.width - model.caretSize - model.caretPadding < 0; - }; - yf = function(y) { - return y <= midY ? 'top' : 'bottom'; - }; - - if (lf(model.x)) { - xAlign = 'left'; - - // Is tooltip too wide and goes over the right side of the chart.? - if (olf(model.x)) { - xAlign = 'center'; - yAlign = yf(model.y); - } - } else if (rf(model.x)) { - xAlign = 'right'; - - // Is tooltip too wide and goes outside left edge of canvas? - if (orf(model.x)) { - xAlign = 'center'; - yAlign = yf(model.y); - } - } - - var opts = tooltip._options; - return { - xAlign: opts.xAlign ? opts.xAlign : xAlign, - yAlign: opts.yAlign ? opts.yAlign : yAlign - }; -} - -/** - * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment - */ -function getBackgroundPoint(vm, size, alignment, chart) { - // Background Position - var x = vm.x; - var y = vm.y; - - var caretSize = vm.caretSize; - var caretPadding = vm.caretPadding; - var cornerRadius = vm.cornerRadius; - var xAlign = alignment.xAlign; - var yAlign = alignment.yAlign; - var paddingAndSize = caretSize + caretPadding; - var radiusAndPadding = cornerRadius + caretPadding; - - if (xAlign === 'right') { - x -= size.width; - } else if (xAlign === 'center') { - x -= (size.width / 2); - if (x + size.width > chart.width) { - x = chart.width - size.width; - } - if (x < 0) { - x = 0; - } - } - - if (yAlign === 'top') { - y += paddingAndSize; - } else if (yAlign === 'bottom') { - y -= size.height + paddingAndSize; - } else { - y -= (size.height / 2); - } - - if (yAlign === 'center') { - if (xAlign === 'left') { - x += paddingAndSize; - } else if (xAlign === 'right') { - x -= paddingAndSize; - } - } else if (xAlign === 'left') { - x -= radiusAndPadding; - } else if (xAlign === 'right') { - x += radiusAndPadding; - } - - return { - x: x, - y: y - }; -} - -function getAlignedX(vm, align) { - return align === 'center' - ? vm.x + vm.width / 2 - : align === 'right' - ? vm.x + vm.width - vm.xPadding - : vm.x + vm.xPadding; -} - -/** - * Helper to build before and after body lines - */ -function getBeforeAfterBodyLines(callback) { - return pushOrConcat([], splitNewlines(callback)); -} - -var exports$3 = core_element.extend({ - initialize: function() { - this._model = getBaseModel(this._options); - this._lastActive = []; - }, - - // Get the title - // Args are: (tooltipItem, data) - getTitle: function() { - var me = this; - var opts = me._options; - var callbacks = opts.callbacks; - - var beforeTitle = callbacks.beforeTitle.apply(me, arguments); - var title = callbacks.title.apply(me, arguments); - var afterTitle = callbacks.afterTitle.apply(me, arguments); - - var lines = []; - lines = pushOrConcat(lines, splitNewlines(beforeTitle)); - lines = pushOrConcat(lines, splitNewlines(title)); - lines = pushOrConcat(lines, splitNewlines(afterTitle)); - - return lines; - }, - - // Args are: (tooltipItem, data) - getBeforeBody: function() { - return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments)); - }, - - // Args are: (tooltipItem, data) - getBody: function(tooltipItems, data) { - var me = this; - var callbacks = me._options.callbacks; - var bodyItems = []; - - helpers$1.each(tooltipItems, function(tooltipItem) { - var bodyItem = { - before: [], - lines: [], - after: [] - }; - pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data))); - pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); - pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data))); - - bodyItems.push(bodyItem); - }); - - return bodyItems; - }, - - // Args are: (tooltipItem, data) - getAfterBody: function() { - return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments)); - }, - - // Get the footer and beforeFooter and afterFooter lines - // Args are: (tooltipItem, data) - getFooter: function() { - var me = this; - var callbacks = me._options.callbacks; - - var beforeFooter = callbacks.beforeFooter.apply(me, arguments); - var footer = callbacks.footer.apply(me, arguments); - var afterFooter = callbacks.afterFooter.apply(me, arguments); - - var lines = []; - lines = pushOrConcat(lines, splitNewlines(beforeFooter)); - lines = pushOrConcat(lines, splitNewlines(footer)); - lines = pushOrConcat(lines, splitNewlines(afterFooter)); - - return lines; - }, - - update: function(changed) { - var me = this; - var opts = me._options; - - // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition - // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time - // which breaks any animations. - var existingModel = me._model; - var model = me._model = getBaseModel(opts); - var active = me._active; - - var data = me._data; - - // In the case where active.length === 0 we need to keep these at existing values for good animations - var alignment = { - xAlign: existingModel.xAlign, - yAlign: existingModel.yAlign - }; - var backgroundPoint = { - x: existingModel.x, - y: existingModel.y - }; - var tooltipSize = { - width: existingModel.width, - height: existingModel.height - }; - var tooltipPosition = { - x: existingModel.caretX, - y: existingModel.caretY - }; - - var i, len; - - if (active.length) { - model.opacity = 1; - - var labelColors = []; - var labelTextColors = []; - tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition); - - var tooltipItems = []; - for (i = 0, len = active.length; i < len; ++i) { - tooltipItems.push(createTooltipItem(active[i])); - } - - // If the user provided a filter function, use it to modify the tooltip items - if (opts.filter) { - tooltipItems = tooltipItems.filter(function(a) { - return opts.filter(a, data); - }); - } - - // If the user provided a sorting function, use it to modify the tooltip items - if (opts.itemSort) { - tooltipItems = tooltipItems.sort(function(a, b) { - return opts.itemSort(a, b, data); - }); - } - - // Determine colors for boxes - helpers$1.each(tooltipItems, function(tooltipItem) { - labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); - labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); - }); - - - // Build the Text Lines - model.title = me.getTitle(tooltipItems, data); - model.beforeBody = me.getBeforeBody(tooltipItems, data); - model.body = me.getBody(tooltipItems, data); - model.afterBody = me.getAfterBody(tooltipItems, data); - model.footer = me.getFooter(tooltipItems, data); - - // Initial positioning and colors - model.x = tooltipPosition.x; - model.y = tooltipPosition.y; - model.caretPadding = opts.caretPadding; - model.labelColors = labelColors; - model.labelTextColors = labelTextColors; - - // data points - model.dataPoints = tooltipItems; - - // We need to determine alignment of the tooltip - tooltipSize = getTooltipSize(this, model); - alignment = determineAlignment(this, tooltipSize); - // Final Size and Position - backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart); - } else { - model.opacity = 0; - } - - model.xAlign = alignment.xAlign; - model.yAlign = alignment.yAlign; - model.x = backgroundPoint.x; - model.y = backgroundPoint.y; - model.width = tooltipSize.width; - model.height = tooltipSize.height; - - // Point where the caret on the tooltip points to - model.caretX = tooltipPosition.x; - model.caretY = tooltipPosition.y; - - me._model = model; - - if (changed && opts.custom) { - opts.custom.call(me, model); - } - - return me; - }, - - drawCaret: function(tooltipPoint, size) { - var ctx = this._chart.ctx; - var vm = this._view; - var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); - - ctx.lineTo(caretPosition.x1, caretPosition.y1); - ctx.lineTo(caretPosition.x2, caretPosition.y2); - ctx.lineTo(caretPosition.x3, caretPosition.y3); - }, - getCaretPosition: function(tooltipPoint, size, vm) { - var x1, x2, x3, y1, y2, y3; - var caretSize = vm.caretSize; - var cornerRadius = vm.cornerRadius; - var xAlign = vm.xAlign; - var yAlign = vm.yAlign; - var ptX = tooltipPoint.x; - var ptY = tooltipPoint.y; - var width = size.width; - var height = size.height; - - if (yAlign === 'center') { - y2 = ptY + (height / 2); - - if (xAlign === 'left') { - x1 = ptX; - x2 = x1 - caretSize; - x3 = x1; - - y1 = y2 + caretSize; - y3 = y2 - caretSize; - } else { - x1 = ptX + width; - x2 = x1 + caretSize; - x3 = x1; - - y1 = y2 - caretSize; - y3 = y2 + caretSize; - } - } else { - if (xAlign === 'left') { - x2 = ptX + cornerRadius + (caretSize); - x1 = x2 - caretSize; - x3 = x2 + caretSize; - } else if (xAlign === 'right') { - x2 = ptX + width - cornerRadius - caretSize; - x1 = x2 - caretSize; - x3 = x2 + caretSize; - } else { - x2 = vm.caretX; - x1 = x2 - caretSize; - x3 = x2 + caretSize; - } - if (yAlign === 'top') { - y1 = ptY; - y2 = y1 - caretSize; - y3 = y1; - } else { - y1 = ptY + height; - y2 = y1 + caretSize; - y3 = y1; - // invert drawing order - var tmp = x3; - x3 = x1; - x1 = tmp; - } - } - return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; - }, - - drawTitle: function(pt, vm, ctx) { - var title = vm.title; - - if (title.length) { - pt.x = getAlignedX(vm, vm._titleAlign); - - ctx.textAlign = vm._titleAlign; - ctx.textBaseline = 'top'; - - var titleFontSize = vm.titleFontSize; - var titleSpacing = vm.titleSpacing; - - ctx.fillStyle = vm.titleFontColor; - ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); - - var i, len; - for (i = 0, len = title.length; i < len; ++i) { - ctx.fillText(title[i], pt.x, pt.y); - pt.y += titleFontSize + titleSpacing; // Line Height and spacing - - if (i + 1 === title.length) { - pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing - } - } - } - }, - - drawBody: function(pt, vm, ctx) { - var bodyFontSize = vm.bodyFontSize; - var bodySpacing = vm.bodySpacing; - var bodyAlign = vm._bodyAlign; - var body = vm.body; - var drawColorBoxes = vm.displayColors; - var labelColors = vm.labelColors; - var xLinePadding = 0; - var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0; - var textColor; - - ctx.textAlign = bodyAlign; - ctx.textBaseline = 'top'; - ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); - - pt.x = getAlignedX(vm, bodyAlign); - - // Before Body - var fillLineOfText = function(line) { - ctx.fillText(line, pt.x + xLinePadding, pt.y); - pt.y += bodyFontSize + bodySpacing; - }; - - // Before body lines - ctx.fillStyle = vm.bodyFontColor; - helpers$1.each(vm.beforeBody, fillLineOfText); - - xLinePadding = drawColorBoxes && bodyAlign !== 'right' - ? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2) - : 0; - - // Draw body lines now - helpers$1.each(body, function(bodyItem, i) { - textColor = vm.labelTextColors[i]; - ctx.fillStyle = textColor; - helpers$1.each(bodyItem.before, fillLineOfText); - - helpers$1.each(bodyItem.lines, function(line) { - // Draw Legend-like boxes if needed - if (drawColorBoxes) { - // Fill a white rect so that colours merge nicely if the opacity is < 1 - ctx.fillStyle = vm.legendColorBackground; - ctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize); - - // Border - ctx.lineWidth = 1; - ctx.strokeStyle = labelColors[i].borderColor; - ctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize); - - // Inner square - ctx.fillStyle = labelColors[i].backgroundColor; - ctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); - ctx.fillStyle = textColor; - } - - fillLineOfText(line); - }); - - helpers$1.each(bodyItem.after, fillLineOfText); - }); - - // Reset back to 0 for after body - xLinePadding = 0; - - // After body lines - helpers$1.each(vm.afterBody, fillLineOfText); - pt.y -= bodySpacing; // Remove last body spacing - }, - - drawFooter: function(pt, vm, ctx) { - var footer = vm.footer; - - if (footer.length) { - pt.x = getAlignedX(vm, vm._footerAlign); - pt.y += vm.footerMarginTop; - - ctx.textAlign = vm._footerAlign; - ctx.textBaseline = 'top'; - - ctx.fillStyle = vm.footerFontColor; - ctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); - - helpers$1.each(footer, function(line) { - ctx.fillText(line, pt.x, pt.y); - pt.y += vm.footerFontSize + vm.footerSpacing; - }); - } - }, - - drawBackground: function(pt, vm, ctx, tooltipSize) { - ctx.fillStyle = vm.backgroundColor; - ctx.strokeStyle = vm.borderColor; - ctx.lineWidth = vm.borderWidth; - var xAlign = vm.xAlign; - var yAlign = vm.yAlign; - var x = pt.x; - var y = pt.y; - var width = tooltipSize.width; - var height = tooltipSize.height; - var radius = vm.cornerRadius; - - ctx.beginPath(); - ctx.moveTo(x + radius, y); - if (yAlign === 'top') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x + width - radius, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + radius); - if (yAlign === 'center' && xAlign === 'right') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x + width, y + height - radius); - ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); - if (yAlign === 'bottom') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x + radius, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - radius); - if (yAlign === 'center' && xAlign === 'left') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x, y + radius); - ctx.quadraticCurveTo(x, y, x + radius, y); - ctx.closePath(); - - ctx.fill(); - - if (vm.borderWidth > 0) { - ctx.stroke(); - } - }, - - draw: function() { - var ctx = this._chart.ctx; - var vm = this._view; - - if (vm.opacity === 0) { - return; - } - - var tooltipSize = { - width: vm.width, - height: vm.height - }; - var pt = { - x: vm.x, - y: vm.y - }; - - // IE11/Edge does not like very small opacities, so snap to 0 - var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; - - // Truthy/falsey value for empty tooltip - var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; - - if (this._options.enabled && hasTooltipContent) { - ctx.save(); - ctx.globalAlpha = opacity; - - // Draw Background - this.drawBackground(pt, vm, ctx, tooltipSize); - - // Draw Title, Body, and Footer - pt.y += vm.yPadding; - - // Titles - this.drawTitle(pt, vm, ctx); - - // Body - this.drawBody(pt, vm, ctx); - - // Footer - this.drawFooter(pt, vm, ctx); - - ctx.restore(); - } - }, - - /** - * Handle an event - * @private - * @param {IEvent} event - The event to handle - * @returns {boolean} true if the tooltip changed - */ - handleEvent: function(e) { - var me = this; - var options = me._options; - var changed = false; - - me._lastActive = me._lastActive || []; - - // Find Active Elements for tooltips - if (e.type === 'mouseout') { - me._active = []; - } else { - me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); - } - - // Remember Last Actives - changed = !helpers$1.arrayEquals(me._active, me._lastActive); - - // Only handle target event on tooltip change - if (changed) { - me._lastActive = me._active; - - if (options.enabled || options.custom) { - me._eventPosition = { - x: e.x, - y: e.y - }; - - me.update(true); - me.pivot(); - } - } - - return changed; - } -}); - -/** - * @namespace Chart.Tooltip.positioners - */ -var positioners_1 = positioners; - -var core_tooltip = exports$3; -core_tooltip.positioners = positioners_1; - -var valueOrDefault$8 = helpers$1.valueOrDefault; - -core_defaults._set('global', { - elements: {}, - events: [ - 'mousemove', - 'mouseout', - 'click', - 'touchstart', - 'touchmove' - ], - hover: { - onHover: null, - mode: 'nearest', - intersect: true, - animationDuration: 400 - }, - onClick: null, - maintainAspectRatio: true, - responsive: true, - responsiveAnimationDuration: 0 -}); - -/** - * Recursively merge the given config objects representing the `scales` option - * by incorporating scale defaults in `xAxes` and `yAxes` array items, then - * returns a deep copy of the result, thus doesn't alter inputs. - */ -function mergeScaleConfig(/* config objects ... */) { - return helpers$1.merge({}, [].slice.call(arguments), { - merger: function(key, target, source, options) { - if (key === 'xAxes' || key === 'yAxes') { - var slen = source[key].length; - var i, type, scale; - - if (!target[key]) { - target[key] = []; - } - - for (i = 0; i < slen; ++i) { - scale = source[key][i]; - type = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear'); - - if (i >= target[key].length) { - target[key].push({}); - } - - if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { - // new/untyped scale or type changed: let's apply the new defaults - // then merge source scale to correctly overwrite the defaults. - helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]); - } else { - // scales type are the same - helpers$1.merge(target[key][i], scale); - } - } - } else { - helpers$1._merger(key, target, source, options); - } - } - }); -} - -/** - * Recursively merge the given config objects as the root options by handling - * default scale options for the `scales` and `scale` properties, then returns - * a deep copy of the result, thus doesn't alter inputs. - */ -function mergeConfig(/* config objects ... */) { - return helpers$1.merge({}, [].slice.call(arguments), { - merger: function(key, target, source, options) { - var tval = target[key] || {}; - var sval = source[key]; - - if (key === 'scales') { - // scale config merging is complex. Add our own function here for that - target[key] = mergeScaleConfig(tval, sval); - } else if (key === 'scale') { - // used in polar area & radar charts since there is only one scale - target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]); - } else { - helpers$1._merger(key, target, source, options); - } - } - }); -} - -function initConfig(config) { - config = config || {}; - - // Do NOT use mergeConfig for the data object because this method merges arrays - // and so would change references to labels and datasets, preventing data updates. - var data = config.data = config.data || {}; - data.datasets = data.datasets || []; - data.labels = data.labels || []; - - config.options = mergeConfig( - core_defaults.global, - core_defaults[config.type], - config.options || {}); - - return config; -} - -function updateConfig(chart) { - var newOptions = chart.options; - - helpers$1.each(chart.scales, function(scale) { - core_layouts.removeBox(chart, scale); - }); - - newOptions = mergeConfig( - core_defaults.global, - core_defaults[chart.config.type], - newOptions); - - chart.options = chart.config.options = newOptions; - chart.ensureScalesHaveIDs(); - chart.buildOrUpdateScales(); - - // Tooltip - chart.tooltip._options = newOptions.tooltips; - chart.tooltip.initialize(); -} - -function positionIsHorizontal(position) { - return position === 'top' || position === 'bottom'; -} - -var Chart = function(item, config) { - this.construct(item, config); - return this; -}; - -helpers$1.extend(Chart.prototype, /** @lends Chart */ { - /** - * @private - */ - construct: function(item, config) { - var me = this; - - config = initConfig(config); - - var context = platform.acquireContext(item, config); - var canvas = context && context.canvas; - var height = canvas && canvas.height; - var width = canvas && canvas.width; - - me.id = helpers$1.uid(); - me.ctx = context; - me.canvas = canvas; - me.config = config; - me.width = width; - me.height = height; - me.aspectRatio = height ? width / height : null; - me.options = config.options; - me._bufferedRender = false; - - /** - * Provided for backward compatibility, Chart and Chart.Controller have been merged, - * the "instance" still need to be defined since it might be called from plugins. - * @prop Chart#chart - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ - me.chart = me; - me.controller = me; // chart.chart.controller #inception - - // Add the chart instance to the global namespace - Chart.instances[me.id] = me; - - // Define alias to the config data: `chart.data === chart.config.data` - Object.defineProperty(me, 'data', { - get: function() { - return me.config.data; - }, - set: function(value) { - me.config.data = value; - } - }); - - if (!context || !canvas) { - // The given item is not a compatible context2d element, let's return before finalizing - // the chart initialization but after setting basic chart / controller properties that - // can help to figure out that the chart is not valid (e.g chart.canvas !== null); - // https://github.com/chartjs/Chart.js/issues/2807 - console.error("Failed to create chart: can't acquire context from the given item"); - return; - } - - me.initialize(); - me.update(); - }, - - /** - * @private - */ - initialize: function() { - var me = this; - - // Before init plugin notification - core_plugins.notify(me, 'beforeInit'); - - helpers$1.retinaScale(me, me.options.devicePixelRatio); - - me.bindEvents(); - - if (me.options.responsive) { - // Initial resize before chart draws (must be silent to preserve initial animations). - me.resize(true); - } - - // Make sure scales have IDs and are built before we build any controllers. - me.ensureScalesHaveIDs(); - me.buildOrUpdateScales(); - me.initToolTip(); - - // After init plugin notification - core_plugins.notify(me, 'afterInit'); - - return me; - }, - - clear: function() { - helpers$1.canvas.clear(this); - return this; - }, - - stop: function() { - // Stops any current animation loop occurring - core_animations.cancelAnimation(this); - return this; - }, - - resize: function(silent) { - var me = this; - var options = me.options; - var canvas = me.canvas; - var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; - - // the canvas render width and height will be casted to integers so make sure that - // the canvas display style uses the same integer values to avoid blurring effect. - - // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed - var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas))); - var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas))); - - if (me.width === newWidth && me.height === newHeight) { - return; - } - - canvas.width = me.width = newWidth; - canvas.height = me.height = newHeight; - canvas.style.width = newWidth + 'px'; - canvas.style.height = newHeight + 'px'; - - helpers$1.retinaScale(me, options.devicePixelRatio); - - if (!silent) { - // Notify any plugins about the resize - var newSize = {width: newWidth, height: newHeight}; - core_plugins.notify(me, 'resize', [newSize]); - - // Notify of resize - if (options.onResize) { - options.onResize(me, newSize); - } - - me.stop(); - me.update({ - duration: options.responsiveAnimationDuration - }); - } - }, - - ensureScalesHaveIDs: function() { - var options = this.options; - var scalesOptions = options.scales || {}; - var scaleOptions = options.scale; - - helpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) { - xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); - }); - - helpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) { - yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); - }); - - if (scaleOptions) { - scaleOptions.id = scaleOptions.id || 'scale'; - } - }, - - /** - * Builds a map of scale ID to scale object for future lookup. - */ - buildOrUpdateScales: function() { - var me = this; - var options = me.options; - var scales = me.scales || {}; - var items = []; - var updated = Object.keys(scales).reduce(function(obj, id) { - obj[id] = false; - return obj; - }, {}); - - if (options.scales) { - items = items.concat( - (options.scales.xAxes || []).map(function(xAxisOptions) { - return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; - }), - (options.scales.yAxes || []).map(function(yAxisOptions) { - return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; - }) - ); - } - - if (options.scale) { - items.push({ - options: options.scale, - dtype: 'radialLinear', - isDefault: true, - dposition: 'chartArea' - }); - } - - helpers$1.each(items, function(item) { - var scaleOptions = item.options; - var id = scaleOptions.id; - var scaleType = valueOrDefault$8(scaleOptions.type, item.dtype); - - if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { - scaleOptions.position = item.dposition; - } - - updated[id] = true; - var scale = null; - if (id in scales && scales[id].type === scaleType) { - scale = scales[id]; - scale.options = scaleOptions; - scale.ctx = me.ctx; - scale.chart = me; - } else { - var scaleClass = core_scaleService.getScaleConstructor(scaleType); - if (!scaleClass) { - return; - } - scale = new scaleClass({ - id: id, - type: scaleType, - options: scaleOptions, - ctx: me.ctx, - chart: me - }); - scales[scale.id] = scale; - } - - scale.mergeTicksOptions(); - - // TODO(SB): I think we should be able to remove this custom case (options.scale) - // and consider it as a regular scale part of the "scales"" map only! This would - // make the logic easier and remove some useless? custom code. - if (item.isDefault) { - me.scale = scale; - } - }); - // clear up discarded scales - helpers$1.each(updated, function(hasUpdated, id) { - if (!hasUpdated) { - delete scales[id]; - } - }); - - me.scales = scales; - - core_scaleService.addScalesToLayout(this); - }, - - buildOrUpdateControllers: function() { - var me = this; - var newControllers = []; - - helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { - var meta = me.getDatasetMeta(datasetIndex); - var type = dataset.type || me.config.type; - - if (meta.type && meta.type !== type) { - me.destroyDatasetMeta(datasetIndex); - meta = me.getDatasetMeta(datasetIndex); - } - meta.type = type; - - if (meta.controller) { - meta.controller.updateIndex(datasetIndex); - meta.controller.linkScales(); - } else { - var ControllerClass = controllers[meta.type]; - if (ControllerClass === undefined) { - throw new Error('"' + meta.type + '" is not a chart type.'); - } - - meta.controller = new ControllerClass(me, datasetIndex); - newControllers.push(meta.controller); - } - }, me); - - return newControllers; - }, - - /** - * Reset the elements of all datasets - * @private - */ - resetElements: function() { - var me = this; - helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { - me.getDatasetMeta(datasetIndex).controller.reset(); - }, me); - }, - - /** - * Resets the chart back to it's state before the initial animation - */ - reset: function() { - this.resetElements(); - this.tooltip.initialize(); - }, - - update: function(config) { - var me = this; - - if (!config || typeof config !== 'object') { - // backwards compatibility - config = { - duration: config, - lazy: arguments[1] - }; - } - - updateConfig(me); - - // plugins options references might have change, let's invalidate the cache - // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 - core_plugins._invalidate(me); - - if (core_plugins.notify(me, 'beforeUpdate') === false) { - return; - } - - // In case the entire data object changed - me.tooltip._data = me.data; - - // Make sure dataset controllers are updated and new controllers are reset - var newControllers = me.buildOrUpdateControllers(); - - // Make sure all dataset controllers have correct meta data counts - helpers$1.each(me.data.datasets, function(dataset, datasetIndex) { - me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); - }, me); - - me.updateLayout(); - - // Can only reset the new controllers after the scales have been updated - if (me.options.animation && me.options.animation.duration) { - helpers$1.each(newControllers, function(controller) { - controller.reset(); - }); - } - - me.updateDatasets(); - - // Need to reset tooltip in case it is displayed with elements that are removed - // after update. - me.tooltip.initialize(); - - // Last active contains items that were previously in the tooltip. - // When we reset the tooltip, we need to clear it - me.lastActive = []; - - // Do this before render so that any plugins that need final scale updates can use it - core_plugins.notify(me, 'afterUpdate'); - - if (me._bufferedRender) { - me._bufferedRequest = { - duration: config.duration, - easing: config.easing, - lazy: config.lazy - }; - } else { - me.render(config); - } - }, - - /** - * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` - * hook, in which case, plugins will not be called on `afterLayout`. - * @private - */ - updateLayout: function() { - var me = this; - - if (core_plugins.notify(me, 'beforeLayout') === false) { - return; - } - - core_layouts.update(this, this.width, this.height); - - /** - * Provided for backward compatibility, use `afterLayout` instead. - * @method IPlugin#afterScaleUpdate - * @deprecated since version 2.5.0 - * @todo remove at version 3 - * @private - */ - core_plugins.notify(me, 'afterScaleUpdate'); - core_plugins.notify(me, 'afterLayout'); - }, - - /** - * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` - * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. - * @private - */ - updateDatasets: function() { - var me = this; - - if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) { - return; - } - - for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { - me.updateDataset(i); - } - - core_plugins.notify(me, 'afterDatasetsUpdate'); - }, - - /** - * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` - * hook, in which case, plugins will not be called on `afterDatasetUpdate`. - * @private - */ - updateDataset: function(index) { - var me = this; - var meta = me.getDatasetMeta(index); - var args = { - meta: meta, - index: index - }; - - if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { - return; - } - - meta.controller.update(); - - core_plugins.notify(me, 'afterDatasetUpdate', [args]); - }, - - render: function(config) { - var me = this; - - if (!config || typeof config !== 'object') { - // backwards compatibility - config = { - duration: config, - lazy: arguments[1] - }; - } - - var animationOptions = me.options.animation; - var duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration); - var lazy = config.lazy; - - if (core_plugins.notify(me, 'beforeRender') === false) { - return; - } - - var onComplete = function(animation) { - core_plugins.notify(me, 'afterRender'); - helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me); - }; - - if (animationOptions && duration) { - var animation = new core_animation({ - numSteps: duration / 16.66, // 60 fps - easing: config.easing || animationOptions.easing, - - render: function(chart, animationObject) { - var easingFunction = helpers$1.easing.effects[animationObject.easing]; - var currentStep = animationObject.currentStep; - var stepDecimal = currentStep / animationObject.numSteps; - - chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); - }, - - onAnimationProgress: animationOptions.onProgress, - onAnimationComplete: onComplete - }); - - core_animations.addAnimation(me, animation, duration, lazy); - } else { - me.draw(); - - // See https://github.com/chartjs/Chart.js/issues/3781 - onComplete(new core_animation({numSteps: 0, chart: me})); - } - - return me; - }, - - draw: function(easingValue) { - var me = this; - - me.clear(); - - if (helpers$1.isNullOrUndef(easingValue)) { - easingValue = 1; - } - - me.transition(easingValue); - - if (me.width <= 0 || me.height <= 0) { - return; - } - - if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) { - return; - } - - // Draw all the scales - helpers$1.each(me.boxes, function(box) { - box.draw(me.chartArea); - }, me); - - me.drawDatasets(easingValue); - me._drawTooltip(easingValue); - - core_plugins.notify(me, 'afterDraw', [easingValue]); - }, - - /** - * @private - */ - transition: function(easingValue) { - var me = this; - - for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { - if (me.isDatasetVisible(i)) { - me.getDatasetMeta(i).controller.transition(easingValue); - } - } - - me.tooltip.transition(easingValue); - }, - - /** - * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` - * hook, in which case, plugins will not be called on `afterDatasetsDraw`. - * @private - */ - drawDatasets: function(easingValue) { - var me = this; - - if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { - return; - } - - // Draw datasets reversed to support proper line stacking - for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { - if (me.isDatasetVisible(i)) { - me.drawDataset(i, easingValue); - } - } - - core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]); - }, - - /** - * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` - * hook, in which case, plugins will not be called on `afterDatasetDraw`. - * @private - */ - drawDataset: function(index, easingValue) { - var me = this; - var meta = me.getDatasetMeta(index); - var args = { - meta: meta, - index: index, - easingValue: easingValue - }; - - if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { - return; - } - - meta.controller.draw(easingValue); - - core_plugins.notify(me, 'afterDatasetDraw', [args]); - }, - - /** - * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` - * hook, in which case, plugins will not be called on `afterTooltipDraw`. - * @private - */ - _drawTooltip: function(easingValue) { - var me = this; - var tooltip = me.tooltip; - var args = { - tooltip: tooltip, - easingValue: easingValue - }; - - if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { - return; - } - - tooltip.draw(); - - core_plugins.notify(me, 'afterTooltipDraw', [args]); - }, - - /** - * Get the single element that was clicked on - * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw - */ - getElementAtEvent: function(e) { - return core_interaction.modes.single(this, e); - }, - - getElementsAtEvent: function(e) { - return core_interaction.modes.label(this, e, {intersect: true}); - }, - - getElementsAtXAxis: function(e) { - return core_interaction.modes['x-axis'](this, e, {intersect: true}); - }, - - getElementsAtEventForMode: function(e, mode, options) { - var method = core_interaction.modes[mode]; - if (typeof method === 'function') { - return method(this, e, options); - } - - return []; - }, - - getDatasetAtEvent: function(e) { - return core_interaction.modes.dataset(this, e, {intersect: true}); - }, - - getDatasetMeta: function(datasetIndex) { - var me = this; - var dataset = me.data.datasets[datasetIndex]; - if (!dataset._meta) { - dataset._meta = {}; - } - - var meta = dataset._meta[me.id]; - if (!meta) { - meta = dataset._meta[me.id] = { - type: null, - data: [], - dataset: null, - controller: null, - hidden: null, // See isDatasetVisible() comment - xAxisID: null, - yAxisID: null - }; - } - - return meta; - }, - - getVisibleDatasetCount: function() { - var count = 0; - for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { - if (this.isDatasetVisible(i)) { - count++; - } - } - return count; - }, - - isDatasetVisible: function(datasetIndex) { - var meta = this.getDatasetMeta(datasetIndex); - - // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, - // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. - return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; - }, - - generateLegend: function() { - return this.options.legendCallback(this); - }, - - /** - * @private - */ - destroyDatasetMeta: function(datasetIndex) { - var id = this.id; - var dataset = this.data.datasets[datasetIndex]; - var meta = dataset._meta && dataset._meta[id]; - - if (meta) { - meta.controller.destroy(); - delete dataset._meta[id]; - } - }, - - destroy: function() { - var me = this; - var canvas = me.canvas; - var i, ilen; - - me.stop(); - - // dataset controllers need to cleanup associated data - for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { - me.destroyDatasetMeta(i); - } - - if (canvas) { - me.unbindEvents(); - helpers$1.canvas.clear(me); - platform.releaseContext(me.ctx); - me.canvas = null; - me.ctx = null; - } - - core_plugins.notify(me, 'destroy'); - - delete Chart.instances[me.id]; - }, - - toBase64Image: function() { - return this.canvas.toDataURL.apply(this.canvas, arguments); - }, - - initToolTip: function() { - var me = this; - me.tooltip = new core_tooltip({ - _chart: me, - _chartInstance: me, // deprecated, backward compatibility - _data: me.data, - _options: me.options.tooltips - }, me); - }, - - /** - * @private - */ - bindEvents: function() { - var me = this; - var listeners = me._listeners = {}; - var listener = function() { - me.eventHandler.apply(me, arguments); - }; - - helpers$1.each(me.options.events, function(type) { - platform.addEventListener(me, type, listener); - listeners[type] = listener; - }); - - // Elements used to detect size change should not be injected for non responsive charts. - // See https://github.com/chartjs/Chart.js/issues/2210 - if (me.options.responsive) { - listener = function() { - me.resize(); - }; - - platform.addEventListener(me, 'resize', listener); - listeners.resize = listener; - } - }, - - /** - * @private - */ - unbindEvents: function() { - var me = this; - var listeners = me._listeners; - if (!listeners) { - return; - } - - delete me._listeners; - helpers$1.each(listeners, function(listener, type) { - platform.removeEventListener(me, type, listener); - }); - }, - - updateHoverStyle: function(elements, mode, enabled) { - var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; - var element, i, ilen; - - for (i = 0, ilen = elements.length; i < ilen; ++i) { - element = elements[i]; - if (element) { - this.getDatasetMeta(element._datasetIndex).controller[method](element); - } - } - }, - - /** - * @private - */ - eventHandler: function(e) { - var me = this; - var tooltip = me.tooltip; - - if (core_plugins.notify(me, 'beforeEvent', [e]) === false) { - return; - } - - // Buffer any update calls so that renders do not occur - me._bufferedRender = true; - me._bufferedRequest = null; - - var changed = me.handleEvent(e); - // for smooth tooltip animations issue #4989 - // the tooltip should be the source of change - // Animation check workaround: - // tooltip._start will be null when tooltip isn't animating - if (tooltip) { - changed = tooltip._start - ? tooltip.handleEvent(e) - : changed | tooltip.handleEvent(e); - } - - core_plugins.notify(me, 'afterEvent', [e]); - - var bufferedRequest = me._bufferedRequest; - if (bufferedRequest) { - // If we have an update that was triggered, we need to do a normal render - me.render(bufferedRequest); - } else if (changed && !me.animating) { - // If entering, leaving, or changing elements, animate the change via pivot - me.stop(); - - // We only need to render at this point. Updating will cause scales to be - // recomputed generating flicker & using more memory than necessary. - me.render({ - duration: me.options.hover.animationDuration, - lazy: true - }); - } - - me._bufferedRender = false; - me._bufferedRequest = null; - - return me; - }, - - /** - * Handle an event - * @private - * @param {IEvent} event the event to handle - * @return {boolean} true if the chart needs to re-render - */ - handleEvent: function(e) { - var me = this; - var options = me.options || {}; - var hoverOptions = options.hover; - var changed = false; - - me.lastActive = me.lastActive || []; - - // Find Active Elements for hover and tooltips - if (e.type === 'mouseout') { - me.active = []; - } else { - me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); - } - - // Invoke onHover hook - // Need to call with native event here to not break backwards compatibility - helpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); - - if (e.type === 'mouseup' || e.type === 'click') { - if (options.onClick) { - // Use e.native here for backwards compatibility - options.onClick.call(me, e.native, me.active); - } - } - - // Remove styling for last active (even if it may still be active) - if (me.lastActive.length) { - me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); - } - - // Built in hover styling - if (me.active.length && hoverOptions.mode) { - me.updateHoverStyle(me.active, hoverOptions.mode, true); - } - - changed = !helpers$1.arrayEquals(me.active, me.lastActive); - - // Remember Last Actives - me.lastActive = me.active; - - return changed; - } -}); - -/** - * NOTE(SB) We actually don't use this container anymore but we need to keep it - * for backward compatibility. Though, it can still be useful for plugins that - * would need to work on multiple charts?! - */ -Chart.instances = {}; - -var core_controller = Chart; - -// DEPRECATIONS - -/** - * Provided for backward compatibility, use Chart instead. - * @class Chart.Controller - * @deprecated since version 2.6 - * @todo remove at version 3 - * @private - */ -Chart.Controller = Chart; - -/** - * Provided for backward compatibility, not available anymore. - * @namespace Chart - * @deprecated since version 2.8 - * @todo remove at version 3 - * @private - */ -Chart.types = {}; - -/** - * Provided for backward compatibility, not available anymore. - * @namespace Chart.helpers.configMerge - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ -helpers$1.configMerge = mergeConfig; - -/** - * Provided for backward compatibility, not available anymore. - * @namespace Chart.helpers.scaleMerge - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ -helpers$1.scaleMerge = mergeScaleConfig; - -var core_helpers = function() { - - // -- Basic js utility methods - - helpers$1.where = function(collection, filterCallback) { - if (helpers$1.isArray(collection) && Array.prototype.filter) { - return collection.filter(filterCallback); - } - var filtered = []; - - helpers$1.each(collection, function(item) { - if (filterCallback(item)) { - filtered.push(item); - } - }); - - return filtered; - }; - helpers$1.findIndex = Array.prototype.findIndex ? - function(array, callback, scope) { - return array.findIndex(callback, scope); - } : - function(array, callback, scope) { - scope = scope === undefined ? array : scope; - for (var i = 0, ilen = array.length; i < ilen; ++i) { - if (callback.call(scope, array[i], i, array)) { - return i; - } - } - return -1; - }; - helpers$1.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { - // Default to start of the array - if (helpers$1.isNullOrUndef(startIndex)) { - startIndex = -1; - } - for (var i = startIndex + 1; i < arrayToSearch.length; i++) { - var currentItem = arrayToSearch[i]; - if (filterCallback(currentItem)) { - return currentItem; - } - } - }; - helpers$1.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { - // Default to end of the array - if (helpers$1.isNullOrUndef(startIndex)) { - startIndex = arrayToSearch.length; - } - for (var i = startIndex - 1; i >= 0; i--) { - var currentItem = arrayToSearch[i]; - if (filterCallback(currentItem)) { - return currentItem; - } - } - }; - - // -- Math methods - helpers$1.isNumber = function(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - }; - helpers$1.almostEquals = function(x, y, epsilon) { - return Math.abs(x - y) < epsilon; - }; - helpers$1.almostWhole = function(x, epsilon) { - var rounded = Math.round(x); - return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); - }; - helpers$1.max = function(array) { - return array.reduce(function(max, value) { - if (!isNaN(value)) { - return Math.max(max, value); - } - return max; - }, Number.NEGATIVE_INFINITY); - }; - helpers$1.min = function(array) { - return array.reduce(function(min, value) { - if (!isNaN(value)) { - return Math.min(min, value); - } - return min; - }, Number.POSITIVE_INFINITY); - }; - helpers$1.sign = Math.sign ? - function(x) { - return Math.sign(x); - } : - function(x) { - x = +x; // convert to a number - if (x === 0 || isNaN(x)) { - return x; - } - return x > 0 ? 1 : -1; - }; - helpers$1.log10 = Math.log10 ? - function(x) { - return Math.log10(x); - } : - function(x) { - var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. - // Check for whole powers of 10, - // which due to floating point rounding error should be corrected. - var powerOf10 = Math.round(exponent); - var isPowerOf10 = x === Math.pow(10, powerOf10); - - return isPowerOf10 ? powerOf10 : exponent; - }; - helpers$1.toRadians = function(degrees) { - return degrees * (Math.PI / 180); - }; - helpers$1.toDegrees = function(radians) { - return radians * (180 / Math.PI); - }; - - /** - * Returns the number of decimal places - * i.e. the number of digits after the decimal point, of the value of this Number. - * @param {number} x - A number. - * @returns {number} The number of decimal places. - * @private - */ - helpers$1._decimalPlaces = function(x) { - if (!helpers$1.isFinite(x)) { - return; - } - var e = 1; - var p = 0; - while (Math.round(x * e) / e !== x) { - e *= 10; - p++; - } - return p; - }; - - // Gets the angle from vertical upright to the point about a centre. - helpers$1.getAngleFromPoint = function(centrePoint, anglePoint) { - var distanceFromXCenter = anglePoint.x - centrePoint.x; - var distanceFromYCenter = anglePoint.y - centrePoint.y; - var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); - - var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); - - if (angle < (-0.5 * Math.PI)) { - angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] - } - - return { - angle: angle, - distance: radialDistanceFromCenter - }; - }; - helpers$1.distanceBetweenPoints = function(pt1, pt2) { - return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); - }; - - /** - * Provided for backward compatibility, not available anymore - * @function Chart.helpers.aliasPixel - * @deprecated since version 2.8.0 - * @todo remove at version 3 - */ - helpers$1.aliasPixel = function(pixelWidth) { - return (pixelWidth % 2 === 0) ? 0 : 0.5; - }; - - /** - * Returns the aligned pixel value to avoid anti-aliasing blur - * @param {Chart} chart - The chart instance. - * @param {number} pixel - A pixel value. - * @param {number} width - The width of the element. - * @returns {number} The aligned pixel value. - * @private - */ - helpers$1._alignPixel = function(chart, pixel, width) { - var devicePixelRatio = chart.currentDevicePixelRatio; - var halfWidth = width / 2; - return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; - }; - - helpers$1.splineCurve = function(firstPoint, middlePoint, afterPoint, t) { - // Props to Rob Spencer at scaled innovation for his post on splining between points - // http://scaledinnovation.com/analytics/splines/aboutSplines.html - - // This function must also respect "skipped" points - - var previous = firstPoint.skip ? middlePoint : firstPoint; - var current = middlePoint; - var next = afterPoint.skip ? middlePoint : afterPoint; - - var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); - var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); - - var s01 = d01 / (d01 + d12); - var s12 = d12 / (d01 + d12); - - // If all points are the same, s01 & s02 will be inf - s01 = isNaN(s01) ? 0 : s01; - s12 = isNaN(s12) ? 0 : s12; - - var fa = t * s01; // scaling factor for triangle Ta - var fb = t * s12; - - return { - previous: { - x: current.x - fa * (next.x - previous.x), - y: current.y - fa * (next.y - previous.y) - }, - next: { - x: current.x + fb * (next.x - previous.x), - y: current.y + fb * (next.y - previous.y) - } - }; - }; - helpers$1.EPSILON = Number.EPSILON || 1e-14; - helpers$1.splineCurveMonotone = function(points) { - // This function calculates Bézier control points in a similar way than |splineCurve|, - // but preserves monotonicity of the provided data and ensures no local extremums are added - // between the dataset discrete points due to the interpolation. - // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation - - var pointsWithTangents = (points || []).map(function(point) { - return { - model: point._model, - deltaK: 0, - mK: 0 - }; - }); - - // Calculate slopes (deltaK) and initialize tangents (mK) - var pointsLen = pointsWithTangents.length; - var i, pointBefore, pointCurrent, pointAfter; - for (i = 0; i < pointsLen; ++i) { - pointCurrent = pointsWithTangents[i]; - if (pointCurrent.model.skip) { - continue; - } - - pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; - pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; - if (pointAfter && !pointAfter.model.skip) { - var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); - - // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 - pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; - } - - if (!pointBefore || pointBefore.model.skip) { - pointCurrent.mK = pointCurrent.deltaK; - } else if (!pointAfter || pointAfter.model.skip) { - pointCurrent.mK = pointBefore.deltaK; - } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { - pointCurrent.mK = 0; - } else { - pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; - } - } - - // Adjust tangents to ensure monotonic properties - var alphaK, betaK, tauK, squaredMagnitude; - for (i = 0; i < pointsLen - 1; ++i) { - pointCurrent = pointsWithTangents[i]; - pointAfter = pointsWithTangents[i + 1]; - if (pointCurrent.model.skip || pointAfter.model.skip) { - continue; - } - - if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { - pointCurrent.mK = pointAfter.mK = 0; - continue; - } - - alphaK = pointCurrent.mK / pointCurrent.deltaK; - betaK = pointAfter.mK / pointCurrent.deltaK; - squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); - if (squaredMagnitude <= 9) { - continue; - } - - tauK = 3 / Math.sqrt(squaredMagnitude); - pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; - pointAfter.mK = betaK * tauK * pointCurrent.deltaK; - } - - // Compute control points - var deltaX; - for (i = 0; i < pointsLen; ++i) { - pointCurrent = pointsWithTangents[i]; - if (pointCurrent.model.skip) { - continue; - } - - pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; - pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; - if (pointBefore && !pointBefore.model.skip) { - deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; - pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; - pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; - } - if (pointAfter && !pointAfter.model.skip) { - deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; - pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; - pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; - } - } - }; - helpers$1.nextItem = function(collection, index, loop) { - if (loop) { - return index >= collection.length - 1 ? collection[0] : collection[index + 1]; - } - return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; - }; - helpers$1.previousItem = function(collection, index, loop) { - if (loop) { - return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; - } - return index <= 0 ? collection[0] : collection[index - 1]; - }; - // Implementation of the nice number algorithm used in determining where axis labels will go - helpers$1.niceNum = function(range, round) { - var exponent = Math.floor(helpers$1.log10(range)); - var fraction = range / Math.pow(10, exponent); - var niceFraction; - - if (round) { - if (fraction < 1.5) { - niceFraction = 1; - } else if (fraction < 3) { - niceFraction = 2; - } else if (fraction < 7) { - niceFraction = 5; - } else { - niceFraction = 10; - } - } else if (fraction <= 1.0) { - niceFraction = 1; - } else if (fraction <= 2) { - niceFraction = 2; - } else if (fraction <= 5) { - niceFraction = 5; - } else { - niceFraction = 10; - } - - return niceFraction * Math.pow(10, exponent); - }; - // Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ - helpers$1.requestAnimFrame = (function() { - if (typeof window === 'undefined') { - return function(callback) { - callback(); - }; - } - return window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || - function(callback) { - return window.setTimeout(callback, 1000 / 60); - }; - }()); - // -- DOM methods - helpers$1.getRelativePosition = function(evt, chart) { - var mouseX, mouseY; - var e = evt.originalEvent || evt; - var canvas = evt.target || evt.srcElement; - var boundingRect = canvas.getBoundingClientRect(); - - var touches = e.touches; - if (touches && touches.length > 0) { - mouseX = touches[0].clientX; - mouseY = touches[0].clientY; - - } else { - mouseX = e.clientX; - mouseY = e.clientY; - } - - // Scale mouse coordinates into canvas coordinates - // by following the pattern laid out by 'jerryj' in the comments of - // https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ - var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left')); - var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top')); - var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right')); - var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom')); - var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; - var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; - - // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However - // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here - mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); - mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); - - return { - x: mouseX, - y: mouseY - }; - - }; - - // Private helper function to convert max-width/max-height values that may be percentages into a number - function parseMaxStyle(styleValue, node, parentProperty) { - var valueInPixels; - if (typeof styleValue === 'string') { - valueInPixels = parseInt(styleValue, 10); - - if (styleValue.indexOf('%') !== -1) { - // percentage * size in dimension - valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; - } - } else { - valueInPixels = styleValue; - } - - return valueInPixels; - } - - /** - * Returns if the given value contains an effective constraint. - * @private - */ - function isConstrainedValue(value) { - return value !== undefined && value !== null && value !== 'none'; - } - - /** - * Returns the max width or height of the given DOM node in a cross-browser compatible fashion - * @param {HTMLElement} domNode - the node to check the constraint on - * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height') - * @param {string} percentageProperty - property of parent to use when calculating width as a percentage - * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser} - */ - function getConstraintDimension(domNode, maxStyle, percentageProperty) { - var view = document.defaultView; - var parentNode = helpers$1._getParentNode(domNode); - var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; - var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; - var hasCNode = isConstrainedValue(constrainedNode); - var hasCContainer = isConstrainedValue(constrainedContainer); - var infinity = Number.POSITIVE_INFINITY; - - if (hasCNode || hasCContainer) { - return Math.min( - hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, - hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); - } - - return 'none'; - } - // returns Number or undefined if no constraint - helpers$1.getConstraintWidth = function(domNode) { - return getConstraintDimension(domNode, 'max-width', 'clientWidth'); - }; - // returns Number or undefined if no constraint - helpers$1.getConstraintHeight = function(domNode) { - return getConstraintDimension(domNode, 'max-height', 'clientHeight'); - }; - /** - * @private - */ - helpers$1._calculatePadding = function(container, padding, parentDimension) { - padding = helpers$1.getStyle(container, padding); - - return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10); - }; - /** - * @private - */ - helpers$1._getParentNode = function(domNode) { - var parent = domNode.parentNode; - if (parent && parent.toString() === '[object ShadowRoot]') { - parent = parent.host; - } - return parent; - }; - helpers$1.getMaximumWidth = function(domNode) { - var container = helpers$1._getParentNode(domNode); - if (!container) { - return domNode.clientWidth; - } - - var clientWidth = container.clientWidth; - var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth); - var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth); - - var w = clientWidth - paddingLeft - paddingRight; - var cw = helpers$1.getConstraintWidth(domNode); - return isNaN(cw) ? w : Math.min(w, cw); - }; - helpers$1.getMaximumHeight = function(domNode) { - var container = helpers$1._getParentNode(domNode); - if (!container) { - return domNode.clientHeight; - } - - var clientHeight = container.clientHeight; - var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight); - var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight); - - var h = clientHeight - paddingTop - paddingBottom; - var ch = helpers$1.getConstraintHeight(domNode); - return isNaN(ch) ? h : Math.min(h, ch); - }; - helpers$1.getStyle = function(el, property) { - return el.currentStyle ? - el.currentStyle[property] : - document.defaultView.getComputedStyle(el, null).getPropertyValue(property); - }; - helpers$1.retinaScale = function(chart, forceRatio) { - var pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && window.devicePixelRatio) || 1; - if (pixelRatio === 1) { - return; - } - - var canvas = chart.canvas; - var height = chart.height; - var width = chart.width; - - canvas.height = height * pixelRatio; - canvas.width = width * pixelRatio; - chart.ctx.scale(pixelRatio, pixelRatio); - - // If no style has been set on the canvas, the render size is used as display size, - // making the chart visually bigger, so let's enforce it to the "correct" values. - // See https://github.com/chartjs/Chart.js/issues/3575 - if (!canvas.style.height && !canvas.style.width) { - canvas.style.height = height + 'px'; - canvas.style.width = width + 'px'; - } - }; - // -- Canvas methods - helpers$1.fontString = function(pixelSize, fontStyle, fontFamily) { - return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; - }; - helpers$1.longestText = function(ctx, font, arrayOfThings, cache) { - cache = cache || {}; - var data = cache.data = cache.data || {}; - var gc = cache.garbageCollect = cache.garbageCollect || []; - - if (cache.font !== font) { - data = cache.data = {}; - gc = cache.garbageCollect = []; - cache.font = font; - } - - ctx.font = font; - var longest = 0; - helpers$1.each(arrayOfThings, function(thing) { - // Undefined strings and arrays should not be measured - if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) { - longest = helpers$1.measureText(ctx, data, gc, longest, thing); - } else if (helpers$1.isArray(thing)) { - // if it is an array lets measure each element - // to do maybe simplify this function a bit so we can do this more recursively? - helpers$1.each(thing, function(nestedThing) { - // Undefined strings and arrays should not be measured - if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) { - longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing); - } - }); - } - }); - - var gcLen = gc.length / 2; - if (gcLen > arrayOfThings.length) { - for (var i = 0; i < gcLen; i++) { - delete data[gc[i]]; - } - gc.splice(0, gcLen); - } - return longest; - }; - helpers$1.measureText = function(ctx, data, gc, longest, string) { - var textWidth = data[string]; - if (!textWidth) { - textWidth = data[string] = ctx.measureText(string).width; - gc.push(string); - } - if (textWidth > longest) { - longest = textWidth; - } - return longest; - }; - helpers$1.numberOfLabelLines = function(arrayOfThings) { - var numberOfLines = 1; - helpers$1.each(arrayOfThings, function(thing) { - if (helpers$1.isArray(thing)) { - if (thing.length > numberOfLines) { - numberOfLines = thing.length; - } - } - }); - return numberOfLines; - }; - - helpers$1.color = !chartjsColor ? - function(value) { - console.error('Color.js not found!'); - return value; - } : - function(value) { - /* global CanvasGradient */ - if (value instanceof CanvasGradient) { - value = core_defaults.global.defaultColor; - } - - return chartjsColor(value); - }; - - helpers$1.getHoverColor = function(colorValue) { - /* global CanvasPattern */ - return (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ? - colorValue : - helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString(); - }; -}; - -function abstract() { - throw new Error( - 'This method is not implemented: either no adapter can ' + - 'be found or an incomplete integration was provided.' - ); -} - -/** - * Date adapter (current used by the time scale) - * @namespace Chart._adapters._date - * @memberof Chart._adapters - * @private - */ - -/** - * Currently supported unit string values. - * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')} - * @memberof Chart._adapters._date - * @name Unit - */ - -/** - * @class - */ -function DateAdapter(options) { - this.options = options || {}; -} - -helpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */ { - /** - * Returns a map of time formats for the supported formatting units defined - * in Unit as well as 'datetime' representing a detailed date/time string. - * @returns {{string: string}} - */ - formats: abstract, - - /** - * Parses the given `value` and return the associated timestamp. - * @param {any} value - the value to parse (usually comes from the data) - * @param {string} [format] - the expected data format - * @returns {(number|null)} - * @function - */ - parse: abstract, - - /** - * Returns the formatted date in the specified `format` for a given `timestamp`. - * @param {number} timestamp - the timestamp to format - * @param {string} format - the date/time token - * @return {string} - * @function - */ - format: abstract, - - /** - * Adds the specified `amount` of `unit` to the given `timestamp`. - * @param {number} timestamp - the input timestamp - * @param {number} amount - the amount to add - * @param {Unit} unit - the unit as string - * @return {number} - * @function - */ - add: abstract, - - /** - * Returns the number of `unit` between the given timestamps. - * @param {number} max - the input timestamp (reference) - * @param {number} min - the timestamp to substract - * @param {Unit} unit - the unit as string - * @return {number} - * @function - */ - diff: abstract, - - /** - * Returns start of `unit` for the given `timestamp`. - * @param {number} timestamp - the input timestamp - * @param {Unit} unit - the unit as string - * @param {number} [weekday] - the ISO day of the week with 1 being Monday - * and 7 being Sunday (only needed if param *unit* is `isoWeek`). - * @function - */ - startOf: abstract, - - /** - * Returns end of `unit` for the given `timestamp`. - * @param {number} timestamp - the input timestamp - * @param {Unit} unit - the unit as string - * @function - */ - endOf: abstract, - - // DEPRECATIONS - - /** - * Provided for backward compatibility for scale.getValueForPixel(), - * this method should be overridden only by the moment adapter. - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ - _create: function(value) { - return value; - } -}); - -DateAdapter.override = function(members) { - helpers$1.extend(DateAdapter.prototype, members); -}; - -var _date = DateAdapter; - -var core_adapters = { - _date: _date -}; - -/** - * Namespace to hold static tick generation functions - * @namespace Chart.Ticks - */ -var core_ticks = { - /** - * Namespace to hold formatters for different types of ticks - * @namespace Chart.Ticks.formatters - */ - formatters: { - /** - * Formatter for value labels - * @method Chart.Ticks.formatters.values - * @param value the value to display - * @return {string|string[]} the label to display - */ - values: function(value) { - return helpers$1.isArray(value) ? value : '' + value; - }, - - /** - * Formatter for linear numeric ticks - * @method Chart.Ticks.formatters.linear - * @param tickValue {number} the value to be formatted - * @param index {number} the position of the tickValue parameter in the ticks array - * @param ticks {number[]} the list of ticks being converted - * @return {string} string representation of the tickValue parameter - */ - linear: function(tickValue, index, ticks) { - // If we have lots of ticks, don't use the ones - var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; - - // If we have a number like 2.5 as the delta, figure out how many decimal places we need - if (Math.abs(delta) > 1) { - if (tickValue !== Math.floor(tickValue)) { - // not an integer - delta = tickValue - Math.floor(tickValue); - } - } - - var logDelta = helpers$1.log10(Math.abs(delta)); - var tickString = ''; - - if (tickValue !== 0) { - var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1])); - if (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation - var logTick = helpers$1.log10(Math.abs(tickValue)); - tickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta)); - } else { - var numDecimal = -1 * Math.floor(logDelta); - numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places - tickString = tickValue.toFixed(numDecimal); - } - } else { - tickString = '0'; // never show decimal places for 0 - } - - return tickString; - }, - - logarithmic: function(tickValue, index, ticks) { - var remain = tickValue / (Math.pow(10, Math.floor(helpers$1.log10(tickValue)))); - - if (tickValue === 0) { - return '0'; - } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { - return tickValue.toExponential(); - } - return ''; - } - } -}; - -var valueOrDefault$9 = helpers$1.valueOrDefault; -var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault; - -core_defaults._set('scale', { - display: true, - position: 'left', - offset: false, - - // grid line settings - gridLines: { - display: true, - color: 'rgba(0, 0, 0, 0.1)', - lineWidth: 1, - drawBorder: true, - drawOnChartArea: true, - drawTicks: true, - tickMarkLength: 10, - zeroLineWidth: 1, - zeroLineColor: 'rgba(0,0,0,0.25)', - zeroLineBorderDash: [], - zeroLineBorderDashOffset: 0.0, - offsetGridLines: false, - borderDash: [], - borderDashOffset: 0.0 - }, - - // scale label - scaleLabel: { - // display property - display: false, - - // actual label - labelString: '', - - // top/bottom padding - padding: { - top: 4, - bottom: 4 - } - }, - - // label settings - ticks: { - beginAtZero: false, - minRotation: 0, - maxRotation: 50, - mirror: false, - padding: 0, - reverse: false, - display: true, - autoSkip: true, - autoSkipPadding: 0, - labelOffset: 0, - // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. - callback: core_ticks.formatters.values, - minor: {}, - major: {} - } -}); - -function labelsFromTicks(ticks) { - var labels = []; - var i, ilen; - - for (i = 0, ilen = ticks.length; i < ilen; ++i) { - labels.push(ticks[i].label); - } - - return labels; -} - -function getPixelForGridLine(scale, index, offsetGridLines) { - var lineValue = scale.getPixelForTick(index); - - if (offsetGridLines) { - if (scale.getTicks().length === 1) { - lineValue -= scale.isHorizontal() ? - Math.max(lineValue - scale.left, scale.right - lineValue) : - Math.max(lineValue - scale.top, scale.bottom - lineValue); - } else if (index === 0) { - lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; - } else { - lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; - } - } - return lineValue; -} - -function computeTextSize(context, tick, font) { - return helpers$1.isArray(tick) ? - helpers$1.longestText(context, font, tick) : - context.measureText(tick).width; -} - -var core_scale = core_element.extend({ - /** - * Get the padding needed for the scale - * @method getPadding - * @private - * @returns {Padding} the necessary padding - */ - getPadding: function() { - var me = this; - return { - left: me.paddingLeft || 0, - top: me.paddingTop || 0, - right: me.paddingRight || 0, - bottom: me.paddingBottom || 0 - }; - }, - - /** - * Returns the scale tick objects ({label, major}) - * @since 2.7 - */ - getTicks: function() { - return this._ticks; - }, - - // These methods are ordered by lifecyle. Utilities then follow. - // Any function defined here is inherited by all scale types. - // Any function can be extended by the scale type - - mergeTicksOptions: function() { - var ticks = this.options.ticks; - if (ticks.minor === false) { - ticks.minor = { - display: false - }; - } - if (ticks.major === false) { - ticks.major = { - display: false - }; - } - for (var key in ticks) { - if (key !== 'major' && key !== 'minor') { - if (typeof ticks.minor[key] === 'undefined') { - ticks.minor[key] = ticks[key]; - } - if (typeof ticks.major[key] === 'undefined') { - ticks.major[key] = ticks[key]; - } - } - } - }, - beforeUpdate: function() { - helpers$1.callback(this.options.beforeUpdate, [this]); - }, - - update: function(maxWidth, maxHeight, margins) { - var me = this; - var i, ilen, labels, label, ticks, tick; - - // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) - me.beforeUpdate(); - - // Absorb the master measurements - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me.margins = helpers$1.extend({ - left: 0, - right: 0, - top: 0, - bottom: 0 - }, margins); - - me._maxLabelLines = 0; - me.longestLabelWidth = 0; - me.longestTextCache = me.longestTextCache || {}; - - // Dimensions - me.beforeSetDimensions(); - me.setDimensions(); - me.afterSetDimensions(); - - // Data min/max - me.beforeDataLimits(); - me.determineDataLimits(); - me.afterDataLimits(); - - // Ticks - `this.ticks` is now DEPRECATED! - // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member - // and must not be accessed directly from outside this class. `this.ticks` being - // around for long time and not marked as private, we can't change its structure - // without unexpected breaking changes. If you need to access the scale ticks, - // use scale.getTicks() instead. - - me.beforeBuildTicks(); - - // New implementations should return an array of objects but for BACKWARD COMPAT, - // we still support no return (`this.ticks` internally set by calling this method). - ticks = me.buildTicks() || []; - - // Allow modification of ticks in callback. - ticks = me.afterBuildTicks(ticks) || ticks; - - me.beforeTickToLabelConversion(); - - // New implementations should return the formatted tick labels but for BACKWARD - // COMPAT, we still support no return (`this.ticks` internally changed by calling - // this method and supposed to contain only string values). - labels = me.convertTicksToLabels(ticks) || me.ticks; - - me.afterTickToLabelConversion(); - - me.ticks = labels; // BACKWARD COMPATIBILITY - - // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! - - // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) - for (i = 0, ilen = labels.length; i < ilen; ++i) { - label = labels[i]; - tick = ticks[i]; - if (!tick) { - ticks.push(tick = { - label: label, - major: false - }); - } else { - tick.label = label; - } - } - - me._ticks = ticks; - - // Tick Rotation - me.beforeCalculateTickRotation(); - me.calculateTickRotation(); - me.afterCalculateTickRotation(); - // Fit - me.beforeFit(); - me.fit(); - me.afterFit(); - // - me.afterUpdate(); - - return me.minSize; - - }, - afterUpdate: function() { - helpers$1.callback(this.options.afterUpdate, [this]); - }, - - // - - beforeSetDimensions: function() { - helpers$1.callback(this.options.beforeSetDimensions, [this]); - }, - setDimensions: function() { - var me = this; - // Set the unconstrained dimension before label rotation - if (me.isHorizontal()) { - // Reset position before calculating rotation - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; - } else { - me.height = me.maxHeight; - - // Reset position before calculating rotation - me.top = 0; - me.bottom = me.height; - } - - // Reset padding - me.paddingLeft = 0; - me.paddingTop = 0; - me.paddingRight = 0; - me.paddingBottom = 0; - }, - afterSetDimensions: function() { - helpers$1.callback(this.options.afterSetDimensions, [this]); - }, - - // Data limits - beforeDataLimits: function() { - helpers$1.callback(this.options.beforeDataLimits, [this]); - }, - determineDataLimits: helpers$1.noop, - afterDataLimits: function() { - helpers$1.callback(this.options.afterDataLimits, [this]); - }, - - // - beforeBuildTicks: function() { - helpers$1.callback(this.options.beforeBuildTicks, [this]); - }, - buildTicks: helpers$1.noop, - afterBuildTicks: function(ticks) { - var me = this; - // ticks is empty for old axis implementations here - if (helpers$1.isArray(ticks) && ticks.length) { - return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]); - } - // Support old implementations (that modified `this.ticks` directly in buildTicks) - me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks; - return ticks; - }, - - beforeTickToLabelConversion: function() { - helpers$1.callback(this.options.beforeTickToLabelConversion, [this]); - }, - convertTicksToLabels: function() { - var me = this; - // Convert ticks to strings - var tickOpts = me.options.ticks; - me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); - }, - afterTickToLabelConversion: function() { - helpers$1.callback(this.options.afterTickToLabelConversion, [this]); - }, - - // - - beforeCalculateTickRotation: function() { - helpers$1.callback(this.options.beforeCalculateTickRotation, [this]); - }, - calculateTickRotation: function() { - var me = this; - var context = me.ctx; - var tickOpts = me.options.ticks; - var labels = labelsFromTicks(me._ticks); - - // Get the width of each grid by calculating the difference - // between x offsets between 0 and 1. - var tickFont = helpers$1.options._parseFont(tickOpts); - context.font = tickFont.string; - - var labelRotation = tickOpts.minRotation || 0; - - if (labels.length && me.options.display && me.isHorizontal()) { - var originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache); - var labelWidth = originalLabelWidth; - var cosRotation, sinRotation; - - // Allow 3 pixels x2 padding either side for label readability - var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; - - // Max label rotation can be set or default to 90 - also act as a loop counter - while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { - var angleRadians = helpers$1.toRadians(labelRotation); - cosRotation = Math.cos(angleRadians); - sinRotation = Math.sin(angleRadians); - - if (sinRotation * originalLabelWidth > me.maxHeight) { - // go back one step - labelRotation--; - break; - } - - labelRotation++; - labelWidth = cosRotation * originalLabelWidth; - } - } - - me.labelRotation = labelRotation; - }, - afterCalculateTickRotation: function() { - helpers$1.callback(this.options.afterCalculateTickRotation, [this]); - }, - - // - - beforeFit: function() { - helpers$1.callback(this.options.beforeFit, [this]); - }, - fit: function() { - var me = this; - // Reset - var minSize = me.minSize = { - width: 0, - height: 0 - }; - - var labels = labelsFromTicks(me._ticks); - - var opts = me.options; - var tickOpts = opts.ticks; - var scaleLabelOpts = opts.scaleLabel; - var gridLineOpts = opts.gridLines; - var display = me._isVisible(); - var position = opts.position; - var isHorizontal = me.isHorizontal(); - - var parseFont = helpers$1.options._parseFont; - var tickFont = parseFont(tickOpts); - var tickMarkLength = opts.gridLines.tickMarkLength; - - // Width - if (isHorizontal) { - // subtract the margins to line up with the chartArea if we are a full width scale - minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; - } else { - minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; - } - - // height - if (isHorizontal) { - minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; - } else { - minSize.height = me.maxHeight; // fill all the height - } - - // Are we showing a title for the scale? - if (scaleLabelOpts.display && display) { - var scaleLabelFont = parseFont(scaleLabelOpts); - var scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding); - var deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height; - - if (isHorizontal) { - minSize.height += deltaHeight; - } else { - minSize.width += deltaHeight; - } - } - - // Don't bother fitting the ticks if we are not showing the labels - if (tickOpts.display && display) { - var largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache); - var tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels); - var lineSpace = tickFont.size * 0.5; - var tickPadding = me.options.ticks.padding; - - // Store max number of lines and widest label for _autoSkip - me._maxLabelLines = tallestLabelHeightInLines; - me.longestLabelWidth = largestTextWidth; - - if (isHorizontal) { - var angleRadians = helpers$1.toRadians(me.labelRotation); - var cosRotation = Math.cos(angleRadians); - var sinRotation = Math.sin(angleRadians); - - // TODO - improve this calculation - var labelHeight = (sinRotation * largestTextWidth) - + (tickFont.lineHeight * tallestLabelHeightInLines) - + lineSpace; // padding - - minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); - - me.ctx.font = tickFont.string; - var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string); - var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string); - var offsetLeft = me.getPixelForTick(0) - me.left; - var offsetRight = me.right - me.getPixelForTick(labels.length - 1); - var paddingLeft, paddingRight; - - // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned - // which means that the right padding is dominated by the font height - if (me.labelRotation !== 0) { - paddingLeft = position === 'bottom' ? (cosRotation * firstLabelWidth) : (cosRotation * lineSpace); - paddingRight = position === 'bottom' ? (cosRotation * lineSpace) : (cosRotation * lastLabelWidth); - } else { - paddingLeft = firstLabelWidth / 2; - paddingRight = lastLabelWidth / 2; - } - me.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges - me.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3; - } else { - // A vertical axis is more constrained by the width. Labels are the - // dominant factor here, so get that length first and account for padding - if (tickOpts.mirror) { - largestTextWidth = 0; - } else { - // use lineSpace for consistency with horizontal axis - // tickPadding is not implemented for horizontal - largestTextWidth += tickPadding + lineSpace; - } - - minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); - - me.paddingTop = tickFont.size / 2; - me.paddingBottom = tickFont.size / 2; - } - } - - me.handleMargins(); - - me.width = minSize.width; - me.height = minSize.height; - }, - - /** - * Handle margins and padding interactions - * @private - */ - handleMargins: function() { - var me = this; - if (me.margins) { - me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); - me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); - me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); - me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); - } - }, - - afterFit: function() { - helpers$1.callback(this.options.afterFit, [this]); - }, - - // Shared Methods - isHorizontal: function() { - return this.options.position === 'top' || this.options.position === 'bottom'; - }, - isFullWidth: function() { - return (this.options.fullWidth); - }, - - // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not - getRightValue: function(rawValue) { - // Null and undefined values first - if (helpers$1.isNullOrUndef(rawValue)) { - return NaN; - } - // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values - if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) { - return NaN; - } - // If it is in fact an object, dive in one more level - if (rawValue) { - if (this.isHorizontal()) { - if (rawValue.x !== undefined) { - return this.getRightValue(rawValue.x); - } - } else if (rawValue.y !== undefined) { - return this.getRightValue(rawValue.y); - } - } - - // Value is good, return it - return rawValue; - }, - - /** - * Used to get the value to display in the tooltip for the data at the given index - * @param index - * @param datasetIndex - */ - getLabelForIndex: helpers$1.noop, - - /** - * Returns the location of the given data point. Value can either be an index or a numerical value - * The coordinate (0, 0) is at the upper-left corner of the canvas - * @param value - * @param index - * @param datasetIndex - */ - getPixelForValue: helpers$1.noop, - - /** - * Used to get the data value from a given pixel. This is the inverse of getPixelForValue - * The coordinate (0, 0) is at the upper-left corner of the canvas - * @param pixel - */ - getValueForPixel: helpers$1.noop, - - /** - * Returns the location of the tick at the given index - * The coordinate (0, 0) is at the upper-left corner of the canvas - */ - getPixelForTick: function(index) { - var me = this; - var offset = me.options.offset; - if (me.isHorizontal()) { - var innerWidth = me.width - (me.paddingLeft + me.paddingRight); - var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); - var pixel = (tickWidth * index) + me.paddingLeft; - - if (offset) { - pixel += tickWidth / 2; - } - - var finalVal = me.left + pixel; - finalVal += me.isFullWidth() ? me.margins.left : 0; - return finalVal; - } - var innerHeight = me.height - (me.paddingTop + me.paddingBottom); - return me.top + (index * (innerHeight / (me._ticks.length - 1))); - }, - - /** - * Utility for getting the pixel location of a percentage of scale - * The coordinate (0, 0) is at the upper-left corner of the canvas - */ - getPixelForDecimal: function(decimal) { - var me = this; - if (me.isHorizontal()) { - var innerWidth = me.width - (me.paddingLeft + me.paddingRight); - var valueOffset = (innerWidth * decimal) + me.paddingLeft; - - var finalVal = me.left + valueOffset; - finalVal += me.isFullWidth() ? me.margins.left : 0; - return finalVal; - } - return me.top + (decimal * me.height); - }, - - /** - * Returns the pixel for the minimum chart value - * The coordinate (0, 0) is at the upper-left corner of the canvas - */ - getBasePixel: function() { - return this.getPixelForValue(this.getBaseValue()); - }, - - getBaseValue: function() { - var me = this; - var min = me.min; - var max = me.max; - - return me.beginAtZero ? 0 : - min < 0 && max < 0 ? max : - min > 0 && max > 0 ? min : - 0; - }, - - /** - * Returns a subset of ticks to be plotted to avoid overlapping labels. - * @private - */ - _autoSkip: function(ticks) { - var me = this; - var isHorizontal = me.isHorizontal(); - var optionTicks = me.options.ticks.minor; - var tickCount = ticks.length; - var skipRatio = false; - var maxTicks = optionTicks.maxTicksLimit; - - // Total space needed to display all ticks. First and last ticks are - // drawn as their center at end of axis, so tickCount-1 - var ticksLength = me._tickSize() * (tickCount - 1); - - // Axis length - var axisLength = isHorizontal - ? me.width - (me.paddingLeft + me.paddingRight) - : me.height - (me.paddingTop + me.PaddingBottom); - - var result = []; - var i, tick; - - if (ticksLength > axisLength) { - skipRatio = 1 + Math.floor(ticksLength / axisLength); - } - - // if they defined a max number of optionTicks, - // increase skipRatio until that number is met - if (tickCount > maxTicks) { - skipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks)); - } - - for (i = 0; i < tickCount; i++) { - tick = ticks[i]; - - if (skipRatio > 1 && i % skipRatio > 0) { - // leave tick in place but make sure it's not displayed (#4635) - delete tick.label; - } - result.push(tick); - } - return result; - }, - - /** - * @private - */ - _tickSize: function() { - var me = this; - var isHorizontal = me.isHorizontal(); - var optionTicks = me.options.ticks.minor; - - // Calculate space needed by label in axis direction. - var rot = helpers$1.toRadians(me.labelRotation); - var cos = Math.abs(Math.cos(rot)); - var sin = Math.abs(Math.sin(rot)); - - var padding = optionTicks.autoSkipPadding || 0; - var w = (me.longestLabelWidth + padding) || 0; - - var tickFont = helpers$1.options._parseFont(optionTicks); - var h = (me._maxLabelLines * tickFont.lineHeight + padding) || 0; - - // Calculate space needed for 1 tick in axis direction. - return isHorizontal - ? h * cos > w * sin ? w / cos : h / sin - : h * sin < w * cos ? h / cos : w / sin; - }, - - /** - * @private - */ - _isVisible: function() { - var me = this; - var chart = me.chart; - var display = me.options.display; - var i, ilen, meta; - - if (display !== 'auto') { - return !!display; - } - - // When 'auto', the scale is visible if at least one associated dataset is visible. - for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { - if (chart.isDatasetVisible(i)) { - meta = chart.getDatasetMeta(i); - if (meta.xAxisID === me.id || meta.yAxisID === me.id) { - return true; - } - } - } - - return false; - }, - - /** - * Actually draw the scale on the canvas - * @param {object} chartArea - the area of the chart to draw full grid lines on - */ - draw: function(chartArea) { - var me = this; - var options = me.options; - - if (!me._isVisible()) { - return; - } - - var chart = me.chart; - var context = me.ctx; - var globalDefaults = core_defaults.global; - var defaultFontColor = globalDefaults.defaultFontColor; - var optionTicks = options.ticks.minor; - var optionMajorTicks = options.ticks.major || optionTicks; - var gridLines = options.gridLines; - var scaleLabel = options.scaleLabel; - var position = options.position; - - var isRotated = me.labelRotation !== 0; - var isMirrored = optionTicks.mirror; - var isHorizontal = me.isHorizontal(); - - var parseFont = helpers$1.options._parseFont; - var ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); - var tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor); - var tickFont = parseFont(optionTicks); - var lineHeight = tickFont.lineHeight; - var majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor); - var majorTickFont = parseFont(optionMajorTicks); - var tickPadding = optionTicks.padding; - var labelOffset = optionTicks.labelOffset; - - var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; - - var scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor); - var scaleLabelFont = parseFont(scaleLabel); - var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding); - var labelRotationRadians = helpers$1.toRadians(me.labelRotation); - - var itemsToDraw = []; - - var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0; - var alignPixel = helpers$1._alignPixel; - var borderValue, tickStart, tickEnd; - - if (position === 'top') { - borderValue = alignPixel(chart, me.bottom, axisWidth); - tickStart = me.bottom - tl; - tickEnd = borderValue - axisWidth / 2; - } else if (position === 'bottom') { - borderValue = alignPixel(chart, me.top, axisWidth); - tickStart = borderValue + axisWidth / 2; - tickEnd = me.top + tl; - } else if (position === 'left') { - borderValue = alignPixel(chart, me.right, axisWidth); - tickStart = me.right - tl; - tickEnd = borderValue - axisWidth / 2; - } else { - borderValue = alignPixel(chart, me.left, axisWidth); - tickStart = borderValue + axisWidth / 2; - tickEnd = me.left + tl; - } - - var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error. - - helpers$1.each(ticks, function(tick, index) { - // autoskipper skipped this tick (#4635) - if (helpers$1.isNullOrUndef(tick.label)) { - return; - } - - var label = tick.label; - var lineWidth, lineColor, borderDash, borderDashOffset; - if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { - // Draw the first index specially - lineWidth = gridLines.zeroLineWidth; - lineColor = gridLines.zeroLineColor; - borderDash = gridLines.zeroLineBorderDash || []; - borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0; - } else { - lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index); - lineColor = valueAtIndexOrDefault(gridLines.color, index); - borderDash = gridLines.borderDash || []; - borderDashOffset = gridLines.borderDashOffset || 0.0; - } - - // Common properties - var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign; - var labelCount = helpers$1.isArray(label) ? label.length : 1; - var lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines); - - if (isHorizontal) { - var labelYOffset = tl + tickPadding; - - if (lineValue < me.left - epsilon) { - lineColor = 'rgba(0,0,0,0)'; - } - - tx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth); - ty1 = tickStart; - ty2 = tickEnd; - labelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option) - - if (position === 'top') { - y1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2; - y2 = chartArea.bottom; - textOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight; - textAlign = !isRotated ? 'center' : 'left'; - labelY = me.bottom - labelYOffset; - } else { - y1 = chartArea.top; - y2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2; - textOffset = (!isRotated ? 0.5 : 0) * lineHeight; - textAlign = !isRotated ? 'center' : 'right'; - labelY = me.top + labelYOffset; - } - } else { - var labelXOffset = (isMirrored ? 0 : tl) + tickPadding; - - if (lineValue < me.top - epsilon) { - lineColor = 'rgba(0,0,0,0)'; - } - - tx1 = tickStart; - tx2 = tickEnd; - ty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth); - labelY = me.getPixelForTick(index) + labelOffset; - textOffset = (1 - labelCount) * lineHeight / 2; - - if (position === 'left') { - x1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2; - x2 = chartArea.right; - textAlign = isMirrored ? 'left' : 'right'; - labelX = me.right - labelXOffset; - } else { - x1 = chartArea.left; - x2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2; - textAlign = isMirrored ? 'right' : 'left'; - labelX = me.left + labelXOffset; - } - } - - itemsToDraw.push({ - tx1: tx1, - ty1: ty1, - tx2: tx2, - ty2: ty2, - x1: x1, - y1: y1, - x2: x2, - y2: y2, - labelX: labelX, - labelY: labelY, - glWidth: lineWidth, - glColor: lineColor, - glBorderDash: borderDash, - glBorderDashOffset: borderDashOffset, - rotation: -1 * labelRotationRadians, - label: label, - major: tick.major, - textOffset: textOffset, - textAlign: textAlign - }); - }); - - // Draw all of the tick labels, tick marks, and grid lines at the correct places - helpers$1.each(itemsToDraw, function(itemToDraw) { - var glWidth = itemToDraw.glWidth; - var glColor = itemToDraw.glColor; - - if (gridLines.display && glWidth && glColor) { - context.save(); - context.lineWidth = glWidth; - context.strokeStyle = glColor; - if (context.setLineDash) { - context.setLineDash(itemToDraw.glBorderDash); - context.lineDashOffset = itemToDraw.glBorderDashOffset; - } - - context.beginPath(); - - if (gridLines.drawTicks) { - context.moveTo(itemToDraw.tx1, itemToDraw.ty1); - context.lineTo(itemToDraw.tx2, itemToDraw.ty2); - } - - if (gridLines.drawOnChartArea) { - context.moveTo(itemToDraw.x1, itemToDraw.y1); - context.lineTo(itemToDraw.x2, itemToDraw.y2); - } - - context.stroke(); - context.restore(); - } - - if (optionTicks.display) { - // Make sure we draw text in the correct color and font - context.save(); - context.translate(itemToDraw.labelX, itemToDraw.labelY); - context.rotate(itemToDraw.rotation); - context.font = itemToDraw.major ? majorTickFont.string : tickFont.string; - context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; - context.textBaseline = 'middle'; - context.textAlign = itemToDraw.textAlign; - - var label = itemToDraw.label; - var y = itemToDraw.textOffset; - if (helpers$1.isArray(label)) { - for (var i = 0; i < label.length; ++i) { - // We just make sure the multiline element is a string here.. - context.fillText('' + label[i], 0, y); - y += lineHeight; - } - } else { - context.fillText(label, 0, y); - } - context.restore(); - } - }); - - if (scaleLabel.display) { - // Draw the scale label - var scaleLabelX; - var scaleLabelY; - var rotation = 0; - var halfLineHeight = scaleLabelFont.lineHeight / 2; - - if (isHorizontal) { - scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width - scaleLabelY = position === 'bottom' - ? me.bottom - halfLineHeight - scaleLabelPadding.bottom - : me.top + halfLineHeight + scaleLabelPadding.top; - } else { - var isLeft = position === 'left'; - scaleLabelX = isLeft - ? me.left + halfLineHeight + scaleLabelPadding.top - : me.right - halfLineHeight - scaleLabelPadding.top; - scaleLabelY = me.top + ((me.bottom - me.top) / 2); - rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; - } - - context.save(); - context.translate(scaleLabelX, scaleLabelY); - context.rotate(rotation); - context.textAlign = 'center'; - context.textBaseline = 'middle'; - context.fillStyle = scaleLabelFontColor; // render in correct colour - context.font = scaleLabelFont.string; - context.fillText(scaleLabel.labelString, 0, 0); - context.restore(); - } - - if (axisWidth) { - // Draw the line at the edge of the axis - var firstLineWidth = axisWidth; - var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0); - var x1, x2, y1, y2; - - if (isHorizontal) { - x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2; - x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2; - y1 = y2 = borderValue; - } else { - y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2; - y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2; - x1 = x2 = borderValue; - } - - context.lineWidth = axisWidth; - context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0); - context.beginPath(); - context.moveTo(x1, y1); - context.lineTo(x2, y2); - context.stroke(); - } - } -}); - -var defaultConfig = { - position: 'bottom' -}; - -var scale_category = core_scale.extend({ - /** - * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those - * else fall back to data.labels - * @private - */ - getLabels: function() { - var data = this.chart.data; - return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; - }, - - determineDataLimits: function() { - var me = this; - var labels = me.getLabels(); - me.minIndex = 0; - me.maxIndex = labels.length - 1; - var findIndex; - - if (me.options.ticks.min !== undefined) { - // user specified min value - findIndex = labels.indexOf(me.options.ticks.min); - me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; - } - - if (me.options.ticks.max !== undefined) { - // user specified max value - findIndex = labels.indexOf(me.options.ticks.max); - me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; - } - - me.min = labels[me.minIndex]; - me.max = labels[me.maxIndex]; - }, - - buildTicks: function() { - var me = this; - var labels = me.getLabels(); - // If we are viewing some subset of labels, slice the original array - me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); - }, - - getLabelForIndex: function(index, datasetIndex) { - var me = this; - var chart = me.chart; - - if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) { - return me.getRightValue(chart.data.datasets[datasetIndex].data[index]); - } - - return me.ticks[index - me.minIndex]; - }, - - // Used to get data value locations. Value can either be an index or a numerical value - getPixelForValue: function(value, index) { - var me = this; - var offset = me.options.offset; - // 1 is added because we need the length but we have the indexes - var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); - - // If value is a data object, then index is the index in the data array, - // not the index of the scale. We need to change that. - var valueCategory; - if (value !== undefined && value !== null) { - valueCategory = me.isHorizontal() ? value.x : value.y; - } - if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { - var labels = me.getLabels(); - value = valueCategory || value; - var idx = labels.indexOf(value); - index = idx !== -1 ? idx : index; - } - - if (me.isHorizontal()) { - var valueWidth = me.width / offsetAmt; - var widthOffset = (valueWidth * (index - me.minIndex)); - - if (offset) { - widthOffset += (valueWidth / 2); - } - - return me.left + widthOffset; - } - var valueHeight = me.height / offsetAmt; - var heightOffset = (valueHeight * (index - me.minIndex)); - - if (offset) { - heightOffset += (valueHeight / 2); - } - - return me.top + heightOffset; - }, - - getPixelForTick: function(index) { - return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); - }, - - getValueForPixel: function(pixel) { - var me = this; - var offset = me.options.offset; - var value; - var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); - var horz = me.isHorizontal(); - var valueDimension = (horz ? me.width : me.height) / offsetAmt; - - pixel -= horz ? me.left : me.top; - - if (offset) { - pixel -= (valueDimension / 2); - } - - if (pixel <= 0) { - value = 0; - } else { - value = Math.round(pixel / valueDimension); - } - - return value + me.minIndex; - }, - - getBasePixel: function() { - return this.bottom; - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults = defaultConfig; -scale_category._defaults = _defaults; - -var noop = helpers$1.noop; -var isNullOrUndef = helpers$1.isNullOrUndef; - -/** - * Generate a set of linear ticks - * @param generationOptions the options used to generate the ticks - * @param dataRange the range of the data - * @returns {number[]} array of tick values - */ -function generateTicks(generationOptions, dataRange) { - var ticks = []; - // To get a "nice" value for the tick spacing, we will use the appropriately named - // "nice number" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks - // for details. - - var MIN_SPACING = 1e-14; - var stepSize = generationOptions.stepSize; - var unit = stepSize || 1; - var maxNumSpaces = generationOptions.maxTicks - 1; - var min = generationOptions.min; - var max = generationOptions.max; - var precision = generationOptions.precision; - var rmin = dataRange.min; - var rmax = dataRange.max; - var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit; - var factor, niceMin, niceMax, numSpaces; - - // Beyond MIN_SPACING floating point numbers being to lose precision - // such that we can't do the math necessary to generate ticks - if (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) { - return [rmin, rmax]; - } - - numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); - if (numSpaces > maxNumSpaces) { - // If the calculated num of spaces exceeds maxNumSpaces, recalculate it - spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit; - } - - if (stepSize || isNullOrUndef(precision)) { - // If a precision is not specified, calculate factor based on spacing - factor = Math.pow(10, helpers$1._decimalPlaces(spacing)); - } else { - // If the user specified a precision, round to that number of decimal places - factor = Math.pow(10, precision); - spacing = Math.ceil(spacing * factor) / factor; - } - - niceMin = Math.floor(rmin / spacing) * spacing; - niceMax = Math.ceil(rmax / spacing) * spacing; - - // If min, max and stepSize is set and they make an evenly spaced scale use it. - if (stepSize) { - // If very close to our whole number, use it. - if (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) { - niceMin = min; - } - if (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) { - niceMax = max; - } - } - - numSpaces = (niceMax - niceMin) / spacing; - // If very close to our rounded value, use it. - if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { - numSpaces = Math.round(numSpaces); - } else { - numSpaces = Math.ceil(numSpaces); - } - - niceMin = Math.round(niceMin * factor) / factor; - niceMax = Math.round(niceMax * factor) / factor; - ticks.push(isNullOrUndef(min) ? niceMin : min); - for (var j = 1; j < numSpaces; ++j) { - ticks.push(Math.round((niceMin + j * spacing) * factor) / factor); - } - ticks.push(isNullOrUndef(max) ? niceMax : max); - - return ticks; -} - -var scale_linearbase = core_scale.extend({ - getRightValue: function(value) { - if (typeof value === 'string') { - return +value; - } - return core_scale.prototype.getRightValue.call(this, value); - }, - - handleTickRangeOptions: function() { - var me = this; - var opts = me.options; - var tickOpts = opts.ticks; - - // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, - // do nothing since that would make the chart weird. If the user really wants a weird chart - // axis, they can manually override it - if (tickOpts.beginAtZero) { - var minSign = helpers$1.sign(me.min); - var maxSign = helpers$1.sign(me.max); - - if (minSign < 0 && maxSign < 0) { - // move the top up to 0 - me.max = 0; - } else if (minSign > 0 && maxSign > 0) { - // move the bottom down to 0 - me.min = 0; - } - } - - var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; - var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; - - if (tickOpts.min !== undefined) { - me.min = tickOpts.min; - } else if (tickOpts.suggestedMin !== undefined) { - if (me.min === null) { - me.min = tickOpts.suggestedMin; - } else { - me.min = Math.min(me.min, tickOpts.suggestedMin); - } - } - - if (tickOpts.max !== undefined) { - me.max = tickOpts.max; - } else if (tickOpts.suggestedMax !== undefined) { - if (me.max === null) { - me.max = tickOpts.suggestedMax; - } else { - me.max = Math.max(me.max, tickOpts.suggestedMax); - } - } - - if (setMin !== setMax) { - // We set the min or the max but not both. - // So ensure that our range is good - // Inverted or 0 length range can happen when - // ticks.min is set, and no datasets are visible - if (me.min >= me.max) { - if (setMin) { - me.max = me.min + 1; - } else { - me.min = me.max - 1; - } - } - } - - if (me.min === me.max) { - me.max++; - - if (!tickOpts.beginAtZero) { - me.min--; - } - } - }, - - getTickLimit: function() { - var me = this; - var tickOpts = me.options.ticks; - var stepSize = tickOpts.stepSize; - var maxTicksLimit = tickOpts.maxTicksLimit; - var maxTicks; - - if (stepSize) { - maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1; - } else { - maxTicks = me._computeTickLimit(); - maxTicksLimit = maxTicksLimit || 11; - } - - if (maxTicksLimit) { - maxTicks = Math.min(maxTicksLimit, maxTicks); - } - - return maxTicks; - }, - - _computeTickLimit: function() { - return Number.POSITIVE_INFINITY; - }, - - handleDirectionalChanges: noop, - - buildTicks: function() { - var me = this; - var opts = me.options; - var tickOpts = opts.ticks; - - // Figure out what the max number of ticks we can support it is based on the size of - // the axis area. For now, we say that the minimum tick spacing in pixels must be 40 - // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on - // the graph. Make sure we always have at least 2 ticks - var maxTicks = me.getTickLimit(); - maxTicks = Math.max(2, maxTicks); - - var numericGeneratorOptions = { - maxTicks: maxTicks, - min: tickOpts.min, - max: tickOpts.max, - precision: tickOpts.precision, - stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) - }; - var ticks = me.ticks = generateTicks(numericGeneratorOptions, me); - - me.handleDirectionalChanges(); - - // At this point, we need to update our max and min given the tick values since we have expanded the - // range of the scale - me.max = helpers$1.max(ticks); - me.min = helpers$1.min(ticks); - - if (tickOpts.reverse) { - ticks.reverse(); - - me.start = me.max; - me.end = me.min; - } else { - me.start = me.min; - me.end = me.max; - } - }, - - convertTicksToLabels: function() { - var me = this; - me.ticksAsNumbers = me.ticks.slice(); - me.zeroLineIndex = me.ticks.indexOf(0); - - core_scale.prototype.convertTicksToLabels.call(me); - } -}); - -var defaultConfig$1 = { - position: 'left', - ticks: { - callback: core_ticks.formatters.linear - } -}; - -var scale_linear = scale_linearbase.extend({ - determineDataLimits: function() { - var me = this; - var opts = me.options; - var chart = me.chart; - var data = chart.data; - var datasets = data.datasets; - var isHorizontal = me.isHorizontal(); - var DEFAULT_MIN = 0; - var DEFAULT_MAX = 1; - - function IDMatches(meta) { - return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; - } - - // First Calculate the range - me.min = null; - me.max = null; - - var hasStacks = opts.stacked; - if (hasStacks === undefined) { - helpers$1.each(datasets, function(dataset, datasetIndex) { - if (hasStacks) { - return; - } - - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && - meta.stack !== undefined) { - hasStacks = true; - } - }); - } - - if (opts.stacked || hasStacks) { - var valuesPerStack = {}; - - helpers$1.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - var key = [ - meta.type, - // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined - ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), - meta.stack - ].join('.'); - - if (valuesPerStack[key] === undefined) { - valuesPerStack[key] = { - positiveValues: [], - negativeValues: [] - }; - } - - // Store these per type - var positiveValues = valuesPerStack[key].positiveValues; - var negativeValues = valuesPerStack[key].negativeValues; - - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers$1.each(dataset.data, function(rawValue, index) { - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - positiveValues[index] = positiveValues[index] || 0; - negativeValues[index] = negativeValues[index] || 0; - - if (opts.relativePoints) { - positiveValues[index] = 100; - } else if (value < 0) { - negativeValues[index] += value; - } else { - positiveValues[index] += value; - } - }); - } - }); - - helpers$1.each(valuesPerStack, function(valuesForType) { - var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); - var minVal = helpers$1.min(values); - var maxVal = helpers$1.max(values); - me.min = me.min === null ? minVal : Math.min(me.min, minVal); - me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); - }); - - } else { - helpers$1.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers$1.each(dataset.data, function(rawValue, index) { - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - if (me.min === null) { - me.min = value; - } else if (value < me.min) { - me.min = value; - } - - if (me.max === null) { - me.max = value; - } else if (value > me.max) { - me.max = value; - } - }); - } - }); - } - - me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; - me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; - - // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero - this.handleTickRangeOptions(); - }, - - // Returns the maximum number of ticks based on the scale dimension - _computeTickLimit: function() { - var me = this; - var tickFont; - - if (me.isHorizontal()) { - return Math.ceil(me.width / 40); - } - tickFont = helpers$1.options._parseFont(me.options.ticks); - return Math.ceil(me.height / tickFont.lineHeight); - }, - - // Called after the ticks are built. We need - handleDirectionalChanges: function() { - if (!this.isHorizontal()) { - // We are in a vertical orientation. The top value is the highest. So reverse the array - this.ticks.reverse(); - } - }, - - getLabelForIndex: function(index, datasetIndex) { - return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); - }, - - // Utils - getPixelForValue: function(value) { - // This must be called after fit has been run so that - // this.left, this.top, this.right, and this.bottom have been defined - var me = this; - var start = me.start; - - var rightValue = +me.getRightValue(value); - var pixel; - var range = me.end - start; - - if (me.isHorizontal()) { - pixel = me.left + (me.width / range * (rightValue - start)); - } else { - pixel = me.bottom - (me.height / range * (rightValue - start)); - } - return pixel; - }, - - getValueForPixel: function(pixel) { - var me = this; - var isHorizontal = me.isHorizontal(); - var innerDimension = isHorizontal ? me.width : me.height; - var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; - return me.start + ((me.end - me.start) * offset); - }, - - getPixelForTick: function(index) { - return this.getPixelForValue(this.ticksAsNumbers[index]); - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults$1 = defaultConfig$1; -scale_linear._defaults = _defaults$1; - -var valueOrDefault$a = helpers$1.valueOrDefault; - -/** - * Generate a set of logarithmic ticks - * @param generationOptions the options used to generate the ticks - * @param dataRange the range of the data - * @returns {number[]} array of tick values - */ -function generateTicks$1(generationOptions, dataRange) { - var ticks = []; - - var tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min)))); - - var endExp = Math.floor(helpers$1.log10(dataRange.max)); - var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); - var exp, significand; - - if (tickVal === 0) { - exp = Math.floor(helpers$1.log10(dataRange.minNotZero)); - significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); - - ticks.push(tickVal); - tickVal = significand * Math.pow(10, exp); - } else { - exp = Math.floor(helpers$1.log10(tickVal)); - significand = Math.floor(tickVal / Math.pow(10, exp)); - } - var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; - - do { - ticks.push(tickVal); - - ++significand; - if (significand === 10) { - significand = 1; - ++exp; - precision = exp >= 0 ? 1 : precision; - } - - tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision; - } while (exp < endExp || (exp === endExp && significand < endSignificand)); - - var lastTick = valueOrDefault$a(generationOptions.max, tickVal); - ticks.push(lastTick); - - return ticks; -} - -var defaultConfig$2 = { - position: 'left', - - // label settings - ticks: { - callback: core_ticks.formatters.logarithmic - } -}; - -// TODO(v3): change this to positiveOrDefault -function nonNegativeOrDefault(value, defaultValue) { - return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue; -} - -var scale_logarithmic = core_scale.extend({ - determineDataLimits: function() { - var me = this; - var opts = me.options; - var chart = me.chart; - var data = chart.data; - var datasets = data.datasets; - var isHorizontal = me.isHorizontal(); - function IDMatches(meta) { - return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; - } - - // Calculate Range - me.min = null; - me.max = null; - me.minNotZero = null; - - var hasStacks = opts.stacked; - if (hasStacks === undefined) { - helpers$1.each(datasets, function(dataset, datasetIndex) { - if (hasStacks) { - return; - } - - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && - meta.stack !== undefined) { - hasStacks = true; - } - }); - } - - if (opts.stacked || hasStacks) { - var valuesPerStack = {}; - - helpers$1.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - var key = [ - meta.type, - // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined - ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), - meta.stack - ].join('.'); - - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - if (valuesPerStack[key] === undefined) { - valuesPerStack[key] = []; - } - - helpers$1.each(dataset.data, function(rawValue, index) { - var values = valuesPerStack[key]; - var value = +me.getRightValue(rawValue); - // invalid, hidden and negative values are ignored - if (isNaN(value) || meta.data[index].hidden || value < 0) { - return; - } - values[index] = values[index] || 0; - values[index] += value; - }); - } - }); - - helpers$1.each(valuesPerStack, function(valuesForType) { - if (valuesForType.length > 0) { - var minVal = helpers$1.min(valuesForType); - var maxVal = helpers$1.max(valuesForType); - me.min = me.min === null ? minVal : Math.min(me.min, minVal); - me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); - } - }); - - } else { - helpers$1.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers$1.each(dataset.data, function(rawValue, index) { - var value = +me.getRightValue(rawValue); - // invalid, hidden and negative values are ignored - if (isNaN(value) || meta.data[index].hidden || value < 0) { - return; - } - - if (me.min === null) { - me.min = value; - } else if (value < me.min) { - me.min = value; - } - - if (me.max === null) { - me.max = value; - } else if (value > me.max) { - me.max = value; - } - - if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { - me.minNotZero = value; - } - }); - } - }); - } - - // Common base implementation to handle ticks.min, ticks.max - this.handleTickRangeOptions(); - }, - - handleTickRangeOptions: function() { - var me = this; - var tickOpts = me.options.ticks; - var DEFAULT_MIN = 1; - var DEFAULT_MAX = 10; - - me.min = nonNegativeOrDefault(tickOpts.min, me.min); - me.max = nonNegativeOrDefault(tickOpts.max, me.max); - - if (me.min === me.max) { - if (me.min !== 0 && me.min !== null) { - me.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1); - me.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1); - } else { - me.min = DEFAULT_MIN; - me.max = DEFAULT_MAX; - } - } - if (me.min === null) { - me.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1); - } - if (me.max === null) { - me.max = me.min !== 0 - ? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1) - : DEFAULT_MAX; - } - if (me.minNotZero === null) { - if (me.min > 0) { - me.minNotZero = me.min; - } else if (me.max < 1) { - me.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max))); - } else { - me.minNotZero = DEFAULT_MIN; - } - } - }, - - buildTicks: function() { - var me = this; - var tickOpts = me.options.ticks; - var reverse = !me.isHorizontal(); - - var generationOptions = { - min: nonNegativeOrDefault(tickOpts.min), - max: nonNegativeOrDefault(tickOpts.max) - }; - var ticks = me.ticks = generateTicks$1(generationOptions, me); - - // At this point, we need to update our max and min given the tick values since we have expanded the - // range of the scale - me.max = helpers$1.max(ticks); - me.min = helpers$1.min(ticks); - - if (tickOpts.reverse) { - reverse = !reverse; - me.start = me.max; - me.end = me.min; - } else { - me.start = me.min; - me.end = me.max; - } - if (reverse) { - ticks.reverse(); - } - }, - - convertTicksToLabels: function() { - this.tickValues = this.ticks.slice(); - - core_scale.prototype.convertTicksToLabels.call(this); - }, - - // Get the correct tooltip label - getLabelForIndex: function(index, datasetIndex) { - return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); - }, - - getPixelForTick: function(index) { - return this.getPixelForValue(this.tickValues[index]); - }, - - /** - * Returns the value of the first tick. - * @param {number} value - The minimum not zero value. - * @return {number} The first tick value. - * @private - */ - _getFirstTickValue: function(value) { - var exp = Math.floor(helpers$1.log10(value)); - var significand = Math.floor(value / Math.pow(10, exp)); - - return significand * Math.pow(10, exp); - }, - - getPixelForValue: function(value) { - var me = this; - var tickOpts = me.options.ticks; - var reverse = tickOpts.reverse; - var log10 = helpers$1.log10; - var firstTickValue = me._getFirstTickValue(me.minNotZero); - var offset = 0; - var innerDimension, pixel, start, end, sign; - - value = +me.getRightValue(value); - if (reverse) { - start = me.end; - end = me.start; - sign = -1; - } else { - start = me.start; - end = me.end; - sign = 1; - } - if (me.isHorizontal()) { - innerDimension = me.width; - pixel = reverse ? me.right : me.left; - } else { - innerDimension = me.height; - sign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0) - pixel = reverse ? me.top : me.bottom; - } - if (value !== start) { - if (start === 0) { // include zero tick - offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); - innerDimension -= offset; - start = firstTickValue; - } - if (value !== 0) { - offset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start)); - } - pixel += sign * offset; - } - return pixel; - }, - - getValueForPixel: function(pixel) { - var me = this; - var tickOpts = me.options.ticks; - var reverse = tickOpts.reverse; - var log10 = helpers$1.log10; - var firstTickValue = me._getFirstTickValue(me.minNotZero); - var innerDimension, start, end, value; - - if (reverse) { - start = me.end; - end = me.start; - } else { - start = me.start; - end = me.end; - } - if (me.isHorizontal()) { - innerDimension = me.width; - value = reverse ? me.right - pixel : pixel - me.left; - } else { - innerDimension = me.height; - value = reverse ? pixel - me.top : me.bottom - pixel; - } - if (value !== start) { - if (start === 0) { // include zero tick - var offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); - value -= offset; - innerDimension -= offset; - start = firstTickValue; - } - value *= log10(end) - log10(start); - value /= innerDimension; - value = Math.pow(10, log10(start) + value); - } - return value; - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults$2 = defaultConfig$2; -scale_logarithmic._defaults = _defaults$2; - -var valueOrDefault$b = helpers$1.valueOrDefault; -var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault; -var resolve$7 = helpers$1.options.resolve; - -var defaultConfig$3 = { - display: true, - - // Boolean - Whether to animate scaling the chart from the centre - animate: true, - position: 'chartArea', - - angleLines: { - display: true, - color: 'rgba(0, 0, 0, 0.1)', - lineWidth: 1, - borderDash: [], - borderDashOffset: 0.0 - }, - - gridLines: { - circular: false - }, - - // label settings - ticks: { - // Boolean - Show a backdrop to the scale label - showLabelBackdrop: true, - - // String - The colour of the label backdrop - backdropColor: 'rgba(255,255,255,0.75)', - - // Number - The backdrop padding above & below the label in pixels - backdropPaddingY: 2, - - // Number - The backdrop padding to the side of the label in pixels - backdropPaddingX: 2, - - callback: core_ticks.formatters.linear - }, - - pointLabels: { - // Boolean - if true, show point labels - display: true, - - // Number - Point label font size in pixels - fontSize: 10, - - // Function - Used to convert point labels - callback: function(label) { - return label; - } - } -}; - -function getValueCount(scale) { - var opts = scale.options; - return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; -} - -function getTickBackdropHeight(opts) { - var tickOpts = opts.ticks; - - if (tickOpts.display && opts.display) { - return valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2; - } - return 0; -} - -function measureLabelSize(ctx, lineHeight, label) { - if (helpers$1.isArray(label)) { - return { - w: helpers$1.longestText(ctx, ctx.font, label), - h: label.length * lineHeight - }; - } - - return { - w: ctx.measureText(label).width, - h: lineHeight - }; -} - -function determineLimits(angle, pos, size, min, max) { - if (angle === min || angle === max) { - return { - start: pos - (size / 2), - end: pos + (size / 2) - }; - } else if (angle < min || angle > max) { - return { - start: pos - size, - end: pos - }; - } - - return { - start: pos, - end: pos + size - }; -} - -/** - * Helper function to fit a radial linear scale with point labels - */ -function fitWithPointLabels(scale) { - - // Right, this is really confusing and there is a lot of maths going on here - // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 - // - // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif - // - // Solution: - // - // We assume the radius of the polygon is half the size of the canvas at first - // at each index we check if the text overlaps. - // - // Where it does, we store that angle and that index. - // - // After finding the largest index and angle we calculate how much we need to remove - // from the shape radius to move the point inwards by that x. - // - // We average the left and right distances to get the maximum shape radius that can fit in the box - // along with labels. - // - // Once we have that, we can find the centre point for the chart, by taking the x text protrusion - // on each side, removing that from the size, halving it and adding the left x protrusion width. - // - // This will mean we have a shape fitted to the canvas, as large as it can be with the labels - // and position it in the most space efficient manner - // - // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif - - var plFont = helpers$1.options._parseFont(scale.options.pointLabels); - - // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. - // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points - var furthestLimits = { - l: 0, - r: scale.width, - t: 0, - b: scale.height - scale.paddingTop - }; - var furthestAngles = {}; - var i, textSize, pointPosition; - - scale.ctx.font = plFont.string; - scale._pointLabelSizes = []; - - var valueCount = getValueCount(scale); - for (i = 0; i < valueCount; i++) { - pointPosition = scale.getPointPosition(i, scale.drawingArea + 5); - textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || ''); - scale._pointLabelSizes[i] = textSize; - - // Add quarter circle to make degree 0 mean top of circle - var angleRadians = scale.getIndexAngle(i); - var angle = helpers$1.toDegrees(angleRadians) % 360; - var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); - var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); - - if (hLimits.start < furthestLimits.l) { - furthestLimits.l = hLimits.start; - furthestAngles.l = angleRadians; - } - - if (hLimits.end > furthestLimits.r) { - furthestLimits.r = hLimits.end; - furthestAngles.r = angleRadians; - } - - if (vLimits.start < furthestLimits.t) { - furthestLimits.t = vLimits.start; - furthestAngles.t = angleRadians; - } - - if (vLimits.end > furthestLimits.b) { - furthestLimits.b = vLimits.end; - furthestAngles.b = angleRadians; - } - } - - scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles); -} - -function getTextAlignForAngle(angle) { - if (angle === 0 || angle === 180) { - return 'center'; - } else if (angle < 180) { - return 'left'; - } - - return 'right'; -} - -function fillText(ctx, text, position, lineHeight) { - var y = position.y + lineHeight / 2; - var i, ilen; - - if (helpers$1.isArray(text)) { - for (i = 0, ilen = text.length; i < ilen; ++i) { - ctx.fillText(text[i], position.x, y); - y += lineHeight; - } - } else { - ctx.fillText(text, position.x, y); - } -} - -function adjustPointPositionForLabelHeight(angle, textSize, position) { - if (angle === 90 || angle === 270) { - position.y -= (textSize.h / 2); - } else if (angle > 270 || angle < 90) { - position.y -= textSize.h; - } -} - -function drawPointLabels(scale) { - var ctx = scale.ctx; - var opts = scale.options; - var angleLineOpts = opts.angleLines; - var gridLineOpts = opts.gridLines; - var pointLabelOpts = opts.pointLabels; - var lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth); - var lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color); - var tickBackdropHeight = getTickBackdropHeight(opts); - - ctx.save(); - ctx.lineWidth = lineWidth; - ctx.strokeStyle = lineColor; - if (ctx.setLineDash) { - ctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []])); - ctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]); - } - - var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); - - // Point Label Font - var plFont = helpers$1.options._parseFont(pointLabelOpts); - - ctx.font = plFont.string; - ctx.textBaseline = 'middle'; - - for (var i = getValueCount(scale) - 1; i >= 0; i--) { - if (angleLineOpts.display && lineWidth && lineColor) { - var outerPosition = scale.getPointPosition(i, outerDistance); - ctx.beginPath(); - ctx.moveTo(scale.xCenter, scale.yCenter); - ctx.lineTo(outerPosition.x, outerPosition.y); - ctx.stroke(); - } - - if (pointLabelOpts.display) { - // Extra pixels out for some label spacing - var extra = (i === 0 ? tickBackdropHeight / 2 : 0); - var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5); - - // Keep this in loop since we may support array properties here - var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor); - ctx.fillStyle = pointLabelFontColor; - - var angleRadians = scale.getIndexAngle(i); - var angle = helpers$1.toDegrees(angleRadians); - ctx.textAlign = getTextAlignForAngle(angle); - adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); - fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight); - } - } - ctx.restore(); -} - -function drawRadiusLine(scale, gridLineOpts, radius, index) { - var ctx = scale.ctx; - var circular = gridLineOpts.circular; - var valueCount = getValueCount(scale); - var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1); - var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1); - var pointPosition; - - if ((!circular && !valueCount) || !lineColor || !lineWidth) { - return; - } - - ctx.save(); - ctx.strokeStyle = lineColor; - ctx.lineWidth = lineWidth; - if (ctx.setLineDash) { - ctx.setLineDash(gridLineOpts.borderDash || []); - ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0; - } - - ctx.beginPath(); - if (circular) { - // Draw circular arcs between the points - ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); - } else { - // Draw straight lines connecting each index - pointPosition = scale.getPointPosition(0, radius); - ctx.moveTo(pointPosition.x, pointPosition.y); - - for (var i = 1; i < valueCount; i++) { - pointPosition = scale.getPointPosition(i, radius); - ctx.lineTo(pointPosition.x, pointPosition.y); - } - } - ctx.closePath(); - ctx.stroke(); - ctx.restore(); -} - -function numberOrZero(param) { - return helpers$1.isNumber(param) ? param : 0; -} - -var scale_radialLinear = scale_linearbase.extend({ - setDimensions: function() { - var me = this; - - // Set the unconstrained dimension before label rotation - me.width = me.maxWidth; - me.height = me.maxHeight; - me.paddingTop = getTickBackdropHeight(me.options) / 2; - me.xCenter = Math.floor(me.width / 2); - me.yCenter = Math.floor((me.height - me.paddingTop) / 2); - me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2; - }, - - determineDataLimits: function() { - var me = this; - var chart = me.chart; - var min = Number.POSITIVE_INFINITY; - var max = Number.NEGATIVE_INFINITY; - - helpers$1.each(chart.data.datasets, function(dataset, datasetIndex) { - if (chart.isDatasetVisible(datasetIndex)) { - var meta = chart.getDatasetMeta(datasetIndex); - - helpers$1.each(dataset.data, function(rawValue, index) { - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - min = Math.min(value, min); - max = Math.max(value, max); - }); - } - }); - - me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); - me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); - - // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero - me.handleTickRangeOptions(); - }, - - // Returns the maximum number of ticks based on the scale dimension - _computeTickLimit: function() { - return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); - }, - - convertTicksToLabels: function() { - var me = this; - - scale_linearbase.prototype.convertTicksToLabels.call(me); - - // Point labels - me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); - }, - - getLabelForIndex: function(index, datasetIndex) { - return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); - }, - - fit: function() { - var me = this; - var opts = me.options; - - if (opts.display && opts.pointLabels.display) { - fitWithPointLabels(me); - } else { - me.setCenterPoint(0, 0, 0, 0); - } - }, - - /** - * Set radius reductions and determine new radius and center point - * @private - */ - setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) { - var me = this; - var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); - var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); - var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); - var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b); - - radiusReductionLeft = numberOrZero(radiusReductionLeft); - radiusReductionRight = numberOrZero(radiusReductionRight); - radiusReductionTop = numberOrZero(radiusReductionTop); - radiusReductionBottom = numberOrZero(radiusReductionBottom); - - me.drawingArea = Math.min( - Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), - Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); - me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); - }, - - setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) { - var me = this; - var maxRight = me.width - rightMovement - me.drawingArea; - var maxLeft = leftMovement + me.drawingArea; - var maxTop = topMovement + me.drawingArea; - var maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea; - - me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left); - me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop); - }, - - getIndexAngle: function(index) { - var angleMultiplier = (Math.PI * 2) / getValueCount(this); - var startAngle = this.chart.options && this.chart.options.startAngle ? - this.chart.options.startAngle : - 0; - - var startAngleRadians = startAngle * Math.PI * 2 / 360; - - // Start from the top instead of right, so remove a quarter of the circle - return index * angleMultiplier + startAngleRadians; - }, - - getDistanceFromCenterForValue: function(value) { - var me = this; - - if (value === null) { - return 0; // null always in center - } - - // Take into account half font size + the yPadding of the top value - var scalingFactor = me.drawingArea / (me.max - me.min); - if (me.options.ticks.reverse) { - return (me.max - value) * scalingFactor; - } - return (value - me.min) * scalingFactor; - }, - - getPointPosition: function(index, distanceFromCenter) { - var me = this; - var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); - return { - x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter, - y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter - }; - }, - - getPointPositionForValue: function(index, value) { - return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); - }, - - getBasePosition: function() { - var me = this; - var min = me.min; - var max = me.max; - - return me.getPointPositionForValue(0, - me.beginAtZero ? 0 : - min < 0 && max < 0 ? max : - min > 0 && max > 0 ? min : - 0); - }, - - draw: function() { - var me = this; - var opts = me.options; - var gridLineOpts = opts.gridLines; - var tickOpts = opts.ticks; - - if (opts.display) { - var ctx = me.ctx; - var startAngle = this.getIndexAngle(0); - var tickFont = helpers$1.options._parseFont(tickOpts); - - if (opts.angleLines.display || opts.pointLabels.display) { - drawPointLabels(me); - } - - helpers$1.each(me.ticks, function(label, index) { - // Don't draw a centre value (if it is minimum) - if (index > 0 || tickOpts.reverse) { - var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); - - // Draw circular lines around the scale - if (gridLineOpts.display && index !== 0) { - drawRadiusLine(me, gridLineOpts, yCenterOffset, index); - } - - if (tickOpts.display) { - var tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor); - ctx.font = tickFont.string; - - ctx.save(); - ctx.translate(me.xCenter, me.yCenter); - ctx.rotate(startAngle); - - if (tickOpts.showLabelBackdrop) { - var labelWidth = ctx.measureText(label).width; - ctx.fillStyle = tickOpts.backdropColor; - ctx.fillRect( - -labelWidth / 2 - tickOpts.backdropPaddingX, - -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY, - labelWidth + tickOpts.backdropPaddingX * 2, - tickFont.size + tickOpts.backdropPaddingY * 2 - ); - } - - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = tickFontColor; - ctx.fillText(label, 0, -yCenterOffset); - ctx.restore(); - } - } - }); - } - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults$3 = defaultConfig$3; -scale_radialLinear._defaults = _defaults$3; - -var valueOrDefault$c = helpers$1.valueOrDefault; - -// Integer constants are from the ES6 spec. -var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; -var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; - -var INTERVALS = { - millisecond: { - common: true, - size: 1, - steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] - }, - second: { - common: true, - size: 1000, - steps: [1, 2, 5, 10, 15, 30] - }, - minute: { - common: true, - size: 60000, - steps: [1, 2, 5, 10, 15, 30] - }, - hour: { - common: true, - size: 3600000, - steps: [1, 2, 3, 6, 12] - }, - day: { - common: true, - size: 86400000, - steps: [1, 2, 5] - }, - week: { - common: false, - size: 604800000, - steps: [1, 2, 3, 4] - }, - month: { - common: true, - size: 2.628e9, - steps: [1, 2, 3] - }, - quarter: { - common: false, - size: 7.884e9, - steps: [1, 2, 3, 4] - }, - year: { - common: true, - size: 3.154e10 - } -}; - -var UNITS = Object.keys(INTERVALS); - -function sorter(a, b) { - return a - b; -} - -function arrayUnique(items) { - var hash = {}; - var out = []; - var i, ilen, item; - - for (i = 0, ilen = items.length; i < ilen; ++i) { - item = items[i]; - if (!hash[item]) { - hash[item] = true; - out.push(item); - } - } - - return out; -} - -/** - * Returns an array of {time, pos} objects used to interpolate a specific `time` or position - * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is - * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other - * extremity (left + width or top + height). Note that it would be more optimized to directly - * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need - * to create the lookup table. The table ALWAYS contains at least two items: min and max. - * - * @param {number[]} timestamps - timestamps sorted from lowest to highest. - * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min - * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. - * If 'series', timestamps will be positioned at the same distance from each other. In this - * case, only timestamps that break the time linearity are registered, meaning that in the - * best case, all timestamps are linear, the table contains only min and max. - */ -function buildLookupTable(timestamps, min, max, distribution) { - if (distribution === 'linear' || !timestamps.length) { - return [ - {time: min, pos: 0}, - {time: max, pos: 1} - ]; - } - - var table = []; - var items = [min]; - var i, ilen, prev, curr, next; - - for (i = 0, ilen = timestamps.length; i < ilen; ++i) { - curr = timestamps[i]; - if (curr > min && curr < max) { - items.push(curr); - } - } - - items.push(max); - - for (i = 0, ilen = items.length; i < ilen; ++i) { - next = items[i + 1]; - prev = items[i - 1]; - curr = items[i]; - - // only add points that breaks the scale linearity - if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { - table.push({time: curr, pos: i / (ilen - 1)}); - } - } - - return table; -} - -// @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ -function lookup(table, key, value) { - var lo = 0; - var hi = table.length - 1; - var mid, i0, i1; - - while (lo >= 0 && lo <= hi) { - mid = (lo + hi) >> 1; - i0 = table[mid - 1] || null; - i1 = table[mid]; - - if (!i0) { - // given value is outside table (before first item) - return {lo: null, hi: i1}; - } else if (i1[key] < value) { - lo = mid + 1; - } else if (i0[key] > value) { - hi = mid - 1; - } else { - return {lo: i0, hi: i1}; - } - } - - // given value is outside table (after last item) - return {lo: i1, hi: null}; -} - -/** - * Linearly interpolates the given source `value` using the table items `skey` values and - * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') - * returns the position for a timestamp equal to 42. If value is out of bounds, values at - * index [0, 1] or [n - 1, n] are used for the interpolation. - */ -function interpolate$1(table, skey, sval, tkey) { - var range = lookup(table, skey, sval); - - // Note: the lookup table ALWAYS contains at least 2 items (min and max) - var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; - var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; - - var span = next[skey] - prev[skey]; - var ratio = span ? (sval - prev[skey]) / span : 0; - var offset = (next[tkey] - prev[tkey]) * ratio; - - return prev[tkey] + offset; -} - -function toTimestamp(scale, input) { - var adapter = scale._adapter; - var options = scale.options.time; - var parser = options.parser; - var format = parser || options.format; - var value = input; - - if (typeof parser === 'function') { - value = parser(value); - } - - // Only parse if its not a timestamp already - if (!helpers$1.isFinite(value)) { - value = typeof format === 'string' - ? adapter.parse(value, format) - : adapter.parse(value); - } - - if (value !== null) { - return +value; - } - - // Labels are in an incompatible format and no `parser` has been provided. - // The user might still use the deprecated `format` option for parsing. - if (!parser && typeof format === 'function') { - value = format(input); - - // `format` could return something else than a timestamp, if so, parse it - if (!helpers$1.isFinite(value)) { - value = adapter.parse(value); - } - } - - return value; -} - -function parse(scale, input) { - if (helpers$1.isNullOrUndef(input)) { - return null; - } - - var options = scale.options.time; - var value = toTimestamp(scale, scale.getRightValue(input)); - if (value === null) { - return value; - } - - if (options.round) { - value = +scale._adapter.startOf(value, options.round); - } - - return value; -} - -/** - * Returns the number of unit to skip to be able to display up to `capacity` number of ticks - * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. - */ -function determineStepSize(min, max, unit, capacity) { - var range = max - min; - var interval = INTERVALS[unit]; - var milliseconds = interval.size; - var steps = interval.steps; - var i, ilen, factor; - - if (!steps) { - return Math.ceil(range / (capacity * milliseconds)); - } - - for (i = 0, ilen = steps.length; i < ilen; ++i) { - factor = steps[i]; - if (Math.ceil(range / (milliseconds * factor)) <= capacity) { - break; - } - } - - return factor; -} - -/** - * Figures out what unit results in an appropriate number of auto-generated ticks - */ -function determineUnitForAutoTicks(minUnit, min, max, capacity) { - var ilen = UNITS.length; - var i, interval, factor; - - for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { - interval = INTERVALS[UNITS[i]]; - factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; - - if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { - return UNITS[i]; - } - } - - return UNITS[ilen - 1]; -} - -/** - * Figures out what unit to format a set of ticks with - */ -function determineUnitForFormatting(scale, ticks, minUnit, min, max) { - var ilen = UNITS.length; - var i, unit; - - for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { - unit = UNITS[i]; - if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) { - return unit; - } - } - - return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; -} - -function determineMajorUnit(unit) { - for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { - if (INTERVALS[UNITS[i]].common) { - return UNITS[i]; - } - } -} - -/** - * Generates a maximum of `capacity` timestamps between min and max, rounded to the - * `minor` unit, aligned on the `major` unit and using the given scale time `options`. - * Important: this method can return ticks outside the min and max range, it's the - * responsibility of the calling code to clamp values if needed. - */ -function generate(scale, min, max, capacity) { - var adapter = scale._adapter; - var options = scale.options; - var timeOpts = options.time; - var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); - var major = determineMajorUnit(minor); - var stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize); - var weekday = minor === 'week' ? timeOpts.isoWeekday : false; - var majorTicksEnabled = options.ticks.major.enabled; - var interval = INTERVALS[minor]; - var first = min; - var last = max; - var ticks = []; - var time; - - if (!stepSize) { - stepSize = determineStepSize(min, max, minor, capacity); - } - - // For 'week' unit, handle the first day of week option - if (weekday) { - first = +adapter.startOf(first, 'isoWeek', weekday); - last = +adapter.startOf(last, 'isoWeek', weekday); - } - - // Align first/last ticks on unit - first = +adapter.startOf(first, weekday ? 'day' : minor); - last = +adapter.startOf(last, weekday ? 'day' : minor); - - // Make sure that the last tick include max - if (last < max) { - last = +adapter.add(last, 1, minor); - } - - time = first; - - if (majorTicksEnabled && major && !weekday && !timeOpts.round) { - // Align the first tick on the previous `minor` unit aligned on the `major` unit: - // we first aligned time on the previous `major` unit then add the number of full - // stepSize there is between first and the previous major time. - time = +adapter.startOf(time, major); - time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor); - } - - for (; time < last; time = +adapter.add(time, stepSize, minor)) { - ticks.push(+time); - } - - ticks.push(+time); - - return ticks; -} - -/** - * Returns the start and end offsets from edges in the form of {start, end} - * where each value is a relative width to the scale and ranges between 0 and 1. - * They add extra margins on the both sides by scaling down the original scale. - * Offsets are added when the `offset` option is true. - */ -function computeOffsets(table, ticks, min, max, options) { - var start = 0; - var end = 0; - var first, last; - - if (options.offset && ticks.length) { - if (!options.time.min) { - first = interpolate$1(table, 'time', ticks[0], 'pos'); - if (ticks.length === 1) { - start = 1 - first; - } else { - start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2; - } - } - if (!options.time.max) { - last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos'); - if (ticks.length === 1) { - end = last; - } else { - end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2; - } - } - } - - return {start: start, end: end}; -} - -function ticksFromTimestamps(scale, values, majorUnit) { - var ticks = []; - var i, ilen, value, major; - - for (i = 0, ilen = values.length; i < ilen; ++i) { - value = values[i]; - major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false; - - ticks.push({ - value: value, - major: major - }); - } - - return ticks; -} - -var defaultConfig$4 = { - position: 'bottom', - - /** - * Data distribution along the scale: - * - 'linear': data are spread according to their time (distances can vary), - * - 'series': data are spread at the same distance from each other. - * @see https://github.com/chartjs/Chart.js/pull/4507 - * @since 2.7.0 - */ - distribution: 'linear', - - /** - * Scale boundary strategy (bypassed by min/max time options) - * - `data`: make sure data are fully visible, ticks outside are removed - * - `ticks`: make sure ticks are fully visible, data outside are truncated - * @see https://github.com/chartjs/Chart.js/pull/4556 - * @since 2.7.0 - */ - bounds: 'data', - - adapters: {}, - time: { - parser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment - format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/ - unit: false, // false == automatic or override with week, month, year, etc. - round: false, // none, or override with week, month, year, etc. - displayFormat: false, // DEPRECATED - isoWeekday: false, // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/ - minUnit: 'millisecond', - displayFormats: {} - }, - ticks: { - autoSkip: false, - - /** - * Ticks generation input values: - * - 'auto': generates "optimal" ticks based on scale size and time options. - * - 'data': generates ticks from data (including labels from data {t|x|y} objects). - * - 'labels': generates ticks from user given `data.labels` values ONLY. - * @see https://github.com/chartjs/Chart.js/pull/4507 - * @since 2.7.0 - */ - source: 'auto', - - major: { - enabled: false - } - } -}; - -var scale_time = core_scale.extend({ - initialize: function() { - this.mergeTicksOptions(); - core_scale.prototype.initialize.call(this); - }, - - update: function() { - var me = this; - var options = me.options; - var time = options.time || (options.time = {}); - var adapter = me._adapter = new core_adapters._date(options.adapters.date); - - // DEPRECATIONS: output a message only one time per update - if (time.format) { - console.warn('options.time.format is deprecated and replaced by options.time.parser.'); - } - - // Backward compatibility: before introducing adapter, `displayFormats` was - // supposed to contain *all* unit/string pairs but this can't be resolved - // when loading the scale (adapters are loaded afterward), so let's populate - // missing formats on update - helpers$1.mergeIf(time.displayFormats, adapter.formats()); - - return core_scale.prototype.update.apply(me, arguments); - }, - - /** - * Allows data to be referenced via 't' attribute - */ - getRightValue: function(rawValue) { - if (rawValue && rawValue.t !== undefined) { - rawValue = rawValue.t; - } - return core_scale.prototype.getRightValue.call(this, rawValue); - }, - - determineDataLimits: function() { - var me = this; - var chart = me.chart; - var adapter = me._adapter; - var timeOpts = me.options.time; - var unit = timeOpts.unit || 'day'; - var min = MAX_INTEGER; - var max = MIN_INTEGER; - var timestamps = []; - var datasets = []; - var labels = []; - var i, j, ilen, jlen, data, timestamp; - var dataLabels = chart.data.labels || []; - - // Convert labels to timestamps - for (i = 0, ilen = dataLabels.length; i < ilen; ++i) { - labels.push(parse(me, dataLabels[i])); - } - - // Convert data to timestamps - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - if (chart.isDatasetVisible(i)) { - data = chart.data.datasets[i].data; - - // Let's consider that all data have the same format. - if (helpers$1.isObject(data[0])) { - datasets[i] = []; - - for (j = 0, jlen = data.length; j < jlen; ++j) { - timestamp = parse(me, data[j]); - timestamps.push(timestamp); - datasets[i][j] = timestamp; - } - } else { - for (j = 0, jlen = labels.length; j < jlen; ++j) { - timestamps.push(labels[j]); - } - datasets[i] = labels.slice(0); - } - } else { - datasets[i] = []; - } - } - - if (labels.length) { - // Sort labels **after** data have been converted - labels = arrayUnique(labels).sort(sorter); - min = Math.min(min, labels[0]); - max = Math.max(max, labels[labels.length - 1]); - } - - if (timestamps.length) { - timestamps = arrayUnique(timestamps).sort(sorter); - min = Math.min(min, timestamps[0]); - max = Math.max(max, timestamps[timestamps.length - 1]); - } - - min = parse(me, timeOpts.min) || min; - max = parse(me, timeOpts.max) || max; - - // In case there is no valid min/max, set limits based on unit time option - min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min; - max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max; - - // Make sure that max is strictly higher than min (required by the lookup table) - me.min = Math.min(min, max); - me.max = Math.max(min + 1, max); - - // PRIVATE - me._horizontal = me.isHorizontal(); - me._table = []; - me._timestamps = { - data: timestamps, - datasets: datasets, - labels: labels - }; - }, - - buildTicks: function() { - var me = this; - var min = me.min; - var max = me.max; - var options = me.options; - var timeOpts = options.time; - var timestamps = []; - var ticks = []; - var i, ilen, timestamp; - - switch (options.ticks.source) { - case 'data': - timestamps = me._timestamps.data; - break; - case 'labels': - timestamps = me._timestamps.labels; - break; - case 'auto': - default: - timestamps = generate(me, min, max, me.getLabelCapacity(min), options); - } - - if (options.bounds === 'ticks' && timestamps.length) { - min = timestamps[0]; - max = timestamps[timestamps.length - 1]; - } - - // Enforce limits with user min/max options - min = parse(me, timeOpts.min) || min; - max = parse(me, timeOpts.max) || max; - - // Remove ticks outside the min/max range - for (i = 0, ilen = timestamps.length; i < ilen; ++i) { - timestamp = timestamps[i]; - if (timestamp >= min && timestamp <= max) { - ticks.push(timestamp); - } - } - - me.min = min; - me.max = max; - - // PRIVATE - me._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max); - me._majorUnit = determineMajorUnit(me._unit); - me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); - me._offsets = computeOffsets(me._table, ticks, min, max, options); - - if (options.ticks.reverse) { - ticks.reverse(); - } - - return ticksFromTimestamps(me, ticks, me._majorUnit); - }, - - getLabelForIndex: function(index, datasetIndex) { - var me = this; - var adapter = me._adapter; - var data = me.chart.data; - var timeOpts = me.options.time; - var label = data.labels && index < data.labels.length ? data.labels[index] : ''; - var value = data.datasets[datasetIndex].data[index]; - - if (helpers$1.isObject(value)) { - label = me.getRightValue(value); - } - if (timeOpts.tooltipFormat) { - return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat); - } - if (typeof label === 'string') { - return label; - } - return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime); - }, - - /** - * Function to format an individual tick mark - * @private - */ - tickFormatFunction: function(time, index, ticks, format) { - var me = this; - var adapter = me._adapter; - var options = me.options; - var formats = options.time.displayFormats; - var minorFormat = formats[me._unit]; - var majorUnit = me._majorUnit; - var majorFormat = formats[majorUnit]; - var majorTime = +adapter.startOf(time, majorUnit); - var majorTickOpts = options.ticks.major; - var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; - var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat); - var tickOpts = major ? majorTickOpts : options.ticks.minor; - var formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback); - - return formatter ? formatter(label, index, ticks) : label; - }, - - convertTicksToLabels: function(ticks) { - var labels = []; - var i, ilen; - - for (i = 0, ilen = ticks.length; i < ilen; ++i) { - labels.push(this.tickFormatFunction(ticks[i].value, i, ticks)); - } - - return labels; - }, - - /** - * @private - */ - getPixelForOffset: function(time) { - var me = this; - var isReverse = me.options.ticks.reverse; - var size = me._horizontal ? me.width : me.height; - var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top; - var pos = interpolate$1(me._table, 'time', time, 'pos'); - var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end); - - return isReverse ? start - offset : start + offset; - }, - - getPixelForValue: function(value, index, datasetIndex) { - var me = this; - var time = null; - - if (index !== undefined && datasetIndex !== undefined) { - time = me._timestamps.datasets[datasetIndex][index]; - } - - if (time === null) { - time = parse(me, value); - } - - if (time !== null) { - return me.getPixelForOffset(time); - } - }, - - getPixelForTick: function(index) { - var ticks = this.getTicks(); - return index >= 0 && index < ticks.length ? - this.getPixelForOffset(ticks[index].value) : - null; - }, - - getValueForPixel: function(pixel) { - var me = this; - var size = me._horizontal ? me.width : me.height; - var start = me._horizontal ? me.left : me.top; - var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end; - var time = interpolate$1(me._table, 'pos', pos, 'time'); - - // DEPRECATION, we should return time directly - return me._adapter._create(time); - }, - - /** - * Crude approximation of what the label width might be - * @private - */ - getLabelWidth: function(label) { - var me = this; - var ticksOpts = me.options.ticks; - var tickLabelWidth = me.ctx.measureText(label).width; - var angle = helpers$1.toRadians(ticksOpts.maxRotation); - var cosRotation = Math.cos(angle); - var sinRotation = Math.sin(angle); - var tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize); - - return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); - }, - - /** - * @private - */ - getLabelCapacity: function(exampleTime) { - var me = this; - - // pick the longest format (milliseconds) for guestimation - var format = me.options.time.displayFormats.millisecond; - var exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format); - var tickLabelWidth = me.getLabelWidth(exampleLabel); - var innerWidth = me.isHorizontal() ? me.width : me.height; - var capacity = Math.floor(innerWidth / tickLabelWidth); - - return capacity > 0 ? capacity : 1; - } -}); - -// INTERNAL: static default options, registered in src/index.js -var _defaults$4 = defaultConfig$4; -scale_time._defaults = _defaults$4; - -var scales = { - category: scale_category, - linear: scale_linear, - logarithmic: scale_logarithmic, - radialLinear: scale_radialLinear, - time: scale_time -}; - -var FORMATS = { - datetime: 'MMM D, YYYY, h:mm:ss a', - millisecond: 'h:mm:ss.SSS a', - second: 'h:mm:ss a', - minute: 'h:mm a', - hour: 'hA', - day: 'MMM D', - week: 'll', - month: 'MMM YYYY', - quarter: '[Q]Q - YYYY', - year: 'YYYY' -}; - -core_adapters._date.override(typeof moment === 'function' ? { - _id: 'moment', // DEBUG ONLY - - formats: function() { - return FORMATS; - }, - - parse: function(value, format) { - if (typeof value === 'string' && typeof format === 'string') { - value = moment(value, format); - } else if (!(value instanceof moment)) { - value = moment(value); - } - return value.isValid() ? value.valueOf() : null; - }, - - format: function(time, format) { - return moment(time).format(format); - }, - - add: function(time, amount, unit) { - return moment(time).add(amount, unit).valueOf(); - }, - - diff: function(max, min, unit) { - return moment.duration(moment(max).diff(moment(min))).as(unit); - }, - - startOf: function(time, unit, weekday) { - time = moment(time); - if (unit === 'isoWeek') { - return time.isoWeekday(weekday).valueOf(); - } - return time.startOf(unit).valueOf(); - }, - - endOf: function(time, unit) { - return moment(time).endOf(unit).valueOf(); - }, - - // DEPRECATIONS - - /** - * Provided for backward compatibility with scale.getValueForPixel(). - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ - _create: function(time) { - return moment(time); - }, -} : {}); - -core_defaults._set('global', { - plugins: { - filler: { - propagate: true - } - } -}); - -var mappers = { - dataset: function(source) { - var index = source.fill; - var chart = source.chart; - var meta = chart.getDatasetMeta(index); - var visible = meta && chart.isDatasetVisible(index); - var points = (visible && meta.dataset._children) || []; - var length = points.length || 0; - - return !length ? null : function(point, i) { - return (i < length && points[i]._view) || null; - }; - }, - - boundary: function(source) { - var boundary = source.boundary; - var x = boundary ? boundary.x : null; - var y = boundary ? boundary.y : null; - - return function(point) { - return { - x: x === null ? point.x : x, - y: y === null ? point.y : y, - }; - }; - } -}; - -// @todo if (fill[0] === '#') -function decodeFill(el, index, count) { - var model = el._model || {}; - var fill = model.fill; - var target; - - if (fill === undefined) { - fill = !!model.backgroundColor; - } - - if (fill === false || fill === null) { - return false; - } - - if (fill === true) { - return 'origin'; - } - - target = parseFloat(fill, 10); - if (isFinite(target) && Math.floor(target) === target) { - if (fill[0] === '-' || fill[0] === '+') { - target = index + target; - } - - if (target === index || target < 0 || target >= count) { - return false; - } - - return target; - } - - switch (fill) { - // compatibility - case 'bottom': - return 'start'; - case 'top': - return 'end'; - case 'zero': - return 'origin'; - // supported boundaries - case 'origin': - case 'start': - case 'end': - return fill; - // invalid fill values - default: - return false; - } -} - -function computeBoundary(source) { - var model = source.el._model || {}; - var scale = source.el._scale || {}; - var fill = source.fill; - var target = null; - var horizontal; - - if (isFinite(fill)) { - return null; - } - - // Backward compatibility: until v3, we still need to support boundary values set on - // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and - // controllers might still use it (e.g. the Smith chart). - - if (fill === 'start') { - target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; - } else if (fill === 'end') { - target = model.scaleTop === undefined ? scale.top : model.scaleTop; - } else if (model.scaleZero !== undefined) { - target = model.scaleZero; - } else if (scale.getBasePosition) { - target = scale.getBasePosition(); - } else if (scale.getBasePixel) { - target = scale.getBasePixel(); - } - - if (target !== undefined && target !== null) { - if (target.x !== undefined && target.y !== undefined) { - return target; - } - - if (helpers$1.isFinite(target)) { - horizontal = scale.isHorizontal(); - return { - x: horizontal ? target : null, - y: horizontal ? null : target - }; - } - } - - return null; -} - -function resolveTarget(sources, index, propagate) { - var source = sources[index]; - var fill = source.fill; - var visited = [index]; - var target; - - if (!propagate) { - return fill; - } - - while (fill !== false && visited.indexOf(fill) === -1) { - if (!isFinite(fill)) { - return fill; - } - - target = sources[fill]; - if (!target) { - return false; - } - - if (target.visible) { - return fill; - } - - visited.push(fill); - fill = target.fill; - } - - return false; -} - -function createMapper(source) { - var fill = source.fill; - var type = 'dataset'; - - if (fill === false) { - return null; - } - - if (!isFinite(fill)) { - type = 'boundary'; - } - - return mappers[type](source); -} - -function isDrawable(point) { - return point && !point.skip; -} - -function drawArea(ctx, curve0, curve1, len0, len1) { - var i; - - if (!len0 || !len1) { - return; - } - - // building first area curve (normal) - ctx.moveTo(curve0[0].x, curve0[0].y); - for (i = 1; i < len0; ++i) { - helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); - } - - // joining the two area curves - ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); - - // building opposite area curve (reverse) - for (i = len1 - 1; i > 0; --i) { - helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); - } -} - -function doFill(ctx, points, mapper, view, color, loop) { - var count = points.length; - var span = view.spanGaps; - var curve0 = []; - var curve1 = []; - var len0 = 0; - var len1 = 0; - var i, ilen, index, p0, p1, d0, d1; - - ctx.beginPath(); - - for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { - index = i % count; - p0 = points[index]._view; - p1 = mapper(p0, index, view); - d0 = isDrawable(p0); - d1 = isDrawable(p1); - - if (d0 && d1) { - len0 = curve0.push(p0); - len1 = curve1.push(p1); - } else if (len0 && len1) { - if (!span) { - drawArea(ctx, curve0, curve1, len0, len1); - len0 = len1 = 0; - curve0 = []; - curve1 = []; - } else { - if (d0) { - curve0.push(p0); - } - if (d1) { - curve1.push(p1); - } - } - } - } - - drawArea(ctx, curve0, curve1, len0, len1); - - ctx.closePath(); - ctx.fillStyle = color; - ctx.fill(); -} - -var plugin_filler = { - id: 'filler', - - afterDatasetsUpdate: function(chart, options) { - var count = (chart.data.datasets || []).length; - var propagate = options.propagate; - var sources = []; - var meta, i, el, source; - - for (i = 0; i < count; ++i) { - meta = chart.getDatasetMeta(i); - el = meta.dataset; - source = null; - - if (el && el._model && el instanceof elements.Line) { - source = { - visible: chart.isDatasetVisible(i), - fill: decodeFill(el, i, count), - chart: chart, - el: el - }; - } - - meta.$filler = source; - sources.push(source); - } - - for (i = 0; i < count; ++i) { - source = sources[i]; - if (!source) { - continue; - } - - source.fill = resolveTarget(sources, i, propagate); - source.boundary = computeBoundary(source); - source.mapper = createMapper(source); - } - }, - - beforeDatasetDraw: function(chart, args) { - var meta = args.meta.$filler; - if (!meta) { - return; - } - - var ctx = chart.ctx; - var el = meta.el; - var view = el._view; - var points = el._children || []; - var mapper = meta.mapper; - var color = view.backgroundColor || core_defaults.global.defaultColor; - - if (mapper && color && points.length) { - helpers$1.canvas.clipArea(ctx, chart.chartArea); - doFill(ctx, points, mapper, view, color, el._loop); - helpers$1.canvas.unclipArea(ctx); - } - } -}; - -var noop$1 = helpers$1.noop; -var valueOrDefault$d = helpers$1.valueOrDefault; - -core_defaults._set('global', { - legend: { - display: true, - position: 'top', - fullWidth: true, - reverse: false, - weight: 1000, - - // a callback that will handle - onClick: function(e, legendItem) { - var index = legendItem.datasetIndex; - var ci = this.chart; - var meta = ci.getDatasetMeta(index); - - // See controller.isDatasetVisible comment - meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; - - // We hid a dataset ... rerender the chart - ci.update(); - }, - - onHover: null, - onLeave: null, - - labels: { - boxWidth: 40, - padding: 10, - // Generates labels shown in the legend - // Valid properties to return: - // text : text to display - // fillStyle : fill of coloured box - // strokeStyle: stroke of coloured box - // hidden : if this legend item refers to a hidden item - // lineCap : cap style for line - // lineDash - // lineDashOffset : - // lineJoin : - // lineWidth : - generateLabels: function(chart) { - var data = chart.data; - return helpers$1.isArray(data.datasets) ? data.datasets.map(function(dataset, i) { - return { - text: dataset.label, - fillStyle: (!helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), - hidden: !chart.isDatasetVisible(i), - lineCap: dataset.borderCapStyle, - lineDash: dataset.borderDash, - lineDashOffset: dataset.borderDashOffset, - lineJoin: dataset.borderJoinStyle, - lineWidth: dataset.borderWidth, - strokeStyle: dataset.borderColor, - pointStyle: dataset.pointStyle, - - // Below is extra data used for toggling the datasets - datasetIndex: i - }; - }, this) : []; - } - } - }, - - legendCallback: function(chart) { - var text = []; - text.push('
    '); - for (var i = 0; i < chart.data.datasets.length; i++) { - text.push('
  • '); - if (chart.data.datasets[i].label) { - text.push(chart.data.datasets[i].label); - } - text.push('
  • '); - } - text.push('
'); - return text.join(''); - } -}); - -/** - * Helper function to get the box width based on the usePointStyle option - * @param {object} labelopts - the label options on the legend - * @param {number} fontSize - the label font size - * @return {number} width of the color box area - */ -function getBoxWidth(labelOpts, fontSize) { - return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ? - fontSize : - labelOpts.boxWidth; -} - -/** - * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! - */ -var Legend = core_element.extend({ - - initialize: function(config) { - helpers$1.extend(this, config); - - // Contains hit boxes for each dataset (in dataset order) - this.legendHitBoxes = []; - - /** - * @private - */ - this._hoveredItem = null; - - // Are we in doughnut mode which has a different data type - this.doughnutMode = false; - }, - - // These methods are ordered by lifecycle. Utilities then follow. - // Any function defined here is inherited by all legend types. - // Any function can be extended by the legend type - - beforeUpdate: noop$1, - update: function(maxWidth, maxHeight, margins) { - var me = this; - - // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) - me.beforeUpdate(); - - // Absorb the master measurements - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me.margins = margins; - - // Dimensions - me.beforeSetDimensions(); - me.setDimensions(); - me.afterSetDimensions(); - // Labels - me.beforeBuildLabels(); - me.buildLabels(); - me.afterBuildLabels(); - - // Fit - me.beforeFit(); - me.fit(); - me.afterFit(); - // - me.afterUpdate(); - - return me.minSize; - }, - afterUpdate: noop$1, - - // - - beforeSetDimensions: noop$1, - setDimensions: function() { - var me = this; - // Set the unconstrained dimension before label rotation - if (me.isHorizontal()) { - // Reset position before calculating rotation - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; - } else { - me.height = me.maxHeight; - - // Reset position before calculating rotation - me.top = 0; - me.bottom = me.height; - } - - // Reset padding - me.paddingLeft = 0; - me.paddingTop = 0; - me.paddingRight = 0; - me.paddingBottom = 0; - - // Reset minSize - me.minSize = { - width: 0, - height: 0 - }; - }, - afterSetDimensions: noop$1, - - // - - beforeBuildLabels: noop$1, - buildLabels: function() { - var me = this; - var labelOpts = me.options.labels || {}; - var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || []; - - if (labelOpts.filter) { - legendItems = legendItems.filter(function(item) { - return labelOpts.filter(item, me.chart.data); - }); - } - - if (me.options.reverse) { - legendItems.reverse(); - } - - me.legendItems = legendItems; - }, - afterBuildLabels: noop$1, - - // - - beforeFit: noop$1, - fit: function() { - var me = this; - var opts = me.options; - var labelOpts = opts.labels; - var display = opts.display; - - var ctx = me.ctx; - - var labelFont = helpers$1.options._parseFont(labelOpts); - var fontSize = labelFont.size; - - // Reset hit boxes - var hitboxes = me.legendHitBoxes = []; - - var minSize = me.minSize; - var isHorizontal = me.isHorizontal(); - - if (isHorizontal) { - minSize.width = me.maxWidth; // fill all the width - minSize.height = display ? 10 : 0; - } else { - minSize.width = display ? 10 : 0; - minSize.height = me.maxHeight; // fill all the height - } - - // Increase sizes here - if (display) { - ctx.font = labelFont.string; - - if (isHorizontal) { - // Labels - - // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one - var lineWidths = me.lineWidths = [0]; - var totalHeight = 0; - - ctx.textAlign = 'left'; - ctx.textBaseline = 'top'; - - helpers$1.each(me.legendItems, function(legendItem, i) { - var boxWidth = getBoxWidth(labelOpts, fontSize); - var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; - - if (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) { - totalHeight += fontSize + labelOpts.padding; - lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding; - } - - // Store the hitbox width and height here. Final position will be updated in `draw` - hitboxes[i] = { - left: 0, - top: 0, - width: width, - height: fontSize - }; - - lineWidths[lineWidths.length - 1] += width + labelOpts.padding; - }); - - minSize.height += totalHeight; - - } else { - var vPadding = labelOpts.padding; - var columnWidths = me.columnWidths = []; - var totalWidth = labelOpts.padding; - var currentColWidth = 0; - var currentColHeight = 0; - var itemHeight = fontSize + vPadding; - - helpers$1.each(me.legendItems, function(legendItem, i) { - var boxWidth = getBoxWidth(labelOpts, fontSize); - var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; - - // If too tall, go to new column - if (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) { - totalWidth += currentColWidth + labelOpts.padding; - columnWidths.push(currentColWidth); // previous column width - - currentColWidth = 0; - currentColHeight = 0; - } - - // Get max width - currentColWidth = Math.max(currentColWidth, itemWidth); - currentColHeight += itemHeight; - - // Store the hitbox width and height here. Final position will be updated in `draw` - hitboxes[i] = { - left: 0, - top: 0, - width: itemWidth, - height: fontSize - }; - }); - - totalWidth += currentColWidth; - columnWidths.push(currentColWidth); - minSize.width += totalWidth; - } - } - - me.width = minSize.width; - me.height = minSize.height; - }, - afterFit: noop$1, - - // Shared Methods - isHorizontal: function() { - return this.options.position === 'top' || this.options.position === 'bottom'; - }, - - // Actually draw the legend on the canvas - draw: function() { - var me = this; - var opts = me.options; - var labelOpts = opts.labels; - var globalDefaults = core_defaults.global; - var defaultColor = globalDefaults.defaultColor; - var lineDefault = globalDefaults.elements.line; - var legendWidth = me.width; - var lineWidths = me.lineWidths; - - if (opts.display) { - var ctx = me.ctx; - var fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor); - var labelFont = helpers$1.options._parseFont(labelOpts); - var fontSize = labelFont.size; - var cursor; - - // Canvas setup - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; - ctx.lineWidth = 0.5; - ctx.strokeStyle = fontColor; // for strikethrough effect - ctx.fillStyle = fontColor; // render in correct colour - ctx.font = labelFont.string; - - var boxWidth = getBoxWidth(labelOpts, fontSize); - var hitboxes = me.legendHitBoxes; - - // current position - var drawLegendBox = function(x, y, legendItem) { - if (isNaN(boxWidth) || boxWidth <= 0) { - return; - } - - // Set the ctx for the box - ctx.save(); - - var lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth); - ctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor); - ctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle); - ctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset); - ctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle); - ctx.lineWidth = lineWidth; - ctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor); - - if (ctx.setLineDash) { - // IE 9 and 10 do not support line dash - ctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash)); - } - - if (opts.labels && opts.labels.usePointStyle) { - // Recalculate x and y for drawPoint() because its expecting - // x and y to be center of figure (instead of top left) - var radius = boxWidth * Math.SQRT2 / 2; - var centerX = x + boxWidth / 2; - var centerY = y + fontSize / 2; - - // Draw pointStyle as legend symbol - helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); - } else { - // Draw box as legend symbol - if (lineWidth !== 0) { - ctx.strokeRect(x, y, boxWidth, fontSize); - } - ctx.fillRect(x, y, boxWidth, fontSize); - } - - ctx.restore(); - }; - var fillText = function(x, y, legendItem, textWidth) { - var halfFontSize = fontSize / 2; - var xLeft = boxWidth + halfFontSize + x; - var yMiddle = y + halfFontSize; - - ctx.fillText(legendItem.text, xLeft, yMiddle); - - if (legendItem.hidden) { - // Strikethrough the text if hidden - ctx.beginPath(); - ctx.lineWidth = 2; - ctx.moveTo(xLeft, yMiddle); - ctx.lineTo(xLeft + textWidth, yMiddle); - ctx.stroke(); - } - }; - - // Horizontal - var isHorizontal = me.isHorizontal(); - if (isHorizontal) { - cursor = { - x: me.left + ((legendWidth - lineWidths[0]) / 2) + labelOpts.padding, - y: me.top + labelOpts.padding, - line: 0 - }; - } else { - cursor = { - x: me.left + labelOpts.padding, - y: me.top + labelOpts.padding, - line: 0 - }; - } - - var itemHeight = fontSize + labelOpts.padding; - helpers$1.each(me.legendItems, function(legendItem, i) { - var textWidth = ctx.measureText(legendItem.text).width; - var width = boxWidth + (fontSize / 2) + textWidth; - var x = cursor.x; - var y = cursor.y; - - // Use (me.left + me.minSize.width) and (me.top + me.minSize.height) - // instead of me.right and me.bottom because me.width and me.height - // may have been changed since me.minSize was calculated - if (isHorizontal) { - if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) { - y = cursor.y += itemHeight; - cursor.line++; - x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2) + labelOpts.padding; - } - } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) { - x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; - y = cursor.y = me.top + labelOpts.padding; - cursor.line++; - } - - drawLegendBox(x, y, legendItem); - - hitboxes[i].left = x; - hitboxes[i].top = y; - - // Fill the actual label - fillText(x, y, legendItem, textWidth); - - if (isHorizontal) { - cursor.x += width + labelOpts.padding; - } else { - cursor.y += itemHeight; - } - - }); - } - }, - - /** - * @private - */ - _getLegendItemAt: function(x, y) { - var me = this; - var i, hitBox, lh; - - if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { - // See if we are touching one of the dataset boxes - lh = me.legendHitBoxes; - for (i = 0; i < lh.length; ++i) { - hitBox = lh[i]; - - if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { - // Touching an element - return me.legendItems[i]; - } - } - } - - return null; - }, - - /** - * Handle an event - * @private - * @param {IEvent} event - The event to handle - */ - handleEvent: function(e) { - var me = this; - var opts = me.options; - var type = e.type === 'mouseup' ? 'click' : e.type; - var hoveredItem; - - if (type === 'mousemove') { - if (!opts.onHover && !opts.onLeave) { - return; - } - } else if (type === 'click') { - if (!opts.onClick) { - return; - } - } else { - return; - } - - // Chart event already has relative position in it - hoveredItem = me._getLegendItemAt(e.x, e.y); - - if (type === 'click') { - if (hoveredItem && opts.onClick) { - // use e.native for backwards compatibility - opts.onClick.call(me, e.native, hoveredItem); - } - } else { - if (opts.onLeave && hoveredItem !== me._hoveredItem) { - if (me._hoveredItem) { - opts.onLeave.call(me, e.native, me._hoveredItem); - } - me._hoveredItem = hoveredItem; - } - - if (opts.onHover && hoveredItem) { - // use e.native for backwards compatibility - opts.onHover.call(me, e.native, hoveredItem); - } - } - } -}); - -function createNewLegendAndAttach(chart, legendOpts) { - var legend = new Legend({ - ctx: chart.ctx, - options: legendOpts, - chart: chart - }); - - core_layouts.configure(chart, legend, legendOpts); - core_layouts.addBox(chart, legend); - chart.legend = legend; -} - -var plugin_legend = { - id: 'legend', - - /** - * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making - * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of - * the plugin, which one will be re-exposed in the chart.js file. - * https://github.com/chartjs/Chart.js/pull/2640 - * @private - */ - _element: Legend, - - beforeInit: function(chart) { - var legendOpts = chart.options.legend; - - if (legendOpts) { - createNewLegendAndAttach(chart, legendOpts); - } - }, - - beforeUpdate: function(chart) { - var legendOpts = chart.options.legend; - var legend = chart.legend; - - if (legendOpts) { - helpers$1.mergeIf(legendOpts, core_defaults.global.legend); - - if (legend) { - core_layouts.configure(chart, legend, legendOpts); - legend.options = legendOpts; - } else { - createNewLegendAndAttach(chart, legendOpts); - } - } else if (legend) { - core_layouts.removeBox(chart, legend); - delete chart.legend; - } - }, - - afterEvent: function(chart, e) { - var legend = chart.legend; - if (legend) { - legend.handleEvent(e); - } - } -}; - -var noop$2 = helpers$1.noop; - -core_defaults._set('global', { - title: { - display: false, - fontStyle: 'bold', - fullWidth: true, - padding: 10, - position: 'top', - text: '', - weight: 2000 // by default greater than legend (1000) to be above - } -}); - -/** - * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! - */ -var Title = core_element.extend({ - initialize: function(config) { - var me = this; - helpers$1.extend(me, config); - - // Contains hit boxes for each dataset (in dataset order) - me.legendHitBoxes = []; - }, - - // These methods are ordered by lifecycle. Utilities then follow. - - beforeUpdate: noop$2, - update: function(maxWidth, maxHeight, margins) { - var me = this; - - // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) - me.beforeUpdate(); - - // Absorb the master measurements - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me.margins = margins; - - // Dimensions - me.beforeSetDimensions(); - me.setDimensions(); - me.afterSetDimensions(); - // Labels - me.beforeBuildLabels(); - me.buildLabels(); - me.afterBuildLabels(); - - // Fit - me.beforeFit(); - me.fit(); - me.afterFit(); - // - me.afterUpdate(); - - return me.minSize; - - }, - afterUpdate: noop$2, - - // - - beforeSetDimensions: noop$2, - setDimensions: function() { - var me = this; - // Set the unconstrained dimension before label rotation - if (me.isHorizontal()) { - // Reset position before calculating rotation - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; - } else { - me.height = me.maxHeight; - - // Reset position before calculating rotation - me.top = 0; - me.bottom = me.height; - } - - // Reset padding - me.paddingLeft = 0; - me.paddingTop = 0; - me.paddingRight = 0; - me.paddingBottom = 0; - - // Reset minSize - me.minSize = { - width: 0, - height: 0 - }; - }, - afterSetDimensions: noop$2, - - // - - beforeBuildLabels: noop$2, - buildLabels: noop$2, - afterBuildLabels: noop$2, - - // - - beforeFit: noop$2, - fit: function() { - var me = this; - var opts = me.options; - var display = opts.display; - var minSize = me.minSize; - var lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1; - var fontOpts = helpers$1.options._parseFont(opts); - var textSize = display ? (lineCount * fontOpts.lineHeight) + (opts.padding * 2) : 0; - - if (me.isHorizontal()) { - minSize.width = me.maxWidth; // fill all the width - minSize.height = textSize; - } else { - minSize.width = textSize; - minSize.height = me.maxHeight; // fill all the height - } - - me.width = minSize.width; - me.height = minSize.height; - - }, - afterFit: noop$2, - - // Shared Methods - isHorizontal: function() { - var pos = this.options.position; - return pos === 'top' || pos === 'bottom'; - }, - - // Actually draw the title block on the canvas - draw: function() { - var me = this; - var ctx = me.ctx; - var opts = me.options; - - if (opts.display) { - var fontOpts = helpers$1.options._parseFont(opts); - var lineHeight = fontOpts.lineHeight; - var offset = lineHeight / 2 + opts.padding; - var rotation = 0; - var top = me.top; - var left = me.left; - var bottom = me.bottom; - var right = me.right; - var maxWidth, titleX, titleY; - - ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour - ctx.font = fontOpts.string; - - // Horizontal - if (me.isHorizontal()) { - titleX = left + ((right - left) / 2); // midpoint of the width - titleY = top + offset; - maxWidth = right - left; - } else { - titleX = opts.position === 'left' ? left + offset : right - offset; - titleY = top + ((bottom - top) / 2); - maxWidth = bottom - top; - rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); - } - - ctx.save(); - ctx.translate(titleX, titleY); - ctx.rotate(rotation); - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - - var text = opts.text; - if (helpers$1.isArray(text)) { - var y = 0; - for (var i = 0; i < text.length; ++i) { - ctx.fillText(text[i], 0, y, maxWidth); - y += lineHeight; - } - } else { - ctx.fillText(text, 0, 0, maxWidth); - } - - ctx.restore(); - } - } -}); - -function createNewTitleBlockAndAttach(chart, titleOpts) { - var title = new Title({ - ctx: chart.ctx, - options: titleOpts, - chart: chart - }); - - core_layouts.configure(chart, title, titleOpts); - core_layouts.addBox(chart, title); - chart.titleBlock = title; -} - -var plugin_title = { - id: 'title', - - /** - * Backward compatibility: since 2.1.5, the title is registered as a plugin, making - * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of - * the plugin, which one will be re-exposed in the chart.js file. - * https://github.com/chartjs/Chart.js/pull/2640 - * @private - */ - _element: Title, - - beforeInit: function(chart) { - var titleOpts = chart.options.title; - - if (titleOpts) { - createNewTitleBlockAndAttach(chart, titleOpts); - } - }, - - beforeUpdate: function(chart) { - var titleOpts = chart.options.title; - var titleBlock = chart.titleBlock; - - if (titleOpts) { - helpers$1.mergeIf(titleOpts, core_defaults.global.title); - - if (titleBlock) { - core_layouts.configure(chart, titleBlock, titleOpts); - titleBlock.options = titleOpts; - } else { - createNewTitleBlockAndAttach(chart, titleOpts); - } - } else if (titleBlock) { - core_layouts.removeBox(chart, titleBlock); - delete chart.titleBlock; - } - } -}; - -var plugins = {}; -var filler = plugin_filler; -var legend = plugin_legend; -var title = plugin_title; -plugins.filler = filler; -plugins.legend = legend; -plugins.title = title; - -/** - * @namespace Chart - */ - - -core_controller.helpers = helpers$1; - -// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! -core_helpers(core_controller); - -core_controller._adapters = core_adapters; -core_controller.Animation = core_animation; -core_controller.animationService = core_animations; -core_controller.controllers = controllers; -core_controller.DatasetController = core_datasetController; -core_controller.defaults = core_defaults; -core_controller.Element = core_element; -core_controller.elements = elements; -core_controller.Interaction = core_interaction; -core_controller.layouts = core_layouts; -core_controller.platform = platform; -core_controller.plugins = core_plugins; -core_controller.Scale = core_scale; -core_controller.scaleService = core_scaleService; -core_controller.Ticks = core_ticks; -core_controller.Tooltip = core_tooltip; - -// Register built-in scales - -core_controller.helpers.each(scales, function(scale, type) { - core_controller.scaleService.registerScaleType(type, scale, scale._defaults); -}); - -// Load to register built-in adapters (as side effects) - - -// Loading built-in plugins - -for (var k in plugins) { - if (plugins.hasOwnProperty(k)) { - core_controller.plugins.register(plugins[k]); - } -} - -core_controller.platform.initialize(); - -var src = core_controller; -if (typeof window !== 'undefined') { - window.Chart = core_controller; -} - -// DEPRECATIONS - -/** - * Provided for backward compatibility, not available anymore - * @namespace Chart.Chart - * @deprecated since version 2.8.0 - * @todo remove at version 3 - * @private - */ -core_controller.Chart = core_controller; - -/** - * Provided for backward compatibility, not available anymore - * @namespace Chart.Legend - * @deprecated since version 2.1.5 - * @todo remove at version 3 - * @private - */ -core_controller.Legend = plugins.legend._element; - -/** - * Provided for backward compatibility, not available anymore - * @namespace Chart.Title - * @deprecated since version 2.1.5 - * @todo remove at version 3 - * @private - */ -core_controller.Title = plugins.title._element; - -/** - * Provided for backward compatibility, use Chart.plugins instead - * @namespace Chart.pluginService - * @deprecated since version 2.1.5 - * @todo remove at version 3 - * @private - */ -core_controller.pluginService = core_controller.plugins; - -/** - * Provided for backward compatibility, inheriting from Chart.PlugingBase has no - * effect, instead simply create/register plugins via plain JavaScript objects. - * @interface Chart.PluginBase - * @deprecated since version 2.5.0 - * @todo remove at version 3 - * @private - */ -core_controller.PluginBase = core_controller.Element.extend({}); - -/** - * Provided for backward compatibility, use Chart.helpers.canvas instead. - * @namespace Chart.canvasHelpers - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ -core_controller.canvasHelpers = core_controller.helpers.canvas; - -/** - * Provided for backward compatibility, use Chart.layouts instead. - * @namespace Chart.layoutService - * @deprecated since version 2.7.3 - * @todo remove at version 3 - * @private - */ -core_controller.layoutService = core_controller.layouts; - -/** - * Provided for backward compatibility, not available anymore. - * @namespace Chart.LinearScaleBase - * @deprecated since version 2.8 - * @todo remove at version 3 - * @private - */ -core_controller.LinearScaleBase = scale_linearbase; - -/** - * Provided for backward compatibility, instead we should create a new Chart - * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`). - * @deprecated since version 2.8.0 - * @todo remove at version 3 - */ -core_controller.helpers.each( - [ - 'Bar', - 'Bubble', - 'Doughnut', - 'Line', - 'PolarArea', - 'Radar', - 'Scatter' - ], - function(klass) { - core_controller[klass] = function(ctx, cfg) { - return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, { - type: klass.charAt(0).toLowerCase() + klass.slice(1) - })); - }; - } -); - -return src; - -}))); diff --git a/SRIP/Libraries/Exp1/Data/T1/Config.txt b/SRIP/Libraries/Exp1/Data/T1/Config.txt new file mode 100755 index 00000000..2bb457b8 --- /dev/null +++ b/SRIP/Libraries/Exp1/Data/T1/Config.txt @@ -0,0 +1,13 @@ +0 +1 +6 +Contrast Ratio +Aspect Ratio +Perimeter +X-Symmetry +Y-Symmetry +Holes +25 +25 +163 +96.0 diff --git a/SRIP/Libraries/Exp1/Data/T1/Data.txt b/SRIP/Libraries/Exp1/Data/T1/Data.txt new file mode 100755 index 00000000..d6d3aa8e --- /dev/null +++ b/SRIP/Libraries/Exp1/Data/T1/Data.txt @@ -0,0 +1,213 @@ +2 0 0.189683201237905 0.0922693266832918 87 131 137 2 +22 0 0.204302952793993 0.0947630922693268 86 143 133 2 +35 0 0.215505761659127 0.0847880299251871 77 113 119 2 +38 0 0.236594959162299 0.0897755610972568 73 132 130 2 +52 0 0.278957873167097 0.0972568578553617 93 149 125 2 +57 0 0.276874882293493 0.0947630922693268 90 150 139 2 +64 0 0.300167762162757 0.0997506234413965 94 154 160 2 +69 0 0.147878839846513 0.0997506234413965 103 72 96 2 +70 0 0.272729189341612 0.0872817955112220 77 125 116 2 +76 0 0.202455863845403 0.0897755610972568 77 127 128 2 +82 0 0.230771126500234 0.0897755610972568 84 135 127 3 +89 0 0.200614432119322 0.0947630922693268 92 110 109 2 +96 0 0.242474168805662 0.0847880299251871 79 107 108 2 +109 0 0.161483321847305 0.0997506234413965 99 112 124 2 +115 0 0.268610329253126 0.107734806629834 86 136 132 2 +119 0 0.152943008341245 0.0897755610972568 91 108 116 2 +120 0 0.281047671174358 0.0997506234413965 87 166 160 2 +122 0 0.285247822499805 0.0997506234413965 105 111 142 1 +157 0 0.161483321847305 0.116923076923077 92 120 123 2 +170 0 0.246424798176129 0.0897755610972568 76 105 107 2 +193 0 0.184291891521866 0.0897755610972568 82 98 115 2 +207 0 0.238548503830892 0.0997506234413965 101 140 104 2 +210 0 0.234647567369168 0.0997506234413965 95 110 102 2 +211 0 0.0995810138285107 0.0847880299251871 87 92 90 2 +217 0 0.173654546473192 0.0872817955112220 84 125 104 2 +4 1 0.0919237670336065 0.0847880299251871 50 86 84 1 +7 1 0.0934466727615787 0.0698254364089776 49 52 69 1 +9 1 0.0608948183739165 0.0623441396508728 46 39 45 1 +15 1 0.0551834073000634 0.0623441396508728 47 28 33 1 +24 1 0.0888906464300802 0.0847880299251871 46 86 85 1 +25 1 0.123210968688745 0.0897755610972568 77 104 100 1 +41 1 0.0813810580146340 0.0648379052369077 46 50 45 1 +60 1 0.0965052638167855 0.0822942643391521 48 85 83 1 +68 1 0.0739743404497270 0.0748129675810474 73 71 79 1 +71 1 0.123210968688745 0.0798004987531173 62 74 72 1 +73 1 0.0566054870905343 0.0598503740648379 46 28 40 1 +78 1 0.0965052638167855 0.0773067331670823 49 75 75 1 +79 1 0.107346413573659 0.0798004987531173 49 88 91 1 +100 1 0.0681216206935594 0.0798004987531173 47 72 74 1 +103 1 0.0523507006878957 0.0598503740648379 45 31 38 1 +105 1 0.0594611770248776 0.0673316708229426 46 53 53 1 +106 1 0.112058524101355 0.0798004987531173 51 81 84 1 +113 1 0.0739743404497270 0.0648379052369077 44 34 53 1 +114 1 0.118404076499485 0.0822942643391521 48 79 87 1 +125 1 0.0523507006878957 0.0648379052369077 45 48 51 1 +129 1 0.108912673802141 0.0673316708229426 49 48 62 1 +135 1 0.141195414962815 0.0897755610972568 52 107 108 1 +153 1 0.0784061453465272 0.0698254364089776 50 58 58 1 +175 1 0.0566054870905343 0.0648379052369077 46 51 47 1 +178 1 0.116810908980225 0.0773067331670823 51 77 82 1 +230 0 0.230771126500234 0.0997506234413965 97 149 112 2 +233 0 0.0965052638167855 0.0773067331670823 80 69 88 2 +235 0 0.159765152294317 0.0897755610972568 94 121 110 2 +247 0 0.134589366719583 0.0997506234413965 108 107 119 2 +250 0 0.195123821563101 0.0997506234413965 95 126 113 2 +261 0 0.0919237670336065 0.172588832487310 93 85 92 1 +284 0 0.268610329253126 0.0997506234413965 93 92 136 2 +294 0 0.281047671174358 0.0947630922693268 90 104 136 2 +297 0 0.175414147317314 0.0947630922693268 87 97 96 2 +304 0 0.270666421497807 0.0972568578553617 85 132 146 2 +321 0 0.198778631665330 0.0872817955112220 78 100 107 2 +327 0 0.170151102358872 0.0897755610972568 86 107 117 2 +360 0 0.202455863845403 0.0947630922693268 87 118 137 2 +400 0 0.293731296138461 0.0972568578553617 85 156 163 2 +428 0 0.315438168781337 0.0997506234413965 78 147 155 2 +430 0 0.291599945718551 0.0997506234413965 92 103 126 2 +436 0 0.226918951219871 0.107734806629834 90 107 127 2 +441 0 0.285247822499805 0.0997506234413965 105 115 153 1 +452 0 0.225001892085224 0.0922693266832918 91 115 96 2 +454 0 0.193304760801575 0.0997506234413965 92 150 152 2 +459 0 0.268610329253126 0.0947630922693268 94 107 115 2 +463 0 0.281047671174358 0.107734806629834 89 120 113 2 +465 0 0.250400630834584 0.0997506234413965 93 122 133 2 +474 0 0.213624175387056 0.0997506234413965 90 160 161 2 +490 0 0.146200655328444 0.140077821011673 89 127 125 2 +520 0 0.240508230581461 0.116923076923077 85 151 156 2 +525 0 0.180724749771489 0.0947630922693268 101 115 114 1 +527 0 0.272729189341612 0.0997506234413965 92 122 117 2 +528 0 0.151249994609304 0.110769230769231 74 120 122 3 +543 0 0.221185690196887 0.0872817955112220 85 121 128 2 +578 0 0.242474168805662 0.107734806629834 83 157 159 2 +583 0 0.184291891521866 0.0847880299251871 79 116 114 2 +597 0 0.242474168805662 0.0947630922693268 87 122 129 2 +604 0 0.225001892085224 0.0972568578553617 82 129 125 2 +613 0 0.166668512018778 0.0897755610972568 84 97 105 2 +634 0 0.204302952793993 0.0997506234413965 99 154 158 2 +640 0 0.213624175387056 0.0947630922693268 81 145 146 2 +657 0 0.238548503830892 0.0897755610972568 72 114 123 2 +663 0 0.152943008341245 0.0897755610972568 84 129 118 2 +667 0 0.147878839846513 0.0847880299251871 78 107 105 2 +668 0 0.206155725075207 0.140077821011673 71 111 115 2 +669 0 0.187880652248273 0.0897755610972568 86 104 108 2 +670 0 0.244446348081764 0.0947630922693268 87 144 156 2 +690 0 0.232706299428673 0.0972568578553617 87 145 149 2 +703 0 0.187880652248273 0.0897755610972568 88 100 109 2 +710 0 0.223090814394400 0.107734806629834 90 140 147 2 +713 0 0.270666421497807 0.0947630922693268 74 155 152 2 +734 0 0.236594959162299 0.0997506234413965 90 161 159 2 +744 0 0.287358243322674 0.0997506234413965 91 168 171 2 +746 0 0.268610329253126 0.0997506234413965 84 167 167 2 +777 0 0.193304760801575 0.0822942643391521 65 80 98 2 +782 0 0.270666421497807 0.0997506234413965 91 170 169 2 +788 0 0.230771126500234 0.0997506234413965 92 150 159 2 +791 0 0.200614432119322 0.0997506234413965 97 134 135 2 +819 0 0.144527370606062 0.0947630922693268 87 121 124 2 +826 0 0.254401908731114 0.0972568578553617 82 138 134 2 +850 0 0.270666421497807 0.0947630922693268 82 121 126 2 +860 0 0.268610329253126 0.0997506234413965 86 164 159 2 +861 0 0.196948436691483 0.0922693266832918 85 131 143 2 +870 0 0.171900206004978 0.0947630922693268 87 138 148 2 +873 0 0.287358243322674 0.0997506234413965 89 135 151 2 +890 0 0.182505630502537 0.0997506234413965 86 157 154 2 +904 0 0.186083557248204 0.0997506234413965 81 155 154 2 +928 0 0.221185690196887 0.0947630922693268 83 146 153 2 +944 0 0.144527370606062 0.0897755610972568 72 129 131 2 +950 0 0.230771126500234 0.0947630922693268 81 152 155 2 +953 0 0.149561945713518 0.0822942643391521 81 97 98 2 +958 0 0.154641008845181 0.0947630922693268 85 131 134 1 +966 0 0.159765152294317 0.0997506234413965 86 145 150 2 +980 0 0.178949225056871 0.0947630922693268 78 142 149 2 +985 0 0.158052058560426 0.0972568578553617 94 119 114 2 +998 0 0.182505630502537 0.0947630922693268 80 146 146 2 +185 1 0.0725051556809803 0.0648379052369077 46 34 50 1 +201 1 0.0980409849410648 0.0673316708229426 48 59 55 1 +202 1 0.101125368629733 0.0922693266832918 59 97 101 1 +206 1 0.0949738324064628 0.0847880299251871 49 90 92 1 +209 1 0.0965052638167855 0.0698254364089776 49 58 66 1 +212 1 0.102674067597454 0.0698254364089776 47 64 65 1 +225 1 0.147878839846513 0.0947630922693268 84 127 126 1 +232 1 0.0888906464300802 0.0698254364089776 48 66 71 1 +249 1 0.104227129087227 0.0748129675810474 51 67 76 1 +252 1 0.110483371017802 0.0723192019950125 52 63 70 1 +270 1 0.0828746778282908 0.0748129675810474 48 73 74 1 +271 1 0.0439431065847285 0.0648379052369077 45 47 47 1 +277 1 0.0566054870905343 0.0648379052369077 45 51 49 1 +291 1 0.0769248186269423 0.0698254364089776 47 62 60 1 +310 1 0.0739743404497270 0.0748129675810474 46 69 68 1 +311 1 0.0623323449219216 0.0598503740648379 46 38 53 1 +316 1 0.0995810138285107 0.0798004987531173 49 82 81 1 +346 1 0.0965052638167855 0.0798004987531173 47 80 80 1 +352 1 0.112058524101355 0.0798004987531173 49 91 88 1 +356 1 0.104227129087227 0.0822942643391521 50 93 95 1 +358 1 0.120001795914702 0.0773067331670823 48 86 84 1 +359 1 0.0725051556809803 0.0648379052369077 47 46 52 1 +367 1 0.0695788121870870 0.0648379052369077 46 33 44 1 +383 1 0.104227129087227 0.0598503740648379 47 40 40 1 +395 1 0.0843724293612381 0.0723192019950125 51 43 65 1 +398 1 0.0949738324064628 0.0822942643391521 49 81 82 1 +399 1 0.0594611770248776 0.0598503740648379 46 26 44 1 +407 1 0.0858743297812137 0.0698254364089776 48 49 45 1 +409 1 0.0594611770248776 0.0648379052369077 45 50 47 1 +417 1 0.102674067597454 0.0748129675810474 49 74 77 1 +444 1 0.0934466727615787 0.0822942643391521 50 80 81 1 +448 1 0.0888906464300802 0.0822942643391521 48 86 87 1 +451 1 0.0858743297812137 0.0673316708229426 48 50 46 1 +455 1 0.0551834073000634 0.0598503740648379 45 33 44 1 +456 1 0.0904050974733153 0.0822942643391521 49 80 80 1 +467 1 0.0551834073000634 0.0723192019950125 44 55 54 1 +471 1 0.0784061453465272 0.0698254364089776 50 38 64 1 +476 1 0.0798915528471172 0.0847880299251871 47 79 81 1 +485 1 0.0537651502970895 0.0598503740648379 47 26 43 1 +492 1 0.0965052638167855 0.0947630922693268 49 75 75 1 +493 1 0.116810908980225 0.0798004987531173 50 92 92 1 +508 1 0.0873803963511990 0.0847880299251871 48 86 86 1 +509 1 0.0873803963511990 0.0847880299251871 49 87 88 1 +511 1 0.0666683943386656 0.0723192019950125 46 61 61 1 +534 1 0.0904050974733153 0.0997506234413965 50 91 91 1 +536 1 0.102674067597454 0.0922693266832918 54 94 96 1 +539 1 0.0608948183739165 0.0748129675810474 46 63 62 1 +553 1 0.112058524101355 0.0773067331670823 59 64 68 1 +554 1 0.0843724293612381 0.0872817955112220 54 84 86 1 +557 1 0.126438584938183 0.0648379052369077 48 37 57 1 +573 1 0.0919237670336065 0.0648379052369077 50 31 44 1 +574 1 0.0904050974733153 0.0847880299251871 49 80 82 1 +588 1 0.0904050974733153 0.0947630922693268 53 91 91 1 +594 1 0.0858743297812137 0.0897755610972568 48 80 83 1 +605 1 0.0411703497292817 0.0648379052369077 44 45 43 1 +610 1 0.0995810138285107 0.0897755610972568 58 95 97 1 +619 1 0.0551834073000634 0.0648379052369077 47 34 38 1 +638 1 0.0798915528471172 0.0897755610972568 51 87 88 1 +639 1 0.0710399850697523 0.0648379052369077 47 38 51 1 +649 1 0.0580314051453153 0.0698254364089776 46 61 64 1 +672 1 0.124822461456125 0.0847880299251871 50 91 91 1 +677 1 0.0754475558950930 0.0698254364089776 49 55 56 1 +679 1 0.0828746778282908 0.0598503740648379 48 29 60 1 +692 1 0.121604086761823 0.0847880299251871 49 96 97 1 +699 1 0.0965052638167855 0.0822942643391521 51 84 84 1 +711 1 0.0769248186269423 0.0623441396508728 46 31 49 1 +712 1 0.105784571558162 0.0897755610972568 51 89 91 1 +739 1 0.0509400431613050 0.0648379052369077 45 46 49 1 +748 1 0.0919237670336065 0.0872817955112220 48 89 89 1 +766 1 0.115222273932134 0.0822942643391521 50 87 87 1 +780 1 0.0995810138285107 0.0847880299251871 48 91 91 1 +781 1 0.0828746778282908 0.0648379052369077 46 37 55 1 +784 1 0.104227129087227 0.0847880299251871 48 90 90 1 +810 1 0.0949738324064628 0.0822942643391521 50 90 90 1 +822 1 0.124822461456125 0.0947630922693268 55 110 109 1 +834 1 0.102674067597454 0.0798004987531173 50 90 91 1 +836 1 0.102674067597454 0.0847880299251871 48 90 90 1 +839 1 0.0769248186269423 0.0648379052369077 46 49 53 1 +871 1 0.101125368629733 0.0748129675810474 49 73 79 1 +872 1 0.0873803963511990 0.0847880299251871 48 82 82 1 +892 1 0.0888906464300802 0.0847880299251871 48 83 83 1 +906 1 0.0965052638167855 0.0897755610972568 49 92 93 1 +920 1 0.0888906464300802 0.0897755610972568 50 90 90 1 +921 1 0.123210968688745 0.0698254364089776 49 58 59 1 +942 1 0.0566054870905343 0.0847880299251871 47 64 65 1 +952 1 0.0843724293612381 0.0897755610972568 49 85 84 1 +960 1 0.144527370606062 0.0922693266832918 53 110 108 1 +962 1 0.0681216206935594 0.0847880299251871 46 71 71 1 +979 1 0.0623323449219216 0.0698254364089776 46 52 51 1 +983 1 0.101125368629733 0.0748129675810474 58 45 55 1 +994 1 0.0566054870905343 0.0847880299251871 47 71 71 1 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/100.gif b/SRIP/Libraries/Exp1/Data/T1/images/100.gif new file mode 100755 index 0000000000000000000000000000000000000000..83f0f29b808572714c340bbc205f794d5165b792 GIT binary patch literal 946 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/105.gif b/SRIP/Libraries/Exp1/Data/T1/images/105.gif new file mode 100755 index 0000000000000000000000000000000000000000..23fb7a4003df5cebda2dc73314066e317f5c8805 GIT binary patch literal 926 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 rIWs2Fls6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P&009UbNU)&6g9sBUT*$DY!-oht-1}Dw z;=vc)`0*oU(O@i%8#@;K$nTpIkpxK=Lpe|mJAUg_umn(ml16hg9UKCQlcf`o{6x+C z2{OS@phi)GKn60+0F(-}HATQO97uRYSh8rRkz5s)JEZap*M(&eXdqwBECezfk+mA> U*_a7{Ek77^^XlEpmta5uJ4aN&N&o-= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/115.gif b/SRIP/Libraries/Exp1/Data/T1/images/115.gif new file mode 100755 index 0000000000000000000000000000000000000000..a3f4ba0420ae15e33d458d67495d39768d8f03cb GIT binary patch literal 1048 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 JbC3Z606W5L^G*N& literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/120.gif b/SRIP/Libraries/Exp1/Data/T1/images/120.gif new file mode 100755 index 0000000000000000000000000000000000000000..c13610251e678498d87178f73b53f3dda7428365 GIT binary patch literal 1037 zcmV+o1oHbwNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q;009UbNU)&6g9sBUT*$DY!-ojd{M$BU z2n~n@Db(u6v7fji7y%FnGHKEj1&D@NvJBEtz?5h9SmslAk0VWnQ&{%m z*bKldpA4(0GucT4sY_FgB2^fqUB@9L8~}L0K;Y4SKM@jG*{_?Y3kSc3Js5~%JRb;= zi0k(XL&7^f`#D31AZ9<52?=o&wgF+ElL=c?;|S-V5mkA!tVlS7Be5F^3L+TP(MkY? zl{*F+xI&KKbBj_eq;RU^y;-nJc0}Uv3_O_}>D@u_+2I=8uik_lkcXu$yCIV+U(UQa HfPerymbB>K literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/122.gif b/SRIP/Libraries/Exp1/Data/T1/images/122.gif new file mode 100755 index 0000000000000000000000000000000000000000..a6f52061138ee49ff472c8ab1d648fc5296a8a2b GIT binary patch literal 1028 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/129.gif b/SRIP/Libraries/Exp1/Data/T1/images/129.gif new file mode 100755 index 0000000000000000000000000000000000000000..1b5c5d63b06649c3344aad7b1ca39b5c920ee9a2 GIT binary patch literal 927 zcmV;Q17Q3|Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pl009UbNU)&6g9sBUT*$DY!-ocw^y~Kn zBEmWR_(8IGFk8lr90~qt_c0{FHW~SuJehLkK$IC>3jEd5Wu$)-`?&&oNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P_009UbNU)&6g9sBUT*$DYLx)xR5lZk7 zp_F+0_5rGR@Kwfr_405m*nru`dTT}!Jn?bgDGMqEKG@VUR!o_l@O>r&lV;# hcG4OuUq*bBw5I#mN-tlnH3ntutF^G6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pb009UbNU)&6g9sBUT*$DY!-o(b20$f` zL&Sp$$oV64@t`k%dO8}M;!l*wf*t(f%W!gFhkyRgv=o@qUz?c#YTlfw6X#2tKK%jZ rDfCBBe-?=%Jv!p(&XxwK4V}5npDdgJHu>{~6~r+#Si_3F7!UwE2FJM> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/153.gif b/SRIP/Libraries/Exp1/Data/T1/images/153.gif new file mode 100755 index 0000000000000000000000000000000000000000..2290f70085f0e4436d2db7eb798266443af314be GIT binary patch literal 941 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/175.gif b/SRIP/Libraries/Exp1/Data/T1/images/175.gif new file mode 100755 index 0000000000000000000000000000000000000000..22bd70e12f6eac451eeba57a8d044d8d55cbc2a3 GIT binary patch literal 923 zcmV;M17!S1Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Ph009UbNU)&6g9sBUT*$DY!-o(f3RKpw zh{S{a_~p51Fr!6|1U-TrsHWe!5+eo9`bR7!fC%dPadFv&pG=xIXQr%)4uMN({ph#^ x@Qj~OmqkIi%t4ReP(A#dy3EzD-%wmphnC6evOz0;D~2XOcXX)Pvk(IU06XP7y~zLo literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/178.gif b/SRIP/Libraries/Exp1/Data/T1/images/178.gif new file mode 100755 index 0000000000000000000000000000000000000000..b46b7ab258797d9b5a00f44db33fdcb23011fa96 GIT binary patch literal 940 zcmV;d15^A*Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Py009UbNU)&6g9sBUT*$DY!-o(f3QW?k zA|HtblkD5L46ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000PZ009UbNU)&6g9sBUT*$DY!-oUk{DT28 zp{RcCepEc@tY5!d8x3B`)~{JegIfBz<8hK;iE#b0v?SQ^)69V##oZK`b0>hFJAvL5 pI+JKiqbEDIYZ26Ao1Lwk?kpnpCJ=o6p6-N`)u-35U@Ha$06Sl3yF&l~ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/193.gif b/SRIP/Libraries/Exp1/Data/T1/images/193.gif new file mode 100755 index 0000000000000000000000000000000000000000..871ffeeeb7ca9a2c9c198c3a88a655a2da0bb80d GIT binary patch literal 1022 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qv009UbNU)&6g9sBUT*$EDK_mZ4$#JMq zPrr+JC?YI%v7b5`8V!!=*pHlskOFz2a;MBy$3G#rL0=P4Djb7FNbJ4QYaWDU%y`tfnC&Az~Hie&?+#*(XO99G6$pfTf&gZMQ{l3 zTx7ct%EdDW3B>EC4Ftn#cMtZti1lyaf&*Y(Jk$_yKfDAJh`K1QM8jE&3A*Ui@rT0; sy!z#vMS51ci|IHipg3b4$&35YWef>{4@pdDQ0m^zySMM(1Ooy9JM=c?(*OVf literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/2.gif b/SRIP/Libraries/Exp1/Data/T1/images/2.gif new file mode 100755 index 0000000000000000000000000000000000000000..7708a861eba31ce834dc1da480d6125610fe789a GIT binary patch literal 1033 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/206.gif b/SRIP/Libraries/Exp1/Data/T1/images/206.gif new file mode 100755 index 0000000000000000000000000000000000000000..7c8f475b22888dae8e2e17b12dd6f43459094876 GIT binary patch literal 965 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 PA`W6VN}o>sVL$*os0j1) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/209.gif b/SRIP/Libraries/Exp1/Data/T1/images/209.gif new file mode 100755 index 0000000000000000000000000000000000000000..9d79b848b0c5ef932eb3181f8f7e3f81928a281f GIT binary patch literal 933 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 SH=2L0jGRurx^?RT0RTIWGxcx) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/211.gif b/SRIP/Libraries/Exp1/Data/T1/images/211.gif new file mode 100755 index 0000000000000000000000000000000000000000..3f27147c1eeaa42287eef299ff761dc96166419a GIT binary patch literal 997 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/217.gif b/SRIP/Libraries/Exp1/Data/T1/images/217.gif new file mode 100755 index 0000000000000000000000000000000000000000..63d47c15e97ce8cf723e53b3f2bea385e4ab6360 GIT binary patch literal 1024 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/230.gif b/SRIP/Libraries/Exp1/Data/T1/images/230.gif new file mode 100755 index 0000000000000000000000000000000000000000..d4dd8b97b073af1eaf68fb99f852919f300c1623 GIT binary patch literal 1042 zcmV+t1nv7rNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q@009UbNU)&6g9sBUT*$DY!-oX%^y~Kn zqCpdb?D6Bb?14ps-ZpMDW#S_M0&Dt-FF z_)km28T0sE3o(#^l5`vU4V%Ew)W#16S5z9NG8WZ@In-@b*lr`O1_`TdY^6{}S$=R5 zit7ijqQX%V;~q3278XOb{5&CyvylqJ3DL$Ld{&sDf@S>JAymoF@It_P4a%7)Y2l1d zbnO~kk~ClEgE^|W+c-uc9g)V0mC8ZeRxz>t(vkX#kOLK3H>0i$cf?@>IFyC+>y+7~ M^XJf`GYkj-J7m%J%m4rY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/232.gif b/SRIP/Libraries/Exp1/Data/T1/images/232.gif new file mode 100755 index 0000000000000000000000000000000000000000..ab4b777b373324b767b17a34c106584e9900b47c GIT binary patch literal 931 zcmV;U16=$^Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pp009UbNU)&6g9sBUT*$DY!-obp_45NU zVZVKi2vj_Hao>lH20MNPNl+w7g8%yU8%Ywupo{A^oCE-5-$jZuYu=nm)8;;$CxP_) z*NrCtTQ-sL1j5dykC_NO?c0|M!AuZS_j%$8LS?^CT(h1CJJl%Gsbt9RGs?EDTcZI1 F06XS|zUBY` literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/233.gif b/SRIP/Libraries/Exp1/Data/T1/images/233.gif new file mode 100755 index 0000000000000000000000000000000000000000..5b477c577f593e5290e77c7e6e4f4c9b295afb4d GIT binary patch literal 992 zcmV<610VcHNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QR009UbNU)&6g9sBUT*$CtLM(p@I7B!> z2L%V&CQK}NK+?T_>o!n{vXP*lexxQm5XdP(NrBe9i6E#>$IBi5=oDOMvt*-vND5wJ z^b%Y;gNVMp^rsDJzomzqmb~y!j=@CdN{aEP2k9oQ{?r&W^>yP`KnB$X0~?iK4}5lB z{&Oc`U;}XedTvbC50C%=1uXSD<+7v%as6U^;M9*?gO>s)^_v&Z-?$Z!1s3pAuirTr OnL~>nO}g~PfB-wv#o7M= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/235.gif b/SRIP/Libraries/Exp1/Data/T1/images/235.gif new file mode 100755 index 0000000000000000000000000000000000000000..570672e21fb2fe970ebad2a4d7e237a11e69fbb7 GIT binary patch literal 1048 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/247.gif b/SRIP/Libraries/Exp1/Data/T1/images/247.gif new file mode 100755 index 0000000000000000000000000000000000000000..708f0381902d51c1aa1a0837ca5eef4070042641 GIT binary patch literal 1039 zcmV+q1n~PuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q=009UbNU)&6g9sBUT*$DY!-o(ff-t1b zpT%rc9I}9Rjnjxb?Cc@hQsh!Tdrla#FlVtPF&G4SfRlz{p&ft9CM5G$D}lig=};{U z_DuwU9i!MiILN3Of`mN$!6Ik^p^bJ>67KNV#o-`iTH)1f_{5r4bq|N&vw?62+K20O zAmp*`;gf$m+U^tL@QFUQ2e-0uD9J3s0?T#{U`T-1F@-mCFa+bTjzS3Sz&TLpV3)I} z3bF9h1py(1UHtkqB;&80m$3sISo3Gf;eZ_1@WoqKERpYX?lxtJm}8T@mi{J@h{(LT JbLIg706RM{_uK#g literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/249.gif b/SRIP/Libraries/Exp1/Data/T1/images/249.gif new file mode 100755 index 0000000000000000000000000000000000000000..3bc9481521f6a1e0d64a1833f7b978bc4e417b20 GIT binary patch literal 942 zcmV;f15x}(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P!009UbNU)&6g9sBUT*$DY!-oUS@Z*;P zB0@9z^eMA=5TibHTR0Z6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QO009UbNU)&6g9sBUT*$B?LQ~#uI9yoF zpSA)M5q8Mu&tHO!2U~P>B>-eW0;D=tF3M^CaWlWY~@cCn=G9!Z>VlK7o z*k(k}i7Bvke3z*N0T4$g9$>-3!$7G1z{n&x!JI!=TM1Tl6Lw(5n_-Lf`ysQ04I3>q zQ0Ydc!Us`K8X8E^h+ap0>|UmO=T8yC3#VTCD@QJuqQ{U~FpTqZ77&awK}5S1rmW}B LphJr;7!UwEl(Eu_ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/250.gif b/SRIP/Libraries/Exp1/Data/T1/images/250.gif new file mode 100755 index 0000000000000000000000000000000000000000..be9f2cb0bd41fa3d638156073aab658e3ea59058 GIT binary patch literal 1053 zcmV+&1mgQgNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R3009UbNU)&6g9sBUT*$DY!-oSYf-0l%MftcYP6}hvD%M@V&w5F zBk;rrfo%ZA@Qa3U(#9nWiKOFa_n=vR zy-*~4AmtoCYex^7IE0VixkxEur=WnL#1vs0sfAcLr5ekP%&N^BNlipU5scimZYkBB XJIoNJ+?kGN`h<_zvuoe3Js6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pu009UbNU)&6g9sBUT*$DY!-obb`1@A^ zBEkv%`Wdo#5Mw`keK;0mlChsBkp!QWJc&}E%8V>g!uXbPo|={b8kLNLGf2CVByf@h zDzs$3pe={?vqPXI0ZJv$;8b8#YD=maTOF8M5*1DWk21cC@zq#Hbqg6WG}{kt*|T5c K%AHF$AOJfN(7c}j literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/261.gif b/SRIP/Libraries/Exp1/Data/T1/images/261.gif new file mode 100755 index 0000000000000000000000000000000000000000..2b45af550164d9dd39aaf6ed4a48e9f112d1cff0 GIT binary patch literal 995 zcmV<9104KENk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QU009UbNU)&6g9sBUT*$DY!-o(fN}Ncs z;y@H7032wN2$4rbC=57+aL8Xe0GO_UVYJDPIe(srFq}ZjpB#bf7!@4zQkR2-M#Ra> zGZ4)%69q%e>ZkKyig?CWG{g|?8$we0ggivl4O}ez{(+2|r06S>J-S7Ya literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/270.gif b/SRIP/Libraries/Exp1/Data/T1/images/270.gif new file mode 100755 index 0000000000000000000000000000000000000000..3b0bfc63fb2c0b7320fc77208d42c11187e164b9 GIT binary patch literal 941 zcmV;e15*4)Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pz009UbNU)&6g9sBUT*$DY!-oe={o7># zBEnMr`Zcg<@WHQ)8#xk;kx`>af{ik!B5+b5fnNRc)o3ZONJe`!Yu?NWz)nU!Je~DB zS0Sg6c>Rv?Op`H7&H?25@w1ZiO~z(CO=Vn?b49*>!4l9U04gJ{oFz(P$;l|AE(tju PWZb~BuHCzJ0|Ed$EiA+l literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/271.gif b/SRIP/Libraries/Exp1/Data/T1/images/271.gif new file mode 100755 index 0000000000000000000000000000000000000000..3eb69cfd17dacb9d8fcab67c6d72a2d7cfb74426 GIT binary patch literal 923 zcmV;M17!S1Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Ph009UbNU)&6g9sBUT*$DY!-og!0D_oM zz_C9R5k~QMCF4Ol{$O}C_)49Gkpv5vLxqwclz)y|4tyC?CIBe=a@YhA=-o~Lq@wNQ xQ18=DApRijq~Z_C&PV<{*c=cJ*-jY#TwTq&vx~n#J8P&*@w2Sivk(IU06WrLx~%{J literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/277.gif b/SRIP/Libraries/Exp1/Data/T1/images/277.gif new file mode 100755 index 0000000000000000000000000000000000000000..ab8247591e9faa859e1d53991182ca2b5931b9ce GIT binary patch literal 926 zcmV;P17Z9}Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pk009UbNU)&6g9sBUT*$DY!-ohzIf9sQ z0k=jJ5jydQF{8mZ{@QpnNUYm~kpwk#`-GC<4}UCM3Y6uqi%b9qe)$V?Q^h}jDSG-F zrr>6ye@<>LQ08yPO)LJI-gM*-AC0L)Zvvo7N-NbSUi}Ty+JsdBt!UG#^%xKUJL_e- A?*IS* literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/284.gif b/SRIP/Libraries/Exp1/Data/T1/images/284.gif new file mode 100755 index 0000000000000000000000000000000000000000..87b8d5f06d0883464250fb0dfd873cac858e122a GIT binary patch literal 1049 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/294.gif b/SRIP/Libraries/Exp1/Data/T1/images/294.gif new file mode 100755 index 0000000000000000000000000000000000000000..5959ba4c0e03e6fd2c881f32f8004c231628c21f GIT binary patch literal 1019 zcmVNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qs009UbNU)&6g9sBUT*$DY!-oS?`199E zga~c_oQaSCv4%T-AVY=}rNN;PZXu&(`X-W}7>A}rHUdz^oXD3AV}_gwAc>ifI2r2X z_she;0%1UMo565TJ&?*A6vPoS$U+I4K*l>r6{OXK6(oh+YOpK6uLy^TBs;aLLbW03 zaCMsyE=USPwr!E)T4O4*NiETF(i!_s^a+YNxqXCiJva>ir pL>Sub4DwwQhY^B|BFzuX4u}9Ez!JF$1PBALbL-yCyLZ8W06V0W;;#Sz literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/297.gif b/SRIP/Libraries/Exp1/Data/T1/images/297.gif new file mode 100755 index 0000000000000000000000000000000000000000..5f36f2e12ab57e5a1ef065c241047be229acf4cb GIT binary patch literal 1030 zcmV+h1o`_%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q%009UbNU)&6g9sBUT*$B?K^*t;I9!N9 zUOhb%6`t$Y4-JEi2eokY*9{MzDj5D&+C4fd8j==a?ZhI0oObl|RETZR&R^*d*z;0jzEmDuF?&JY5D zI7V@-Ho_r6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q;009UbNU)&6g9sBUT*$DY!-oVXkm~oZ zpPd~fAQE)4Z(qNT`;N8H2*81{jvqlX)1a|HosRRUy#uLD;}?*40K5Wu4q}*gAO#MA z2a}CM1fx2_i!zW1$XN*(Hi*j>(AK@Q$J_Efk7WTt`_#2D_#X<_A# zmjzbYG)t?d2cAK)v&LGT$By_op6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pz009UbNU)&6g9sBUT*$DY!-ojb{aXVO zp$>Ze)Kon9rC-L420MNPNw8zSA|wey>IW?4z%c3h32`ZKn8yM%O`z*%OMpuSp!%Jw zK~sfCPc#8E@;Ha)l6w7a5pWq`QonsVXj1SdZ9uHCzK0|Ed$GQPrQ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/311.gif b/SRIP/Libraries/Exp1/Data/T1/images/311.gif new file mode 100755 index 0000000000000000000000000000000000000000..3de4d8597e6e33a8c7f52afb79095de9f41a055e GIT binary patch literal 913 zcmV;C18)3BNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000PX009UbNU)&6g9sBUT*$DY!-occ01^N( z;SYa%Dk8i%OXER~9wYke7?Pl)ktGT4^5-e#z?C;#0wA)^Urd*^{MnS5Q<(#v{&dL% nkW6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P+009UbNU)&6g9sBUT*$DY!-ok6{loPD z;=wWZ`q`>zu^^v*AWd{6m|zu1Mgc|+d;xM_9hCxCYy+7Ira&hk`%$q8APh))N^BOH z2lAFp1*kw?6Jhg1&OkiZfRs1HCI)68ck%oJGFb+m??A%hd1oI;MK(Q9>&LGY0-M1= YdgBQoZogi1<0jicx3Ay7eFFjjJHAuE>Hq)$ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/321.gif b/SRIP/Libraries/Exp1/Data/T1/images/321.gif new file mode 100755 index 0000000000000000000000000000000000000000..2eb2fe576538deb08ed5a69de13e11121bfbc825 GIT binary patch literal 989 zcmV<310wuKNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QO009UbNU)&6g9sBUT*$DY!-oWO{Of0| z3dDn``t8%03dhBPR{Hr9NixSr0L3<{)ELeq#8eZ-d6YBK9~Fo>z-e>|V9~}Y5F7RT zcXMElaQ=uv)YuOw!HiBDrW%>b;M9Iq8)n?cbKusl3a1t|IPxJ>gc==oC}#8ERHY58 z{4|)esl%iG78T4Pw5`Lf9RbKmrE{*st2IfEl=%<`)0Ha0GE9Y3aX-c%9jl}=Me@nd LphJsZ7!UwEtX$oG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/327.gif b/SRIP/Libraries/Exp1/Data/T1/images/327.gif new file mode 100755 index 0000000000000000000000000000000000000000..2c2127e8223d0473b10d260ac6e1d08085be63aa GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-obLqyhKu zo&|^o2l?|ij~^3^1P6ul2Mz`zkOCXD;kVIWv5z1V)Y=HITswdKFjat<;L%2LBmh`Y zw2{}t1~dKX12RxR4R-tnIW*JqjX@mq_Nid#LDxoS9S$Dzw}l~>jqMsBG(?tRp^bhL z8qybm;VyseE+j;DtKr>h2n878SEk`De}xb_@TX2h!?U3dQeox~hr_ew3|8UCkJkc+ yIQV5AIH1P5ex@*jt0#yE5kuBCegfI3Wy^G527q*csim$?HBbs4PP{nEfB-u+Zs-C4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/346.gif b/SRIP/Libraries/Exp1/Data/T1/images/346.gif new file mode 100755 index 0000000000000000000000000000000000000000..4f954f181f5e101282c5facd9bd3f114cf2fecbe GIT binary patch literal 950 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 Xe&jV100UJYrPSTax3AxU0RaFz(mcd@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/358.gif b/SRIP/Libraries/Exp1/Data/T1/images/358.gif new file mode 100755 index 0000000000000000000000000000000000000000..f71d1a79fbec6a3c1067fffac7bebce02f8c5c4c GIT binary patch literal 945 zcmV;i15W%$Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P%009UbNU)&6g9sBUT*$DY!-omA_2UB( zAr*G}_Ej|a1LHnD8w)1MxUW@6g33r9IVrHlzkV>0umnJ>Uq)UYX4cH;Xy%J)HrGjE zxnbHqo7ZM$f%%fu%xoF^p?biwLbs@ESc33HvRe<9BT3Sl`4VQbnQ3fhT*-2$y+jIh TBAqF4rxm(*^XlCzFdzUsA#lfG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/359.gif b/SRIP/Libraries/Exp1/Data/T1/images/359.gif new file mode 100755 index 0000000000000000000000000000000000000000..cf66f375fcc4cb0de06855974c44c7d5bec2c227 GIT binary patch literal 928 zcmV;R17G|{Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pm009UbNU)&6g9sBUT*$DY!-oUS&r;7qm?5KbsNnaT{36{n@HGRy5;fs+O?R0*1@UCXv&Kma@a C&AJ!> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/360.gif b/SRIP/Libraries/Exp1/Data/T1/images/360.gif new file mode 100755 index 0000000000000000000000000000000000000000..53d9a2ef5f2a7cdbbbf8c11075e6f74f489cd565 GIT binary patch literal 1034 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/383.gif b/SRIP/Libraries/Exp1/Data/T1/images/383.gif new file mode 100755 index 0000000000000000000000000000000000000000..0d95dc5e13515d0f1124a7d11ac898ab2a954a33 GIT binary patch literal 906 zcmV;519kjINk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000PQ009UbNU)&6g9sBUT*$DY!-oVrRQb0E zBEn+(`t7rL&|g1~91UvJ7_y*8kR=C>RFrbyNn$Mpj)WQWB$b!|X5u{A59i2@H9z)@ g`E#dGpBaI+C+ir`4-iO9li0I~-HA4gdfE literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/395.gif b/SRIP/Libraries/Exp1/Data/T1/images/395.gif new file mode 100755 index 0000000000000000000000000000000000000000..2678e743406a799a5f81f56612f95b291e415c25 GIT binary patch literal 925 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 XLgjbEW`kb+m}NN2x3Ay60RaFz4Mxfq literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/399.gif b/SRIP/Libraries/Exp1/Data/T1/images/399.gif new file mode 100755 index 0000000000000000000000000000000000000000..d91580141a750831fd1a1667f6d0ad9b29be892c GIT binary patch literal 914 zcmV;D18w|ANk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000PY009UbNU)&6g9sBUT*$DY!-oaE_*()o zp{ai7Dk6l|Z<5A?9O-;C$Pv}Zf|C4sJ4x`ONR|Ra!W4MX(@X%7Fy4&jFV)Rm{Y=j6 o((ffqqDEOFy(w|lf}#EFm6@6I9~Y?hc0g5fv#Zyy8Uq3VJAWIy0ssI2 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/4.gif b/SRIP/Libraries/Exp1/Data/T1/images/4.gif new file mode 100755 index 0000000000000000000000000000000000000000..271b3ec81a956366a5629ce7403a33701b5128db GIT binary patch literal 950 zcmV;n14;ZxNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P+009UbNU)&6g9sBUT*$DY!-o(f7Ua|K z-w%le!O+{+&j&_=fA(?o_z?gRcKfD%Kv0qgIgwsU3f$DMUoV*eDD>O6PKZnp&35|1 ziH0Mt2Qs0++ZXJ@&zk){;k+br-wBy8x`||kQ=Ld+3~=t;mj&mie>Fc~CD-pBBbFtB YaO8#)fZTp`abgIDx31s6eggskJHo%phyVZp literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/400.gif b/SRIP/Libraries/Exp1/Data/T1/images/400.gif new file mode 100755 index 0000000000000000000000000000000000000000..6118dedb58b4e6995a5f080b6e4c5ad57038bbe3 GIT binary patch literal 1040 zcmV+r1n>JtNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q>009UbNU)&6g9sBUT*$DY!-oc4r19qu z+>RXyAQB|zub)ScfHVpOv##UEe)sf1Bv6K4KY!}tozx}aA()TornFIYlFq|xABhP> z(X%0fM)y3n>mbm8iB%qbE^Hv_WR8NIqB11GVWk)KYfP` zj`>HijzT*p9T}X!vmZ7e2~|)#X`&z>ULRd4-0`tpmjMDlpb(VQBeMpJKWZ9iLz~Hu zg)@7+#;J6)e*embd9d(?yptzQGP~dqFKmzgu(`tQ&<34(uqD+2EV2e6kHB*97RkK1 K^XJe50suQ#pY!?v literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/407.gif b/SRIP/Libraries/Exp1/Data/T1/images/407.gif new file mode 100755 index 0000000000000000000000000000000000000000..93835bb33454283945bcab7d8e151ff9d48949ed GIT binary patch literal 922 zcmV;L17-Y2Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pg009UbNU)&6g9sBUT*$DY!-oV_p!25# zB0?+u`c<@O5Tizp2AyTx2y)=HktGS9{FqYUN|GsGwseVdrc9ePTk^_SWhMZR$QaD* w@GavdpV2Z3^9d*;G6XY0RLh9TK-6v-GZmPrW#!SCJ2F!7Nw%z6jsXDxJ5ubpz5oCK literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/409.gif b/SRIP/Libraries/Exp1/Data/T1/images/409.gif new file mode 100755 index 0000000000000000000000000000000000000000..e41690144027ad96193009205470063c020376f1 GIT binary patch literal 920 zcmV;J184k4Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pe009UbNU)&6g9sBUT*$DY!-o(f3gl7F zgv5ip{5iQ;Fb_YC90?Zl=gdIJfg_cj6u3cKIv*?Pc>P)1^)QJ@x5NSb>-$w)sP1Q^dELHUojRNwzG+fB-wwq`Gwg literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/41.gif b/SRIP/Libraries/Exp1/Data/T1/images/41.gif new file mode 100755 index 0000000000000000000000000000000000000000..26f955a29f14ffe204a9116e434c12104c85fbad GIT binary patch literal 923 zcmV;M17!S1Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Ph009UbNU)&6g9sBUT*$DY!-o(f0+97D zjYNY6c=f~P;37c>%KG)Y;Bg>>WBmXbC@D~dNKY(VzKjWA)6AHlL{6favtNps5yJIb x_aP<*k+5hU?U&RjQl(Fw_7g?Zg~%N=9bL`3HKtZ&2xwmEw}__Mvn&Gw06Qv=x^4gf literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/417.gif b/SRIP/Libraries/Exp1/Data/T1/images/417.gif new file mode 100755 index 0000000000000000000000000000000000000000..1cb3ce1ffa5fb463deb20694f66b7d61dbea95e2 GIT binary patch literal 938 zcmV;b16BM-Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pw009UbNU)&6g9sBUT*$Ct!UdL)I9ym_ z-;s$5e^|trFxy6s2R&W{Suj$+eiBIzRN-vjN0k7^xO}Oy-^`IJ1=)0o6QrAd|4yQW z*=FBPULJ@V-DhtPObDu$UV{ms;!-PAwVez)0wxu9F8iT+029(oUu4V9q(!wxx3yH` M%AHHMuEBr+JAn?sBme*a literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/428.gif b/SRIP/Libraries/Exp1/Data/T1/images/428.gif new file mode 100755 index 0000000000000000000000000000000000000000..01671a65cd62aa1e4fb22a89bdb4507be3f578b5 GIT binary patch literal 1030 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 GKma?V3+(Rz literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/436.gif b/SRIP/Libraries/Exp1/Data/T1/images/436.gif new file mode 100755 index 0000000000000000000000000000000000000000..9499aed67f0d5fedbaab1154388256eb3f96793f GIT binary patch literal 1039 zcmV+q1n~PuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q=009UbNU)&6g9sBUT*$DY!-ocWfB^#o zqCp6&$o1RDZ3YO71OM#Xw{he?C>Al;Vz+NvFP0N)$sGzo zm_!JspWQDDLD-#n(Ar357Z%bO=>=iQHVa{N+qdn7;gLobs>7PFWLAVIJZ)qZIpHt6 z{lH)#$iS7|f87`!F=^D7>tDr2p6k|yAp}1xOZFVe$nnD=yn68(9-LPj0w9wsU(UR_ JbAbT?06VsW?r{JB literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/441.gif b/SRIP/Libraries/Exp1/Data/T1/images/441.gif new file mode 100755 index 0000000000000000000000000000000000000000..77d210dfe7c07230e70f384176c376d56a0142a3 GIT binary patch literal 1034 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/451.gif b/SRIP/Libraries/Exp1/Data/T1/images/451.gif new file mode 100755 index 0000000000000000000000000000000000000000..d5c49d5331757a3304c7502242245b17e6e0cda8 GIT binary patch literal 931 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 SqIvluAIb?j^XknT5CA(H;l!{2 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/459.gif b/SRIP/Libraries/Exp1/Data/T1/images/459.gif new file mode 100755 index 0000000000000000000000000000000000000000..0de78852affdfe439b7e7c528152887cc2110ee2 GIT binary patch literal 1039 zcmV+q1n~PuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q=009UbNU)&6g9sBUT*$DY!-o(V7O_O@ zpFfNK+F4Q*;$eq({X&Wy$qa_W2+Bsf%f_-^NO(OQQVEGKl8J#cqJ?C)fgyoMA>A2V z5Gy1ZhHXS1I`|}{z90$>_!9Zypn`BAyD0P`lHCP_eX=T4BvLC_u?dTX9H)?1zkNy+ zs_n-%A-R6{O2}QCuu0jybQ8`AY42;=knwCB^uR5oxrKB4)jD`eBvgfAMA{=kkia2+ z{rDXsz|fV*YdiorAaYA&Glx#Li8QATE6r&g9tIINQlu*@5dmOukw{y#N|m-S2+q8@ JbBF-}06X#5>jeM+ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/463.gif b/SRIP/Libraries/Exp1/Data/T1/images/463.gif new file mode 100755 index 0000000000000000000000000000000000000000..9856abcaafeab85f3c81d2fc3c78345a23314046 GIT binary patch literal 1050 zcmV+#1m*ijNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R0009UbNU)&6g9sBUT*$DY!-o(f3gob( z;suEWIn3I}@sxyzL|%mwct{w>le+RSzA(?j^?;PN=&q~1y+cLapws3u#W8ahSgfP^g4eRN?_|BdC0kRcVXz6GYlY|j~ Un7dl&%o)+Vy7lYW8wLabI|c0i_W%F@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/465.gif b/SRIP/Libraries/Exp1/Data/T1/images/465.gif new file mode 100755 index 0000000000000000000000000000000000000000..da772536b7673927241855e336ad9acfb9ce6f6b GIT binary patch literal 1034 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 F06Tku!YKd% literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/471.gif b/SRIP/Libraries/Exp1/Data/T1/images/471.gif new file mode 100755 index 0000000000000000000000000000000000000000..9b37ea3a0fe8ed688fc679137d4fd22a0698e7ea GIT binary patch literal 941 zcmV;e15*4)Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pz009UbNU)&6g9sBUT*$DY!-o(f9{B~# zKtzL6@b&YTYr#c=q55s?r{SZ(5%2mjLUDqCNdPHC;(0l6QNMW~XbN=I51!7QJ%0k= z>GLO1p|AYK6MFQgjehl7{5$fe#&lxGt PzJ(`OsNK5_0|Ed$K~Kqy literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/474.gif b/SRIP/Libraries/Exp1/Data/T1/images/474.gif new file mode 100755 index 0000000000000000000000000000000000000000..693a4990b3055f012f96a8fd0a3090e01bdd8ac0 GIT binary patch literal 1041 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/492.gif b/SRIP/Libraries/Exp1/Data/T1/images/492.gif new file mode 100755 index 0000000000000000000000000000000000000000..2301c45407bc7a5e47a123d4b7fbe96c2ce2950a GIT binary patch literal 904 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 Sf{hE;6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P+009UbNU)&6g9sBUT*$DY!-o(f5~T7E zoe7Bs^Y!az1S3HV`Zjj-C@|7SZ4yWV5bYQUrGRJ~-@tsdkslb9InZsK zq|(E=p#n%E2(^)x0hN36ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P;009UbNU)&6g9sBUT*$DY!-o(f7CgX8 zTM3B;8}RVwj|)bEMmTo-2q1wMbR5y`APGZcyCNh3aTBSCWD9s4&w)blk-#L8rbq&S z^N*vi2SRmmOvgaz5_SHN84+6K9!E1m0W9LE4T8`O+5CY^k<|@Hm_jc^^QVqRRxcc< azV$aOK~?~8>D&cSLYv;bfCCE+2mm|x6~Ltc literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/511.gif b/SRIP/Libraries/Exp1/Data/T1/images/511.gif new file mode 100755 index 0000000000000000000000000000000000000000..195f07531d46116d104ac9c4df255303f427b419 GIT binary patch literal 929 zcmV;S177?`Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pn009UbNU)&6g9sBUT*$DY!-om2v4WUz zR6l+c5iauwETh2+-})KxSddUZdMHQ|yr@T|zy+=RrAy%wzzlvOYXWH14;+P>QZ7c( zX~thaod9n2Tcs1p$&@uQ@mq#8SU;*dgH6@x<6plsL@)NxdB!VJ3e_+oUCXvD$$$Vm D{06(> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/52.gif b/SRIP/Libraries/Exp1/Data/T1/images/52.gif new file mode 100755 index 0000000000000000000000000000000000000000..21f2eb44a7848c4fe7a0fe74648553e7e98c6306 GIT binary patch literal 1030 zcmV+h1o`_%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q%009UbNU)&6g9sBUT*$DY!-o(fx=7=% zqQ8IdQba6a$D6-?AVW^G@z4P>kRL;aq|*=rD0U%J+AFuR;TVeY?%)SqSQWww`R5=~r3lCN8x+;xS%r5h zqFa*CQ^h(8?SRyzkW*NMdi(KB=r?IX7vA~Q?h}G;+<@Np>hz2NW8dl;{gExJCI1~ AnE(I) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/520.gif b/SRIP/Libraries/Exp1/Data/T1/images/520.gif new file mode 100755 index 0000000000000000000000000000000000000000..cda0a1621970600f1491414ce24811dce9582d0e GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-o(f3e>Q! z;s=QYr)=}bk(;$T9U@Zj;*O(9j(#AD*mbfcJ}3^K@Z-qOQm>Z&>NI>Z%%mXzNB9UG z$5H1(2*phP5l|2r$9)SautZtFpi_U&5XKScMQPQ7YU&k5SOUP5lK#qlB}joB$7&!F zF4*YL+zNvZdiv96MPV6}WC{jYaExO=LJD<=^@qtIn3KR3+Tn;U#=sJ2n&~^)Lo&x~ yR6=V@$MK&(Ypebs@Ql+WK3*Igj)>Q~TeUe68>!p9yA>D-7=sHRPQ1ABfB-uH)$CRP literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/525.gif b/SRIP/Libraries/Exp1/Data/T1/images/525.gif new file mode 100755 index 0000000000000000000000000000000000000000..d15822d3be0129e3aad2b299e37155cf300b2435 GIT binary patch literal 1039 zcmV+q1n~PuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q=009UbNU)&6g9sBUT*$DY!-oSY5Gi!y z7w<p0Y6vFZXi$q%fC9zr<2+xW8-DR7Qe?k(y^!EEp{X}NJO*$oU(UR_ JbAtf^06Vi@@iYJc literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/527.gif b/SRIP/Libraries/Exp1/Data/T1/images/527.gif new file mode 100755 index 0000000000000000000000000000000000000000..0348e85068b1b85911bbdac7aa0df9ec3db94489 GIT binary patch literal 1048 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 b5a88M7lXJf`c-4vGOv`lfCCFQ7!UwEfws!l literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/536.gif b/SRIP/Libraries/Exp1/Data/T1/images/536.gif new file mode 100755 index 0000000000000000000000000000000000000000..cdbcab66abd8e323a5dfd77402412a5155405d69 GIT binary patch literal 961 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/553.gif b/SRIP/Libraries/Exp1/Data/T1/images/553.gif new file mode 100755 index 0000000000000000000000000000000000000000..0b160660e4a945a38ed9759dccb5edb1fffe5a46 GIT binary patch literal 955 zcmV;s14R5sNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P>009UbNU)&6g9sBUT*$B?!YBUxIb3)p z;>3h3%vro>Pywun$v7G`6wzN4kpwSjE4c%uKmxf+a!cS6K%$cVtkne2%pakZ$95*r z0pOayIy(jOh-fD%fE^LtIECtO!qkXXlal<#z-cFcuy!7xK!KD$d2R}bj1dYM&WL|F dZn=l^U&L%8IQDq!FPV-FP6G=bOt@x106XKW#<2hZ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/554.gif b/SRIP/Libraries/Exp1/Data/T1/images/554.gif new file mode 100755 index 0000000000000000000000000000000000000000..2ee51e78c11d101b705f99eedb30968f64fe4df7 GIT binary patch literal 949 zcmV;m14{fyNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P*009UbNU)&6g9sBUT*$DY!-o(f5=?=u zUq2=i32NxauVbH#0y{|K$gc@VfmQhR8+T^FNdU(B{iE^{fC+W{)N!Z@sUw-14V-nX z2_S_(Iq+vhB8CB+Fj#T}K Xfqj{>U%C=k`N^_Cw69;k0RaFz%d5yr literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/557.gif b/SRIP/Libraries/Exp1/Data/T1/images/557.gif new file mode 100755 index 0000000000000000000000000000000000000000..90592667ae8b6ae4f3eb8fe119330b73721935ec GIT binary patch literal 923 zcmV;M17!S1Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Ph009UbNU)&6g9sBUT*$DY!-o(f0{8&! z-xi4lGc4=Z?-oXagE)5lD3Adxkse8Y5ZMnD$%!mIyqqEuk${)EL6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q_009UbNU)&6g9sBUT*$DY!-o(b;z+~I z-;am{C74RruOqu?Ae%^lNTs7me|P3Dx#vn^1tGzk2&w8 Ott7~!OP{VVAOJhT_4T*_ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/573.gif b/SRIP/Libraries/Exp1/Data/T1/images/573.gif new file mode 100755 index 0000000000000000000000000000000000000000..cde4a1a03b4aa3d48d9d44ec4771270ecdabd61a GIT binary patch literal 902 zcmV;119|*MNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000PM009UbNU)&6g9sBUT*$DY!-oZd{Q3t3 zB0@m_GFm(cB;&u02QhvGSx_X&k{VAAG^tXc$Cdy({sRP)Wy_Z^ao$Y1lV(eqK2?eg cdU7aC03Lr41?h3-&xyY(9-T_H>cfBlI~)A0HUIzs literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/574.gif b/SRIP/Libraries/Exp1/Data/T1/images/574.gif new file mode 100755 index 0000000000000000000000000000000000000000..48cb8f0c8a11cc30b9bff26736649283b5acacbf GIT binary patch literal 956 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/583.gif b/SRIP/Libraries/Exp1/Data/T1/images/583.gif new file mode 100755 index 0000000000000000000000000000000000000000..6cbcce4b7a7f89ddf83cc691362c5398e7459baf GIT binary patch literal 1008 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qh009UbNU)&6g9sBUT*$DY!-o(bGH}(e z-!Kdj3)0xfv0p9-83n@V#&KW2eY`+sR9Dg@M=Ka3o-CQEq?d@F{#EQHkb<**nIIxi zHM7XTH~98J1mcp{1A-)>JVayi+f#y5_Q|{9kYqn@1~CNd=fmN*e*Z!p%=x3M$yx_J zk#+ku?%al1>l&0>wxL+P1W{zW+mMXTRtyHhFod@4Lp}8NRRX|(2FZQ3R6cyOkJ}$t eEuUm0;D(t?j&VW?{JW2pml3LC%bsm8AOJgmSLZnZ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/588.gif b/SRIP/Libraries/Exp1/Data/T1/images/588.gif new file mode 100755 index 0000000000000000000000000000000000000000..58008880d59ee0dd80db9b3de702f6c04c944dd4 GIT binary patch literal 963 zcmV;!13dgkNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P}009UbNU)&6g9sBUT*$DY!-o(f8qDD7 zAE*fu2|}UPkKQZ?83khC)UV&DkODV6>sL>W1e5>}m2{^9Wd>vU`UTT~G60a0_=Lc0 zQ?lO$m>6F5i+3sk$^zUU@|b)4;%%mBud($3Sh#uT?7a#Ud%Wk06V9j$CCg6 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/594.gif b/SRIP/Libraries/Exp1/Data/T1/images/594.gif new file mode 100755 index 0000000000000000000000000000000000000000..493c15527faf9681f48242b10c3e83d9c254ce93 GIT binary patch literal 953 zcmV;q14jHuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P<009UbNU)&6g9sBUT*$DY!-oqM0QyG- zB0@L(?gg<}Pyr}-{K#-DIEx=YWg`jx@Yl~-gOmbuIP1r+3rvBm`1Mou5~c=k{Nla1 zNnlpLewS_n0AzBUQUEmhol$y;W~>1>VZ`%yPbAC+Is4^N3dtlr95-Pj9=WRfCCE-91s9IK9R-! literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/597.gif b/SRIP/Libraries/Exp1/Data/T1/images/597.gif new file mode 100755 index 0000000000000000000000000000000000000000..466af7a266136804ee60a71494da5a34a4bd6286 GIT binary patch literal 1039 zcmV+q1n~PuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q=009UbNU)&6g9sBUT*$DY!-oP-6#CTw z;z0?N`t|E#(V#7j{iu-{(NQ1{b09V9OZ6oJ#0@A@_VcH)*_Q_nOUU#_D_2TP4HKLK z`REcN00Zox3fB)_B8C}2hVuZxVbp$c6*}t&Nnr(e{gNe6$cyhnLmHC@*_%j|~@ghL5>+-anlGMjCP3iJ^2hl>y)Gz$=vT+Y0? J^M(Nd06V?K?@<5% literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/60.gif b/SRIP/Libraries/Exp1/Data/T1/images/60.gif new file mode 100755 index 0000000000000000000000000000000000000000..ee899bdeaaf7c15ed03659ed3a9d1b845cc78e38 GIT binary patch literal 953 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 VN`$L36ciK{6%`g178e&67#J8C85tTH8XFrM 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/619.gif b/SRIP/Libraries/Exp1/Data/T1/images/619.gif new file mode 100755 index 0000000000000000000000000000000000000000..e1c649cf18f8b330ba1d3056fdafa13644e55928 GIT binary patch literal 920 zcmV;J184k4Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pe009UbNU)&6g9sBUT*$DY!-o(diuo5I zB0@3!lo_#T5Mw_*91D5`8FJvrk|z6oL@ChY1(pD2$m<6a0FHV6cGNUS6DEy$|7v2{ u*N?%@l`wgdWT~`fqJGwDR-h-ZW(|D(ywsHE4^+(}{^Gf)NwzG+fB-u$(Yd|= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/634.gif b/SRIP/Libraries/Exp1/Data/T1/images/634.gif new file mode 100755 index 0000000000000000000000000000000000000000..b346a652c6e7fdbf66870a570686c0768da7654d GIT binary patch literal 1065 zcmV+^1lIdUNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R7009UbNU)&6g9sBUT*$DY!-oq=`9n4Y zB7gyC5Fskj0MEOA{Ulh7vko4}ll^@0uqe<6K9s+9umo_y4?2{DSRyb%4CJ?RAT=eB z;N#(oY#_I#@PMk{u>?JUG(M~R0%iw_A5Xsg_<#UAc#81< literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/638.gif b/SRIP/Libraries/Exp1/Data/T1/images/638.gif new file mode 100755 index 0000000000000000000000000000000000000000..8dfae45f1c838c70ef9f8de23ddc0984df9d6286 GIT binary patch literal 962 zcmV;z13mmlNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P|009UbNU)&6g9sBUT*$DY!-ov7{S)^9 z;z2?E{Lw36v7m)|{`^?zNN~U`f6y|JBnZf#KP@W<_ITHi(}0)&9)R=b2`7LE#{6Z| z;4_#%doz6g;pZ=mPZ~@|A;9T?oj+0sa34W1FfFghDf;1C@^Nh=Wvu?%&0nJ&Gx`-1iP8<*bJKw0#kN^Mx literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/639.gif b/SRIP/Libraries/Exp1/Data/T1/images/639.gif new file mode 100755 index 0000000000000000000000000000000000000000..8128b13b031669d7654e64e54ef15b17cbbec371 GIT binary patch literal 937 zcmV;a16KS;Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pv009UbNU)&6g9sBUT*$DY!-oY!u>t`x zAt--4Dk8i{MdQJXu{;(`5X>L52O)H2{Q0p7V5Ps1Hdp@p z!qb2)f0lSAAodUF%K@qUO_RX$qCb~5LH)bRa|+8JJXNs#6m~364dDD0OTd$ezc)2` L%AHHsV?Y2qjt9U& literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/64.gif b/SRIP/Libraries/Exp1/Data/T1/images/64.gif new file mode 100755 index 0000000000000000000000000000000000000000..725171c7a8dc36f733d630eb3669e14fb3671d98 GIT binary patch literal 1040 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

6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pv009UbNU)&6g9sBUT*$DY!-o(f0(jsH zjKqTv{N?jB!BQmv;^?XpQf1>%K4i!Ge$`mGd=mM z6<}sOe`IFj(5Ej)O9GVqshUaQ=S(X8;)!UPK-#}eGi~_WC$r@fe@$irsPr%GOgZ;} Ls+~)>V?Y2qCS}BG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/657.gif b/SRIP/Libraries/Exp1/Data/T1/images/657.gif new file mode 100755 index 0000000000000000000000000000000000000000..74caba196921e8af5718345805516456c31598c1 GIT binary patch literal 1021 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 IJ`4x|JJKe;1ONa4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/669.gif b/SRIP/Libraries/Exp1/Data/T1/images/669.gif new file mode 100755 index 0000000000000000000000000000000000000000..2cc2d6f98fd9ffd26a46bb5796d3c56b378ae4d2 GIT binary patch literal 1033 zcmV+k1orz!Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q)009UbNU)&6g9sBUT*$DY!-o(XCQ#$* zpGAFzW<&(Q;ak6tAN}>y#Uo-Lkaoa;;r5Xlhld%&fg~ZY0GM_C(xGt3=i?kC3J3!F zn8jg`k0lEx=+%#1iH0SR9z^m{5>%-MV|+x_P!iUHTKjQjsN$oYg9CDjZ8$=ozgzc?e&H|_jBq%y!@d226daK*=LUz9KAx*VkjlqG z4;dWpSF44blT3iRL;35xaaG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/670.gif b/SRIP/Libraries/Exp1/Data/T1/images/670.gif new file mode 100755 index 0000000000000000000000000000000000000000..4a1474598a890684d4be962f06897085f821e2ef GIT binary patch literal 1036 zcmV+n1oQhxNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q-009UbNU)&6g9sBUT*$DY!-oiCD4O@L zU!npK3C!m;B=ejzg=I%yJQ#wz+)B0HI~VF5Pj`u)o%sRDqC{ct!e zfT$zCe02uW>Ill=4Wr$D5M0Bw;fiz}wT&n!q$)#HAG={OsK~2A9~Ao)Ie4XCKT8W6 zT=S?b!@;sB7nbSB&aOca-drX$0k7jBgwj3^OQ7&YM`R2Bc8Ylp#zIkU6B#7o%`Lyf z3qy7EBv8bQ7jCv01-;OT(OkIHwd6PMiNgd<*m*SSF<6rh8RN)fIq3odk;s!PU(Osr GKma>B^z4oR literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/672.gif b/SRIP/Libraries/Exp1/Data/T1/images/672.gif new file mode 100755 index 0000000000000000000000000000000000000000..b845a2d91c766aa7d24c7de2b954d7f2b0b6fead GIT binary patch literal 958 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 QuE_{vsNK7GMFs=_J84hEw*UYD literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/679.gif b/SRIP/Libraries/Exp1/Data/T1/images/679.gif new file mode 100755 index 0000000000000000000000000000000000000000..74f5e74668f8ab2b4b43a3c0319679667cab1876 GIT binary patch literal 918 zcmV;H18Mw6Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pc009UbNU)&6g9sBUT*$DY!-oaA^aDfy zB0@U+_|>p@utUa091VKp2QnnV4*mKuGI{bN%Yh?HzKr=&phT550W@-1b0^81K4r3O sl+p>%j2v>xLYlK5)0+SKIcw0A->w5y`6aFCYtfkjIm3z_%Q7GUJ8*-!A^-pY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/68.gif b/SRIP/Libraries/Exp1/Data/T1/images/68.gif new file mode 100755 index 0000000000000000000000000000000000000000..3b091928b90f5e54794c0942fec02ca52398bb18 GIT binary patch literal 962 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/690.gif b/SRIP/Libraries/Exp1/Data/T1/images/690.gif new file mode 100755 index 0000000000000000000000000000000000000000..e376a1370e7e744b4fd0d4ce5753a1dbe5b92a91 GIT binary patch literal 1045 zcmV+w1nT=oNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q`009UbNU)&6g9sBUT*$DY!-oi4(~n&M|c?V^jk?T$%0)kA0|*FZl<{#0&(`6 z_RvR1Yc&KeFxD@h7KeDibtFiH73Se6%z?oR zXy$Q*ve1lOazrLH7??s3$9ZxxFpQ*+BePzia{uF4&(uR~c1ia8cMqOnh-UEMVbn2C P5s=WMOP@|1KtKRHJfQPy literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/692.gif b/SRIP/Libraries/Exp1/Data/T1/images/692.gif new file mode 100755 index 0000000000000000000000000000000000000000..95de74a3093aea8890ac47f2e978f81959ed31ba GIT binary patch literal 958 zcmV;v13~;pNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P^009UbNU)&6g9sBUT*$DY!-o(f5`6RT zpQ{-X3BuvmuOpg_0_EuI*pFNRkQ=a(?6(Fa03j>EDF6w?+{%_9k*tK}z@-gm9pCA2 zNrs%fj;dT*kTkAiH3>?0kzC~xfCOzFaZzv?!4}CNRk@JtWufY;j?XGoT@tS&s;UWW g_A92=r7V&yssccVwyw(=@SI7}OSrIMfdK&kI~s(`5C8xG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/699.gif b/SRIP/Libraries/Exp1/Data/T1/images/699.gif new file mode 100755 index 0000000000000000000000000000000000000000..a7b33461bcbf04562a0314da2f873948a5db2399 GIT binary patch literal 951 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 H1_S^*USz-e literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/70.gif b/SRIP/Libraries/Exp1/Data/T1/images/70.gif new file mode 100755 index 0000000000000000000000000000000000000000..f30bf134fd62a16b047803efd11e3b7ed7039ebc GIT binary patch literal 1013 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DY!-o(dF7wB) zqO}_d- z5Yz&6RKpL|{Gnq?&?-M_b{SqeS;-*El?{1xl*Xgr;fKoL$_20|vPy@0=KZ^BlOh?2 jd49e;sqZsH3ZO>w>oxhbD$;;r#E7b~w(Z*v0|Ed$YJld# literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/703.gif b/SRIP/Libraries/Exp1/Data/T1/images/703.gif new file mode 100755 index 0000000000000000000000000000000000000000..88cb6ccabbb298a33bb8fe3101772cece7160afd GIT binary patch literal 1039 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 Cx4IGl literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/712.gif b/SRIP/Libraries/Exp1/Data/T1/images/712.gif new file mode 100755 index 0000000000000000000000000000000000000000..020ea17c9c8b38b1be17ebd643717c0dce97a8b7 GIT binary patch literal 954 zcmV;r14aBtNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P=009UbNU)&6g9sBUT*$DY!-o(f8Wa<6 zmIa9f4-6{C@7@`V0%vIAN753=f&EBcItf5bzkl~kf^2a|9lw5gST-WbPuK*O@pv|1 z$;4m3e!f`dn3po$4whAJ@)N{TgEXl)SgJa@Zwbo-yGSBq2>=aGCS)`5oWatM(S971 cGUXR30ZUdlRh1wchF`oeWCIHxJTM>tJL4t5p#T5? literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/713.gif b/SRIP/Libraries/Exp1/Data/T1/images/713.gif new file mode 100755 index 0000000000000000000000000000000000000000..66bb7c07331b662b15189953f101d19cef9e3f74 GIT binary patch literal 1021 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qu009UbNU)&6g9sBUT*$DY!-ok$B_PK`4RNPK7~hvBsHP{L`bAhwi*clw##rwG}GSAySMM%0RaFzCU4|H literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/73.gif b/SRIP/Libraries/Exp1/Data/T1/images/73.gif new file mode 100755 index 0000000000000000000000000000000000000000..6fd522490f95eaaa594818b1f243eaefab98a0e2 GIT binary patch literal 920 zcmV;J184k4Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pe009UbNU)&6g9sBUT*$DY!-oVlz(WEt zVFq{5Dkh93&Vj~*(fqCWXz-OkKqL$P@W(7A!8I&h4#W~uCV(3?W%|kKa%V4_08;tO u12kl?qW<34w6M-!37d)hje}sb*}q&soB8XLbt}*})J6gwOSY`WfB-xBHM_3> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/734.gif b/SRIP/Libraries/Exp1/Data/T1/images/734.gif new file mode 100755 index 0000000000000000000000000000000000000000..44c710d950fe24512d0538e451e496f6129a1d6f GIT binary patch literal 1051 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/744.gif b/SRIP/Libraries/Exp1/Data/T1/images/744.gif new file mode 100755 index 0000000000000000000000000000000000000000..c4d94687c02fecf487befb75ac41b5d13d406df9 GIT binary patch literal 1036 zcmV+n1oQhxNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q-009UbNU)&6g9sBUT*$DY!-olVwEE}I z-#i--2QGLuub)SczA^&9q3WYaP8p}PGudp~M~G0|ePkzU!H<^>5m4&bk6)-70&jZE zDa@oefS(Ke+*u*)(>A5g;G{}M549eEsxF= zI(g@jpC$nY8G!Q$CgG5JA444^V9TSq6bbFj1ZuF)M@S0sc|3O`FPnQF$+b}E&!aJe zJz#wlSDCZNX+Ki`$aRdaM`5KEqBBX`qqrpm8nS^`yDYkFh#$7#L|f2Vk;s!PU(Q@$ GKma>Yoa{9K literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/746.gif b/SRIP/Libraries/Exp1/Data/T1/images/746.gif new file mode 100755 index 0000000000000000000000000000000000000000..d5aa77d63575d89bb228146f25f8b1b185670ef8 GIT binary patch literal 1037 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/76.gif b/SRIP/Libraries/Exp1/Data/T1/images/76.gif new file mode 100755 index 0000000000000000000000000000000000000000..80c0d5bce127a0764a51a3346e93a876f64bf81d GIT binary patch literal 1022 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qv009UbNU)&6g9sBUT*$DY!-o(f0`Re= z+COqz7)TUo#9Y6RA2A)+Xb+@GH4-b_Gx-r328oCX3kFq)Wmv4AIwJ?w z_RFepfwF$P5bAKcf#I5uC=S*b*Kg;-zx@Iid_nk}j)sU83oJ0mTfcKV96DguPn@?T sI&`S|IPUSowle#-=0E@iP&ySMM(3j+cGJ5vklG5`Po literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/766.gif b/SRIP/Libraries/Exp1/Data/T1/images/766.gif new file mode 100755 index 0000000000000000000000000000000000000000..ccaa109be0ab7030cfc6b2b0c096d59ab2c9ad72 GIT binary patch literal 952 zcmV;p14sNvNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P;009UbNU)&6g9sBUT*$DY!-oeC$ny8^ z62yaW`f2QSu^=IM8t)nDNRW-jeuqdBbahgV%7Mc)&SUTrfCq3IZ`C9~=wzIlDo*w* zP}9gsR{~y6K&KJhikf^*da60#*U2?ClbnP`q2|1kJ8E{(rx93%mqF@j{C4)`t&^>4 a`nac&UXGdtHuc*_q^94$fCD282mm``-OUgH literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/777.gif b/SRIP/Libraries/Exp1/Data/T1/images/777.gif new file mode 100755 index 0000000000000000000000000000000000000000..30041cfd44711ef3f2635e341896cdde232af9dd GIT binary patch literal 995 zcmV<9104KENk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QU009UbNU)&6g9sBUT*$DY!-oZ5{PF@3 zVV`vT#C@n(a6`9#{P<17Q-Gtu68u1h>~|-C$yzBx#w^6~hrE=Ogv7kprDBqmBNk{< z$)@5apaO|Pe37nSzeofBIW6iiKqZ+J1}d#8lM=zL4FkxenlvO?h5?-RBl|<@+J|Dz z3Ix#(B)11}#{yVjDJC3 R{Qz<4OuDq`(+&dy06R>S-YNh9 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/78.gif b/SRIP/Libraries/Exp1/Data/T1/images/78.gif new file mode 100755 index 0000000000000000000000000000000000000000..30c4a217fbe12ed1202a7134c5f79c0dafa9e8be GIT binary patch literal 935 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/781.gif b/SRIP/Libraries/Exp1/Data/T1/images/781.gif new file mode 100755 index 0000000000000000000000000000000000000000..c9fef9370319cbbe29e54bd896adc704bea0e4c6 GIT binary patch literal 931 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 Um`EmrEfGn*y7lYW2?hiJI|xDlKmY&$ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/784.gif b/SRIP/Libraries/Exp1/Data/T1/images/784.gif new file mode 100755 index 0000000000000000000000000000000000000000..956b35d8c6d9545371c682218f5a6d964faef88b GIT binary patch literal 951 zcmV;o14#TwNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P-009UbNU)&6g9sBUT*$DY!-okk{riUj zBEo6?`c<@8@W#4~8#xL@AT8r91tJG($tZ6_N`XGoWd!w7Ah3-67S$x8E+e}RFB>Go z`K0C*oWdBqM8Ym(Iw3)e;dE4!3QkW8UV?a+5nYO!kev3Y*+gE(Vl@G5!dayzhI<*g Z7^s=S>58-snyq7#wy)p6fC&Z!06UiD#YzAG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/788.gif b/SRIP/Libraries/Exp1/Data/T1/images/788.gif new file mode 100755 index 0000000000000000000000000000000000000000..389de7b10410de809e0e191690d101edb7701e4d GIT binary patch literal 1046 zcmV+x1nK)nNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q{009UbNU)&6g9sBUT*$DY!-ohPNo@2) z0Yri=I`!knu^*L-0;Ry?x3S~Li%jNqj1`Myp^FXt_3Ia}jKEPci#*KXY-74M15Ip1 zvu27jflvV;nVb>=;>eFMLN_Ggtw>msEh`vIlQ5yin7 z;#Bf;l0f0VnKe2<=+Gfh2TlF_-P_fGAvwnVu61Nw?2JPe;C6Q;CJ4vH2^=^uT66{w QhteRUOP@}?y1;+{JGue$X8-^I literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/79.gif b/SRIP/Libraries/Exp1/Data/T1/images/79.gif new file mode 100755 index 0000000000000000000000000000000000000000..a6b72358b2921022d33a49960643b1ac198c764c GIT binary patch literal 947 zcmV;k15Er!Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P(009UbNU)&6g9sBUT*$DY!-ofb_^Spn zp_zXC%uuLk(2T!+{$y}0c#&T}ks}9s1c@>w07n>4x&$x-WIu2lT@o_MPt;5Rt!$c^ zDJ3Sq9y6DH^p|dCig_{L%p_!UnNy=ETrQ}#^wLZ&Jb|_3SixGqfBjO-glTfs%s6NJ VEz9cC!=Q9hf9l=Kx39o}06TJP$9ez& literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/791.gif b/SRIP/Libraries/Exp1/Data/T1/images/791.gif new file mode 100755 index 0000000000000000000000000000000000000000..6f4c8ca6f08de4570de3f712b9153471d026296d GIT binary patch literal 1048 zcmV+z1n2ulNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q}009UbNU)&6g9sBUT*$DY!-oP3+)$+G zU%ylonIwQ%fC|5l{XT*e7UZEKk-c!;QU;QrIy((lgd8V?fWQVVT1@-MZURGY{m#KS z*Z@p7eijyP>i3VB!ae=0C~U!wAEXcpjqppPuna#$483wi7zG|uhPe2xNEnJADgg_> z*gJa=L%(Yk77kF=uU_7RE%@DHXy@aiglhyZq!UtEgM=6qCuD*zWEO=Drr||M#~r_Z zY78tC)o+@Jf&=XITkWYK6tny;y_h{l)yH+29(w&Ok~cp<5F21o7E)x$OdBBrSOBK? SygH(lOP@}?y7htq0RTI#KJ2*w literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/810.gif b/SRIP/Libraries/Exp1/Data/T1/images/810.gif new file mode 100755 index 0000000000000000000000000000000000000000..335c5e74c996112a5420d04ed303435e46fbce06 GIT binary patch literal 952 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 GKma>TgY2#V literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/82.gif b/SRIP/Libraries/Exp1/Data/T1/images/82.gif new file mode 100755 index 0000000000000000000000000000000000000000..17586081d5c2cde2094417359908dc196c5f0c0c GIT binary patch literal 1018 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qr009UbNU)&6g9sBUT*$DY!-o(fav0{X zV#R+wA_6e*tDnb@{dh#w;0q+YU-Cjie6R~-KV$%=sdQ*T2*`NRSX|IHvmqaswge9H zDAJ*cY#!;oDIt{T!=D~Y4YXj(sY9snS`4h=F`o{H5K#5Qrgf`FMGrrDoK%o&KeP=I z@#{CPK-+%v$~a`?k&i)6{j@o3K&qc3y97a`3+&K`M?nQkEc5uM@mdm?NnG;QuihU7 o4n-()2@)nmzNGQ33li~4E7CzV0&w62%*RAHWb59|+hITeI~058761SM literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/822.gif b/SRIP/Libraries/Exp1/Data/T1/images/822.gif new file mode 100755 index 0000000000000000000000000000000000000000..2aa5db3704e7a064a758e5e244963f0bf17bb654 GIT binary patch literal 967 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 Yg?QU<9gv*>%*~5~x3Ay7e**#lI~eWBpa1{> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/839.gif b/SRIP/Libraries/Exp1/Data/T1/images/839.gif new file mode 100755 index 0000000000000000000000000000000000000000..da4e1062af0be56119f325bf208b88236c3ddbee GIT binary patch literal 927 zcmV;Q17Q3|Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pl009UbNU)&6g9sBUT*$DY!-o(fI_US0 zNyLK=`1SL(;9@}mk^1q|;IUvKkt9nFJULS3N|Y`ED7e;dorRbg`$dWgAg3apIUDet z)UVh9o|5<#;+Y|yQl1<5J&hT4s!Kmom&ODoRRvG3?sx(KwJ(lXP+`TYUF$I*06UuY Byhi{4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/850.gif b/SRIP/Libraries/Exp1/Data/T1/images/850.gif new file mode 100755 index 0000000000000000000000000000000000000000..cbd2271332a917701f8da607c1d007ca79675a14 GIT binary patch literal 944 zcmV;h15f-%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P$009UbNU)&6g9sBUT*$DY!-ooi{QCC~ z2*iRCDN+PX=dEM~)C%ZY23{J*6BjVBeJE%__$*OWD< SG7TEHquslB^XeTK5CA*3oxzm= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/860.gif b/SRIP/Libraries/Exp1/Data/T1/images/860.gif new file mode 100755 index 0000000000000000000000000000000000000000..16867ff0fb4dceb0d0051ba0016644eb852d00bd GIT binary patch literal 1044 zcmV+v1nc`pNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q_009UbNU)&6g9sBUT*$DY!-opNaQpY~ zULJ@8U37}Kub)Sc7y*1i_pxL@h%YYrGwD&@iHAAP^;_8wU6f=VnLP|t&g05WEgs

0}Tb+NGhjkKzih=-IFALQnqU zS~3_V?z$KY&+z*Qr63A$9yu*+L9!pYK}`vI@z^YJLUkW?9en2T7(<%qh8WC)uiv^R zmp!&B*nyWmk60T1^GJ?JiWGiaVO!k~R)mI~_Ok4^de(!7o#1sWX)o5A1tHDgS-w0+ O$mh_bOP@Y4AOJgp+4w^M literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/861.gif b/SRIP/Libraries/Exp1/Data/T1/images/861.gif new file mode 100755 index 0000000000000000000000000000000000000000..c99e8d55a3d5cf0b579025d6f4c74c1522cd1e8b GIT binary patch literal 1031 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 QXdTJ+sNK7GD+UArJ52z?2mk;8 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/872.gif b/SRIP/Libraries/Exp1/Data/T1/images/872.gif new file mode 100755 index 0000000000000000000000000000000000000000..d9f78a0a7960aa9d764c9e7b1caaec74d17050eb GIT binary patch literal 950 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/890.gif b/SRIP/Libraries/Exp1/Data/T1/images/890.gif new file mode 100755 index 0000000000000000000000000000000000000000..adadcde1d94e2e03f208b7bc1edeb637a10c61b7 GIT binary patch literal 1050 zcmV+#1m*ijNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R0009UbNU)&6g9sBUT*$DY!-onRv;hT* z4a9;1Olb4Rai61$0xv+~NYdXYkY(s`oMwj3K7YF)Ua-TF-=hZt>-l5%kijXA--Hm< zd9q;-ZX6>eAlTz&mxf?oihEiRmOoVk7>2p$uT}_yN#^;p!mxupf15TKlmN~jECmY{ ztUTDlnOg!39r?Q_!{7y#=14FU5zpV3f&)x+^LH*r!(ogY5bV&2<2e=$eem<=hhULg z|L&2J+^~&5dk_F5uwuxZKYfQEg7QZXz!S(Ez2Ufs&0oKI{Wx+vVgRH{j`*~Z!3h#T UnNObv*=SC^y7lYW1qK8FJ1{NxXaE2J literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/892.gif b/SRIP/Libraries/Exp1/Data/T1/images/892.gif new file mode 100755 index 0000000000000000000000000000000000000000..9f204e23b9b9129acc2c0ec23db26eaeef656b27 GIT binary patch literal 954 zcmV;r14aBtNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P=009UbNU)&6g9sBUT*$DY!-olz+*3sX z;=u&;`so8=(IAX|{nT|dXbR-2kpxHN16c#*Ks_MQX>bYPMLm#hXaa!QkDUXWF5va! zmqlkFfBm58tl{q;y(T&l_4AiZCyblpO6aTx5|qwC{Q4m~Kr_g@e*2uzgy0RNC!J_O c!UI7w!MA?%jOb+2&)yN8fCCF2OfVn-JG_+4YXATM literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/9.gif b/SRIP/Libraries/Exp1/Data/T1/images/9.gif new file mode 100755 index 0000000000000000000000000000000000000000..1cde334d513e6074f4013d50d2a2ef0f95fdca22 GIT binary patch literal 924 zcmV;N17rM0Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pi009UbNU)&6g9sBUT*$DY!-o(d7Wh#t zB0>uO%we!-5TidB91CLn2QuV9k2y@9^yiO_N`VmG`Fr$IpsblS0oVwGvuGg(1OPkwV7yoW literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/904.gif b/SRIP/Libraries/Exp1/Data/T1/images/904.gif new file mode 100755 index 0000000000000000000000000000000000000000..4755212a676eb3bf5af0dce20491efcbc26706db GIT binary patch literal 1051 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/920.gif b/SRIP/Libraries/Exp1/Data/T1/images/920.gif new file mode 100755 index 0000000000000000000000000000000000000000..d6759544da4902cda9dcb9751234bfd0650c9961 GIT binary patch literal 958 zcmV;v13~;pNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P^009UbNU)&6g9sBUT*$DY!-ok2l*wlX zBEl8+{4pb7vEYDL{``UISkOp4f8G?399Th@zkDNC3ak|JmP~;+GP)~rlLESsi*5q= z5|SK#X^Q*!eFp^(lN+(hBdUp*sDU4>*Nv`NTw6K+267P5}eJ|UZhl?lXL$Z`*4 g8gLd;-G-Zd`i0zav%s^EbOHz+Ot`S&fdK&kJB%sGGynhq literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/921.gif b/SRIP/Libraries/Exp1/Data/T1/images/921.gif new file mode 100755 index 0000000000000000000000000000000000000000..cabd1261e390b0c2b52057f7722948864b0104ee GIT binary patch literal 932 zcmV;V16%w@Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pq009UbNU)&6g9sBUT*$DY!-oYuDEr3; zBEl*C`k6~$(ICc*iaHjQmQi0Gkp%5!B!@EP%9aAJ=z9s1Q^tNQYu?P+(k4xm13umS z22;q*enDXJx;ak=OmjCi!2|%cAHP6TtJa&kXJ)^xFc;kf+fr;svM6P^139&=+qZB7 G0suS7o4w%x literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/928.gif b/SRIP/Libraries/Exp1/Data/T1/images/928.gif new file mode 100755 index 0000000000000000000000000000000000000000..75966f82bcd9c1f2a80bc58dc0641db12aa2f063 GIT binary patch literal 1055 zcmV+)1mOEeNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R5009UbNU)&6g9sBUT*$DY!-okIG@69Y zR|bd#7mV5GuVX$A7zHu_)Ujl~4Iv-&D#@yyKYSK2Hn_#lUpOie%K6I&0^)~a9Z7Wn z@F3kzln*O)Tvb3|l#ci$IBZafV>J&0i*!Vmz@Zg;{@e{An5bhjhcM3hs|Lluz!FCN zb#i#AW2Ay5>UE^ku!T8)*m@Fd@U7#dhNe0uG5A8AKYdOZhN+p#EkOch{jGzr@Bq+! zMG6jh((xV-hA%i`>pGA_pVD_3>ZmDgLI^Ts9?k36PmxrHG-{UoHyj_KhZw*P@8}K_ ZXNWOS`O=KaixdYTvuoeZy}Q7G06WhS^^gDn literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/942.gif b/SRIP/Libraries/Exp1/Data/T1/images/942.gif new file mode 100755 index 0000000000000000000000000000000000000000..6d6b7a291b7d0b79fee08a10ca04ba866dde1e66 GIT binary patch literal 937 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/950.gif b/SRIP/Libraries/Exp1/Data/T1/images/950.gif new file mode 100755 index 0000000000000000000000000000000000000000..1389ac9177a9a85e5bc583213897a90ba155807e GIT binary patch literal 1046 zcmV+x1nK)nNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q{009UbNU)&6g9sBUT*$DY!-ob5{9yKP z93&GE364PJuVcq}e=-VWW3J?o$;@6QLCqVf8kwfv&#kP+3(trTKCFVUQ5BGR1 zG?2qPf2|Zagr%?JvjPJh_4BvvKtm4lI%1^*s{tZ~?WF9y@gq`3GJ}YDNr*6bQzx QKS3&%OP@}?I`x16J4>$brvLx| literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/952.gif b/SRIP/Libraries/Exp1/Data/T1/images/952.gif new file mode 100755 index 0000000000000000000000000000000000000000..4f45dd0ced8c98ef2aba489feca06aaba8deb201 GIT binary patch literal 956 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/958.gif b/SRIP/Libraries/Exp1/Data/T1/images/958.gif new file mode 100755 index 0000000000000000000000000000000000000000..a9a7daf6fd5109385e682796b891196fd359afed GIT binary patch literal 1040 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/960.gif b/SRIP/Libraries/Exp1/Data/T1/images/960.gif new file mode 100755 index 0000000000000000000000000000000000000000..f8d1c2543e34b0f4c0ec5d0a8051a5bd91aff76a GIT binary patch literal 963 zcmV;!13dgkNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P}009UbNU)&6g9sBUT*$DY!-ooO^>gC{ zqCpVF6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P$009UbNU)&6g9sBUT*$DY!-ooq`11l0 zVTEe_XjC+4fYCo{6*d;s(a+xykp(UFdlnLcqzY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/966.gif b/SRIP/Libraries/Exp1/Data/T1/images/966.gif new file mode 100755 index 0000000000000000000000000000000000000000..34fa763d7aa053e72f5e9bbf2946a481f8f3fdf5 GIT binary patch literal 1057 zcmV++1m62cNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R7009UbNU)&6g9sBUT*$DY!-oq^1p9Xe zqCpCM;`#Guu7SmYckXTcWQChYiw;O_+-Afwe@1xVv2p}VSi&Dnh77Rzb2io>D}R|9 zg7W80#z7?b{1st11s}XO2Uo=FhpE8A4dvhpFt|f4tO*SL__JjptC?~Bvb|`SN?ucf z1}<&1wxXekcC-`_JP~apEDa8$_|r3RKpb~8IdO1k;hVn!0$U*4xX$iF0_dh0h;b^f bzg8GNW|F6Nqd!Q7KWg93y}NgT0RaFzTN?WG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/979.gif b/SRIP/Libraries/Exp1/Data/T1/images/979.gif new file mode 100755 index 0000000000000000000000000000000000000000..bfa304573b875257683d56d936a193a5ef3a9f08 GIT binary patch literal 924 zcmV;N17rM0Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pi009UbNU)&6g9sBUT*$DY!-o(Zj`&9^ zB0?$s_%*R;FhHDsn>ZR&0S}%Dkp-*u^MR6}%8)GuzKkg_5=fc=g7hmUfM$Vo{R-gZ y)DO$her=9I!da#tHJmk^;@m(k9}b+L`VBf-3TKIZxd`ASRcipwvuGg(1OPh_(YCn& literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/980.gif b/SRIP/Libraries/Exp1/Data/T1/images/980.gif new file mode 100755 index 0000000000000000000000000000000000000000..7e582cb533bfc6170d31270202f6cb9e6136da85 GIT binary patch literal 1043 zcmV+u1nm1qNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q^009UbNU)&6g9sBUT*$DY!-okabc#pH z1jK>@c(n7!F_(dh0t0m6$dOMBkN_5V;rQ;DKV}P1w&BQ53j$RBwt)Q7&)>E#0(bfQ zbny#6f7jdyR6uMfL=o9IP8rA{oE z`BMj>VS`v4RTUWcU>HZN4ViE(=U||KNgUHnXvpB3zk7BDGAP3lpC5-@IFcIZ;1S1l zV;-j6MnT|>Vu^P=d{EEdTL*uv{;P!oVi14xu2@<}QqX~m5z>+5h)W5|05W*{v(+R3 N%IDCdOOGB906WUp^Pm6# literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/983.gif b/SRIP/Libraries/Exp1/Data/T1/images/983.gif new file mode 100755 index 0000000000000000000000000000000000000000..a8cbc750e631ee14a04df6cd4010b75ed51a83a4 GIT binary patch literal 943 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 U`6GFAOut_Zdg|TFmv2A-JN@CsO#lD@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T1/images/998.gif b/SRIP/Libraries/Exp1/Data/T1/images/998.gif new file mode 100755 index 0000000000000000000000000000000000000000..a3fbca90ed8159a4d79c3238eb3721f6830731c5 GIT binary patch literal 1037 zcmV+o1oHbwNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q;009UbNU)&6g9sBUT*$DY!-ooC#ENGH zqCo+d^!fAG&Vt2(9GGp~NbVzm16t6H+!*h}$1WpTL20+qjYTQ<{L$MY(8)%35TWGL zIbJ3sLJd1i)A@8@03I5_ zX<$ge)W$yrV{F`4qv4#5vj_%=vCbdAGY(Jro91yKo{i;5IIOb~&p;B)`uP)Q;2|b| z>M#g=qSD_k2N2EqYXl$&sEzkPRj??}-#J&c{b`$G(%DLVpXQo$!71J~Q8P>`U(UR_ H^MC+5^knwv literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/Config.txt b/SRIP/Libraries/Exp1/Data/T2/Config.txt new file mode 100755 index 00000000..f74ecb34 --- /dev/null +++ b/SRIP/Libraries/Exp1/Data/T2/Config.txt @@ -0,0 +1,13 @@ +2 +3 +6 +Contrast Ratio +Aspect Ratio +Perimeter +X-Symmetry +Y-Symmetry +Holes +25 +25 +142 +70.0 diff --git a/SRIP/Libraries/Exp1/Data/T2/Data.txt b/SRIP/Libraries/Exp1/Data/T2/Data.txt new file mode 100755 index 00000000..917a3f72 --- /dev/null +++ b/SRIP/Libraries/Exp1/Data/T2/Data.txt @@ -0,0 +1,192 @@ +6 2 0.168407212121481 0.116923076923077 82 135 128 2 +17 2 0.151249994609304 0.116923076923077 88 107 108 3 +26 2 0.248409549044715 0.0997506234413965 98 120 125 1 +29 2 0.260452072321232 0.0997506234413965 87 142 134 1 +77 2 0.142858964251791 0.0997506234413965 84 108 110 1 +83 2 0.246424798176129 0.0922693266832918 83 124 101 2 +110 2 0.126438584938183 0.172588832487310 75 101 83 1 +118 2 0.256412166101234 0.116923076923077 97 123 111 1 +121 2 0.244446348081764 0.0997506234413965 79 117 139 1 +123 2 0.139536701560173 0.0897755610972568 73 114 88 1 +144 2 0.154641008845181 0.154867256637168 83 100 100 1 +160 2 0.178949225056871 0.140077821011673 92 115 108 1 +162 2 0.213624175387056 0.0997506234413965 97 129 133 1 +172 2 0.215505761659127 0.116923076923077 85 120 114 2 +179 2 0.154641008845181 0.0947630922693268 97 108 103 1 +181 2 0.0980409849410648 0.0748129675810474 58 67 68 1 +188 2 0.252398073885428 0.0997506234413965 89 153 121 1 +190 2 0.206155725075207 0.140077821011673 81 121 92 1 +191 2 0.184291891521866 0.0947630922693268 81 124 106 1 +200 2 0.166668512018778 0.172588832487310 82 96 94 1 +214 2 0.242474168805662 0.0997506234413965 86 153 128 2 +221 2 0.223090814394400 0.0997506234413965 109 140 134 1 +234 2 0.182505630502537 0.0947630922693268 81 156 136 2 +253 2 0.173654546473192 0.116923076923077 80 117 111 1 +254 2 0.228842019924087 0.0997506234413965 94 181 149 2 +8 3 0.223090814394400 0.0947630922693268 92 134 134 1 +11 3 0.163206589811943 0.0847880299251871 67 76 97 1 +13 3 0.225001892085224 0.0997506234413965 94 147 127 1 +28 3 0.300167762162757 0.0997506234413965 90 124 129 1 +31 3 0.154641008845181 0.140077821011673 78 113 109 2 +45 3 0.0980409849410648 0.0847880299251871 72 86 79 1 +50 3 0.186083557248204 0.0997506234413965 83 123 130 1 +51 3 0.105784571558162 0.0847880299251871 84 89 82 1 +75 3 0.152943008341245 0.0822942643391521 73 104 89 1 +87 3 0.120001795914702 0.0997506234413965 81 132 115 1 +99 3 0.118404076499485 0.0798004987531173 75 99 83 1 +108 3 0.186083557248204 0.0947630922693268 87 103 124 1 +112 3 0.291599945718551 0.0997506234413965 113 182 134 2 +131 3 0.126438584938183 0.0847880299251871 69 88 99 1 +136 3 0.200614432119322 0.0997506234413965 90 122 135 1 +137 3 0.104227129087227 0.0847880299251871 75 100 84 1 +150 3 0.219286491716048 0.0922693266832918 100 120 114 1 +158 3 0.195123821563101 0.0997506234413965 88 119 137 1 +180 3 0.223090814394400 0.107734806629834 105 142 137 1 +182 3 0.206155725075207 0.0997506234413965 97 155 139 1 +199 3 0.159765152294317 0.0922693266832918 83 115 122 1 +204 3 0.184291891521866 0.107734806629834 89 144 140 1 +208 3 0.161483321847305 0.116923076923077 92 133 116 1 +216 3 0.204302952793993 0.0947630922693268 86 112 135 1 +229 3 0.102674067597454 0.0922693266832918 73 113 110 1 +263 2 0.116810908980225 0.0972568578553617 81 121 103 1 +269 2 0.121604086761823 0.140077821011673 74 91 95 1 +278 2 0.248409549044715 0.0972568578553617 97 161 148 2 +309 2 0.217393191347770 0.0972568578553617 91 164 103 1 +318 2 0.213624175387056 0.0972568578553617 88 171 140 2 +319 2 0.136233698311913 0.0997506234413965 84 119 114 1 +326 2 0.238548503830892 0.0997506234413965 83 169 135 1 +340 2 0.221185690196887 0.0997506234413965 87 162 137 2 +348 2 0.211748405437042 0.0997506234413965 93 162 137 2 +361 2 0.187880652248273 0.0997506234413965 81 124 120 1 +366 2 0.196948436691483 0.0947630922693268 83 131 127 1 +376 2 0.230771126500234 0.0997506234413965 88 166 142 2 +379 2 0.187880652248273 0.0997506234413965 89 144 119 2 +382 2 0.223090814394400 0.0947630922693268 83 146 141 2 +386 2 0.291599945718551 0.0997506234413965 86 178 141 1 +391 2 0.164934978915064 0.0847880299251871 83 103 108 2 +392 2 0.202455863845403 0.0947630922693268 80 134 147 2 +401 2 0.187880652248273 0.0997506234413965 88 121 116 1 +411 2 0.175414147317314 0.0997506234413965 84 127 110 1 +433 2 0.123210968688745 0.0947630922693268 96 130 107 2 +445 2 0.0858743297812137 0.0897755610972568 60 81 86 1 +449 2 0.180724749771489 0.107734806629834 66 125 130 1 +458 2 0.171900206004978 0.0947630922693268 74 144 125 3 +473 2 0.0828746778282908 0.0847880299251871 70 82 80 1 +477 2 0.110483371017802 0.172588832487310 87 103 85 2 +478 2 0.184291891521866 0.0997506234413965 83 153 135 2 +494 2 0.151249994609304 0.116923076923077 75 135 125 1 +516 2 0.226918951219871 0.116923076923077 84 165 115 1 +531 2 0.121604086761823 0.116923076923077 82 92 103 2 +549 2 0.232706299428673 0.0997506234413965 95 148 132 2 +552 2 0.175414147317314 0.0997506234413965 97 153 139 3 +556 2 0.175414147317314 0.0972568578553617 75 156 141 3 +559 2 0.0652191169602195 0.172588832487310 61 67 74 1 +564 2 0.175414147317314 0.0997506234413965 82 159 145 2 +569 2 0.161483321847305 0.0997506234413965 81 126 131 1 +571 2 0.266560880254305 0.127586206896552 80 97 116 1 +585 2 0.0798915528471172 0.0798004987531173 70 82 72 2 +589 2 0.0934466727615787 0.0748129675810474 63 83 72 1 +592 2 0.234647567369168 0.0997506234413965 90 148 157 2 +620 2 0.132949787518403 0.107734806629834 71 131 128 1 +643 2 0.225001892085224 0.0947630922693268 81 144 134 2 +647 2 0.108912673802141 0.0748129675810474 67 74 76 1 +651 2 0.112058524101355 0.140077821011673 74 109 101 1 +658 2 0.163206589811943 0.0997506234413965 77 138 129 1 +665 2 0.159765152294317 0.140077821011673 74 93 105 1 +674 2 0.202455863845403 0.107734806629834 72 142 133 1 +675 2 0.0739743404497270 0.0847880299251871 68 77 75 1 +685 2 0.208014206960081 0.0847880299251871 72 103 67 1 +689 2 0.124822461456125 0.116923076923077 77 96 97 1 +694 2 0.168407212121481 0.140077821011673 66 122 112 1 +697 2 0.0980409849410648 0.0847880299251871 72 104 99 1 +714 2 0.256412166101234 0.0997506234413965 81 155 144 1 +715 2 0.129684804115963 0.0897755610972568 67 108 104 1 +717 2 0.221185690196887 0.0897755610972568 77 134 121 2 +733 2 0.198778631665330 0.0997506234413965 91 142 110 1 +775 2 0.195123821563101 0.0947630922693268 89 145 129 2 +802 2 0.152943008341245 0.140077821011673 66 111 98 1 +808 2 0.136233698311913 0.140077821011673 69 113 92 1 +814 2 0.177179032232610 0.140077821011673 72 119 110 1 +815 2 0.246424798176129 0.0997506234413965 94 144 101 1 +831 2 0.161483321847305 0.0997506234413965 90 116 119 1 +845 2 0.170151102358872 0.0947630922693268 95 141 141 2 +855 2 0.139536701560173 0.0872817955112220 75 94 99 1 +863 2 0.178949225056871 0.0997506234413965 77 111 124 1 +864 2 0.112058524101355 0.172588832487310 63 93 81 1 +867 2 0.141195414962815 0.0997506234413965 98 118 112 1 +874 2 0.234647567369168 0.0997506234413965 95 165 125 2 +894 2 0.264518042356810 0.0997506234413965 90 169 160 2 +908 2 0.268610329253126 0.0997506234413965 87 169 165 2 +918 2 0.217393191347770 0.116923076923077 81 148 132 2 +932 2 0.191491229083182 0.116923076923077 87 145 137 2 +939 2 0.123210968688745 0.0847880299251871 80 87 91 1 +947 2 0.230771126500234 0.0922693266832918 82 126 118 1 +990 2 0.213624175387056 0.0997506234413965 83 160 146 2 +236 3 0.184291891521866 0.0972568578553617 83 109 140 1 +243 3 0.225001892085224 0.0947630922693268 96 113 126 1 +251 3 0.134589366719583 0.172588832487310 82 119 106 1 +255 3 0.139536701560173 0.0897755610972568 99 109 98 1 +256 3 0.198778631665330 0.0997506234413965 94 129 138 1 +280 3 0.198778631665330 0.0922693266832918 86 105 103 1 +282 3 0.184291891521866 0.0997506234413965 98 111 138 1 +292 3 0.142858964251791 0.0947630922693268 75 108 122 1 +299 3 0.206155725075207 0.0897755610972568 78 126 90 1 +322 3 0.158052058560426 0.0947630922693268 78 115 138 1 +328 3 0.156344018186367 0.0997506234413965 81 126 136 1 +331 3 0.144527370606062 0.0897755610972568 74 88 99 1 +342 3 0.196948436691483 0.0997506234413965 93 119 141 1 +357 3 0.113638152040790 0.0798004987531173 71 75 85 1 +362 3 0.180724749771489 0.0972568578553617 88 129 136 1 +393 3 0.173654546473192 0.0972568578553617 98 131 118 1 +406 3 0.170151102358872 0.0997506234413965 98 120 142 1 +426 3 0.163206589811943 0.0997506234413965 95 123 136 1 +434 3 0.154641008845181 0.0947630922693268 87 111 117 1 +453 3 0.202455863845403 0.116923076923077 105 133 112 1 +460 3 0.151249994609304 0.0847880299251871 86 116 94 1 +480 3 0.175414147317314 0.0897755610972568 89 94 108 1 +487 3 0.166668512018778 0.0997506234413965 92 146 114 1 +491 3 0.180724749771489 0.0947630922693268 92 116 109 1 +496 3 0.226918951219871 0.0997506234413965 95 112 134 1 +501 3 0.0949738324064628 0.0897755610972568 69 91 93 1 +510 3 0.186083557248204 0.0997506234413965 84 140 133 1 +541 3 0.0965052638167855 0.0847880299251871 80 81 83 1 +547 3 0.139536701560173 0.0897755610972568 86 115 97 1 +550 3 0.163206589811943 0.0997506234413965 89 128 142 1 +558 3 0.191491229083182 0.0997506234413965 100 136 135 1 +562 3 0.156344018186367 0.0997506234413965 92 132 136 1 +575 3 0.0873803963511990 0.0748129675810474 65 70 71 1 +582 3 0.166668512018778 0.0997506234413965 85 121 127 1 +614 3 0.149561945713518 0.0922693266832918 80 108 105 1 +630 3 0.180724749771489 0.0997506234413965 83 128 135 2 +644 3 0.213624175387056 0.0972568578553617 86 109 128 1 +646 3 0.200614432119322 0.0897755610972568 85 121 122 1 +660 3 0.163206589811943 0.0997506234413965 90 140 136 1 +671 3 0.248409549044715 0.0997506234413965 105 151 140 2 +676 3 0.180724749771489 0.0947630922693268 84 111 129 1 +696 3 0.158052058560426 0.0947630922693268 84 109 118 1 +716 3 0.195123821563101 0.0972568578553617 89 124 138 1 +732 3 0.170151102358872 0.0972568578553617 79 119 129 1 +753 3 0.198778631665330 0.0872817955112220 95 124 95 1 +761 3 0.123210968688745 0.0947630922693268 81 133 106 2 +768 3 0.163206589811943 0.0897755610972568 85 106 109 1 +790 3 0.170151102358872 0.0897755610972568 81 118 115 1 +809 3 0.0888906464300802 0.0748129675810474 59 76 69 1 +812 3 0.163206589811943 0.0947630922693268 80 116 130 1 +841 3 0.168407212121481 0.0847880299251871 83 77 109 1 +844 3 0.137882802987854 0.0972568578553617 78 121 123 1 +857 3 0.101125368629733 0.0748129675810474 70 66 69 1 +858 3 0.186083557248204 0.0997506234413965 87 144 143 1 +862 3 0.186083557248204 0.0947630922693268 84 121 133 2 +868 3 0.184291891521866 0.0997506234413965 85 134 135 1 +875 3 0.240508230581461 0.0947630922693268 88 106 102 1 +876 3 0.256412166101234 0.0997506234413965 117 176 107 1 +879 3 0.0980409849410648 0.0798004987531173 71 75 84 1 +891 3 0.196948436691483 0.0847880299251871 78 117 114 2 +896 3 0.291599945718551 0.0997506234413965 102 155 149 1 +910 3 0.260452072321232 0.0997506234413965 106 151 156 1 +954 3 0.159765152294317 0.0947630922693268 97 126 119 2 +967 3 0.113638152040790 0.116923076923077 80 114 117 1 +976 3 0.209878424881818 0.0997506234413965 96 121 122 1 +984 3 0.182505630502537 0.0947630922693268 97 130 113 1 +993 3 0.170151102358872 0.0947630922693268 91 114 126 1 +999 3 0.129684804115963 0.0897755610972568 91 109 99 1 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/108.gif b/SRIP/Libraries/Exp1/Data/T2/images/108.gif new file mode 100755 index 0000000000000000000000000000000000000000..cadc488b7f67df4511020a2532c030e451edfd8c GIT binary patch literal 1000 zcmV9Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QZ009UbNU)&6g9sBUT*$DY!-oZ*{QB3g z;tz-dRV0}sk6%B2Al+$#xS`uekS9I*TJW%hM`>(gvH|3g-w}vYrWADf@g_!s6>53x zrQjz)SRmW^GzuV6JCKl=0)Q~FV!ud6H+riH^=F!t*{;Ro7ZoFk34gx9*Rp{CqTg(uSa$Hf^f56U=Z|$83uyKma=$1mU~@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/11.gif b/SRIP/Libraries/Exp1/Data/T2/images/11.gif new file mode 100755 index 0000000000000000000000000000000000000000..b577d77fd48cff1bcb7ed940f539e49a56272608 GIT binary patch literal 990 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 B)*b)= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/112.gif b/SRIP/Libraries/Exp1/Data/T2/images/112.gif new file mode 100755 index 0000000000000000000000000000000000000000..711be95863a4a2763819acc156e329458658d51f GIT binary patch literal 1044 zcmV+v1nc`pNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q_009UbNU)&6g9sBUT*$DY!-o(fN)&iv z%Znyk3i;c}@t;4BWk4hpP^X_ZdHqtVT&a>w!U!x`${Q9lApt+!*rim41BWOaGc@!h zr;;I%K*rc0^j5T?j06QQ$S{O2WjBXE77VxPAOJglzwxO6 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/118.gif b/SRIP/Libraries/Exp1/Data/T2/images/118.gif new file mode 100755 index 0000000000000000000000000000000000000000..dc64124a37614e521c4e5908035f5e9372719424 GIT binary patch literal 1030 zcmV+h1o`_%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q%009UbNU)&6g9sBUT*$DY!-o(ZYIs4h zVnq@UA4zJ~ucJqg<7zN8bMK?ckMS5H>v+$aJ8Lju;_FCnj>?XL0B9me1YXBq4GW=y zLjXVmff~rz^SCIYKmu@_dE9qNfl~l*K4!CdwNJ@@_F#!{df`Q^eEs5?;~Ei(K9BBx zTm?WSo=0;;5DqXhiUUF->^jEFghOBf2oMfHxRQ!hM`Z|CdF&yu3Y|_JQ=PPh@Sn$U z*s#qz*>T@5PY)1cs`r*O*n0J#WocL?(m0RBBI%BBbwrEb7Ul{cPQ1ABs{sK3JMb6i A*#H0l literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/121.gif b/SRIP/Libraries/Exp1/Data/T2/images/121.gif new file mode 100755 index 0000000000000000000000000000000000000000..a4dc719102eb4f99b683bcab06736f79940372e0 GIT binary patch literal 1006 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qf009UbNU)&6g9sBUT*$DY!-o(VCOFWb z&Mzhh3_uhxg-oPxr&{$JxvWs6AO{+%8OgGxKbE*mFnrn4WlKggYmPJ)jOIvM47v52 zx5o>QqZ)bG!7`FviG>+pq)2!G(nv`W55^do%t6+ITl;0J@ReX#RAmPu*x}C~9RXh% zWWhqMC8$UeAX-`Gv*xphS?u-eTl1l|k%U>Aa!95gVwUW%DCGg7VFqt3X$gBb+SjmS8w>~lJ9p6Dd;kCd literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/123.gif b/SRIP/Libraries/Exp1/Data/T2/images/123.gif new file mode 100755 index 0000000000000000000000000000000000000000..ed30f176c69eb74138fc23175385b9506f7480c5 GIT binary patch literal 989 zcmV<310wuKNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QO009UbNU)&6g9sBUTnOLntwg(DOnni}uC=A?RRY0!EhL zS?m{#f&qaIL@X1+FxT9_{aihIWX+-*hVd-!yT=$G;C}CBFtkJO(3626GW}&GIjQH* LphJrm9S{IJW;5Ll literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/13.gif b/SRIP/Libraries/Exp1/Data/T2/images/13.gif new file mode 100755 index 0000000000000000000000000000000000000000..79e7f21a9c8844021d2c35964eaa11c58cf81b15 GIT binary patch literal 1027 zcmV+e1pNC)Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q!009UbNU)&6g9sBUT*$DY!-o(LG8nVP z(I$JgHfh{6h{i)j{z8fz>5rc@Js}u!6S=OJ%U+gxH50jn;Rq!oMr1J909?pS5e;ey zd9Oy$fd(+y3mN06Kp~z&<~xJHsf~Ri@hK_blo3gP%KEejs-u>=ulyKU2<6{5- literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/131.gif b/SRIP/Libraries/Exp1/Data/T2/images/131.gif new file mode 100755 index 0000000000000000000000000000000000000000..149b6c1cff20618408be55f1db32400d213fb772 GIT binary patch literal 991 zcmV<510eiINk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QQ009UbNU)&6g9sBUT*$DY!-o(VvM{zq zLBxZx{Q27li&U2s7X>oHr?KR|XP|yu^wDX|7*_L2u9FaQpo0j{GzO_D(8D8r{_@4B zxd4(pjpl&xT&3~eC=xsYbkk@gsz6O7sa3Q(L!HK39;|}drjbqpt16ahtYQ^_21EYd z9k42)kUx7WLq6z1=V(7T5eYcZ;)-6$e1syxIp*(Q$#-}_LWF|P9KC(NoavDqk&_t! NE-bbkO}cGB06T7X+p+)v literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/136.gif b/SRIP/Libraries/Exp1/Data/T2/images/136.gif new file mode 100755 index 0000000000000000000000000000000000000000..bca15864b88e1373bac07d0e36e05cd9527bc04c GIT binary patch literal 1016 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/150.gif b/SRIP/Libraries/Exp1/Data/T2/images/150.gif new file mode 100755 index 0000000000000000000000000000000000000000..057daccb81d1a0f51dc4f0091da80fefccda8e54 GIT binary patch literal 1017 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qq009UbNU)&6g9sBUT*$DY!-o(XmVwl- z-@l3#{{hO-Fvloy`S^+KCvqgeGYcn}Qpb-ZKWoE?87XvR9LZq|nb;EARqucty$t} literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/158.gif b/SRIP/Libraries/Exp1/Data/T2/images/158.gif new file mode 100755 index 0000000000000000000000000000000000000000..b2b64d15d14738f4e821ee595e14eb9b1f671101 GIT binary patch literal 1016 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qp009UbNU)&6g9sBUT*$DY!-oc&*umxR zpQI5G2W}{4ub)Sc@2+LsaLnVrSkOM|69bWy$82{1WavSyUpo#EJ1isDWZ)8Z{m^9u zzyYT~AMpC^i!`*LE05Hg4jh8-Bc`Sqw9Jy{5gZN#5J@a^w(VoTVkw3SGHbTdf{b;< z$?cP+%SRhh2M(C!5pP}q1a|fP3*f+AhAj|65Yx?LEwBo^l=BoL!H>&7TuJ+=s070i m?`-yB>rvbi0uCvW?uQTEqqGlOaAGT{3gO$hbL$ou5CA(!mgfNg literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/160.gif b/SRIP/Libraries/Exp1/Data/T2/images/160.gif new file mode 100755 index 0000000000000000000000000000000000000000..45d57f07bf91aad644290c14aac7f8efd3c73734 GIT binary patch literal 1018 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qr009UbNU)&6g9sBUT*$DY!-o(fN<6p% z4xCHzGETCH;vpGN^7@G!IWn9VhN8&vBgtx$%T3=zw(F?yUq2OAM8N=IfZz#f{meC3 zIISN8gc9h8yv5K$ivb5G)Dk&w$V7o!tch&4O8aMeq%u<*)Im{`HoyngOZ z-MAXYnaFEW4svk8H{pa)_xin4^#H&E6o~(%QngKFI)o9Fja>6+)F@pf`|0b(%@PZQ oeKM0&H?H)fD-7qTQx{TZAT%4Ux^P2#t=HSQbL-yCyJ0{8J4d_h!~g&Q literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/162.gif b/SRIP/Libraries/Exp1/Data/T2/images/162.gif new file mode 100755 index 0000000000000000000000000000000000000000..59fe207ab23e93de3e38398e8c3199555a094471 GIT binary patch literal 1031 zcmV+i1o-<$Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q&009UbNU)&6g9sBUT*$DY!-of1q)CGV zVnGX6qLu5{4_&m6L>xF2@PHRbe;iYC+~LrSN|d%#_G8KLSUryLv~=i@L1mx=4c*Xd zr>cj*9=JH>dqm)2m5KwSajcfcB0(FN_VtrS$ErXGNXq$>ckF{#fwE3kJ=*}6KYzf^ z3KVm#;}Z#I16-NcubvRO0IqO+_XDsPzPgGeOt7T!5`;_Oam3NUgJlmNE{`(FaUH^> zDQ~@$$+1!lg#SpVOwCc;C@Kz`B3wkeU9CycpdH(xqTvcOz=IC~OuV@9;|Bu*06UKu B@5BHA literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/17.gif b/SRIP/Libraries/Exp1/Data/T2/images/17.gif new file mode 100755 index 0000000000000000000000000000000000000000..791dd379ccf4cafbcd42e0e913dc51a602c410ae GIT binary patch literal 1023 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 aI$R4Cs$7sAe*wA+w6EX4fCDQG2mm`=jKgmL literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/180.gif b/SRIP/Libraries/Exp1/Data/T2/images/180.gif new file mode 100755 index 0000000000000000000000000000000000000000..72f80e54d1b4ac2b425f310ff5d6071cfa336fbc GIT binary patch literal 1028 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 bwTspcR-3mM|6QC#CIr#HfCCF&84v(FsqDq; literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/182.gif b/SRIP/Libraries/Exp1/Data/T2/images/182.gif new file mode 100755 index 0000000000000000000000000000000000000000..b20f3b2c455e16c74e66a3f142bb0a146e169817 GIT binary patch literal 1015 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qo009UbNU)&6g9sBUT*$DY!-o(fN=*3T zMWBBF`k`y%#!15fNs@TUmJS_1e*I3Olt=8t!U`%;s!Vy3CLo0soW-Pxij7Y;H2L9d z*6h(9iY9w4q(C8IjU?$#vY7|~f)kS|o4Jfw0n)FT(zZJMk+B~}v%jcFgcP*jIVKM# z_Q~ez$Sb!qs1jt$?}%Q35PoGu@)tk}l)V%*d{QfK!3CC3&T{zGZ^2D9!#FJ4uZ?HH lX8Wmi2q@;vbDl;({9yOmHF5mTWwWgJ0~;5GbL$QW06QM4>MQ^N literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/188.gif b/SRIP/Libraries/Exp1/Data/T2/images/188.gif new file mode 100755 index 0000000000000000000000000000000000000000..60c8d3600c6e4f38031e8d830f8b30949cdf798b GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!2wVrMm*tg zprTJ0MfuyfaZg2o-8hQeXm85LkRwIDb5hZRh#H7Q$i&An*o2P-rR>}2%L2}U0kX8? z=<%n(DI(D!F{&XKJC2cV7-fNSBdQ`sB}wB*?8<v1;1sD2!O zF)V=)ib!7>67nEKC|g~T>V%OXMXj)5YUehZL-;AB(R}d8?D@PJM8)aKhS&&$F;&%brd9XFvcuXUga# literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/190.gif b/SRIP/Libraries/Exp1/Data/T2/images/190.gif new file mode 100755 index 0000000000000000000000000000000000000000..dbaa90ebe08436be5b6c02a31d68568092a5a7a1 GIT binary patch literal 999 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QY009UbNU)&6g9sBUT*$DY!-o(fN>tb) zLkJ+M;;9RDo zPQ}bq8K^?otK4uHFlZu24qL_I zBIGhQTa6BQ@p4I(D(Fg<>=6Eqwd^lT!!EhOk%7?WOvhbk`fBuG;ZI$MVf8$vW`k#~ V4IA9Jq1LJC)2LIcUi~m206Xu&<7@x` literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/191.gif b/SRIP/Libraries/Exp1/Data/T2/images/191.gif new file mode 100755 index 0000000000000000000000000000000000000000..8fa05be92a2332b5495fddf5b758c644d1e7bd41 GIT binary patch literal 1017 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qq009UbNU)&6g9sBUTu3lco>;<0FidD* zo487{*rM-h|6Cue*Q3xJXo@hE`M@X7HohHButqFU)hX_bKnL_dTRM& z)6?KDe;SGsH{`8xzvV2p15q7YngOXdJ!{(c=GNT%Mx1~qCV06^f9KX)z) z;u@#00k)6fDkb|!reKkJofO`+`4QCvf(1zVi=@yV;g7pE1W;f=g<^g`6h1P?jvcs8 n`9A&|X3ZJMQ8KlFdz|mkQ<)wXt^Oz~Mb+E5bL-w+H6Q>xm{H_9 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/199.gif b/SRIP/Libraries/Exp1/Data/T2/images/199.gif new file mode 100755 index 0000000000000000000000000000000000000000..8d66849bb410395f974a7f407123fb5f74fcfbfc GIT binary patch literal 1012 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Ql009UbNU)&6g9sBUT*$DY!-oLMc>5Gb z4g-h-bBq#~kDteW*O#1 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/200.gif b/SRIP/Libraries/Exp1/Data/T2/images/200.gif new file mode 100755 index 0000000000000000000000000000000000000000..6900b9a8b2706e9dbaaff027779fc7ce23d310d4 GIT binary patch literal 1000 zcmV9Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QZ009UbNU)&6g9sBUT*$DY!-o(fN}TAB z!G#MP3Kc46PU8{;5Igl7NzxxlVt@)XWPy)lKXIjEx+7`9;h#aYo>+J=Py(@$H7N=N zq_5wx1VR_Ak=Kvi9HB8}jid);qJSE*{O#)&NToy!t4PWcF|h`#a3g2w7|22hnYUz! zC2RpJ-^gJhGT@;!Zyvs){q&tPgz(5XmoER2jAtxT5`~`-Pm6?T*`+~xZmeiHOrE@S WgS;#ds6eRc)2LIcUd_5;Kma=^`r7jV literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/204.gif b/SRIP/Libraries/Exp1/Data/T2/images/204.gif new file mode 100755 index 0000000000000000000000000000000000000000..5dc939bbff624fa054c971e73e7ff30fca607309 GIT binary patch literal 1025 zcmV+c1pfO+Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qy009UbNU)&6g9sBUT*$DY!-o(fN>mu8 zkHw1?bv#5NE?+-?{{DgdCla5=g)BbZ1Ie-_OMDFd#ADg2Ql&o=NL1E#UMFAHe} zM)=~+-?TAt1wMJ_k6eYk0Al&e2PJQUUjE+AU>G43sTBkYp13vGPeVl_{bc~)0DuKR vwEXD{=8zrBP?wlpQYTWM<%jZI`r8-p5tfKI>eM-f58pE?fP)JM91s9I+XUqA literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/208.gif b/SRIP/Libraries/Exp1/Data/T2/images/208.gif new file mode 100755 index 0000000000000000000000000000000000000000..7cd811812948cf0bb2e6c5e48cf8932e7fa57cb9 GIT binary patch literal 1008 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qh009UbNU)&6g9sBUT*$DY!-o(fN<>(~ zjzx=PCW?XMt)EAa`@*ew$imyck0?FLTNerj!yxqf{mBq$lb;MRHfj6F&gH@XPo2b5m`!V eAR?YZnGc>bHyf=!W literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/214.gif b/SRIP/Libraries/Exp1/Data/T2/images/214.gif new file mode 100755 index 0000000000000000000000000000000000000000..8f045c8d504e80d199cffa2ed466fecf9222c380 GIT binary patch literal 1027 zcmV+e1pNC)Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q!009UbNU)&6g9sBUT*$DYK^~j>N&Mo_ zAOs}j`t93DZ4iQr0wMI;sBz=Iem+0~ShaCluOe>folFVR*S={Z26mgN5|5`l1i$tB z_d}&YFfvgZE%=8d&7}gH?o0I%DgX-2HttZ#gCH1*{eo45u*#P?U%o7Xm}AmQMX4o8 zwsm-l-8x>qcyW`vv5-TXyavKGx$o17g*?plt0wFp*rAXAr31r2p-sN~&V};Ph}_AI xohl=IW3uG77Xv{si|ZC40XMwxqWW;5;DjygHnz43V9U*%yn_oLPCR%(06P=N^3nhR literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/216.gif b/SRIP/Libraries/Exp1/Data/T2/images/216.gif new file mode 100755 index 0000000000000000000000000000000000000000..d5d453789e4fc1c8b0fa33f2a70b967835d83853 GIT binary patch literal 1021 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qu009UbNU)&6g9sBUT*$DY!-oQ+q*0S5 z4J?1{(ingUV9C6G{`!d=`N;u9Eh0nmJ4Gm;NKPkHhVvtEmPlw27d(c8$!>Bi z_yE^PGeZX=_%*T_hok`Bz#G}m0#r61MVi||0BXpQ@s2qZr%NOVjhK>UE_*2sVTHr>$6ySH!O0RaFzjgaNc literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/221.gif b/SRIP/Libraries/Exp1/Data/T2/images/221.gif new file mode 100755 index 0000000000000000000000000000000000000000..04f41a3ef94c1fbb5e03c6e87ec7ac3c72122e13 GIT binary patch literal 1010 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/251.gif b/SRIP/Libraries/Exp1/Data/T2/images/251.gif new file mode 100755 index 0000000000000000000000000000000000000000..9603bdc018985431b2d2720c27510f51553e4bb7 GIT binary patch literal 995 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 NphJruO&UNz06U)o-cA4j literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/254.gif b/SRIP/Libraries/Exp1/Data/T2/images/254.gif new file mode 100755 index 0000000000000000000000000000000000000000..1a8441b7a9b4ec2fe8e3e08394fd70d261c35208 GIT binary patch literal 1037 zcmV+o1oHbwNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q;009UbNU)&6g9sBUT*$DYK`;;_VsKcH zh_8P8GVbfw>AB)usONyuU4#f!l$8G}(w z2%?|Sp$KVcM0(KIQl z?kl1Y!XHm4Gh*b0ckcs*t1?dORpf)=Y8p3I`J3?S)DZ=RCGO{A;U=RW1TugqY^>3K z|9&i#Tg=z5VjBD1b4hvhcyZG^j~As669ggv4zlMLDOHmzU(USw H@_+z4zu@v^ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/255.gif b/SRIP/Libraries/Exp1/Data/T2/images/255.gif new file mode 100755 index 0000000000000000000000000000000000000000..8ad8eb569972ef76919028b53f6d29c56d346705 GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-oYkgmP62 z)T0Iv2eOF8?i@C3@%#zO2w=!LcTg$_EOL(#NlNW>5LDzZ4#^f02v)+^i2zB01*Xiy zSL7!_QvSA4F*?D?rEdQG?I1ZJ3aN5Yvxe&x!zP(uM6Fd__5E|pP(&(7Gp62$qkY4hf9T`LnLEnN8|>>oT%mH!GKPQ19mfB-w|R_Go8 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/256.gif b/SRIP/Libraries/Exp1/Data/T2/images/256.gif new file mode 100755 index 0000000000000000000000000000000000000000..0b4094bb94cfd0ec5e4c4b664a2f9fc6f746085e GIT binary patch literal 1022 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 LphJs37!UwEEA872 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/278.gif b/SRIP/Libraries/Exp1/Data/T2/images/278.gif new file mode 100755 index 0000000000000000000000000000000000000000..686e57f24619ec96da6f0294c58fd75e22c6e469 GIT binary patch literal 1039 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/29.gif b/SRIP/Libraries/Exp1/Data/T2/images/29.gif new file mode 100755 index 0000000000000000000000000000000000000000..011a51425d3459c08a8bf6af70feaf2d05faf4f6 GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-o(PLh0r2 zpTCQ)%6yQ);2{)w{X&WiiA|g{WXN$Y} z{<2yJ9KDe5JX|oUBULr9Ppn!IDK8O(uGmC2@`1o=fp;xgiJA-q!2yR*?$s1|Oo+oT f$Hvj*W-i$}h&0BGaV1jEi5wQjbe&Cmc0d3-8fD>p literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/292.gif b/SRIP/Libraries/Exp1/Data/T2/images/292.gif new file mode 100755 index 0000000000000000000000000000000000000000..65ab9362889f9e4d8356566fe38e0b4ebc1cb26f GIT binary patch literal 1008 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qh009UbNU)&6g9sBUT*$DY!-oZ%*s;^< zU$+qu2Le%Nub)Scj!I+%kjvvfYqjQi1T)giyjwgx4B)nMta;khJ7C2GzGxLoJUXunoeN$QC$$NUYa!{*Y6z8sQ}*a>-P(-z<6xY z66kZUU!SQA(A@H9qoI*08wx^z_0b0ch8Vu}%Vy_8j~_o;_1pLB&|!uhlzqIm_9Ib< e9gd-^_tB#zraz6)(Z?(krW9^t%bx8vAOJg3iR>Z( literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/299.gif b/SRIP/Libraries/Exp1/Data/T2/images/299.gif new file mode 100755 index 0000000000000000000000000000000000000000..9f2c83bdab39cefd6abe2c1d382bede8bb1bdc15 GIT binary patch literal 996 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QV009UbNU)&6g9sBUT*$DY!-o(V#^{5} zpGAM5Ohg1QN?*T^Ap13osD@w2ko%xO6k_kAwn~*?fgA}D(k2xV1k(AqF33iLv0CYNLf9V7~}k_wgPZrUGS{`lt@AKnA}0 z-D~2OWs^GlAox{ S8&7-!X%0=@)2M$21OPi>aNYF) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/309.gif b/SRIP/Libraries/Exp1/Data/T2/images/309.gif new file mode 100755 index 0000000000000000000000000000000000000000..7fa86625283c67980be4e664247b127eb722cfcf GIT binary patch literal 1014 zcmV`Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qn009UbNU)&6g9sBUT*$DY!-oQ86#D0{ zqCZ+&SU?0oU{b%2AU|HCRV9E!86jy&;uNyq1BVMF#lnF@0ssRv8|8Dk5urDpJq`YR z8I)j>cR-5*h$8PJ(V|G!fqdH22dIya4w!6sfDEgzU(xmBSMS5a80A`mr1WsX3vOyb z0(rP5Zb)-Dtkw(Z-vdj6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QQ009UbNU)&6g9sBUT*$DY!-o(fN}RZG z!Gtf5GHT2i!l9N*(E5oSNiv&-hX4BQ^X4rSqcJeYJQ5kFVK!-24t5A7QVK8=JlU9iaBJtNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q>009UbNU)&6g9sBUT*$B?LKEKl_50@x zi^G94!i5{fh@Z!P{H!s#2*A|GWW#9PxMPpsHF=H+3+4(Rb8s0(%7M4M3*Ib@~LZ}>WNXC&zUvM&XUCz9@ K^XCZz0suRk4D);d literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/319.gif b/SRIP/Libraries/Exp1/Data/T2/images/319.gif new file mode 100755 index 0000000000000000000000000000000000000000..235c7b4deb999e44be59dc6821880fde423a52c2 GIT binary patch literal 1030 zcmV+h1o`_%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q%009UbNU)&6g9sBUT*$DY!-o(f0;pgI z**`@R2S$K$&Y#C)836zh=TVt5f0ZQWptR3lGe8Fj`NIT}$FF|-ia9v|V8*>{7$Bx` zbm|GgSpL{VL}Bnyzgq)B4&)IJoC>J}ZTT~b6#$=oy$p0^kq_Pqfdvj6C=fA1$0Pt) z+$k2#8L}1-1Nn>f$C*8U@T8IRR}O?j8Gk+A>t&<_01J=$O*7H3mdAIBG#G^C4-tZe zV*2T`WdR`pME<-e?D39YorMA*kqde-!Z3erx&ol&?^6KXo`yxxO}w~q00992JEFtn ADgXcg literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/322.gif b/SRIP/Libraries/Exp1/Data/T2/images/322.gif new file mode 100755 index 0000000000000000000000000000000000000000..e28a0d4972286025a0131f9b0cc1f2908fb96d6c GIT binary patch literal 1022 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/331.gif b/SRIP/Libraries/Exp1/Data/T2/images/331.gif new file mode 100755 index 0000000000000000000000000000000000000000..8e31f6e84e9d8e0c7f29db3665b90e9666475435 GIT binary patch literal 973 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/348.gif b/SRIP/Libraries/Exp1/Data/T2/images/348.gif new file mode 100755 index 0000000000000000000000000000000000000000..0d8b67a04257fe8e03f39b98d584e00f9b09f2dd GIT binary patch literal 1043 zcmV+u1nm1qNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q^009UbNU)&6g9sBUT*$B?!YqLL{nO&G zpoVbb!r9};uird694ZQ2!;jpsVahsk3?>qQhHriZDxg9|8^3QY5mw>%?nh38Rr>XV z^RwVic}j{B6n0bTKqm8=It37iW2C77VD%&Sq9Ke);pkMU0z=@%e*7pkv@s4XM}Fms zVd2y<-HL?@6oKOh@0*-4-`sM9cZA`nw~Po1=9ieExPI__3TzPPpHQK|7%&XSZ;ZeW zRcfhx+ppFHg;_RUD`xE4TXK|cY*HEPG(r>6HjYjgsVjh)?f6*>sSryum5oXmlmX`o N*5}ZpOK%wv06Rpb_8b5J literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/357.gif b/SRIP/Libraries/Exp1/Data/T2/images/357.gif new file mode 100755 index 0000000000000000000000000000000000000000..21b9a588a4a09cb4c82f1cc127d0a70a67791c2d GIT binary patch literal 976 zcmV;>126nXNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QB009UbNU)&6g9sBUT*$DY!-o(T0{iE$ zqQ6yzK139#uAj$`{nX*w5RpPIbcz%x=+equziS;fa^OG^1EGGSHXa1gFP%<Zt^f}83xrlJTdr== yKI)f;E0%oyGHeVpXO5Q{gX;CuhhbwEX(0RA+p3cRj7sVHWy^xLvgL>Y0RTJNBGlmk literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/361.gif b/SRIP/Libraries/Exp1/Data/T2/images/361.gif new file mode 100755 index 0000000000000000000000000000000000000000..26807ddc81b1580d6009172766bdcb12ec72bd71 GIT binary patch literal 990 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/366.gif b/SRIP/Libraries/Exp1/Data/T2/images/366.gif new file mode 100755 index 0000000000000000000000000000000000000000..d0b0d7d86445ef5ba96da56692093ad3f07fc7bc GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-oY)%;`rF z3?2&iA9+3eMX}$%!iEv^Xm|wW$8X$zp}>;{I2u!Kp+T| fjT%Cr>2x5050m?G%PJ56ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R2009UbNU)&6g9sBUT*$B?!WV6*^>gFI zp}_@7((&8aPu>}e13_5g*KZ?9e(@?=43Lc@KT2#$@?!(CjY(%80r+S)6XXML$ih$v zIj$#2A43UJ+ej1SL77dR4utUQUq4M!3x*6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q?009UbNU)&6g9sBUT*$DYzz&B_`SbTL zRR)Izfw1exv12q17zNsh$5CG?N&7e&3JD;Fv{z7(kRzerEFUo69j@zLeG?C={WlV>v2I=G-zj*V+|^2aw3qC4*pw5{)9=ke#); L^XJeV1_S^*|Az19 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/382.gif b/SRIP/Libraries/Exp1/Data/T2/images/382.gif new file mode 100755 index 0000000000000000000000000000000000000000..c899e54848e9c093deee9dd5ea772266cb100d0c GIT binary patch literal 1042 zcmV+t1nv7rNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q@009UbNU)&6g9sBUT*$Ct!c_enD%=xp z9zStpCP*x(;T*q@{rFwkNbuQ5ko?l&APIp{NPg_#xcW$iB$s~w`jLA9Ku*7YH8-Z> z*Y6t*fpPdHOF**5Fk(jmfbhnT6iI^wGKIWxwO|LL{J3@%sNoq-R9$mafdRnQ$7>-R z9>`&=STS|{$`yn6keMCC;q2lgb-hHtL%^Q8p9*OwokI5gJJm*lcIfBtOLkcmBc zN=yv$NHh>4aQx!Q(x|WsKYPWfe&klj0Dweb#U^x(l3%tG0~Le{2a9z=6WvfY0zS66 M^XJf`j|~U_JJAO9wg3PC literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/386.gif b/SRIP/Libraries/Exp1/Data/T2/images/386.gif new file mode 100755 index 0000000000000000000000000000000000000000..2014eed4cadebf9efd42b0e6b72b1867285fa4ac GIT binary patch literal 1030 zcmV+h1o`_%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q%009UbNU)&6g9sBUT*$DYLKWfu$%B%? zVZltEJU#2jv7Zx*00#Jo#jm5uJRlR8{1Yb*td1#7N&;{|5l3$^`xO$@06?COA1w-) zF+;$>X&mPn0cr3CIgXr|7Bt0;qq-GR2hwQQk%v@0r^06I7^{NA7538ZGs#gEfrce2 zonmY9l>~=lI^Od}mr??TDhAc-XHJhbTXg$jU5KV*y=nAJKIMpn!oq)v`&Co4!dXXO zYZUsUTdy1nfh5%FZIf^p+j(3HhU$n)VFuUzyg6A~FoKic6S4{)PQ18rsR021J0HaB AH2?qr literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/391.gif b/SRIP/Libraries/Exp1/Data/T2/images/391.gif new file mode 100755 index 0000000000000000000000000000000000000000..f9768758fb39400094b60e2f1995f507153200fd GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-oR{Nbr)V z)wC)BAPyAL$)7)a<~&x?C~%j*e1Cvsu%&Mw5|ZNlog;|O-x`=Q2a14alO(L10wbOD zL6VKXew73WxaMyjNdPcb`P*j%l1Eri0Sx%^#6&uOw_Ic$h{fMOIb#L(Y3EOifwV#3 zq2qHPt$}*}h7GKv4TVMnxcrUt3jmHtjYj=_87RjrwFD1O`0{wnl;uqPJRW%n&7;S6 y(LDQ;SHmF~y#DTCN&z9vJ&&j!PWH!-3c)~4Z9IhHQA$As5gw!+PQ1ABfB-vGNbFGn literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/392.gif b/SRIP/Libraries/Exp1/Data/T2/images/392.gif new file mode 100755 index 0000000000000000000000000000000000000000..f07f35d9f296dd2f403b13e2b12e8ebdab997c39 GIT binary patch literal 1055 zcmV+)1mOEeNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R5009UbNU)&6g9sBUT*$B?!%O*eI7|p( z5I=u)CL#>s&tE)3G}N`YSLbu^aEAHJ6}=ykmH;F8Uk3yArf z1Hl42eP~_+C_y8F0#E+pX}ln$>ZoF^a181A%;AMK)L62tht8kADh(|d>xkxv+cshu zHFOfqpF1%Q2G(HtFX=)k&-|gXK~RBDmcJM(^S3JjK@FHXqMPUM9+HLm<_#gZqpUw_ zA*THE_Xcw`3jh!Rxuni4G!OtnjLw7EUo=R#SV}`HkfT3&2NY5k%Wv8Sf+6zxqeobw Z9X|4&@v(BS0iWhdvuoeZy}QDI06Xw1`V0U7 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/393.gif b/SRIP/Libraries/Exp1/Data/T2/images/393.gif new file mode 100755 index 0000000000000000000000000000000000000000..f38430a7c4f4f6675fbe5a46805a68469d2ad377 GIT binary patch literal 1026 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/406.gif b/SRIP/Libraries/Exp1/Data/T2/images/406.gif new file mode 100755 index 0000000000000000000000000000000000000000..64ec762dc2b53ac19e52539c9145d90fd6bf9c78 GIT binary patch literal 1036 zcmV+n1oQhxNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q-009UbNU)&6g9sBUT*$DY!-ob{sQO0< z-ZDW90ze$F0ui}>An$?f#{l9VkoeXOdXwYLyncZonjvRMNkMk~>_9}==-#jaI}19v zQm-Go0znDR0jZ8gQh`uh$?FHr#?uvD-t|jI=|EBkUD}N-C+DdHWg|hBlkhafjkh-d z^<%c=DM1)oSs6&!LesE?c>59Cix5^mN(&eDv(`bOFn*pAf^d}2nwEtg`oWWgkPyga zB^3sM)Q=xKMifZg-~fk`zJAm+G(4~cBtLrg@D&BQDZ|465&}(1+b^3IjdqhOU(Wns GKma?%qwE?0 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/411.gif b/SRIP/Libraries/Exp1/Data/T2/images/411.gif new file mode 100755 index 0000000000000000000000000000000000000000..d856fdbc68d87e6a7e0d854bd143008129dfbd92 GIT binary patch literal 1005 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qe009UbNU)&6g9sBUT*$B?fKvV(lf^M_7{$b%S|`RkYE<-tlbYuYS`ljcsIIe!j> zpz9y80zw5MS!pUM02}32vT%wiqNSt=7VYboO+(TX8uf{BI!j}sgk54VJXWt?s{;T) zEMWz%Ze4r86jCtLww0h+v!-d(nD3huB_9&Pp*FbjOpS%oFeJ0J@nBLY95@irFqq|X b(7f!hxnkTVSJBX@b;`Q6>({UW1Oxy(Q|{xO literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/426.gif b/SRIP/Libraries/Exp1/Data/T2/images/426.gif new file mode 100755 index 0000000000000000000000000000000000000000..f47a2db394459efcbe6ebdbd73707635507da9d0 GIT binary patch literal 1033 zcmV+k1orz!Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q)009UbNU)&6g9sBUT*$DY!-obHbkG11 zVFOnD&P}LTut6<;{Q6xhR?HZy91v%Sn+LKV$dLTzEpaHO-@kj|`ji<60b4&`4l%}~ zVz2|qMGhyZ!LgBG7H0f(ec(tCR=a-VR#3grK~ukeVOWkIl!TMiQ8K`A8NXl+4qkGJqhSMH z_xd$zRHH+K7P9*J`;_5frfzNdJqriY5QmBx?w~sBQdeiW04#7A-W0g;Sm literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/433.gif b/SRIP/Libraries/Exp1/Data/T2/images/433.gif new file mode 100755 index 0000000000000000000000000000000000000000..5685d7f2a6aa53790152ddd4e67366e90a7289f3 GIT binary patch literal 1026 zcmV+d1pWI*Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qz009UbNU)&6g9sBUT*$B?fCDEEO$s(i z6*evn916toq?o^tz~ z0`#CzqD2cHO{#P#Q-Y`3b$B}P**K~KbMP~=lR_s{gK`YC;!lB1C*D5#+xP4g8+U~S zXdLj&-v|XT{EW-@k%vtv{#GR*n9SclTLU!CX?J4afj{<=aq|aBF}A?~7%=kJD?x`% w{md9}z;KSgQAZRt(>DjgKt=v2Aq%l^!nBX-+Kea&Ve%`iz=I1Pt}!40J0<|>1^@s6 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/434.gif b/SRIP/Libraries/Exp1/Data/T2/images/434.gif new file mode 100755 index 0000000000000000000000000000000000000000..0d2600b2403665221b102afa759a7f328f076de1 GIT binary patch literal 1003 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qc009UbNU)&6g9sBUT*$DY!-oR%`TOVZ zm%oeBvOpAwub)RXotSyVH?0Ij6ev+R06+l+E{|X~9*hH1X2A#HYT5*VKuWNF`m&wa zX$6_be!pyvnS^hjM`#!d$n>V~Xg^&Pc6PMd4^sl0Lx_kaGRdQeodgG@>US3Hz&>o< z3M8;AZbK{?4l=N1wjmXKv<@cmI7%wRF#Y0*DJV%@zi&eucE~wz)~ps=W~J-LuMNZ~ ZBDwb4cS)uOLtMw9k;}TZ>(>DR06Y44-Xs73 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/445.gif b/SRIP/Libraries/Exp1/Data/T2/images/445.gif new file mode 100755 index 0000000000000000000000000000000000000000..d61cf39ef133e5d9f5547431e7e67e49fed85fd1 GIT binary patch literal 969 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/453.gif b/SRIP/Libraries/Exp1/Data/T2/images/453.gif new file mode 100755 index 0000000000000000000000000000000000000000..acbdc9d636540a234de30a12349816756170b405 GIT binary patch literal 1010 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qj009UbNU)&6g9sBUT*$DY!-o(VR&cbe zq9`d52m0{WkE6$a!Hz^U(~n<2YL|eOEa`|s#1sT4E}Q4C8pezTqm*0*F-3)fNHB4{ z^>EL;ZxxfS6y(w&p^i{L5>fzBfs8F%E?r{9ubN3}dvM0QrLH5ZpJD~hxU{pW!3A6} z4U)LbA1j1j2YG1ds3by;tv)FHFr$@Oye82(GIKM94>M+Nr8CJ7*xrK`ZvE@G`J?B4 gw|X!?sT%KcW!kbzT*8MkR;%brcUw!(k_JD-H*yZ`_I literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/458.gif b/SRIP/Libraries/Exp1/Data/T2/images/458.gif new file mode 100755 index 0000000000000000000000000000000000000000..e74c9d45fed5f5349ba6dd787961eaf36b4fc87e GIT binary patch literal 1021 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qu009UbNU)&6g9sBUT*$DY!-oYWtXKiY zRX=}OM{Fp%yZ z%@7xI&BGPCJ~rY2KpVe%k*<|vyU+$Re!qwi*kI}77yuGRG<*OorN9r``rQk&krYTc r52{q-m#s!gU;M;rYxmL+1D&Wr&dU_jrzDWjBsbm7ySHzG0RaFz@~`A+ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/460.gif b/SRIP/Libraries/Exp1/Data/T2/images/460.gif new file mode 100755 index 0000000000000000000000000000000000000000..cdf92685a7b5abeeff63bd4c84908a5fd2ee0f66 GIT binary patch literal 1006 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qf009UbNU)&6g9sBUT*$DY!-o(fN;D{7 zM>&80{`o7HMuJ2w{X&WiX({3far{aZ0%4~Tzkd2kLG0D9SwSMs`i;}@a8o~31_^~+ z@i4(11q1_>AlGkLfr$VX#P}2v-x`S#u6TJSlG_=G1H`;)H!`J&h%82mw3lc>LpU_c#cz*WdQdk02H*Uwkrfl>O2I}Ct9w0_qZ^Z9!?&%TgLpfa!`EhIV@ c0V395GK*PAa;|tvq#07v9t@0QLk$Q3J5>1E-~a#s literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/473.gif b/SRIP/Libraries/Exp1/Data/T2/images/473.gif new file mode 100755 index 0000000000000000000000000000000000000000..f3cf3db4a4af6e7cd82d51fa1d6224f4b7d88788 GIT binary patch literal 980 zcmV;_11tPTNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QF009UbNU)&6g9sBUT*$DY!-oSAKv{+h z0YrmWwD~iq570$|ESfc=@xT$k7aswfI7cglzybbjq#RXE0l|MVKavYmFlI^x1PH>+ znUdfYpG663(x)OR!DQ#04s7GEj8uV<{Gqs-pc|>H0C@QOa#cXAZY@r1D3G*^zqkJ6 zaU%tY!$lSJ-sZb!58vByJ|0Gx=Fixg4FV@9*+Yub!#n;^HMp7z+hnkqGiy#75CA(6 Ca?=n1 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/477.gif b/SRIP/Libraries/Exp1/Data/T2/images/477.gif new file mode 100755 index 0000000000000000000000000000000000000000..189a49b2011a6c148f6ecbcba84bc7462819c926 GIT binary patch literal 999 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QY009UbNU)&6g9sBUT*$DY!-o(fN}L$+ z2OeL-gbmX~Vd9W_{cOpS#j9TyiBcr;CuOKVA%O3L2l6U0EE01sdeY3rwL3qoi9{NV!!PSgjA V23mBnA+)sV)2LIcUac@706VXV+PVM$ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/478.gif b/SRIP/Libraries/Exp1/Data/T2/images/478.gif new file mode 100755 index 0000000000000000000000000000000000000000..fbc52d8c213f9e706b4b9c1651ead3f0dbafcc80 GIT binary patch literal 1036 zcmV+n1oQhxNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q-009UbNU)&6g9sBUT*$DY!-oPNfYBp} z5+yJoAQB|SuVcTC?IdXwn1~-WRp{<@d}s6~BJqTtbvkaDkPNszx4c z*RNg-p#>>*q=J;7QhrRE3e;wjgHQ=-JTX%9(T~P1uKNA!M^ojY zuKcwS#HxB7srd;K#8<~ZFDg`EpsG%5U(P&X GKma@RGVBTf literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/480.gif b/SRIP/Libraries/Exp1/Data/T2/images/480.gif new file mode 100755 index 0000000000000000000000000000000000000000..ae0f095e304a0119491737ae4683fbb385df2145 GIT binary patch literal 1015 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qo009UbNU)&6g9sBUT*$DY!-o(Zl9=Yt zUpz>VMnn|o<6ggy{yyH@vN20PcA8Rt`$%sU4Tw?VeHnPbM!AoTBAzgK;iJAF8wrj$ z_R*PzpbC~8i}$gf6NnI6#Mu-tWIuhmjyjydYuZPUAKh($Sm^6lXJ4UVc&Omktv7Ev z3_R4&pOK&jt@RuC058F^{j~Z8;OL`Zyjt}2Qy0N615@-qJ_&lDg&uZc*%WXXB~p=1 lo34HQck<;!SZ2S*8iOKY0~L?VA$#N|#NgYwa}x{*06REe>6rik literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/487.gif b/SRIP/Libraries/Exp1/Data/T2/images/487.gif new file mode 100755 index 0000000000000000000000000000000000000000..9f2f42dc1b93455f519b6eac03bd27064d4ccd9e GIT binary patch literal 1031 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/494.gif b/SRIP/Libraries/Exp1/Data/T2/images/494.gif new file mode 100755 index 0000000000000000000000000000000000000000..6ad9b543664670a49c5a1c07f0e6f35532a7a10b GIT binary patch literal 1008 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qh009UbNU)&6g9sBUT*$DY!-o(b9y3Fs zB837G399Soub;-fWl(;%OI^?DLK zaID`=p#T)1>UR!D&kth6tn&CI;{`m){AvB?uNi`fZJw?47*AikNemi3p(E*Dzi-$2 z!As;piK}L87HVg)PpfQP9DJ92! erKTjv_{}pWBtjXOsiR>6($}zK%bwjZAOJhbpXFQt literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/496.gif b/SRIP/Libraries/Exp1/Data/T2/images/496.gif new file mode 100755 index 0000000000000000000000000000000000000000..0b43e61e66ebdc26679dd99af76c22705c22085d GIT binary patch literal 1030 zcmV+h1o`_%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q%009UbNU)&6g9sBUT*$DY!-oQS{R8Cy zB0_Qf`kA{!f`UbYE6iogm<w!?LJnY3 z$er5(!UYsJJdNwO>Of9{w=zcfE6~a|!G9r)$(B)GP>2j*z$i0qq`M*uTMP#9qsc8~ zHK%zxnb5!{cGi+5+m|(;nF$OffX(lJH)u- AcK`qY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/50.gif b/SRIP/Libraries/Exp1/Data/T2/images/50.gif new file mode 100755 index 0000000000000000000000000000000000000000..01ffbfad2e26346dd8a3e6510c51940524810bc7 GIT binary patch literal 1018 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qr009UbNU)&6g9sBUT*$DY!-o(d{*dFY zpT&P0A_5Q-4qiWgAo=wp7fz4~gc=MG90CvI$B-}i!9iFC13?aX^1bWFjv1U@FSC_+ zm|@HhI5IxD<_n%#uVPodv`zpI|4}HZ2$lO literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/501.gif b/SRIP/Libraries/Exp1/Data/T2/images/501.gif new file mode 100755 index 0000000000000000000000000000000000000000..44c66bbf8d0d945dd62e4ce8099a90c36025c371 GIT binary patch literal 980 zcmV;_11tPTNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QF009UbNU)&6g9sBUT*$DY!-o(fN)%|~ zmm&-p*eDV)5r7eX{Q7|eDGE!2h%?}Ygm>$fJ(0>B9e`Lu%rs{LRkVo(a@vZB4I~gO zU}F|PZXFA*i1&|6QiA6CIeiL%h`oD5r~)v=&x=+%_>fU;5XKv@1xZbefi})ngs0E= zwZoznin4z6ola5WfI0o($#5*P2<3An9BXD65CA(b CZ_jA} literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/51.gif b/SRIP/Libraries/Exp1/Data/T2/images/51.gif new file mode 100755 index 0000000000000000000000000000000000000000..3f3c99d20b5df767332f86e4c9965f7cfe3ecff8 GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-oPH;9%tE z6*4daAPO8|%AG%Z^7`5HH$)=GiEFP+dN}yZo&%ExZ|qAI04Ko(*U(Y$ zIgo-ceLaW*z+lIjKYWhZNWl5yo4>1Aqv53CD$o}QVAbU7qm>c}4}tirWrCmxUjCxRZOA~}zi(KG0O};q-?IxETS&v|@1MV2 XF>s~`^sd~jEf5B@UCp|+#()4j1Uli= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/510.gif b/SRIP/Libraries/Exp1/Data/T2/images/510.gif new file mode 100755 index 0000000000000000000000000000000000000000..1d88d4c1dce512a0bddb1af0ce8c03d049fa42b2 GIT binary patch literal 1022 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/531.gif b/SRIP/Libraries/Exp1/Data/T2/images/531.gif new file mode 100755 index 0000000000000000000000000000000000000000..43db941cfd13b4a53cf178aa84168ca24c795391 GIT binary patch literal 989 zcmV<310wuKNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QO009UbNU)&6g9sBUT*$DY!-o(Pny5mt zij|5cA_DNnuOq*H9=jPs!s1~+dEdT83YRivxP0l5IE14lp(K9qerP;ste>l$29b0G zS}?~@q5~}*MG9jazg9>ER_P}yDgYDP_)&=p!dp5k6NnzzbFE)Z0v$Rq*^z>gLl~tx z_QS*|(?@=d#w^qjC(gfqfcyO=$B5CBhD^@M^~evEiV6@XluGw8*)TIVh~l6^C4tq? LphJrW9S{IJ=ZDpi literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/541.gif b/SRIP/Libraries/Exp1/Data/T2/images/541.gif new file mode 100755 index 0000000000000000000000000000000000000000..54094c21b37c4a278d7a71b5b4362d6f1c998e4b GIT binary patch literal 947 zcmV;k15Er!Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P(009UbNU)&6g9sBUT*$DY!-o(fN<5fD zj;f3QGX67W1)`OW7cVxlqUxWji3K}|`_~brKsn;XwL}TiWCxd4jQtar!)1q(;^epl zkYi_~n?rTZ9NNfe&!GT*W>ocbXosfakV3U0&KT5za{dYZ3cw`UqK&?)%nCKf%CQht V85=1_C)J5kGa9Q(wlBnh06Xe)$Q1wp literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/547.gif b/SRIP/Libraries/Exp1/Data/T2/images/547.gif new file mode 100755 index 0000000000000000000000000000000000000000..b412937d936182e30465e81dca7c8747d0e069d7 GIT binary patch literal 1016 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 VMiY*Z-Bl$Tto7^Ivnvb;06W1*@Q45a literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/550.gif b/SRIP/Libraries/Exp1/Data/T2/images/550.gif new file mode 100755 index 0000000000000000000000000000000000000000..1ce209117ef9701fb754952389473661b268144e GIT binary patch literal 1031 zcmV+i1o-<$Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q&009UbNU)&6g9sBUT*$DY!-o(b64|7Q zlRtmFC^mBNut>Ch{X&Wq+3kkIH2ui^;l=AumY1LM^>as}VF5|mcmyz5r=LF?4mY%F zB!D1-HTe1kix81u0xluXvHBv8d5MHxtVQ;J3`BCOmx189-WUo8twaUcNE!VbTF zvlcV-AWNM(e8uF|3;C@DL>%@2DI3WRQiF(a>3xo?$N*J3BEg*@EV;Px;|2o)06QbT B?GFF| literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/552.gif b/SRIP/Libraries/Exp1/Data/T2/images/552.gif new file mode 100755 index 0000000000000000000000000000000000000000..6bd28513bbbc4d290afb96807dbf9f57531fd2e5 GIT binary patch literal 1023 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qw009UbNU)&6g9sBUT*$DY!-oWsV8Rs4 zUq5x2Qa}_ar5`_!AoHC7%UjQC=aDn`^YxrJQNPC z^#ixej2S5@;-vGJZrQSi9anWFxOR{Sh93w`#B^9-1&P+SIK;#@UE>trJPxASkPuH+ t08&UCI|$+jbp2SF$;@{1##=96TD(;iVvn``Rt*}Ow72iyz!wGt06QNm<~slY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/556.gif b/SRIP/Libraries/Exp1/Data/T2/images/556.gif new file mode 100755 index 0000000000000000000000000000000000000000..09027e659a76578e1536762150c4ae0fa5cb90fe GIT binary patch literal 1040 zcmV+r1n>JtNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q>009UbNU)&6g9sBUT*$DY!-ob3U|>V5 zA3a4TAPS7|!VbTW{QB{0RY9W^c_KlIyjBuo2}}KgffCXp89#VhGzz?cV4zKYVssk( z)z6y~p#`b&>y`oOz$zjuHE=2rRljpOgsM4bP7)n+{iGRqIG}~Me*ONTMJtcWLkmJc zo_p4)+s9=)9BRPS58kaTC5)U=`N*Lme)R?c5Ya{CI8baXMQ8|u9KS;7|_a1pwipRZix)P)ebz!kiYBFiK|N&*!>WJ@fJrOLdy K^XCTx0suQGE9wvc literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/558.gif b/SRIP/Libraries/Exp1/Data/T2/images/558.gif new file mode 100755 index 0000000000000000000000000000000000000000..8f9770cd5b3dd83ba7d3214c2f12293dd71bfbec GIT binary patch literal 1033 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 TbeY=)r`@}F^XlE}FdzUs*<;B% literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/562.gif b/SRIP/Libraries/Exp1/Data/T2/images/562.gif new file mode 100755 index 0000000000000000000000000000000000000000..54221e45523b5c503c4cca47cd9e4797288fdb55 GIT binary patch literal 1019 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/582.gif b/SRIP/Libraries/Exp1/Data/T2/images/582.gif new file mode 100755 index 0000000000000000000000000000000000000000..53e8992c13b57bc5f1e571d072b3e8bf68ef3193 GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-o(fTG@nb z94TC8NJJc%te?k^?l5uK_=MN3O}u!0^Qdj3!4>2@x*UjL4K|OPTp}P5h?~cGybMH) zaHZqNS4JF$S+r=_J9!_+`C%czAp&O~v-Z;!BchpT*_JI!msK8%hz1-8><}Zyjcxtt z%p^#lSHD(s1rjLYQA=I{m^?rZp$>%AQSIVL$*ouFl~j literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/585.gif b/SRIP/Libraries/Exp1/Data/T2/images/585.gif new file mode 100755 index 0000000000000000000000000000000000000000..8970caa1d9e06e4ffc8acf1a10ca217bb156c66a GIT binary patch literal 986 zcmV<0110=NNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QL009UbNU)&6g9sBUTqy9?D-aAL;=w0Q zL_~%~?)kdN@JKvA92Wx0$0KAy1kA!|Fo`gWKO!s-4p1g2=D|F{7}zXG$6ubE1nK@iCyF4S%;n?(*kPnIsYm1cvZ;Dr7Trf-qI%w~Y>f7yhP%>}79*KoowI zf$4;fLdZ1!kPZw%PMApol<=`BAn?PsdPi6ifaUKRr%&|kp|L3dO+Ko=q7>cCxwGfb IodW^@JNk{*DF6Tf literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/589.gif b/SRIP/Libraries/Exp1/Data/T2/images/589.gif new file mode 100755 index 0000000000000000000000000000000000000000..184a558b7bb56f56ee041d7c2659001222e6d735 GIT binary patch literal 972 zcmV;-12g6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q7009UbNU)&6g9sBUT*$DY!-o(ZUQza~ z);~*|A`)EGuVX)I?cBI|ppnhCA}9|yTG!8p#sVb>Mv&Gokw$}LI@-KBu)!*S!4~iw zSgl{Q2txsAFygNtuA~6E^z+v$L{bn^(g8vMwUEDmb)b4E*AJZvsDnDLfeOG)zikfK uit4vaDAZB@{9Rz%sN-I!B3S+c!FEeWbGwKnJ+OopJzr(mN}hZ(AOJfyrO`?N literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/592.gif b/SRIP/Libraries/Exp1/Data/T2/images/592.gif new file mode 100755 index 0000000000000000000000000000000000000000..782e86921add7cc8db0d5757872af20a6f383841 GIT binary patch literal 1039 zcmV+q1n~PuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q=009UbNU)&6g9sBUT*$DY!-ohlH2dez z-x!DlmuTA8uVX)J8!$G21kdBVcO4HsM6rdL$6Io0+)C*XOFEC-;sg+Qr6VkcCOGl) zct`?4IvyEj@tA4BfPzUnGGZ779yv1y3;60-q#+6d2w`+==K!NYK^-%hEx6-mKObuc z-e}ixk%5Oe;^>WoDo)9c>&_8LD4>KOR{1!3T-;CJvL;Ut4yePpGCy#Vo-72@Q5z{N zSh{HPh|Y>bZ~d+r)xl?L$8s_r`s*hzS+aW`)j+S#m literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/6.gif b/SRIP/Libraries/Exp1/Data/T2/images/6.gif new file mode 100755 index 0000000000000000000000000000000000000000..e410e37289597fb801215ffb8d3086de5d1dfd19 GIT binary patch literal 1043 zcmV+u1nm1qNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q^009UbNU)&6g9sBUT*$DY!-o(f3T%*p zjGhA$2Zp!=jh{zJ8Bt)O$FCo_Y5dTkfcOB@JCFRZeJJ6P2ShM1`DN<>fF?hi4{Lek zcFKdmCN&{y0HnhLK{81*66_RJqMJN=@+jjcY(PW>HD>ke_irq@5fBU57{_lOIaTsJ zo~vWPp#diz`|JQ9p(D&I7#9{etB=kXiDH2maYk&r|cNk2RZW}!u^1j2Lt>NUd#laJSk&vMG5LxMoY23;QIxlmWC N^XJf`OLra+06Q!8>iPfx literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/614.gif b/SRIP/Libraries/Exp1/Data/T2/images/614.gif new file mode 100755 index 0000000000000000000000000000000000000000..ae2f481311e1705ff0ddec1718f0364b27588bba GIT binary patch literal 1013 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DY!-o(fN>rEw zk*Iq9xK)|>!dkw5{`!f;mnLGBkm^J!!jc5!oQRkFRcRn_#<70nP)H;)@C!A6{>)4i zXrfj~XHka6AXKm4y*d>puJ{vD6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-ob5{HOsj zAr^o6ym`aZp&~&m{z8V_7s8`J7Dy_jDVEP4sRJepq6ujxCcy>O{E4wS@WD2JS$GNz z@hu-6p#aYLtF?ewo||CG+8! literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/630.gif b/SRIP/Libraries/Exp1/Data/T2/images/630.gif new file mode 100755 index 0000000000000000000000000000000000000000..331e77e2025313fde23d933393ba7406ded1b441 GIT binary patch literal 1025 zcmV+c1pfO+Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qy009UbNU)&6g9sBUT*$DY!-o(fN?b?* zh$Mag{P~k*0%8Fsbhz~!NwQz0hbpd-_eW)FDLy00SjL#T%Jwf6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qj009UbNU)&6g9sBUT*$DY!-oVb%;16v zlfQn}6hItkrXN3#AO}HQK*(CZizxg3>sR672Vm9srMq;=2&<3$%xnaZf*==_{iN(H zI0NUl*LJc_zHBb~o=J$ITJYsP6ms1PeuOqsHkMusUy zeFI4?CdiMh7?QlWi~^>TCkF*P*^eQikJO|%GRqH`2RKF*`dHbQZC;+D%urZ(%cIV_ ggWf(|wsNJvYK}JV)Z;Ooku9RH%AQTTHh_QtJIt8mZ2$lO literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/644.gif b/SRIP/Libraries/Exp1/Data/T2/images/644.gif new file mode 100755 index 0000000000000000000000000000000000000000..a65e67dda8288b6f9c75a345ee6a5d94ce4b6ea2 GIT binary patch literal 1019 zcmVNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qs009UbNU)&6g9sBUT*$DY!-o(bI`J0_ zl0`^4L~w`*z)3%U{X&X_wBE7lc zc)*J`kp0}TaS#!Lq-!COD%-TlObLffrmaM}@*4$)b>yx5I5wmxu=D(Z>(;Fm91#K$ zeDe42EW;U14j44RCZxBoHUS6`St>AuPWeItB487QFp+!^xa5%NT*zl#7;uEp=-o$q pY!*bsP-Ig*k;6PdT;L>?w~>y7aGdZ+S4dNeHU!?yyZ6F?06U=Q<`Vz_ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/646.gif b/SRIP/Libraries/Exp1/Data/T2/images/646.gif new file mode 100755 index 0000000000000000000000000000000000000000..3de8d4964f9c986c3a2b63178aaf24dc3636c83d GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-o(fN=!Jx zha^eb{>_t=Bfvufk8o-0N3tYIDh>r~BDqf=zL)w+#&Jj_Uq5a=SPZOF^2@^?mmUl} zkSQKXM*<`USP5MCLWRO)!^RSlbr~`kk^=$)f(dc~o;VN%Et2I>Fa}_z9Z7O8COW`FkL0{g yhb7KnR#KXgi3Rv{?uQMG(1;W$+3eR2(13}Yoaz&`mp^IOuYEPfB-wou;p?9 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/647.gif b/SRIP/Libraries/Exp1/Data/T2/images/647.gif new file mode 100755 index 0000000000000000000000000000000000000000..af9efffebc47640a52e0fe5b570c96b9905b16b3 GIT binary patch literal 978 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 A)c^nh literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/658.gif b/SRIP/Libraries/Exp1/Data/T2/images/658.gif new file mode 100755 index 0000000000000000000000000000000000000000..2f75645aeabf17e797d90ed7d84590119a382496 GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-o(b66iot zQ@@My8nJ+=0T92B{XX&wxeLTYWFbE~Lj^^RtdCk8nrIhq(HRa620no))7^}NTrN6! zxCEi8k7ptpgcXv~2c-o4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/660.gif b/SRIP/Libraries/Exp1/Data/T2/images/660.gif new file mode 100755 index 0000000000000000000000000000000000000000..8edb57dbac9a965223c21903072640d8f741e1b1 GIT binary patch literal 1026 zcmV+d1pWI*Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qz009UbNU)&6g9sBUT*$DY!-o(f3OpeP zn7@AY^c;vt;*76*{P^_?$uG~tB$?ukwCuggyQG9g`q&V2)!WO;xB000AJI`YaJ3Q9uUjP6A literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/665.gif b/SRIP/Libraries/Exp1/Data/T2/images/665.gif new file mode 100755 index 0000000000000000000000000000000000000000..c0fa5c4f80b691e1efca319b20925ecabe05ca51 GIT binary patch literal 981 zcmV;`11kJSNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QG009UbNU)&6g9sBUT*$DY!-o(fN}Slx zKnYVNGHQen@kgM2`}%B!-@KOPP$__U8*P=+d=9)tw)2t|TaTT!?QpvKOgSATT-DK%mRVCO>a+oJK}oNNrA zxbfApF35#X&aospQf;^+Ruw)$w^OFNoU~>{Y{F&@pna2?a1~f!go4SKGi%<=IUoQ# DBeU6Z literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/671.gif b/SRIP/Libraries/Exp1/Data/T2/images/671.gif new file mode 100755 index 0000000000000000000000000000000000000000..ca681f3377ec883945b104302b1e1f60e9138a98 GIT binary patch literal 1045 zcmV+w1nT=oNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q`009UbNU)&6g9sBUT*$DY!-oLk^y$&3 zVmDA`AkvYCuU|iX9z*hz=I~C)e$|*ba&^+0!vvBlRqEA7;0SObK|vI#K+70K>q34> zu(OJzd?))cQm_+1(4_t9T?4cPqNrC`u?{y(Y-R!AFM=`tx{Zi{&2(2Y8BX@SjIF z8wezf04F5EQzu7RvgCq-YYHeVS@Ss0R6;gx&hdkqlpnk|4b#-A1MZ%2#US(PjGJW- Pk3BE$N}o=hdO!d>5BT+2 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/674.gif b/SRIP/Libraries/Exp1/Data/T2/images/674.gif new file mode 100755 index 0000000000000000000000000000000000000000..791c8564d4fcc4d0fc5ef8a9865bf4707df7ed20 GIT binary patch literal 1013 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DYLJ})h5O8>~ zLn2@D`tdtNu^@?X{6cD!H=`p#HrIOf8W*zJ0+RzJ2&5EJ90r&L+x6=g31>l;{M`5) zm_=i+149Ki(zq)r02}r+j`5jcMUS2TF5%1p2&l+49Y2UdXOEx8kY-ISFd#&sfi0=D zg=CiztyzB3eA!A!LR83KlQtQP%I{d7Kxb{KK-lBfPHk8AaKh?MjX+e>JdH>g4K1>> jAyF-+h|I3Wea)o69HLUCFE>q`%AQTTw(Z*k0|Ed$LQ>)6 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/675.gif b/SRIP/Libraries/Exp1/Data/T2/images/675.gif new file mode 100755 index 0000000000000000000000000000000000000000..b851b50948cb3eca5e43c109ab9e49b03626bf69 GIT binary patch literal 976 zcmV;>126nXNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QB009UbNU)&6g9sBUT*$DY!-oO`5b0y< zpDrB`2_^ugPuna*>%ck4DDVfL6$8ciD?#$0CvFQ`8jO}qX2A~gve+aD$6tz_1DQ!n z02IIwdOC}Gx@V&3gK@2j0#M@5htyo`E)-R9FKP!EJKI#T;gvXg`z9cVUbF?vSphA0RTIC$IU$e literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/676.gif b/SRIP/Libraries/Exp1/Data/T2/images/676.gif new file mode 100755 index 0000000000000000000000000000000000000000..e53889bce0104fe6f215a69f2896913d706e61bc GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-oYi_|fOj zUzr9F2YQfVuAfJbV=@YS(~^CK+;DGHnD61 zXR-}UF7^JI?6*%z#uN4Wm6Z1An#V~QDFkB&?ac%LI4WXGAW{TD93O@36o}TN+O-sqZs?dkNe()j{VQ@eI00d~>dGxzb1GJ^mP7U=)PZe2) f8e}b%>hWG8hy!vwS{;sbs3~h>%brb}U_bynL`mT2 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/685.gif b/SRIP/Libraries/Exp1/Data/T2/images/685.gif new file mode 100755 index 0000000000000000000000000000000000000000..010c99ada03e8abf3e996a735e5928ae8c28abfe GIT binary patch literal 933 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/694.gif b/SRIP/Libraries/Exp1/Data/T2/images/694.gif new file mode 100755 index 0000000000000000000000000000000000000000..5f72238fc08b9f35af01c36a336010771f87501e GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-o(f3LKK_ zP?ZT12l@$Tk6%B2!5U-)@Q&U&egFFP<1o?$jtQ1N@~bg&U>uo?Y6`r`kDnHu0L1z0 z=S*Zq5IG>t`)Ehv1Xjh$_4LS3-42L;&h?Z@l^?tr4SB@#ckf=mq5S~Kd8Seh!yoGS zMFSMKA3RS90C?&7ELAE<2;aoz$7(RWC<7a;>PiD)qp32LEh(tL38Nq!1|XED@@%v? XMkTr-M%oZdpr});Ud_6->wo||Kjz=t literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/696.gif b/SRIP/Libraries/Exp1/Data/T2/images/696.gif new file mode 100755 index 0000000000000000000000000000000000000000..d8a54f9972ebb014ad2ee8efd9e95a1130007eec GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-oYk?BUd} zpFeF}APzh-j-N+<{rKG*qtS-Fkn%wJLFTcSMgX1wQBfffP0N=C*?BC3bKnhj|N2?$ zDeww9keNVe6kx$kFLe7nwkhzEi^q^3kKnxKk)5rNYH%h{6BdAlihPI;wBT`?T7hi& zxqS=6BcrzfR(UMD@YgQ~2hUV=<#3Z+GX;sX^GLIylc@aCW%~2yTD{0*2t2fM4&+CW X=VrX*5GdM5XjVAjUCp}n+kgN&@*U>3 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/697.gif b/SRIP/Libraries/Exp1/Data/T2/images/697.gif new file mode 100755 index 0000000000000000000000000000000000000000..22cb68586b8d0a51c95a0c9e041c81f56c2fc67b GIT binary patch literal 995 zcmV<9104KENk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QU009UbNU)&6g9sBUT*$DY!-oTX_?vi6 z6QBbS33}_->(Qff{hEcyDDWMi5&{j>vG=I}Nf;msX6vVhIf&IeKe7pn1V^VNg1eRaO($k#8?*AnXb z6{~^N#>{vr29|)L0Ahw{{p1Y+P@zdNXf*~v6jt<@mM!A2G3uL9S<#~Y1R2;VA``ky RJZuE`O1iY^(*Obj06XjM+w}kd literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/714.gif b/SRIP/Libraries/Exp1/Data/T2/images/714.gif new file mode 100755 index 0000000000000000000000000000000000000000..17da7aa21ba7db436aaba73e7d5d7d895c2ed949 GIT binary patch literal 1026 zcmV+d1pWI*Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qz009UbNU)&6g9sBUT*$DY!-ogkkmrC6Y@T$MF}oULl0hp zp#ymmWj}T(7AA3K*X74t!a#mAfe-{AeErs8!9zD3q67{~feeSR5=dm3(t#}3VxR+4 wA2lKT*SFukYAOmgfC7c^LDDGmiF;%e7D#>Y20_h%r#BX;z=I1Po-rT*JO5|mO8@`> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/715.gif b/SRIP/Libraries/Exp1/Data/T2/images/715.gif new file mode 100755 index 0000000000000000000000000000000000000000..8e33faaaefc1573f157c0e81fe8120153b87c2fb GIT binary patch literal 997 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QW009UbNU)&6g9sBUT*$B?LK@`0I8=Dz zmp?}n5lUg_&)=zx20d`>*e?o5f(-&9C!*u z@XB8%p#tOh%a;YIg>C*YAw2-fpS~V8Iehpq$f}x`PDttN*pbppFZ_Oz^%tn1fEf(K z`3qNTtuze;sn}yEZ>+z2u|D-%nL*$ScD5M0i1Eb@2!WRR{p&Udj4yv+Y_b{YuU{ph TQK0#&6$7d1)2LG;4F~``E~eqd literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/716.gif b/SRIP/Libraries/Exp1/Data/T2/images/716.gif new file mode 100755 index 0000000000000000000000000000000000000000..043a973b74cce6f924069850aceb4f0a289ebf63 GIT binary patch literal 1018 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qr009UbNU)&6g9sBUT*$DY!-ob9Me_I0 zAGZ+#APW33v7g6}Bs2o>!q1<+Z1F&f1Q5j$lLLTMt`x}U<0u6)0oXX_(HMiA3etH5 z_G6|BG2J|_YatSZn`-d-`SU35gGLXZK1%)QsRP7V{=(+NwFekQe?kTVVW`0ouQome zX81^JAdQuCJ=V<$K+Q)o41H)oIAE2>S`irfbA)h_$9H!X=i_AsgAglL5;>b1?}@{y o9?8|y>d%;=hghCz{g^CLT!;s*5SmSh!vX_*bL-yC+h9NdJG=Jh8~^|S literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/717.gif b/SRIP/Libraries/Exp1/Data/T2/images/717.gif new file mode 100755 index 0000000000000000000000000000000000000000..d96dc79679fbbf2e6db876354909f53d312e762a GIT binary patch literal 1037 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/733.gif b/SRIP/Libraries/Exp1/Data/T2/images/733.gif new file mode 100755 index 0000000000000000000000000000000000000000..d5f9cd4f9ecb519aa2b7290f4544a4ad262a9b52 GIT binary patch literal 1014 zcmV`Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qn009UbNU)&6g9sBUT*$B?02!1frJ0z< zhr@ym%JJLCaUC=`JPurZuyGzoe*HL_7|Bo44MH#p+2R=MqJS|J3NnzgvF1gDPI~@C z2yNq-p$5m~+t>jq!42E^pQc|)ya818|&M!MII9S#z%IKw)L64tEINEl1Iw(Z-v2?hiJJD8K>c>n+a literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/75.gif b/SRIP/Libraries/Exp1/Data/T2/images/75.gif new file mode 100755 index 0000000000000000000000000000000000000000..768d2ab6a11012d152bdab2bb25fb45e809efe9e GIT binary patch literal 990 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/768.gif b/SRIP/Libraries/Exp1/Data/T2/images/768.gif new file mode 100755 index 0000000000000000000000000000000000000000..6aff5794e434354c7ec507cdde857be2b6ece928 GIT binary patch literal 1010 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 g?b(@>i0G>^|cEf-GJHMRZvH$=8 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/775.gif b/SRIP/Libraries/Exp1/Data/T2/images/775.gif new file mode 100755 index 0000000000000000000000000000000000000000..0a295b8b6b4b952f4468bbb598513215ce097d02 GIT binary patch literal 1032 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 XIatd1B+g%}PeKr+UCp|+>wo||2Nl}T literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/8.gif b/SRIP/Libraries/Exp1/Data/T2/images/8.gif new file mode 100755 index 0000000000000000000000000000000000000000..195b63519cd6405a71cec6d5541e14bcd9247821 GIT binary patch literal 1017 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qq009UbNU)&6g9sBUT*$DY!-o(bnplzM zU%!hNT^V?|Vi7oT{QB`5Nz#)8hq6e9R7rA&!!{$$5h_H8P%o7(8xrWy0Ruq?Ao;O6 z5V2sDc_SeeC5Ywb$dgOAP`gKxS%QZk`UKl5a-=&m93Hmtrm`!)SP@%%!`ROvMkNtH z?4iM;E{jJa;VvckAn#s+R{S~V`<2Z9o~yc;<$NJD5NCmGsoXjxZY nQygMuIkKO*Ob8yv=)^MHGf6Fq9yqg3=oz1XbL-xXFdzUsb&21M literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/802.gif b/SRIP/Libraries/Exp1/Data/T2/images/802.gif new file mode 100755 index 0000000000000000000000000000000000000000..d8d197ba9ab6042e210dd18cffbb1a7a97a7b77b GIT binary patch literal 970 zcmV;*12z0dNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q5009UbNU)&6g9sBUT*$DY!-ohzr1Lij zB0>d&`tciO5h132%Q_y!#4n^sf+_rgJUOt!H;sB&0;r&pqRa}SGy?O$vI3!gDy4|@ zVa7~Oe*LsqOwkIcQ;M1& literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/808.gif b/SRIP/Libraries/Exp1/Data/T2/images/808.gif new file mode 100755 index 0000000000000000000000000000000000000000..a150a4ca793de0897afa0038be20fc3c11494497 GIT binary patch literal 992 zcmV<610VcHNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QR009UbNU)&6g9sBUT*$DY!-o(d7WhJ` z(yVBAA`*nrub;n;_n>GLIADayO&w2-Ea<3XpOpkn^;32Lra&Ot`h{X(^MJE{_+r=u z0O@0zp+o%rgJxi4i8$lx;q%CUG@u5nGuV4I_j~*YBCNj{8*Y+L{i~lo~st zAxzb8oE|Ue`mKWlU_q8gWVf6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P*009UbNU)&6g9sBUT*$DY!-o(fN-U_X zpT&Ok>_nId;F+_J`1O*viS;TgmwfC4CcIR#+E;#4C%uV!@$hhHbB7OwFF;Z#(=dKFye*aq*3OA!6w X6>=#;TR%8Xi}726V5(n<0RaFz>&L`Q literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/812.gif b/SRIP/Libraries/Exp1/Data/T2/images/812.gif new file mode 100755 index 0000000000000000000000000000000000000000..e2ec79f99a70157f4120f405a4f80be6e5bffe50 GIT binary patch literal 1012 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 R7@~?EO}ez{(+vXx06W+=)F%J{ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/815.gif b/SRIP/Libraries/Exp1/Data/T2/images/815.gif new file mode 100755 index 0000000000000000000000000000000000000000..d49a79d5412d73fa083b4a437557fe447e1be69d GIT binary patch literal 992 zcmV<610VcHNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QR009UbNU)&6g9sBUT*$EDgB1|{@sk9R zL_>lP80p){Z{tRARjP2fxWc2pjvi4?A!!mN$Bn}_G(3<(lA9Dbb29Om?P9_e{DSiH ziLj(cq6aB?goMy5sXhqdFn;NAie;GyX{M;9FQ@06 OYD0@2O}aG0fB-v!2j5)) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/83.gif b/SRIP/Libraries/Exp1/Data/T2/images/83.gif new file mode 100755 index 0000000000000000000000000000000000000000..668f189f220b572444371b3141b5f413868defd9 GIT binary patch literal 1024 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/841.gif b/SRIP/Libraries/Exp1/Data/T2/images/841.gif new file mode 100755 index 0000000000000000000000000000000000000000..4b832ad8a87a588b7379e6d639cdc5ffa1f75390 GIT binary patch literal 1006 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qf009UbNU)&6g9sBUT*$DY!-oJ!SnEge zpB{(=DOlUbabG`rZwO!n;Hlp_UL5;zbTiUZIUx`}eCWk)AH69UcX%r3i=&s327gif z0#qP^LBDE#lTs9jCyyLI0L5UdrblLNM2-a0abK_tMFH?IN3q{93}FGhXhhCqvyf>) zFjKj&5sb7Gwpc|61VY*^9sBu63jk2X9}W>PU;qLF2M}C*bxS$8A&^$C_VKDom!lu4 cmZ1h_#)}eYhZwwc#`Fa&;n%QZ!wv`lJF_#_ZvX%Q literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/844.gif b/SRIP/Libraries/Exp1/Data/T2/images/844.gif new file mode 100755 index 0000000000000000000000000000000000000000..370c307dec27864660a60e8ee975e217c47fc062 GIT binary patch literal 1014 zcmV`Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qn009UbNU)&6g9sBUT*$DY!-ojVc=P9P z*A0jTV?Y~s?HajzJunhvF#!MqUj2HBG$^HCzdtJpKAG3=mV%f79!R12jt9;b*j(DH z60?F7cP^1RS;?VIGk^W?3A%|f1}}Xs{k@~I5(&kx|NL2638B`tPj5K<>gSFH&Vgn6 z<*V^l;HZA~I6!3a><7US_xk;MSfI{4TondVu;ou*k%ube<-;*hO0s_bFhLw3jvux$ kg|hMMhmI8kj6LkRTzzXw%p2WY>QY3tuI<~na|Z+fJLf9ttN;K2 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/845.gif b/SRIP/Libraries/Exp1/Data/T2/images/845.gif new file mode 100755 index 0000000000000000000000000000000000000000..f56c52dac156c937adaee27e2acbf524b27af23b GIT binary patch literal 1052 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/857.gif b/SRIP/Libraries/Exp1/Data/T2/images/857.gif new file mode 100755 index 0000000000000000000000000000000000000000..60562606fb4afcd843ac8de279d5aaf3198957ad GIT binary patch literal 969 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/862.gif b/SRIP/Libraries/Exp1/Data/T2/images/862.gif new file mode 100755 index 0000000000000000000000000000000000000000..fff30ccb99089f4cde9564933fc66005d211de7b GIT binary patch literal 1018 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/864.gif b/SRIP/Libraries/Exp1/Data/T2/images/864.gif new file mode 100755 index 0000000000000000000000000000000000000000..319bdcb00cbcc9cdd69e5779fb31c3f564fd2b33 GIT binary patch literal 976 zcmV;>126nXNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QB009UbNU)&6g9sBUT*$DY!-o(fN?hn5 zf`f?#FOc&W&(8pi0#`%|wa?$A1Rw{B@~11MKnu_OQ9=pw03miC_rRc({#}! yNm^xY8Ny!v_Sq6Mfgpi4%AEf5wI&9_01zM~B#=090GE&>OP)-*vgL>Y0RTJL577|- literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/867.gif b/SRIP/Libraries/Exp1/Data/T2/images/867.gif new file mode 100755 index 0000000000000000000000000000000000000000..92b3a1365d4ef47b551e34dacb6e9aa5bd5677bb GIT binary patch literal 998 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/87.gif b/SRIP/Libraries/Exp1/Data/T2/images/87.gif new file mode 100755 index 0000000000000000000000000000000000000000..6ec9699c9c1c71ecabd274dc1caa49ff1ee30fe4 GIT binary patch literal 997 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 L^XJeP1_S^*i%IW3 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/875.gif b/SRIP/Libraries/Exp1/Data/T2/images/875.gif new file mode 100755 index 0000000000000000000000000000000000000000..b95464e88a6f3d66c45cffa4373879d0daf09c68 GIT binary patch literal 1016 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qp009UbNU)&6g9sBUT*$DY!-oP@^daXD zT%SHEAOeVC2c5otAVcaS)#72fkSI~w+vM=bynfm$$!wKU-NOqRA`Ens@|MPdN2sAJ zHsmLO4A(+(Gx5M^kZvJgnJ_BQ7RotP1-?Q#uMGyOJ%qtSIqX8#EY(mFvyfGS6Idai zmB|VKLadPaoG644LX*ye4u*xSqtFgWQ*Jg)D41c};KC`pS&~74!W&Z|<*|XBvU9(B m=3p$eQAbri&;9tBEBO${9$)4_e%rGL4c*(gbL$ou5CA*-ROUPY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/876.gif b/SRIP/Libraries/Exp1/Data/T2/images/876.gif new file mode 100755 index 0000000000000000000000000000000000000000..15fec916a79e26ee503df565c9ffd9f258e02d77 GIT binary patch literal 1034 zcmV+l1oitzNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q*009UbNU)&6g9sBUT*$DY!-o(X3fLhj z)4zZIE+%<6;tQ@_{X&WiiERhND&E+M{DKw!{7C43@VC5R|6!myEl2vAMI=Gw@9ceFknKuF$Kk?NZD8PIUZ*|%aC z7C<*Ll_EuJo`hNzG98D70irOgbq0cff&z}j>xW1zRf13W^=tFkV7`8lDi^$*S@S^7 z3J0JWO(mg|I}^`n;*A(N5sX3g4E=ZJ4xBG)KH^|m;?6`qqTuN)8n EJGm6>ApigX literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/879.gif b/SRIP/Libraries/Exp1/Data/T2/images/879.gif new file mode 100755 index 0000000000000000000000000000000000000000..e986435e02705ff51b1199684eaf0d3d74586ea9 GIT binary patch literal 981 zcmV;`11kJSNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QG009UbNU)&6g9sBUT*$DY!-o(fN;F7i z&>&Bw29?8>g@D8*vK+}9Ig;PB2onn$xQ35I%7F+z`J?nwAO=tVl08U?K!_-G{=i9@ zc;HVifBxpVLOGESQl&d;3W4U&oh1h~0WjzS%-u3A46*`X!pvW(uvufc^S44QfHD3a zxwYf(l-M2j{PoD1VVOTA1!`jOyQ)J?Gx7W#@;LFqon-sSsTuGx)4zX^7`xppF(3dt DKr`5& literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/891.gif b/SRIP/Libraries/Exp1/Data/T2/images/891.gif new file mode 100755 index 0000000000000000000000000000000000000000..17f4283126ef2f174abfb37655148d754d7d080d GIT binary patch literal 998 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QX009UbNU)&6g9sBUT*$DY!-o(bE|@{6 zpTB;s6hsu5q7}b>A3w_2Sn(pgW$G*r+6WS46aeW&ZoKG^6@XC}mu&<9=gk%c6~4LL zInW0ti~YEKAX;Hr%$DdJQP^k=DNT#jDnx7D50@;J;z!~ZM z0fSg!EWxL59{TWiX<&tt{g&BfXr>>!6aXrS;@bA1nST~pRi(KlVh^rdS!s+2IOo}o U3bwGKmhR19x2RLA78no!I}b+Owg3PC literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/894.gif b/SRIP/Libraries/Exp1/Data/T2/images/894.gif new file mode 100755 index 0000000000000000000000000000000000000000..d6ad3695c21642f5ae9d74dc3546bf6f20a0d921 GIT binary patch literal 1048 zcmV+z1n2ulNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q}009UbNU)&6g9sBUT*$DY!-o(f3gp1a zpTB?pz7cvTfWin(*U2Kt{K@DS^8riSpNN?X*24e`p9?N#t1YMcHfB~(MGZ*r3 z>4t>CSU?$?7~^Qz1A`90Sp*}opstaw5>y@d0o%wcTLoI!RuYhahX}-o;W4Jhhfgh$ zNqE@EqD72$|Bc!qgW(lxE=jU%Ig(uqg?sK1W*NBOt5Z&lCOo3J-?KV9k+`HZ!J(#+ zu`UQClC31L0uIAiTqF>IB6}C*K&&(p6@Ui0;`M7M#{k5b{XEeDHxeESiLwTl941;K S31o~#%?(Svy7hzs0RTJrMe)J_ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/896.gif b/SRIP/Libraries/Exp1/Data/T2/images/896.gif new file mode 100755 index 0000000000000000000000000000000000000000..9a9bd4b0a1b8e88744b1df61955b34ddcf4fba11 GIT binary patch literal 1059 zcmV+;1l;>aNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R7009UbNU)&6g9sBUT*$DY!-o(fUf6+# z6DMK+{P_doutAVX*2?+oN3!3@e(YK_1Xt2z%ae5&TA+6FTs2K~>Np8Dau@`L3848C zrDMauG5Ac@gAs8co_8Ak9g0|h0v1BnPU_3^0OA;7FG zEF==oWy!WDe=Qu7&tJxMw8V@NL--InjqXS+Bypm#QG=97dUMdUU>1__P*ffW!5&Ft zn*~0~Hd51LgdDPPigJOVgCV*!{v+mLVV{!btWC0Ghh@o21{Sud%QkF3X=ECXKzH}0 dx?46L#?X;ull5Hvt`+(ay1V!91_J>C06SmK{6YW# literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/908.gif b/SRIP/Libraries/Exp1/Data/T2/images/908.gif new file mode 100755 index 0000000000000000000000000000000000000000..f0a759409872fe7809986c87cfc332fbf9eac2b9 GIT binary patch literal 1040 zcmV+r1n>JtNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q>009UbNU)&6g9sBUT*$Ct!U;PJg#qF4 zAO}(6`t|d-u8x3;0#{@brct9mjdeikXt%Ls%YNGuRD5OfnI9cGWR=uW5thGIObA{u z=g%KchZ|1FBsc;c%%va;a?)5WszD<5G`6uS5P=5(!%hM#05Sy}VgHI2O-sii0z1g! znRIy)(8q;3nw>1UcW%Fw2?->k*D_o+Sbp4uf& zMbDWK_<~bfe}f#3(&%l)3Ol*hZQNH%fy2HpO&$Wt*l#~?Uj~2#v#Gf8O+g%RUCz9@ K^XJe50suRk!R(v> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/910.gif b/SRIP/Libraries/Exp1/Data/T2/images/910.gif new file mode 100755 index 0000000000000000000000000000000000000000..2054681c9e50146ebfa39212de3f9f9a6fadef10 GIT binary patch literal 1045 zcmV+w1nT=oNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q`009UbNU)&6g9sBUT*$DY!-obHl<~6V zlf@(uFT@DLsa(I0Aob~JhycyFkN!Za?ANLxif|zPRf|Ov7R-LZ8us|O4UU8a18so( z)NlbK85jr}@I>$9w+;{oHsFH{WUUiXIpla%Po**y4+rqr!>wORmGFQ(6dH47KX*SI zQu0UF-@jp%zDSZsH;=;`yRNCa!ePL`B_Df5J;)Z^VuLR}7J5uDjJSUCf+Q>uB97-; zaS1+k(-T>eRm P5D=83OP@~tVL$*oO{ei0 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/918.gif b/SRIP/Libraries/Exp1/Data/T2/images/918.gif new file mode 100755 index 0000000000000000000000000000000000000000..e1dc13d04b339511fba4afa6d59c69ea4d51532d GIT binary patch literal 1032 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 SHCy7h6ciK{6%`g178e&67#J8C85tTH8XFrM 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 F06WI5^nL&U literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/967.gif b/SRIP/Libraries/Exp1/Data/T2/images/967.gif new file mode 100755 index 0000000000000000000000000000000000000000..dfaccbb523b4b4f1880b02c6e6e408e6b42ad876 GIT binary patch literal 1003 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qc009UbNU)&6g9sBUT*$DY!-o(N7Fa+r zK*WM5botxps??hl7Xiq#7pA9&XNI|3~*F><89+A0YL$H;Iz>WLqo1RoK&>(`GaQyB7!mMw))ez?MKKB ZSV)B{6$D3G00+>XUd_6->yQBf06TO3-0uJY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/976.gif b/SRIP/Libraries/Exp1/Data/T2/images/976.gif new file mode 100755 index 0000000000000000000000000000000000000000..d5572ae414ab49e3d2ae7e197d8aeac28af83fec GIT binary patch literal 1024 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 F06S3y;Aj8< literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/99.gif b/SRIP/Libraries/Exp1/Data/T2/images/99.gif new file mode 100755 index 0000000000000000000000000000000000000000..14d7fbcb97498b24ef5c62aaa3e1b73f3ec72caf GIT binary patch literal 991 zcmV<510eiINk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QQ009UbNU)&6g9sBUT*$DY!-o(ZK46os z-#=PqA`T?6ji1MU{Km=9Sj8K^bd8EU8OINlMmqi00T~#orN#w-Bn-4bj~^S22E+8j z1(cwPG5zR?DGH!LCV2e%!7J0C=opVtJzkptR6{pui7tTY#t#rvf=2rFn|T&MhHw1n zv=#U)?py$M<+cTa&+gd*iqzJKSm1>SfdvqG?4%I`KXqD+{PH*sLSw8^*8%DPw81p2 NiFn){O

06RDW+MfUb literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/990.gif b/SRIP/Libraries/Exp1/Data/T2/images/990.gif new file mode 100755 index 0000000000000000000000000000000000000000..3c90391717c7a6194cacba586a7a607d329d8755 GIT binary patch literal 1044 zcmV+v1nc`pNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q_009UbNU)&6g9sBUT*$DY!-ok=;7Ns! z9~6iK8Q@{o&!0zs+b}v1h3})kW4S!0d5DAA$8UB*5CG#5)k8NPqxncM@QBAc51WYN zb)#ShB2XOvaVKnIBn!j~OFebn-(1I|JRUT^S66@PKY_9~R#e} zSN77AGcZas6$;hl`AdlyoU`*w)LXd4piM^Og+n+g)`q)er*ydwDWGjXX-0;n# O8RgKUOP>xsAOJfU()bnt literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T2/images/993.gif b/SRIP/Libraries/Exp1/Data/T2/images/993.gif new file mode 100755 index 0000000000000000000000000000000000000000..8a1d1be1debd3d3c899835d10348255a47dd1710 GIT binary patch literal 1009 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/Config.txt b/SRIP/Libraries/Exp1/Data/T3/Config.txt new file mode 100755 index 00000000..06b73a09 --- /dev/null +++ b/SRIP/Libraries/Exp1/Data/T3/Config.txt @@ -0,0 +1,13 @@ +8 +9 +6 +Contrast Ratio +Aspect Ratio +Perimeter +X-Symmetry +Y-Symmetry +Holes +25 +25 +137 +81.0 diff --git a/SRIP/Libraries/Exp1/Data/T3/Data.txt b/SRIP/Libraries/Exp1/Data/T3/Data.txt new file mode 100755 index 00000000..895ae339 --- /dev/null +++ b/SRIP/Libraries/Exp1/Data/T3/Data.txt @@ -0,0 +1,187 @@ +18 8 0.163206589811943 0.0897755610972568 62 116 117 3 +32 8 0.195123821563101 0.0972568578553617 69 141 141 3 +42 8 0.175414147317314 0.0847880299251871 67 103 104 3 +47 8 0.126438584938183 0.0847880299251871 82 115 86 3 +56 8 0.200614432119322 0.0947630922693268 75 143 127 3 +86 8 0.156344018186367 0.0947630922693268 86 127 123 3 +95 8 0.156344018186367 0.0847880299251871 67 118 109 3 +98 8 0.168407212121481 0.0897755610972568 75 130 120 3 +126 8 0.154641008845181 0.0897755610972568 74 107 95 3 +138 8 0.173654546473192 0.0822942643391521 54 76 85 2 +145 8 0.107346413573659 0.0847880299251871 89 96 102 3 +147 8 0.171900206004978 0.0972568578553617 82 132 128 3 +161 8 0.126438584938183 0.0847880299251871 70 90 90 2 +189 8 0.164934978915064 0.0822942643391521 86 118 101 3 +198 8 0.142858964251791 0.0947630922693268 77 121 122 2 +203 8 0.152943008341245 0.0972568578553617 70 127 120 4 +226 8 0.200614432119322 0.0922693266832918 81 141 144 3 +241 8 0.110483371017802 0.0798004987531173 65 83 82 2 +246 8 0.230771126500234 0.0897755610972568 79 118 115 3 +266 8 0.219286491716048 0.0897755610972568 75 136 135 3 +296 8 0.149561945713518 0.0897755610972568 78 120 124 3 +301 8 0.131314940135346 0.0798004987531173 58 91 81 3 +313 8 0.191491229083182 0.0997506234413965 80 127 124 2 +334 8 0.196948436691483 0.0897755610972568 94 119 105 3 +344 8 0.161483321847305 0.0947630922693268 76 136 131 3 +5 9 0.131314940135346 0.0872817955112220 69 102 102 2 +20 9 0.0980409849410648 0.0847880299251871 57 84 85 2 +23 9 0.0828746778282908 0.0798004987531173 64 83 83 2 +34 9 0.116810908980225 0.0922693266832918 57 96 105 2 +44 9 0.0995810138285107 0.0773067331670823 59 83 78 2 +46 9 0.142858964251791 0.0847880299251871 72 102 97 2 +49 9 0.0919237670336065 0.0748129675810474 64 96 82 2 +55 9 0.131314940135346 0.0947630922693268 83 116 94 1 +58 9 0.120001795914702 0.0798004987531173 66 92 82 2 +81 9 0.151249994609304 0.0847880299251871 92 100 109 3 +88 9 0.154641008845181 0.0872817955112220 64 109 104 3 +111 9 0.144527370606062 0.0847880299251871 73 90 96 2 +117 9 0.154641008845181 0.0822942643391521 67 87 93 2 +134 9 0.105784571558162 0.0748129675810474 56 79 75 2 +154 9 0.0888906464300802 0.0798004987531173 65 84 74 2 +155 9 0.124822461456125 0.0922693266832918 86 118 104 1 +163 9 0.120001795914702 0.0798004987531173 70 95 84 2 +168 9 0.152943008341245 0.0847880299251871 70 110 105 2 +171 9 0.120001795914702 0.0822942643391521 71 89 88 2 +173 9 0.142858964251791 0.0947630922693268 72 116 101 2 +177 9 0.112058524101355 0.0773067331670823 59 86 88 2 +184 9 0.156344018186367 0.0847880299251871 73 85 68 2 +196 9 0.131314940135346 0.0847880299251871 68 102 103 2 +227 9 0.136233698311913 0.0822942643391521 70 93 92 2 +228 9 0.124822461456125 0.0822942643391521 72 102 83 2 +349 8 0.209878424881818 0.0798004987531173 54 93 99 1 +353 8 0.213624175387056 0.0897755610972568 90 112 125 3 +369 8 0.121604086761823 0.0897755610972568 68 93 98 2 +387 8 0.184291891521866 0.0972568578553617 106 143 134 2 +394 8 0.198778631665330 0.0947630922693268 80 110 114 2 +405 8 0.184291891521866 0.0922693266832918 96 145 94 3 +416 8 0.211748405437042 0.0947630922693268 78 119 118 3 +419 8 0.0551834073000634 0.172588832487310 71 86 86 2 +440 8 0.161483321847305 0.104972375690608 82 134 128 2 +446 8 0.189683201237905 0.0897755610972568 75 128 129 3 +457 8 0.110483371017802 0.0847880299251871 82 99 98 2 +470 8 0.202455863845403 0.0997506234413965 84 146 145 3 +486 8 0.168407212121481 0.0997506234413965 96 137 140 2 +500 8 0.159765152294317 0.0997506234413965 83 130 127 2 +504 8 0.137882802987854 0.0947630922693268 71 117 115 2 +518 8 0.175414147317314 0.0997506234413965 86 132 138 2 +529 8 0.283144309737974 0.116923076923077 70 117 145 2 +533 8 0.168407212121481 0.0847880299251871 78 114 116 3 +540 8 0.228842019924087 0.0972568578553617 81 140 121 3 +546 8 0.161483321847305 0.0947630922693268 75 125 120 3 +560 8 0.175414147317314 0.0997506234413965 74 143 146 3 +572 8 0.173654546473192 0.0947630922693268 79 132 128 3 +576 8 0.129684804115963 0.0947630922693268 76 118 125 2 +595 8 0.154641008845181 0.0798004987531173 82 97 101 2 +603 8 0.151249994609304 0.0872817955112220 78 112 93 3 +616 8 0.156344018186367 0.0997506234413965 86 127 121 2 +628 8 0.124822461456125 0.140077821011673 85 115 99 2 +629 8 0.108912673802141 0.0847880299251871 90 116 109 4 +686 8 0.154641008845181 0.0897755610972568 60 112 114 3 +695 8 0.126438584938183 0.0748129675810474 64 91 86 3 +706 8 0.168407212121481 0.0972568578553617 67 136 134 3 +709 8 0.120001795914702 0.0748129675810474 68 85 84 3 +721 8 0.113638152040790 0.0748129675810474 52 75 82 1 +726 8 0.186083557248204 0.0947630922693268 62 130 135 3 +727 8 0.124822461456125 0.0847880299251871 77 110 111 3 +735 8 0.246424798176129 0.0922693266832918 87 147 120 4 +737 8 0.0843724293612381 0.0798004987531173 81 86 78 3 +741 8 0.126438584938183 0.0748129675810474 71 99 71 2 +757 8 0.422869414562487 0.0972568578553617 65 138 108 1 +759 8 0.200614432119322 0.0997506234413965 88 141 115 2 +762 8 0.184291891521866 0.0897755610972568 71 121 127 3 +767 8 0.225001892085224 0.0847880299251871 77 114 97 3 +770 8 0.246424798176129 0.0997506234413965 71 150 145 3 +778 8 0.196948436691483 0.0922693266832918 80 131 134 3 +785 8 0.128059359123525 0.0822942643391521 75 97 102 2 +792 8 0.204302952793993 0.0972568578553617 73 132 126 3 +793 8 0.175414147317314 0.0997506234413965 113 133 150 2 +797 8 0.0980409849410648 0.0847880299251871 81 99 101 2 +818 8 0.193304760801575 0.0897755610972568 58 112 121 2 +824 8 0.171900206004978 0.0897755610972568 77 129 129 3 +832 8 0.223090814394400 0.0972568578553617 79 151 150 3 +859 8 0.0995810138285107 0.0847880299251871 78 104 93 2 +866 8 0.196948436691483 0.0947630922693268 73 145 141 3 +877 8 0.102674067597454 0.0798004987531173 67 92 86 3 +886 8 0.228842019924087 0.0922693266832918 59 125 124 2 +914 8 0.217393191347770 0.116923076923077 63 143 142 2 +924 8 0.198778631665330 0.0947630922693268 70 140 137 3 +926 8 0.234647567369168 0.0947630922693268 74 128 116 3 +936 8 0.113638152040790 0.172588832487310 51 103 105 1 +964 8 0.168407212121481 0.0947630922693268 63 131 129 3 +973 8 0.276874882293493 0.0997506234413965 83 167 108 3 +977 8 0.159765152294317 0.0897755610972568 90 120 92 2 +248 9 0.105784571558162 0.0822942643391521 74 94 80 2 +265 9 0.116810908980225 0.0897755610972568 76 106 91 2 +268 9 0.104227129087227 0.0798004987531173 68 88 75 2 +281 9 0.101125368629733 0.0798004987531173 65 81 74 2 +283 9 0.0873803963511990 0.0897755610972568 78 102 89 1 +286 9 0.102674067597454 0.0748129675810474 62 81 62 2 +305 9 0.0813810580146340 0.0748129675810474 63 55 57 2 +314 9 0.116810908980225 0.0798004987531173 64 95 72 2 +320 9 0.132949787518403 0.0798004987531173 65 97 97 2 +323 9 0.118404076499485 0.0872817955112220 86 87 97 2 +335 9 0.149561945713518 0.0847880299251871 77 102 88 2 +345 9 0.105784571558162 0.0847880299251871 75 81 69 1 +347 9 0.129684804115963 0.0897755610972568 74 108 107 2 +351 9 0.136233698311913 0.0798004987531173 70 89 91 2 +363 9 0.131314940135346 0.0798004987531173 64 85 83 2 +365 9 0.0919237670336065 0.0798004987531173 69 82 74 2 +375 9 0.175414147317314 0.0798004987531173 58 92 84 2 +384 9 0.144527370606062 0.0847880299251871 69 98 91 2 +390 9 0.128059359123525 0.0798004987531173 64 91 86 2 +410 9 0.131314940135346 0.0872817955112220 77 109 103 2 +420 9 0.132949787518403 0.0798004987531173 71 97 91 2 +424 9 0.118404076499485 0.0798004987531173 64 93 86 2 +425 9 0.189683201237905 0.0972568578553617 64 124 127 2 +429 9 0.131314940135346 0.0798004987531173 67 91 95 2 +435 9 0.0919237670336065 0.0922693266832918 85 95 107 2 +442 9 0.104227129087227 0.0773067331670823 62 86 84 2 +461 9 0.118404076499485 0.0847880299251871 76 101 94 2 +472 9 0.139536701560173 0.0897755610972568 66 110 107 2 +483 9 0.116810908980225 0.0798004987531173 63 76 76 2 +488 9 0.115222273932134 0.0947630922693268 76 103 102 2 +502 9 0.110483371017802 0.0997506234413965 68 104 106 2 +521 9 0.158052058560426 0.0847880299251871 69 100 95 2 +526 9 0.139536701560173 0.0947630922693268 72 111 104 2 +530 9 0.146200655328444 0.0897755610972568 61 100 100 2 +551 9 0.132949787518403 0.0847880299251871 71 88 88 2 +567 9 0.102674067597454 0.0773067331670823 67 80 79 2 +581 9 0.118404076499485 0.0822942643391521 72 86 96 2 +584 9 0.112058524101355 0.0897755610972568 60 97 94 2 +590 9 0.136233698311913 0.0847880299251871 66 98 100 2 +596 9 0.101125368629733 0.0897755610972568 59 92 93 2 +601 9 0.0858743297812137 0.0748129675810474 56 69 60 2 +602 9 0.0980409849410648 0.0922693266832918 72 102 99 2 +622 9 0.105784571558162 0.0939226519337018 68 93 101 2 +627 9 0.217393191347770 0.107734806629834 85 128 111 2 +632 9 0.126438584938183 0.0947630922693268 67 111 110 2 +642 9 0.124822461456125 0.0847880299251871 50 87 87 1 +688 9 0.158052058560426 0.0847880299251871 69 100 97 1 +705 9 0.193304760801575 0.116923076923077 91 145 139 3 +708 9 0.146200655328444 0.0798004987531173 65 98 92 2 +728 9 0.149561945713518 0.0872817955112220 73 107 94 2 +742 9 0.142858964251791 0.0847880299251871 71 104 100 2 +745 9 0.0949738324064628 0.0748129675810474 69 61 69 2 +756 9 0.177179032232610 0.0897755610972568 78 114 108 1 +764 9 0.223090814394400 0.0947630922693268 74 119 109 2 +765 9 0.177179032232610 0.0947630922693268 81 116 118 2 +773 9 0.281047671174358 0.0947630922693268 75 124 122 2 +783 9 0.0934466727615787 0.0847880299251871 78 88 82 1 +789 9 0.131314940135346 0.0822942643391521 75 106 105 2 +794 9 0.166668512018778 0.0872817955112220 76 112 104 2 +801 9 0.161483321847305 0.0822942643391521 70 93 95 2 +807 9 0.191491229083182 0.0847880299251871 64 97 81 2 +813 9 0.124822461456125 0.0847880299251871 67 88 85 2 +823 9 0.0739743404497270 0.0698254364089776 58 69 67 2 +827 9 0.198778631665330 0.0997506234413965 92 121 94 1 +828 9 0.129684804115963 0.0847880299251871 67 94 90 1 +865 9 0.0637737724837528 0.0748129675810474 57 69 64 2 +888 9 0.204302952793993 0.0947630922693268 80 132 125 2 +901 9 0.0710399850697523 0.0748129675810474 61 71 66 2 +903 9 0.161483321847305 0.0922693266832918 92 120 121 2 +930 9 0.158052058560426 0.0947630922693268 86 130 128 2 +931 9 0.186083557248204 0.0897755610972568 74 123 114 2 +933 9 0.113638152040790 0.0847880299251871 75 86 91 2 +941 9 0.137882802987854 0.0822942643391521 74 85 93 2 +975 9 0.178949225056871 0.0872817955112220 76 109 109 2 +981 9 0.113638152040790 0.0773067331670823 57 83 77 2 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/111.gif b/SRIP/Libraries/Exp1/Data/T3/images/111.gif new file mode 100755 index 0000000000000000000000000000000000000000..87ba74f247bc36fe8cda633768ce7bbafc06d1dd GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-o(fN=#Ux zkUxJtCJH1FMO?p+A0a)Q zu+vxsfdT61`>5n$mybmTI$7DTsl!A4!VwVoqh3F6{q+5KxUJte01pV2<98@SKXMTD ze9X6$+1LkfA)=s4&4NI@?>;<4;00GOMScZB=;zO>#=lG-4_sibpBc#mQ~AS*ITcIH f0-gB72LiMNbp7yv1^}qvwbdnZ&00;HVL$*oyrt!K literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/117.gif b/SRIP/Libraries/Exp1/Data/T3/images/117.gif new file mode 100755 index 0000000000000000000000000000000000000000..f3b12501c69d9cd155ed396d60daccfbd2907fec GIT binary patch literal 995 zcmV<9104KENk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QU009UbNU)&6g9sBUT*$DY!-o(fN}M=x z2{2%b7G0T`V34SK{`!gR2PWbPP9y)t!xgXJIfyINi98i*ObGxc*1de#Eu^;*1QYGs z+0ctWe~1V^SacNK!!G^o?GR|;4Y!d*8AA2P%SIqBgJkR$ss`_!@@9f(Ro zibVD!$H*TNmsA<};;15u1oMcj19+e)krxUBpwO=0Ap(j6iFBbD08?xgDlh7XtFq;O RWIQiw)j%{C&kq9v06Q=~*r@;j literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/126.gif b/SRIP/Libraries/Exp1/Data/T3/images/126.gif new file mode 100755 index 0000000000000000000000000000000000000000..d548f6ec1fd6488ded0d1a483584669c051b24c6 GIT binary patch literal 1025 zcmV+c1pfO+Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qy009UbNU)&6g9sBUT*$DY!-orL#IpiX z;D81V*d*HM&L4(~0P^@7Npj>F0S_-!^5zd;xpw~S;Yt%v!oxW&4J`q%#orczS`Iv% z;_s2bAM3!C013c^KX*qKFl!cpDS!_h+X?fx$*RC3F#XAb;8mcjk;_t)6|s(FC9e!l z`AcT(=}x9j{8@XzpqamSBS3C==TDTtU?W$6RP=PlVSnK^R8+9F%s|9_KxXjAErGx` v`E(Tk*~niu3UQL@^Ow1zgw_4(ksLGtWPmOIa{n`R0%h6Xz=I1P7!UwElZNhi literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/134.gif b/SRIP/Libraries/Exp1/Data/T3/images/134.gif new file mode 100755 index 0000000000000000000000000000000000000000..a6d0f993b6c10d42e71d99bf6309be5eeec20014 GIT binary patch literal 973 zcmV;;12X(aNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q8009UbNU)&6g9sBUT*$DY!-o(fN}M>c z!l8e?)HI+7pn@rXApPM|FwsUbf9y_$v@-EozETMSSb*n`Wkfvu9tqS?%wN5Y5pDUK zbEOeYf3GHr3h6H$NL&*iZ2F}rj|+eLf^Zzz$lt830$uF$hXE`A8~*Z1Fx$#sEVE4d v*<)c=kH2GP8<6u?$Ltz^(h8W(C$k~&nVMi$Vn6^pRB+Tu literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/138.gif b/SRIP/Libraries/Exp1/Data/T3/images/138.gif new file mode 100755 index 0000000000000000000000000000000000000000..184bd59cc3219aecec73e22507dfab3ed8b511e8 GIT binary patch literal 922 zcmV;L17-Y2Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pg009UbNU)&6g9sBUT*$DY!-o(f0s-{v zA0QwR2?F`YvE#3d05*0U`7a|Nj({$XG-+{QM?e`xVm#RrB*$MOYqA{q5u`wpK3%>H w`V%El03%@rtvJ*t&5lHwa>VG9DN~{-ZwAfzucuG0RD;qCd$g?CvH<}AJDUNtBLDyZ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/145.gif b/SRIP/Libraries/Exp1/Data/T3/images/145.gif new file mode 100755 index 0000000000000000000000000000000000000000..cd7358374153e2593ac16786881c245b97f22743 GIT binary patch literal 1019 zcmVNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qs009UbNU)&6g9sBUT*$DY!-o(Z67V6( zmOp>BU@dwOQG~93*`OgBX$svKh&|*%do!S*1Q2UhIOHVn!odc=Y8h~t=bxCC1Q7@e z#{goget3Wi1axmk!~t*UrJ4Z1!JvF~A`aXUZygdx<%DP@m_eJrb0o$VEYz=C2(<$z zw0lD=8&$Zj6alypjF|+rV89J5n@TCfYkCJ->334=wJ-z+h_bf8F=T>v`VrBZt5ZP~ p{={gNL9YivIP`Rkb+ymYjwz?;y-{m`ZNGl0dKiYwyEpHE06T6+;*J0S literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/147.gif b/SRIP/Libraries/Exp1/Data/T3/images/147.gif new file mode 100755 index 0000000000000000000000000000000000000000..ffad002c4d5f1269e0f41ae74e468d4b453896b1 GIT binary patch literal 1035 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 B)=~ff literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/155.gif b/SRIP/Libraries/Exp1/Data/T3/images/155.gif new file mode 100755 index 0000000000000000000000000000000000000000..c91136208456c881b8147c3d1dee1700e574fe6d GIT binary patch literal 1016 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qp009UbNU)&6g9sBUT*$DY!-o(fN}TBM zfP_Ja5Rv+a&w|7ar}~MUMuyCffgLoVVaQ;a$YWAI5UjChSHDOL6_Dyj&dC6R8)oqn zxz5Bw5+aEZtUwD~KU1OlO=5_&Ul@Tr{+#Pq?TZ0m(-1HeK!=~cdGqq|<7VOjfLr~R zJ){E7oVih62!$`WfG_>#MQ}W+Um?d#M7l*RsoyRE mh#5HR2gEUtez`UeKJBRl=+*t;sVjh(z^Fr00yuUU5CA*Vl<2Ae literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/161.gif b/SRIP/Libraries/Exp1/Data/T3/images/161.gif new file mode 100755 index 0000000000000000000000000000000000000000..3fe0472d3c37b52c5b720f997e7eb247e44662c1 GIT binary patch literal 1004 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qd009UbNU)&6g9sBUT*$DY!-oZByh8yo zVXA#3Djv)L50*xQfX4X~GEjh&S{Wd^@%JnkMS-dGO)~Hh(7kdW4h$UTPZY!@{?3&k z_{g8O0T2WE^Vdw4EHg~(`QuPA1}Sw*v-S+|@d1rCh0HBACg3B%Wm#RA6&L{>xIF$i ztp%{jpBV!1;;jt;ESv)X@9eEz<8KK74fO<@mF15H05kq@tz}F@0XBbdCO0(>GU0suQz3EH#( literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/163.gif b/SRIP/Libraries/Exp1/Data/T3/images/163.gif new file mode 100755 index 0000000000000000000000000000000000000000..e00081118ac3e1607c8291dff4ecc1aa1aa17759 GIT binary patch literal 980 zcmV;_11tPTNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QF009UbNU)&6g9sBUT*$DY!-o(fN<=8d zT0eD|DohkOYFD8*mDJpd})@;69gg>U@?5eyjxB9eaeP!QzO&)+48nD~h* zI0NL*hnV`ADM+a27NGoY4cxQrBP#_EdHQ38DV<4^OCc&?_3>l6OCLwNG-IX*05d)} z60A`5jog7Vddj#fuxP)%eDnGPeAh2wxq1H`-pB>yVweB=fm17&LN$Ih`D&gR5CA(F CFVj;1 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/168.gif b/SRIP/Libraries/Exp1/Data/T3/images/168.gif new file mode 100755 index 0000000000000000000000000000000000000000..aecfd151e62805d35012cf81d719a5a6725fa466 GIT binary patch literal 1013 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DY!-o(fN}M>+ zz!78r{+;7iOJV{*!20>ySFT<^S`mNr>er8*Hbnq}L=*SoArN)_)?s2n&{jWG4jCNl z$IM4Tp+6lq>Sv4rK^0q?^+Wf=p{jn(a>U{Rz)CHa{TMyu!!jN|ciQ|tW4S58Lk?HL zCc|)rC6b5(To58;!2pAN{hkq^I1uBy6odsz`L_>dVj}tcWl9WS!mxhdNF=Th65NQ* jzxsJA0h%Qm%B5He8BDmvy?(G*6V|Y;-y6z=0|Ed$Kdj{4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/171.gif b/SRIP/Libraries/Exp1/Data/T3/images/171.gif new file mode 100755 index 0000000000000000000000000000000000000000..840f7b659649422ebe6c5aa187a791945fe2a193 GIT binary patch literal 999 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/177.gif b/SRIP/Libraries/Exp1/Data/T3/images/177.gif new file mode 100755 index 0000000000000000000000000000000000000000..fe8a6262f749f29edd15d292704922ab376d8aac GIT binary patch literal 973 zcmV;;12X(aNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q8009UbNU)&6g9sBUT*$DY!-o(fN}L$6 zLNR}WGH?*YU}6by{lNW82d^I%i6gxA`*z|~zn3Q?O6tdr1b_+L`t5@fvB5NZBLHNO z_41rV9Q}X_iRSMmB#8x%^^1qEpQ&5@@=R2suOGZn0AgjO7=)7xq3Xs`9EelxT7k0s v>3KU)tX8^V-L3`E6%JkzFBSX^Jh6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qv009UbNU)&6g9sBUT*$DY!-o(f8eFif z90-X5HN1G?;fud(4IsAAlq=V_e*Fr)`p0VmL^mk=*$YJur9UnZ0oCj0DNzLgFw*r) zhXCRtf8R0)B%#V5Jv9+;Q0o_Jfd*Oq*u{}}U{gPGP)_!1gAqWZnEv`{>QEM@%~>YO z4p`-{?yRx`SHqT sP$d%T=c_=KteVPZ>X!-_$|iW>*kl(d0p199=Kb1=x3}-#2?GKEJ5}cEGynhq literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/184.gif b/SRIP/Libraries/Exp1/Data/T3/images/184.gif new file mode 100755 index 0000000000000000000000000000000000000000..5cdca624db47231206c34e6bd0fbb45e1dc548bf GIT binary patch literal 926 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 H!hirf<)Zc6 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/196.gif b/SRIP/Libraries/Exp1/Data/T3/images/196.gif new file mode 100755 index 0000000000000000000000000000000000000000..258df70cb492549590903d8ce363a1374af273ab GIT binary patch literal 992 zcmV<610VcHNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QR009UbNU)&6g9sBUT*$DY!-o(fN?gdG zNu+=03Z)njF+m1H`TX@8InoZq1*b@^YqlzzxPGW0h8Y=6ONxONU?GAitRJoe0~1iO zwIX8AF#`{9>c_4q&wlHiQK}?ud*J@itx#yB7`>}T_ThMT06ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qv009UbNU)&6g9sBUT*$DY!-o(fHb`Nr z-?Bgo1|B%@P>QpD{6hBoByhqm91n}}bJhh1jyq8Rn9u~RK}vo$31$gL&H_YZ{eBFD zP%+-6h$?vrWHO5%v>g!vxZxKLfF^JBP?d-Z-~~K=;q38y#dV-KfBon!DJziByngUv zmQ~;e9>0FX*aCPGQW;*he*Q(v@WWrRvQp-$;{YJeU#=?22(;9%4c8g=jsozLk6Z$- sM*1-#V53|=%~4bFE5(-|>ZpT6^3yee?EyOQ`i=Xbx3}-#1p@*AJKpr^)Bpeg literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/20.gif b/SRIP/Libraries/Exp1/Data/T3/images/20.gif new file mode 100755 index 0000000000000000000000000000000000000000..acade5de6b43169c3cc086e22e35a9b985b2356b GIT binary patch literal 974 zcmV;<12OzZNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q9009UbNU)&6g9sBUT*$DY!-o(fN}M=R zLYi^?`stwvAjh$O{6g~kG?BtIe&{eIImPdq0g1)<*&0}4-MkkPdGR|#b6vR&5_|Qt zf?&lWU(;GlM8^+VvXE3bR;$Mkq&yWI0pOql5>!@!EkK(13LwkBeq+Bv>DLRy*A%nR wMa}vk9KShaGw~xumPoyMPria^S5L~<1eExtBCDn!u>)UikPF0tEXRNVJB`TGWdHyG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/203.gif b/SRIP/Libraries/Exp1/Data/T3/images/203.gif new file mode 100755 index 0000000000000000000000000000000000000000..9c266d2f6d39e0a862d0560a512e279d456e39c3 GIT binary patch literal 1035 zcmV+m1oZnyNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q+009UbNU)&6g9sBUT*$DY!-o!A(24|6 zAcG7TGaQ)kiC&V5B8>U#M-tb$cugQi0AsHozhI_FzI#$}4oOo*0PyMe4obx>^7=Ue zLBP?uo)s%t>u0C{fExXf(X3diA1$Ys+|lDv5kLiM{ZIiQb1&b=t^;!Qi>4=DznonM z_VP!UP+WqJNcL04Xu(|^=Wc1xFO8FJ0Vbyzj9p@Z0hG_pryxM1NCF&004(u z`}V1+NMW5d2O0c;>sJj;#R97OeG`L>WGM_?8|WpOZOnkU0irxJM@S5UyU3F(UtTdF F06VN??&AOe literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/226.gif b/SRIP/Libraries/Exp1/Data/T3/images/226.gif new file mode 100755 index 0000000000000000000000000000000000000000..cf04a6b699f72d75d3a99b94846deac809f8d6e6 GIT binary patch literal 1023 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qw009UbNU)&6g9sBUT*$DY!-odDT>7W3 zPoEhO3HIUFuVY7e7&8{x=dq-^j3KP`D|cgpno8CB!OKXj-!fqYPsq#|%_ak%(S0?1c3u~s86n7*efEdL( zN+V^bW15Uk@bzmK#sL5dJ>TtsXsq8U8w7iGr1FqSK6n-iD(=VFVckyyBrks0hU1C` ti8nu7*U{ReCXXJ46Ya1~zLFmKaXOK4#-4U1H;Hk}ySMM(zySmV06WNt==}fy literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/227.gif b/SRIP/Libraries/Exp1/Data/T3/images/227.gif new file mode 100755 index 0000000000000000000000000000000000000000..1cad9da3dc475e35ddffafc1c2e44c3b679e1777 GIT binary patch literal 978 zcmV;@116ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QD009UbNU)&6g9sBUT*$DY!-o(fN}TAh zfQ=Qo{QVneX~2>f5D}E>N3xwelFs@ugV?EGH!?v44B$kv-yw+1`pF@fpc=^(4ldyAK}1L&rXi{BivR#L>P2-(ppDjk=FHh6iH(575Rt(3+c(K4HHrWV zAV2_sSHHJ#2lnz;E$=|Pnfwa0D@btNeuV`SHoRCdV#fVsLB{JBMlC3Y8wLabI}Ml7 AoB#j- literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/228.gif b/SRIP/Libraries/Exp1/Data/T3/images/228.gif new file mode 100755 index 0000000000000000000000000000000000000000..b38622c953ba41dc33b15691d4a36617bfe28dbf GIT binary patch literal 992 zcmV<610VcHNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QR009UbNU)&6g9sBUT*$DY!-o(fN=!)L z4XuCwjuF@>oi+n7^43hhh^m0YH{}|8zNsNFdh8b>{Z<`*l*{2SVXS zj!Zdm;3JIr>JqFnl91kkXGZ4uE6~}<1%v?@?uYnq1#bPkAt0P&B$~u#u{|J+17AN* Oi9y5#ow)SGfB-wxJKtyk literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/23.gif b/SRIP/Libraries/Exp1/Data/T3/images/23.gif new file mode 100755 index 0000000000000000000000000000000000000000..e87980016736b875292050467c63fcefcfd7ccaf GIT binary patch literal 988 zcmV<210(!LNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QN009UbNU)&6g9sBUT*$DY!-o(fN@Vx} zl0JW?CJq!6k69Q${ZLFakmp_@2moaC+c5D=zcvH$oSP^?T`B?sKX98Fk-#--5(WVV}O{3J~W6CIQzB$ahiT)5nFqP6EQk9 Kh(iw!2mm|80nu9k literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/241.gif b/SRIP/Libraries/Exp1/Data/T3/images/241.gif new file mode 100755 index 0000000000000000000000000000000000000000..85c94a43365b82f66b8f2e105ad535cbb49d8609 GIT binary patch literal 977 zcmV;?11|hWNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QC009UbNU)&6g9sBUT*$DY!-o(d@`wja zNCyHD3l}F_b9*Fws{|fr%dw(4c`35?Q}CQc_`q zM{GyPIQ`(kqfl0Rmj_vc>y%~%T=)4!T?MWPB~;!zjQtdSNRGCvE|D#0|Ed$rcui- literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/246.gif b/SRIP/Libraries/Exp1/Data/T3/images/246.gif new file mode 100755 index 0000000000000000000000000000000000000000..7dad7b57bb38a78cdcb476bdb2b11baf5a258db7 GIT binary patch literal 938 zcmV;b16BM-Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pw009UbNU)&6g9sBUT*$DY!-o(d0{KU= z;;)DTCsy3}4^YI4fIlUMS>$cev}CSNX&mgW_IMr(xFO@zj9*S z_^anbjUX`!y!q3p!-_dqDvc>rrBjAh2TF|?6XjNjU6+0}xiu`tpG7Mwt;rGR+NCaq MzMV_AZoz;6JJJxtbN~PV literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/248.gif b/SRIP/Libraries/Exp1/Data/T3/images/248.gif new file mode 100755 index 0000000000000000000000000000000000000000..2afb061d8afc677bcb4a489e17316f19919040f1 GIT binary patch literal 999 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QY009UbNU)&6g9sBUT*$DY!-o(fN=!%r z5u$DW{#_ABpa4WE`TCtZM21?l0RUk5dB}(!zd|1be&|I20E7z;ZOH4llAxUu5mEIs zC4eBFe6k|;>NlxiwSG#J_Nx>?pnyXBB2|Sbt6x7z7+47Hw?yKGL*=~Qi`Oq$f{6e? zFkzx(SU*p22|DpgB=0~_{lIDP3&29XetifNDAw;=2f_xt(jp9iN6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Ql009UbNU)&6g9sBUT*$DY!-o(b8i;d> zT(J`o38o0QFH@L&pE3eiAc>x;6apQQgOG8RJxm7%9`UCkBA0xQ3eH3lu^KuP1xwg_ z1Th9aX$RYdWAc#1ym>|ps`5up!oxxSh!rSk%b!0M4@b!J7p=m;4D-B#eYnJ{ye0z0 z`1|)2q5v=N{Pnx$DVx7z{={UwuEj9 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/266.gif b/SRIP/Libraries/Exp1/Data/T3/images/266.gif new file mode 100755 index 0000000000000000000000000000000000000000..54629ef4b20da3e96ee88c12dd476050bc57ece8 GIT binary patch literal 1013 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DY!-o(ff}qy# z-!v}~1=dKCqz^xS{rKI>rXpf3kRMTg^yUKM$$ruRp<;vXW4~E0LE;=(LMOyUAdywz z>GL57b|JY4TtKAgLmwg8`S|hbHk7ov)q$YxRaFpVz64RYi45SYYfUx#=;h8ft{@IzZ$AMfo4jY3X- j-V9|sH0~psh)CF_R7pv!k5px)v1uu`w(Z*u0|Ed$wm#`L literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/268.gif b/SRIP/Libraries/Exp1/Data/T3/images/268.gif new file mode 100755 index 0000000000000000000000000000000000000000..27123458a000377dbbd684c01e9bc593beb34fa9 GIT binary patch literal 985 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 No!fvO3>soU06T~*-a`NY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/283.gif b/SRIP/Libraries/Exp1/Data/T3/images/283.gif new file mode 100755 index 0000000000000000000000000000000000000000..97ee34b15f191db81482a31ff6ebed3b1d1271f3 GIT binary patch literal 980 zcmV;_11tPTNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QF009UbNU)&6g9sBUT*$DY!-o(fN}Ncs zB7g;VSo!n!&mTHFLL%z1*AL&Vleh5o+ZV>+13>zG1%W^if{=8e9Qx>2tpGwI92|N8 zcaKy8ivm?p>lf{c2&4%Rm0Ow2m4^)j1Xefz@jw_#(Bk#$XRMALcs(duFp`H8CwBeP zA_X8V?py%V{K-WsZJdC+(!|}R3+=9ndyDSY={Mx=P8xSv^n*NCvX#3IzPUjd5CA(~ Cs?_HI literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/286.gif b/SRIP/Libraries/Exp1/Data/T3/images/286.gif new file mode 100755 index 0000000000000000000000000000000000000000..629913376f8a753b0f95e04856471ed29606010e GIT binary patch literal 974 zcmV;<12OzZNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q9009UbNU)&6g9sBUT*$DY!-o(fN<=82 z3n_p9{1KW6pu(tr{pOwP7jNQ)XZ`9StMb89Nr`Lv-4in~j=m=_`|%=JpL^9^wYDrvc!M@JLuNhSpWb4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/296.gif b/SRIP/Libraries/Exp1/Data/T3/images/296.gif new file mode 100755 index 0000000000000000000000000000000000000000..671c36534d58923ae2d5cf7e7c01bb4fe3d7193d GIT binary patch literal 1021 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 NrW|k`O?q@d06T$s;L-p9 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/305.gif b/SRIP/Libraries/Exp1/Data/T3/images/305.gif new file mode 100755 index 0000000000000000000000000000000000000000..7a19ffd35471db836695416d83341197b7c3801e GIT binary patch literal 924 zcmV;N17rM0Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pi009UbNU)&6g9sBUT*$DY!-o(fN}L$6 zLnCqj{;BFP(Tb{n#u{0%qEX^URXGOc_?I$b$$@gjHJW%*)yItDC^oXG%1Vb0FDVkt yD6}Baq63d21@JHDQl>MPlC<)4>Qg!YI4(8z?KOon9LT1OPi$?7SEN literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/313.gif b/SRIP/Libraries/Exp1/Data/T3/images/313.gif new file mode 100755 index 0000000000000000000000000000000000000000..5c70fe987bec32f7cb4238495448209abf230b9d GIT binary patch literal 1014 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 N04RS3Osy literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/32.gif b/SRIP/Libraries/Exp1/Data/T3/images/32.gif new file mode 100755 index 0000000000000000000000000000000000000000..22882a11cc07aea5e83e239b7cd74e95b9b42480 GIT binary patch literal 1003 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qc009UbNU)&6g9sBUT*$DY!-o(fs?bF1 zA1pg|AVeJKsGrA=?9OZiFwP^hSSaWH8d(yX1%VgFxdT%nV##I#Bk=jC%4R=xJ|raj zxKE4Ej~}~xKaV06XLH;M4#B literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/320.gif b/SRIP/Libraries/Exp1/Data/T3/images/320.gif new file mode 100755 index 0000000000000000000000000000000000000000..255659523ad59bf93fcf9cc54063bd3b3f239dc1 GIT binary patch literal 999 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/334.gif b/SRIP/Libraries/Exp1/Data/T3/images/334.gif new file mode 100755 index 0000000000000000000000000000000000000000..ffa9d6d7cddd3dfb75756ab1989ce74e0a087376 GIT binary patch literal 1043 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/34.gif b/SRIP/Libraries/Exp1/Data/T3/images/34.gif new file mode 100755 index 0000000000000000000000000000000000000000..7f06e214bfb4938a29304b94c0b6759253bdd26e GIT binary patch literal 988 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 GKma??yYOrP literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/345.gif b/SRIP/Libraries/Exp1/Data/T3/images/345.gif new file mode 100755 index 0000000000000000000000000000000000000000..2115d4780d7a417487e9cacff0651bf7d249f383 GIT binary patch literal 945 zcmV;i15W%$Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P%009UbNU)&6g9sBUT*$DY!-o(fN=(>6 z&cA=+I!qKON8CSEsv2pWsOq1wksARR``73o$cHPf9JKOJj>8-#5qf-B(%8(J4=w(a zIj}<`j1W6qG%2T1$%{52(p*aQAIgVDRf$t&^J2<^UcU|uD^}&dvI0w@1yGWx*pgRM TUUd7_qbjtGGOpdrFdzUsbri&p literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/347.gif b/SRIP/Libraries/Exp1/Data/T3/images/347.gif new file mode 100755 index 0000000000000000000000000000000000000000..30e4b05fbfa126ac622be3f0b4f90804e27d2a4f GIT binary patch literal 1015 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qo009UbNU)&6g9sBUT*$DY!-o(f0zg6N z-#sJ}2Rg{Z&YwqVO)@$F=8qmDG#xc%MBYu7^H0a6}EMbzNVAFTuk40-g&Mq(O|;=*lxr$8ct8-0kKbC<}Uw~PcU zn9$&l3*3Tj72O?}VII2%dj*Q|hb}OH4c+$jc_<{x0fTD%0fV@w->(P+O~m8JBx0m~ l>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qw009UbNU)&6g9sBUT*$DY!-oflw4(Ki z1Vn>W=Jngi4Z}r&8(InTw{c^Yk2bJv^j8hqMn)Goa4VTjL$ZxEAQA{x(q5V?8^dXU z2%{u5H81LIbaAn0zimTs+}qeEz{L#a`kismjHJ2-9|5rH7fez=fA4sN1#sY*zqkK5 ztrZxkq`zJ()&>A&x1YEqVWpG|XKW)m6c-b;+PLjVff^fq4SgtRBfcvKSQIMx0^+)j tw7@tcxsjIxh%4lkJloG)p#>jxtxi_Q!rB6ZXaOQKx3}-#z!e4r06Xu6<`Vz_ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/351.gif b/SRIP/Libraries/Exp1/Data/T3/images/351.gif new file mode 100755 index 0000000000000000000000000000000000000000..e8cf15896db4c3453c443b50dd397d383a0a7515 GIT binary patch literal 998 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QX009UbNU)&6g9sBUT*$DY!-o(fN z*UUmedHilbEX8jS!2y!?>7%ifACQ3t#(m{t%cfLM&Ow Uo%ty%>9~L*ei$aJo){1SJBMT8`Tzg` literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/353.gif b/SRIP/Libraries/Exp1/Data/T3/images/353.gif new file mode 100755 index 0000000000000000000000000000000000000000..d0215c28aab83e12f612df0a1e69fcbfa79dfa51 GIT binary patch literal 1073 zcmV-11kU?MNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R7009UbNU)&6g9sBUT*$DY!-oS?h)CtH z-=7fIZe@GB4 z0LY)Chj0416JZe4z9kQV^}7V%P%a|^TbvvAkjA-w_DUR&4WdfUn8DccwhICV)m1ZZZ$G>UW9^77ixUt6$GveLw&^0r~{V literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/363.gif b/SRIP/Libraries/Exp1/Data/T3/images/363.gif new file mode 100755 index 0000000000000000000000000000000000000000..dd35e8f50b6ea1bf46c64f6fae7170a50844314f GIT binary patch literal 982 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/375.gif b/SRIP/Libraries/Exp1/Data/T3/images/375.gif new file mode 100755 index 0000000000000000000000000000000000000000..f81849432201da48469bbbd449f9355865a1d603 GIT binary patch literal 986 zcmV<0110=NNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QL009UbNU)&6g9sBUT*$DY!-o(fN<2ux zP``e83``VwArQZh{oqB}c;+KWer_gOc=j>gi4$P7+>luE<1&H1?geuY5t&If0JP-$ zXsPGNbRhubF`3IKKY2wqFk>1qm`OkO`kCxS0OAmn_K0aUDFh-3Zx=8AOWUt3L_sF` z^&3Vuq5(TuJbBX4>Ek#R8wVEq*fg*}M}!Rvg!l1^VgQsr)_A-|@?$gl_)UH+PV?i> I5CZ}LJN&5CMgRZ+ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/384.gif b/SRIP/Libraries/Exp1/Data/T3/images/384.gif new file mode 100755 index 0000000000000000000000000000000000000000..43db620a1f63e507818b91894c9581780cfaf56f GIT binary patch literal 1004 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qd009UbNU)&6g9sBUT*$DY!-o(fN>tbY z**|~6giHiL;0CyUAp6NPB2fUKe(^|2k)p4kGl?hVRT+rHB}5R4_SKt0kb%vIiu&zy zQt(tid~qE9+1Ia0!5vKd<#N~yqzDTHFks*_59GKH4poJ$_bOyaT@Nh;Gy6`MFns-* zZGc!|hus}504Ra0X5+vP(fS>W;8$QSkVgswz{9VfuK|TmcDPq=0suQDzuyl4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/387.gif b/SRIP/Libraries/Exp1/Data/T3/images/387.gif new file mode 100755 index 0000000000000000000000000000000000000000..ae095af035f7431f9bda4b37341388c052f30b5d GIT binary patch literal 1057 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 OoIA^t5xVrmfB-vgY1_I0 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/394.gif b/SRIP/Libraries/Exp1/Data/T3/images/394.gif new file mode 100755 index 0000000000000000000000000000000000000000..792ee6d42cd248c5011644a027366c2b4f86d613 GIT binary patch literal 942 zcmV;f15x}(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P!009UbNU)&6g9sBUT*$DY!-o(f4g^H; z*S~*&Bm%H_vExM`4}bjv(D7GBk{BOe1OVvYNP$2;I*j?xAkCUHWlp^KQl-m*9D9cR z2qdURlpaAI^(a&#$CO7|dOWF-BgK_fWwyi_k>*K@R3Fk*x;3oBtpc|;J$v!0PNz(j Q9xW?3s@=PI4F&`NJEr`=YXATM literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/405.gif b/SRIP/Libraries/Exp1/Data/T3/images/405.gif new file mode 100755 index 0000000000000000000000000000000000000000..6825edee2dbc54964ffe8d6f4866d23352934e35 GIT binary patch literal 1072 zcmV-01kd|NNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R7009UbNU)&6g9sBUT*$DY!-o(Z7Wg2@ z+rNLBtV9GLU_qIF^y0;%*RL8PDh&fn;1UVhgf}4shRD{hpQeTkgm9;3KXNwI z4y59?U#_1URmfQ6>DRA#{fNndm|#-3N*)Ggk!SNEg=YO)8I)rakAsGO`rV3PFao$- z?IbXSz;4{qgEaf;VHl(ztc0s-He&dwA2+WD9o3AvkV{Q&SPF`WrmtV81q=n4$>m9( qB{6ciK{6%`g178e&67#J8C85tTH8XFrM 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/420.gif b/SRIP/Libraries/Exp1/Data/T3/images/420.gif new file mode 100755 index 0000000000000000000000000000000000000000..a1c439f08a92f92877dbdd194b053e2b02d039da GIT binary patch literal 996 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QV009UbNU)&6g9sBUT*$DY!-o(fN?gdm z*uQ`0%uEEJAOkvZvC7pOH$vhOVf}IpRMqbgL@va%q+5uTGa z613Paid=z<{_P`n7XSo${>t^8FsvUxKz;x4+|)M%xqjL@^u5KC%UukF?)97YQ?4AI S(=zlG(yyA7zNk?L1OPk68Q+uu literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/424.gif b/SRIP/Libraries/Exp1/Data/T3/images/424.gif new file mode 100755 index 0000000000000000000000000000000000000000..c4cab7876e8a2c6ed2740e1a7018a8a43c806c18 GIT binary patch literal 989 zcmV<310wuKNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QO009UbNU)&6g9sBUT*$DY!-o(fN?e#C zQM+Y>AWQ^M;Y~PyApOm=A<=_2f7wb+@zu{?mWUs+`SV3#ARw0!EBUkMgP;wZ4+HJv z_k>`Xc;pm7gyt_FK^gA+k&4*JA3sM#*f?q@Qep_1AwyD{7{bu7Ja_#4dnI7wKrkTH zxD^ORo7!UwE5yRF1 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/425.gif b/SRIP/Libraries/Exp1/Data/T3/images/425.gif new file mode 100755 index 0000000000000000000000000000000000000000..1f1956c0c50eeaee4c1c688406b598ebd2634a67 GIT binary patch literal 979 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 JpdAJT06U<<)t~?X literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/435.gif b/SRIP/Libraries/Exp1/Data/T3/images/435.gif new file mode 100755 index 0000000000000000000000000000000000000000..91ad37071e712496f2dfae800d3dae25ec164706 GIT binary patch literal 1003 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qc009UbNU)&6g9sBUT*$DY!-o(fN-Vgb z&A4xyWKDxIKq8N4<*E$qV671Zh!nEXD^c*lElUt9`Ll9RLpLlAEx2QrP?al(B<_Xj znQw_ha3T+OsOOK4!)ta9O0nn9-wub9$T=`Lf?ZV;4o8er_JW{~Wzx!>d+@LWC4RKZ zl<9M?lLCCABnIIG%^Nf*07UFlG*O^}fkymAElkkJKOc-6`-2==U}DOZ9RsOs*&ij& Z02)NYhsDXB$`n-P3nv1!>xBUU06Ta2+y?*v literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/44.gif b/SRIP/Libraries/Exp1/Data/T3/images/44.gif new file mode 100755 index 0000000000000000000000000000000000000000..ff6771d8745ebba6d7551753b68b42ca3fb81c93 GIT binary patch literal 967 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/442.gif b/SRIP/Libraries/Exp1/Data/T3/images/442.gif new file mode 100755 index 0000000000000000000000000000000000000000..ff3e0153d84aa99aa5ade67ac0f759ac558a440f GIT binary patch literal 985 zcmV;~119`ONk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QK009UbNU)&6g9sBUT*$DY!-o(fN>u3M z*S~&=9!wN?haJCX9zjh!;7Hv#K>%1N8y7($D1PH)4AjEULPRzF_&p(Lgx`{gbS@Sl z7^R=Dh$_(WGm`+oix=eh0g-rvA3tKa`gMZ|L1KX+poF2CW>w@y00{(G;n!`%*?|{v zy%lJoA3ZU10Z8iSDlZd!{kY_X#BZL=w=vT7t1&l0F@ERr3bLvuZzz7S2w3KaBd_PP H0RaFza=Fx@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/446.gif b/SRIP/Libraries/Exp1/Data/T3/images/446.gif new file mode 100755 index 0000000000000000000000000000000000000000..547f2f60bd5cae92f391e22e95dbaaab14e49e1f GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-o(f0sxZ7 zKpRp0G?|b{1ed*j@b>W=>FoqWEAvK1JEK9-t&v?Gx`4+IA1f{c7ZBqo>YyS$-PW zYH8H3?!SI6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-o(d3aAmQ z-@ksMDnuNJf*(I&O)|wRwoxD{eqsy=gyJcYg@_2!VH!X%z!VJ;ZdKMLFY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/46.gif b/SRIP/Libraries/Exp1/Data/T3/images/46.gif new file mode 100755 index 0000000000000000000000000000000000000000..693547ff14950a280977eea97e077e5d91f46030 GIT binary patch literal 1007 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/47.gif b/SRIP/Libraries/Exp1/Data/T3/images/47.gif new file mode 100755 index 0000000000000000000000000000000000000000..fbccab9426608907a86970f7cab61cbe8bf61a7d GIT binary patch literal 1033 zcmV+k1orz!Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q)009UbNU)&6g9sBUT*$DY!-o(d3c$3i zRwEq|A{Io!>K-q2>PBdcAf?PBe)Wco2xkpq0YdHk$&@({iZpy89gf;JZOsJ|c;ML+ zqwUed7yC>Vgs`F)wG0nY=(Fa4paM$z#zaiyPu&><0yTxJqHzF=Vg7Jo2(&JzMuBDE z$rSRoAS;<{>IxK~sh=2M{?O>%;%^Xu2GqgKcUqZWVLzzQVe?~TSk z{^$_AfX~loe?JJu;Ac7_AAFDnnmFaJjK&V>rp=ji$R9mHb&ar_*~*08-S literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/470.gif b/SRIP/Libraries/Exp1/Data/T3/images/470.gif new file mode 100755 index 0000000000000000000000000000000000000000..e9914542db0d71d8ccbc59e78b23ac9af980d7b7 GIT binary patch literal 1049 zcmV+!1m^okNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q~009UbNU)&6g9sBUT*$DY!-o(f5)>h# z!axBc=ty~(V#p|e{k~NZXry01Q4WK(GYPUEDF90JnGC`30kMAi&KX*8W}UER_vQgp zAYkE-Z~exN8VJawNlp!)>@(SdpdzPY3NRe7jGwj^MFpmCm+zYetqkY%yHyYiNKFta zttF_V-alq29zGD&57-HThtBm2hasW|TmEe2SmcjhD~SSu*mK&i)&s}_hdFJ<05bp| z`J9qtf%(Cze(^rROKL$PgF*eC1p=_fWE6=jOuk|;2A0WK5}i?Y%58(hK9t45;uHaL Th)0hKg|O(ky7lV_0|Ed$WAX8) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/472.gif b/SRIP/Libraries/Exp1/Data/T3/images/472.gif new file mode 100755 index 0000000000000000000000000000000000000000..32e8e18ddce8cd8a7efc22a036c27f51bbe31981 GIT binary patch literal 986 zcmV<0110=NNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QL009UbNU)&6g9sBUT*$DY!-o(fN?e#C zPB4G{FnO2=V9&gM{6O|&HE|C{dV0)=!YI*Wzf~v%Is!QgqRD=vC=7IjQQgLdDLx9) zDNxEckXsZujMLBGpczmJS!+u2A)Js{Me<{%^kD@v>Z&bUMkt-XY8*W%O_7dYx+5G1 z-gFeV=tpWqIZDBJt1f^Fw)#=);TKcWOMdsXt@e{67qgdA)Md+$apHgdeE1D2IIrK& IbprwbJ5B7?9{>OV literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/483.gif b/SRIP/Libraries/Exp1/Data/T3/images/483.gif new file mode 100755 index 0000000000000000000000000000000000000000..7fc548134e5763a1f50b798e3840cbaf0977467f GIT binary patch literal 990 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 Z1)zERjCX)1a~AvpD3gqZ>em4Q06U_I;c5T? literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/49.gif b/SRIP/Libraries/Exp1/Data/T3/images/49.gif new file mode 100755 index 0000000000000000000000000000000000000000..84bbaeae79302672de05ebca8da879881114297f GIT binary patch literal 973 zcmV;;12X(aNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q8009UbNU)&6g9sBUT*$DY!-o(Z%82%l z)q{uyVX*UekDn5Z1l#y)_n{KJ4zdR`ctZex*=1iBIVv_OK%ZfCA;x2+T z@X4P)VyXO%iD^KFj0{@*{VEW1U;Gd?K_=Q}jb9)VqT+%SQGmrUfBO2Zqfk{q9eMubq@7F|Vn6^p*@)9o literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/5.gif b/SRIP/Libraries/Exp1/Data/T3/images/5.gif new file mode 100755 index 0000000000000000000000000000000000000000..b6dcd961459db364321b506f29d63a343a0cdf08 GIT binary patch literal 999 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QY009UbNU)&6g9sBUT*$DY!-o(fN}MS1 z1|@0z`o+0I>4wBB==k;PC5@j*R1gW|kjKwgkOB;BiKGJ&jLBOL1adJMuEIk?{rE}B zDe#)fClCGfy9XKg5L9EKb}aFl55o_~Bp-z-BKM Vj2+6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q;009UbNU)&6g9sBUT*$DY!-oY6+@RHO zQ4fd_sqov_kDVQi1Fvix_N0ieYZXAQ=*KTt2Z1u`fCTV^WuBP@>HI^drQie%7{VxG z(SRYUe&3vkXr#P8lXe&Zs{j1X-jFBjeT$pon(GO`~967lOb(}}l! zfCTQj8yMmPS^O9w5a?**4~#|*6Eb4Nkve{;Kww-DYU9(5urhRx%x_*V8xHm=U(URF H!hirfO9k!C literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/502.gif b/SRIP/Libraries/Exp1/Data/T3/images/502.gif new file mode 100755 index 0000000000000000000000000000000000000000..df16774d068b2e075b09c20fa01eba0f19284887 GIT binary patch literal 999 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QY009UbNU)&6g9sBUT*$DY!-o(fN}Nd1 z#;Je){K1POKq3Ju;ry8^7fhSK91_uFtkn^K0&9&T-Z)3kM}&b1rqv<@ z_l&1QEcsL^5U3$hyLh!cK>Xt`Qk71ni237(Mk0`Q`uyd~c&`pc05gpET;~SD*#n~d zF=KHSz=gP`+}7RXFP4eA0!Zlt7NTweMsiow1pvz5wG(wC?8(RM@7qiMWKF1R;Elgh V4;CZw$7sM}6Yu)8T+BKk06X7Z;>rL3 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/504.gif b/SRIP/Libraries/Exp1/Data/T3/images/504.gif new file mode 100755 index 0000000000000000000000000000000000000000..9bf698926075853633b0826bb5b637a289f7a8cb GIT binary patch literal 1021 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 N)aTHnOIH{W06VqL@5%rG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/521.gif b/SRIP/Libraries/Exp1/Data/T3/images/521.gif new file mode 100755 index 0000000000000000000000000000000000000000..d0bd438325ed5876b192f8b4ba562e56edb34e9c GIT binary patch literal 1005 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qe009UbNU)&6g9sBUT*$DY!-o(fN<27% zlRba`{P}aoNumyP{X)i*7qXv3T_NF-@jzlw$cRk*g$yy!0JnY+Aja&csQ^K0{lq}b z^DiHdg6sUD!{Cs>F@Na_9$44U-wB5(s@|hAP|2~7>ozzXAW7yub?VmXD@hCD1(_w` zh7{`75j&0Ah$zxHX5xkuCmtx67V^PFf)qmLI!y3QNJfkY+6k#6vcPK^D@T@buiv%= bmUn~{C&6-TCV{M93d^u31_S^*O?%>n literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/526.gif b/SRIP/Libraries/Exp1/Data/T3/images/526.gif new file mode 100755 index 0000000000000000000000000000000000000000..396b1907b2426e835ee86abd9debad24d755953f GIT binary patch literal 1010 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qj009UbNU)&6g9sBUT*$DY!-o(fN}Nb> zhc15@FHAfz0+_#kAp41tcpw!>f7sSI>UZeC69Wo~31poj5 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/529.gif b/SRIP/Libraries/Exp1/Data/T3/images/529.gif new file mode 100755 index 0000000000000000000000000000000000000000..dff14f17b026f8bdacadec9015407f5e7f27bda2 GIT binary patch literal 1009 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 wxCOxF6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qu009UbNU)&6g9sBUT*$DY!-o(fN<=ti z%Oign{r&S-45ABK_WI##XU|=~e)MiVtYPltt}z7$={c$AAq;T+)*Z0`K){`o{c1Wa z*00=-fmu!#3-se5(P}aZ05AftA2v7f0z2K3}80}}yE5R(Y#H56$D z3Mq?k6@;{N^$~(puiq!U{Z@u+S0}90R%y6N0!MvSb++Bd+h?0RaFzluP2F literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/540.gif b/SRIP/Libraries/Exp1/Data/T3/images/540.gif new file mode 100755 index 0000000000000000000000000000000000000000..8b73d59c61584cf5b5e885bd608550939783b392 GIT binary patch literal 1055 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 f_Hf(hAj>B{VFGdbVL$*osLSAh literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/551.gif b/SRIP/Libraries/Exp1/Data/T3/images/551.gif new file mode 100755 index 0000000000000000000000000000000000000000..4894986116a96363c8d8531fae464e8eecb831d5 GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-o(fN=&%p z(LY#aAWQ@>pinw~{rK@Kwo#18Xk1wMF*osrJbtna2!vtJOT-4O_|3~gP+K}45OIjq zLvVyQe(54O3;>E>y95IfXcEbl$iQ6Nn_Vn6^p!V%jx literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/56.gif b/SRIP/Libraries/Exp1/Data/T3/images/56.gif new file mode 100755 index 0000000000000000000000000000000000000000..8c59a0a6560a030aa4650283d8f53b6b7c2e78a4 GIT binary patch literal 1025 zcmV+c1pfO+Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qy009UbNU)&6g9sBUT*$DY!-o(fN>tcE zkf3n?{VllT@i+)%9~yhm>^ofPI{Wy@=6J^(n7$t1lb4lDID zCt_fclTRKB?bbjb2TmqosdV^*UB6cj0O&GFtSQ7JC0)rlRJz$PZy zEpZEAK`4`#=qe~vHk~KBgG#nCp(~f$KJEI+$y#`#4|n}wHLWnsaKr`h`iYxbsvjbW ve)`QTA~1}-aU>)n>L&{h9AWtSF`2mfWIsm(CO$B^E>H^rbb|{Y7!UwEmGI$@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/560.gif b/SRIP/Libraries/Exp1/Data/T3/images/560.gif new file mode 100755 index 0000000000000000000000000000000000000000..25f57599d1600331636e69295b30e238ef596f8c GIT binary patch literal 1053 zcmV+&1mgQgNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R3009UbNU)&6g9sBUT*$DY!-okGq_~9Z zpT9N*APO`PrkFo}`^xF_*F$5DRUgL*ia}+azh4gt+&Sm3TZ{()R-p4&%Y(xTu>6HH zghAjGcK#SOcv!{Xv>F4?g!4yd07PH-k_a3SXy3j%0yL7!cLczPUH-1M&?qpBzhZ7^ z>bk&IAO~h2{q>?y*Y2#mqzLq#pvqsiDY^U=syiXgzHK)EB>0oB14IFJ;`sx%K_Cfj zQje4(sDcu`EAm4_{M`b#!K&YgE3wLXND*Wb6^gA72F(Ytpg;SfInE1r+e XQnm$pv})C7%Ywexvuoe3F(3dtZ#w*0 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/567.gif b/SRIP/Libraries/Exp1/Data/T3/images/567.gif new file mode 100755 index 0000000000000000000000000000000000000000..107f72104514de5111bf7323b49539b4e4512494 GIT binary patch literal 985 zcmV;~119`ONk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QK009UbNU)&6g9sBUT*$DY!-o(fN=z7r z+&_Qu@Jtk#C||l`bE?(rF|i9iV=)BA==V&b32^#~3@p*FpTtr9E)k?@6XJ${+8Pkl zZJfg3kqoe-v2z2n}Tt9t2B2u^)PZKR|_-r*>H!;nJs$SZ;al7>)L(z3!nx*Y#|6I@i$j-KXgP0-|4rEFaVqy36Dy5!LnzF H0RaFz_+i+t literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/572.gif b/SRIP/Libraries/Exp1/Data/T3/images/572.gif new file mode 100755 index 0000000000000000000000000000000000000000..f79bb9ba3d2afb9dd5f1c8ec45e68e824a4e2c1a GIT binary patch literal 1035 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/581.gif b/SRIP/Libraries/Exp1/Data/T3/images/581.gif new file mode 100755 index 0000000000000000000000000000000000000000..ba7f30002197cc6e9782c213fb2149abe5030013 GIT binary patch literal 999 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QY009UbNU)&6g9sBUT*$DY!-o(fN>te3 zMj~KKCJr>v%b!Pmh$e0bqDx+>DN|O}t0K{pzj-VLlJfT~A{2b~rV!NUuT(^F{GJeW z=8v3$hXNw?BP6iEig5e<_0#DPi9cZl2C(Sn&(IHj;UHQq)gqO@da)iL=@<5)RgeC% zeGy3PUonUgHpPl%%ECZ&{?=$D7-b*52!jWL>6&<88Gn2l3$zAV@(g(XTu64}vA|}J VR16ciK{6%`g178e&67#J8C85tTH8XFrM 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/596.gif b/SRIP/Libraries/Exp1/Data/T3/images/596.gif new file mode 100755 index 0000000000000000000000000000000000000000..be8d9aa7187d8fc41eb4ccfc28c07010b841dbf8 GIT binary patch literal 990 zcmV<410noJNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QP009UbNU)&6g9sBUT*$DY!-o(fN}Nb> z2q0?y{3S~<@c@~8|Jbqf_iu;91+)CIgX4jhzd#8hW@smmj)McT{B<%QahJb80x9^r zm84FAi0jr31mVwHzI`%~zT2^b%Cn3=CF;WJPn9r#iJuAl&y?*`V`%b(GFjiyE4-0I~+GgI)7X4QrM<1a@-8m@D;fW;Mii$ MH~7ur%sC(cJJ#XibN~PV literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/601.gif b/SRIP/Libraries/Exp1/Data/T3/images/601.gif new file mode 100755 index 0000000000000000000000000000000000000000..0ab8ad462f1428b156d1b430f57ce9d961e7f5dd GIT binary patch literal 969 zcmV;)12+6eNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q4009UbNU)&6g9sBUT*$DY!-o(fN}MPW zf~tT1wlSaxpo2Sq{Oa{{L@~ohb4vh-8b+~|ziSNuP?)Ao!9-&4JO~8hFW&`;6X10M zP~c5Hf1f65@W&_2FMm*BOf&!us?~cLC|0qDZxR`Q$2bBYaRPt~e|E$U^x-drT7j+T rZFrlYo36J2RQNN4*N(pucqjeE8*SPE!kh2{h}K7OEhCB_1_S^*Kn%+R literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/602.gif b/SRIP/Libraries/Exp1/Data/T3/images/602.gif new file mode 100755 index 0000000000000000000000000000000000000000..ea68ced6968d3606da15bc3085b95281c09cc8fd GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-o(fN@UnU zk~x3uh)e_k0gJeP&?w!@w$V+$ZhHi-={H1T9)Go33@k9MTuX-p(%?HLf#3pO|8PA- z5wBUn3CsHJyUB2YwRbZJzOdG>ADf31`bi>~1YFe~5FN04ML~uqVgA;Id13(K0#^6> z`Ky|(=f)*wo||-ZtR^ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/603.gif b/SRIP/Libraries/Exp1/Data/T3/images/603.gif new file mode 100755 index 0000000000000000000000000000000000000000..da2dec74281ce0bacd147adfcc3b963c7a46dc4b GIT binary patch literal 1041 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 B?9%`M literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/622.gif b/SRIP/Libraries/Exp1/Data/T3/images/622.gif new file mode 100755 index 0000000000000000000000000000000000000000..e296d19ecb4a825a318b05ae2931a279a7faf423 GIT binary patch literal 1006 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qf009UbNU)&6g9sBUT*$DY!-o(fN@S=b zNst{%SKnkn)^~-1Gp_G2`8dQ)`$eh2Dupk2Jmkyb^e)W`bYWV@8kCI=7 zr3isjXGA1hxEuh`BB+FgHwY+HGq2wirwachNXTKGzDpSg8Zf0VPvn8B`r)}O(9XYB coB6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qu009UbNU)&6g9sBUT*$DY!-o(fN}NcM zpcgf2h)g8W16Q;$&&* zP+*`5ogxu75HhYGy=F>aAT;C>p&F6Bs3?SBtm?sFBJZu)LRO2GEoQfTi{}y?CSwDWK6jZcetmUbS r05%Nk=WmndifsC=6E(Ral6(EofCkV3cDul!GeFxEW43SK0RaFzFU#jy literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/628.gif b/SRIP/Libraries/Exp1/Data/T3/images/628.gif new file mode 100755 index 0000000000000000000000000000000000000000..298ae60d6346ef41a8fe34037d7c3c587b495720 GIT binary patch literal 1030 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 p5Hh?L*k;_#yLZBX06W$!>O=ql literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/632.gif b/SRIP/Libraries/Exp1/Data/T3/images/632.gif new file mode 100755 index 0000000000000000000000000000000000000000..8c8a147dedc7899430ac65475361330946812315 GIT binary patch literal 1017 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qq009UbNU)&6g9sBUT*$DY!-o(fN^EH0 z6E%O{ZcGHA;E=d}{oeI!W|G}1?pjbH!?2=xmm=W>cx n{h(R6JVI2zYceh;K-BM6j>`Z<*yA+-HUKg1EZg4AJ0Ji%=;7sV literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/642.gif b/SRIP/Libraries/Exp1/Data/T3/images/642.gif new file mode 100755 index 0000000000000000000000000000000000000000..73ed9217fa36c1676218692516b04032f48f7065 GIT binary patch literal 986 zcmV<0110=NNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QL009UbNU)&6g9sBUT*$DY!-o(fN@Q5Z zR6QRP2WH5{uU|hs83Am#=Fj8Dj0&ptYv;pVzaw%wNNnS=3KM<(;`QqjQG`5xfH0gh z32sBgO#PZEU}v&lkBA%K^&_UMq{mnbA}X+D(kd|v6I&?rSQ1@?kN`^f`-hGJ+6BV; z`D20hKq-$-0)#|hsNX&}XaRufrw>lx81?e83XDNlKUskRWa-DPLF8rZW<&;XYS!k@ Ikplt%JBDA^SpWb4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/686.gif b/SRIP/Libraries/Exp1/Data/T3/images/686.gif new file mode 100755 index 0000000000000000000000000000000000000000..24ed62c500b1cbb4eab7fe0342b9f5dbe0a802bb GIT binary patch literal 1003 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 KlS5Ao2mm|&vfADN literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/695.gif b/SRIP/Libraries/Exp1/Data/T3/images/695.gif new file mode 100755 index 0000000000000000000000000000000000000000..493fcd7f736440acaf2f40137e3e9b3a5f403f16 GIT binary patch literal 1014 zcmV`Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qn009UbNU)&6g9sBUT*$DY!-o(bmQXRU zguhV{0g&)Suii2W0C4mZl`&pFScK%UvH+-GrHuZhApmgV+MQ(eQe^C=t%1Na_xdTz z2tbX$KLh3Xi$%0RHhN|NKtR@y2T=fo`kjlBq#v}IL>cJnm&{VWDpv)Pu+`6>v9tpZ z)cSXA0bGG^{PkOP7eFn4@bIO9Yr~ztEBfS_NZUqefjs?$rFG+v4*-k)(gy2y;&Q)! kX^-`DkRnpQXPWzMGuO{ukF+L)`Ab(xXW!enGX?|zJ5GY^nE(I) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/705.gif b/SRIP/Libraries/Exp1/Data/T3/images/705.gif new file mode 100755 index 0000000000000000000000000000000000000000..12fccab575cc79a482fd53cd7b6b88c432240c8b GIT binary patch literal 1077 zcmV-51j_qINk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R7009UbNU)&6g9sBUT*$DY!-o(fN}MRs zz?L_3qDfoSU?P@m{X+Kh*AGv`6xQtZTW1K+5_$dLAZSIa;f!Sc!r_4cz{og%sdy+O z$#4d`e%($8yn*lA6&~wG_FIVMXt)vsBLo3pC7r*o+!WGC*Dsoaf&&ck>*ubYy)6k5 zcqP`M;DuZL=w(^t51K+i{k(}ND5csySUiRGtCa8pxqgHQ5)egi93z24^zo~Uu#vxB z9R(&iN@~PFTK-5W{MRoFfCWS5sFZ?$;4FWm6p}oaYFtQpYy=RDP_CaCg~Psn-4@7$ v!4dt~g-{p)lalKP5OV5AiDJQ3CA||9)Y8w{1@QtG%yKjUz5DkQ0|Ed$2(|@> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/706.gif b/SRIP/Libraries/Exp1/Data/T3/images/706.gif new file mode 100755 index 0000000000000000000000000000000000000000..616b397256cf8ea5d77657f0e6949e8fb39b262b GIT binary patch literal 1021 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 I8v_CWJ5<}(;s5{u literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/709.gif b/SRIP/Libraries/Exp1/Data/T3/images/709.gif new file mode 100755 index 0000000000000000000000000000000000000000..091920e1911e0d135ccfbb864f4260feee384503 GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-o(f0vSfk zM8twKeC6xs?;DSc0;Qbm2ajXFbtpiN$_HnJjW_*fnNewMV3K}+Kmr(bZGpff{(k9v z)DMe5Sn-DFToBG1jzazz=@e*4U%!6D2uu}->FTosTLI|u=kMROA5+ih%V)|^K5z_l zM(Wo~U>bbU*zLa2tZ{1V` Xr11Icr!Pxb8oiRO3Cp_m)_?#z-~r>@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/721.gif b/SRIP/Libraries/Exp1/Data/T3/images/721.gif new file mode 100755 index 0000000000000000000000000000000000000000..cdb58db3e3de548a12a9feb43de198c0be9928db GIT binary patch literal 974 zcmV;<12OzZNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q9009UbNU)&6g9sBUT*$DY!-o(d4mcDp z+>?j|3HbQcub;n47ze)TXOG#nenKX!seo}%KSK)0tr{S!UmT1nz`--sZ^fQ|!ls1e z)3H$jZQwYB1b|>yzf67lF-Hm*cdOl3eW}`A7kFu0dxb+5u;(vvNK^jgT`)_za>#%HI}aVyLjV8( literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/726.gif b/SRIP/Libraries/Exp1/Data/T3/images/726.gif new file mode 100755 index 0000000000000000000000000000000000000000..34836f860f3d7fab1bfd5d4227e3dbe996e6f101 GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-o(f4(vgx zUcY{?7Dz-;rBy$EoeI6{Cnh3-R{Z$&OEv+3r+)U(HF3CLRZ4MyDi|=t>?1!a4p*eK zr2+sHXDL5QauD<)6)2`I_S0r*14NjTGG#BhHu?QZNo%czcKmE%1!}fR${mZ>O1h{bYCpyjeen~A=3}x7 fYc=zu_pyWAQE%sEIw02pyOez7%AQSIVL$*oM$6=V literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/727.gif b/SRIP/Libraries/Exp1/Data/T3/images/727.gif new file mode 100755 index 0000000000000000000000000000000000000000..3b8d58e4681201e6e43757b32ed794480dbf0ec1 GIT binary patch literal 1026 zcmV+d1pWI*Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qz009UbNU)&6g9sBUT*$DY!-o(d4#<#* zpFdtu97F^FB9S+6=5itPw<_3pO?tr5NsSk?A<^U w>>`E56ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-o(fN?f=g z$EJ7w{^1fK(ZH2#{rct87gAJ23#mft%M#;{y?((U8e!JYp0yeSKZt6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q`009UbNU)&6g9sBUT*$DY!-o(fN)(s? zRlkeL4lhOmghkVd47dz4vI(tpS?p01YVFW@zBY5nlz2#9g%^myC}o4n8?D> PTYltP?43>>KtKRHo^tgG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/737.gif b/SRIP/Libraries/Exp1/Data/T3/images/737.gif new file mode 100755 index 0000000000000000000000000000000000000000..3fc7ed84b559e7025fb0441ba82fbf556f743d13 GIT binary patch literal 963 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 F06S97@LB)> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/759.gif b/SRIP/Libraries/Exp1/Data/T3/images/759.gif new file mode 100755 index 0000000000000000000000000000000000000000..ce697dda0c7c9fd090f65ab327905ece7607ff40 GIT binary patch literal 1049 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 bi{p$0ZCErv(iBajo+zVTqrjCD1_S^*^Gw;8 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/767.gif b/SRIP/Libraries/Exp1/Data/T3/images/767.gif new file mode 100755 index 0000000000000000000000000000000000000000..1533d17dd49611cbfe1cfc11539b72f572cac081 GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-o(bPRUcO z-@kr^eB}WFu}U+1{6h8%8S}Cd8OeV4GMw#EkDoj#VMaze>n7wafsFX^Y7h}fJbrV&0?3ebNkmy8jShsz@7xK9 yz(T?zu{mT7h#s1Slm`k_sC%X(awy~uHouYl@X27y#LsPh%B0L4PQ3WQfB-uRQS37S literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/770.gif b/SRIP/Libraries/Exp1/Data/T3/images/770.gif new file mode 100755 index 0000000000000000000000000000000000000000..0b37491d128008a4182883e8fd91ce7a104a955b GIT binary patch literal 1030 zcmV+h1o`_%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q%009UbNU)&6g9sBUT*$DY!-o(fN<>JY zL!Eg4`e~e{06+sx{QwbIIAa#Sll@Ne>qktAmz4Z6DIB5>rZrSuaNvNsk{>uP3MZ`` zcjkdW6LEOPTLe_0v3~!S9RQHRltzF3&h>F9q$a;gYk1xxwgO@zo-kv{koZICqB8>| zzKMsmpRXAc4@gnhli#9=01oUri3%J)a)33=I|(4w$x9Q_XcRe1<2w@)VRGo8GTcOL zC+ToLxohH+Yy98=QaNg3gJ)MY#sdrh2Wpt5Xao4vlac}53IH*h^INy^;{gExJMB#7 A=Kufz literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/773.gif b/SRIP/Libraries/Exp1/Data/T3/images/773.gif new file mode 100755 index 0000000000000000000000000000000000000000..07467c5e17240ed58358c3e479e950f1ac7385e9 GIT binary patch literal 1025 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 O06ee*1iEy@fB-x2W!cIA literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/785.gif b/SRIP/Libraries/Exp1/Data/T3/images/785.gif new file mode 100755 index 0000000000000000000000000000000000000000..8c7c30cc9f26a7f932fefe123f041cfcfb1fa095 GIT binary patch literal 1014 zcmV`Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qn009UbNU)&6g9sBUT*$DY!-oS0U|>V5 zACn0X3%20LZ=JJebp)=kkWm#sRV)Y+v3D%vCw^}TYFNgPS4I*1>`4-+q#4H_83BB` z*Dsj}YW>tz2r6)hGJgH&?TNs2U>B&)stzOr4y#rG7OwI8(hna{rVXgw^8(;szd=>) z@N*-uAHQ2ntMr2>qwZa%o$5UqXg5pHD*DU~RMStIfuJ+y(d(Na-9Jc7ug;SpL>ND9 kA(&=h*Dsnnj#RYrviljw*B||4sd4bNw(Z-v3kC!LJFEKTu>b%7 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/789.gif b/SRIP/Libraries/Exp1/Data/T3/images/789.gif new file mode 100755 index 0000000000000000000000000000000000000000..3a82c62e4753d0ea09023a2333c56594666b546e GIT binary patch literal 1022 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 tr$C}}F6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DY!-ocsko#wA z0Yrm5z}0H=4a-G>scP}6gtH*-io_fzTT!iqh8U_F+K-CL2;^Y;0mqL*17YKq&0A~F8vvuMu01&kL z_1odL#JNX4vdtQB))KY~0G!~9;8Kh~2?94gJ8*J>KTZQ}L1X;!Oux1O2oMY9QWLy^ jjrwhIiN%|nHoD@$qj6S)pnLsZ0d`Bfw(Z*k0|Ed$LHXiI literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/801.gif b/SRIP/Libraries/Exp1/Data/T3/images/801.gif new file mode 100755 index 0000000000000000000000000000000000000000..5543bed233c16bffd39789818e23677c1f97fecf GIT binary patch literal 1003 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 XLe0&=D#FpXW>Pj_UCp{R!hirf(H+y= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/823.gif b/SRIP/Libraries/Exp1/Data/T3/images/823.gif new file mode 100755 index 0000000000000000000000000000000000000000..18b886f0bc522ca77e86848573a80547f7058117 GIT binary patch literal 970 zcmV;*12z0dNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q5009UbNU)&6g9sBUT*$DY!-o(fN>unD zOe=qSCJr1V&0oKMc{B>-)o&aNZ6PNHP~lCN4gk{NXe7~35CegX5NK55ZpFYiA~opa z0YE?sS3oD8=|^h^s*fop4v_RQmbrdcL>dSY;(;_%0z?jk@lTW3f!+G~ISYV=zfC&D s9$3ZC2wNxpim`>Tt6vhfRP(Vta1EZ_vtIhaVhcb?KR}ElYYYegJ7z1$ivR!s literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/824.gif b/SRIP/Libraries/Exp1/Data/T3/images/824.gif new file mode 100755 index 0000000000000000000000000000000000000000..ad11b1d4861f8ca6ff0ed7252e88b035256be151 GIT binary patch literal 1037 zcmV+o1oHbwNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q;009UbNU)&6g9sBUT*$DY!-o(f3RF_c zn7@DQWJmyA z<}Z*#4It|fBp`;IzjYoQN&)F*Ac&77hI)8m7=JL1ihCrf{Bz|y*&oTfW z^896v7{%YYfu=x)ktpNo*%|fx)j}Y#MLvI(ax7De#c!*S{_LUg3t&MekmQOGU(UQa H!hirfJDc*A literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/827.gif b/SRIP/Libraries/Exp1/Data/T3/images/827.gif new file mode 100755 index 0000000000000000000000000000000000000000..dfac00f4200aa9e9e94dd70af6506d4cfdc758f8 GIT binary patch literal 1013 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DY!-o(fN<4VP zjzwS=XGHAqM_s*sAVbPCRls2fKp|76wBc}7%5aK$^tfWITt9M@7%UtC3?x28C<@MC z2QtY*e<1Y{LMX#szh6f|0#Z0*PnW3udQ2>cH0xG^*+6EKBZT0LB509ad9V;fwUGIA z$4vfb8k(x6htEPHo!Q>lbVQ#36yG6pROQ$=89oKnl7n5DiFb joB>z}){h>q4xBTP?nfsyhG(op1DGYRhV0u20|Ed$8o1vs literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/828.gif b/SRIP/Libraries/Exp1/Data/T3/images/828.gif new file mode 100755 index 0000000000000000000000000000000000000000..1f341b4360deee26fe02f8668b2b786b84d0429f GIT binary patch literal 997 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QW009UbNU)&6g9sBUT*$DY!-o(fN^FP+ zmOp=0CJIEtj$glz`HDz1AZ4CEbbcuHo5v#}22melc>qA*&IyT_`q>MlQQ(G7{^lJS zxIjfj0-pTEQ#0^PxOYY$x>=cM;1_!R^!b2ztY0kxAlkI@_pw(*L;cbb``C{xyb%$f zr2BV~oIkoEB{q=27e-rK19}S7)b@v903_n|!=~Wyr;j@hN2z-l0iU6W@VQ&MMW0g(4hR4{BKF^1 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/832.gif b/SRIP/Libraries/Exp1/Data/T3/images/832.gif new file mode 100755 index 0000000000000000000000000000000000000000..a701be4b44230bf3dd8a4279baa3e0b08e16bb77 GIT binary patch literal 1040 zcmV+r1n>JtNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q>009UbNU)&6g9sBUT*$DY!-o(felTS1 zpFeGi97F`LA(y&-AVbzt0FeN$kms^xGY2w5h7k_WfK2B{gTO2;SM7_`P#j1w1flTj z$L?M~Vhum`!$OctzL4F-H1q<})&K$!V%Y@G-a9fX@R%7 K^XCf#0suSVyXR^E literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/859.gif b/SRIP/Libraries/Exp1/Data/T3/images/859.gif new file mode 100755 index 0000000000000000000000000000000000000000..f54d915aa6d63d2951ad514c68886ee495129c67 GIT binary patch literal 1008 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 VMuADZg?wZq!1L?avo8z?06PUl^eX@W literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/877.gif b/SRIP/Libraries/Exp1/Data/T3/images/877.gif new file mode 100755 index 0000000000000000000000000000000000000000..6fdad775873c544f8912d272d2a7bf0af496995c GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-o(dBKc#B zo+k+r1y0};&!0zn?;2&C(9EB;Lr@SLsN^W)7k_sQ5Mfh@|N1>h$iJ7{Mu zs6$i(Ulp-1{H>rMjM{;%c~=0K;V%tfe=z_ckd X^kPlBr$Vd-RPFvPTg$q2#()4jNP5@B literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/88.gif b/SRIP/Libraries/Exp1/Data/T3/images/88.gif new file mode 100755 index 0000000000000000000000000000000000000000..791b6bd4ef01e66948b2a53c64ced2c11adbed52 GIT binary patch literal 1023 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/888.gif b/SRIP/Libraries/Exp1/Data/T3/images/888.gif new file mode 100755 index 0000000000000000000000000000000000000000..fcd871a1d8b36789ccdea991ea222bd94b833d69 GIT binary patch literal 1034 zcmV+l1oitzNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q*009UbNU)&6g9sBUT*$DY!-o(fN=zuA z!HFu5mVI+&$U#H}X8eg9DbmmYha%_@BRP+xzbg%s)Ejwklphi-dW_7&PzpSM>P9)) zK=94TISXC11Iof6lzbzlC`{1HU%I9P17rxbPb9xY2^8ww2W6mu2#-ke1H(|4ziAXY z;Ba%vr9Vs!-THI)ZzMiz`a~jY(2$8sb)H1{2<)$l!vSY}`C`OI0)Pd+M7}~WaiEZq zK{^YZuui0<0HOi#_?e7D>I?7u;WLstfFF^}!ix4V(n)Fn$3zk%@cW*>dMJJ?{~Ztj EJEN-XkN^Mx literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/901.gif b/SRIP/Libraries/Exp1/Data/T3/images/901.gif new file mode 100755 index 0000000000000000000000000000000000000000..cd3c74d1e0889216082fc0f33dd1c4909630d569 GIT binary patch literal 969 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/914.gif b/SRIP/Libraries/Exp1/Data/T3/images/914.gif new file mode 100755 index 0000000000000000000000000000000000000000..c56e26bca35ea8284cd52a26a6e25c67ea7fac08 GIT binary patch literal 1028 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 XTf1Hs_>3Q~(E>LiTY$Rt!+-!g8z|n} literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/95.gif b/SRIP/Libraries/Exp1/Data/T3/images/95.gif new file mode 100755 index 0000000000000000000000000000000000000000..33e96e92f78f2cd26acc9dd260dafb2891f836d9 GIT binary patch literal 1018 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qr009UbNU)&6g9sBUT*$DY!-o(f0$8w! zTE9I)<10^x_qRfF$%qR oAppqX7me;Se(j88g2xYp>AxYR?d>7&BPuWq1nb_-dtg8SI|(u37XSbN literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/964.gif b/SRIP/Libraries/Exp1/Data/T3/images/964.gif new file mode 100755 index 0000000000000000000000000000000000000000..4727651347c4577fc1cfda335e36036f09db5571 GIT binary patch literal 1024 zcmV+b1poU-Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qx009UbNU)&6g9sBUT*$DY!-o(f4m1$M zkTrCJ21pdhBbC38A3sSWMQVz{Wk0cp?_N zX9NHieEzs~YIhT&wR8Zstn&vC%m6L|BI08wrXSTD8wKk6_|MvtumX#H{PqGZ07(A+ z`J3U^jXscz&>lewuav)3VIM@J$^?bKYy~y~>c{U5fEfPPF_0L-o6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R2009UbNU)&6g9sBUT*$DY!-o(fN;F7- zgP;|F{%QNAj#7mH4Fgy~G_9Y>lPJM}R2YB+%9k%KWmtL8ib;LsaxzN8GYvF%C<`DY z0BxT)Lj^QgNKnvAP=p55Ap=0>RXcE82sWs5l8k_aD+F#jS#02vVkc)2Xc)tkNp`N} zxB_aDQ;UZl)WPhxOUZ$VIIO)K6E@<4P%sNeRB|%g$tMzJ{OZ>(QU+!wO+`%5%VZgW zz)ZeN0x^Thb~6M{Iti+@$#G6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q&009UbNU)&6g9sBUT*$DY!-o(bMmXlr zpAZKT2}WquucN(~uEQN@o~6rR)bLq8onxJY4`Fvm+yjA?W#= zHSp8FidG=P=tyB;Pjo&YVrbV7P!||>&ZYbrkxRar9{Uj!nZ*?}a{XkL>(@*q!3+Sl z_GdqJMc1ou^VoI4XUInC+4^DY%$ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/977.gif b/SRIP/Libraries/Exp1/Data/T3/images/977.gif new file mode 100755 index 0000000000000000000000000000000000000000..539b11694b9bd47b14b113548f6e9e63ada0a449 GIT binary patch literal 1019 zcmVNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qs009UbNU)&6g9sBUT*$DY!-o(f3j6`9 zpSLm+1$L+t4qiWg{9t9wfea)+Vw7%7h)7^fKY8B*Q7PDA&4Gq%`1L!5uphGw4ORJk zP*B4&pI#cyn8#064uX5m@nc4`VS`ON(=7o2!kE2xw17TT5b9&PRM+|q3z884oOUMR zC}}HDT)(??>*h-bj^C&R84n!lr)xzbojWq_;Ro*s0J1wXrsDU5U_WagBnmC~uOAMH plf@w!`0<9sLF4+RE47j^gN!fWo=ny65?vXd;=azyyLaz^06Tag<=+4R literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/Data/T3/images/98.gif b/SRIP/Libraries/Exp1/Data/T3/images/98.gif new file mode 100755 index 0000000000000000000000000000000000000000..1b98eb8593ea601ca0df381c8256f527736f2c40 GIT binary patch literal 1032 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/MyPackage/Experiment1$1$1.class b/SRIP/Libraries/Exp1/MyPackage/Experiment1$1$1.class new file mode 100755 index 0000000000000000000000000000000000000000..180c336521a6be4aa7db92a054dc5ea03c6b2e7c GIT binary patch literal 731 zcmZ`%T~E|d5IwV9woocm#6?_0&;`0nVrimJ5)!h(WX&QZl6}8hZkA&Amh?m5U+IIG z@Zb;dM;YgKn*br(r1#ED&zzYv)4%_2{{ZmOp1~9v7HU|r*m`AQ6|YUKnOG;(va>L4 z`X=5GK(Mu?sWQLmf8@;FP=(nZVa1(@YV`@# zPJAi}^Sw~XFZpO7lM^wBII_@-0}=H_5^BE;R&_sw#w5z3^xRNpojA%zs_2xk=yqGZ zbMakxkx)agi0T%D0z{xL!TK8KNgzLky0&vq%{!gQ4IZc8iBTVa&=(Q1^xsPXoHQs!Ue+P0LEs3oPzc!xm(&yNE&%TaW?d@Nn z_HR^v7MOWHYm5PQ;P7b|wuPryV2_Jov1HhTQ8E~f8yGjJ{$NA}cMKm2hWZ#)GH^va dN1ZtgEEV_{SmwKmX}sib;5rqy$IsOG`VYR|n85%5 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/MyPackage/Experiment1$1.class b/SRIP/Libraries/Exp1/MyPackage/Experiment1$1.class new file mode 100755 index 0000000000000000000000000000000000000000..fa232baeaa7d20355882ce5bed3ead16d82a1eca GIT binary patch literal 1389 zcmZ`(ZBx@g5Pq%=jSW!>@-9}vs-?W71ym43v4VgtFyJr)-;VUA1Vh3kDaHTdpKyjZ zWyT-ik8<2A722`QOzw8~_I96r_U?ZF`S}Y#2J2C@A)z6Lry7RvOvQ5z3X)M$hBc%x zB8O2qjHwvcpdsB#`zECKq=qTHQ1Md5D;3iWkzn8Q6KRH?T>k3@H^1^`+_WejZ-8fkg!*BXiUm<+Ll}LOtECi6tNn>;|Khh6OKj4v|ZnFig^+2 zy9E_9I$k5LqXYMKbV_L!U6in4*@;XdBfaKyyurMRw>sWoLC1S!b$q}g!(iimn{GL0 z`GKIC7+PyI8Er|$M;*&p(Xon8DsnpVSR?Km$I4J;vKqtYPSIH3I}m0-eBPQiOOA6* za#zC$)D_t}VvC!m@Tt#f>hwU9HWJ5@*=T_WyxOMDoJ@9N_+=u}Sgly85fupaR%)a# z0;+deSjBxxsU%lqwC-!`maqxDMu`FJ9$=y=)XPIa; ze((qQql~kcCiQ4T2Se7dAU4N2RBBMy0~w6d=R)|xlO>~;mbw&|0=T&gs^y&CqYcrSZ7 zdlpiY$-FBImC>hEd@#k3`U0EH^g@ng zBCl;iBj%eNS0NpzA30ie8d-t$+rk9GGjmmB^jbN-jsL2D>d-lHM`yVyl^&dsJvV(H zk0LzAb_5?Y5dx>hc*0Gb*u(gcQ7fLg)Pv+*?}9QWwK0);s!B`T5rL(NU;?vl9Bnha zG@7gAp4FSK(okj@m1X>FpQriarcvG2h}|x>cu}T!D$@{+hO3VEr^Yux$lg1wJ!ji_ z!q(n5h}L)1zEm+0Oa8^u;x5am(nHK*o-JMjERGS5#|S~|E5zOp)c*m574(SHURNN? il^u*h9F2QeVwgIX8MKBK+~?QhonAwOHAm9pm(O3jov=j! literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/MyPackage/Experiment1$3.class b/SRIP/Libraries/Exp1/MyPackage/Experiment1$3.class new file mode 100755 index 0000000000000000000000000000000000000000..d383aa87d870519db176bf8bb1b34100812f1e98 GIT binary patch literal 758 zcmZ`%U279T6g`t{yY9Ny^`otAtyWznO~Gwx-YSBG2!*W*EqR}8hGgnyx9m=%zKH%L zK~a402l%7JGfO}pl7YE%@8!<9=YIVD^Ya&g13dBIV9Uo6?)uokwu^f%?z`9#STiaBA;QpB#>HvydhqGJO07fN zdi?g@H;DFkG``d^0VRJ?e#AA(pw@k?;07(uAGc-*FJ=f{`zyrW4>bP)_%-w=ru|%l jtkt$R1FcF95Au literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/MyPackage/Experiment1$4.class b/SRIP/Libraries/Exp1/MyPackage/Experiment1$4.class new file mode 100755 index 0000000000000000000000000000000000000000..b1a09c69c0edb60944b818a19e914431aec47ea4 GIT binary patch literal 758 zcmZ`%U279T6g`t{yY9Nyt=iVMR;#X(rr@>^pDKcc2!*W*mAp?jLo)4Vx9m=%zKi}I zK~a402l%7JGfO}pl7YE%@8!<9=YIVD^Ya&gLp=82VB5zM?)ccmj*Gi4?zz|%STK$;pQ|GCh|g75Cm>s8UZ91wj zx0qZMIV)tlnk`$UFVj?2RrK_LgX}Dt(&8rU^|8whS>iaBA;QpB#>HvydhqGJO07fN zdi?hOH;DFkG``d^0VRJ?e#AA(pw@k?V3iiS;V_5dFfE5={U97rT6BsYf zR32^$%*V%{Ph|2@_9$w7x}Z$;Nf%pt9P&nKRqP8a*6)Z}Zwok0(dPddJP&s_d78U-jq1Kethceoi!#Pj8HcFVY<0Xp6}}#P_C8>3 zn{Dgy8yi0%8oyBaUd9A0`4`JCc*rs+bsv*>#1^jsriTazLjK+&RMt*po-0Pyrk4o!Nn~M^r6g8dwg=Mm3BB2f zPUTp(dP3J5b*V@vq{UgE?TZO%KOq`^-HvL0Y z4AK)98v!0+Gk}Y00X%Dk*rJwGr409pTJlXuzxA$ns$vq`nAt+4^FmP^f#s=yRK!lE zoeoE-VYig8+OQq_GLBWAhtGC7*yppRc9kI8UDUZZa~#q`Q2AWu1U&f{&kwl4Gbn8z3%E&-TY=jXgjW*;ulWUH=R2x@0sIpBBg=j& kK~_rNn}ApvOIRjM6)Oa-U=??GJ6!Q~)M#0f4sSkx0E|GlM*si- literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/MyPackage/Experiment1$7.class b/SRIP/Libraries/Exp1/MyPackage/Experiment1$7.class new file mode 100755 index 0000000000000000000000000000000000000000..3868835ba1dc86e3ed4890e25867b9ec45d11d03 GIT binary patch literal 765 zcmaJ|n!#gGWBbu$>dD-C~AE=r%d%p7d!hL@=9q{ycSrh-x9Og7I2!TO9E4|()8}4-=XY- z?4<0Oj!h!dw#<~Zhfc?)6@WnSR%^%~f*Gs&!kbFO!7wJlxynX}-K|RChIEvyC-glrf&lI7F>xtK49XkwA%3VQGDzrrz3V7u%1ud3~Vj3?`LwiyN+NqgNp+uv8fgj*s zkYGuC@YTeRGVU|e*lJ2}9?sc&pEGN%eVO_B>)Uq#F+5YDA?&9mqM{8^72~+&$8Ai= zMOQJ2n6#!;Ok+kacU0WPJq7m_JW%kE!RPFm#n2=}UvlGk+ejZ6S)s3%-wNBz3(JYk z(v>;WGMxp6%i(kGL{bdRD}{_;=t!ED*evCDh5f?V%~2$nEToNG%CJr8SA)%xmZ9}| z;V5Yq9bpNZK}%S)ujGtkQPAN?W42J;JETrKG;$@evS(OXkzt60ll#V@QPzt`rj^yj zAtj+piXD*?X~!&Bt1>hzCAYYz45R<|3IjKZfh80WFBqoJtH(LQV=gN%Q?+?H#xQX1 zJqC5BP_olv&6Fh!)HP&6rl+A3K@A-UNNY~PyoLoVDp=C6j7J()5Ld9OVGWNpJON2w z*YFfc4I4-**wnCvZHDU&dtP5*BA0}Ej_Rv#?e0?z8OAOsajm6&jR`3Erm$>5=mI3S zSqxoS;iP1r6UF7seyQkCZ(WGj3_T4gsJrPs!zQu8x+>F{*zQdGGlpYSXR-UQ_OH89 zYH+Y#nipkgCn4S>i44u5t06&Lj%}D0L;o8WOE-=jJu3=%eY;><&QzS>dfYPpdqCd} zA-;5R;-2%0N?uFJQ%om$!#*IQa6BGKVVFMoHk!b8us}eL0sRh|z~xj>w2QnM@;L2k zbo?uL^bAcWZ3d0$LJwjlQvZJVt{t~#&M;J@EI+H2`r6Q(EJ5$(NpkKwERHx ziD&vMQ0A*qZ@V-&Re`_GRx4<&@%9oT_&ap+_XzS27~&tX$UnI{hCQyT4r0Y1hDgZ} zMsO9^z$wK}+^A}cQzlZIFFJk(R%58o%tQ43LG%$)fZmt+hj5b+I7Z3i7(+kpL9#UZ MS@zLBOg=ro0lDi!&j0`b literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/Exp1/MyPackage/Experiment1$ValueComparator.class b/SRIP/Libraries/Exp1/MyPackage/Experiment1$ValueComparator.class new file mode 100755 index 0000000000000000000000000000000000000000..ab35ec8f1a06c7b3b85105df75976d99274766c6 GIT binary patch literal 954 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 %Art_N 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/100.gif b/SRIP/Libraries/T1/100.gif new file mode 100644 index 0000000000000000000000000000000000000000..83f0f29b808572714c340bbc205f794d5165b792 GIT binary patch literal 946 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/105.gif b/SRIP/Libraries/T1/105.gif new file mode 100644 index 0000000000000000000000000000000000000000..23fb7a4003df5cebda2dc73314066e317f5c8805 GIT binary patch literal 926 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 rIWs2Fls6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P&009UbNU)&6g9sBUT*$DY!-oht-1}Dw z;=vc)`0*oU(O@i%8#@;K$nTpIkpxK=Lpe|mJAUg_umn(ml16hg9UKCQlcf`o{6x+C z2{OS@phi)GKn60+0F(-}HATQO97uRYSh8rRkz5s)JEZap*M(&eXdqwBECezfk+mA> U*_a7{Ek77^^XlEpmta5uJ4aN&N&o-= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/115.gif b/SRIP/Libraries/T1/115.gif new file mode 100644 index 0000000000000000000000000000000000000000..a3f4ba0420ae15e33d458d67495d39768d8f03cb GIT binary patch literal 1048 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 JbC3Z606W5L^G*N& literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/120.gif b/SRIP/Libraries/T1/120.gif new file mode 100644 index 0000000000000000000000000000000000000000..c13610251e678498d87178f73b53f3dda7428365 GIT binary patch literal 1037 zcmV+o1oHbwNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q;009UbNU)&6g9sBUT*$DY!-ojd{M$BU z2n~n@Db(u6v7fji7y%FnGHKEj1&D@NvJBEtz?5h9SmslAk0VWnQ&{%m z*bKldpA4(0GucT4sY_FgB2^fqUB@9L8~}L0K;Y4SKM@jG*{_?Y3kSc3Js5~%JRb;= zi0k(XL&7^f`#D31AZ9<52?=o&wgF+ElL=c?;|S-V5mkA!tVlS7Be5F^3L+TP(MkY? zl{*F+xI&KKbBj_eq;RU^y;-nJc0}Uv3_O_}>D@u_+2I=8uik_lkcXu$yCIV+U(UQa HfPerymbB>K literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/122.gif b/SRIP/Libraries/T1/122.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6f52061138ee49ff472c8ab1d648fc5296a8a2b GIT binary patch literal 1028 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/129.gif b/SRIP/Libraries/T1/129.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b5c5d63b06649c3344aad7b1ca39b5c920ee9a2 GIT binary patch literal 927 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/153.gif b/SRIP/Libraries/T1/153.gif new file mode 100644 index 0000000000000000000000000000000000000000..2290f70085f0e4436d2db7eb798266443af314be GIT binary patch literal 941 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/175.gif b/SRIP/Libraries/T1/175.gif new file mode 100644 index 0000000000000000000000000000000000000000..22bd70e12f6eac451eeba57a8d044d8d55cbc2a3 GIT binary patch literal 923 zcmV;M17!S1Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Ph009UbNU)&6g9sBUT*$DY!-o(f3RKpw zh{S{a_~p51Fr!6|1U-TrsHWe!5+eo9`bR7!fC%dPadFv&pG=xIXQr%)4uMN({ph#^ x@Qj~OmqkIi%t4ReP(A#dy3EzD-%wmphnC6evOz0;D~2XOcXX)Pvk(IU06XP7y~zLo literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/178.gif b/SRIP/Libraries/T1/178.gif new file mode 100644 index 0000000000000000000000000000000000000000..b46b7ab258797d9b5a00f44db33fdcb23011fa96 GIT binary patch literal 940 zcmV;d15^A*Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Py009UbNU)&6g9sBUT*$DY!-o(f3QW?k zA|HtblkD5L46ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000PZ009UbNU)&6g9sBUT*$DY!-oUk{DT28 zp{RcCepEc@tY5!d8x3B`)~{JegIfBz<8hK;iE#b0v?SQ^)69V##oZK`b0>hFJAvL5 pI+JKiqbEDIYZ26Ao1Lwk?kpnpCJ=o6p6-N`)u-35U@Ha$06Sl3yF&l~ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/193.gif b/SRIP/Libraries/T1/193.gif new file mode 100644 index 0000000000000000000000000000000000000000..871ffeeeb7ca9a2c9c198c3a88a655a2da0bb80d GIT binary patch literal 1022 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qv009UbNU)&6g9sBUT*$EDK_mZ4$#JMq zPrr+JC?YI%v7b5`8V!!=*pHlskOFz2a;MBy$3G#rL0=P4Djb7FNbJ4QYaWDU%y`tfnC&Az~Hie&?+#*(XO99G6$pfTf&gZMQ{l3 zTx7ct%EdDW3B>EC4Ftn#cMtZti1lyaf&*Y(Jk$_yKfDAJh`K1QM8jE&3A*Ui@rT0; sy!z#vMS51ci|IHipg3b4$&35YWef>{4@pdDQ0m^zySMM(1Ooy9JM=c?(*OVf literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/2.gif b/SRIP/Libraries/T1/2.gif new file mode 100644 index 0000000000000000000000000000000000000000..7708a861eba31ce834dc1da480d6125610fe789a GIT binary patch literal 1033 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/206.gif b/SRIP/Libraries/T1/206.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c8f475b22888dae8e2e17b12dd6f43459094876 GIT binary patch literal 965 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 PA`W6VN}o>sVL$*os0j1) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/209.gif b/SRIP/Libraries/T1/209.gif new file mode 100644 index 0000000000000000000000000000000000000000..9d79b848b0c5ef932eb3181f8f7e3f81928a281f GIT binary patch literal 933 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 SH=2L0jGRurx^?RT0RTIWGxcx) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/211.gif b/SRIP/Libraries/T1/211.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f27147c1eeaa42287eef299ff761dc96166419a GIT binary patch literal 997 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/217.gif b/SRIP/Libraries/T1/217.gif new file mode 100644 index 0000000000000000000000000000000000000000..63d47c15e97ce8cf723e53b3f2bea385e4ab6360 GIT binary patch literal 1024 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/230.gif b/SRIP/Libraries/T1/230.gif new file mode 100644 index 0000000000000000000000000000000000000000..d4dd8b97b073af1eaf68fb99f852919f300c1623 GIT binary patch literal 1042 zcmV+t1nv7rNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q@009UbNU)&6g9sBUT*$DY!-oX%^y~Kn zqCpdb?D6Bb?14ps-ZpMDW#S_M0&Dt-FF z_)km28T0sE3o(#^l5`vU4V%Ew)W#16S5z9NG8WZ@In-@b*lr`O1_`TdY^6{}S$=R5 zit7ijqQX%V;~q3278XOb{5&CyvylqJ3DL$Ld{&sDf@S>JAymoF@It_P4a%7)Y2l1d zbnO~kk~ClEgE^|W+c-uc9g)V0mC8ZeRxz>t(vkX#kOLK3H>0i$cf?@>IFyC+>y+7~ M^XJf`GYkj-J7m%J%m4rY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/232.gif b/SRIP/Libraries/T1/232.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab4b777b373324b767b17a34c106584e9900b47c GIT binary patch literal 931 zcmV;U16=$^Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pp009UbNU)&6g9sBUT*$DY!-obp_45NU zVZVKi2vj_Hao>lH20MNPNl+w7g8%yU8%Ywupo{A^oCE-5-$jZuYu=nm)8;;$CxP_) z*NrCtTQ-sL1j5dykC_NO?c0|M!AuZS_j%$8LS?^CT(h1CJJl%Gsbt9RGs?EDTcZI1 F06XS|zUBY` literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/233.gif b/SRIP/Libraries/T1/233.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b477c577f593e5290e77c7e6e4f4c9b295afb4d GIT binary patch literal 992 zcmV<610VcHNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QR009UbNU)&6g9sBUT*$CtLM(p@I7B!> z2L%V&CQK}NK+?T_>o!n{vXP*lexxQm5XdP(NrBe9i6E#>$IBi5=oDOMvt*-vND5wJ z^b%Y;gNVMp^rsDJzomzqmb~y!j=@CdN{aEP2k9oQ{?r&W^>yP`KnB$X0~?iK4}5lB z{&Oc`U;}XedTvbC50C%=1uXSD<+7v%as6U^;M9*?gO>s)^_v&Z-?$Z!1s3pAuirTr OnL~>nO}g~PfB-wv#o7M= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/235.gif b/SRIP/Libraries/T1/235.gif new file mode 100644 index 0000000000000000000000000000000000000000..570672e21fb2fe970ebad2a4d7e237a11e69fbb7 GIT binary patch literal 1048 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/247.gif b/SRIP/Libraries/T1/247.gif new file mode 100644 index 0000000000000000000000000000000000000000..708f0381902d51c1aa1a0837ca5eef4070042641 GIT binary patch literal 1039 zcmV+q1n~PuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q=009UbNU)&6g9sBUT*$DY!-o(ff-t1b zpT%rc9I}9Rjnjxb?Cc@hQsh!Tdrla#FlVtPF&G4SfRlz{p&ft9CM5G$D}lig=};{U z_DuwU9i!MiILN3Of`mN$!6Ik^p^bJ>67KNV#o-`iTH)1f_{5r4bq|N&vw?62+K20O zAmp*`;gf$m+U^tL@QFUQ2e-0uD9J3s0?T#{U`T-1F@-mCFa+bTjzS3Sz&TLpV3)I} z3bF9h1py(1UHtkqB;&80m$3sISo3Gf;eZ_1@WoqKERpYX?lxtJm}8T@mi{J@h{(LT JbLIg706RM{_uK#g literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/249.gif b/SRIP/Libraries/T1/249.gif new file mode 100644 index 0000000000000000000000000000000000000000..3bc9481521f6a1e0d64a1833f7b978bc4e417b20 GIT binary patch literal 942 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 LphJr;7!UwEl(Eu_ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/250.gif b/SRIP/Libraries/T1/250.gif new file mode 100644 index 0000000000000000000000000000000000000000..be9f2cb0bd41fa3d638156073aab658e3ea59058 GIT binary patch literal 1053 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 K%AHF$AOJfN(7c}j literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/261.gif b/SRIP/Libraries/T1/261.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b45af550164d9dd39aaf6ed4a48e9f112d1cff0 GIT binary patch literal 995 zcmV<9104KENk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QU009UbNU)&6g9sBUT*$DY!-o(fN}Ncs z;y@H7032wN2$4rbC=57+aL8Xe0GO_UVYJDPIe(srFq}ZjpB#bf7!@4zQkR2-M#Ra> zGZ4)%69q%e>ZkKyig?CWG{g|?8$we0ggivl4O}ez{(+2|r06S>J-S7Ya literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/270.gif b/SRIP/Libraries/T1/270.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b0bfc63fb2c0b7320fc77208d42c11187e164b9 GIT binary patch literal 941 zcmV;e15*4)Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pz009UbNU)&6g9sBUT*$DY!-oe={o7># zBEnMr`Zcg<@WHQ)8#xk;kx`>af{ik!B5+b5fnNRc)o3ZONJe`!Yu?NWz)nU!Je~DB zS0Sg6c>Rv?Op`H7&H?25@w1ZiO~z(CO=Vn?b49*>!4l9U04gJ{oFz(P$;l|AE(tju PWZb~BuHCzJ0|Ed$EiA+l literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/271.gif b/SRIP/Libraries/T1/271.gif new file mode 100644 index 0000000000000000000000000000000000000000..3eb69cfd17dacb9d8fcab67c6d72a2d7cfb74426 GIT binary patch literal 923 zcmV;M17!S1Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Ph009UbNU)&6g9sBUT*$DY!-og!0D_oM zz_C9R5k~QMCF4Ol{$O}C_)49Gkpv5vLxqwclz)y|4tyC?CIBe=a@YhA=-o~Lq@wNQ xQ18=DApRijq~Z_C&PV<{*c=cJ*-jY#TwTq&vx~n#J8P&*@w2Sivk(IU06WrLx~%{J literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/277.gif b/SRIP/Libraries/T1/277.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab8247591e9faa859e1d53991182ca2b5931b9ce GIT binary patch literal 926 zcmV;P17Z9}Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pk009UbNU)&6g9sBUT*$DY!-ohzIf9sQ z0k=jJ5jydQF{8mZ{@QpnNUYm~kpwk#`-GC<4}UCM3Y6uqi%b9qe)$V?Q^h}jDSG-F zrr>6ye@<>LQ08yPO)LJI-gM*-AC0L)Zvvo7N-NbSUi}Ty+JsdBt!UG#^%xKUJL_e- A?*IS* literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/284.gif b/SRIP/Libraries/T1/284.gif new file mode 100644 index 0000000000000000000000000000000000000000..87b8d5f06d0883464250fb0dfd873cac858e122a GIT binary patch literal 1049 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/294.gif b/SRIP/Libraries/T1/294.gif new file mode 100644 index 0000000000000000000000000000000000000000..5959ba4c0e03e6fd2c881f32f8004c231628c21f GIT binary patch literal 1019 zcmVNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qs009UbNU)&6g9sBUT*$DY!-oS?`199E zga~c_oQaSCv4%T-AVY=}rNN;PZXu&(`X-W}7>A}rHUdz^oXD3AV}_gwAc>ifI2r2X z_she;0%1UMo565TJ&?*A6vPoS$U+I4K*l>r6{OXK6(oh+YOpK6uLy^TBs;aLLbW03 zaCMsyE=USPwr!E)T4O4*NiETF(i!_s^a+YNxqXCiJva>ir pL>Sub4DwwQhY^B|BFzuX4u}9Ez!JF$1PBALbL-yCyLZ8W06V0W;;#Sz literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/297.gif b/SRIP/Libraries/T1/297.gif new file mode 100644 index 0000000000000000000000000000000000000000..5f36f2e12ab57e5a1ef065c241047be229acf4cb GIT binary patch literal 1030 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/311.gif b/SRIP/Libraries/T1/311.gif new file mode 100644 index 0000000000000000000000000000000000000000..3de4d8597e6e33a8c7f52afb79095de9f41a055e GIT binary patch literal 913 zcmV;C18)3BNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000PX009UbNU)&6g9sBUT*$DY!-occ01^N( z;SYa%Dk8i%OXER~9wYke7?Pl)ktGT4^5-e#z?C;#0wA)^Urd*^{MnS5Q<(#v{&dL% nkW6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P+009UbNU)&6g9sBUT*$DY!-ok6{loPD z;=wWZ`q`>zu^^v*AWd{6m|zu1Mgc|+d;xM_9hCxCYy+7Ira&hk`%$q8APh))N^BOH z2lAFp1*kw?6Jhg1&OkiZfRs1HCI)68ck%oJGFb+m??A%hd1oI;MK(Q9>&LGY0-M1= YdgBQoZogi1<0jicx3Ay7eFFjjJHAuE>Hq)$ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/321.gif b/SRIP/Libraries/T1/321.gif new file mode 100644 index 0000000000000000000000000000000000000000..2eb2fe576538deb08ed5a69de13e11121bfbc825 GIT binary patch literal 989 zcmV<310wuKNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QO009UbNU)&6g9sBUT*$DY!-oWO{Of0| z3dDn``t8%03dhBPR{Hr9NixSr0L3<{)ELeq#8eZ-d6YBK9~Fo>z-e>|V9~}Y5F7RT zcXMElaQ=uv)YuOw!HiBDrW%>b;M9Iq8)n?cbKusl3a1t|IPxJ>gc==oC}#8ERHY58 z{4|)esl%iG78T4Pw5`Lf9RbKmrE{*st2IfEl=%<`)0Ha0GE9Y3aX-c%9jl}=Me@nd LphJsZ7!UwEtX$oG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/327.gif b/SRIP/Libraries/T1/327.gif new file mode 100644 index 0000000000000000000000000000000000000000..2c2127e8223d0473b10d260ac6e1d08085be63aa GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-obLqyhKu zo&|^o2l?|ij~^3^1P6ul2Mz`zkOCXD;kVIWv5z1V)Y=HITswdKFjat<;L%2LBmh`Y zw2{}t1~dKX12RxR4R-tnIW*JqjX@mq_Nid#LDxoS9S$Dzw}l~>jqMsBG(?tRp^bhL z8qybm;VyseE+j;DtKr>h2n878SEk`De}xb_@TX2h!?U3dQeox~hr_ew3|8UCkJkc+ yIQV5AIH1P5ex@*jt0#yE5kuBCegfI3Wy^G527q*csim$?HBbs4PP{nEfB-u+Zs-C4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/346.gif b/SRIP/Libraries/T1/346.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f954f181f5e101282c5facd9bd3f114cf2fecbe GIT binary patch literal 950 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 Xe&jV100UJYrPSTax3AxU0RaFz(mcd@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/358.gif b/SRIP/Libraries/T1/358.gif new file mode 100644 index 0000000000000000000000000000000000000000..f71d1a79fbec6a3c1067fffac7bebce02f8c5c4c GIT binary patch literal 945 zcmV;i15W%$Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P%009UbNU)&6g9sBUT*$DY!-omA_2UB( zAr*G}_Ej|a1LHnD8w)1MxUW@6g33r9IVrHlzkV>0umnJ>Uq)UYX4cH;Xy%J)HrGjE zxnbHqo7ZM$f%%fu%xoF^p?biwLbs@ESc33HvRe<9BT3Sl`4VQbnQ3fhT*-2$y+jIh TBAqF4rxm(*^XlCzFdzUsA#lfG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/359.gif b/SRIP/Libraries/T1/359.gif new file mode 100644 index 0000000000000000000000000000000000000000..cf66f375fcc4cb0de06855974c44c7d5bec2c227 GIT binary patch literal 928 zcmV;R17G|{Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pm009UbNU)&6g9sBUT*$DY!-oUS&r;7qm?5KbsNnaT{36{n@HGRy5;fs+O?R0*1@UCXv&Kma@a C&AJ!> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/360.gif b/SRIP/Libraries/T1/360.gif new file mode 100644 index 0000000000000000000000000000000000000000..53d9a2ef5f2a7cdbbbf8c11075e6f74f489cd565 GIT binary patch literal 1034 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/383.gif b/SRIP/Libraries/T1/383.gif new file mode 100644 index 0000000000000000000000000000000000000000..0d95dc5e13515d0f1124a7d11ac898ab2a954a33 GIT binary patch literal 906 zcmV;519kjINk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000PQ009UbNU)&6g9sBUT*$DY!-oVrRQb0E zBEn+(`t7rL&|g1~91UvJ7_y*8kR=C>RFrbyNn$Mpj)WQWB$b!|X5u{A59i2@H9z)@ g`E#dGpBaI+C+ir`4-iO9li0I~-HA4gdfE literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/395.gif b/SRIP/Libraries/T1/395.gif new file mode 100644 index 0000000000000000000000000000000000000000..2678e743406a799a5f81f56612f95b291e415c25 GIT binary patch literal 925 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 XLgjbEW`kb+m}NN2x3Ay60RaFz4Mxfq literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/399.gif b/SRIP/Libraries/T1/399.gif new file mode 100644 index 0000000000000000000000000000000000000000..d91580141a750831fd1a1667f6d0ad9b29be892c GIT binary patch literal 914 zcmV;D18w|ANk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000PY009UbNU)&6g9sBUT*$DY!-oaE_*()o zp{ai7Dk6l|Z<5A?9O-;C$Pv}Zf|C4sJ4x`ONR|Ra!W4MX(@X%7Fy4&jFV)Rm{Y=j6 o((ffqqDEOFy(w|lf}#EFm6@6I9~Y?hc0g5fv#Zyy8Uq3VJAWIy0ssI2 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/4.gif b/SRIP/Libraries/T1/4.gif new file mode 100644 index 0000000000000000000000000000000000000000..271b3ec81a956366a5629ce7403a33701b5128db GIT binary patch literal 950 zcmV;n14;ZxNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P+009UbNU)&6g9sBUT*$DY!-o(f7Ua|K z-w%le!O+{+&j&_=fA(?o_z?gRcKfD%Kv0qgIgwsU3f$DMUoV*eDD>O6PKZnp&35|1 ziH0Mt2Qs0++ZXJ@&zk){;k+br-wBy8x`||kQ=Ld+3~=t;mj&mie>Fc~CD-pBBbFtB YaO8#)fZTp`abgIDx31s6eggskJHo%phyVZp literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/400.gif b/SRIP/Libraries/T1/400.gif new file mode 100644 index 0000000000000000000000000000000000000000..6118dedb58b4e6995a5f080b6e4c5ad57038bbe3 GIT binary patch literal 1040 zcmV+r1n>JtNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q>009UbNU)&6g9sBUT*$DY!-oc4r19qu z+>RXyAQB|zub)ScfHVpOv##UEe)sf1Bv6K4KY!}tozx}aA()TornFIYlFq|xABhP> z(X%0fM)y3n>mbm8iB%qbE^Hv_WR8NIqB11GVWk)KYfP` zj`>HijzT*p9T}X!vmZ7e2~|)#X`&z>ULRd4-0`tpmjMDlpb(VQBeMpJKWZ9iLz~Hu zg)@7+#;J6)e*embd9d(?yptzQGP~dqFKmzgu(`tQ&<34(uqD+2EV2e6kHB*97RkK1 K^XJe50suQ#pY!?v literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/407.gif b/SRIP/Libraries/T1/407.gif new file mode 100644 index 0000000000000000000000000000000000000000..93835bb33454283945bcab7d8e151ff9d48949ed GIT binary patch literal 922 zcmV;L17-Y2Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pg009UbNU)&6g9sBUT*$DY!-oV_p!25# zB0?+u`c<@O5Tizp2AyTx2y)=HktGS9{FqYUN|GsGwseVdrc9ePTk^_SWhMZR$QaD* w@GavdpV2Z3^9d*;G6XY0RLh9TK-6v-GZmPrW#!SCJ2F!7Nw%z6jsXDxJ5ubpz5oCK literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/409.gif b/SRIP/Libraries/T1/409.gif new file mode 100644 index 0000000000000000000000000000000000000000..e41690144027ad96193009205470063c020376f1 GIT binary patch literal 920 zcmV;J184k4Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pe009UbNU)&6g9sBUT*$DY!-o(f3gl7F zgv5ip{5iQ;Fb_YC90?Zl=gdIJfg_cj6u3cKIv*?Pc>P)1^)QJ@x5NSb>-$w)sP1Q^dELHUojRNwzG+fB-wwq`Gwg literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/41.gif b/SRIP/Libraries/T1/41.gif new file mode 100644 index 0000000000000000000000000000000000000000..26f955a29f14ffe204a9116e434c12104c85fbad GIT binary patch literal 923 zcmV;M17!S1Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Ph009UbNU)&6g9sBUT*$DY!-o(f0+97D zjYNY6c=f~P;37c>%KG)Y;Bg>>WBmXbC@D~dNKY(VzKjWA)6AHlL{6favtNps5yJIb x_aP<*k+5hU?U&RjQl(Fw_7g?Zg~%N=9bL`3HKtZ&2xwmEw}__Mvn&Gw06Qv=x^4gf literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/417.gif b/SRIP/Libraries/T1/417.gif new file mode 100644 index 0000000000000000000000000000000000000000..1cb3ce1ffa5fb463deb20694f66b7d61dbea95e2 GIT binary patch literal 938 zcmV;b16BM-Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pw009UbNU)&6g9sBUT*$Ct!UdL)I9ym_ z-;s$5e^|trFxy6s2R&W{Suj$+eiBIzRN-vjN0k7^xO}Oy-^`IJ1=)0o6QrAd|4yQW z*=FBPULJ@V-DhtPObDu$UV{ms;!-PAwVez)0wxu9F8iT+029(oUu4V9q(!wxx3yH` M%AHHMuEBr+JAn?sBme*a literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/428.gif b/SRIP/Libraries/T1/428.gif new file mode 100644 index 0000000000000000000000000000000000000000..01671a65cd62aa1e4fb22a89bdb4507be3f578b5 GIT binary patch literal 1030 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 GKma?V3+(Rz literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/436.gif b/SRIP/Libraries/T1/436.gif new file mode 100644 index 0000000000000000000000000000000000000000..9499aed67f0d5fedbaab1154388256eb3f96793f GIT binary patch literal 1039 zcmV+q1n~PuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q=009UbNU)&6g9sBUT*$DY!-ocWfB^#o zqCp6&$o1RDZ3YO71OM#Xw{he?C>Al;Vz+NvFP0N)$sGzo zm_!JspWQDDLD-#n(Ar357Z%bO=>=iQHVa{N+qdn7;gLobs>7PFWLAVIJZ)qZIpHt6 z{lH)#$iS7|f87`!F=^D7>tDr2p6k|yAp}1xOZFVe$nnD=yn68(9-LPj0w9wsU(UR_ JbAbT?06VsW?r{JB literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/441.gif b/SRIP/Libraries/T1/441.gif new file mode 100644 index 0000000000000000000000000000000000000000..77d210dfe7c07230e70f384176c376d56a0142a3 GIT binary patch literal 1034 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/451.gif b/SRIP/Libraries/T1/451.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5c49d5331757a3304c7502242245b17e6e0cda8 GIT binary patch literal 931 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 SqIvluAIb?j^XknT5CA(H;l!{2 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/459.gif b/SRIP/Libraries/T1/459.gif new file mode 100644 index 0000000000000000000000000000000000000000..0de78852affdfe439b7e7c528152887cc2110ee2 GIT binary patch literal 1039 zcmV+q1n~PuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q=009UbNU)&6g9sBUT*$DY!-o(V7O_O@ zpFfNK+F4Q*;$eq({X&Wy$qa_W2+Bsf%f_-^NO(OQQVEGKl8J#cqJ?C)fgyoMA>A2V z5Gy1ZhHXS1I`|}{z90$>_!9Zypn`BAyD0P`lHCP_eX=T4BvLC_u?dTX9H)?1zkNy+ zs_n-%A-R6{O2}QCuu0jybQ8`AY42;=knwCB^uR5oxrKB4)jD`eBvgfAMA{=kkia2+ z{rDXsz|fV*YdiorAaYA&Glx#Li8QATE6r&g9tIINQlu*@5dmOukw{y#N|m-S2+q8@ JbBF-}06X#5>jeM+ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/463.gif b/SRIP/Libraries/T1/463.gif new file mode 100644 index 0000000000000000000000000000000000000000..9856abcaafeab85f3c81d2fc3c78345a23314046 GIT binary patch literal 1050 zcmV+#1m*ijNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R0009UbNU)&6g9sBUT*$DY!-o(f3gob( z;suEWIn3I}@sxyzL|%mwct{w>le+RSzA(?j^?;PN=&q~1y+cLapws3u#W8ahSgfP^g4eRN?_|BdC0kRcVXz6GYlY|j~ Un7dl&%o)+Vy7lYW8wLabI|c0i_W%F@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/465.gif b/SRIP/Libraries/T1/465.gif new file mode 100644 index 0000000000000000000000000000000000000000..da772536b7673927241855e336ad9acfb9ce6f6b GIT binary patch literal 1034 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 F06Tku!YKd% literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/471.gif b/SRIP/Libraries/T1/471.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b37ea3a0fe8ed688fc679137d4fd22a0698e7ea GIT binary patch literal 941 zcmV;e15*4)Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pz009UbNU)&6g9sBUT*$DY!-o(f9{B~# zKtzL6@b&YTYr#c=q55s?r{SZ(5%2mjLUDqCNdPHC;(0l6QNMW~XbN=I51!7QJ%0k= z>GLO1p|AYK6MFQgjehl7{5$fe#&lxGt PzJ(`OsNK5_0|Ed$K~Kqy literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/474.gif b/SRIP/Libraries/T1/474.gif new file mode 100644 index 0000000000000000000000000000000000000000..693a4990b3055f012f96a8fd0a3090e01bdd8ac0 GIT binary patch literal 1041 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/492.gif b/SRIP/Libraries/T1/492.gif new file mode 100644 index 0000000000000000000000000000000000000000..2301c45407bc7a5e47a123d4b7fbe96c2ce2950a GIT binary patch literal 904 zcmV;319$vKNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000PO009UbNU)&6g9sBUT*$DY!-o(f8U*t1 z9}tNK0ae6ku;M?C1b6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P$009UbNU)&6g9sBUT*$DY!-o(f5?tnw zpCAPi3Hs>9PoKUR83p>7rmy2C3L#T;^T;n1%8)bo$@FI_BmgOdJnBQI#ip{39--I- z@Y5rfp_usjLnqW`ieDuw4gCN$>d+ZFsdcz2lV6IV0I+&g23D-TrZ&xj1@KQMwY5M& Sf{hE;6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P+009UbNU)&6g9sBUT*$DY!-o(f5~T7E zoe7Bs^Y!az1S3HV`Zjj-C@|7SZ4yWV5bYQUrGRJ~-@tsdkslb9InZsK zq|(E=p#n%E2(^)x0hN36ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P;009UbNU)&6g9sBUT*$DY!-o(f7CgX8 zTM3B;8}RVwj|)bEMmTo-2q1wMbR5y`APGZcyCNh3aTBSCWD9s4&w)blk-#L8rbq&S z^N*vi2SRmmOvgaz5_SHN84+6K9!E1m0W9LE4T8`O+5CY^k<|@Hm_jc^^QVqRRxcc< azV$aOK~?~8>D&cSLYv;bfCCE+2mm|x6~Ltc literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/511.gif b/SRIP/Libraries/T1/511.gif new file mode 100644 index 0000000000000000000000000000000000000000..195f07531d46116d104ac9c4df255303f427b419 GIT binary patch literal 929 zcmV;S177?`Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pn009UbNU)&6g9sBUT*$DY!-om2v4WUz zR6l+c5iauwETh2+-})KxSddUZdMHQ|yr@T|zy+=RrAy%wzzlvOYXWH14;+P>QZ7c( zX~thaod9n2Tcs1p$&@uQ@mq#8SU;*dgH6@x<6plsL@)NxdB!VJ3e_+oUCXvD$$$Vm D{06(> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/52.gif b/SRIP/Libraries/T1/52.gif new file mode 100644 index 0000000000000000000000000000000000000000..21f2eb44a7848c4fe7a0fe74648553e7e98c6306 GIT binary patch literal 1030 zcmV+h1o`_%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q%009UbNU)&6g9sBUT*$DY!-o(fx=7=% zqQ8IdQba6a$D6-?AVW^G@z4P>kRL;aq|*=rD0U%J+AFuR;TVeY?%)SqSQWww`R5=~r3lCN8x+;xS%r5h zqFa*CQ^h(8?SRyzkW*NMdi(KB=r?IX7vA~Q?h}G;+<@Np>hz2NW8dl;{gExJCI1~ AnE(I) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/520.gif b/SRIP/Libraries/T1/520.gif new file mode 100644 index 0000000000000000000000000000000000000000..cda0a1621970600f1491414ce24811dce9582d0e GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-o(f3e>Q! z;s=QYr)=}bk(;$T9U@Zj;*O(9j(#AD*mbfcJ}3^K@Z-qOQm>Z&>NI>Z%%mXzNB9UG z$5H1(2*phP5l|2r$9)SautZtFpi_U&5XKScMQPQ7YU&k5SOUP5lK#qlB}joB$7&!F zF4*YL+zNvZdiv96MPV6}WC{jYaExO=LJD<=^@qtIn3KR3+Tn;U#=sJ2n&~^)Lo&x~ yR6=V@$MK&(Ypebs@Ql+WK3*Igj)>Q~TeUe68>!p9yA>D-7=sHRPQ1ABfB-uH)$CRP literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/525.gif b/SRIP/Libraries/T1/525.gif new file mode 100644 index 0000000000000000000000000000000000000000..d15822d3be0129e3aad2b299e37155cf300b2435 GIT binary patch literal 1039 zcmV+q1n~PuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q=009UbNU)&6g9sBUT*$DY!-oSY5Gi!y z7w<p0Y6vFZXi$q%fC9zr<2+xW8-DR7Qe?k(y^!EEp{X}NJO*$oU(UR_ JbAtf^06Vi@@iYJc literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/527.gif b/SRIP/Libraries/T1/527.gif new file mode 100644 index 0000000000000000000000000000000000000000..0348e85068b1b85911bbdac7aa0df9ec3db94489 GIT binary patch literal 1048 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 b5a88M7lXJf`c-4vGOv`lfCCFQ7!UwEfws!l literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/536.gif b/SRIP/Libraries/T1/536.gif new file mode 100644 index 0000000000000000000000000000000000000000..cdbcab66abd8e323a5dfd77402412a5155405d69 GIT binary patch literal 961 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/553.gif b/SRIP/Libraries/T1/553.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b160660e4a945a38ed9759dccb5edb1fffe5a46 GIT binary patch literal 955 zcmV;s14R5sNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P>009UbNU)&6g9sBUT*$B?!YBUxIb3)p z;>3h3%vro>Pywun$v7G`6wzN4kpwSjE4c%uKmxf+a!cS6K%$cVtkne2%pakZ$95*r z0pOayIy(jOh-fD%fE^LtIECtO!qkXXlal<#z-cFcuy!7xK!KD$d2R}bj1dYM&WL|F dZn=l^U&L%8IQDq!FPV-FP6G=bOt@x106XKW#<2hZ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/554.gif b/SRIP/Libraries/T1/554.gif new file mode 100644 index 0000000000000000000000000000000000000000..2ee51e78c11d101b705f99eedb30968f64fe4df7 GIT binary patch literal 949 zcmV;m14{fyNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P*009UbNU)&6g9sBUT*$DY!-o(f5=?=u zUq2=i32NxauVbH#0y{|K$gc@VfmQhR8+T^FNdU(B{iE^{fC+W{)N!Z@sUw-14V-nX z2_S_(Iq+vhB8CB+Fj#T}K Xfqj{>U%C=k`N^_Cw69;k0RaFz%d5yr literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/557.gif b/SRIP/Libraries/T1/557.gif new file mode 100644 index 0000000000000000000000000000000000000000..90592667ae8b6ae4f3eb8fe119330b73721935ec GIT binary patch literal 923 zcmV;M17!S1Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Ph009UbNU)&6g9sBUT*$DY!-o(f0{8&! z-xi4lGc4=Z?-oXagE)5lD3Adxkse8Y5ZMnD$%!mIyqqEuk${)EL6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q_009UbNU)&6g9sBUT*$DY!-o(b;z+~I z-;am{C74RruOqu?Ae%^lNTs7me|P3Dx#vn^1tGzk2&w8 Ott7~!OP{VVAOJhT_4T*_ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/573.gif b/SRIP/Libraries/T1/573.gif new file mode 100644 index 0000000000000000000000000000000000000000..cde4a1a03b4aa3d48d9d44ec4771270ecdabd61a GIT binary patch literal 902 zcmV;119|*MNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000PM009UbNU)&6g9sBUT*$DY!-oZd{Q3t3 zB0@m_GFm(cB;&u02QhvGSx_X&k{VAAG^tXc$Cdy({sRP)Wy_Z^ao$Y1lV(eqK2?eg cdU7aC03Lr41?h3-&xyY(9-T_H>cfBlI~)A0HUIzs literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/574.gif b/SRIP/Libraries/T1/574.gif new file mode 100644 index 0000000000000000000000000000000000000000..48cb8f0c8a11cc30b9bff26736649283b5acacbf GIT binary patch literal 956 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/583.gif b/SRIP/Libraries/T1/583.gif new file mode 100644 index 0000000000000000000000000000000000000000..6cbcce4b7a7f89ddf83cc691362c5398e7459baf GIT binary patch literal 1008 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qh009UbNU)&6g9sBUT*$DY!-o(bGH}(e z-!Kdj3)0xfv0p9-83n@V#&KW2eY`+sR9Dg@M=Ka3o-CQEq?d@F{#EQHkb<**nIIxi zHM7XTH~98J1mcp{1A-)>JVayi+f#y5_Q|{9kYqn@1~CNd=fmN*e*Z!p%=x3M$yx_J zk#+ku?%al1>l&0>wxL+P1W{zW+mMXTRtyHhFod@4Lp}8NRRX|(2FZQ3R6cyOkJ}$t eEuUm0;D(t?j&VW?{JW2pml3LC%bsm8AOJgmSLZnZ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/588.gif b/SRIP/Libraries/T1/588.gif new file mode 100644 index 0000000000000000000000000000000000000000..58008880d59ee0dd80db9b3de702f6c04c944dd4 GIT binary patch literal 963 zcmV;!13dgkNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P}009UbNU)&6g9sBUT*$DY!-o(f8qDD7 zAE*fu2|}UPkKQZ?83khC)UV&DkODV6>sL>W1e5>}m2{^9Wd>vU`UTT~G60a0_=Lc0 zQ?lO$m>6F5i+3sk$^zUU@|b)4;%%mBud($3Sh#uT?7a#Ud%Wk06V9j$CCg6 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/594.gif b/SRIP/Libraries/T1/594.gif new file mode 100644 index 0000000000000000000000000000000000000000..493c15527faf9681f48242b10c3e83d9c254ce93 GIT binary patch literal 953 zcmV;q14jHuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P<009UbNU)&6g9sBUT*$DY!-oqM0QyG- zB0@L(?gg<}Pyr}-{K#-DIEx=YWg`jx@Yl~-gOmbuIP1r+3rvBm`1Mou5~c=k{Nla1 zNnlpLewS_n0AzBUQUEmhol$y;W~>1>VZ`%yPbAC+Is4^N3dtlr95-Pj9=WRfCCE-91s9IK9R-! literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/597.gif b/SRIP/Libraries/T1/597.gif new file mode 100644 index 0000000000000000000000000000000000000000..466af7a266136804ee60a71494da5a34a4bd6286 GIT binary patch literal 1039 zcmV+q1n~PuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q=009UbNU)&6g9sBUT*$DY!-oP-6#CTw z;z0?N`t|E#(V#7j{iu-{(NQ1{b09V9OZ6oJ#0@A@_VcH)*_Q_nOUU#_D_2TP4HKLK z`REcN00Zox3fB)_B8C}2hVuZxVbp$c6*}t&Nnr(e{gNe6$cyhnLmHC@*_%j|~@ghL5>+-anlGMjCP3iJ^2hl>y)Gz$=vT+Y0? J^M(Nd06V?K?@<5% literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/60.gif b/SRIP/Libraries/T1/60.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee899bdeaaf7c15ed03659ed3a9d1b845cc78e38 GIT binary patch literal 953 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 VN`$L36ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000PZ009UbNU)&6g9sBUT*$DY!-o(f4!na& z;=uyNa#=Kp!Jo#B1Up^=NpQ+P5hMo^@|RNJiF&D80(jxCh)h!FWS*c$OQw;0I%Fn# pCKG@+Xhr?;k=exG37K8WJ&<`vSJ7M_TjqjwwM)^jU?T&oNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P_009UbNU)&6g9sBUT*$DY!-o(f7G(0N zU!4I1Ye@V;jUT^Y2qX^FfUBQJRSQG{(6Ef3Nq%Bf0x;sS-#HruL=F(ruV*)z07Ojl zC`|=WRUY|S0J`EOtei4Ynd~+KXqSHf`so1*K#og#IDpRJ=F$~cEgtLX;Ofd_5}-SK h(&9RS9Y1LdxGrdkS1;eZK=<6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q!009UbNU)&6g9sBUT*$DY!-oSA=(*Ph zB0@m^{2{YwaECm9_2zs#m4c(dT>ju4(U#HN8vz!>;PZEiL92Ed{r!Phftx>mLIhFnGX7(MrVgx literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/619.gif b/SRIP/Libraries/T1/619.gif new file mode 100644 index 0000000000000000000000000000000000000000..e1c649cf18f8b330ba1d3056fdafa13644e55928 GIT binary patch literal 920 zcmV;J184k4Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pe009UbNU)&6g9sBUT*$DY!-o(diuo5I zB0@3!lo_#T5Mw_*91D5`8FJvrk|z6oL@ChY1(pD2$m<6a0FHV6cGNUS6DEy$|7v2{ u*N?%@l`wgdWT~`fqJGwDR-h-ZW(|D(ywsHE4^+(}{^Gf)NwzG+fB-u$(Yd|= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/634.gif b/SRIP/Libraries/T1/634.gif new file mode 100644 index 0000000000000000000000000000000000000000..b346a652c6e7fdbf66870a570686c0768da7654d GIT binary patch literal 1065 zcmV+^1lIdUNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R7009UbNU)&6g9sBUT*$DY!-oq=`9n4Y zB7gyC5Fskj0MEOA{Ulh7vko4}ll^@0uqe<6K9s+9umo_y4?2{DSRyb%4CJ?RAT=eB z;N#(oY#_I#@PMk{u>?JUG(M~R0%iw_A5Xsg_<#UAc#81< literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/638.gif b/SRIP/Libraries/T1/638.gif new file mode 100644 index 0000000000000000000000000000000000000000..8dfae45f1c838c70ef9f8de23ddc0984df9d6286 GIT binary patch literal 962 zcmV;z13mmlNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P|009UbNU)&6g9sBUT*$DY!-ov7{S)^9 z;z2?E{Lw36v7m)|{`^?zNN~U`f6y|JBnZf#KP@W<_ITHi(}0)&9)R=b2`7LE#{6Z| z;4_#%doz6g;pZ=mPZ~@|A;9T?oj+0sa34W1FfFghDf;1C@^Nh=Wvu?%&0nJ&Gx`-1iP8<*bJKw0#kN^Mx literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/639.gif b/SRIP/Libraries/T1/639.gif new file mode 100644 index 0000000000000000000000000000000000000000..8128b13b031669d7654e64e54ef15b17cbbec371 GIT binary patch literal 937 zcmV;a16KS;Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pv009UbNU)&6g9sBUT*$DY!-oY!u>t`x zAt--4Dk8i{MdQJXu{;(`5X>L52O)H2{Q0p7V5Ps1Hdp@p z!qb2)f0lSAAodUF%K@qUO_RX$qCb~5LH)bRa|+8JJXNs#6m~364dDD0OTd$ezc)2` L%AHHsV?Y2qjt9U& literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/64.gif b/SRIP/Libraries/T1/64.gif new file mode 100644 index 0000000000000000000000000000000000000000..725171c7a8dc36f733d630eb3669e14fb3671d98 GIT binary patch literal 1040 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

6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pv009UbNU)&6g9sBUT*$DY!-o(f0(jsH zjKqTv{N?jB!BQmv;^?XpQf1>%K4i!Ge$`mGd=mM z6<}sOe`IFj(5Ej)O9GVqshUaQ=S(X8;)!UPK-#}eGi~_WC$r@fe@$irsPr%GOgZ;} Ls+~)>V?Y2qCS}BG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/657.gif b/SRIP/Libraries/T1/657.gif new file mode 100644 index 0000000000000000000000000000000000000000..74caba196921e8af5718345805516456c31598c1 GIT binary patch literal 1021 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 IJ`4x|JJKe;1ONa4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/669.gif b/SRIP/Libraries/T1/669.gif new file mode 100644 index 0000000000000000000000000000000000000000..2cc2d6f98fd9ffd26a46bb5796d3c56b378ae4d2 GIT binary patch literal 1033 zcmV+k1orz!Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q)009UbNU)&6g9sBUT*$DY!-o(XCQ#$* zpGAFzW<&(Q;ak6tAN}>y#Uo-Lkaoa;;r5Xlhld%&fg~ZY0GM_C(xGt3=i?kC3J3!F zn8jg`k0lEx=+%#1iH0SR9z^m{5>%-MV|+x_P!iUHTKjQjsN$oYg9CDjZ8$=ozgzc?e&H|_jBq%y!@d226daK*=LUz9KAx*VkjlqG z4;dWpSF44blT3iRL;35xaaG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/670.gif b/SRIP/Libraries/T1/670.gif new file mode 100644 index 0000000000000000000000000000000000000000..4a1474598a890684d4be962f06897085f821e2ef GIT binary patch literal 1036 zcmV+n1oQhxNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q-009UbNU)&6g9sBUT*$DY!-oiCD4O@L zU!npK3C!m;B=ejzg=I%yJQ#wz+)B0HI~VF5Pj`u)o%sRDqC{ct!e zfT$zCe02uW>Ill=4Wr$D5M0Bw;fiz}wT&n!q$)#HAG={OsK~2A9~Ao)Ie4XCKT8W6 zT=S?b!@;sB7nbSB&aOca-drX$0k7jBgwj3^OQ7&YM`R2Bc8Ylp#zIkU6B#7o%`Lyf z3qy7EBv8bQ7jCv01-;OT(OkIHwd6PMiNgd<*m*SSF<6rh8RN)fIq3odk;s!PU(Osr GKma>B^z4oR literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/672.gif b/SRIP/Libraries/T1/672.gif new file mode 100644 index 0000000000000000000000000000000000000000..b845a2d91c766aa7d24c7de2b954d7f2b0b6fead GIT binary patch literal 958 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 QuE_{vsNK7GMFs=_J84hEw*UYD literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/679.gif b/SRIP/Libraries/T1/679.gif new file mode 100644 index 0000000000000000000000000000000000000000..74f5e74668f8ab2b4b43a3c0319679667cab1876 GIT binary patch literal 918 zcmV;H18Mw6Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pc009UbNU)&6g9sBUT*$DY!-oaA^aDfy zB0@U+_|>p@utUa091VKp2QnnV4*mKuGI{bN%Yh?HzKr=&phT550W@-1b0^81K4r3O sl+p>%j2v>xLYlK5)0+SKIcw0A->w5y`6aFCYtfkjIm3z_%Q7GUJ8*-!A^-pY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/68.gif b/SRIP/Libraries/T1/68.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b091928b90f5e54794c0942fec02ca52398bb18 GIT binary patch literal 962 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/690.gif b/SRIP/Libraries/T1/690.gif new file mode 100644 index 0000000000000000000000000000000000000000..e376a1370e7e744b4fd0d4ce5753a1dbe5b92a91 GIT binary patch literal 1045 zcmV+w1nT=oNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q`009UbNU)&6g9sBUT*$DY!-oi4(~n&M|c?V^jk?T$%0)kA0|*FZl<{#0&(`6 z_RvR1Yc&KeFxD@h7KeDibtFiH73Se6%z?oR zXy$Q*ve1lOazrLH7??s3$9ZxxFpQ*+BePzia{uF4&(uR~c1ia8cMqOnh-UEMVbn2C P5s=WMOP@|1KtKRHJfQPy literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/692.gif b/SRIP/Libraries/T1/692.gif new file mode 100644 index 0000000000000000000000000000000000000000..95de74a3093aea8890ac47f2e978f81959ed31ba GIT binary patch literal 958 zcmV;v13~;pNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P^009UbNU)&6g9sBUT*$DY!-o(f5`6RT zpQ{-X3BuvmuOpg_0_EuI*pFNRkQ=a(?6(Fa03j>EDF6w?+{%_9k*tK}z@-gm9pCA2 zNrs%fj;dT*kTkAiH3>?0kzC~xfCOzFaZzv?!4}CNRk@JtWufY;j?XGoT@tS&s;UWW g_A92=r7V&yssccVwyw(=@SI7}OSrIMfdK&kI~s(`5C8xG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/699.gif b/SRIP/Libraries/T1/699.gif new file mode 100644 index 0000000000000000000000000000000000000000..a7b33461bcbf04562a0314da2f873948a5db2399 GIT binary patch literal 951 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 H1_S^*USz-e literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/70.gif b/SRIP/Libraries/T1/70.gif new file mode 100644 index 0000000000000000000000000000000000000000..f30bf134fd62a16b047803efd11e3b7ed7039ebc GIT binary patch literal 1013 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DY!-o(dF7wB) zqO}_d- z5Yz&6RKpL|{Gnq?&?-M_b{SqeS;-*El?{1xl*Xgr;fKoL$_20|vPy@0=KZ^BlOh?2 jd49e;sqZsH3ZO>w>oxhbD$;;r#E7b~w(Z*v0|Ed$YJld# literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/703.gif b/SRIP/Libraries/T1/703.gif new file mode 100644 index 0000000000000000000000000000000000000000..88cb6ccabbb298a33bb8fe3101772cece7160afd GIT binary patch literal 1039 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 Cx4IGl literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/712.gif b/SRIP/Libraries/T1/712.gif new file mode 100644 index 0000000000000000000000000000000000000000..020ea17c9c8b38b1be17ebd643717c0dce97a8b7 GIT binary patch literal 954 zcmV;r14aBtNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P=009UbNU)&6g9sBUT*$DY!-o(f8Wa<6 zmIa9f4-6{C@7@`V0%vIAN753=f&EBcItf5bzkl~kf^2a|9lw5gST-WbPuK*O@pv|1 z$;4m3e!f`dn3po$4whAJ@)N{TgEXl)SgJa@Zwbo-yGSBq2>=aGCS)`5oWatM(S971 cGUXR30ZUdlRh1wchF`oeWCIHxJTM>tJL4t5p#T5? literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/713.gif b/SRIP/Libraries/T1/713.gif new file mode 100644 index 0000000000000000000000000000000000000000..66bb7c07331b662b15189953f101d19cef9e3f74 GIT binary patch literal 1021 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qu009UbNU)&6g9sBUT*$DY!-ok$B_PK`4RNPK7~hvBsHP{L`bAhwi*clw##rwG}GSAySMM%0RaFzCU4|H literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/73.gif b/SRIP/Libraries/T1/73.gif new file mode 100644 index 0000000000000000000000000000000000000000..6fd522490f95eaaa594818b1f243eaefab98a0e2 GIT binary patch literal 920 zcmV;J184k4Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pe009UbNU)&6g9sBUT*$DY!-oVlz(WEt zVFq{5Dkh93&Vj~*(fqCWXz-OkKqL$P@W(7A!8I&h4#W~uCV(3?W%|kKa%V4_08;tO u12kl?qW<34w6M-!37d)hje}sb*}q&soB8XLbt}*})J6gwOSY`WfB-xBHM_3> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/734.gif b/SRIP/Libraries/T1/734.gif new file mode 100644 index 0000000000000000000000000000000000000000..44c710d950fe24512d0538e451e496f6129a1d6f GIT binary patch literal 1051 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/744.gif b/SRIP/Libraries/T1/744.gif new file mode 100644 index 0000000000000000000000000000000000000000..c4d94687c02fecf487befb75ac41b5d13d406df9 GIT binary patch literal 1036 zcmV+n1oQhxNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q-009UbNU)&6g9sBUT*$DY!-olVwEE}I z-#i--2QGLuub)SczA^&9q3WYaP8p}PGudp~M~G0|ePkzU!H<^>5m4&bk6)-70&jZE zDa@oefS(Ke+*u*)(>A5g;G{}M549eEsxF= zI(g@jpC$nY8G!Q$CgG5JA444^V9TSq6bbFj1ZuF)M@S0sc|3O`FPnQF$+b}E&!aJe zJz#wlSDCZNX+Ki`$aRdaM`5KEqBBX`qqrpm8nS^`yDYkFh#$7#L|f2Vk;s!PU(Q@$ GKma>Yoa{9K literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/746.gif b/SRIP/Libraries/T1/746.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5aa77d63575d89bb228146f25f8b1b185670ef8 GIT binary patch literal 1037 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/76.gif b/SRIP/Libraries/T1/76.gif new file mode 100644 index 0000000000000000000000000000000000000000..80c0d5bce127a0764a51a3346e93a876f64bf81d GIT binary patch literal 1022 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qv009UbNU)&6g9sBUT*$DY!-o(f0`Re= z+COqz7)TUo#9Y6RA2A)+Xb+@GH4-b_Gx-r328oCX3kFq)Wmv4AIwJ?w z_RFepfwF$P5bAKcf#I5uC=S*b*Kg;-zx@Iid_nk}j)sU83oJ0mTfcKV96DguPn@?T sI&`S|IPUSowle#-=0E@iP&ySMM(3j+cGJ5vklG5`Po literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/766.gif b/SRIP/Libraries/T1/766.gif new file mode 100644 index 0000000000000000000000000000000000000000..ccaa109be0ab7030cfc6b2b0c096d59ab2c9ad72 GIT binary patch literal 952 zcmV;p14sNvNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P;009UbNU)&6g9sBUT*$DY!-oeC$ny8^ z62yaW`f2QSu^=IM8t)nDNRW-jeuqdBbahgV%7Mc)&SUTrfCq3IZ`C9~=wzIlDo*w* zP}9gsR{~y6K&KJhikf^*da60#*U2?ClbnP`q2|1kJ8E{(rx93%mqF@j{C4)`t&^>4 a`nac&UXGdtHuc*_q^94$fCD282mm``-OUgH literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/777.gif b/SRIP/Libraries/T1/777.gif new file mode 100644 index 0000000000000000000000000000000000000000..30041cfd44711ef3f2635e341896cdde232af9dd GIT binary patch literal 995 zcmV<9104KENk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QU009UbNU)&6g9sBUT*$DY!-oZ5{PF@3 zVV`vT#C@n(a6`9#{P<17Q-Gtu68u1h>~|-C$yzBx#w^6~hrE=Ogv7kprDBqmBNk{< z$)@5apaO|Pe37nSzeofBIW6iiKqZ+J1}d#8lM=zL4FkxenlvO?h5?-RBl|<@+J|Dz z3Ix#(B)11}#{yVjDJC3 R{Qz<4OuDq`(+&dy06R>S-YNh9 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/78.gif b/SRIP/Libraries/T1/78.gif new file mode 100644 index 0000000000000000000000000000000000000000..30c4a217fbe12ed1202a7134c5f79c0dafa9e8be GIT binary patch literal 935 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/781.gif b/SRIP/Libraries/T1/781.gif new file mode 100644 index 0000000000000000000000000000000000000000..c9fef9370319cbbe29e54bd896adc704bea0e4c6 GIT binary patch literal 931 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 Um`EmrEfGn*y7lYW2?hiJI|xDlKmY&$ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/784.gif b/SRIP/Libraries/T1/784.gif new file mode 100644 index 0000000000000000000000000000000000000000..956b35d8c6d9545371c682218f5a6d964faef88b GIT binary patch literal 951 zcmV;o14#TwNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P-009UbNU)&6g9sBUT*$DY!-okk{riUj zBEo6?`c<@8@W#4~8#xL@AT8r91tJG($tZ6_N`XGoWd!w7Ah3-67S$x8E+e}RFB>Go z`K0C*oWdBqM8Ym(Iw3)e;dE4!3QkW8UV?a+5nYO!kev3Y*+gE(Vl@G5!dayzhI<*g Z7^s=S>58-snyq7#wy)p6fC&Z!06UiD#YzAG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/788.gif b/SRIP/Libraries/T1/788.gif new file mode 100644 index 0000000000000000000000000000000000000000..389de7b10410de809e0e191690d101edb7701e4d GIT binary patch literal 1046 zcmV+x1nK)nNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q{009UbNU)&6g9sBUT*$DY!-ohPNo@2) z0Yri=I`!knu^*L-0;Ry?x3S~Li%jNqj1`Myp^FXt_3Ia}jKEPci#*KXY-74M15Ip1 zvu27jflvV;nVb>=;>eFMLN_Ggtw>msEh`vIlQ5yin7 z;#Bf;l0f0VnKe2<=+Gfh2TlF_-P_fGAvwnVu61Nw?2JPe;C6Q;CJ4vH2^=^uT66{w QhteRUOP@}?y1;+{JGue$X8-^I literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/79.gif b/SRIP/Libraries/T1/79.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6b72358b2921022d33a49960643b1ac198c764c GIT binary patch literal 947 zcmV;k15Er!Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P(009UbNU)&6g9sBUT*$DY!-ofb_^Spn zp_zXC%uuLk(2T!+{$y}0c#&T}ks}9s1c@>w07n>4x&$x-WIu2lT@o_MPt;5Rt!$c^ zDJ3Sq9y6DH^p|dCig_{L%p_!UnNy=ETrQ}#^wLZ&Jb|_3SixGqfBjO-glTfs%s6NJ VEz9cC!=Q9hf9l=Kx39o}06TJP$9ez& literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/791.gif b/SRIP/Libraries/T1/791.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f4c8ca6f08de4570de3f712b9153471d026296d GIT binary patch literal 1048 zcmV+z1n2ulNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q}009UbNU)&6g9sBUT*$DY!-oP3+)$+G zU%ylonIwQ%fC|5l{XT*e7UZEKk-c!;QU;QrIy((lgd8V?fWQVVT1@-MZURGY{m#KS z*Z@p7eijyP>i3VB!ae=0C~U!wAEXcpjqppPuna#$483wi7zG|uhPe2xNEnJADgg_> z*gJa=L%(Yk77kF=uU_7RE%@DHXy@aiglhyZq!UtEgM=6qCuD*zWEO=Drr||M#~r_Z zY78tC)o+@Jf&=XITkWYK6tny;y_h{l)yH+29(w&Ok~cp<5F21o7E)x$OdBBrSOBK? SygH(lOP@}?y7htq0RTI#KJ2*w literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/810.gif b/SRIP/Libraries/T1/810.gif new file mode 100644 index 0000000000000000000000000000000000000000..335c5e74c996112a5420d04ed303435e46fbce06 GIT binary patch literal 952 zcmV;p14sNvNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P;009UbNU)&6g9sBUT*$DY!-oiuBrEp; zBEo3=_))QFa7?|7dN>jsa4X}n0U`&A$jGl%N|hPw<#;J@QN}6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q-009UbNU)&6g9sBUT*$DY!-o(fLU{#i z8-$1i2}q&muNou`1TYG;HK+d z7=<4_9|yJglU9J?0cHNeAhZzAp8|#?{J8^>kdsx0p8UO0xGvX#g+ctmqmU5Fy)F#b z_=}aW0kCWhOX=&8u#!J83=_mtmk`9eT4xt7@JIMy0Z`I1G?c;kpaDDn@HkxDIHNIt ztr9p4z^Y%OkOEU+1APGEmXf%(q*z0)AET=f2Rx$bPai*frbG%HqG_DJY*mCSU(S4C GKma>TgY2#V literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/82.gif b/SRIP/Libraries/T1/82.gif new file mode 100644 index 0000000000000000000000000000000000000000..17586081d5c2cde2094417359908dc196c5f0c0c GIT binary patch literal 1018 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qr009UbNU)&6g9sBUT*$DY!-o(fav0{X zV#R+wA_6e*tDnb@{dh#w;0q+YU-Cjie6R~-KV$%=sdQ*T2*`NRSX|IHvmqaswge9H zDAJ*cY#!;oDIt{T!=D~Y4YXj(sY9snS`4h=F`o{H5K#5Qrgf`FMGrrDoK%o&KeP=I z@#{CPK-+%v$~a`?k&i)6{j@o3K&qc3y97a`3+&K`M?nQkEc5uM@mdm?NnG;QuihU7 o4n-()2@)nmzNGQ33li~4E7CzV0&w62%*RAHWb59|+hITeI~058761SM literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/822.gif b/SRIP/Libraries/T1/822.gif new file mode 100644 index 0000000000000000000000000000000000000000..2aa5db3704e7a064a758e5e244963f0bf17bb654 GIT binary patch literal 967 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 Yg?QU<9gv*>%*~5~x3Ay7e**#lI~eWBpa1{> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/839.gif b/SRIP/Libraries/T1/839.gif new file mode 100644 index 0000000000000000000000000000000000000000..da4e1062af0be56119f325bf208b88236c3ddbee GIT binary patch literal 927 zcmV;Q17Q3|Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pl009UbNU)&6g9sBUT*$DY!-o(fI_US0 zNyLK=`1SL(;9@}mk^1q|;IUvKkt9nFJULS3N|Y`ED7e;dorRbg`$dWgAg3apIUDet z)UVh9o|5<#;+Y|yQl1<5J&hT4s!Kmom&ODoRRvG3?sx(KwJ(lXP+`TYUF$I*06UuY Byhi{4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/850.gif b/SRIP/Libraries/T1/850.gif new file mode 100644 index 0000000000000000000000000000000000000000..cbd2271332a917701f8da607c1d007ca79675a14 GIT binary patch literal 944 zcmV;h15f-%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P$009UbNU)&6g9sBUT*$DY!-ooi{QCC~ z2*iRCDN+PX=dEM~)C%ZY23{J*6BjVBeJE%__$*OWD< SG7TEHquslB^XeTK5CA*3oxzm= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/860.gif b/SRIP/Libraries/T1/860.gif new file mode 100644 index 0000000000000000000000000000000000000000..16867ff0fb4dceb0d0051ba0016644eb852d00bd GIT binary patch literal 1044 zcmV+v1nc`pNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q_009UbNU)&6g9sBUT*$DY!-opNaQpY~ zULJ@8U37}Kub)Sc7y*1i_pxL@h%YYrGwD&@iHAAP^;_8wU6f=VnLP|t&g05WEgs

06RDW+MfUb literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/990.gif b/SRIP/Libraries/T2/990.gif new file mode 100644 index 0000000000000000000000000000000000000000..3c90391717c7a6194cacba586a7a607d329d8755 GIT binary patch literal 1044 zcmV+v1nc`pNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q_009UbNU)&6g9sBUT*$DY!-ok=;7Ns! z9~6iK8Q@{o&!0zs+b}v1h3})kW4S!0d5DAA$8UB*5CG#5)k8NPqxncM@QBAc51WYN zb)#ShB2XOvaVKnIBn!j~OFebn-(1I|JRUT^S66@PKY_9~R#e} zSN77AGcZas6$;hl`AdlyoU`*w)LXd4piM^Og+n+g)`q)er*ydwDWGjXX-0;n# O8RgKUOP>xsAOJfU()bnt literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/993.gif b/SRIP/Libraries/T2/993.gif new file mode 100644 index 0000000000000000000000000000000000000000..8a1d1be1debd3d3c899835d10348255a47dd1710 GIT binary patch literal 1009 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/111.gif b/SRIP/Libraries/T3/111.gif new file mode 100644 index 0000000000000000000000000000000000000000..87ba74f247bc36fe8cda633768ce7bbafc06d1dd GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-o(fN=#Ux zkUxJtCJH1FMO?p+A0a)Q zu+vxsfdT61`>5n$mybmTI$7DTsl!A4!VwVoqh3F6{q+5KxUJte01pV2<98@SKXMTD ze9X6$+1LkfA)=s4&4NI@?>;<4;00GOMScZB=;zO>#=lG-4_sibpBc#mQ~AS*ITcIH f0-gB72LiMNbp7yv1^}qvwbdnZ&00;HVL$*oyrt!K literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/117.gif b/SRIP/Libraries/T3/117.gif new file mode 100644 index 0000000000000000000000000000000000000000..f3b12501c69d9cd155ed396d60daccfbd2907fec GIT binary patch literal 995 zcmV<9104KENk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QU009UbNU)&6g9sBUT*$DY!-o(fN}M=x z2{2%b7G0T`V34SK{`!gR2PWbPP9y)t!xgXJIfyINi98i*ObGxc*1de#Eu^;*1QYGs z+0ctWe~1V^SacNK!!G^o?GR|;4Y!d*8AA2P%SIqBgJkR$ss`_!@@9f(Ro zibVD!$H*TNmsA<};;15u1oMcj19+e)krxUBpwO=0Ap(j6iFBbD08?xgDlh7XtFq;O RWIQiw)j%{C&kq9v06Q=~*r@;j literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/126.gif b/SRIP/Libraries/T3/126.gif new file mode 100644 index 0000000000000000000000000000000000000000..d548f6ec1fd6488ded0d1a483584669c051b24c6 GIT binary patch literal 1025 zcmV+c1pfO+Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qy009UbNU)&6g9sBUT*$DY!-orL#IpiX z;D81V*d*HM&L4(~0P^@7Npj>F0S_-!^5zd;xpw~S;Yt%v!oxW&4J`q%#orczS`Iv% z;_s2bAM3!C013c^KX*qKFl!cpDS!_h+X?fx$*RC3F#XAb;8mcjk;_t)6|s(FC9e!l z`AcT(=}x9j{8@XzpqamSBS3C==TDTtU?W$6RP=PlVSnK^R8+9F%s|9_KxXjAErGx` v`E(Tk*~niu3UQL@^Ow1zgw_4(ksLGtWPmOIa{n`R0%h6Xz=I1P7!UwElZNhi literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/134.gif b/SRIP/Libraries/T3/134.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6d0f993b6c10d42e71d99bf6309be5eeec20014 GIT binary patch literal 973 zcmV;;12X(aNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q8009UbNU)&6g9sBUT*$DY!-o(fN}M>c z!l8e?)HI+7pn@rXApPM|FwsUbf9y_$v@-EozETMSSb*n`Wkfvu9tqS?%wN5Y5pDUK zbEOeYf3GHr3h6H$NL&*iZ2F}rj|+eLf^Zzz$lt830$uF$hXE`A8~*Z1Fx$#sEVE4d v*<)c=kH2GP8<6u?$Ltz^(h8W(C$k~&nVMi$Vn6^pRB+Tu literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/138.gif b/SRIP/Libraries/T3/138.gif new file mode 100644 index 0000000000000000000000000000000000000000..184bd59cc3219aecec73e22507dfab3ed8b511e8 GIT binary patch literal 922 zcmV;L17-Y2Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pg009UbNU)&6g9sBUT*$DY!-o(f0s-{v zA0QwR2?F`YvE#3d05*0U`7a|Nj({$XG-+{QM?e`xVm#RrB*$MOYqA{q5u`wpK3%>H w`V%El03%@rtvJ*t&5lHwa>VG9DN~{-ZwAfzucuG0RD;qCd$g?CvH<}AJDUNtBLDyZ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/145.gif b/SRIP/Libraries/T3/145.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd7358374153e2593ac16786881c245b97f22743 GIT binary patch literal 1019 zcmVNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qs009UbNU)&6g9sBUT*$DY!-o(Z67V6( zmOp>BU@dwOQG~93*`OgBX$svKh&|*%do!S*1Q2UhIOHVn!odc=Y8h~t=bxCC1Q7@e z#{goget3Wi1axmk!~t*UrJ4Z1!JvF~A`aXUZygdx<%DP@m_eJrb0o$VEYz=C2(<$z zw0lD=8&$Zj6alypjF|+rV89J5n@TCfYkCJ->334=wJ-z+h_bf8F=T>v`VrBZt5ZP~ p{={gNL9YivIP`Rkb+ymYjwz?;y-{m`ZNGl0dKiYwyEpHE06T6+;*J0S literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/147.gif b/SRIP/Libraries/T3/147.gif new file mode 100644 index 0000000000000000000000000000000000000000..ffad002c4d5f1269e0f41ae74e468d4b453896b1 GIT binary patch literal 1035 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 B)=~ff literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/155.gif b/SRIP/Libraries/T3/155.gif new file mode 100644 index 0000000000000000000000000000000000000000..c91136208456c881b8147c3d1dee1700e574fe6d GIT binary patch literal 1016 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qp009UbNU)&6g9sBUT*$DY!-o(fN}TBM zfP_Ja5Rv+a&w|7ar}~MUMuyCffgLoVVaQ;a$YWAI5UjChSHDOL6_Dyj&dC6R8)oqn zxz5Bw5+aEZtUwD~KU1OlO=5_&Ul@Tr{+#Pq?TZ0m(-1HeK!=~cdGqq|<7VOjfLr~R zJ){E7oVih62!$`WfG_>#MQ}W+Um?d#M7l*RsoyRE mh#5HR2gEUtez`UeKJBRl=+*t;sVjh(z^Fr00yuUU5CA*Vl<2Ae literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/161.gif b/SRIP/Libraries/T3/161.gif new file mode 100644 index 0000000000000000000000000000000000000000..3fe0472d3c37b52c5b720f997e7eb247e44662c1 GIT binary patch literal 1004 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qd009UbNU)&6g9sBUT*$DY!-oZByh8yo zVXA#3Djv)L50*xQfX4X~GEjh&S{Wd^@%JnkMS-dGO)~Hh(7kdW4h$UTPZY!@{?3&k z_{g8O0T2WE^Vdw4EHg~(`QuPA1}Sw*v-S+|@d1rCh0HBACg3B%Wm#RA6&L{>xIF$i ztp%{jpBV!1;;jt;ESv)X@9eEz<8KK74fO<@mF15H05kq@tz}F@0XBbdCO0(>GU0suQz3EH#( literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/163.gif b/SRIP/Libraries/T3/163.gif new file mode 100644 index 0000000000000000000000000000000000000000..e00081118ac3e1607c8291dff4ecc1aa1aa17759 GIT binary patch literal 980 zcmV;_11tPTNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QF009UbNU)&6g9sBUT*$DY!-o(fN<=8d zT0eD|DohkOYFD8*mDJpd})@;69gg>U@?5eyjxB9eaeP!QzO&)+48nD~h* zI0NL*hnV`ADM+a27NGoY4cxQrBP#_EdHQ38DV<4^OCc&?_3>l6OCLwNG-IX*05d)} z60A`5jog7Vddj#fuxP)%eDnGPeAh2wxq1H`-pB>yVweB=fm17&LN$Ih`D&gR5CA(F CFVj;1 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/168.gif b/SRIP/Libraries/T3/168.gif new file mode 100644 index 0000000000000000000000000000000000000000..aecfd151e62805d35012cf81d719a5a6725fa466 GIT binary patch literal 1013 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DY!-o(fN}M>+ zz!78r{+;7iOJV{*!20>ySFT<^S`mNr>er8*Hbnq}L=*SoArN)_)?s2n&{jWG4jCNl z$IM4Tp+6lq>Sv4rK^0q?^+Wf=p{jn(a>U{Rz)CHa{TMyu!!jN|ciQ|tW4S58Lk?HL zCc|)rC6b5(To58;!2pAN{hkq^I1uBy6odsz`L_>dVj}tcWl9WS!mxhdNF=Th65NQ* jzxsJA0h%Qm%B5He8BDmvy?(G*6V|Y;-y6z=0|Ed$Kdj{4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/171.gif b/SRIP/Libraries/T3/171.gif new file mode 100644 index 0000000000000000000000000000000000000000..840f7b659649422ebe6c5aa187a791945fe2a193 GIT binary patch literal 999 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QY009UbNU)&6g9sBUT*$DY!-o(fN}L$+ z!4-f1;NhV-APu>G{mkX#M<&Suh!iS;1c#%-7;_*!K}-a4SA&6uK&pGlAzr_B4h9|= z1hUpcANlrK8CU`p$bLW`GU=ym;16;Ay8ZkhwI3q@BFu<;H|9t`OAt?_V^_;vzhWE! z$ms_nq77tk6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qh009UbNU)&6g9sBUT*$DY!-o(fN}Ncs zpd5FPOh6n`rOLn@Rr>Kuhl8Ps9L9>lvo;LC1T5OV{$QuX_%hGBwDKi&Ntc51@_0IB$0lhCk1rD6S& zks2zHNlZ5psU#q%VA;=#1FQUO1z2E6cs~jQkj4*|Vm$WvQBf??8i&G9MA}i@=-;&u eij_Jod|_O_(SS9)>j$oc;vfC~WKjGtAOJgboaR3O literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/177.gif b/SRIP/Libraries/T3/177.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe8a6262f749f29edd15d292704922ab376d8aac GIT binary patch literal 973 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/184.gif b/SRIP/Libraries/T3/184.gif new file mode 100644 index 0000000000000000000000000000000000000000..5cdca624db47231206c34e6bd0fbb45e1dc548bf GIT binary patch literal 926 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 H!hirf<)Zc6 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/196.gif b/SRIP/Libraries/T3/196.gif new file mode 100644 index 0000000000000000000000000000000000000000..258df70cb492549590903d8ce363a1374af273ab GIT binary patch literal 992 zcmV<610VcHNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QR009UbNU)&6g9sBUT*$DY!-o(fN?gdG zNu+=03Z)njF+m1H`TX@8InoZq1*b@^YqlzzxPGW0h8Y=6ONxONU?GAitRJoe0~1iO zwIX8AF#`{9>c_4q&wlHiQK}?ud*J@itx#yB7`>}T_ThMT06ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qv009UbNU)&6g9sBUT*$DY!-o(fHb`Nr z-?Bgo1|B%@P>QpD{6hBoByhqm91n}}bJhh1jyq8Rn9u~RK}vo$31$gL&H_YZ{eBFD zP%+-6h$?vrWHO5%v>g!vxZxKLfF^JBP?d-Z-~~K=;q38y#dV-KfBon!DJziByngUv zmQ~;e9>0FX*aCPGQW;*he*Q(v@WWrRvQp-$;{YJeU#=?22(;9%4c8g=jsozLk6Z$- sM*1-#V53|=%~4bFE5(-|>ZpT6^3yee?EyOQ`i=Xbx3}-#1p@*AJKpr^)Bpeg literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/20.gif b/SRIP/Libraries/T3/20.gif new file mode 100644 index 0000000000000000000000000000000000000000..acade5de6b43169c3cc086e22e35a9b985b2356b GIT binary patch literal 974 zcmV;<12OzZNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q9009UbNU)&6g9sBUT*$DY!-o(fN}M=R zLYi^?`stwvAjh$O{6g~kG?BtIe&{eIImPdq0g1)<*&0}4-MkkPdGR|#b6vR&5_|Qt zf?&lWU(;GlM8^+VvXE3bR;$Mkq&yWI0pOql5>!@!EkK(13LwkBeq+Bv>DLRy*A%nR wMa}vk9KShaGw~xumPoyMPria^S5L~<1eExtBCDn!u>)UikPF0tEXRNVJB`TGWdHyG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/203.gif b/SRIP/Libraries/T3/203.gif new file mode 100644 index 0000000000000000000000000000000000000000..9c266d2f6d39e0a862d0560a512e279d456e39c3 GIT binary patch literal 1035 zcmV+m1oZnyNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q+009UbNU)&6g9sBUT*$DY!-o!A(24|6 zAcG7TGaQ)kiC&V5B8>U#M-tb$cugQi0AsHozhI_FzI#$}4oOo*0PyMe4obx>^7=Ue zLBP?uo)s%t>u0C{fExXf(X3diA1$Ys+|lDv5kLiM{ZIiQb1&b=t^;!Qi>4=DznonM z_VP!UP+WqJNcL04Xu(|^=Wc1xFO8FJ0Vbyzj9p@Z0hG_pryxM1NCF&004(u z`}V1+NMW5d2O0c;>sJj;#R97OeG`L>WGM_?8|WpOZOnkU0irxJM@S5UyU3F(UtTdF F06VN??&AOe literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/226.gif b/SRIP/Libraries/T3/226.gif new file mode 100644 index 0000000000000000000000000000000000000000..cf04a6b699f72d75d3a99b94846deac809f8d6e6 GIT binary patch literal 1023 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qw009UbNU)&6g9sBUT*$DY!-odDT>7W3 zPoEhO3HIUFuVY7e7&8{x=dq-^j3KP`D|cgpno8CB!OKXj-!fqYPsq#|%_ak%(S0?1c3u~s86n7*efEdL( zN+V^bW15Uk@bzmK#sL5dJ>TtsXsq8U8w7iGr1FqSK6n-iD(=VFVckyyBrks0hU1C` ti8nu7*U{ReCXXJ46Ya1~zLFmKaXOK4#-4U1H;Hk}ySMM(zySmV06WNt==}fy literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/227.gif b/SRIP/Libraries/T3/227.gif new file mode 100644 index 0000000000000000000000000000000000000000..1cad9da3dc475e35ddffafc1c2e44c3b679e1777 GIT binary patch literal 978 zcmV;@116ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QD009UbNU)&6g9sBUT*$DY!-o(fN}TAh zfQ=Qo{QVneX~2>f5D}E>N3xwelFs@ugV?EGH!?v44B$kv-yw+1`pF@fpc=^(4ldyAK}1L&rXi{BivR#L>P2-(ppDjk=FHh6iH(575Rt(3+c(K4HHrWV zAV2_sSHHJ#2lnz;E$=|Pnfwa0D@btNeuV`SHoRCdV#fVsLB{JBMlC3Y8wLabI}Ml7 AoB#j- literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/228.gif b/SRIP/Libraries/T3/228.gif new file mode 100644 index 0000000000000000000000000000000000000000..b38622c953ba41dc33b15691d4a36617bfe28dbf GIT binary patch literal 992 zcmV<610VcHNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QR009UbNU)&6g9sBUT*$DY!-o(fN=!)L z4XuCwjuF@>oi+n7^43hhh^m0YH{}|8zNsNFdh8b>{Z<`*l*{2SVXS zj!Zdm;3JIr>JqFnl91kkXGZ4uE6~}<1%v?@?uYnq1#bPkAt0P&B$~u#u{|J+17AN* Oi9y5#ow)SGfB-wxJKtyk literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/23.gif b/SRIP/Libraries/T3/23.gif new file mode 100644 index 0000000000000000000000000000000000000000..e87980016736b875292050467c63fcefcfd7ccaf GIT binary patch literal 988 zcmV<210(!LNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QN009UbNU)&6g9sBUT*$DY!-o(fN@Vx} zl0JW?CJq!6k69Q${ZLFakmp_@2moaC+c5D=zcvH$oSP^?T`B?sKX98Fk-#--5(WVV}O{3J~W6CIQzB$ahiT)5nFqP6EQk9 Kh(iw!2mm|80nu9k literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/241.gif b/SRIP/Libraries/T3/241.gif new file mode 100644 index 0000000000000000000000000000000000000000..85c94a43365b82f66b8f2e105ad535cbb49d8609 GIT binary patch literal 977 zcmV;?11|hWNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QC009UbNU)&6g9sBUT*$DY!-o(d@`wja zNCyHD3l}F_b9*Fws{|fr%dw(4c`35?Q}CQc_`q zM{GyPIQ`(kqfl0Rmj_vc>y%~%T=)4!T?MWPB~;!zjQtdSNRGCvE|D#0|Ed$rcui- literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/246.gif b/SRIP/Libraries/T3/246.gif new file mode 100644 index 0000000000000000000000000000000000000000..7dad7b57bb38a78cdcb476bdb2b11baf5a258db7 GIT binary patch literal 938 zcmV;b16BM-Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pw009UbNU)&6g9sBUT*$DY!-o(d0{KU= z;;)DTCsy3}4^YI4fIlUMS>$cev}CSNX&mgW_IMr(xFO@zj9*S z_^anbjUX`!y!q3p!-_dqDvc>rrBjAh2TF|?6XjNjU6+0}xiu`tpG7Mwt;rGR+NCaq MzMV_AZoz;6JJJxtbN~PV literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/248.gif b/SRIP/Libraries/T3/248.gif new file mode 100644 index 0000000000000000000000000000000000000000..2afb061d8afc677bcb4a489e17316f19919040f1 GIT binary patch literal 999 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/266.gif b/SRIP/Libraries/T3/266.gif new file mode 100644 index 0000000000000000000000000000000000000000..54629ef4b20da3e96ee88c12dd476050bc57ece8 GIT binary patch literal 1013 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DY!-o(ff}qy# z-!v}~1=dKCqz^xS{rKI>rXpf3kRMTg^yUKM$$ruRp<;vXW4~E0LE;=(LMOyUAdywz z>GL57b|JY4TtKAgLmwg8`S|hbHk7ov)q$YxRaFpVz64RYi45SYYfUx#=;h8ft{@IzZ$AMfo4jY3X- j-V9|sH0~psh)CF_R7pv!k5px)v1uu`w(Z*u0|Ed$wm#`L literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/268.gif b/SRIP/Libraries/T3/268.gif new file mode 100644 index 0000000000000000000000000000000000000000..27123458a000377dbbd684c01e9bc593beb34fa9 GIT binary patch literal 985 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 No!fvO3>soU06T~*-a`NY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/283.gif b/SRIP/Libraries/T3/283.gif new file mode 100644 index 0000000000000000000000000000000000000000..97ee34b15f191db81482a31ff6ebed3b1d1271f3 GIT binary patch literal 980 zcmV;_11tPTNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QF009UbNU)&6g9sBUT*$DY!-o(fN}Ncs zB7g;VSo!n!&mTHFLL%z1*AL&Vleh5o+ZV>+13>zG1%W^if{=8e9Qx>2tpGwI92|N8 zcaKy8ivm?p>lf{c2&4%Rm0Ow2m4^)j1Xefz@jw_#(Bk#$XRMALcs(duFp`H8CwBeP zA_X8V?py%V{K-WsZJdC+(!|}R3+=9ndyDSY={Mx=P8xSv^n*NCvX#3IzPUjd5CA(~ Cs?_HI literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/286.gif b/SRIP/Libraries/T3/286.gif new file mode 100644 index 0000000000000000000000000000000000000000..629913376f8a753b0f95e04856471ed29606010e GIT binary patch literal 974 zcmV;<12OzZNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q9009UbNU)&6g9sBUT*$DY!-o(fN<=82 z3n_p9{1KW6pu(tr{pOwP7jNQ)XZ`9StMb89Nr`Lv-4in~j=m=_`|%=JpL^9^wYDrvc!M@JLuNhSpWb4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/296.gif b/SRIP/Libraries/T3/296.gif new file mode 100644 index 0000000000000000000000000000000000000000..671c36534d58923ae2d5cf7e7c01bb4fe3d7193d GIT binary patch literal 1021 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 NrW|k`O?q@d06T$s;L-p9 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/305.gif b/SRIP/Libraries/T3/305.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a19ffd35471db836695416d83341197b7c3801e GIT binary patch literal 924 zcmV;N17rM0Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pi009UbNU)&6g9sBUT*$DY!-o(fN}L$6 zLnCqj{;BFP(Tb{n#u{0%qEX^URXGOc_?I$b$$@gjHJW%*)yItDC^oXG%1Vb0FDVkt yD6}Baq63d21@JHDQl>MPlC<)4>Qg!YI4(8z?KOon9LT1OPi$?7SEN literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/313.gif b/SRIP/Libraries/T3/313.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c70fe987bec32f7cb4238495448209abf230b9d GIT binary patch literal 1014 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 N04RS3Osy literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/32.gif b/SRIP/Libraries/T3/32.gif new file mode 100644 index 0000000000000000000000000000000000000000..22882a11cc07aea5e83e239b7cd74e95b9b42480 GIT binary patch literal 1003 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qc009UbNU)&6g9sBUT*$DY!-o(fs?bF1 zA1pg|AVeJKsGrA=?9OZiFwP^hSSaWH8d(yX1%VgFxdT%nV##I#Bk=jC%4R=xJ|raj zxKE4Ej~}~xKaV06XLH;M4#B literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/320.gif b/SRIP/Libraries/T3/320.gif new file mode 100644 index 0000000000000000000000000000000000000000..255659523ad59bf93fcf9cc54063bd3b3f239dc1 GIT binary patch literal 999 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/334.gif b/SRIP/Libraries/T3/334.gif new file mode 100644 index 0000000000000000000000000000000000000000..ffa9d6d7cddd3dfb75756ab1989ce74e0a087376 GIT binary patch literal 1043 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/34.gif b/SRIP/Libraries/T3/34.gif new file mode 100644 index 0000000000000000000000000000000000000000..7f06e214bfb4938a29304b94c0b6759253bdd26e GIT binary patch literal 988 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 GKma??yYOrP literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/345.gif b/SRIP/Libraries/T3/345.gif new file mode 100644 index 0000000000000000000000000000000000000000..2115d4780d7a417487e9cacff0651bf7d249f383 GIT binary patch literal 945 zcmV;i15W%$Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P%009UbNU)&6g9sBUT*$DY!-o(fN=(>6 z&cA=+I!qKON8CSEsv2pWsOq1wksARR``73o$cHPf9JKOJj>8-#5qf-B(%8(J4=w(a zIj}<`j1W6qG%2T1$%{52(p*aQAIgVDRf$t&^J2<^UcU|uD^}&dvI0w@1yGWx*pgRM TUUd7_qbjtGGOpdrFdzUsbri&p literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/347.gif b/SRIP/Libraries/T3/347.gif new file mode 100644 index 0000000000000000000000000000000000000000..30e4b05fbfa126ac622be3f0b4f90804e27d2a4f GIT binary patch literal 1015 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qo009UbNU)&6g9sBUT*$DY!-o(f0zg6N z-#sJ}2Rg{Z&YwqVO)@$F=8qmDG#xc%MBYu7^H0a6}EMbzNVAFTuk40-g&Mq(O|;=*lxr$8ct8-0kKbC<}Uw~PcU zn9$&l3*3Tj72O?}VII2%dj*Q|hb}OH4c+$jc_<{x0fTD%0fV@w->(P+O~m8JBx0m~ l>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qw009UbNU)&6g9sBUT*$DY!-oflw4(Ki z1Vn>W=Jngi4Z}r&8(InTw{c^Yk2bJv^j8hqMn)Goa4VTjL$ZxEAQA{x(q5V?8^dXU z2%{u5H81LIbaAn0zimTs+}qeEz{L#a`kismjHJ2-9|5rH7fez=fA4sN1#sY*zqkK5 ztrZxkq`zJ()&>A&x1YEqVWpG|XKW)m6c-b;+PLjVff^fq4SgtRBfcvKSQIMx0^+)j tw7@tcxsjIxh%4lkJloG)p#>jxtxi_Q!rB6ZXaOQKx3}-#z!e4r06Xu6<`Vz_ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/351.gif b/SRIP/Libraries/T3/351.gif new file mode 100644 index 0000000000000000000000000000000000000000..e8cf15896db4c3453c443b50dd397d383a0a7515 GIT binary patch literal 998 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QX009UbNU)&6g9sBUT*$DY!-o(fN z*UUmedHilbEX8jS!2y!?>7%ifACQ3t#(m{t%cfLM&Ow Uo%ty%>9~L*ei$aJo){1SJBMT8`Tzg` literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/353.gif b/SRIP/Libraries/T3/353.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0215c28aab83e12f612df0a1e69fcbfa79dfa51 GIT binary patch literal 1073 zcmV-11kU?MNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R7009UbNU)&6g9sBUT*$DY!-oS?h)CtH z-=7fIZe@GB4 z0LY)Chj0416JZe4z9kQV^}7V%P%a|^TbvvAkjA-w_DUR&4WdfUn8DccwhICV)m1ZZZ$G>UW9^77ixUt6$GveLw&^0r~{V literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/363.gif b/SRIP/Libraries/T3/363.gif new file mode 100644 index 0000000000000000000000000000000000000000..dd35e8f50b6ea1bf46c64f6fae7170a50844314f GIT binary patch literal 982 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/375.gif b/SRIP/Libraries/T3/375.gif new file mode 100644 index 0000000000000000000000000000000000000000..f81849432201da48469bbbd449f9355865a1d603 GIT binary patch literal 986 zcmV<0110=NNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QL009UbNU)&6g9sBUT*$DY!-o(fN<2ux zP``e83``VwArQZh{oqB}c;+KWer_gOc=j>gi4$P7+>luE<1&H1?geuY5t&If0JP-$ zXsPGNbRhubF`3IKKY2wqFk>1qm`OkO`kCxS0OAmn_K0aUDFh-3Zx=8AOWUt3L_sF` z^&3Vuq5(TuJbBX4>Ek#R8wVEq*fg*}M}!Rvg!l1^VgQsr)_A-|@?$gl_)UH+PV?i> I5CZ}LJN&5CMgRZ+ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/384.gif b/SRIP/Libraries/T3/384.gif new file mode 100644 index 0000000000000000000000000000000000000000..43db620a1f63e507818b91894c9581780cfaf56f GIT binary patch literal 1004 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qd009UbNU)&6g9sBUT*$DY!-o(fN>tbY z**|~6giHiL;0CyUAp6NPB2fUKe(^|2k)p4kGl?hVRT+rHB}5R4_SKt0kb%vIiu&zy zQt(tid~qE9+1Ia0!5vKd<#N~yqzDTHFks*_59GKH4poJ$_bOyaT@Nh;Gy6`MFns-* zZGc!|hus}504Ra0X5+vP(fS>W;8$QSkVgswz{9VfuK|TmcDPq=0suQDzuyl4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/387.gif b/SRIP/Libraries/T3/387.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae095af035f7431f9bda4b37341388c052f30b5d GIT binary patch literal 1057 zcmV++1m62cNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R7009UbNU)&6g9sBUT*$DY!-o(V66heL z5wm_6|Mfc;uAG~OWoGdkNzNLvNK~jy0Knr6Lp1jKrGtXw!^(&N%GgsDZwF3-8tC;y zv9LjkMuQZl;&&~FQxF9khza|4B zYRCYfL7Z>>{9!!P;3t5r;|zU*$4}AE3tC+Q_{8s?5S)PcS$iN*fvkSf=sx`6@1EI# zocrN`sHoqnf^oQxei-iDRRA5NsfHLX98hUnl^K92PM(ks9nfIx_s&E_OKP`{6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QR009UbNU)&6g9sBUT*$DY!-o(fN>n&N zLZpBG@(GzJa7Vw7ALZGY80K3)YGtJ8yJtkAiE#2XJrEcSoXc?iR1NIH&z%a0CcyQx zwP2vAel{Uy>4z`Jz!&oRy@^<+A0vSVFqG=Y?nOjG{q}(ZWeX%4iAC;#Tw7owjUJ^4 znfqu;07rokoP7*)SD=cIrv~&DaI~M8z5u#>6c%CdsE<1km-tAlabIoyxIsV+U|zpc OoIA^t5xVrmfB-vgY1_I0 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/394.gif b/SRIP/Libraries/T3/394.gif new file mode 100644 index 0000000000000000000000000000000000000000..792ee6d42cd248c5011644a027366c2b4f86d613 GIT binary patch literal 942 zcmV;f15x}(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P!009UbNU)&6g9sBUT*$DY!-o(f4g^H; z*S~*&Bm%H_vExM`4}bjv(D7GBk{BOe1OVvYNP$2;I*j?xAkCUHWlp^KQl-m*9D9cR z2qdURlpaAI^(a&#$CO7|dOWF-BgK_fWwyi_k>*K@R3Fk*x;3oBtpc|;J$v!0PNz(j Q9xW?3s@=PI4F&`NJEr`=YXATM literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/405.gif b/SRIP/Libraries/T3/405.gif new file mode 100644 index 0000000000000000000000000000000000000000..6825edee2dbc54964ffe8d6f4866d23352934e35 GIT binary patch literal 1072 zcmV-01kd|NNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R7009UbNU)&6g9sBUT*$DY!-o(Z7Wg2@ z+rNLBtV9GLU_qIF^y0;%*RL8PDh&fn;1UVhgf}4shRD{hpQeTkgm9;3KXNwI z4y59?U#_1URmfQ6>DRA#{fNndm|#-3N*)Ggk!SNEg=YO)8I)rakAsGO`rV3PFao$- z?IbXSz;4{qgEaf;VHl(ztc0s-He&dwA2+WD9o3AvkV{Q&SPF`WrmtV81q=n4$>m9( qB{6ciK{6%`g178e&67#J8C85tTH8XFrM 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/420.gif b/SRIP/Libraries/T3/420.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1c439f08a92f92877dbdd194b053e2b02d039da GIT binary patch literal 996 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QV009UbNU)&6g9sBUT*$DY!-o(fN?gdm z*uQ`0%uEEJAOkvZvC7pOH$vhOVf}IpRMqbgL@va%q+5uTGa z613Paid=z<{_P`n7XSo${>t^8FsvUxKz;x4+|)M%xqjL@^u5KC%UukF?)97YQ?4AI S(=zlG(yyA7zNk?L1OPk68Q+uu literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/424.gif b/SRIP/Libraries/T3/424.gif new file mode 100644 index 0000000000000000000000000000000000000000..c4cab7876e8a2c6ed2740e1a7018a8a43c806c18 GIT binary patch literal 989 zcmV<310wuKNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QO009UbNU)&6g9sBUT*$DY!-o(fN?e#C zQM+Y>AWQ^M;Y~PyApOm=A<=_2f7wb+@zu{?mWUs+`SV3#ARw0!EBUkMgP;wZ4+HJv z_k>`Xc;pm7gyt_FK^gA+k&4*JA3sM#*f?q@Qep_1AwyD{7{bu7Ja_#4dnI7wKrkTH zxD^ORo7!UwE5yRF1 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/425.gif b/SRIP/Libraries/T3/425.gif new file mode 100644 index 0000000000000000000000000000000000000000..1f1956c0c50eeaee4c1c688406b598ebd2634a67 GIT binary patch literal 979 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 JpdAJT06U<<)t~?X literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/435.gif b/SRIP/Libraries/T3/435.gif new file mode 100644 index 0000000000000000000000000000000000000000..91ad37071e712496f2dfae800d3dae25ec164706 GIT binary patch literal 1003 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qc009UbNU)&6g9sBUT*$DY!-o(fN-Vgb z&A4xyWKDxIKq8N4<*E$qV671Zh!nEXD^c*lElUt9`Ll9RLpLlAEx2QrP?al(B<_Xj znQw_ha3T+OsOOK4!)ta9O0nn9-wub9$T=`Lf?ZV;4o8er_JW{~Wzx!>d+@LWC4RKZ zl<9M?lLCCABnIIG%^Nf*07UFlG*O^}fkymAElkkJKOc-6`-2==U}DOZ9RsOs*&ij& Z02)NYhsDXB$`n-P3nv1!>xBUU06Ta2+y?*v literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/44.gif b/SRIP/Libraries/T3/44.gif new file mode 100644 index 0000000000000000000000000000000000000000..ff6771d8745ebba6d7551753b68b42ca3fb81c93 GIT binary patch literal 967 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/442.gif b/SRIP/Libraries/T3/442.gif new file mode 100644 index 0000000000000000000000000000000000000000..ff3e0153d84aa99aa5ade67ac0f759ac558a440f GIT binary patch literal 985 zcmV;~119`ONk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QK009UbNU)&6g9sBUT*$DY!-o(fN>u3M z*S~&=9!wN?haJCX9zjh!;7Hv#K>%1N8y7($D1PH)4AjEULPRzF_&p(Lgx`{gbS@Sl z7^R=Dh$_(WGm`+oix=eh0g-rvA3tKa`gMZ|L1KX+poF2CW>w@y00{(G;n!`%*?|{v zy%lJoA3ZU10Z8iSDlZd!{kY_X#BZL=w=vT7t1&l0F@ERr3bLvuZzz7S2w3KaBd_PP H0RaFza=Fx@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/446.gif b/SRIP/Libraries/T3/446.gif new file mode 100644 index 0000000000000000000000000000000000000000..547f2f60bd5cae92f391e22e95dbaaab14e49e1f GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-o(f0sxZ7 zKpRp0G?|b{1ed*j@b>W=>FoqWEAvK1JEK9-t&v?Gx`4+IA1f{c7ZBqo>YyS$-PW zYH8H3?!SI6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-o(d3aAmQ z-@ksMDnuNJf*(I&O)|wRwoxD{eqsy=gyJcYg@_2!VH!X%z!VJ;ZdKMLFY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/46.gif b/SRIP/Libraries/T3/46.gif new file mode 100644 index 0000000000000000000000000000000000000000..693547ff14950a280977eea97e077e5d91f46030 GIT binary patch literal 1007 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/47.gif b/SRIP/Libraries/T3/47.gif new file mode 100644 index 0000000000000000000000000000000000000000..fbccab9426608907a86970f7cab61cbe8bf61a7d GIT binary patch literal 1033 zcmV+k1orz!Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q)009UbNU)&6g9sBUT*$DY!-o(d3c$3i zRwEq|A{Io!>K-q2>PBdcAf?PBe)Wco2xkpq0YdHk$&@({iZpy89gf;JZOsJ|c;ML+ zqwUed7yC>Vgs`F)wG0nY=(Fa4paM$z#zaiyPu&><0yTxJqHzF=Vg7Jo2(&JzMuBDE z$rSRoAS;<{>IxK~sh=2M{?O>%;%^Xu2GqgKcUqZWVLzzQVe?~TSk z{^$_AfX~loe?JJu;Ac7_AAFDnnmFaJjK&V>rp=ji$R9mHb&ar_*~*08-S literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/470.gif b/SRIP/Libraries/T3/470.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9914542db0d71d8ccbc59e78b23ac9af980d7b7 GIT binary patch literal 1049 zcmV+!1m^okNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q~009UbNU)&6g9sBUT*$DY!-o(f5)>h# z!axBc=ty~(V#p|e{k~NZXry01Q4WK(GYPUEDF90JnGC`30kMAi&KX*8W}UER_vQgp zAYkE-Z~exN8VJawNlp!)>@(SdpdzPY3NRe7jGwj^MFpmCm+zYetqkY%yHyYiNKFta zttF_V-alq29zGD&57-HThtBm2hasW|TmEe2SmcjhD~SSu*mK&i)&s}_hdFJ<05bp| z`J9qtf%(Cze(^rROKL$PgF*eC1p=_fWE6=jOuk|;2A0WK5}i?Y%58(hK9t45;uHaL Th)0hKg|O(ky7lV_0|Ed$WAX8) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/472.gif b/SRIP/Libraries/T3/472.gif new file mode 100644 index 0000000000000000000000000000000000000000..32e8e18ddce8cd8a7efc22a036c27f51bbe31981 GIT binary patch literal 986 zcmV<0110=NNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QL009UbNU)&6g9sBUT*$DY!-o(fN?e#C zPB4G{FnO2=V9&gM{6O|&HE|C{dV0)=!YI*Wzf~v%Is!QgqRD=vC=7IjQQgLdDLx9) zDNxEckXsZujMLBGpczmJS!+u2A)Js{Me<{%^kD@v>Z&bUMkt-XY8*W%O_7dYx+5G1 z-gFeV=tpWqIZDBJt1f^Fw)#=);TKcWOMdsXt@e{67qgdA)Md+$apHgdeE1D2IIrK& IbprwbJ5B7?9{>OV literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/483.gif b/SRIP/Libraries/T3/483.gif new file mode 100644 index 0000000000000000000000000000000000000000..7fc548134e5763a1f50b798e3840cbaf0977467f GIT binary patch literal 990 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 Z1)zERjCX)1a~AvpD3gqZ>em4Q06U_I;c5T? literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/49.gif b/SRIP/Libraries/T3/49.gif new file mode 100644 index 0000000000000000000000000000000000000000..84bbaeae79302672de05ebca8da879881114297f GIT binary patch literal 973 zcmV;;12X(aNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q8009UbNU)&6g9sBUT*$DY!-o(Z%82%l z)q{uyVX*UekDn5Z1l#y)_n{KJ4zdR`ctZex*=1iBIVv_OK%ZfCA;x2+T z@X4P)VyXO%iD^KFj0{@*{VEW1U;Gd?K_=Q}jb9)VqT+%SQGmrUfBO2Zqfk{q9eMubq@7F|Vn6^p*@)9o literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/5.gif b/SRIP/Libraries/T3/5.gif new file mode 100644 index 0000000000000000000000000000000000000000..b6dcd961459db364321b506f29d63a343a0cdf08 GIT binary patch literal 999 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QY009UbNU)&6g9sBUT*$DY!-o(fN}MS1 z1|@0z`o+0I>4wBB==k;PC5@j*R1gW|kjKwgkOB;BiKGJ&jLBOL1adJMuEIk?{rE}B zDe#)fClCGfy9XKg5L9EKb}aFl55o_~Bp-z-BKM Vj2+6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q;009UbNU)&6g9sBUT*$DY!-oY6+@RHO zQ4fd_sqov_kDVQi1Fvix_N0ieYZXAQ=*KTt2Z1u`fCTV^WuBP@>HI^drQie%7{VxG z(SRYUe&3vkXr#P8lXe&Zs{j1X-jFBjeT$pon(GO`~967lOb(}}l! zfCTQj8yMmPS^O9w5a?**4~#|*6Eb4Nkve{;Kww-DYU9(5urhRx%x_*V8xHm=U(URF H!hirfO9k!C literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/502.gif b/SRIP/Libraries/T3/502.gif new file mode 100644 index 0000000000000000000000000000000000000000..df16774d068b2e075b09c20fa01eba0f19284887 GIT binary patch literal 999 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QY009UbNU)&6g9sBUT*$DY!-o(fN}Nd1 z#;Je){K1POKq3Ju;ry8^7fhSK91_uFtkn^K0&9&T-Z)3kM}&b1rqv<@ z_l&1QEcsL^5U3$hyLh!cK>Xt`Qk71ni237(Mk0`Q`uyd~c&`pc05gpET;~SD*#n~d zF=KHSz=gP`+}7RXFP4eA0!Zlt7NTweMsiow1pvz5wG(wC?8(RM@7qiMWKF1R;Elgh V4;CZw$7sM}6Yu)8T+BKk06X7Z;>rL3 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/504.gif b/SRIP/Libraries/T3/504.gif new file mode 100644 index 0000000000000000000000000000000000000000..9bf698926075853633b0826bb5b637a289f7a8cb GIT binary patch literal 1021 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 N)aTHnOIH{W06VqL@5%rG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/521.gif b/SRIP/Libraries/T3/521.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0bd438325ed5876b192f8b4ba562e56edb34e9c GIT binary patch literal 1005 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qe009UbNU)&6g9sBUT*$DY!-o(fN<27% zlRba`{P}aoNumyP{X)i*7qXv3T_NF-@jzlw$cRk*g$yy!0JnY+Aja&csQ^K0{lq}b z^DiHdg6sUD!{Cs>F@Na_9$44U-wB5(s@|hAP|2~7>ozzXAW7yub?VmXD@hCD1(_w` zh7{`75j&0Ah$zxHX5xkuCmtx67V^PFf)qmLI!y3QNJfkY+6k#6vcPK^D@T@buiv%= bmUn~{C&6-TCV{M93d^u31_S^*O?%>n literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/526.gif b/SRIP/Libraries/T3/526.gif new file mode 100644 index 0000000000000000000000000000000000000000..396b1907b2426e835ee86abd9debad24d755953f GIT binary patch literal 1010 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qj009UbNU)&6g9sBUT*$DY!-o(fN}Nb> zhc15@FHAfz0+_#kAp41tcpw!>f7sSI>UZeC69Wo~31poj5 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/529.gif b/SRIP/Libraries/T3/529.gif new file mode 100644 index 0000000000000000000000000000000000000000..dff14f17b026f8bdacadec9015407f5e7f27bda2 GIT binary patch literal 1009 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 wxCOxF6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qu009UbNU)&6g9sBUT*$DY!-o(fN<=ti z%Oign{r&S-45ABK_WI##XU|=~e)MiVtYPltt}z7$={c$AAq;T+)*Z0`K){`o{c1Wa z*00=-fmu!#3-se5(P}aZ05AftA2v7f0z2K3}80}}yE5R(Y#H56$D z3Mq?k6@;{N^$~(puiq!U{Z@u+S0}90R%y6N0!MvSb++Bd+h?0RaFzluP2F literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/540.gif b/SRIP/Libraries/T3/540.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b73d59c61584cf5b5e885bd608550939783b392 GIT binary patch literal 1055 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 f_Hf(hAj>B{VFGdbVL$*osLSAh literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/551.gif b/SRIP/Libraries/T3/551.gif new file mode 100644 index 0000000000000000000000000000000000000000..4894986116a96363c8d8531fae464e8eecb831d5 GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-o(fN=&%p z(LY#aAWQ@>pinw~{rK@Kwo#18Xk1wMF*osrJbtna2!vtJOT-4O_|3~gP+K}45OIjq zLvVyQe(54O3;>E>y95IfXcEbl$iQ6Nn_Vn6^p!V%jx literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/56.gif b/SRIP/Libraries/T3/56.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c59a0a6560a030aa4650283d8f53b6b7c2e78a4 GIT binary patch literal 1025 zcmV+c1pfO+Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qy009UbNU)&6g9sBUT*$DY!-o(fN>tcE zkf3n?{VllT@i+)%9~yhm>^ofPI{Wy@=6J^(n7$t1lb4lDID zCt_fclTRKB?bbjb2TmqosdV^*UB6cj0O&GFtSQ7JC0)rlRJz$PZy zEpZEAK`4`#=qe~vHk~KBgG#nCp(~f$KJEI+$y#`#4|n}wHLWnsaKr`h`iYxbsvjbW ve)`QTA~1}-aU>)n>L&{h9AWtSF`2mfWIsm(CO$B^E>H^rbb|{Y7!UwEmGI$@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/560.gif b/SRIP/Libraries/T3/560.gif new file mode 100644 index 0000000000000000000000000000000000000000..25f57599d1600331636e69295b30e238ef596f8c GIT binary patch literal 1053 zcmV+&1mgQgNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R3009UbNU)&6g9sBUT*$DY!-okGq_~9Z zpT9N*APO`PrkFo}`^xF_*F$5DRUgL*ia}+azh4gt+&Sm3TZ{()R-p4&%Y(xTu>6HH zghAjGcK#SOcv!{Xv>F4?g!4yd07PH-k_a3SXy3j%0yL7!cLczPUH-1M&?qpBzhZ7^ z>bk&IAO~h2{q>?y*Y2#mqzLq#pvqsiDY^U=syiXgzHK)EB>0oB14IFJ;`sx%K_Cfj zQje4(sDcu`EAm4_{M`b#!K&YgE3wLXND*Wb6^gA72F(Ytpg;SfInE1r+e XQnm$pv})C7%Ywexvuoe3F(3dtZ#w*0 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/567.gif b/SRIP/Libraries/T3/567.gif new file mode 100644 index 0000000000000000000000000000000000000000..107f72104514de5111bf7323b49539b4e4512494 GIT binary patch literal 985 zcmV;~119`ONk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QK009UbNU)&6g9sBUT*$DY!-o(fN=z7r z+&_Qu@Jtk#C||l`bE?(rF|i9iV=)BA==V&b32^#~3@p*FpTtr9E)k?@6XJ${+8Pkl zZJfg3kqoe-v2z2n}Tt9t2B2u^)PZKR|_-r*>H!;nJs$SZ;al7>)L(z3!nx*Y#|6I@i$j-KXgP0-|4rEFaVqy36Dy5!LnzF H0RaFz_+i+t literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/572.gif b/SRIP/Libraries/T3/572.gif new file mode 100644 index 0000000000000000000000000000000000000000..f79bb9ba3d2afb9dd5f1c8ec45e68e824a4e2c1a GIT binary patch literal 1035 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/581.gif b/SRIP/Libraries/T3/581.gif new file mode 100644 index 0000000000000000000000000000000000000000..ba7f30002197cc6e9782c213fb2149abe5030013 GIT binary patch literal 999 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QY009UbNU)&6g9sBUT*$DY!-o(fN>te3 zMj~KKCJr>v%b!Pmh$e0bqDx+>DN|O}t0K{pzj-VLlJfT~A{2b~rV!NUuT(^F{GJeW z=8v3$hXNw?BP6iEig5e<_0#DPi9cZl2C(Sn&(IHj;UHQq)gqO@da)iL=@<5)RgeC% zeGy3PUonUgHpPl%%ECZ&{?=$D7-b*52!jWL>6&<88Gn2l3$zAV@(g(XTu64}vA|}J VR16ciK{6%`g178e&67#J8C85tTH8XFrM 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/596.gif b/SRIP/Libraries/T3/596.gif new file mode 100644 index 0000000000000000000000000000000000000000..be8d9aa7187d8fc41eb4ccfc28c07010b841dbf8 GIT binary patch literal 990 zcmV<410noJNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QP009UbNU)&6g9sBUT*$DY!-o(fN}Nb> z2q0?y{3S~<@c@~8|Jbqf_iu;91+)CIgX4jhzd#8hW@smmj)McT{B<%QahJb80x9^r zm84FAi0jr31mVwHzI`%~zT2^b%Cn3=CF;WJPn9r#iJuAl&y?*`V`%b(GFjiyE4-0I~+GgI)7X4QrM<1a@-8m@D;fW;Mii$ MH~7ur%sC(cJJ#XibN~PV literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/601.gif b/SRIP/Libraries/T3/601.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ab8ad462f1428b156d1b430f57ce9d961e7f5dd GIT binary patch literal 969 zcmV;)12+6eNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q4009UbNU)&6g9sBUT*$DY!-o(fN}MPW zf~tT1wlSaxpo2Sq{Oa{{L@~ohb4vh-8b+~|ziSNuP?)Ao!9-&4JO~8hFW&`;6X10M zP~c5Hf1f65@W&_2FMm*BOf&!us?~cLC|0qDZxR`Q$2bBYaRPt~e|E$U^x-drT7j+T rZFrlYo36J2RQNN4*N(pucqjeE8*SPE!kh2{h}K7OEhCB_1_S^*Kn%+R literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/602.gif b/SRIP/Libraries/T3/602.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea68ced6968d3606da15bc3085b95281c09cc8fd GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-o(fN@UnU zk~x3uh)e_k0gJeP&?w!@w$V+$ZhHi-={H1T9)Go33@k9MTuX-p(%?HLf#3pO|8PA- z5wBUn3CsHJyUB2YwRbZJzOdG>ADf31`bi>~1YFe~5FN04ML~uqVgA;Id13(K0#^6> z`Ky|(=f)*wo||-ZtR^ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/603.gif b/SRIP/Libraries/T3/603.gif new file mode 100644 index 0000000000000000000000000000000000000000..da2dec74281ce0bacd147adfcc3b963c7a46dc4b GIT binary patch literal 1041 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 B?9%`M literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/622.gif b/SRIP/Libraries/T3/622.gif new file mode 100644 index 0000000000000000000000000000000000000000..e296d19ecb4a825a318b05ae2931a279a7faf423 GIT binary patch literal 1006 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qf009UbNU)&6g9sBUT*$DY!-o(fN@S=b zNst{%SKnkn)^~-1Gp_G2`8dQ)`$eh2Dupk2Jmkyb^e)W`bYWV@8kCI=7 zr3isjXGA1hxEuh`BB+FgHwY+HGq2wirwachNXTKGzDpSg8Zf0VPvn8B`r)}O(9XYB coB6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qu009UbNU)&6g9sBUT*$DY!-o(fN}NcM zpcgf2h)g8W16Q;$&&* zP+*`5ogxu75HhYGy=F>aAT;C>p&F6Bs3?SBtm?sFBJZu)LRO2GEoQfTi{}y?CSwDWK6jZcetmUbS r05%Nk=WmndifsC=6E(Ral6(EofCkV3cDul!GeFxEW43SK0RaFzFU#jy literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/628.gif b/SRIP/Libraries/T3/628.gif new file mode 100644 index 0000000000000000000000000000000000000000..298ae60d6346ef41a8fe34037d7c3c587b495720 GIT binary patch literal 1030 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 p5Hh?L*k;_#yLZBX06W$!>O=ql literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/632.gif b/SRIP/Libraries/T3/632.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c8a147dedc7899430ac65475361330946812315 GIT binary patch literal 1017 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qq009UbNU)&6g9sBUT*$DY!-o(fN^EH0 z6E%O{ZcGHA;E=d}{oeI!W|G}1?pjbH!?2=xmm=W>cx n{h(R6JVI2zYceh;K-BM6j>`Z<*yA+-HUKg1EZg4AJ0Ji%=;7sV literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/642.gif b/SRIP/Libraries/T3/642.gif new file mode 100644 index 0000000000000000000000000000000000000000..73ed9217fa36c1676218692516b04032f48f7065 GIT binary patch literal 986 zcmV<0110=NNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QL009UbNU)&6g9sBUT*$DY!-o(fN@Q5Z zR6QRP2WH5{uU|hs83Am#=Fj8Dj0&ptYv;pVzaw%wNNnS=3KM<(;`QqjQG`5xfH0gh z32sBgO#PZEU}v&lkBA%K^&_UMq{mnbA}X+D(kd|v6I&?rSQ1@?kN`^f`-hGJ+6BV; z`D20hKq-$-0)#|hsNX&}XaRufrw>lx81?e83XDNlKUskRWa-DPLF8rZW<&;XYS!k@ Ikplt%JBDA^SpWb4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/686.gif b/SRIP/Libraries/T3/686.gif new file mode 100644 index 0000000000000000000000000000000000000000..24ed62c500b1cbb4eab7fe0342b9f5dbe0a802bb GIT binary patch literal 1003 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 KlS5Ao2mm|&vfADN literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/695.gif b/SRIP/Libraries/T3/695.gif new file mode 100644 index 0000000000000000000000000000000000000000..493fcd7f736440acaf2f40137e3e9b3a5f403f16 GIT binary patch literal 1014 zcmV`Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qn009UbNU)&6g9sBUT*$DY!-o(bmQXRU zguhV{0g&)Suii2W0C4mZl`&pFScK%UvH+-GrHuZhApmgV+MQ(eQe^C=t%1Na_xdTz z2tbX$KLh3Xi$%0RHhN|NKtR@y2T=fo`kjlBq#v}IL>cJnm&{VWDpv)Pu+`6>v9tpZ z)cSXA0bGG^{PkOP7eFn4@bIO9Yr~ztEBfS_NZUqefjs?$rFG+v4*-k)(gy2y;&Q)! kX^-`DkRnpQXPWzMGuO{ukF+L)`Ab(xXW!enGX?|zJ5GY^nE(I) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/705.gif b/SRIP/Libraries/T3/705.gif new file mode 100644 index 0000000000000000000000000000000000000000..12fccab575cc79a482fd53cd7b6b88c432240c8b GIT binary patch literal 1077 zcmV-51j_qINk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R7009UbNU)&6g9sBUT*$DY!-o(fN}MRs zz?L_3qDfoSU?P@m{X+Kh*AGv`6xQtZTW1K+5_$dLAZSIa;f!Sc!r_4cz{og%sdy+O z$#4d`e%($8yn*lA6&~wG_FIVMXt)vsBLo3pC7r*o+!WGC*Dsoaf&&ck>*ubYy)6k5 zcqP`M;DuZL=w(^t51K+i{k(}ND5csySUiRGtCa8pxqgHQ5)egi93z24^zo~Uu#vxB z9R(&iN@~PFTK-5W{MRoFfCWS5sFZ?$;4FWm6p}oaYFtQpYy=RDP_CaCg~Psn-4@7$ v!4dt~g-{p)lalKP5OV5AiDJQ3CA||9)Y8w{1@QtG%yKjUz5DkQ0|Ed$2(|@> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/706.gif b/SRIP/Libraries/T3/706.gif new file mode 100644 index 0000000000000000000000000000000000000000..616b397256cf8ea5d77657f0e6949e8fb39b262b GIT binary patch literal 1021 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 I8v_CWJ5<}(;s5{u literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/709.gif b/SRIP/Libraries/T3/709.gif new file mode 100644 index 0000000000000000000000000000000000000000..091920e1911e0d135ccfbb864f4260feee384503 GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-o(f0vSfk zM8twKeC6xs?;DSc0;Qbm2ajXFbtpiN$_HnJjW_*fnNewMV3K}+Kmr(bZGpff{(k9v z)DMe5Sn-DFToBG1jzazz=@e*4U%!6D2uu}->FTosTLI|u=kMROA5+ih%V)|^K5z_l zM(Wo~U>bbU*zLa2tZ{1V` Xr11Icr!Pxb8oiRO3Cp_m)_?#z-~r>@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/721.gif b/SRIP/Libraries/T3/721.gif new file mode 100644 index 0000000000000000000000000000000000000000..cdb58db3e3de548a12a9feb43de198c0be9928db GIT binary patch literal 974 zcmV;<12OzZNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q9009UbNU)&6g9sBUT*$DY!-o(d4mcDp z+>?j|3HbQcub;n47ze)TXOG#nenKX!seo}%KSK)0tr{S!UmT1nz`--sZ^fQ|!ls1e z)3H$jZQwYB1b|>yzf67lF-Hm*cdOl3eW}`A7kFu0dxb+5u;(vvNK^jgT`)_za>#%HI}aVyLjV8( literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/726.gif b/SRIP/Libraries/T3/726.gif new file mode 100644 index 0000000000000000000000000000000000000000..34836f860f3d7fab1bfd5d4227e3dbe996e6f101 GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-o(f4(vgx zUcY{?7Dz-;rBy$EoeI6{Cnh3-R{Z$&OEv+3r+)U(HF3CLRZ4MyDi|=t>?1!a4p*eK zr2+sHXDL5QauD<)6)2`I_S0r*14NjTGG#BhHu?QZNo%czcKmE%1!}fR${mZ>O1h{bYCpyjeen~A=3}x7 fYc=zu_pyWAQE%sEIw02pyOez7%AQSIVL$*oM$6=V literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/727.gif b/SRIP/Libraries/T3/727.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b8d58e4681201e6e43757b32ed794480dbf0ec1 GIT binary patch literal 1026 zcmV+d1pWI*Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qz009UbNU)&6g9sBUT*$DY!-o(d4#<#* zpFdtu97F^FB9S+6=5itPw<_3pO?tr5NsSk?A<^U w>>`E56ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-o(fN?f=g z$EJ7w{^1fK(ZH2#{rct87gAJ23#mft%M#;{y?((U8e!JYp0yeSKZt6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q`009UbNU)&6g9sBUT*$DY!-o(fN)(s? zRlkeL4lhOmghkVd47dz4vI(tpS?p01YVFW@zBY5nlz2#9g%^myC}o4n8?D> PTYltP?43>>KtKRHo^tgG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/737.gif b/SRIP/Libraries/T3/737.gif new file mode 100644 index 0000000000000000000000000000000000000000..3fc7ed84b559e7025fb0441ba82fbf556f743d13 GIT binary patch literal 963 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 F06S97@LB)> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/759.gif b/SRIP/Libraries/T3/759.gif new file mode 100644 index 0000000000000000000000000000000000000000..ce697dda0c7c9fd090f65ab327905ece7607ff40 GIT binary patch literal 1049 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 bi{p$0ZCErv(iBajo+zVTqrjCD1_S^*^Gw;8 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/767.gif b/SRIP/Libraries/T3/767.gif new file mode 100644 index 0000000000000000000000000000000000000000..1533d17dd49611cbfe1cfc11539b72f572cac081 GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-o(bPRUcO z-@kr^eB}WFu}U+1{6h8%8S}Cd8OeV4GMw#EkDoj#VMaze>n7wafsFX^Y7h}fJbrV&0?3ebNkmy8jShsz@7xK9 yz(T?zu{mT7h#s1Slm`k_sC%X(awy~uHouYl@X27y#LsPh%B0L4PQ3WQfB-uRQS37S literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/770.gif b/SRIP/Libraries/T3/770.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b37491d128008a4182883e8fd91ce7a104a955b GIT binary patch literal 1030 zcmV+h1o`_%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q%009UbNU)&6g9sBUT*$DY!-o(fN<>JY zL!Eg4`e~e{06+sx{QwbIIAa#Sll@Ne>qktAmz4Z6DIB5>rZrSuaNvNsk{>uP3MZ`` zcjkdW6LEOPTLe_0v3~!S9RQHRltzF3&h>F9q$a;gYk1xxwgO@zo-kv{koZICqB8>| zzKMsmpRXAc4@gnhli#9=01oUri3%J)a)33=I|(4w$x9Q_XcRe1<2w@)VRGo8GTcOL zC+ToLxohH+Yy98=QaNg3gJ)MY#sdrh2Wpt5Xao4vlac}53IH*h^INy^;{gExJMB#7 A=Kufz literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/773.gif b/SRIP/Libraries/T3/773.gif new file mode 100644 index 0000000000000000000000000000000000000000..07467c5e17240ed58358c3e479e950f1ac7385e9 GIT binary patch literal 1025 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 O06ee*1iEy@fB-x2W!cIA literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/785.gif b/SRIP/Libraries/T3/785.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c7c30cc9f26a7f932fefe123f041cfcfb1fa095 GIT binary patch literal 1014 zcmV`Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qn009UbNU)&6g9sBUT*$DY!-oS0U|>V5 zACn0X3%20LZ=JJebp)=kkWm#sRV)Y+v3D%vCw^}TYFNgPS4I*1>`4-+q#4H_83BB` z*Dsj}YW>tz2r6)hGJgH&?TNs2U>B&)stzOr4y#rG7OwI8(hna{rVXgw^8(;szd=>) z@N*-uAHQ2ntMr2>qwZa%o$5UqXg5pHD*DU~RMStIfuJ+y(d(Na-9Jc7ug;SpL>ND9 kA(&=h*Dsnnj#RYrviljw*B||4sd4bNw(Z-v3kC!LJFEKTu>b%7 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/789.gif b/SRIP/Libraries/T3/789.gif new file mode 100644 index 0000000000000000000000000000000000000000..3a82c62e4753d0ea09023a2333c56594666b546e GIT binary patch literal 1022 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 tr$C}}F6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DY!-ocsko#wA z0Yrm5z}0H=4a-G>scP}6gtH*-io_fzTT!iqh8U_F+K-CL2;^Y;0mqL*17YKq&0A~F8vvuMu01&kL z_1odL#JNX4vdtQB))KY~0G!~9;8Kh~2?94gJ8*J>KTZQ}L1X;!Oux1O2oMY9QWLy^ jjrwhIiN%|nHoD@$qj6S)pnLsZ0d`Bfw(Z*k0|Ed$LHXiI literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/801.gif b/SRIP/Libraries/T3/801.gif new file mode 100644 index 0000000000000000000000000000000000000000..5543bed233c16bffd39789818e23677c1f97fecf GIT binary patch literal 1003 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 XLe0&=D#FpXW>Pj_UCp{R!hirf(H+y= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/823.gif b/SRIP/Libraries/T3/823.gif new file mode 100644 index 0000000000000000000000000000000000000000..18b886f0bc522ca77e86848573a80547f7058117 GIT binary patch literal 970 zcmV;*12z0dNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q5009UbNU)&6g9sBUT*$DY!-o(fN>unD zOe=qSCJr1V&0oKMc{B>-)o&aNZ6PNHP~lCN4gk{NXe7~35CegX5NK55ZpFYiA~opa z0YE?sS3oD8=|^h^s*fop4v_RQmbrdcL>dSY;(;_%0z?jk@lTW3f!+G~ISYV=zfC&D s9$3ZC2wNxpim`>Tt6vhfRP(Vta1EZ_vtIhaVhcb?KR}ElYYYegJ7z1$ivR!s literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/824.gif b/SRIP/Libraries/T3/824.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad11b1d4861f8ca6ff0ed7252e88b035256be151 GIT binary patch literal 1037 zcmV+o1oHbwNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q;009UbNU)&6g9sBUT*$DY!-o(f3RF_c zn7@DQWJmyA z<}Z*#4It|fBp`;IzjYoQN&)F*Ac&77hI)8m7=JL1ihCrf{Bz|y*&oTfW z^896v7{%YYfu=x)ktpNo*%|fx)j}Y#MLvI(ax7De#c!*S{_LUg3t&MekmQOGU(UQa H!hirfJDc*A literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/827.gif b/SRIP/Libraries/T3/827.gif new file mode 100644 index 0000000000000000000000000000000000000000..dfac00f4200aa9e9e94dd70af6506d4cfdc758f8 GIT binary patch literal 1013 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DY!-o(fN<4VP zjzwS=XGHAqM_s*sAVbPCRls2fKp|76wBc}7%5aK$^tfWITt9M@7%UtC3?x28C<@MC z2QtY*e<1Y{LMX#szh6f|0#Z0*PnW3udQ2>cH0xG^*+6EKBZT0LB509ad9V;fwUGIA z$4vfb8k(x6htEPHo!Q>lbVQ#36yG6pROQ$=89oKnl7n5DiFb joB>z}){h>q4xBTP?nfsyhG(op1DGYRhV0u20|Ed$8o1vs literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/828.gif b/SRIP/Libraries/T3/828.gif new file mode 100644 index 0000000000000000000000000000000000000000..1f341b4360deee26fe02f8668b2b786b84d0429f GIT binary patch literal 997 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QW009UbNU)&6g9sBUT*$DY!-o(fN^FP+ zmOp=0CJIEtj$glz`HDz1AZ4CEbbcuHo5v#}22melc>qA*&IyT_`q>MlQQ(G7{^lJS zxIjfj0-pTEQ#0^PxOYY$x>=cM;1_!R^!b2ztY0kxAlkI@_pw(*L;cbb``C{xyb%$f zr2BV~oIkoEB{q=27e-rK19}S7)b@v903_n|!=~Wyr;j@hN2z-l0iU6W@VQ&MMW0g(4hR4{BKF^1 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/832.gif b/SRIP/Libraries/T3/832.gif new file mode 100644 index 0000000000000000000000000000000000000000..a701be4b44230bf3dd8a4279baa3e0b08e16bb77 GIT binary patch literal 1040 zcmV+r1n>JtNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q>009UbNU)&6g9sBUT*$DY!-o(felTS1 zpFeGi97F`LA(y&-AVbzt0FeN$kms^xGY2w5h7k_WfK2B{gTO2;SM7_`P#j1w1flTj z$L?M~Vhum`!$OctzL4F-H1q<})&K$!V%Y@G-a9fX@R%7 K^XCf#0suSVyXR^E literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/859.gif b/SRIP/Libraries/T3/859.gif new file mode 100644 index 0000000000000000000000000000000000000000..f54d915aa6d63d2951ad514c68886ee495129c67 GIT binary patch literal 1008 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 VMuADZg?wZq!1L?avo8z?06PUl^eX@W literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/877.gif b/SRIP/Libraries/T3/877.gif new file mode 100644 index 0000000000000000000000000000000000000000..6fdad775873c544f8912d272d2a7bf0af496995c GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-o(dBKc#B zo+k+r1y0};&!0zn?;2&C(9EB;Lr@SLsN^W)7k_sQ5Mfh@|N1>h$iJ7{Mu zs6$i(Ulp-1{H>rMjM{;%c~=0K;V%tfe=z_ckd X^kPlBr$Vd-RPFvPTg$q2#()4jNP5@B literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/88.gif b/SRIP/Libraries/T3/88.gif new file mode 100644 index 0000000000000000000000000000000000000000..791b6bd4ef01e66948b2a53c64ced2c11adbed52 GIT binary patch literal 1023 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/888.gif b/SRIP/Libraries/T3/888.gif new file mode 100644 index 0000000000000000000000000000000000000000..fcd871a1d8b36789ccdea991ea222bd94b833d69 GIT binary patch literal 1034 zcmV+l1oitzNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q*009UbNU)&6g9sBUT*$DY!-o(fN=zuA z!HFu5mVI+&$U#H}X8eg9DbmmYha%_@BRP+xzbg%s)Ejwklphi-dW_7&PzpSM>P9)) zK=94TISXC11Iof6lzbzlC`{1HU%I9P17rxbPb9xY2^8ww2W6mu2#-ke1H(|4ziAXY z;Ba%vr9Vs!-THI)ZzMiz`a~jY(2$8sb)H1{2<)$l!vSY}`C`OI0)Pd+M7}~WaiEZq zK{^YZuui0<0HOi#_?e7D>I?7u;WLstfFF^}!ix4V(n)Fn$3zk%@cW*>dMJJ?{~Ztj EJEN-XkN^Mx literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/901.gif b/SRIP/Libraries/T3/901.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd3c74d1e0889216082fc0f33dd1c4909630d569 GIT binary patch literal 969 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/914.gif b/SRIP/Libraries/T3/914.gif new file mode 100644 index 0000000000000000000000000000000000000000..c56e26bca35ea8284cd52a26a6e25c67ea7fac08 GIT binary patch literal 1028 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 XTf1Hs_>3Q~(E>LiTY$Rt!+-!g8z|n} literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/95.gif b/SRIP/Libraries/T3/95.gif new file mode 100644 index 0000000000000000000000000000000000000000..33e96e92f78f2cd26acc9dd260dafb2891f836d9 GIT binary patch literal 1018 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qr009UbNU)&6g9sBUT*$DY!-o(f0$8w! zTE9I)<10^x_qRfF$%qR oAppqX7me;Se(j88g2xYp>AxYR?d>7&BPuWq1nb_-dtg8SI|(u37XSbN literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/964.gif b/SRIP/Libraries/T3/964.gif new file mode 100644 index 0000000000000000000000000000000000000000..4727651347c4577fc1cfda335e36036f09db5571 GIT binary patch literal 1024 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/977.gif b/SRIP/Libraries/T3/977.gif new file mode 100644 index 0000000000000000000000000000000000000000..539b11694b9bd47b14b113548f6e9e63ada0a449 GIT binary patch literal 1019 zcmVNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qs009UbNU)&6g9sBUT*$DY!-o(f3j6`9 zpSLm+1$L+t4qiWg{9t9wfea)+Vw7%7h)7^fKY8B*Q7PDA&4Gq%`1L!5uphGw4ORJk zP*B4&pI#cyn8#064uX5m@nc4`VS`ON(=7o2!kE2xw17TT5b9&PRM+|q3z884oOUMR zC}}HDT)(??>*h-bj^C&R84n!lr)xzbojWq_;Ro*s0J1wXrsDU5U_WagBnmC~uOAMH plf@w!`0<9sLF4+RE47j^gN!fWo=ny65?vXd;=azyyLaz^06Tag<=+4R literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T3/98.gif b/SRIP/Libraries/T3/98.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b98eb8593ea601ca0df381c8256f527736f2c40 GIT binary patch literal 1032 zcmV+j1o!(#Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q(009UbNU)&6g9sBUT*$DY!-o(dHt5hn z2nT@*X32X2aRQ`%{Ps6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QI009UbNU)&6g9sBUT*$DY!-o(fN=!Jw z&Axxbm`oJN;a5L=`1;vPF|k55k!DbZQl_VaL>c|QApuarf}DP*BxdQiYakSO{fk&&(D=!0,k*=-1);k=""+k;for(p=p?p:1;k.length
Please right click on the image and save it to your device
"), -p.document.close()}}}function N(k){var p=((k&16711680)>>16).toString(16),D=((k&65280)>>8).toString(16);k=((k&255)>>0).toString(16);p=2>p.length?"0"+p:p;D=2>D.length?"0"+D:D;k=2>k.length?"0"+k:k;return"#"+p+D+k}function fb(k,p){var D=this.length>>>0,r=Number(p)||0,r=0>r?Math.ceil(r):Math.floor(r);for(0>r&&(r+=D);rD;D++)if(k[D]!==k[D+4]|k[D]!==k[D+8]|k[D]!==k[D+12]){p=!1;break}return p?k[0]<<16|k[1]<<8|k[2]:0}function na(k,p,D){return k in p?p[k]:D[k]}function Oa(k,p,D){if(r&&bb){var u=k.getContext("2d");Pa=u.webkitBackingStorePixelRatio|| -u.mozBackingStorePixelRatio||u.msBackingStorePixelRatio||u.oBackingStorePixelRatio||u.backingStorePixelRatio||1;W=Ua/Pa;k.width=p*W;k.height=D*W;Ua!==Pa&&(k.style.width=p+"px",k.style.height=D+"px",u.scale(W,W))}else k.width=p,k.height=D}function hb(k){if(!ib){var p=!1,D=!1;"undefined"===typeof ra.Chart.creditHref?(k.creditHref=ja("iuuqr;..b`ow`rkr/bnl."),k.creditText=ja("B`ow`rKR/bnl")):(p=k.updateOption("creditText"),D=k.updateOption("creditHref"));if(k.creditHref&&k.creditText){k._creditLink|| -(k._creditLink=document.createElement("a"),k._creditLink.setAttribute("class","canvasjs-chart-credit"),k._creditLink.setAttribute("title","JavaScript Charts"),k._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:2px;top:"+(k.height-14)+"px;color:dimgrey;text-decoration:none;font-size:11px;font-family: Calibri, Lucida Grande, Lucida Sans Unicode, Arial, sans-serif"),k._creditLink.setAttribute("tabIndex",-1),k._creditLink.setAttribute("target","_blank"));if(0===k.renderCount|| -p||D)k._creditLink.setAttribute("href",k.creditHref),k._creditLink.innerHTML=k.creditText;k._creditLink&&k.creditHref&&k.creditText?(k._creditLink.parentElement||k._canvasJSContainer.appendChild(k._creditLink),k._creditLink.style.top=k.height-14+"px"):k._creditLink.parentElement&&k._canvasJSContainer.removeChild(k._creditLink)}}}function ta(k,p){Ja&&(this.canvasCount|=0,window.console.log(++this.canvasCount));var D=document.createElement("canvas");D.setAttribute("class","canvasjs-chart-canvas");Oa(D, -k,p);r||"undefined"===typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(D);return D}function sa(k,p,D){for(var r in D)p.style[r]=D[r]}function ua(k,p,D){p.getAttribute("state")||(p.style.backgroundColor=k.toolbar.backgroundColor,p.style.color=k.toolbar.fontColor,p.style.border="none",sa(k,p,{WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",userSelect:"none"}));p.getAttribute("state")!==D&&(p.setAttribute("state",D),p.setAttribute("type","button"),sa(k,p,{padding:"5px 12px", -cursor:"pointer","float":"left",width:"40px",height:"25px",outline:"0px",verticalAlign:"baseline",lineHeight:"0"}),p.setAttribute("title",k._cultureInfo[D+"Text"]),p.innerHTML=""+k._cultureInfo[D+"Text"]+"")}function Qa(){for(var k=null,p=0;pa?"a":"p";case "tt":return 12>a?"am":"pm";case "T":return 12>a?"A": -"P";case "TT":return 12>a?"AM":"PM";case "K":return S?"UTC":(String(z).match(H)||[""]).pop().replace(F,"");case "z":return(0k?!0:!1;u&&(k*=-1);var v=r?r.decimalSeparator:".",H=r?r.digitGroupSeparator: -",",F="";p=String(p);var F=1,z=r="",E=-1,L=[],R=[],I=0,N=0,S=0,O=!1,U=0,z=p.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|\u2030|./g);p=null;for(var Q=0;z&&QE)E=Q;else{if("%"===p)F*=100;else if("\u2030"===p){F*=1E3;continue}else if(","===p[0]&&"."===p[p.length-1]){F/=Math.pow(1E3,p.length-1);E=Q+p.length-1;continue}else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||(O=!0);0>E?(L.push(p),"#"===p||"0"===p?I++:","===p&&S++):(R.push(p),"#"!==p&&"0"!==p||N++)}O&&(p=Math.floor(k), -z=-Math.floor(Math.log(k)/Math.LN10+1),U=0===k?0:0===p?-(I+z):String(p).length-I,F/=Math.pow(10,U));0>E&&(E=Q);F=(k*F).toFixed(N);p=F.split(".");F=(p[0]+"").split("");k=(p[1]+"").split("");F&&"0"===F[0]&&F.shift();for(O=z=Q=N=E=0;0U?p.replace("+","").replace("-",""):p.replace("-",""),r+=p.replace(/[0]+/,function(k){return $(U,k.length)}));H="";for(L=!1;0U?p.replace("+","").replace("-",""):p.replace("-",""),H+=p.replace(/[0]+/,function(k){return $(U,k.length)}));r+=(L?v:"")+H;return u?"-"+r:r},Ra=function(k){var p=0,r=0;k=k||window.event;k.offsetX||0===k.offsetX?(p=k.offsetX,r=k.offsetY):k.layerX||0==k.layerX?(p=k.layerX,r=k.layerY):(p=k.pageX-k.target.offsetLeft, -r=k.pageY-k.target.offsetTop);return{x:p,y:r}},bb=!0,Ua=window.devicePixelRatio||1,Pa=1,W=bb?Ua/Pa:1,ea=function(k,p,r,u,v,H,F,z,E,L,R,N,O){"undefined"===typeof O&&(O=1);F=F||0;z=z||"black";var I=15p)v=H-1;else break}r>p&&1H&&(F=p.pop(),u-=F.height,v=z)}this._wrappedText={lines:p,width:v,height:u};this.width=v+(this.leftPadding+this.rightPadding);this.height=u+(this.topPadding+this.bottomPadding);this.ctx.font=r};ka.prototype._getFontString=function(){var k;k=""+(this.fontStyle?this.fontStyle+" ":"");k+=this.fontWeight?this.fontWeight+" ":"";k+=this.fontSize?this.fontSize+"px ":"";var p=this.fontFamily?this.fontFamily+"":"";!r&&p&&(p=p.split(",")[0],"'"!==p[0]&&'"'!==p[0]&&(p="'"+p+"'"));return k+=p}; -qa(Va,V);qa(Aa,V);Aa.prototype.setLayout=function(){if(this.text){var k=this.dockInsidePlotArea?this.chart.plotArea:this.chart,p=k.layoutManager.getFreeSpace(),r=p.x1,v=p.y1,E=0,H=0,F=this.chart._menuButton&&this.chart.exportEnabled&&"top"===this.verticalAlign?22:0,z,I;"top"===this.verticalAlign||"bottom"===this.verticalAlign?(null===this.maxWidth&&(this.maxWidth=p.width-4-F*("center"===this.horizontalAlign?2:1)),H=0.5*p.height-this.margin-2,E=0):"center"===this.verticalAlign&&("left"===this.horizontalAlign|| -"right"===this.horizontalAlign?(null===this.maxWidth&&(this.maxWidth=p.height-4),H=0.5*p.width-this.margin-2):"center"===this.horizontalAlign&&(null===this.maxWidth&&(this.maxWidth=p.width-4),H=0.5*p.height-4));var L;u(this.padding)||"number"!==typeof this.padding?u(this.padding)||"object"!==typeof this.padding||(L=this.padding.top?this.padding.top:this.padding.bottom?this.padding.bottom:0,L+=this.padding.bottom?this.padding.bottom:this.padding.top?this.padding.top:0,L*=1.25):L=2.5*this.padding;this.wrap|| -(H=Math.min(H,Math.max(1.5*this.fontSize,this.fontSize+L)));H=new ka(this.ctx,{fontSize:this.fontSize,fontFamily:this.fontFamily,fontColor:this.fontColor,fontStyle:this.fontStyle,fontWeight:this.fontWeight,horizontalAlign:this.horizontalAlign,verticalAlign:this.verticalAlign,borderColor:this.borderColor,borderThickness:this.borderThickness,backgroundColor:this.backgroundColor,maxWidth:this.maxWidth,maxHeight:H,cornerRadius:this.cornerRadius,text:this.text,padding:this.padding,textBaseline:"top"}); -L=H.measureText();"top"===this.verticalAlign||"bottom"===this.verticalAlign?("top"===this.verticalAlign?(v=p.y1+2,I="top"):"bottom"===this.verticalAlign&&(v=p.y2-2-L.height,I="bottom"),"left"===this.horizontalAlign?r=p.x1+2:"center"===this.horizontalAlign?r=p.x1+p.width/2-L.width/2:"right"===this.horizontalAlign&&(r=p.x2-2-L.width-F),z=this.horizontalAlign,this.width=L.width,this.height=L.height):"center"===this.verticalAlign&&("left"===this.horizontalAlign?(r=p.x1+2,v=p.y2-2-(this.maxWidth/2-L.width/ -2),E=-90,I="left",this.width=L.height,this.height=L.width):"right"===this.horizontalAlign?(r=p.x2-2,v=p.y1+2+(this.maxWidth/2-L.width/2),E=90,I="right",this.width=L.height,this.height=L.width):"center"===this.horizontalAlign&&(v=k.y1+(k.height/2-L.height/2),r=k.x1+(k.width/2-L.width/2),I="center",this.width=L.width,this.height=L.height),z="center");H.x=r;H.y=v;H.angle=E;H.horizontalAlign=z;this._textBlock=H;k.layoutManager.registerSpace(I,{width:this.width+("left"===I||"right"===I?this.margin+2:0), -height:this.height+("top"===I||"bottom"===I?this.margin+2:0)});this.bounds={x1:r,y1:v,x2:r+this.width,y2:v+this.height};this.ctx.textBaseline="top"}};Aa.prototype.render=function(){this._textBlock&&this._textBlock.render(!0)};qa(Ka,V);Ka.prototype.setLayout=Aa.prototype.setLayout;Ka.prototype.render=Aa.prototype.render;Wa.prototype.get=function(k,p){var r=null;0a[g].x&&0w?{x:a[l].x+w/3,y:a[l].y+c/3}:{x:a[l].x,y:a[l].y+c/9};l=e;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[l].x-a[g].x?0.01:a[l].x-a[g].x))*(d- -1)/2+1;w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0w?{x:a[l].x-w/3,y:a[l].y-c/3}:{x:a[l].x,y:a[l].y-c/9};b[b.length]=a[e]}return b}function E(a,d,b,c,e,g,m,l,w,h){var s=0;h?(m.color=g,l.color=g):h=1;s=w?Math.abs(e-b):Math.abs(c-d);s=0this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360);this.options.scaleBreaks&&(this.scaleBreaks=new Q(this.chart, -this.options.scaleBreaks,++this.chart._eventManager.lastObjectId,this));this.stripLines=[];if(this.options.stripLines&&0=this._appliedBreaks[a+1].startValue&&(this._appliedBreaks[a].endValue=Math.max(this._appliedBreaks[a].endValue,this._appliedBreaks[a+1].endValue),window.console&&window.console.log("CanvasJS Error: Breaks "+a+" and "+(a+1)+" are overlapping."),this._appliedBreaks.splice(a,2),a--)}}function L(a,d,b,c,e,g){L.base.constructor.call(this,"Break",d,b,c,g);this.id=e;this.chart=a;this.ctx=this.chart.ctx;this.scaleBreaks=g;this.optionsName= -d;this.isOptionsInArray=!0;this.type=b.type?this.type:g.type;this.fillOpacity=u(b.fillOpacity)?g.fillOpacity:this.fillOpacity;this.lineThickness=u(b.lineThickness)?g.lineThickness:this.lineThickness;this.color=b.color?this.color:g.color;this.lineColor=b.lineColor?this.lineColor:g.lineColor;this.lineDashType=b.lineDashType?this.lineDashType:g.lineDashType;!u(this.startValue)&&this.startValue.getTime&&(this.startValue=this.startValue.getTime());!u(this.endValue)&&this.endValue.getTime&&(this.endValue= -this.endValue.getTime());"number"===typeof this.startValue&&("number"===typeof this.endValue&&this.endValue=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers);O(this._zoomButton,"mouseout",function(){d||(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(0%)", -filter:"invert(0%)"}))},this.allDOMEventHandlers)}this._resetButton||(d=!1,va(this._resetButton=document.createElement("button")),ua(this,this._resetButton,"reset"),this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor,this._toolBar.appendChild(this._resetButton),O(this._resetButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._resetButton,"click",function(){a.toolTip.hide();a.zoomEnabled||a.panEnabled?(a.zoomEnabled= -!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"),a._defaultCursor="default",a.overlaidCanvas.style.cursor=a._defaultCursor):(a.zoomEnabled=!1,a.panEnabled=!1);if(a.sessionVariables.axisX)for(var c=0;c=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers),O(this._resetButton,"mouseout",function(){d||(sa(a,a._resetButton, -{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers),this.overlaidCanvas.style.cursor=a._defaultCursor);this.zoomEnabled||this.panEnabled||(this._zoomButton?(a._zoomButton.getAttribute("state")===a._cultureInfo.zoomText?(this.panEnabled=!0,this.zoomEnabled=!1):(this.zoomEnabled=!0,this.panEnabled= -!1),Qa(a._zoomButton,a._resetButton)):(this.zoomEnabled=!0,this.panEnabled=!1))}else this.panEnabled=this.zoomEnabled=!1;this._menuButton?this.exportEnabled?Qa(this._menuButton):va(this._menuButton):this.exportEnabled&&r&&(d=!1,this._menuButton=document.createElement("button"),ua(this,this._menuButton,"menu"),this._toolBar.appendChild(this._menuButton),O(this._menuButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._menuButton,"click",function(){"none"!==a._dropdownMenu.style.display|| -a._dropDownCloseTime&&500>=(new Date).getTime()-a._dropDownCloseTime.getTime()||(a._dropdownMenu.style.display="block",a._menuButton.blur(),a._dropdownMenu.focus())},this.allDOMEventHandlers,!0),O(this._menuButton,"mouseover",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.fontColorOnHover}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers,!0), -O(this._menuButton,"mouseout",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers,!0));if(!this._dropdownMenu&&this.exportEnabled&&r){d=!1;this._dropdownMenu=document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);var b=-1!==this.theme.indexOf("dark")?"black":"#888888";this._dropdownMenu.style.cssText= -"position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 0px;top: 25px;min-width: 120px;outline: 0;font-size: 14px; font-family: Arial, Helvetica, sans-serif;padding: 5px 0px 5px 0px;text-align: left;line-height: 10px;background-color:"+this.toolbar.backgroundColor+";box-shadow: 2px 2px 10px "+b;a._dropdownMenu.style.display="none";this._toolBar.appendChild(this._dropdownMenu);O(this._dropdownMenu,"blur",function(){va(a._dropdownMenu); -a._dropDownCloseTime=new Date},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.printText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers, -!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){a.print();va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.saveJPGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d= -!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"jpeg",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText= -"padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.savePNGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor, -this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"png",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0)}"none"!==this._toolBar.style.display&&this._zoomButton&&(this.panEnabled?ua(a,a._zoomButton,"zoom"):ua(a,a._zoomButton,"pan"),a._resetButton.getAttribute("state")!==a._cultureInfo.resetText&&ua(a,a._resetButton,"reset"));this.options.toolTip&&this.toolTip.options!==this.options.toolTip&&(this.toolTip.options=this.options.toolTip); -for(var c in this.toolTip.options)this.toolTip.options.hasOwnProperty(c)&&this.toolTip.updateOption(c)};p.prototype._updateSize=function(){var a;a=[this.canvas,this._preRenderCanvas,this.overlaidCanvas,this._eventManager.ghostCanvas];var d=0,b=0;this.options.width?d=this.width:this.width=d=0c.linkedDataSeriesIndex||c.linkedDataSeriesIndex>=this.options.data.length||"number"!==typeof c.linkedDataSeriesIndex|| -"error"===this.options.data[c.linkedDataSeriesIndex].type)&&(c.linkedDataSeriesIndex=null);null===c.name&&(c.name="DataSeries "+a);null===c.color?1a&&"undefined"!==typeof w.startTimePercent?a>=w.startTimePercent&&w.animationCallback(w.easingFunction(a-w.startTimePercent,0,1,1-w.startTimePercent),w):w.animationCallback(w.easingFunction(a,0,1,1),w);s.dispatchEvent("dataAnimationIterationEnd",{chart:s})},function(){b=[];for(var a=0;aa.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c);ed.max&&"number"===typeof e&&(d.max=e);if(0B&&(B=1/B);b.minDiff>B&&1!==B&&(b.minDiff=B)}else B=c-l.dataPoints[w-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B);null!==e&&null!==l.dataPoints[w-1].y&&(a.axisY.logarithmic?(B=e/l.dataPoints[w-1].y,1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e-l.dataPoints[w-1].y,0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B)))}if(cf&& -!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&qd.viewPortMax&&"number"===typeof e&&(d.viewPortMax=e))}}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype._processStackedPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d= -a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=[],l=[],w=Infinity,h=-Infinity,s=0;sb.max&&(b.max=c);if(0r&&(r=1/r);b.minDiff>r&&1!==r&&(b.minDiff=r)}else r=c-q.dataPoints[n-1].x,0>r&&(r*=-1),b.minDiff>r&&0!==r&&(b.minDiff=r);null!==e&&null!==q.dataPoints[n-1].y&&(a.axisY.logarithmic?0r&&(r=1/r),d.minDiff>r&&1!==r&&(d.minDiff=r)):(r=e-q.dataPoints[n-1].y,0>r&&(r*=-1),d.minDiff>r&&0!==r&&(d.minDiff=r)))}if(ct&&!B)B=!0;else if(c>t&&B)continue;q.dataPoints[n].label&&(a.axisX.labels[c]=q.dataPoints[n].label);cb.viewPortMax&&(b.viewPortMax=c);null===q.dataPoints[n].y?b.viewPortMin===c&&kd.max&&(d.max=a),nb.viewPortMax||(ad.viewPortMax&& -(d.viewPortMax=a)));for(n in l)l.hasOwnProperty(n)&&!isNaN(n)&&(a=l[n],ad.max&&(d.max=Math.max(a,h)),nb.viewPortMax||(ad.viewPortMax&&(d.viewPortMax=Math.max(a,h))))}};p.prototype._processStacked100PlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=!1,l=!1,w=[],h=0;hb.max&&(b.max=c);if(0t&&(t=1/t);b.minDiff>t&&1!==t&&(b.minDiff=t)}else t=c-s.dataPoints[q-1].x,0>t&&(t*=-1),b.minDiff>t&&0!==t&&(b.minDiff=t);u(e)||null===s.dataPoints[q-1].y||(a.axisY.logarithmic?0t&&(t=1/t),d.minDiff>t&&1!==t&&(d.minDiff=t)):(t=e-s.dataPoints[q-1].y,0>t&&(t*=-1),d.minDiff>t&&0!==t&&(d.minDiff=t)))}if(cr&&!f)f=!0;else if(c>r&&f)continue;s.dataPoints[q].label&&(a.axisX.labels[c]=s.dataPoints[q].label); -cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&Be&&(l=!0),w[c]=w[c]?w[c]+Math.abs(e):Math.abs(e))}}s.axisX.valueType=s.xValueType=g?"dateTime":"number"}a.axisY.logarithmic?(d.max=u(d.viewPortMax)?99*Math.pow(a.axisY.logarithmBase,-0.05):Math.max(d.viewPortMax,99*Math.pow(a.axisY.logarithmBase,-0.05)),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&!l?(d.max=u(d.viewPortMax)? -99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&l?(d.max=u(d.viewPortMax)?99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99)):!m&&l&&(d.max=u(d.viewPortMax)?-1:Math.max(d.viewPortMax,-1),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99));d.viewPortMin=d.min;d.viewPortMax=d.max;a.dataPointYSums=w}};p.prototype._processMultiYPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo, -b=a.axisX.dataInfo,c,e,g,m,l=!1,w=0;wb.max&&(b.max=c);gd.max&&(d.max=m);0B&&(B=1/B),b.minDiff>B&&1!==B&&(b.minDiff=B)):(B=c-h.dataPoints[s-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B)),e&&(null!==e[0]&&h.dataPoints[s-1].y&&null!==h.dataPoints[s-1].y[0])&&(a.axisY.logarithmic?(B=e[0]/ -h.dataPoints[s-1].y[0],1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e[0]-h.dataPoints[s-1].y[0],0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B))));if(!(ct&&!n)n=!0;else if(c>t&&n)continue;h.dataPoints[s].label&&(a.axisX.labels[c]=h.dataPoints[s].label);cb.viewPortMax&&(b.viewPortMax=c);if(b.viewPortMin===c&&e)for(p=0;pd.viewPortMax&&(d.viewPortMax=m))}}h.axisX.valueType=h.xValueType=l?"dateTime":"number"}};p.prototype._processSpecificPlotUnit=function(a){if("waterfall"===a.type&&a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c),l.dataPointEOs[w].cumulativeSumd.max&&(d.max=l.dataPointEOs[w].cumulativeSum),0q&&(q=1/q),b.minDiff>q&&1!==q&&(b.minDiff=q)):(q=c-l.dataPoints[w-1].x,0>q&&(q*=-1),b.minDiff>q&&0!==q&&(b.minDiff=q)),null!==e&&null!==l.dataPoints[w- -1].y&&(a.axisY.logarithmic?(e=l.dataPointEOs[w].cumulativeSum/l.dataPointEOs[w-1].cumulativeSum,1>e&&(e=1/e),d.minDiff>e&&1!==e&&(d.minDiff=e)):(e=l.dataPointEOs[w].cumulativeSum-l.dataPointEOs[w-1].cumulativeSum,0>e&&(e*=-1),d.minDiff>e&&0!==e&&(d.minDiff=e)))),!(cf&&!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);0d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w-1].cumulativeSum));l.dataPointEOs[w].cumulativeSumd.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w].cumulativeSum)}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype.calculateAutoBreaks=function(){function a(a,c,b,e){if(e)return b= -Math.pow(Math.min(b*a/c,c/a),0.2),1>=b&&(b=Math.pow(1>a?1/a:Math.min(c/a,a),0.25)),{startValue:a*b,endValue:c/b};b=0.2*Math.min(b-c+a,c-a);0>=b&&(b=0.25*Math.min(c-a,Math.abs(a)));return{startValue:a+b,endValue:c-b}}function d(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){var c=a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<=a.axisX.scaleBreaks.maxNumberOfAutoBreaks,b=a.axisY.scaleBreaks&&a.axisY.scaleBreaks.autoCalculate&&1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks;if(c|| -b)for(var d=a.axisY.dataInfo,f=a.axisX.dataInfo,g,h=f.min,l=f.max,m=d.min,n=d.max,f=f._dataRanges,d=d._dataRanges,q,w=0,s=0;sk.dataPoints.length))for(w=0;wf[q].max&&(f[q].max=g)),b){var r= -(n+1-m)*Math.max(parseFloat(a.axisY.scaleBreaks.collapsibleThreshold)||10,10)/100;if((g="waterfall"===a.type?k.dataPointEOs[w].cumulativeSum:k.dataPoints[w].y)&&g.length)for(var p=0;pd[q].max&&(d[q].max=g[p]);else u(g)||(q=Math.floor((g-m)/r),gd[q].max&&(d[q].max=g))}}}}function b(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)&&a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<= -a.axisX.scaleBreaks.maxNumberOfAutoBreaks)for(var c=a.axisX.dataInfo,b=c.min,d=c.max,f=c._dataRanges,g,h=0,l=0;lm.dataPoints.length))for(h=0;hf[g].max&&(f[g].max=c)}}for(var c,e=this,g=!1,m=0;m< -this._axes.length;m++)if(this._axes[m].scaleBreaks&&this._axes[m].scaleBreaks.autoCalculate&&1<=this._axes[m].scaleBreaks.maxNumberOfAutoBreaks){g=!0;this._axes[m].dataInfo._dataRanges=[];for(var l=0;l<100/Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10);l++)this._axes[m].dataInfo._dataRanges.push({min:Infinity,max:-Infinity})}if(g){for(m=0;ms[f].max&&(s[f].max=q)}delete this._axes[m].dataInfo.dataPointYPositiveSums}if(this._axes[m].dataInfo.dataPointYNegativeSums){n= -this._axes[m].dataInfo.dataPointYNegativeSums;s=h;for(l in n)n.hasOwnProperty(l)&&!isNaN(l)&&(q=-1*n[l],u(q)||(f=Math.floor((q-w)/c),qs[f].max&&(s[f].max=q)));delete this._axes[m].dataInfo.dataPointYNegativeSums}for(l=0;lc&&g.push({diff:q,start:s,end:w});break}else l++;if(this._axes[m].scaleBreaks.customBreaks)for(l=0;l=e.x1&&(a<=e.x2&&d>=e.y1&&d<=e.y2)&&(c=e.id)}return c};p.prototype.getAutoFontSize=lb;p.prototype.resetOverlayedCanvas=function(){this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height)};p.prototype.clearCanvas=kb;p.prototype.attachEvent=function(a){this._events.push(a)};p.prototype._touchEventHandler=function(a){if(a.changedTouches&&this.interactivityEnabled){var d=[],b=a.changedTouches,c=b?b[0]:a,e=null;switch(a.type){case "touchstart":case "MSPointerDown":d=["mousemove","mousedown"];this._lastTouchData= -Ra(c);this._lastTouchData.time=new Date;break;case "touchmove":case "MSPointerMove":d=["mousemove"];break;case "touchend":case "MSPointerUp":var g=this._lastTouchData&&this._lastTouchData.time?new Date-this._lastTouchData.time:0,d="touchstart"===this._lastTouchEventType||"MSPointerDown"===this._lastTouchEventType||300>g?["mouseup","click"]:["mouseup"];break;default:return}if(!(b&&1g)this._lastTouchData.scroll=!0}catch(l){}this._lastTouchEventType=a.type;if(this._lastTouchData.scroll&&this.zoomEnabled)this.isDrag&&this.resetOverlayedCanvas(),this.isDrag=!1;else for(b=0;b=e.x1&&d.x<=e.x2&&d.y>=e.y1&&d.y<=e.y2){c[b].call(c.context,d.x,d.y);"mousedown"===b&&!0===c.capture?(p.capturedEventParam=c,this.overlaidCanvas.setCapture?this.overlaidCanvas.setCapture():document.documentElement.addEventListener("mouseup", -this._mouseEventHandler,!1)):"mouseup"===b&&(c.chart.overlaidCanvas.releaseCapture?c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",this._mouseEventHandler,!1));break}else c=null;a.target.style.cursor=c&&c.cursor?c.cursor:this._defaultCursor}b=this.plotArea;if(d.xb.x2||d.yb.y2)this.toolTip&&this.toolTip.enabled?this.toolTip.hide():this.resetOverlayedCanvas();this.isDrag&&this.zoomEnabled||!this._eventManager||this._eventManager.mouseEventHandler(a)}}; -p.prototype._plotAreaMouseDown=function(a,d){this.isDrag=!0;this.dragStartPoint={x:a,y:d}};p.prototype._plotAreaMouseUp=function(a,d){if(("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)&&this.isDrag){var b=d-this.dragStartPoint.y,c=a-this.dragStartPoint.x,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=!1;this.resetOverlayedCanvas();if("xySwapped"===this.plotInfo.axisPlacement)var l=g,g=e,e=l;if(this.panEnabled||this.zoomEnabled){if(this.panEnabled)for(e= -g=0;eb.maximum&&(g=b.viewportMaximum/b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum/g,b.sessionVariables.newViewportMaximum=b.viewportMaximum/g,m=!0):b.viewportMinimumb.maximum&&(g=b.viewportMaximum-b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum-g,b.sessionVariables.newViewportMaximum=b.viewportMaximum-g,m=!0);else if((!e||2Math.abs(b)&&(this.panEnabled||this.zoomEnabled)?this.toolTip.hide():this.panEnabled||this.zoomEnabled||this.toolTip.mouseMoveHandler(a, -d);if((!e||2f)var B=f,f=n,n=B;if(q.scaleBreaks)for(B=0;!g&&B=f;if(isFinite(q.dataInfo.minDiff))if(B=q.getApparentDifference(n,f,null,!0),!(g||!(this.panEnabled&&q.scaleBreaks&&q.scaleBreaks._appliedBreaks.length)&&(q.logarithmic&&Bq.maximum))w.push(q),s.push({val1:n,val2:f}),l=!0;else if(!e){l=!1;break}}return{isValid:l,axesWithValidRange:w,axesRanges:s}};p.prototype.preparePlotArea=function(){var a=this.plotArea;!r&&(0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2;a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2;a.width=a.x2-a.x1;a.height=a.y2-a.y1}this.axisY2&&0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2,a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2,a.width=a.x2-a.x1,a.height=a.y2-a.y1)}else d= -this.layoutManager.getFreeSpace(),a.x1=d.x1,a.x2=d.x2,a.y1=d.y1,a.y2=d.y2,a.width=d.width,a.height=d.height;r||(a.canvas.width=a.width,a.canvas.height=a.height,a.canvas.style.left=a.x1+"px",a.canvas.style.top=a.y1+"px",(0b.x2||h.point.yb.y2+1)continue}else if("rangearea"===s||"rangesplinearea"===s){if(h.dataPoint.xy.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("bubble")||0<=s.indexOf("scatter")){if(h.dataPoint.xy.viewportMaximum|| -h.dataPoint.yA.viewportMaximum)continue}else if(0<=s.indexOf("column")||"waterfall"===s||"error"===s&&!h.axisSwapped){if(h.dataPoint.xy.viewportMaximum||h.bounds.y1>b.y2||h.bounds.y2y.viewportMaximum||h.bounds.x1>b.x2||h.bounds.x2 -y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(h.dataPoint.xy.viewportMaximum)continue;e=m=2;"horizontal"===C?(l=f.width,w=f.height):(w=f.width,l=f.height);if("normal"===this.plotInfo.axisPlacement){if(0<=s.indexOf("line")||0<=s.indexOf("area"))t="auto",m=4;else if(0<=s.indexOf("stacked"))"auto"===t&&(t="inside");else if("bubble"===s||"scatter"===s)t="inside";q=h.point.x- -l/2;"inside"!==t?(e=b.y1,g=b.y2,0h.point.y)):(n=h.point.y+m+c,n>g-w-m-c&&(n="auto"===t?Math.min(h.point.y,g)-w-m-c:g-w-m-c,v=ng-w-m&&("bubble"===s||"scatter"===s)&&(n=Math.min(h.point.y+m,b.y2-w-m))),n=Math.min(n,g-w))}else 0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("scatter")?(t="auto",e=4):0<=s.indexOf("stacked")?"auto"===t&&(t="inside"):"bubble"===s&&(t="inside"),n=h.point.y-w/2,"inside"!==t?(m=b.x1,g=b.x2,0>ma?(q=h.point.x-l-e-c,qh.point.x)):(q=h.point.x+e+c,q>g-l-e-c&&(q="auto"=== -t?Math.min(h.point.x,g)-l-e-c:g-l-e-c,v=qma?Math.max(h.bounds.x1,b.x1)+l/2+e:Math.min(h.bounds.x2,b.x2)-l/2-e:(Math.max(h.bounds.x1,b.x1)+Math.min(h.bounds.x2,b.x2))/2,q=0>ma?Math.max(h.point.x,c)-l/2:Math.min(h.point.x,c)-l/2,q=Math.max(q,m));"vertical"===C&&(n+=w);f.x=q;f.y=n;f.render(!0);p&&("inside"!==t&&(0>s.indexOf("bar")&&("error"!==s||!h.axisSwapped)&&h.point.x>b.x1&&h.point.xs.indexOf("column")&&("error"!==s||h.axisSwapped)&&h.point.y>b.y1&&h.point.y=a.dataSeriesIndexes.length)){var c= -this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& -b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepLine=function(a){var d=a.targetCanvasCtx|| -this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&& -(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation, -easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderSpline=function(a){function d(a){a=v(a,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx;c.save();var g=this.plotArea;c.beginPath(); -c.rect(g.x1,g.y1,g.width,g.height);c.clip();for(var m=[],l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[p].y)0s[p].y===a.axisY.reversed?1:-1,color:B});u=!1}d(x)}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas, -0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(g.x1,g.y1,g.width,g.height),e.beginPath());c.restore();c.beginPath();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, -animationBase:0}}};p.prototype.renderColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width, -0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.dataPointWidth=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){m=a.axisX.convertValueToPixel(w);l=a.axisY.convertValueToPixel(B[g].y);m=a.axisX.reversed?m+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:m-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var k=a.axisX.reversed?m-q<<0:m+q<<0,t;0<=B[g].y?t=h:(t=l,l=h);l>t&&(c=l,l=t,t=c);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,l,k,t,c,0,null,p&&0<=B[g].y, -0>B[g].y&&p,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:m,y1:l,x2:k,y2:t};c=N(c);r&&ea(this._eventManager.ghostCtx,m,l,k,t,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"column",dataPoint:B[g],dataSeries:f,point:{x:m+(k-m)/2,y:0>B[g].y===a.axisY.reversed?l:t},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:m, -y1:Math.min(l,t),x2:k,y2:Math.max(l,t)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore(); -return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.y2?a.axisY.bounds.y2:h}}};p.prototype.renderStackedColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth? -this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? -this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q="undefined"!==typeof m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;g[c]=A+(y-q)}else A=m[c]?m[c]:0,y=q+A,q=n+A,m[c]=A+(y-q);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1, -!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedColumn",dataPoint:t[h],dataSeries:p,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q, -y)},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx, -animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderStackedColumn100=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth: -this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? -this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);q=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;q=a.axisY.convertValueToPixel(l[c]);y=g[c]?g[c]:n;g[c]=q}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=q+("undefined"!==typeof w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q=m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(q),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y1-q)&&(q=e.y1);g[c]=A+(y-q)}else A="undefined"!==typeof m[c]? -m[c]:0,y=q+A,q=n+A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y2-y)&&(y=e.y2),m[c]=A+(y-q);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&& -this._indexLabels.push({chartType:"stackedColumn100",dataPoint:t[h],dataSeries:k,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q,y)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&& -this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= -null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.options.dataPointWidth? -this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height); -b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){l=a.axisX.convertValueToPixel(w); -m=a.axisY.convertValueToPixel(B[g].y);l=a.axisX.reversed?l+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:l-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var p=a.axisX.reversed?l-q<<0:l+q<<0,t;0<=B[g].y?t=h:(t=m,m=h);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,t,l,m,p,c,0,null,k,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:t,y1:l,x2:m,y2:p};c= -N(c);r&&ea(this._eventManager.ghostCtx,t,l,m,p,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"bar",dataPoint:B[g],dataSeries:f,point:{x:0<=B[g].y?m:t,y:l+(p-l)/2},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(t,m),y1:l,x2:Math.max(t,m),y2:p},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas, -0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.x2?a.axisY.bounds.x2: -h}}};p.prototype.renderStackedBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<< -0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),s=m[c]? -m[c]:n,m[c]=y=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A=g[c]?g[c]:0;y=n+A;s+=A;g[c]=A+(s-y)}else A=m[c]?m[c]:0,y=s-A,s=n-A,m[c]=A+(s-y);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,y,x,s,v,c,0,null,u,!1,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:y,y1:x,x2:s,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,y,x,s,v,c,0,null,!1,!1,!1, -!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar",dataPoint:t[h],dataSeries:k,point:{x:0<=t[h].y?s:y,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(y,s),y1:x,x2:Math.max(y,s),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& -b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderStackedBar100=function(a){var d= -a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)|| -(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save(); -b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&& -"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x;x=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var v=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,y=v+f<<0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;x=g[c]?g[c]:n;g[c]=s=a.axisY.convertValueToPixel(l[c])}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=x+(w[c]?w[c]:0),s=m[c]?m[c]: -n,m[c]=x=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(x),0<=t[h].y){var A=g[c]?g[c]:0;x=n+A;s+=A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x2-s)&&(s=e.x2);g[c]=A+(s-x)}else A=m[c]?m[c]:0,x=s-A,s=n-A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x1-x)&&(x=e.x1),m[c]=A+(s-x);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,v,s,y,c,0,null,u,!1,!1,!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k, -dataPointIndex:h,x1:x,y1:v,x2:s,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,v,s,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar100",dataPoint:t[h],dataSeries:p,point:{x:0<=t[h].y?s:x,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(x,s),y1:v,x2:Math.max(x,s),y2:y},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop", -a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!da)))if("number"!==typeof p[k].y)B.connectNullData||(da||d)||c(),da=!0;else{t=a.axisX.convertValueToPixel(x);u=a.axisY.convertValueToPixel(p[k].y);d||da?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||b===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d=t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,b=B.nullDataLineDashType,g.setLineDash(Y)),g.lineTo(t,u),r&&m.lineTo(t, -u)):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),da=d=!1):(g.lineTo(t,u),r&&m.lineTo(t,u),0==k%250&&c());q={x:t,y:u};kp[k].y===a.axisY.reversed?1:-1,color:z})}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas, -0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, -animationBase:0}}};p.prototype.renderSplineArea=function(a){function d(){var b=v(x,2);if(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum? -t=p:0>a.axisY.viewportMaximum?t=m.y1:0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=a.axisX.lineCoordinates,m=a.axisY.lineCoordinates,l=[],w=this.plotArea;c.save();r&& -e.save();c.beginPath();c.rect(w.x1,w.y1,w.width,w.height);c.clip();r&&(e.beginPath(),e.rect(w.x1,w.y1,w.width,w.height),e.clip());for(var h=0;ha.axisX.dataInfo.viewPortMax&&(!q.connectNullData||!k)))if("number"!==typeof n[f].y)0n[f].y===a.axisY.reversed?1:-1,color:ma});k=!1}d();ia.drawMarkers(l)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(w.x1,w.y1,w.width,w.height), -this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!b))){var Z=u;"number"!==typeof k[p].y?(B.connectNullData||(b||d)||c(),b=!0):(t=a.axisX.convertValueToPixel(x),u=a.axisY.convertValueToPixel(k[p].y),d||b?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||Y===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d= -t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,Y=B.nullDataLineDashType,g.setLineDash(ca)),g.lineTo(t,Z),g.lineTo(t,u),r&&(m.lineTo(t,Z),m.lineTo(t,u))):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),b=d=!1):(g.lineTo(t,Z),r&&m.lineTo(t,Z),g.lineTo(t,u),r&&m.lineTo(t,u),0==p%250&&c()),q={x:t,y:u},pk[p].y===a.axisY.reversed?1:-1,color:z}))}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, -0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea=function(a){function d(){if(!(1>h.length)){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=[],l=this.plotArea,w=[],h=[],s=[],q=[],n=0,f,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),u=this._eventManager.ghostCtx,t,C,x;r&&u.beginPath();c.save();r&&u.save();c.beginPath();c.rect(l.x1,l.y1,l.width,l.height);c.clip();r&&(u.beginPath(),u.rect(l.x1,l.y1,l.width,l.height),u.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData||!da)))if("number"!==typeof Z.y)A.connectNullData||(da||C)||d(),da=!0;else{f=a.axisX.convertValueToPixel(g);var oa= -w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(Z.y),k-=oa;h.push({x:f,y:p-oa});w[g]=p-k;C||da?(!C&&A.connectNullData?(c.setLineDash&&(A.options.nullDataLineDashType||x===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(C=h.pop(),x=h[h.length-1],d(),c.moveTo(t.x,t.y),h.push(x),h.push(C),x=A.nullDataLineDashType, -c.setLineDash(Y)),c.lineTo(f,k),r&&u.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(u.beginPath(),u.moveTo(f,k))),da=C=!1):(c.lineTo(f,k),r&&u.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&u.moveTo(f,k),h.push({x:f,y:p-oa})));t={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&u.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& -c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(l.x1,l.y1,l.width,l.height),u.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea100=function(a){function d(){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=[],w=[],h=[],s=[],q=[],n=0,f,k,p,u,t,C=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),x=this._eventManager.ghostCtx;c.save();r&&x.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(x.beginPath(), -x.rect(m.x1,m.y1,m.width,m.height),x.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData|| -!da)))if("number"!==typeof Z.y)A.connectNullData||(da||u)||d(),da=!0;else{var oa;oa=0!==a.dataPointYSums[g]?100*(Z.y/a.dataPointYSums[g]):0;f=a.axisX.convertValueToPixel(g);var la=w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(oa),k-=la;h.push({x:f,y:C-la});w[g]=C-k;u||da?(!u&&A.connectNullData?(c.setLineDash&& -(A.options.nullDataLineDashType||t===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(u=h.pop(),t=h[h.length-1],d(),c.moveTo(p.x,p.y),h.push(t),h.push(u),t=A.nullDataLineDashType,c.setLineDash(Y)),c.lineTo(f,k),r&&x.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(x.beginPath(),x.moveTo(f,k))),da=u=!1):(c.lineTo(f,k),r&&x.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&x.moveTo(f,k),h.push({x:f,y:C-la})));p={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&x.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(l);r&&(b.drawImage(this._preRenderCanvas,0, -0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),x.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}}; -p.prototype.renderBubble=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=-Infinity,w=Infinity,h=0;ha.axisX.dataInfo.viewPortMax||"undefined"===typeof n[e].z||(f=n[e].z,f>l&&(l=f),fa.axisX.dataInfo.viewPortMax)&&"number"===typeof n[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(n[e].y);var f=n[e].z,u=2*Math.max(Math.sqrt((l===w?p/2:k+(p-k)/(l-w)*(f-w))/Math.PI)<<0,1),f=q.getMarkerProperties(e,b);f.size=u;b.globalAlpha=q.fillOpacity;ia.drawMarker(g,m,b,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;var t=q.dataPointIds[e];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:s, -dataPointIndex:e,x1:g,y1:m,size:u};u=N(t);r&&ia.drawMarker(g,m,this._eventManager.ghostCtx,f.type,f.size,u,u,f.borderThickness);(n[e].indexLabel||q.indexLabel||n[e].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"bubble",dataPoint:n[e],dataSeries:q,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/2,x2:g+f.size/2,y2:m+f.size/2},color:null})}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& -b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderScatter=function(a){var d= -a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=0;la.axisX.dataInfo.viewPortMax)&&"number"===typeof s[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(s[e].y);var f=h.getMarkerProperties(e,g,m,b);b.globalAlpha=h.fillOpacity;ia.drawMarker(f.x,f.y,f.ctx,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;Math.sqrt((q-g)*(q-g)+(n-m)*(n-m))Math.min(this.plotArea.width,this.plotArea.height)||(q=h.dataPointIds[e],this._eventManager.objectMap[q]={id:q,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:e,x1:g,y1:m},q=N(q),r&&ia.drawMarker(f.x,f.y,this._eventManager.ghostCtx,f.type,f.size,q,q,f.borderThickness),(s[e].indexLabel||h.indexLabel||s[e].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"scatter",dataPoint:s[e],dataSeries:h,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/ -2,x2:g+f.size/2,y2:m+f.size/2},color:null}),q=g,n=m)}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore()); -b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderCandlestick=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=0,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,g=this.options.dataPointMaxWidth? -this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*m.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&&e>g&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,g));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&gg&&(k=g);b.save();r&&c.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(c.beginPath(),c.rect(m.x1,m.y1,m.width,m.height),c.clip());for(var p=0;pa.axisX.dataInfo.viewPortMax)&&!u(C[l].y)&&C[l].y.length&& -"number"===typeof C[l].y[0]&&"number"===typeof C[l].y[1]&&"number"===typeof C[l].y[2]&&"number"===typeof C[l].y[3]){w=a.axisX.convertValueToPixel(f);h=a.axisY.convertValueToPixel(C[l].y[0]);s=a.axisY.convertValueToPixel(C[l].y[1]);q=a.axisY.convertValueToPixel(C[l].y[2]);n=a.axisY.convertValueToPixel(C[l].y[3]);var z=w-k/2<<0,y=z+k<<0,g=t.options.fallingColor?t.fallingColor:t._colorSet[0],e=C[l].color?C[l].color:t._colorSet[0],A=Math.round(Math.max(1,0.15*k)),D=0===A%2?0:0.5,aa=t.dataPointIds[l]; -this._eventManager.objectMap[aa]={id:aa,objectType:"dataPoint",dataSeriesIndex:v,dataPointIndex:l,x1:z,y1:h,x2:y,y2:s,x3:w,y3:q,x4:w,y4:n,borderThickness:A,color:e};b.strokeStyle=e;b.beginPath();b.lineWidth=A;c.lineWidth=Math.max(A,4);"candlestick"===t.type?(b.moveTo(w-D,s),b.lineTo(w-D,Math.min(h,n)),b.stroke(),b.moveTo(w-D,Math.max(h,n)),b.lineTo(w-D,q),b.stroke(),ea(b,z,Math.min(h,n),y,Math.max(h,n),C[l].y[0]<=C[l].y[3]?t.risingColor:g,A,e,x,x,!1,!1,t.fillOpacity),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w- -D,s),c.lineTo(w-D,Math.min(h,n)),c.stroke(),c.moveTo(w-D,Math.max(h,n)),c.lineTo(w-D,q),c.stroke(),ea(c,z,Math.min(h,n),y,Math.max(h,n),e,0,null,!1,!1,!1,!1))):"ohlc"===t.type&&(b.moveTo(w-D,s),b.lineTo(w-D,q),b.stroke(),b.beginPath(),b.moveTo(w,h),b.lineTo(z,h),b.stroke(),b.beginPath(),b.moveTo(w,n),b.lineTo(y,n),b.stroke(),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w-D,s),c.lineTo(w-D,q),c.stroke(),c.beginPath(),c.moveTo(w,h),c.lineTo(z,h),c.stroke(),c.beginPath(),c.moveTo(w,n),c.lineTo(y,n),c.stroke())); -(C[l].indexLabel||t.indexLabel||C[l].indexLabelFormatter||t.indexLabelFormatter)&&this._indexLabels.push({chartType:t.type,dataPoint:C[l],dataSeries:t,point:{x:z+(y-z)/2,y:a.axisY.reversed?q:s},direction:1,bounds:{x1:z,y1:Math.min(s,q),x2:y,y2:Math.max(s,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas, -0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderBoxAndWhisker=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e= -null,g=this.plotArea,m=0,l,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*g.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&& -e>m&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(k=m);b.save();r&&c.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(c.beginPath(),c.rect(g.x1,g.y1,g.width,g.height),c.clip());for(var p=!1,p=!!a.axisY.reversed,v=0;va.axisX.dataInfo.viewPortMax)&&!u(x[m].y)&&x[m].y.length&&"number"===typeof x[m].y[0]&&"number"===typeof x[m].y[1]&&"number"===typeof x[m].y[2]&&"number"===typeof x[m].y[3]&&"number"===typeof x[m].y[4]&&5===x[m].y.length){l=a.axisX.convertValueToPixel(f);w=a.axisY.convertValueToPixel(x[m].y[0]);h=a.axisY.convertValueToPixel(x[m].y[1]);s=a.axisY.convertValueToPixel(x[m].y[2]); -q=a.axisY.convertValueToPixel(x[m].y[3]);n=a.axisY.convertValueToPixel(x[m].y[4]);var y=l-k/2<<0,A=l+k/2<<0,e=x[m].color?x[m].color:C._colorSet[0],D=Math.round(Math.max(1,0.15*k)),aa=0===D%2?0:0.5,T=x[m].whiskerColor?x[m].whiskerColor:x[m].color?C.whiskerColor?C.whiskerColor:x[m].color:C.whiskerColor?C.whiskerColor:e,Y="number"===typeof x[m].whiskerThickness?x[m].whiskerThickness:"number"===typeof C.options.whiskerThickness?C.whiskerThickness:D,ca=x[m].whiskerDashType?x[m].whiskerDashType:C.whiskerDashType, -da=u(x[m].whiskerLength)?u(C.options.whiskerLength)?k:C.whiskerLength:x[m].whiskerLength,da="number"===typeof da?0>=da?0:da>=k?k:da:"string"===typeof da?parseInt(da)*k/100>k?k:parseInt(da)*k/100:k,Z=1===Math.round(Y)%2?0.5:0,oa=x[m].stemColor?x[m].stemColor:x[m].color?C.stemColor?C.stemColor:x[m].color:C.stemColor?C.stemColor:e,la="number"===typeof x[m].stemThickness?x[m].stemThickness:"number"===typeof C.options.stemThickness?C.stemThickness:D,G=1===Math.round(la)%2?0.5:0,F=x[m].stemDashType?x[m].stemDashType: -C.stemDashType,E=x[m].lineColor?x[m].lineColor:x[m].color?C.lineColor?C.lineColor:x[m].color:C.lineColor?C.lineColor:e,H="number"===typeof x[m].lineThickness?x[m].lineThickness:"number"===typeof C.options.lineThickness?C.lineThickness:D,I=x[m].lineDashType?x[m].lineDashType:C.lineDashType,K=1===Math.round(H)%2?0.5:0,L=C.upperBoxColor,O=C.lowerBoxColor,Q=u(C.options.fillOpacity)?1:C.fillOpacity,P=C.dataPointIds[m];this._eventManager.objectMap[P]={id:P,objectType:"dataPoint",dataSeriesIndex:t,dataPointIndex:m, -x1:y,y1:w,x2:A,y2:h,x3:l,y3:s,x4:l,y4:q,y5:n,borderThickness:D,color:e,stemThickness:la,stemColor:oa,whiskerThickness:Y,whiskerLength:da,whiskerColor:T,lineThickness:H,lineColor:E};b.save();0=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth: -1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.03*this.width;var h=a.axisX.dataInfo.minDiff;isFinite(h)||(h=0.3*Math.abs(a.axisX.range));h=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(h)/Math.log(a.axisX.range):Math.abs(h)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&& -(this.dataPointMinWidth&&mm&&(h=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var s=0;sa.axisX.dataInfo.viewPortMax)&&!u(f[g].y)&&f[g].y.length&&"number"===typeof f[g].y[0]&&"number"===typeof f[g].y[1]){c=a.axisX.convertValueToPixel(w);m=a.axisY.convertValueToPixel(f[g].y[0]);l=a.axisY.convertValueToPixel(f[g].y[1]);var p=a.axisX.reversed?c+a.plotType.totalDataSeries*h/2-(a.previousDataSeriesCount+s)*h<<0:c-a.plotType.totalDataSeries*h/2+(a.previousDataSeriesCount+ -s)*h<<0,v=a.axisX.reversed?p-h<<0:p+h<<0,c=f[g].color?f[g].color:n._colorSet[g%n._colorSet.length];if(m>l){var t=m;m=l;l=t}t=n.dataPointIds[g];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:q,dataPointIndex:g,x1:p,y1:m,x2:v,y2:l};ea(b,p,m,v,l,c,0,c,k,k,!1,!1,n.fillOpacity);c=N(t);r&&ea(this._eventManager.ghostCtx,p,m,v,l,c,0,null,!1,!1,!1,!1);if(f[g].indexLabel||n.indexLabel||f[g].indexLabelFormatter||n.indexLabelFormatter)this._indexLabels.push({chartType:"rangeColumn", -dataPoint:f[g],dataSeries:n,indexKeyword:0,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?l:m},direction:f[g].y[1]>=f[g].y[0]?-1:1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c}),this._indexLabels.push({chartType:"rangeColumn",dataPoint:f[g],dataSeries:n,indexKeyword:1,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?m:l},direction:f[g].y[1]>=f[g].y[0]?1:-1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation= -"source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderError= -function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=a.axisY._position?"left"===a.axisY._position||"right"===a.axisY._position?!1:!0:!1;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=!1,m=this.plotArea,l=0,w,h,s,q,n,f,k,p=a.axisX.dataInfo.minDiff;isFinite(p)||(p=0.3*Math.abs(a.axisX.range));b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(m.x1, -m.y1,m.width,m.height),this._eventManager.ghostCtx.clip());for(var v=0,t=0;tl&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,l));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ll&&(t=l);if(0=T.length?0:T.length>=t?t:T.length:"string"===typeof T.length?parseInt(T.length)*t/100>t?t:parseInt(T.length)*t/100>t:t;T.thickness="number"===typeof T.thickness?0>T.thickness?0:Math.round(T.thickness):2;var Y={color:y[l].stemColor?y[l].stemColor:y[l].color?z.stemColor?z.stemColor:y[l].color:z.stemColor?z.stemColor:e,thickness:y[l].stemThickness?y[l].stemThickness:z.stemThickness,dashType:y[l].stemDashType? -y[l].stemDashType:z.stemDashType};Y.thickness="number"===typeof Y.thickness?0>Y.thickness?0:Math.round(Y.thickness):2;y[l].getTime?k=y[l].x.getTime():k=y[l].x;if(!(ka.axisX.dataInfo.viewPortMax)&&!u(y[l].y)&&y[l].y.length&&"number"===typeof y[l].y[0]&&"number"===typeof y[l].y[1]){var ca=a.axisX.convertValueToPixel(k);c?h=ca:w=ca;ca=a.axisY.convertValueToPixel(y[l].y[0]);c?s=ca:n=ca;ca=a.axisY.convertValueToPixel(y[l].y[1]);c?q=ca:f=ca;c?(n=a.axisX.reversed?h+(A?v: -1)*t/2-(A?D-1:0)*t<<0:h-(A?v:1)*t/2+(A?D-1:0)*t<<0,f=a.axisX.reversed?n-t<<0:n+t<<0):(s=a.axisX.reversed?w+(A?v:1)*t/2-(A?D-1:0)*t<<0:w-(A?v:1)*t/2+(A?D-1:0)*t<<0,q=a.axisX.reversed?s-t<<0:s+t<<0);!c&&n>f&&(ca=n,n=f,f=ca);c&&s>q&&(ca=s,s=q,q=ca);ca=z.dataPointIds[l];this._eventManager.objectMap[ca]={id:ca,objectType:"dataPoint",dataSeriesIndex:x,dataPointIndex:l,x1:Math.min(s,q),y1:Math.min(n,f),x2:Math.max(q,s),y2:Math.max(f,n),isXYSwapped:c,stemProperties:Y,whiskerProperties:T};E(b,Math.min(s,q), -Math.min(n,f),Math.max(q,s),Math.max(f,n),e,T,Y,c);r&&E(this._eventManager.ghostCtx,s,n,q,f,e,T,Y,c);if(y[l].indexLabel||z.indexLabel||y[l].indexLabelFormatter||z.indexLabelFormatter)this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:0,point:{x:c?y[l].y[1]>=y[l].y[0]?s:q:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?f:n},direction:y[l].y[1]>=y[l].y[0]?-1:1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c}), -this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:1,point:{x:c?y[l].y[1]>=y[l].y[0]?q:s:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?n:f},direction:y[l].y[1]>=y[l].y[0]?1:-1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height), -a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx: -d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0;var s=a.axisX.dataInfo.minDiff;isFinite(s)||(s=0.3*Math.abs(a.axisX.range));s=this.options.dataPointWidth?this.dataPointWidth:0.9* -(e.height*(a.axisX.logarithmic?Math.log(s)/Math.log(a.axisX.range):Math.abs(s)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(s=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(), -this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var q=0;qa.axisX.dataInfo.viewPortMax)&&!u(k[g].y)&&k[g].y.length&&"number"===typeof k[g].y[0]&&"number"===typeof k[g].y[1]){m=a.axisY.convertValueToPixel(k[g].y[0]); -l=a.axisY.convertValueToPixel(k[g].y[1]);w=a.axisX.convertValueToPixel(h);w=a.axisX.reversed?w+a.plotType.totalDataSeries*s/2-(a.previousDataSeriesCount+q)*s<<0:w-a.plotType.totalDataSeries*s/2+(a.previousDataSeriesCount+q)*s<<0;var v=a.axisX.reversed?w-s<<0:w+s<<0;m>l&&(c=m,m=l,l=c);c=k[g].color?k[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,w,l,v,c,0,null,p,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g, -x1:m,y1:w,x2:l,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,m,w,l,v,c,0,null,!1,!1,!1,!1);if(k[g].indexLabel||f.indexLabel||k[g].indexLabelFormatter||f.indexLabelFormatter)this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:0,point:{x:k[g].y[1]>=k[g].y[0]?m:l,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?-1:1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c}),this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:1,point:{x:k[g].y[1]>= -k[g].y[0]?l:m,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?1:-1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1, -e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeArea=function(a){function d(){if(C){var a=null;0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width,m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!s.connectNullData||!T)))if(null!==q[f].y&&q[f].y.length&&"number"===typeof q[f].y[0]&&"number"===typeof q[f].y[1]){k=a.axisX.convertValueToPixel(t);p=a.axisY.convertValueToPixel(q[f].y[0]);u=a.axisY.convertValueToPixel(q[f].y[1]);n||T?(s.connectNullData&&!n?(c.setLineDash&&(s.options.nullDataLineDashType||A===s.lineDashType&&s.lineDashType!==s.nullDataLineDashType)&&(w[w.length- -1].newLineDashArray=D,A=s.nullDataLineDashType,c.setLineDash(z)),c.lineTo(k,p),r&&e.lineTo(k,p),w.push({x:k,y:u})):(c.beginPath(),c.moveTo(k,p),C={x:k,y:p},w=[],w.push({x:k,y:u}),r&&(e.beginPath(),e.moveTo(k,p))),T=n=!1):(c.lineTo(k,p),w.push({x:k,y:u}),r&&e.lineTo(k,p),0==f%250&&d());t=s.dataPointIds[f];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:h,dataPointIndex:f,x1:k,y1:p,y2:u};fq[f].y[1]===a.axisY.reversed?-1:1,color:x}),this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:1,point:{x:k, -y:u},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?1:-1,color:x})}else T||n||d(),T=!0;d();ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1, -m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderRangeSplineArea=function(a){function d(a,b){var d=v(u,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width, -m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!f)))if(null!==k[q].y&&k[q].y.length&&"number"===typeof k[q].y[0]&&"number"===typeof k[q].y[1]){n=a.axisX.convertValueToPixel(n);f=a.axisY.convertValueToPixel(k[q].y[0]);p=a.axisY.convertValueToPixel(k[q].y[1]);var E=h.dataPointIds[q];this._eventManager.objectMap[E]={id:E,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:q, -x1:n,y1:f,y2:p};u[u.length]={x:n,y:f};z[z.length]={x:n,y:p};q=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx,e=null,g=this.plotArea,m=0,l,k,h,s,q=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),m=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;k=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width,0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0;var n= -a.axisX.dataInfo.minDiff;isFinite(n)||(n=0.3*Math.abs(a.axisX.range));n=this.options.dataPointWidth?this.dataPointWidth:0.6*(g.width*(a.axisX.logarithmic?Math.log(n)/Math.log(a.axisX.range):Math.abs(n)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&m>k&&(m=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,k));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&kk&&(n=k);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.clip());for(var f=0;fh&&(e=k,k=h,h=e);a.axisY.reversed&&(e=k,k=h,h=e);e=u.dataPointIds[m];this._eventManager.objectMap[e]={id:e,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:m,x1:l,y1:k,x2:F,y2:h}; -var T=v[m].color?v[m].color:0v[m].y===a.axisY.reversed?1:-1,bounds:{x1:l,y1:Math.min(k,h),x2:F,y2:Math.max(k,h)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height), -b.clearRect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};var ja=function(a,d,b,c,e,g,m,l,k){if(!(0>b)){"undefined"===typeof l&&(l=1);if(!r){var h=Number((m%(2*Math.PI)).toFixed(8));Number((g%(2*Math.PI)).toFixed(8))===h&&(m-=1E-4)}a.save();a.globalAlpha=l;"pie"===e?(a.beginPath(),a.moveTo(d.x,d.y),a.arc(d.x,d.y,b,g,m,!1),a.fillStyle=c,a.strokeStyle= -"white",a.lineWidth=2,a.closePath(),a.fill()):"doughnut"===e&&(a.beginPath(),a.arc(d.x,d.y,b,g,m,!1),0<=k&&a.arc(d.x,d.y,k*b,m,g,!0),a.closePath(),a.fillStyle=c,a.strokeStyle="white",a.lineWidth=2,a.fill());a.globalAlpha=1;a.restore()}};p.prototype.renderPie=function(a){function d(){if(h&&s){for(var a=0,b=0,c=0,e=0,d=0;dMath.PI/2-t&&m.midAngle -m.midAngle)c=d;a++}else if(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t){if(0===b||f[e].midAngle>m.midAngle)e=d;b++}m.hemisphere=g>Math.PI/2&&g<=3*Math.PI/2?"left":"right";m.indexLabelTextBlock=new ka(k.plotArea.ctx,{fontSize:m.indexLabelFontSize,fontFamily:m.indexLabelFontFamily,fontColor:m.indexLabelFontColor,fontStyle:m.indexLabelFontStyle,fontWeight:m.indexLabelFontWeight,horizontalAlign:"left",backgroundColor:m.indexLabelBackgroundColor,maxWidth:m.indexLabelMaxWidth,maxHeight:m.indexLabelWrap? -5*m.indexLabelFontSize:1.5*m.indexLabelFontSize,text:m.indexLabelText,padding:0,textBaseline:"top"});m.indexLabelTextBlock.measureText()}l=g=0;q=!1;for(d=0;dMath.PI/2-t&&m.midAngle3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t)&&(l<=b/2&&!q?(m.hemisphere="left",l++):(m.hemisphere="right",q=!0))}}function b(a){var b= -k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);for(b=0;bc){var d=0.07*A*Math.cos(f[b].midAngle),g=0.07*A*Math.sin(f[b].midAngle),m=!1;if(s[b].exploded){if(1E-9a.indexLabelTextBlock.y?d-e:c-f}function e(a){for(var b=null,e=1;ec(f[b],f[a])||("right"===f[a].hemisphere?f[b].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y:f[b].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y)))break;else b=null;return b}function g(a,b,d){d=(d||0)+1;if(1E3< -d)return 0;b=b||0;var m=0,h=x.y-1*r,l=x.y+1*r;if(0<=a&&ab&&n.indexLabelTextBlock.yl)return 0;var k=0,q=0,q=k=k=0;0>b?n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2>h&&n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+bl&&(b=n.indexLabelTextBlock.y+ -n.indexLabelTextBlock.height/2+b-l);b=n.indexLabelTextBlock.y+b;h=0;h="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2));q=x.x+A*Math.cos(n.midAngle);k=x.y+A*Math.sin(n.midAngle);k=Math.sqrt(Math.pow(h-q,2)+Math.pow(b-k,2));q=Math.acos(A/r);k=Math.acos((r*r+A*A-k*k)/(2*A*r));b=kc(f[h],f[a])||("right"===f[a].hemisphere?f[h].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y:f[h].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y)))break;else h=null;q=h;k=e(a);l=h=0;0>b?(l="right"===n.hemisphere?q:k,m=b,null!==l&&(q=-b,b=n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2-(f[l].indexLabelTextBlock.y+f[l].indexLabelTextBlock.height/2),b-q+h.toFixed(C)&&(m=b>p?-(b-p):-(q-(l-h)))))):0p?b-p:q-(h-l)))));m&&(d=n.indexLabelTextBlock.y+m,b=0,b="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)),n.midAngle>Math.PI/2-t&&n.midAngleh.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x-15:"right"===n.hemisphere&&("left"===a.hemisphere&&b3*Math.PI/2-t&&n.midAngle<3*Math.PI/2+t&&(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"right"===n.hemisphere&&"left"===h.hemisphere&&ba.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x- -15)),n.indexLabelTextBlock.y=d,n.indexLabelTextBlock.x=b,n.indexLabelAngle=Math.atan2(n.indexLabelTextBlock.y-x.y,n.indexLabelTextBlock.x-x.x))}return m}function m(){var a=k.plotArea.ctx;a.fillStyle="grey";a.strokeStyle="grey";a.font="16px Arial";a.textBaseline="middle";for(var b=a=0,d=0,m=!0,b=0;10>b&&(1>b||0z){for(var E=u=0,H=0;Hu?l.indexLabelText="":l.indexLabelTextBlock.maxWidth=0.85*u,0.3*l.indexLabelTextBlock.maxWidthd&&(d=y)),y=y=0,0d&&(d=y)));var K=function(a, -b,c){for(var e=[],d=0;e.push(f[b]),b!==c;b=(b+1+s.length)%s.length);e.sort(function(a,b){return a.y-b.y});for(b=0;bz){n=t.indexLabelTextBlock.x;var k=t.indexLabelTextBlock.y-t.indexLabelTextBlock.height/ -2,w=t.indexLabelTextBlock.y+t.indexLabelTextBlock.height/2,p=h.indexLabelTextBlock.y-h.indexLabelTextBlock.height/2,u=h.indexLabelTextBlock.x+h.indexLabelTextBlock.width,r=h.indexLabelTextBlock.y+h.indexLabelTextBlock.height/2;n=t.indexLabelTextBlock.x+t.indexLabelTextBlock.widthu+q||k>r+q||wa&&(a=l),m!==a&&(b=m,d+=-z),0===l%Math.max(s.length/10,3)&&(g=!0)):g=!0;g&&(0=a.dataSeriesIndexes.length)){var h= -this.data[a.dataSeriesIndexes[0]],s=h.dataPoints,q=10,n=this.plotArea,f=h.dataPointEOs,p=2,r,v=1.3,t=20/180*Math.PI,C=6,x={x:(n.x2+n.x1)/2,y:(n.y2+n.y1)/2},z=0;a=!1;for(var y=0;ya&&(e=a,d=!0);var g=s[b].color?s[b].color:h._colorSet[b%h._colorSet.length];e>c&&ja(k.plotArea.ctx, -f[b].center,f[b].radius,g,h.type,c,e,h.fillOpacity,f[b].percentInnerRadius);if(d)break}l()},function(){k.disableToolTip=!1;k._animator.animate(0,k.animatedRender?500:0,function(a){b(a);l()})})}}};var ra=function(a,d,b,c){"undefined"===typeof b&&(b=1);0>=Math.round(d.y4-d.y1)||(a.save(),a.globalAlpha=b,a.beginPath(),a.moveTo(Math.round(d.x1),Math.round(d.y1)),a.lineTo(Math.round(d.x2),Math.round(d.y2)),a.lineTo(Math.round(d.x3),Math.round(d.y3)),a.lineTo(Math.round(d.x4),Math.round(d.y4)),"undefined"!== -d.x5&&(a.lineTo(Math.round(d.x5),Math.round(d.y5)),a.lineTo(Math.round(d.x6),Math.round(d.y6))),a.closePath(),a.fillStyle=c?c:d.color,a.fill(),a.globalAplha=1,a.restore())};p.prototype.renderFunnel=function(a){function d(){for(var a=0,b=[],c=0;ck?(k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=0==k?0:a/k,h+=a/k,m=!0):(n=(Math.abs(ba)*b-Math.sqrt(k))/2,k=b-2*n/Math.abs(ba),h+=n,h>d&&(h-=n, -k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=a/k,h+=a/k,m=!0),b=k)),e.push(n);return e}function c(){if(t&&C){for(var a,b,c,e,d,g,l,h,m,n,k,q,s,w,p=[],B=[],x={percent:null,total:null},v=null,y=0;yp[y]&&(p[y]=y!==fa?t.reversed?P[y].x3-P[y].x4:P[y].x2-P[y].x1:P[y].x2-P[y].x1,p[y]/=2));s=b.indexLabelMaxWidth?b.indexLabelMaxWidth:t.options.indexLabelMaxWidth?t.indexLabelMaxWidth:p[y];if(s>p[y]||0>s)s=p[y];B[y]="inside"===t.indexLabelPlacement?P[y].height:!1;x=z.getPercentAndTotal(t,b);if(t.indexLabelFormatter||b.indexLabelFormatter)v={chart:z.options,dataSeries:t,dataPoint:b,total:x.total,percent:x.percent};b=b.indexLabelFormatter?b.indexLabelFormatter(v):b.indexLabel? -z.replaceKeywordsWithValue(b.indexLabel,b,t,y):t.indexLabelFormatter?t.indexLabelFormatter(v):t.indexLabel?z.replaceKeywordsWithValue(t.indexLabel,b,t,y):b.label?b.label:"";0>=n&&(n=0);1E3>s&&1E3-sl?l:t.indexLabelMaxWidth:l,h=J.length-1;0<=h;h--){g=C[J[h].id];c=J[h];e=c.textBlock;b=(a=n(h)b.y&&(d=!0);c=g.indexLabelMaxWidth||l;if(c>l||0>c)c=l;f.push(c)}if(d)for(h=J.length-1;0<=h;h--)a=P[h],J[h].textBlock.maxWidth= -f[f.length-(h+1)],J[h].textBlock.measureText(),J[h].textBlock.x=L-l,c=J[h].textBlock.heightpa+D&&(J[h].textBlock.y=pa+D-J[h].height),J[h].textBlock.ywa+D&&(J[h].textBlock.y=wa+D-J[h].height))}function g(){var a,b,c,e;if("inside"!==t.indexLabelPlacement)for(var d=0;dDa?f(c).x2+1:(a.x2+a.x3)/2+1:(a.x2+a.x3)/2+1:"undefined"!==typeof a.x5?cpa+D&&(J[d].textBlock.y=pa+D-J[d].height),J[d].textBlock.ywa+D&&(J[d].textBlock.y=wa+D-J[d].height)));else for(d=0;d=c?(b=d!=fa?(a.x4+a.x3)/2-e/2:(a.x5+a.x4)/2-e/2,c=d!=fa?(a.y1+a.y3)/2-c/2:(a.y1+a.y4)/2-c/2,J[d].textBlock.x=b, -J[d].textBlock.y=c):J[d].isDirty=!0)}function m(){function a(b,c){var d;if(0>b||b>=J.length)return 0;var e,f=J[b].textBlock;if(0>c){c*=-1;e=q(b);d=l(e,b);if(d>=c)return f.y-=c,c;if(0==b)return 0=c)return f.y+=c,c;if(b==P.length-1)return 0e)&&(l=n(s),!(l>=J.length-1)&&J[s].textBlock.y+J[s].height+ga>J[l].textBlock.y&&(J[s].textBlock.y=J[s].textBlock.y+J[s].height-e>e-J[s].textBlock.y?e+1:e-J[s].height-1))}for(l=P.length-1;0e&&(e=0,J[e].isDirty))break;if(J[l].textBlock.y=f){f=0;h+=J[f].height;break}e=q(f); -if(0>e){f=0;h+=J[f].height;break}}if(f!=l){g=J[f].textBlock.y;a-=g;a=h-a;g=c(a,d,f);break}}}return g}function c(a,b,d){var e=[],f=0,g=0;for(a=Math.abs(a);d<=b;d++)e.push(P[d]);e.sort(function(a,b){return a.height-b.height});for(d=0;d+m.y.toFixed(6))&&(d=g.y+d+ga-m.y,e=a(w,-d),ea?t.reversed?wa-D:pa-D:J[a].textBlock.y+J[a].height+ga)}function k(a,b,c){var d,e,f,l=[],m=D,n=[];-1!==b&&(0<=W.indexOf(b)?(e=W.indexOf(b),W.splice(e,1)):(W.push(b),W=W.sort(function(a,b){return a-b})));if(0===W.length)l= -ia;else{e=D*(1!=W.length||0!=W[0]&&W[0]!=P.length-1?2:1)/h();for(var q=0;qn&&(n*=-1),c.y1+=b-n[d],c.y2+=b-n[d],c.y3+=b-n[d],c.y4+=b-n[d],c.y5&&(c.y5+=b-n[d],c.y6+=b-n[d]),n[d]=b}};a._animator.animate(0,c,function(c){var d=a.plotArea.ctx||a.ctx;ja=!0;d.clearRect(x.x1,x.y1,x.x2-x.x1,x.y2-x.y1);d.fillStyle=a.backgroundColor;d.fillRect(x.x1,x.y1,x.width,x.height);w.changeSection(c,b);var e={};e.dataSeries=t;e.dataPoint=t.reversed?t.dataPoints[C.length-1-b]:t.dataPoints[b];e.index=t.reversed?C.length-1-b:b;a.toolTip.highlightObjects([e]); -for(e=0;ea){b=P[c];break}return b?(a=b.y6?a>b.y6?b.x3+(b.x4-b.x3)/(b.y4-b.y3)*(a-b.y3):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2), -{x1:a,x2:a}):-1}function p(a){for(var b=0;b=a.dataSeriesIndexes.length)){for(var t=this.data[a.dataSeriesIndexes[0]],C=t.dataPoints,x=this.plotArea,D=0.025*x.width,y=0.01*x.width,A=0,F=x.height-2*D,E=Math.min(x.width-2*y,2.8*x.height),H=!1,I=0;IF?N=F:0>=N&&(N=0),G>a?G=a-0.5:0>=G&&(G=0)):"pyramid"===t.type&&(G=N=0,t.reversed=t.reversed?!1:!0);var y=I+a/2,$=I,V=I+a,pa=t.reversed?Z:O,K=y-G/2,ea=y+G/2,Da=t.reversed?O+N:Z- -N,wa=t.reversed?O:Z;a=[];var y=[],P=[],E=[],X=O,fa,ba=(Da-pa)/(K-$),ha=-ba,I="area"===(t.valueRepresents?t.valueRepresents:"height")?b():d();if(-1!==I){if(t.reversed)for(E.push(X),G=I.length-1;0a&&(A=a));for(G=0;G\n');c.document.close();setTimeout(function(){c.focus();c.print();setTimeout(function(){b._canvasJSContainer.removeChild(d)},1E3)},500)};p.prototype.getPercentAndTotal=function(a,d){var b=null,c=null, -e=null;if(0<=a.type.indexOf("stacked"))c=0,b=d.x.getTime?d.x.getTime():d.x,b in a.plotUnit.yTotals&&(c=a.plotUnit.yTotals[b],e=isNaN(d.y)?0:100*(d.y/c));else if("pie"===a.type||"doughnut"===a.type||"funnel"===a.type||"pyramid"===a.type){for(b=c=0;b=m||"undefined"=== -typeof m||0>=v||"undefined"===typeof v)){if("horizontal"===this.orientation){n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:v,maxHeight:this.itemWrap?m:this.lineHeight,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"});n.textBlock.measureText();null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"=== -n.chartType?2*0.1*this.lineHeight:0)));if(!q||q.width+Math.round(n.textBlock.width+r+l+(0===q.width?0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))>g)q={items:[],width:0},h.push(q),this.height+=f,f=0;f=Math.max(f,n.textBlock.height)}else n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:x,maxHeight:!0===this.itemWrap?m:1.5*this.fontSize,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily, -fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"}),n.textBlock.measureText(),null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))),this.height>0,0),this.dataPoints.length):0):(s=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,s=0>0,0),this.dataPoints.length):0));for(;;){g=0a?c.x/a:a/c.x: -Math.abs(c.x-a);qs-e&&s+e>=this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}return d||b.dataPoint.x!==a?d&&null!==b.dataPoint?b:null:b};F.prototype.getDataPointAtXY=function(a,d,b){if(!this.dataPoints||0===this.dataPoints.length||athis.chart.plotArea.x2||dthis.chart.plotArea.y2)return null;b=b||!1;var c=[],e=0,g=0,m=1,l=!1,k=Infinity, -h=0,s=0,q=0;if("none"!==this.chart.plotInfo.axisPlacement)if(q=(this.chart.axisX[0]?this.chart.axisX[0]:this.chart.axisX2[0]).getXValueAt({x:a,y:d}),this.axisX.logarithmic)var n=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),q=1>0,0),this.dataPoints.length):0;else n=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,q=0> -0,0),this.dataPoints.length):0;for(;;){g=0=n.x1&&(a<=n.x2&&d>=n.y1&&d<=n.y2)&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1- -a),Math.abs(n.x2-a),Math.abs(n.y1-d),Math.abs(n.y2-d))}),l=!0);break;case "line":case "stepLine":case "spline":case "area":case "stepArea":case "stackedArea":case "stackedArea100":case "splineArea":case "scatter":var u=na("markerSize",f,this)||4,r=b?20:u,p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0r&&(p=Math.atan2(d-u.y,a-u.x),0>p&&(p+=2*Math.PI),p=Number(((180*(p/Math.PI)%360+360)%360).toFixed(12)),u=Number(((180*(n.startAngle/Math.PI)%360+360)%360).toFixed(12)),r=Number(((180*(n.endAngle/Math.PI)%360+360)%360).toFixed(12)),0===r&&1=r&&0!==f.y&&(r+=360,pu&&pp.y1&&dp.y6?(g=p.x6+(p.x5-p.x6)/(p.y5-p.y6)*(d-p.y6),p=p.x3+(p.x4-p.x3)/(p.y4-p.y3)*(d-p.y3)):(g=p.x1+(p.x6-p.x1)/(p.y6-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)):(g=p.x1+(p.x4-p.x1)/(p.y4-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)),a>g&&a=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y4-n.borderThickness/2&&d<=n.y1+n.borderThickness/ -2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "candlestick":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y2-n.borderThickness/2&&d<=n.y3+n.borderThickness/2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a), -Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "ohlc":if(Math.abs(n.x2-a+n.x1-a)=n.y2&&d<=n.y3||a>=n.x1&&a<=(n.x2+n.x1)/2&&d>=n.y1-n.borderThickness/2&&d<=n.y1+n.borderThickness/2||a>=(n.x1+n.x2)/2&&a<=n.x2&&d>=n.y4-n.borderThickness/2&&d<=n.y4+n.borderThickness/2)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0}if(l||1E3q-e&&q+e>= -this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}a=null;for(d=0;dq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius, -horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle",borderThickness:0}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}f=n;for(b=this.intervalStartPosition;b<=e;b=parseFloat(1E-12>this.interval?this.logarithmic&&this.equidistantInterval?b*Math.pow(this.logarithmBase,this.interval):b+this.interval:(this.logarithmic&&this.equidistantInterval? -b*Math.pow(this.logarithmBase,this.interval):b+this.interval).toFixed(12))){for(;fq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix, -horizontalAlign:"left",backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}}else for(this.intervalStartPosition=this.getLabelStartPoint(new Date(this.viewportMinimum), -this.intervalType,this.interval),e=Ya(new Date(this.viewportMaximum),this.interval,this.intervalType),f=n,b=this.intervalStartPosition;bq[f].endValue;f++);p=a;a=f=q[f].startValue&&a<=q[f].endValue;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:new Date(p),label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:Ca(p,this.valueFormatString,this.chart._cultureInfo), -a=new ka(this.ctx,{x:0,y:0,maxWidth:g,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null, -breaksLabelType:void 0}))}if("bottom"===this._position||"top"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.width*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length-2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.width/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+ -"Duration"]*this.interval,g="undefined"===typeof this.options.labelMaxWidth?0.5*this.chart.width>>0:this.options.labelMaxWidth,this.chart.panEnabled||(m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize);else if("left"===this._position||"right"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.height*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length- -2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.height/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+"Duration"]*this.interval,this.chart.panEnabled||(g="undefined"===typeof this.options.labelMaxWidth?0.3*this.chart.width>>0:this.options.labelMaxWidth),m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize; -for(c=0;cthis.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360)),"bottom"===this._position||"top"===this._position)if(g=0.9*l>>0,n=0,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize= -this.labelFontSize;this.sessionVariables.labelMaxWidth=g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=this.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;bn&&(v=b,n=p.width)}b=0;for(b=this.intervalStartPosition< -this.viewportMinimum?1:0;b>0>2*g&&(this.sessionVariables.labelAngle=-25)):(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle):u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth= -g,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p)):(this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=this.labelWrap);else{if(u(this.options.labelWrap))if(!u(this.options.labelMaxWidth))this.options.labelMaxWidth>0,f=this.labelFontSize,nq&&(q=c-2*g,c>=2*g&&c<2.2*g?(this.sessionVariables.labelMaxWidth=g,u(this.options.labelFontSize)&&12=2.2*g&&c<2.8*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=f):c>=2.8*g&&c<3.2*g?(this.sessionVariables.labelMaxWidth=Math.max(g,n),this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12=3.2*g&&c<3.6*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=this.labelFontSize):c>3.6*g&&c<5*g?(u(this.options.labelFontSize)&&125*g&&(this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelFontSize=f,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=this.labelAngle));else if(v===b&&(0===v&&n+this._labels[v+1].textBlock.measureText().width-2*g>q||v===this._labels.length-1&&n+this._labels[v-1].textBlock.measureText().width-2*g>q||0q&&n+this._labels[v-1].textBlock.measureText().width- -2*g>q))q=0===v?n+this._labels[v+1].textBlock.measureText().width-2*g:n+this._labels[v-1].textBlock.measureText().width-2*g,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p;else if(0===q)for(this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,c=0;c>0>2*g&&(this.sessionVariables.labelAngle=-25))}else(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/ -Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=0!=this.labelAngle?(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)):g,this.sessionVariables.labelMaxHeight=m=this.labelWrap?(h-p*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)):1.5*this.labelFontSize,u(this.options.labelWrap))?u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap= -this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelMaxHeight=c<0.9*l?0.9*l:c,this.sessionVariables.labelWrap=this.labelWrap)):(this.options.labelWrap?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p): -(u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelWrap=this.labelWrap),this.sessionVariables.labelMaxHeight=m)}for(c=0;c>0:this.options.labelMaxWidth,m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize=this.labelFontSize;this.sessionVariables.labelMaxWidth= -g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b>0,l-2*m>n&&(n=l-2*m,l>=2*m&&l<2.4*m?(u(this.options.labelFontSize)&&12=2.4*m&&l<2.8*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelFontSize=this.labelFontSize,this.sessionVariables.labelWrap=!0):l>=2.8*m&&l<3.2*m?(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12< -this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>=3.2*m&&l<3.6*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelFontSize=this.labelFontSize):l>3.6*m&&l<10*m?(u(this.options.labelFontSize)&& -1210*m&&l<50*m&&(u(this.options.labelFontSize)&&12this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,u(this.options.labelMaxWidth)&& -(this.sessionVariables.labelAngle=this.labelAngle))):this.options.labelWrap?(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=g):(this.sessionVariables.labelMaxHeight=m,u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap)}for(c=0;c>0:1.5*this.labelFontSize;if("left"===this._position||"right"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.width>>0:1.5*this.labelFontSize;u(g.labelBackgroundColor)&&(g.labelBackgroundColor="#EEEEEE")}else m="bottom"===this._position||"top"===this._position?0.9*this.chart.width>>0:0.9*this.chart.height>> -0,z=u(g.options.labelWrap)||g.labelWrap?"bottom"===this._position||"top"===this._position?0.8*this.chart.width>>0:0.8*this.chart.height>>0:1.5*this.labelFontSize,u(g.labelBackgroundColor)&&(u(g.startValue)&&0!==g.startValue?g.labelBackgroundColor=r?"transparent":null:g.labelBackgroundColor="#EEEEEE");a=new ka(this.ctx,{x:0,y:0,backgroundColor:g.labelBackgroundColor,borderColor:g.labelBorderColor,borderThickness:g.labelBorderThickness,cornerRadius:g.labelCornerRadius,maxWidth:g.options.labelMaxWidth? -g.options.labelMaxWidth:m,maxHeight:z,angle:this.labelAngle,text:g.labelFormatter?g.labelFormatter({chart:this.chart,axis:this,stripLine:g}):g.label,horizontalAlign:"left",fontSize:"outside"===g.labelPlacement?g.options.labelFontSize?g.labelFontSize:this.labelFontSize:g.labelFontSize,fontFamily:"outside"===g.labelPlacement?g.options.labelFontFamily?g.labelFontFamily:this.labelFontFamily:g.labelFontFamily,fontWeight:"outside"===g.labelPlacement?g.options.labelFontWeight?g.labelFontWeight:this.labelFontWeight: -g.labelFontWeight,fontColor:g.labelFontColor||g.color,fontStyle:"outside"===g.labelPlacement?g.options.labelFontStyle?g.labelFontStyle:this.fontWeight:g.labelFontStyle,textBaseline:"middle"});this._stripLineLabels.push({position:g.value,textBlock:a,effectiveHeight:null,stripLine:g})}};z.prototype.createLabelsAndCalculateWidth=function(){var a=0,d=0;this._labels=[];this._stripLineLabels=[];var b=this.chart.isNavigator?0:5;if("left"===this._position||"right"===this._position){this.createLabels();for(d= -0;d=this.viewportMinimum&&this._stripLineLabels[d].stripLine.value<=this.viewportMaximum)&& -(c=this._stripLineLabels[d].textBlock,e=c.measureText(),g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle)),a=this.viewportMinimum&&this._stripLineLabels[b].stripLine.value<=this.viewportMaximum)&&(d=this._stripLineLabels[b].textBlock,e=d.measureText(),g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)),an[f].viewportMaximum);v++)r[v].endValue=n[f].viewPortMinimum&&(n[f].scaleBreaks.lastBreakIndex=v));for(var z=v=0,t=0,C=0,x=0,D=0,y=0,A,E,F=l=0,H,I,L,r=H=I=L=!1,f=0;fv;){var G=0,R=0,S=0,U=0,W=e=0,K=0,$=0,V=0,X=0,P=0,ba=0;if(b&& -0p.width- -q?p.width-q:g.x2-ba-$);if(a&&0p.width-q?p.width-q:g.x2-ba-$),a[f]._labels&&1k&&(l+=0a[f].labelAngle?A-zk&&(l=E+t/2-k-ba),A-za[f].labelAngle&&0p.width-q?p.width-q:g.x2-ba-$),d[f].lineCoordinates.width=Math.abs(k-m),d[f]._labels&&1v;){V=U=R=S=$=K=W=e=Q=O=G=X=0;if(a&&0p.width-10?p.width-10:g.x2-V-W),b[f].labelAutoFit&&!u(C)&&(0b[f].labelAngle?Math.max(m,C):0===b[f].labelAngle? -Math.max(m,C/2):m),0c[f].chart.width-10?c[f].chart.width-10:g.x2-V-W),c[f]&& -c[f].labelAutoFit&&!u(D)&&(0b[f].chart.height-10?b[f].chart.height-10:g.y2),b[f].lineCoordinates.y1=l-(q[f]+b[f].margin+ -X),b[f].lineCoordinates.y2=l-(q[f]+b[f].margin+X),b[f].bounds={x1:m,y1:l-(q[f]+X+b[f].margin),x2:k,y2:h-(X+b[f].margin),width:k-m,height:q[f]},b[f].title&&(b[f]._titleTextBlock.maxWidth=0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0===b[K].labelAngle?k-U:m);if(c&&0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0=== -b[K].labelAngle?k-V:m);if(c&&0d[g].spacing?0:Math.abs(d[g].spacing/b),this.logarithmic&&(d[g].size=Math.pow(this.logarithmBase,d[g].size))};z.prototype.calculateBreaksInPixels=function(){if(!(this.scaleBreaks&&0>=this.scaleBreaks._appliedBreaks.length)){var a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];a.length&&(this.scaleBreaks.firstBreakIndex=this.scaleBreaks.lastBreakIndex=null);for(var d=0;dthis.conversionParameters.maximum);d++)a[d].endValue< -this.conversionParameters.minimum||(u(this.scaleBreaks.firstBreakIndex)&&(this.scaleBreaks.firstBreakIndex=d),a[d].startValue>=this.conversionParameters.minimum&&(a[d].startPixel=this.convertValueToPixel(a[d].startValue),this.scaleBreaks.lastBreakIndex=d),a[d].endValue<=this.conversionParameters.maximum&&(a[d].endPixel=this.convertValueToPixel(a[d].endValue)))}};z.prototype.renderLabelsTicksAndTitle=function(){var a=this,d=!1,b=0,c=0,e=1,g=0;0!==this.labelAngle&&360!==this.labelAngle&&(e=1.2);if("undefined"=== -typeof this.options.interval){if("bottom"===this._position||"top"===this._position)if(this.logarithmic&&!this.equidistantInterval&&this.labelAutoFit){for(var b=[],e=0!==this.labelAngle&&360!==this.labelAngle?1:1.2,m,l=this.viewportMaximum,k=this.lineCoordinates.width/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||mthis.lineCoordinates.width*e&&this.labelAutoFit&&(d=!0)}if("left"===this._position||"right"===this._position)if(this.logarithmic&& -!this.equidistantInterval&&this.labelAutoFit){for(var b=[],p,l=this.viewportMaximum,k=this.lineCoordinates.height/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||pthis.lineCoordinates.height*e&&this.labelAutoFit&&(d=!0)}}this.logarithmic&&(!this.equidistantInterval&&this.labelAutoFit)&&this._labels.sort(function(a,b){return a.position-b.position});var h=0,q,n;if("bottom"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y+this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? -n.y-(this.tickLength+q.textBlock.fontSize/2):n.y+this.tickLength+q.textBlock.fontSize/2):(n.x="inside"===this.labelPlacement?0>this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x-(0>this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0>this.labelAngle?n.y-this.tickLength-5:n.y-this.tickLength-Math.abs(q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle)+5):n.y+this.tickLength+Math.abs(0>this.labelAngle?q.textBlock.width* -Math.sin(Math.PI/180*this.labelAngle)-5:5)),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save(); -a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y-a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y2-this._titleTextBlock.height-3,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("top"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y-this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? -n.y+this.labelFontSize/2+this.tickLength+5:n.y-(this.tickLength+q.textBlock.height-q.textBlock.fontSize/2)):(n.x="inside"===this.labelPlacement?0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&& -(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y+a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y1+1,this.titleMaxWidth= -this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("left"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<< -0,c),this.ctx.lineTo(n.x-this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle?(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5):(q.textBlock.y="inside"===this.labelPlacement?n.y:n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness; -a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x+a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x1+1,this._titleTextBlock.y=this.lineCoordinates.height/2+this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("right"=== -this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<<0,c),this.ctx.lineTo(n.x+this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle? -(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width-this.tickLength-5:n.x+this.tickLength+5):(q.textBlock.y="inside"===this.labelPlacement?n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0>this.labelAngle?n.y:n.y-(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.cos(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<< -0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x-a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x2-1,this._titleTextBlock.y=this.lineCoordinates.height/2-this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}g=0;if("inside"===this.labelPlacement)this.chart.addEventListener("dataAnimationIterationEnd", -function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)||(a.ctx.save(),a.ctx.beginPath(),q.textBlock.render(!0),a.ctx.restore())},this);else for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||q.textBlock.render(!0)};z.prototype.renderInterlacedColors=function(){var a=this.chart.plotArea.ctx,d,b,c=this.chart.plotArea, -e=0;d=!0;if(("bottom"===this._position||"top"===this._position)&&this.interlacedColor)for(a.fillStyle=this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(Math.min(b.x,d.x),c.y1,Math.abs(b.x-d.x),Math.abs(c.y1-c.y2)),d=!1):d=!0;else if(("left"===this._position||"right"===this._position)&&this.interlacedColor)for(a.fillStyle= -this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(c.x1,Math.min(b.y,d.y),Math.abs(c.x1-c.x2),Math.abs(d.y-b.y)),d=!1):d=!0;a.beginPath()};z.prototype.renderStripLinesOfThicknessType=function(a){if(this.stripLines&&0this.viewportMaximum||u(h.value)||isNaN(this.range))||l.push(h))}for(c=0;cthis.viewportMaximum||isNaN(this.range))){a=this.getPixelCoordinatesOnAxis(b.position);if("outside"===b.stripLine.labelPlacement)if(h&&(this.ctx.strokeStyle= -h.color,"pixel"===h._thicknessType&&(this.ctx.lineWidth=h.thickness)),"bottom"===this._position){var p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0;this.ctx.beginPath();this.ctx.moveTo(p,a.y<<0);this.ctx.lineTo(p,a.y+this.tickLength<<0);this.ctx.stroke();0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y+=this.tickLength+b.textBlock.fontSize/2):(a.x-=0>this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0,a.y+=this.tickLength+Math.abs(0>this.labelAngle?b.textBlock.width*Math.sin(Math.PI/ -180*this.labelAngle)-5:5))}else"top"===this._position?(p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,this.ctx.beginPath(),this.ctx.moveTo(p,a.y<<0),this.ctx.lineTo(p,a.y-this.tickLength<<0),this.ctx.stroke(),0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y-=this.tickLength+b.textBlock.height):(a.x+=(b.textBlock.height-this.tickLength-this.labelFontSize/2)*Math.sin(Math.PI/180*this.labelAngle)-(0this.labelAngle?a.y:a.y-(b.textBlock.height-b.textBlock.fontSize/ -2-5)*Math.cos(Math.PI/180*this.labelAngle),a.x=0this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/ -2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+=b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y1+b.textBlock.width+3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-b.textBlock.width-3:"center"=== -b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y1+3):"top"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+= -b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+b.textBlock.width+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y2-3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y2- -b.textBlock.width-3):"left"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-b.textBlock.height>this.chart.plotArea.y1?u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3:a.y-b.textBlock.heightthis.chart.plotArea.y1? -u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2-3:a.y-b.textBlock.heightthis.viewportMaximum|| -isNaN(this.range))||a[d].render(this.maskCtx);this.maskCtx.restore()}};z.prototype.renderCrosshair=function(a,d){this.crosshair.render(a,d)};z.prototype.renderGrid=function(){if(this.gridThickness&&0this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(),d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.x<<0)+0.5:d.x<<0,a.moveTo(d,b.y1<<0),a.lineTo(d,b.y2<<0),a.stroke());else if("left"===this._position||"right"===this._position)for(var c=0;cthis.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(), -d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.y<<0)+0.5:d.y<<0,a.moveTo(b.x1<<0,d),a.lineTo(b.x2<<0,d),a.stroke());a.restore()}};z.prototype.renderAxisLine=function(){var a=this.chart.ctx,d=r?this.chart._preRenderCtx:a,b=Math.ceil(this.tickThickness/(this.reversed?-2:2)),c=Math.ceil(this.tickThickness/(this.reversed?2:-2)),e,g;d.save();if("bottom"===this._position||"top"===this._position){if(this.lineThickness){this.reversed?(e=this.lineCoordinates.x2,g=this.lineCoordinates.x1): -(e=this.lineCoordinates.x1,g=this.lineCoordinates.x2);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor?this.lineColor:"black";d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));var m=1===this.lineThickness%2?(this.lineCoordinates.y1<<0)+0.5:this.lineCoordinates.y1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+c;else for(var l= -this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(e,m),d.lineTo(this.scaleBreaks._appliedBreaks[l].startPixel+b,m),e=this.scaleBreaks._appliedBreaks[l].endPixel+c;e&&(d.moveTo(e,m),d.lineTo(g,m));d.stroke()}}else if(("left"===this._position||"right"===this._position)&&this.lineThickness){this.reversed?(e=this.lineCoordinates.y1,g=this.lineCoordinates.y2):(e=this.lineCoordinates.y2,g=this.lineCoordinates.y1);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor; -d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));m=1===this.lineThickness%2?(this.lineCoordinates.x1<<0)+0.5:this.lineCoordinates.x1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+b;else for(l=this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(m,e),d.lineTo(m,this.scaleBreaks._appliedBreaks[l].startPixel+c), -e=this.scaleBreaks._appliedBreaks[l].endPixel+b;e&&(d.moveTo(m,e),d.lineTo(m,g));d.stroke()}r&&(a.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx&&this.chart._breaksCanvasCtx.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),d.clearRect(0,0,this.chart.width,this.chart.height));d.restore()};z.prototype.getPixelCoordinatesOnAxis=function(a){var d={};if("bottom"===this._position||"top"===this._position)d.x=this.convertValueToPixel(a), -d.y=this.lineCoordinates.y1;if("left"===this._position||"right"===this._position)d.y=this.convertValueToPixel(a),d.x=this.lineCoordinates.x2;return d};z.prototype.convertPixelToValue=function(a){if("undefined"===typeof a)return null;var d=0,b=0,c,d=!0,e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b="number"===typeof a?a:"left"===this._position||"right"===this._position?a.y:a.x;if(this.logarithmic){a=c=Math.pow(this.logarithmBase,(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit); -if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;be[b].startValue/this.conversionParameters.minimum){c/=e[b].startValue/this.conversionParameters.minimum;if(ce[b].startValue/e[b-1].endValue){c/=e[b].startValue/e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum){if(1e[b].startValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].startValue/this.conversionParameters.minimum*Math.pow(e[b].size,Math.log(e[b].startValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue))*c,c*=Math.pow(e[b].size,Math.log(this.conversionParameters.minimum/e[b].startValue)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size;d=!1}else break;else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size}else break; -d=a*this.viewportMinimum}else{a=c=(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit;if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b=e[b].size?0:c*(e[b].endValue- -e[b].startValue)/e[b].size;break}else a+=e[b].endValue-this.conversionParameters.minimum-e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue),c-=e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue);d=!1}else if(c>e[b].startValue-this.conversionParameters.minimum){c-=e[b].startValue-this.conversionParameters.minimum;if(ce[b].startValue-e[b-1].endValue){c-=e[b].startValue-e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum)if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue- -e[b].startValue)/e[b].size>e[b].startValue){a=0>=e[b].size?0:c*(e[b].endValue-e[b].startValue)/e[b].size;break}else a+=e[b].startValue-this.conversionParameters.minimum+e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),c+=e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),d=!1;else if(c-1*e[b].size){a+=(e[b].endValue- -e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size;d=!1}else break;else if(c-1*e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size}else break;d=this.conversionParameters.minimum+a}return d};z.prototype.convertValueToPixel=function(a){a=this.getApparentDifference(this.conversionParameters.minimum, -a,a);return this.logarithmic?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*Math.log(a/this.conversionParameters.minimum)/this.conversionParameters.lnLogarithmBase+0.5<<0:"axisX"===this.type?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5<<0:this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5};z.prototype.getApparentDifference=function(a, -d,b,c){var e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];if(this.logarithmic){b=u(b)?d/a:b;for(var g=0;ge[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*e[g].startValue*e[g].size:a>=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*a*Math.pow(e[g].size,Math.log(e[g].endValue/a)/Math.log(e[g].endValue/e[g].startValue)):a<=e[g].startValue&&d<=e[g].endValue?b=b/d*e[g].startValue*Math.pow(e[g].size,Math.log(d/e[g].startValue)/Math.log(e[g].endValue/ -e[g].startValue)):!c&&(a>e[g].startValue&&de[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+e[g].startValue+e[g].size:a>e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+a+e[g].size*(e[g].endValue-a)/(e[g].endValue-e[g].startValue):a<=e[g].startValue&&de[g].startValue&&da[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<= -a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*this.viewportMinimum,b=0a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<=a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+this.viewportMinimum, -b=0this.maxWidth?8:6);var a=Math.max(c,Math.floor(this.maxWidth/a)),e,g,m,c=0;!u(this.options.viewportMinimum)&&(!u(this.options.viewportMaximum)&&this.options.viewportMinimum>=this.options.viewportMaximum)&& -(this.viewportMinimum=this.viewportMaximum=null);if(u(this.options.viewportMinimum)&&!u(this.sessionVariables.newViewportMinimum)&&!isNaN(this.sessionVariables.newViewportMinimum))this.viewportMinimum=this.sessionVariables.newViewportMinimum;else if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(u(this.options.viewportMaximum)&&!u(this.sessionVariables.newViewportMaximum)&&!isNaN(this.sessionVariables.newViewportMaximum))this.viewportMaximum=this.sessionVariables.newViewportMaximum; -else if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(c=0;c=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue)&& -(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue)){this.scaleBreaks._appliedBreaks.splice(c,1);break}if("axisX"===this.type){if(this.dataSeries&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g, -null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0));c=this.getApparentDifference(isNaN(this.viewportMinimum)||null===this.viewportMinimum?e:this.viewportMinimum,isNaN(this.viewportMaximum)||null===this.viewportMaximum?g:this.viewportMaximum,null, -!0);if("axisX"===this.type&&b){this.intervalType||(c/1<=a?(this.interval=1,this.intervalType="millisecond"):c/2<=a?(this.interval=2,this.intervalType="millisecond"):c/5<=a?(this.interval=5,this.intervalType="millisecond"):c/10<=a?(this.interval=10,this.intervalType="millisecond"):c/20<=a?(this.interval=20,this.intervalType="millisecond"):c/50<=a?(this.interval=50,this.intervalType="millisecond"):c/100<=a?(this.interval=100,this.intervalType="millisecond"):c/200<=a?(this.interval=200,this.intervalType= -"millisecond"):c/250<=a?(this.interval=250,this.intervalType="millisecond"):c/300<=a?(this.interval=300,this.intervalType="millisecond"):c/400<=a?(this.interval=400,this.intervalType="millisecond"):c/500<=a?(this.interval=500,this.intervalType="millisecond"):c/(1*S.secondDuration)<=a?(this.interval=1,this.intervalType="second"):c/(2*S.secondDuration)<=a?(this.interval=2,this.intervalType="second"):c/(5*S.secondDuration)<=a?(this.interval=5,this.intervalType="second"):c/(10*S.secondDuration)<=a?(this.interval= -10,this.intervalType="second"):c/(15*S.secondDuration)<=a?(this.interval=15,this.intervalType="second"):c/(20*S.secondDuration)<=a?(this.interval=20,this.intervalType="second"):c/(30*S.secondDuration)<=a?(this.interval=30,this.intervalType="second"):c/(1*S.minuteDuration)<=a?(this.interval=1,this.intervalType="minute"):c/(2*S.minuteDuration)<=a?(this.interval=2,this.intervalType="minute"):c/(5*S.minuteDuration)<=a?(this.interval=5,this.intervalType="minute"):c/(10*S.minuteDuration)<=a?(this.interval= -10,this.intervalType="minute"):c/(15*S.minuteDuration)<=a?(this.interval=15,this.intervalType="minute"):c/(20*S.minuteDuration)<=a?(this.interval=20,this.intervalType="minute"):c/(30*S.minuteDuration)<=a?(this.interval=30,this.intervalType="minute"):c/(1*S.hourDuration)<=a?(this.interval=1,this.intervalType="hour"):c/(2*S.hourDuration)<=a?(this.interval=2,this.intervalType="hour"):c/(3*S.hourDuration)<=a?(this.interval=3,this.intervalType="hour"):c/(6*S.hourDuration)<=a?(this.interval=6,this.intervalType= -"hour"):c/(1*S.dayDuration)<=a?(this.interval=1,this.intervalType="day"):c/(2*S.dayDuration)<=a?(this.interval=2,this.intervalType="day"):c/(4*S.dayDuration)<=a?(this.interval=4,this.intervalType="day"):c/(1*S.weekDuration)<=a?(this.interval=1,this.intervalType="week"):c/(2*S.weekDuration)<=a?(this.interval=2,this.intervalType="week"):c/(3*S.weekDuration)<=a?(this.interval=3,this.intervalType="week"):c/(1*S.monthDuration)<=a?(this.interval=1,this.intervalType="month"):c/(2*S.monthDuration)<=a?(this.interval= -2,this.intervalType="month"):c/(3*S.monthDuration)<=a?(this.interval=3,this.intervalType="month"):c/(6*S.monthDuration)<=a?(this.interval=6,this.intervalType="month"):(this.interval=c/(1*S.yearDuration)<=a?1:c/(2*S.yearDuration)<=a?2:c/(4*S.yearDuration)<=a?4:Math.floor(z.getNiceNumber(c/(a-1),!0)/S.yearDuration),this.intervalType="year"));if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=e-m/2;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum= -g+m/2;d?this.autoValueFormatString="MMM DD YYYY HH:mm":"year"===this.intervalType?this.autoValueFormatString="YYYY":"month"===this.intervalType?this.autoValueFormatString="MMM YYYY":"week"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"day"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"hour"===this.intervalType?this.autoValueFormatString="hh:mm TT":"minute"===this.intervalType?this.autoValueFormatString="hh:mm TT":"second"===this.intervalType?this.autoValueFormatString= -"hh:mm:ss TT":"millisecond"===this.intervalType&&(this.autoValueFormatString="fff'ms'");this.valueFormatString||(this.valueFormatString=this.autoValueFormatString)}else{this.intervalType="number";c=z.getNiceNumber(c,!1);this.interval=this.options&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g,null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)):(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0)),Math.abs(this.getApparentDifference(e,g,null,!0)),"axisX"===this.type&&b){this.valueType="dateTime";if(null===this.minimum||isNaN(this.minimum))this.minimum=e-m/2;if(null===this.maximum||isNaN(this.maximum))this.maximum=g+m/2}else this.intervalType=this.valueType="number",null===this.minimum&&(this.minimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval,this.minimum=Math.min(this.minimum, -null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?Infinity:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval,this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?-Infinity:this.sessionVariables.viewportMaximum)),0===this.maximum&&0===this.minimum&&(0===this.options.minimum?this.maximum+=10:0=== -this.options.maximum&&(this.minimum-=10));u(this.sessionVariables.newViewportMinimum)&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));u(this.sessionVariables.newViewportMaximum)&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.range=this.viewportMaximum-this.viewportMinimum;this.intervalStartPosition="axisX"===this.type&&b?this.getLabelStartPoint(new Date(this.viewportMinimum),this.intervalType,this.interval):Math.floor((this.viewportMinimum+0.2*this.interval)/ -this.interval)*this.interval;this.valueFormatString||(this.valueFormatString=z.generateValueFormatString(this.range,2))}};z.prototype.calculateLogarithmicAxisParameters=function(){var a=this.chart.layoutManager.getFreeSpace(),d=Math.log(this.logarithmBase),b;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?500>this.maxWidth?7:Math.max(7,Math.floor(this.maxWidth/100)):Math.max(Math.floor(this.maxWidth/ -50),3),c,e,g,m;m=1;if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(m=0;m=this.scaleBreaks._appliedBreaks[m].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[m].startValue|| -!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue)&&(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue)){this.scaleBreaks._appliedBreaks.splice(m,1);break}"axisX"===this.type? -(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,1===e/c&&(m=Math.pow(this.logarithmBase,"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin, -e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,0>=c&&!isFinite(e)?(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1):0>=c?c=e:isFinite(e)||(e=c),1===c&&1===e?(e*=this.logarithmBase-1/this.logarithmBase,c=1):1===e/c?(m=Math.min(e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),e*=m,c/=m):c>e?(m=Math.min(c/e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase, -0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&1e&&(e=1));m=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)/(isNaN(this.viewportMinimum)||null=== -this.viewportMinimum?c:this.viewportMinimum);var l=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)-(isNaN(this.viewportMinimum)||null===this.viewportMinimum?c:this.viewportMinimum);this.intervalType="number";m=Math.pow(this.logarithmBase,z.getNiceNumber(Math.abs(Math.log(m)/d),!1));this.options&&0this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(c)||isFinite(e)?1===c&&1===e?(e*=this.logarithmBase,c/=this.logarithmBase):1===e/c?(m=Math.pow(this.logarithmBase,this.interval),e*=m,c/=m):c>e?(m= -Math.min(0.01*(c/e),5),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)):(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.minimum||isNaN(this.minimum))&&1e&&(e=1)),this.intervalType="number",null===this.minimum&&(this.minimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval)),this.minimum=Math.min(this.minimum,null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?"undefined"===typeof this.sessionVariables.newViewportMinimum?Infinity:this.sessionVariables.newViewportMinimum:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum= -"axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval)),this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?"undefined"===typeof this.sessionVariables.newViewportMaximum?0:this.sessionVariables.newViewportMaximum:this.sessionVariables.viewportMaximum)),1===this.maximum&&1===this.minimum&&(1===this.options.minimum?this.maximum*=this.logarithmBase-1/this.logarithmBase: -1===this.options.maximum&&(this.minimum/=this.logarithmBase-1/this.logarithmBase));this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum);this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum);this.viewportMinimum>this.viewportMaximum&&(!this.options.viewportMinimum&&!this.options.minimum||this.options.viewportMaximum||this.options.maximum?this.options.viewportMinimum||this.options.minimum||!this.options.viewportMaximum&&!this.options.maximum||(this.viewportMinimum=this.minimum= -(this.options.viewportMaximum||this.options.maximum)/Math.pow(this.logarithmBase,2*Math.ceil(this.interval))):this.viewportMaximum=this.maximum=this.options.viewportMinimum||this.options.minimum);c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval);this.range=this.viewportMaximum/this.viewportMinimum;this.noTicks=a;if(!this.options.interval&&this.rangethis.viewportMaximum||3>a?2:3)){for(d=Math.floor(this.viewportMinimum/ -b+0.5)*b;dthis.interval&&(this.interval=b,c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval))),this.equidistantInterval=!0,this.intervalStartPosition=c;if(!this.valueFormatString&&(this.valueFormatString="#,##0.##",1>this.viewportMinimum)){d=Math.floor(Math.abs(Math.log(this.viewportMinimum)/ -Math.LN10))+2;if(isNaN(d)||!isFinite(d))d=2;if(2a&&(c+=Math.floor(Math.abs(Math.log(a)/Math.LN10)),isNaN(c)||!isFinite(c))&&(c=d);for(var e=0;eb?1>=c?1:5>=c?5:10:Math.max(Math.floor(c),1);return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.getNiceNumber= -function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=d?1.5>c?1:3>c?2:7>c?5:10:1>=c?1:2>=c?2:5>=c?5:10;return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.prototype.getLabelStartPoint=function(){var a=S[this.intervalType+"Duration"]*this.interval,a=new Date(Math.floor(this.viewportMinimum/a)*a);if("millisecond"!==this.intervalType)if("second"===this.intervalType)0=a||"bottom"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(c,l),this.ctx.lineTo(m,l),this.ctx.lineTo(m,e);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(l-h)/a/3;for(var n=0;n=a||"right"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(m,e),this.ctx.lineTo(m,l), -this.ctx.lineTo(c,l);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(m-k)/a/3;for(n=0;nthis.parent.range?2:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range? -1:0):50this.parent.range?2:10>this.parent.range?1:0);this.valueFormatString=z.generateValueFormatString(this.parent.range,h)}var l=null===this.opacity?1:this.opacity,h=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness),p=this.chart.overlaidCanvasCtx,q=p.globalAlpha;p.globalAlpha=l;p.beginPath();p.strokeStyle=this.color;p.lineWidth=h;p.save();this.labelFontSize= -u(this.options.labelFontSize)?this.parent.labelFontSize:this.labelFontSize;if("left"===this.parent._position||"right"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?this.parent.bounds.x2-this.parent.bounds.x1:this.labelMaxWidth,this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?3*this.chart.height:2*this.labelFontSize;else if("top"===this.parent._position||"bottom"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?3*this.chart.width:this.labelMaxWidth, -this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?this.parent.bounds.height:2*this.labelFontSize;0this.chart.bounds.x2?l.x=this.chart.bounds.x2-l.width:l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}}else if("bottom"===this.parent._position||"top"===this.parent._position){n=this.parent.convertPixelToValue({x:a});for(r=0;rthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"=== -this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}m=null;("bottom"===this.parent._position||"top"===this.parent._position)&&(b>=this.parent.convertValueToPixel(this.parent.viewportMinimum)&&c<=this.parent.convertValueToPixel(this.parent.viewportMaximum))&&(0=this.parent.convertValueToPixel(this.parent.viewportMaximum)&& -e<=this.parent.convertValueToPixel(this.parent.viewportMinimum))&&(0this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x1-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}else{if("bottom"===this.parent._position||"top"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)? -ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label,l.x=b-l.measureText().width/2,l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width),l.xthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2),"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2);0(new Date).getTime()-this._lastUpdated||(this._lastUpdated=(new Date).getTime(), -this.chart.resetOverlayedCanvas(),this._updateToolTip(a,d))};$.prototype._updateToolTip=function(a,d,b){b="undefined"===typeof b?!0:b;this.container||this._initialize();this.enabled||this.hide();if(!this.chart.disableToolTip){if("undefined"===typeof a||"undefined"===typeof d){if(isNaN(this._prevX)||isNaN(this._prevY))return;a=this._prevX;d=this._prevY}else this._prevX=a,this._prevY=d;var c=null,e=null,g=[],k=0;if(this.shared&&this.enabled&&"none"!==this.chart.plotInfo.axisPlacement){if("xySwapped"=== -this.chart.plotInfo.axisPlacement){var l=[];if(this.chart.axisX)for(var p=0;ph.dataSeries.axisY.viewportMaximum&&b++;b-h.dataPoint.y.length&&g.push(h)}else"column"===e.type||"bar"===e.type?0>h.dataPoint.y?0>h.dataSeries.axisY.viewportMinimum&&h.dataSeries.axisY.viewportMaximum>=h.dataPoint.y&&g.push(h):h.dataSeries.axisY.viewportMinimum<=h.dataPoint.y&&0<=h.dataSeries.axisY.viewportMaximum&&g.push(h):"bubble"===e.type?(b=this.chart._eventManager.objectMap[e.dataPointIds[h.index]].size/2,h.dataPoint.y>= -h.dataSeries.axisY.viewportMinimum-b&&h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum+b&&g.push(h)):"waterfall"===e.type?(b=0,h.cumulativeSumYStartValueh.dataSeries.axisY.viewportMaximum&&b++,h.cumulativeSumh.dataSeries.axisY.viewportMaximum&&b++,2>b&&-2=h.dataSeries.axisY.viewportMinimum&& -h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum)&&g.push(h);else g.push(h)}}if(0a&&(a+=this.container.clientWidth+20);a+this.container.clientWidth> -Math.max(this.chart.container.clientWidth,this.chart.width)&&(a=Math.max(0,Math.max(this.chart.container.clientWidth,this.chart.width)-this.container.clientWidth));d=1!==g.length||this.shared||"line"!==g[0].dataSeries.type&&"stepLine"!==g[0].dataSeries.type&&"spline"!==g[0].dataSeries.type&&"area"!==g[0].dataSeries.type&&"stepArea"!==g[0].dataSeries.type&&"splineArea"!==g[0].dataSeries.type?"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"=== -g[0].dataSeries.type?g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x):d:g[0].dataSeries.axisY.convertValueToPixel(g[0].dataPoint.y);d=-d+10;0":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content? -this.content:"{name}:  {y}",p=b.axisXIndex):"bubble"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y},   {z}"): -"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y[0]}, {y[1]}"):"candlestick"=== -b.type||"ohlc"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Open:   {y[0]}
High:    {y[1]}
Low:   {y[2]}
Close:   {y[3]}"):"boxAndWhisker"=== -b.type&&(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"), -null===d&&(d=""),!0===this.reversed?(d=this.chart.replaceKeywordsWithValue(g,c,b,e)+d,l"+d)):(d+=this.chart.replaceKeywordsWithValue(g,c,b,e),l")));null!==d&&(d=h+d)}else{b=a[0].dataSeries;c=a[0].dataPoint;e=a[0].index;if(null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent)return null;"line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"===b.type||"splineArea"===b.type||"column"=== -b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y}":"bubble"===b.type?g=c.toolTipContent? -c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y},   {z}":"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.name?"{name}:  ":c.label?"{label}:  ":"")+"{y}":"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+" :  {y[0]},  {y[1]}": -"candlestick"===b.type||"ohlc"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Open:   {y[0]}
High:    {y[1]}
Low:     {y[2]}
Close:   {y[3]}":"boxAndWhisker"===b.type&&(g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent: -this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"); -null===d&&(d="");d+=this.chart.replaceKeywordsWithValue(g,c,b,e)}return d};$.prototype.enableAnimation=function(){if(!this.container.style.WebkitTransition){var a=this.getContainerTransition(this.containerTransitionDuration);this.container.style.WebkitTransition=a;this.container.style.MsTransition=a;this.container.style.transition=a;this.container.style.MozTransition=this.mozContainerTransition}};$.prototype.disableAnimation=function(){this.container.style.WebkitTransition&&(this.container.style.WebkitTransition= -"",this.container.style.MozTransition="",this.container.style.MsTransition="",this.container.style.transition="")};$.prototype.hide=function(a){this.container&&(this.container.style.display="none",this.currentSeriesIndex=-1,this._prevY=this._prevX=NaN,("undefined"===typeof a||a)&&this.chart.resetOverlayedCanvas())};$.prototype.show=function(a,d,b){this._updateToolTip(a,d,"undefined"===typeof b?!1:b)};$.prototype.fixMozTransitionDelay=function(a,d){if(20c&&a.push(d),d.animationCallback(c),1<=c&&d.onComplete)d.onComplete();this.animations=a;0g;g++)for(var e=0;3>e;e++){for(var f=0,d=0;3>d;d++)f+=a[g][d]*b[d][e];c[g][e]=f}return c}function P(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX= -a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha;b.font=a.font;b.textAlign=a.textAlign;b.textBaseline=a.textBaseline;b.arcScaleX_=a.arcScaleX_;b.arcScaleY_=a.arcScaleY_;b.lineScale_=a.lineScale_}function Q(a){var b=a.indexOf("(",3),c=a.indexOf(")",b+1),b=a.substring(b+1,c).split(",");if(4!=b.length||"a"!=a.charAt(3))b[3]=1;return b}function E(a,b,c){return Math.min(c,Math.max(b,a))}function F(a,b,c){0>c&&c++;16*c?a+6*(b-a)*c: -1>2*c?b:2>3*c?a+6*(b-a)*(2/3-c):a}function G(a){if(a in H)return H[a];var b,c=1;a=String(a);if("#"==a.charAt(0))b=a;else if(/^rgb/.test(a)){c=Q(a);b="#";for(var g,e=0;3>e;e++)g=-1!=c[e].indexOf("%")?Math.floor(255*(parseFloat(c[e])/100)):+c[e],b+=v[E(g,0,255)];c=+c[3]}else if(/^hsl/.test(a)){e=c=Q(a);b=parseFloat(e[0])/360%360;0>b&&b++;g=E(parseFloat(e[1])/100,0,1);e=E(parseFloat(e[2])/100,0,1);if(0==g)g=e=b=e;else{var f=0.5>e?e*(1+g):e+g-e*g,d=2*e-f;g=F(d,f,b+1/3);e=F(d,f,b);b=F(d,f,b-1/3)}b="#"+ -v[Math.floor(255*g)]+v[Math.floor(255*e)]+v[Math.floor(255*b)];c=c[3]}else b=Z[a]||a;return H[a]={color:b,alpha:c}}function C(a){this.m_=D();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=1*q;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=a;var b="width:"+a.clientWidth+"px;height:"+a.clientHeight+"px;overflow:hidden;position:absolute", -c=a.ownerDocument.createElement("div");c.style.cssText=b;a.appendChild(c);b=c.cloneNode(!1);b.style.backgroundColor="red";b.style.filter="alpha(opacity=0)";a.appendChild(b);this.element_=c;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}function R(a,b,c,g){a.currentPath_.push({type:"bezierCurveTo",cp1x:b.x,cp1y:b.y,cp2x:c.x,cp2y:c.y,x:g.x,y:g.y});a.currentX_=g.x;a.currentY_=g.y}function S(a,b){var c=G(a.strokeStyle),g=c.color,c=c.alpha*a.globalAlpha,e=a.lineScale_*a.lineWidth;1>e&&(c*=e);b.push("')}function T(a,b,c,g){var e=a.fillStyle,f=a.arcScaleX_,d=a.arcScaleY_,k=g.x-c.x,n=g.y-c.y;if(e instanceof w){var h=0,l=g=0,u=0,m=1;if("gradient"==e.type_){h=e.x1_/f;c=e.y1_/d;var p=s(a,e.x0_/f,e.y0_/d),h=s(a,h,c),h=180*Math.atan2(h.x-p.x,h.y-p.y)/Math.PI;0>h&&(h+=360);1E-6>h&&(h=0)}else p=s(a,e.x0_,e.y0_),g=(p.x-c.x)/k,l=(p.y-c.y)/n,k/=f*q, -n/=d*q,m=x.max(k,n),u=2*e.r0_/m,m=2*e.r1_/m-u;f=e.colors_;f.sort(function(a,b){return a.offset-b.offset});d=f.length;p=f[0].color;c=f[d-1].color;k=f[0].alpha*a.globalAlpha;a=f[d-1].alpha*a.globalAlpha;for(var n=[],r=0;r')}else e instanceof -I?k&&n&&b.push("'):(e=G(a.fillStyle),b.push(''))}function s(a,b,c){a=a.m_;return{x:q*(b*a[0][0]+c*a[1][0]+a[2][0])-r,y:q*(b*a[0][1]+c*a[1][1]+a[2][1])-r}}function z(a,b,c){isFinite(b[0][0])&&(isFinite(b[0][1])&&isFinite(b[1][0])&&isFinite(b[1][1])&&isFinite(b[2][0])&&isFinite(b[2][1]))&&(a.m_=b,c&&(a.lineScale_=aa(ba(b[0][0]*b[1][1]-b[0][1]* -b[1][0]))))}function w(a){this.type_=a;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}function I(a,b){if(!a||1!=a.nodeType||"IMG"!=a.tagName)throw new A("TYPE_MISMATCH_ERR");if("complete"!=a.readyState)throw new A("INVALID_STATE_ERR");switch(b){case "repeat":case null:case "":this.repetition_="repeat";break;case "repeat-x":case "repeat-y":case "no-repeat":this.repetition_=b;break;default:throw new A("SYNTAX_ERR");}this.src_=a.src;this.width_=a.width;this.height_=a.height} -function A(a){this.code=this[a];this.message=a+": DOM Exception "+this.code}var x=Math,k=x.round,J=x.sin,K=x.cos,ba=x.abs,aa=x.sqrt,q=10,r=q/2;navigator.userAgent.match(/MSIE ([\d.]+)?/);var M=Array.prototype.slice;O(document);var U={init:function(a){a=a||document;a.createElement("canvas");a.attachEvent("onreadystatechange",W(this.init_,this,a))},init_:function(a){a=a.getElementsByTagName("canvas");for(var b=0;bd;d++)for(var B=0;16>B;B++)v[16*d+B]=d.toString(16)+B.toString(16);var Z={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC", -bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000", -darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082", -ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA", -mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5", -peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"}, -H={},L={},$={butt:"flat",round:"round"},d=C.prototype;d.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null);this.element_.innerHTML=""};d.beginPath=function(){this.currentPath_=[]};d.moveTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.lineTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.bezierCurveTo= -function(a,b,c,g,e,f){e=s(this,e,f);a=s(this,a,b);c=s(this,c,g);R(this,a,c,e)};d.quadraticCurveTo=function(a,b,c,g){a=s(this,a,b);c=s(this,c,g);g={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)};R(this,g,{x:g.x+(c.x-this.currentX_)/3,y:g.y+(c.y-this.currentY_)/3},c)};d.arc=function(a,b,c,g,e,f){c*=q;var d=f?"at":"wa",k=a+K(g)*c-r,n=b+J(g)*c-r;g=a+K(e)*c-r;e=b+J(e)*c-r;k!=g||f||(k+=0.125);a=s(this,a,b);k=s(this,k,n);g=s(this,g,e);this.currentPath_.push({type:d, -x:a.x,y:a.y,radius:c,xStart:k.x,yStart:k.y,xEnd:g.x,yEnd:g.y})};d.rect=function(a,b,c,g){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath()};d.strokeRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath();this.stroke();this.currentPath_=e};d.fillRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+ -c,b+g);this.lineTo(a,b+g);this.closePath();this.fill();this.currentPath_=e};d.createLinearGradient=function(a,b,c,g){var e=new w("gradient");e.x0_=a;e.y0_=b;e.x1_=c;e.y1_=g;return e};d.createRadialGradient=function(a,b,c,g,e,f){var d=new w("gradientradial");d.x0_=a;d.y0_=b;d.r0_=c;d.x1_=g;d.y1_=e;d.r1_=f;return d};d.drawImage=function(a,b){var c,g,e,d,r,y,n,h;e=a.runtimeStyle.width;d=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var l=a.width,u=a.height;a.runtimeStyle.width= -e;a.runtimeStyle.height=d;if(3==arguments.length)c=arguments[1],g=arguments[2],r=y=0,n=e=l,h=d=u;else if(5==arguments.length)c=arguments[1],g=arguments[2],e=arguments[3],d=arguments[4],r=y=0,n=l,h=u;else if(9==arguments.length)r=arguments[1],y=arguments[2],n=arguments[3],h=arguments[4],c=arguments[5],g=arguments[6],e=arguments[7],d=arguments[8];else throw Error("Invalid number of arguments");var m=s(this,c,g),p=[];p.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))};d.stroke=function(a){var b=[];b.push("d.x)d.x=f.x;if(null==c.y||f.yd.y)d.y=f.y}}b.push(' ">');a?T(this,b,c,d):S(this,b);b.push("");this.element_.insertAdjacentHTML("beforeEnd",b.join(""))};d.fill=function(){this.stroke(!0)};d.closePath=function(){this.currentPath_.push({type:"close"})};d.save=function(){var a= -{};P(this,a);this.aStack_.push(a);this.mStack_.push(this.m_);this.m_=t(D(),this.m_)};d.restore=function(){this.aStack_.length&&(P(this.aStack_.pop(),this),this.m_=this.mStack_.pop())};d.translate=function(a,b){z(this,t([[1,0,0],[0,1,0],[a,b,1]],this.m_),!1)};d.rotate=function(a){var b=K(a);a=J(a);z(this,t([[b,a,0],[-a,b,0],[0,0,1]],this.m_),!1)};d.scale=function(a,b){this.arcScaleX_*=a;this.arcScaleY_*=b;z(this,t([[a,0,0],[0,b,0],[0,0,1]],this.m_),!0)};d.transform=function(a,b,c,d,e,f){z(this,t([[a, -b,0],[c,d,0],[e,f,1]],this.m_),!0)};d.setTransform=function(a,b,c,d,e,f){z(this,[[a,b,0],[c,d,0],[e,f,1]],!0)};d.drawText_=function(a,b,c,d,e){var f=this.m_;d=0;var r=1E3,t=0,n=[],h;h=this.font;if(L[h])h=L[h];else{var l=document.createElement("div").style;try{l.font=h}catch(u){}h=L[h]={style:l.fontStyle||"normal",variant:l.fontVariant||"normal",weight:l.fontWeight||"normal",size:l.fontSize||10,family:l.fontFamily||"sans-serif"}}var l=h,m=this.element_;h={};for(var p in l)h[p]=l[p];p=parseFloat(m.currentStyle.fontSize); -m=parseFloat(l.size);"number"==typeof l.size?h.size=l.size:-1!=l.size.indexOf("px")?h.size=m:-1!=l.size.indexOf("em")?h.size=p*m:-1!=l.size.indexOf("%")?h.size=p/100*m:-1!=l.size.indexOf("pt")?h.size=m/0.75:h.size=p;h.size*=0.981;p=h.style+" "+h.variant+" "+h.weight+" "+h.size+"px "+h.family;m=this.element_.currentStyle;l=this.textAlign.toLowerCase();switch(l){case "left":case "center":case "right":break;case "end":l="ltr"==m.direction?"right":"left";break;case "start":l="rtl"==m.direction?"right": -"left";break;default:l="left"}switch(this.textBaseline){case "hanging":case "top":t=h.size/1.75;break;case "middle":break;default:case null:case "alphabetic":case "ideographic":case "bottom":t=-h.size/2.25}switch(l){case "right":d=1E3;r=0.05;break;case "center":d=r=500}b=s(this,b+0,c+t);n.push('');e?S(this,n):T(this,n,{x:-d,y:0}, -{x:r,y:h.size});e=f[0][0].toFixed(3)+","+f[1][0].toFixed(3)+","+f[0][1].toFixed(3)+","+f[1][1].toFixed(3)+",0,0";b=k(b.x/q)+","+k(b.y/q);n.push('','','');this.element_.insertAdjacentHTML("beforeEnd",n.join(""))};d.fillText=function(a,b,c,d){this.drawText_(a,b,c,d,!1)};d.strokeText=function(a, -b,c,d){this.drawText_(a,b,c,d,!0)};d.measureText=function(a){this.textMeasureEl_||(this.element_.insertAdjacentHTML("beforeEnd",''),this.textMeasureEl_=this.element_.lastChild);var b=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(b.createTextNode(a));return{width:this.textMeasureEl_.offsetWidth}};d.clip=function(){}; -d.arcTo=function(){};d.createPattern=function(a,b){return new I(a,b)};w.prototype.addColorStop=function(a,b){b=G(b);this.colors_.push({offset:a,color:b.color,alpha:b.alpha})};d=A.prototype=Error();d.INDEX_SIZE_ERR=1;d.DOMSTRING_SIZE_ERR=2;d.HIERARCHY_REQUEST_ERR=3;d.WRONG_DOCUMENT_ERR=4;d.INVALID_CHARACTER_ERR=5;d.NO_DATA_ALLOWED_ERR=6;d.NO_MODIFICATION_ALLOWED_ERR=7;d.NOT_FOUND_ERR=8;d.NOT_SUPPORTED_ERR=9;d.INUSE_ATTRIBUTE_ERR=10;d.INVALID_STATE_ERR=11;d.SYNTAX_ERR=12;d.INVALID_MODIFICATION_ERR= -13;d.NAMESPACE_ERR=14;d.INVALID_ACCESS_ERR=15;d.VALIDATION_ERR=16;d.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=U;CanvasRenderingContext2D=C;CanvasGradient=w;CanvasPattern=I;DOMException=A}(); -/*eslint-enable*/ -/*jshint ignore:end*/ \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js b/SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js deleted file mode 100644 index 69c7951e..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/canvasjs.react.js +++ /dev/null @@ -1,48 +0,0 @@ -var React = require('react'); -var CanvasJS = require('./canvasjs.min'); -CanvasJS = CanvasJS.Chart ? CanvasJS : window.CanvasJS; - -class CanvasJSChart extends React.Component { - static _cjsContainerId = 0 - constructor(props) { - super(props); - this.options = props.options ? props.options : {}; - this.containerProps = props.containerProps ? props.containerProps : {width: "100%", position: "relative"}; - this.containerProps.height = props.containerProps && props.containerProps.height ? props.containerProps.height : this.options.height ? this.options.height + "px" : "400px"; - this.chartContainerId = "canvasjs-react-chart-container-" + CanvasJSChart._cjsContainerId++; - } - componentDidMount() { - //Create Chart and Render - this.chart = new CanvasJS.Chart(this.chartContainerId, this.options); - this.chart.render(); - - if(this.props.onRef) - this.props.onRef(this.chart); - } - shouldComponentUpdate(nextProps, nextState){ - //Check if Chart-options has changed and determine if component has to be updated - return !(nextProps.options === this.options); - } - componentDidUpdate() { - //Update Chart Options & Render - this.chart.options = this.props.options; - this.chart.render(); - } - componentWillUnmount() { - //Destroy chart and remove reference - this.chart.destroy(); - if(this.props.onRef) - this.props.onRef(undefined); - } - render() { - //return React.createElement('div', { id: this.chartContainerId, style: this.containerProps }); - return
- } -} - -var CanvasJSReact = { - CanvasJSChart: CanvasJSChart, - CanvasJS: CanvasJS -}; - -export default CanvasJSReact; \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html deleted file mode 100644 index ef650afe..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/animated-chart.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html deleted file mode 100644 index 57e08a55..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-from-json-data.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html deleted file mode 100644 index 3cb8789c..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-axis-scale-breaks.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html deleted file mode 100644 index 34e46259..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-crosshair.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html deleted file mode 100644 index 4f6e15c6..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-custom-legend-chart.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html deleted file mode 100644 index 50b7d737..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-image-overlay.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - -
- - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html deleted file mode 100644 index cd5dd33e..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-index-data-label.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html deleted file mode 100644 index 0b69ea91..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-inverted-reversed-axis.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html deleted file mode 100644 index 895c4e28..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-logarithmic-axis.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html deleted file mode 100644 index 4e292db0..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-secondary-axis.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html deleted file mode 100644 index 79a3d417..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/chart-with-zoom-pan.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html deleted file mode 100644 index a42de04d..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/dynamic-chart.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html deleted file mode 100644 index 17505925..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/interactive-draggable-chart.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html deleted file mode 100644 index f156e2f8..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/multi-series-chart.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html deleted file mode 100644 index 2b0a5ed9..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/null-data-chart.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html b/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html deleted file mode 100644 index 7be550ab..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/01-overview/performance-demo.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html deleted file mode 100644 index b5b8e010..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dashed-line-chart.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html deleted file mode 100644 index 9bfb56e5..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/dynamic-spline-chart.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html deleted file mode 100644 index 9a6a355b..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-axis-scale-breaks.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html deleted file mode 100644 index 8b620e23..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-data-markers.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html deleted file mode 100644 index 4a3430ac..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-logarithmic-axis.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html deleted file mode 100644 index e4626cc0..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-multiple-axis.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html deleted file mode 100644 index 24a15c69..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart-with-zoom-pan.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - -
-
- - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html deleted file mode 100644 index d21bd730..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/line-chart.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html deleted file mode 100644 index c25f9ae8..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-line-chart.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html deleted file mode 100644 index 7c4d43d0..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-spline-chart.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html deleted file mode 100644 index d6d67a13..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/multi-series-step-line-chart.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html deleted file mode 100644 index 34c7c5bf..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-legends.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html deleted file mode 100644 index 3cdb8259..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart-with-secondary-axis.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html deleted file mode 100644 index 7c1afce1..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/spline-chart.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html deleted file mode 100644 index dc1a4b7a..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/02-line-spline-step-line-charts/step-line-chart.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html deleted file mode 100644 index f721ee43..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/area-chart.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html deleted file mode 100644 index 5e0ce683..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-area-chart.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html deleted file mode 100644 index 1bd75401..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-range-area-chart.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html deleted file mode 100644 index 54e2bece..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/multi-series-spline-area-chart.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html deleted file mode 100644 index e5408a62..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-area-chart.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html deleted file mode 100644 index 280a052a..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/range-spline-area-chart.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - -
- - - diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html deleted file mode 100644 index 450b4a57..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/spline-area-chart.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html deleted file mode 100644 index 76483f3a..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart-with-date-time-axis.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - -
-
- - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html deleted file mode 100644 index 7af19276..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-100-chart.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html deleted file mode 100644 index 90e29ed7..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/stacked-area-chart.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html deleted file mode 100644 index 7fb51f0a..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/03-stacked-spline-range-area-charts/step-area-chart.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html deleted file mode 100644 index 5e7f2a0b..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart-with-axis-scale-break.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html deleted file mode 100644 index d12b9cf5..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/bar-chart.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html deleted file mode 100644 index 982c84d7..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart-with-multiple-axis.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html deleted file mode 100644 index db126063..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/column-chart.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html deleted file mode 100644 index 69e6bb35..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-bar-chart.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html deleted file mode 100644 index a90e357d..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-range-column-chart.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html deleted file mode 100644 index 3e473fbf..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/multi-series-waterfall-chart.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html deleted file mode 100644 index 4a8b95f7..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-bar-chart.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html deleted file mode 100644 index 2482015d..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/range-column-chart.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html deleted file mode 100644 index a0fe8f0f..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-100-chart.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html deleted file mode 100644 index e53506c7..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-bar-chart.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html deleted file mode 100644 index 39e9e1b9..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-100-chart.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html deleted file mode 100644 index f377f681..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/stacked-column-chart.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html deleted file mode 100644 index bed3a0ab..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart-with-custom-color.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html deleted file mode 100644 index cf00ff2b..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/04-column-stacked-range-waterfall-charts/waterfall-chart.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html deleted file mode 100644 index 7ad45521..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-Chart.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html deleted file mode 100644 index 7e9b4297..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/doughnut-chart-with-custom-inner-radius.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html deleted file mode 100644 index b5d9fb7b..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart-with-custom-neck.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html deleted file mode 100644 index 8aa524e4..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/funnel-chart.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html deleted file mode 100644 index 3b475ef7..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/inverted-reversed-funnel-chart.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - -
-
- - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html deleted file mode 100644 index 770bc9dc..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-custom-radius.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - -
- -
- - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html deleted file mode 100644 index e1bd01bb..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart-with-legends.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html deleted file mode 100644 index 7dd8a3e7..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pie-chart.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html deleted file mode 100644 index c84b2a9a..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-where-area-represents-value.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html deleted file mode 100644 index e39048c9..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart-with-index-label-placed-Inside.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html deleted file mode 100644 index b9053b27..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/05-pie-doughnut-funnel-pyramid-charts/pyramid-chart.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html deleted file mode 100644 index 72db3b31..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/candlestick-line-chart.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html deleted file mode 100644 index 35871f64..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/multi-series-candlestick-chart.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html deleted file mode 100644 index 3cca87c6..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-chart-from-json-data.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html deleted file mode 100644 index ee555661..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/06-candlestick-ohlc-charts/ohlc-stock-chart.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html deleted file mode 100644 index 580047d0..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-data-marker.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html deleted file mode 100644 index 2670b874..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart-with-zoom-pan.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html deleted file mode 100644 index a0980da9..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/bubble-chart.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - -
- - - diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html deleted file mode 100644 index 7a3212ee..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/multi-series-scatter-point-chart.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html deleted file mode 100644 index eb0a7abd..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart-with-custom-marker.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html deleted file mode 100644 index 39a28571..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/07-scatter-bubble-charts/scatter-point-chart.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html deleted file mode 100644 index c38a46af..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-custom-color.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html deleted file mode 100644 index c7a16883..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart-with-outliers.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html deleted file mode 100644 index 327b5f6e..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/08-box-and-whisker-charts/box-and-whisker-chart.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html deleted file mode 100644 index 1d9c8738..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/column-line-area-chart.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html deleted file mode 100644 index 01b9a6aa..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-bar-chart.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html deleted file mode 100644 index ddb9026b..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-chart.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html deleted file mode 100644 index b6f1cc72..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/error-line-chart.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html deleted file mode 100644 index 24674cea..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/ohlc-line-chart.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html deleted file mode 100644 index fd35f556..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart-with-index-data-label.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html deleted file mode 100644 index 393d6af1..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/pareto-chart.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html deleted file mode 100644 index be32272f..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/09-combination-charts/range-area-line-chart.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html deleted file mode 100644 index 392bb3c1..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-column-chart.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html deleted file mode 100644 index 988c2219..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-line-chart.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html deleted file mode 100644 index 2dbd00d6..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/10-dynamic-charts/dynamic-multi-series-chart.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - -
- - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html deleted file mode 100644 index d6d42070..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-charts.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html deleted file mode 100644 index c139f406..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-line-chart-with-zoom-pan.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html deleted file mode 100644 index 31523b13..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-resizable-chart.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - -
-
-
- - - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html deleted file mode 100644 index b35ebf4b..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-area-chart-in-tab.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - -
- -
-
-
-
-
-
-
- - - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html b/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html deleted file mode 100644 index a3e82d02..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/examples/11-integration/jquery-spline-chart-with-image-export.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - -
- - - - \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/instruction.txt b/SRIP/Libraries/canvasjs-2.3.1/instruction.txt deleted file mode 100644 index 93eb448f..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/instruction.txt +++ /dev/null @@ -1,4 +0,0 @@ -For standalone version include canvasjs.min.js -For jQuery version include jquery.canvasjs.min.js - -** DO NOT include both the files ** \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js b/SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js deleted file mode 100644 index 8785b495..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/jquery.canvasjs.min.js +++ /dev/null @@ -1,922 +0,0 @@ -/* - CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ - Copyright 2018 fenopix - - --------------------- License Information -------------------- - CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. - https://canvasjs.com/license/ - -*/ -/*eslint-disable*/ -/*jshint ignore:start*/ -(function(){function qa(k,p){k.prototype=eb(p.prototype);k.prototype.constructor=k;k.base=p.prototype}function eb(k){function p(){}p.prototype=k;return new p}function Ya(k,p,D){"millisecond"===D?k.setMilliseconds(k.getMilliseconds()+1*p):"second"===D?k.setSeconds(k.getSeconds()+1*p):"minute"===D?k.setMinutes(k.getMinutes()+1*p):"hour"===D?k.setHours(k.getHours()+1*p):"day"===D?k.setDate(k.getDate()+1*p):"week"===D?k.setDate(k.getDate()+7*p):"month"===D?k.setMonth(k.getMonth()+1*p):"year"===D&&k.setFullYear(k.getFullYear()+ -1*p);return k}function $(k,p){var D=!1;0>k&&(D=!0,k*=-1);k=""+k;for(p=p?p:1;k.length
Please right click on the image and save it to your device
"), -p.document.close()}}}function N(k){var p=((k&16711680)>>16).toString(16),D=((k&65280)>>8).toString(16);k=((k&255)>>0).toString(16);p=2>p.length?"0"+p:p;D=2>D.length?"0"+D:D;k=2>k.length?"0"+k:k;return"#"+p+D+k}function fb(k,p){var D=this.length>>>0,r=Number(p)||0,r=0>r?Math.ceil(r):Math.floor(r);for(0>r&&(r+=D);rD;D++)if(k[D]!==k[D+4]|k[D]!==k[D+8]|k[D]!==k[D+12]){p=!1;break}return p?k[0]<<16|k[1]<<8|k[2]:0}function na(k,p,D){return k in p?p[k]:D[k]}function Oa(k,p,D){if(r&&bb){var u=k.getContext("2d");Pa=u.webkitBackingStorePixelRatio|| -u.mozBackingStorePixelRatio||u.msBackingStorePixelRatio||u.oBackingStorePixelRatio||u.backingStorePixelRatio||1;W=Ua/Pa;k.width=p*W;k.height=D*W;Ua!==Pa&&(k.style.width=p+"px",k.style.height=D+"px",u.scale(W,W))}else k.width=p,k.height=D}function hb(k){if(!ib){var p=!1,D=!1;"undefined"===typeof ra.Chart.creditHref?(k.creditHref=ja("iuuqr;..b`ow`rkr/bnl."),k.creditText=ja("B`ow`rKR/bnl")):(p=k.updateOption("creditText"),D=k.updateOption("creditHref"));if(k.creditHref&&k.creditText){k._creditLink|| -(k._creditLink=document.createElement("a"),k._creditLink.setAttribute("class","canvasjs-chart-credit"),k._creditLink.setAttribute("title","JavaScript Charts"),k._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:2px;top:"+(k.height-14)+"px;color:dimgrey;text-decoration:none;font-size:11px;font-family: Calibri, Lucida Grande, Lucida Sans Unicode, Arial, sans-serif"),k._creditLink.setAttribute("tabIndex",-1),k._creditLink.setAttribute("target","_blank"));if(0===k.renderCount|| -p||D)k._creditLink.setAttribute("href",k.creditHref),k._creditLink.innerHTML=k.creditText;k._creditLink&&k.creditHref&&k.creditText?(k._creditLink.parentElement||k._canvasJSContainer.appendChild(k._creditLink),k._creditLink.style.top=k.height-14+"px"):k._creditLink.parentElement&&k._canvasJSContainer.removeChild(k._creditLink)}}}function ta(k,p){Ja&&(this.canvasCount|=0,window.console.log(++this.canvasCount));var D=document.createElement("canvas");D.setAttribute("class","canvasjs-chart-canvas");Oa(D, -k,p);r||"undefined"===typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(D);return D}function sa(k,p,D){for(var r in D)p.style[r]=D[r]}function ua(k,p,D){p.getAttribute("state")||(p.style.backgroundColor=k.toolbar.backgroundColor,p.style.color=k.toolbar.fontColor,p.style.border="none",sa(k,p,{WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",userSelect:"none"}));p.getAttribute("state")!==D&&(p.setAttribute("state",D),p.setAttribute("type","button"),sa(k,p,{padding:"5px 12px", -cursor:"pointer","float":"left",width:"40px",height:"25px",outline:"0px",verticalAlign:"baseline",lineHeight:"0"}),p.setAttribute("title",k._cultureInfo[D+"Text"]),p.innerHTML=""+k._cultureInfo[D+"Text"]+"")}function Qa(){for(var k=null,p=0;pa?"a":"p";case "tt":return 12>a?"am":"pm";case "T":return 12>a?"A": -"P";case "TT":return 12>a?"AM":"PM";case "K":return S?"UTC":(String(z).match(H)||[""]).pop().replace(F,"");case "z":return(0k?!0:!1;u&&(k*=-1);var v=r?r.decimalSeparator:".",H=r?r.digitGroupSeparator: -",",F="";p=String(p);var F=1,z=r="",E=-1,L=[],R=[],I=0,N=0,S=0,O=!1,U=0,z=p.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|\u2030|./g);p=null;for(var Q=0;z&&QE)E=Q;else{if("%"===p)F*=100;else if("\u2030"===p){F*=1E3;continue}else if(","===p[0]&&"."===p[p.length-1]){F/=Math.pow(1E3,p.length-1);E=Q+p.length-1;continue}else"E"!==p[0]&&"e"!==p[0]||"0"!==p[p.length-1]||(O=!0);0>E?(L.push(p),"#"===p||"0"===p?I++:","===p&&S++):(R.push(p),"#"!==p&&"0"!==p||N++)}O&&(p=Math.floor(k), -z=-Math.floor(Math.log(k)/Math.LN10+1),U=0===k?0:0===p?-(I+z):String(p).length-I,F/=Math.pow(10,U));0>E&&(E=Q);F=(k*F).toFixed(N);p=F.split(".");F=(p[0]+"").split("");k=(p[1]+"").split("");F&&"0"===F[0]&&F.shift();for(O=z=Q=N=E=0;0U?p.replace("+","").replace("-",""):p.replace("-",""),r+=p.replace(/[0]+/,function(k){return $(U,k.length)}));H="";for(L=!1;0U?p.replace("+","").replace("-",""):p.replace("-",""),H+=p.replace(/[0]+/,function(k){return $(U,k.length)}));r+=(L?v:"")+H;return u?"-"+r:r},Ra=function(k){var p=0,r=0;k=k||window.event;k.offsetX||0===k.offsetX?(p=k.offsetX,r=k.offsetY):k.layerX||0==k.layerX?(p=k.layerX,r=k.layerY):(p=k.pageX-k.target.offsetLeft, -r=k.pageY-k.target.offsetTop);return{x:p,y:r}},bb=!0,Ua=window.devicePixelRatio||1,Pa=1,W=bb?Ua/Pa:1,ea=function(k,p,r,u,v,H,F,z,E,L,R,N,O){"undefined"===typeof O&&(O=1);F=F||0;z=z||"black";var I=15p)v=H-1;else break}r>p&&1H&&(F=p.pop(),u-=F.height,v=z)}this._wrappedText={lines:p,width:v,height:u};this.width=v+(this.leftPadding+this.rightPadding);this.height=u+(this.topPadding+this.bottomPadding);this.ctx.font=r};ka.prototype._getFontString=function(){var k;k=""+(this.fontStyle?this.fontStyle+" ":"");k+=this.fontWeight?this.fontWeight+" ":"";k+=this.fontSize?this.fontSize+"px ":"";var p=this.fontFamily?this.fontFamily+"":"";!r&&p&&(p=p.split(",")[0],"'"!==p[0]&&'"'!==p[0]&&(p="'"+p+"'"));return k+=p}; -qa(Va,V);qa(Aa,V);Aa.prototype.setLayout=function(){if(this.text){var k=this.dockInsidePlotArea?this.chart.plotArea:this.chart,p=k.layoutManager.getFreeSpace(),r=p.x1,v=p.y1,E=0,H=0,F=this.chart._menuButton&&this.chart.exportEnabled&&"top"===this.verticalAlign?22:0,z,I;"top"===this.verticalAlign||"bottom"===this.verticalAlign?(null===this.maxWidth&&(this.maxWidth=p.width-4-F*("center"===this.horizontalAlign?2:1)),H=0.5*p.height-this.margin-2,E=0):"center"===this.verticalAlign&&("left"===this.horizontalAlign|| -"right"===this.horizontalAlign?(null===this.maxWidth&&(this.maxWidth=p.height-4),H=0.5*p.width-this.margin-2):"center"===this.horizontalAlign&&(null===this.maxWidth&&(this.maxWidth=p.width-4),H=0.5*p.height-4));var L;u(this.padding)||"number"!==typeof this.padding?u(this.padding)||"object"!==typeof this.padding||(L=this.padding.top?this.padding.top:this.padding.bottom?this.padding.bottom:0,L+=this.padding.bottom?this.padding.bottom:this.padding.top?this.padding.top:0,L*=1.25):L=2.5*this.padding;this.wrap|| -(H=Math.min(H,Math.max(1.5*this.fontSize,this.fontSize+L)));H=new ka(this.ctx,{fontSize:this.fontSize,fontFamily:this.fontFamily,fontColor:this.fontColor,fontStyle:this.fontStyle,fontWeight:this.fontWeight,horizontalAlign:this.horizontalAlign,verticalAlign:this.verticalAlign,borderColor:this.borderColor,borderThickness:this.borderThickness,backgroundColor:this.backgroundColor,maxWidth:this.maxWidth,maxHeight:H,cornerRadius:this.cornerRadius,text:this.text,padding:this.padding,textBaseline:"top"}); -L=H.measureText();"top"===this.verticalAlign||"bottom"===this.verticalAlign?("top"===this.verticalAlign?(v=p.y1+2,I="top"):"bottom"===this.verticalAlign&&(v=p.y2-2-L.height,I="bottom"),"left"===this.horizontalAlign?r=p.x1+2:"center"===this.horizontalAlign?r=p.x1+p.width/2-L.width/2:"right"===this.horizontalAlign&&(r=p.x2-2-L.width-F),z=this.horizontalAlign,this.width=L.width,this.height=L.height):"center"===this.verticalAlign&&("left"===this.horizontalAlign?(r=p.x1+2,v=p.y2-2-(this.maxWidth/2-L.width/ -2),E=-90,I="left",this.width=L.height,this.height=L.width):"right"===this.horizontalAlign?(r=p.x2-2,v=p.y1+2+(this.maxWidth/2-L.width/2),E=90,I="right",this.width=L.height,this.height=L.width):"center"===this.horizontalAlign&&(v=k.y1+(k.height/2-L.height/2),r=k.x1+(k.width/2-L.width/2),I="center",this.width=L.width,this.height=L.height),z="center");H.x=r;H.y=v;H.angle=E;H.horizontalAlign=z;this._textBlock=H;k.layoutManager.registerSpace(I,{width:this.width+("left"===I||"right"===I?this.margin+2:0), -height:this.height+("top"===I||"bottom"===I?this.margin+2:0)});this.bounds={x1:r,y1:v,x2:r+this.width,y2:v+this.height};this.ctx.textBaseline="top"}};Aa.prototype.render=function(){this._textBlock&&this._textBlock.render(!0)};qa(Ka,V);Ka.prototype.setLayout=Aa.prototype.setLayout;Ka.prototype.render=Aa.prototype.render;Wa.prototype.get=function(k,p){var r=null;0a[g].x&&0w?{x:a[l].x+w/3,y:a[l].y+c/3}:{x:a[l].x,y:a[l].y+c/9};l=e;g=0===l?0:l-1;m=l===a.length-1?l:l+1;c=Math.abs((a[m].x-a[g].x)/(0===a[l].x-a[g].x?0.01:a[l].x-a[g].x))*(d- -1)/2+1;w=(a[m].x-a[g].x)/c;c=(a[m].y-a[g].y)/c;b[b.length]=a[l].x>a[g].x&&0w?{x:a[l].x-w/3,y:a[l].y-c/3}:{x:a[l].x,y:a[l].y-c/9};b[b.length]=a[e]}return b}function E(a,d,b,c,e,g,m,l,w,h){var s=0;h?(m.color=g,l.color=g):h=1;s=w?Math.abs(e-b):Math.abs(c-d);s=0this.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360);this.options.scaleBreaks&&(this.scaleBreaks=new Q(this.chart, -this.options.scaleBreaks,++this.chart._eventManager.lastObjectId,this));this.stripLines=[];if(this.options.stripLines&&0=this._appliedBreaks[a+1].startValue&&(this._appliedBreaks[a].endValue=Math.max(this._appliedBreaks[a].endValue,this._appliedBreaks[a+1].endValue),window.console&&window.console.log("CanvasJS Error: Breaks "+a+" and "+(a+1)+" are overlapping."),this._appliedBreaks.splice(a,2),a--)}}function L(a,d,b,c,e,g){L.base.constructor.call(this,"Break",d,b,c,g);this.id=e;this.chart=a;this.ctx=this.chart.ctx;this.scaleBreaks=g;this.optionsName= -d;this.isOptionsInArray=!0;this.type=b.type?this.type:g.type;this.fillOpacity=u(b.fillOpacity)?g.fillOpacity:this.fillOpacity;this.lineThickness=u(b.lineThickness)?g.lineThickness:this.lineThickness;this.color=b.color?this.color:g.color;this.lineColor=b.lineColor?this.lineColor:g.lineColor;this.lineDashType=b.lineDashType?this.lineDashType:g.lineDashType;!u(this.startValue)&&this.startValue.getTime&&(this.startValue=this.startValue.getTime());!u(this.endValue)&&this.endValue.getTime&&(this.endValue= -this.endValue.getTime());"number"===typeof this.startValue&&("number"===typeof this.endValue&&this.endValue=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers);O(this._zoomButton,"mouseout",function(){d||(sa(a,a._zoomButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._zoomButton.childNodes[0],{WebkitFilter:"invert(0%)", -filter:"invert(0%)"}))},this.allDOMEventHandlers)}this._resetButton||(d=!1,va(this._resetButton=document.createElement("button")),ua(this,this._resetButton,"reset"),this._resetButton.style.borderRight=(this.exportEnabled?this.toolbar.borderThickness:0)+"px solid "+this.toolbar.borderColor,this._toolBar.appendChild(this._resetButton),O(this._resetButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._resetButton,"click",function(){a.toolTip.hide();a.zoomEnabled||a.panEnabled?(a.zoomEnabled= -!0,a.panEnabled=!1,ua(a,a._zoomButton,"pan"),a._defaultCursor="default",a.overlaidCanvas.style.cursor=a._defaultCursor):(a.zoomEnabled=!1,a.panEnabled=!1);if(a.sessionVariables.axisX)for(var c=0;c=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers),O(this._resetButton,"mouseout",function(){d||(sa(a,a._resetButton, -{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor,transition:"0.4s",WebkitTransition:"0.4s"}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._resetButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers),this.overlaidCanvas.style.cursor=a._defaultCursor);this.zoomEnabled||this.panEnabled||(this._zoomButton?(a._zoomButton.getAttribute("state")===a._cultureInfo.zoomText?(this.panEnabled=!0,this.zoomEnabled=!1):(this.zoomEnabled=!0,this.panEnabled= -!1),Qa(a._zoomButton,a._resetButton)):(this.zoomEnabled=!0,this.panEnabled=!1))}else this.panEnabled=this.zoomEnabled=!1;this._menuButton?this.exportEnabled?Qa(this._menuButton):va(this._menuButton):this.exportEnabled&&r&&(d=!1,this._menuButton=document.createElement("button"),ua(this,this._menuButton,"menu"),this._toolBar.appendChild(this._menuButton),O(this._menuButton,"touchstart",function(a){d=!0},this.allDOMEventHandlers),O(this._menuButton,"click",function(){"none"!==a._dropdownMenu.style.display|| -a._dropDownCloseTime&&500>=(new Date).getTime()-a._dropDownCloseTime.getTime()||(a._dropdownMenu.style.display="block",a._menuButton.blur(),a._dropdownMenu.focus())},this.allDOMEventHandlers,!0),O(this._menuButton,"mouseover",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColorOnHover,color:a.toolbar.fontColorOnHover}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(100%)",filter:"invert(100%)"}))},this.allDOMEventHandlers,!0), -O(this._menuButton,"mouseout",function(){d||(sa(a,a._menuButton,{backgroundColor:a.toolbar.backgroundColor,color:a.toolbar.fontColor}),0>=navigator.userAgent.search("MSIE")&&sa(a,a._menuButton.childNodes[0],{WebkitFilter:"invert(0%)",filter:"invert(0%)"}))},this.allDOMEventHandlers,!0));if(!this._dropdownMenu&&this.exportEnabled&&r){d=!1;this._dropdownMenu=document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);var b=-1!==this.theme.indexOf("dark")?"black":"#888888";this._dropdownMenu.style.cssText= -"position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 0px;top: 25px;min-width: 120px;outline: 0;font-size: 14px; font-family: Arial, Helvetica, sans-serif;padding: 5px 0px 5px 0px;text-align: left;line-height: 10px;background-color:"+this.toolbar.backgroundColor+";box-shadow: 2px 2px 10px "+b;a._dropdownMenu.style.display="none";this._toolBar.appendChild(this._dropdownMenu);O(this._dropdownMenu,"blur",function(){va(a._dropdownMenu); -a._dropDownCloseTime=new Date},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.printText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers, -!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){a.print();va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText="padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.saveJPGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d= -!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor,this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"jpeg",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0);b=document.createElement("div");b.style.cssText= -"padding: 12px 8px 12px 8px";b.innerHTML=this._cultureInfo.savePNGText;b.style.backgroundColor=this.toolbar.backgroundColor;b.style.color=this.toolbar.fontColor;this._dropdownMenu.appendChild(b);O(b,"touchstart",function(a){d=!0},this.allDOMEventHandlers);O(b,"mouseover",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColorOnHover,this.style.color=a.toolbar.fontColorOnHover)},this.allDOMEventHandlers,!0);O(b,"mouseout",function(){d||(this.style.backgroundColor=a.toolbar.backgroundColor, -this.style.color=a.toolbar.fontColor)},this.allDOMEventHandlers,!0);O(b,"click",function(){Ta(a.canvas,"png",a.exportFileName);va(a._dropdownMenu)},this.allDOMEventHandlers,!0)}"none"!==this._toolBar.style.display&&this._zoomButton&&(this.panEnabled?ua(a,a._zoomButton,"zoom"):ua(a,a._zoomButton,"pan"),a._resetButton.getAttribute("state")!==a._cultureInfo.resetText&&ua(a,a._resetButton,"reset"));this.options.toolTip&&this.toolTip.options!==this.options.toolTip&&(this.toolTip.options=this.options.toolTip); -for(var c in this.toolTip.options)this.toolTip.options.hasOwnProperty(c)&&this.toolTip.updateOption(c)};p.prototype._updateSize=function(){var a;a=[this.canvas,this._preRenderCanvas,this.overlaidCanvas,this._eventManager.ghostCanvas];var d=0,b=0;this.options.width?d=this.width:this.width=d=0c.linkedDataSeriesIndex||c.linkedDataSeriesIndex>=this.options.data.length||"number"!==typeof c.linkedDataSeriesIndex|| -"error"===this.options.data[c.linkedDataSeriesIndex].type)&&(c.linkedDataSeriesIndex=null);null===c.name&&(c.name="DataSeries "+a);null===c.color?1a&&"undefined"!==typeof w.startTimePercent?a>=w.startTimePercent&&w.animationCallback(w.easingFunction(a-w.startTimePercent,0,1,1-w.startTimePercent),w):w.animationCallback(w.easingFunction(a,0,1,1),w);s.dispatchEvent("dataAnimationIterationEnd",{chart:s})},function(){b=[];for(var a=0;aa.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c);ed.max&&"number"===typeof e&&(d.max=e);if(0B&&(B=1/B);b.minDiff>B&&1!==B&&(b.minDiff=B)}else B=c-l.dataPoints[w-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B);null!==e&&null!==l.dataPoints[w-1].y&&(a.axisY.logarithmic?(B=e/l.dataPoints[w-1].y,1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e-l.dataPoints[w-1].y,0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B)))}if(cf&& -!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&qd.viewPortMax&&"number"===typeof e&&(d.viewPortMax=e))}}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype._processStackedPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d= -a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=[],l=[],w=Infinity,h=-Infinity,s=0;sb.max&&(b.max=c);if(0r&&(r=1/r);b.minDiff>r&&1!==r&&(b.minDiff=r)}else r=c-q.dataPoints[n-1].x,0>r&&(r*=-1),b.minDiff>r&&0!==r&&(b.minDiff=r);null!==e&&null!==q.dataPoints[n-1].y&&(a.axisY.logarithmic?0r&&(r=1/r),d.minDiff>r&&1!==r&&(d.minDiff=r)):(r=e-q.dataPoints[n-1].y,0>r&&(r*=-1),d.minDiff>r&&0!==r&&(d.minDiff=r)))}if(ct&&!B)B=!0;else if(c>t&&B)continue;q.dataPoints[n].label&&(a.axisX.labels[c]=q.dataPoints[n].label);cb.viewPortMax&&(b.viewPortMax=c);null===q.dataPoints[n].y?b.viewPortMin===c&&kd.max&&(d.max=a),nb.viewPortMax||(ad.viewPortMax&& -(d.viewPortMax=a)));for(n in l)l.hasOwnProperty(n)&&!isNaN(n)&&(a=l[n],ad.max&&(d.max=Math.max(a,h)),nb.viewPortMax||(ad.viewPortMax&&(d.viewPortMax=Math.max(a,h))))}};p.prototype._processStacked100PlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=!1,l=!1,w=[],h=0;hb.max&&(b.max=c);if(0t&&(t=1/t);b.minDiff>t&&1!==t&&(b.minDiff=t)}else t=c-s.dataPoints[q-1].x,0>t&&(t*=-1),b.minDiff>t&&0!==t&&(b.minDiff=t);u(e)||null===s.dataPoints[q-1].y||(a.axisY.logarithmic?0t&&(t=1/t),d.minDiff>t&&1!==t&&(d.minDiff=t)):(t=e-s.dataPoints[q-1].y,0>t&&(t*=-1),d.minDiff>t&&0!==t&&(d.minDiff=t)))}if(cr&&!f)f=!0;else if(c>r&&f)continue;s.dataPoints[q].label&&(a.axisX.labels[c]=s.dataPoints[q].label); -cb.viewPortMax&&(b.viewPortMax=c);null===e?b.viewPortMin===c&&Be&&(l=!0),w[c]=w[c]?w[c]+Math.abs(e):Math.abs(e))}}s.axisX.valueType=s.xValueType=g?"dateTime":"number"}a.axisY.logarithmic?(d.max=u(d.viewPortMax)?99*Math.pow(a.axisY.logarithmBase,-0.05):Math.max(d.viewPortMax,99*Math.pow(a.axisY.logarithmBase,-0.05)),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&!l?(d.max=u(d.viewPortMax)? -99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?1:Math.min(d.viewPortMin,1)):m&&l?(d.max=u(d.viewPortMax)?99:Math.max(d.viewPortMax,99),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99)):!m&&l&&(d.max=u(d.viewPortMax)?-1:Math.max(d.viewPortMax,-1),d.min=u(d.viewPortMin)?-99:Math.min(d.viewPortMin,-99));d.viewPortMin=d.min;d.viewPortMax=d.max;a.dataPointYSums=w}};p.prototype._processMultiYPlotUnit=function(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo, -b=a.axisX.dataInfo,c,e,g,m,l=!1,w=0;wb.max&&(b.max=c);gd.max&&(d.max=m);0B&&(B=1/B),b.minDiff>B&&1!==B&&(b.minDiff=B)):(B=c-h.dataPoints[s-1].x,0>B&&(B*=-1),b.minDiff>B&&0!==B&&(b.minDiff=B)),e&&(null!==e[0]&&h.dataPoints[s-1].y&&null!==h.dataPoints[s-1].y[0])&&(a.axisY.logarithmic?(B=e[0]/ -h.dataPoints[s-1].y[0],1>B&&(B=1/B),d.minDiff>B&&1!==B&&(d.minDiff=B)):(B=e[0]-h.dataPoints[s-1].y[0],0>B&&(B*=-1),d.minDiff>B&&0!==B&&(d.minDiff=B))));if(!(ct&&!n)n=!0;else if(c>t&&n)continue;h.dataPoints[s].label&&(a.axisX.labels[c]=h.dataPoints[s].label);cb.viewPortMax&&(b.viewPortMax=c);if(b.viewPortMin===c&&e)for(p=0;pd.viewPortMax&&(d.viewPortMax=m))}}h.axisX.valueType=h.xValueType=l?"dateTime":"number"}};p.prototype._processSpecificPlotUnit=function(a){if("waterfall"===a.type&&a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length))for(var d=a.axisY.dataInfo,b=a.axisX.dataInfo,c,e,g=!1,m=0;mb.max&&(b.max=c),l.dataPointEOs[w].cumulativeSumd.max&&(d.max=l.dataPointEOs[w].cumulativeSum),0q&&(q=1/q),b.minDiff>q&&1!==q&&(b.minDiff=q)):(q=c-l.dataPoints[w-1].x,0>q&&(q*=-1),b.minDiff>q&&0!==q&&(b.minDiff=q)),null!==e&&null!==l.dataPoints[w- -1].y&&(a.axisY.logarithmic?(e=l.dataPointEOs[w].cumulativeSum/l.dataPointEOs[w-1].cumulativeSum,1>e&&(e=1/e),d.minDiff>e&&1!==e&&(d.minDiff=e)):(e=l.dataPointEOs[w].cumulativeSum-l.dataPointEOs[w-1].cumulativeSum,0>e&&(e*=-1),d.minDiff>e&&0!==e&&(d.minDiff=e)))),!(cf&&!s)s=!0;else if(c>f&&s)continue;l.dataPoints[w].label&&(a.axisX.labels[c]=l.dataPoints[w].label);cb.viewPortMax&&(b.viewPortMax=c);0d.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w-1].cumulativeSum));l.dataPointEOs[w].cumulativeSumd.viewPortMax&&(d.viewPortMax=l.dataPointEOs[w].cumulativeSum)}l.axisX.valueType=l.xValueType=g?"dateTime":"number"}};p.prototype.calculateAutoBreaks=function(){function a(a,c,b,e){if(e)return b= -Math.pow(Math.min(b*a/c,c/a),0.2),1>=b&&(b=Math.pow(1>a?1/a:Math.min(c/a,a),0.25)),{startValue:a*b,endValue:c/b};b=0.2*Math.min(b-c+a,c-a);0>=b&&(b=0.25*Math.min(c-a,Math.abs(a)));return{startValue:a+b,endValue:c-b}}function d(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)){var c=a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<=a.axisX.scaleBreaks.maxNumberOfAutoBreaks,b=a.axisY.scaleBreaks&&a.axisY.scaleBreaks.autoCalculate&&1<=a.axisY.scaleBreaks.maxNumberOfAutoBreaks;if(c|| -b)for(var d=a.axisY.dataInfo,f=a.axisX.dataInfo,g,h=f.min,l=f.max,m=d.min,n=d.max,f=f._dataRanges,d=d._dataRanges,q,w=0,s=0;sk.dataPoints.length))for(w=0;wf[q].max&&(f[q].max=g)),b){var r= -(n+1-m)*Math.max(parseFloat(a.axisY.scaleBreaks.collapsibleThreshold)||10,10)/100;if((g="waterfall"===a.type?k.dataPointEOs[w].cumulativeSum:k.dataPoints[w].y)&&g.length)for(var p=0;pd[q].max&&(d[q].max=g[p]);else u(g)||(q=Math.floor((g-m)/r),gd[q].max&&(d[q].max=g))}}}}function b(a){if(a.dataSeriesIndexes&&!(1>a.dataSeriesIndexes.length)&&a.axisX.scaleBreaks&&a.axisX.scaleBreaks.autoCalculate&&1<= -a.axisX.scaleBreaks.maxNumberOfAutoBreaks)for(var c=a.axisX.dataInfo,b=c.min,d=c.max,f=c._dataRanges,g,h=0,l=0;lm.dataPoints.length))for(h=0;hf[g].max&&(f[g].max=c)}}for(var c,e=this,g=!1,m=0;m< -this._axes.length;m++)if(this._axes[m].scaleBreaks&&this._axes[m].scaleBreaks.autoCalculate&&1<=this._axes[m].scaleBreaks.maxNumberOfAutoBreaks){g=!0;this._axes[m].dataInfo._dataRanges=[];for(var l=0;l<100/Math.max(parseFloat(this._axes[m].scaleBreaks.collapsibleThreshold)||10,10);l++)this._axes[m].dataInfo._dataRanges.push({min:Infinity,max:-Infinity})}if(g){for(m=0;ms[f].max&&(s[f].max=q)}delete this._axes[m].dataInfo.dataPointYPositiveSums}if(this._axes[m].dataInfo.dataPointYNegativeSums){n= -this._axes[m].dataInfo.dataPointYNegativeSums;s=h;for(l in n)n.hasOwnProperty(l)&&!isNaN(l)&&(q=-1*n[l],u(q)||(f=Math.floor((q-w)/c),qs[f].max&&(s[f].max=q)));delete this._axes[m].dataInfo.dataPointYNegativeSums}for(l=0;lc&&g.push({diff:q,start:s,end:w});break}else l++;if(this._axes[m].scaleBreaks.customBreaks)for(l=0;l=e.x1&&(a<=e.x2&&d>=e.y1&&d<=e.y2)&&(c=e.id)}return c};p.prototype.getAutoFontSize=lb;p.prototype.resetOverlayedCanvas=function(){this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height)};p.prototype.clearCanvas=kb;p.prototype.attachEvent=function(a){this._events.push(a)};p.prototype._touchEventHandler=function(a){if(a.changedTouches&&this.interactivityEnabled){var d=[],b=a.changedTouches,c=b?b[0]:a,e=null;switch(a.type){case "touchstart":case "MSPointerDown":d=["mousemove","mousedown"];this._lastTouchData= -Ra(c);this._lastTouchData.time=new Date;break;case "touchmove":case "MSPointerMove":d=["mousemove"];break;case "touchend":case "MSPointerUp":var g=this._lastTouchData&&this._lastTouchData.time?new Date-this._lastTouchData.time:0,d="touchstart"===this._lastTouchEventType||"MSPointerDown"===this._lastTouchEventType||300>g?["mouseup","click"]:["mouseup"];break;default:return}if(!(b&&1g)this._lastTouchData.scroll=!0}catch(l){}this._lastTouchEventType=a.type;if(this._lastTouchData.scroll&&this.zoomEnabled)this.isDrag&&this.resetOverlayedCanvas(),this.isDrag=!1;else for(b=0;b=e.x1&&d.x<=e.x2&&d.y>=e.y1&&d.y<=e.y2){c[b].call(c.context,d.x,d.y);"mousedown"===b&&!0===c.capture?(p.capturedEventParam=c,this.overlaidCanvas.setCapture?this.overlaidCanvas.setCapture():document.documentElement.addEventListener("mouseup", -this._mouseEventHandler,!1)):"mouseup"===b&&(c.chart.overlaidCanvas.releaseCapture?c.chart.overlaidCanvas.releaseCapture():document.documentElement.removeEventListener("mouseup",this._mouseEventHandler,!1));break}else c=null;a.target.style.cursor=c&&c.cursor?c.cursor:this._defaultCursor}b=this.plotArea;if(d.xb.x2||d.yb.y2)this.toolTip&&this.toolTip.enabled?this.toolTip.hide():this.resetOverlayedCanvas();this.isDrag&&this.zoomEnabled||!this._eventManager||this._eventManager.mouseEventHandler(a)}}; -p.prototype._plotAreaMouseDown=function(a,d){this.isDrag=!0;this.dragStartPoint={x:a,y:d}};p.prototype._plotAreaMouseUp=function(a,d){if(("normal"===this.plotInfo.axisPlacement||"xySwapped"===this.plotInfo.axisPlacement)&&this.isDrag){var b=d-this.dragStartPoint.y,c=a-this.dragStartPoint.x,e=0<=this.zoomType.indexOf("x"),g=0<=this.zoomType.indexOf("y"),m=!1;this.resetOverlayedCanvas();if("xySwapped"===this.plotInfo.axisPlacement)var l=g,g=e,e=l;if(this.panEnabled||this.zoomEnabled){if(this.panEnabled)for(e= -g=0;eb.maximum&&(g=b.viewportMaximum/b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum/g,b.sessionVariables.newViewportMaximum=b.viewportMaximum/g,m=!0):b.viewportMinimumb.maximum&&(g=b.viewportMaximum-b.maximum,b.sessionVariables.newViewportMinimum=b.viewportMinimum-g,b.sessionVariables.newViewportMaximum=b.viewportMaximum-g,m=!0);else if((!e||2Math.abs(b)&&(this.panEnabled||this.zoomEnabled)?this.toolTip.hide():this.panEnabled||this.zoomEnabled||this.toolTip.mouseMoveHandler(a, -d);if((!e||2f)var B=f,f=n,n=B;if(q.scaleBreaks)for(B=0;!g&&B=f;if(isFinite(q.dataInfo.minDiff))if(B=q.getApparentDifference(n,f,null,!0),!(g||!(this.panEnabled&&q.scaleBreaks&&q.scaleBreaks._appliedBreaks.length)&&(q.logarithmic&&Bq.maximum))w.push(q),s.push({val1:n,val2:f}),l=!0;else if(!e){l=!1;break}}return{isValid:l,axesWithValidRange:w,axesRanges:s}};p.prototype.preparePlotArea=function(){var a=this.plotArea;!r&&(0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2;a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2;a.width=a.x2-a.x1;a.height=a.y2-a.y1}this.axisY2&&0b.lineCoordinates.x2?d.x2:b.lineCoordinates.x2,a.y2=d.y2>d.y1?d.y2:b.lineCoordinates.y2,a.width=a.x2-a.x1,a.height=a.y2-a.y1)}else d= -this.layoutManager.getFreeSpace(),a.x1=d.x1,a.x2=d.x2,a.y1=d.y1,a.y2=d.y2,a.width=d.width,a.height=d.height;r||(a.canvas.width=a.width,a.canvas.height=a.height,a.canvas.style.left=a.x1+"px",a.canvas.style.top=a.y1+"px",(0b.x2||h.point.yb.y2+1)continue}else if("rangearea"===s||"rangesplinearea"===s){if(h.dataPoint.xy.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("bubble")||0<=s.indexOf("scatter")){if(h.dataPoint.xy.viewportMaximum|| -h.dataPoint.yA.viewportMaximum)continue}else if(0<=s.indexOf("column")||"waterfall"===s||"error"===s&&!h.axisSwapped){if(h.dataPoint.xy.viewportMaximum||h.bounds.y1>b.y2||h.bounds.y2y.viewportMaximum||h.bounds.x1>b.x2||h.bounds.x2 -y.viewportMaximum||Math.max.apply(null,h.dataPoint.y)A.viewportMaximum)continue}else if(h.dataPoint.xy.viewportMaximum)continue;e=m=2;"horizontal"===C?(l=f.width,w=f.height):(w=f.width,l=f.height);if("normal"===this.plotInfo.axisPlacement){if(0<=s.indexOf("line")||0<=s.indexOf("area"))t="auto",m=4;else if(0<=s.indexOf("stacked"))"auto"===t&&(t="inside");else if("bubble"===s||"scatter"===s)t="inside";q=h.point.x- -l/2;"inside"!==t?(e=b.y1,g=b.y2,0h.point.y)):(n=h.point.y+m+c,n>g-w-m-c&&(n="auto"===t?Math.min(h.point.y,g)-w-m-c:g-w-m-c,v=ng-w-m&&("bubble"===s||"scatter"===s)&&(n=Math.min(h.point.y+m,b.y2-w-m))),n=Math.min(n,g-w))}else 0<=s.indexOf("line")||0<=s.indexOf("area")||0<=s.indexOf("scatter")?(t="auto",e=4):0<=s.indexOf("stacked")?"auto"===t&&(t="inside"):"bubble"===s&&(t="inside"),n=h.point.y-w/2,"inside"!==t?(m=b.x1,g=b.x2,0>ma?(q=h.point.x-l-e-c,qh.point.x)):(q=h.point.x+e+c,q>g-l-e-c&&(q="auto"=== -t?Math.min(h.point.x,g)-l-e-c:g-l-e-c,v=qma?Math.max(h.bounds.x1,b.x1)+l/2+e:Math.min(h.bounds.x2,b.x2)-l/2-e:(Math.max(h.bounds.x1,b.x1)+Math.min(h.bounds.x2,b.x2))/2,q=0>ma?Math.max(h.point.x,c)-l/2:Math.min(h.point.x,c)-l/2,q=Math.max(q,m));"vertical"===C&&(n+=w);f.x=q;f.y=n;f.render(!0);p&&("inside"!==t&&(0>s.indexOf("bar")&&("error"!==s||!h.axisSwapped)&&h.point.x>b.x1&&h.point.xs.indexOf("column")&&("error"!==s||h.axisSwapped)&&h.point.y>b.y1&&h.point.y=a.dataSeriesIndexes.length)){var c= -this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& -b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepLine=function(a){var d=a.targetCanvasCtx|| -this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx;b.save();var e=this.plotArea;b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();for(var g=[],m,l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[t].y)0s[t].y===a.axisY.reversed?1:-1,color:B})}b.stroke();r&&c.stroke()}}ia.drawMarkers(g);r&& -(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),c.beginPath());b.restore();b.beginPath();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation, -easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderSpline=function(a){function d(a){a=v(a,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx;c.save();var g=this.plotArea;c.beginPath(); -c.rect(g.x1,g.y1,g.width,g.height);c.clip();for(var m=[],l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!u)))if("number"!==typeof s[p].y)0s[p].y===a.axisY.reversed?1:-1,color:B});u=!1}d(x)}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas, -0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(g.x1,g.y1,g.width,g.height),e.beginPath());c.restore();c.beginPath();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, -animationBase:0}}};p.prototype.renderColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width, -0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.dataPointWidth=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){m=a.axisX.convertValueToPixel(w);l=a.axisY.convertValueToPixel(B[g].y);m=a.axisX.reversed?m+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:m-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var k=a.axisX.reversed?m-q<<0:m+q<<0,t;0<=B[g].y?t=h:(t=l,l=h);l>t&&(c=l,l=t,t=c);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,l,k,t,c,0,null,p&&0<=B[g].y, -0>B[g].y&&p,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:m,y1:l,x2:k,y2:t};c=N(c);r&&ea(this._eventManager.ghostCtx,m,l,k,t,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"column",dataPoint:B[g],dataSeries:f,point:{x:m+(k-m)/2,y:0>B[g].y===a.axisY.reversed?l:t},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:m, -y1:Math.min(l,t),x2:k,y2:Math.max(l,t)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore(); -return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.y2?a.axisY.bounds.y2:h}}};p.prototype.renderStackedColumn=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth? -this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? -this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q="undefined"!==typeof m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;g[c]=A+(y-q)}else A=m[c]?m[c]:0,y=q+A,q=n+A,m[c]=A+(y-q);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1, -!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedColumn",dataPoint:t[h],dataSeries:p,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q, -y)},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx, -animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderStackedColumn100=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth: -this.options.dataPointWidth?this.dataPointWidth:1;s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.width<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>s&&(h=Math.min(this.options.dataPointWidth? -this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(f=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){s=a.axisX.convertValueToPixel(c);q=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var x=s-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;q=a.axisY.convertValueToPixel(l[c]);y=g[c]?g[c]:n;g[c]=q}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=q+("undefined"!==typeof w[c]?w[c]:0),y=a.axisY.convertValueToPixel(w[c]),q=m[c]?m[c]:n,m[c]=y;else if(q=a.axisY.convertValueToPixel(q),0<=t[h].y){var A="undefined"!==typeof g[c]?g[c]:0;q-=A;y=n-A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y1-q)&&(q=e.y1);g[c]=A+(y-q)}else A="undefined"!==typeof m[c]? -m[c]:0,y=q+A,q=n+A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.y2-y)&&(y=e.y2),m[c]=A+(y-q);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,x,q,v,y,c,0,null,u&&0<=t[h].y,0>t[h].y&&u,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:x,y1:q,x2:v,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,q,v,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&& -this._indexLabels.push({chartType:"stackedColumn100",dataPoint:t[h],dataSeries:k,point:{x:s,y:0<=t[h].y?q:y},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:x,y1:Math.min(q,y),x2:v,y2:Math.max(q,y)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&& -this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.yScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.y2?a.axisY.bounds.y2:n}}};p.prototype.renderBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c= -null,e=this.plotArea,g=0,m,l,w,h=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,s=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0,q=a.axisX.dataInfo.minDiff;isFinite(q)||(q=0.3*Math.abs(a.axisX.range));q=this.options.dataPointWidth? -this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(q)/Math.log(a.axisX.range):Math.abs(q)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>s&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,s));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ss&&(q=s);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height); -b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(s=0;sa.axisX.dataInfo.viewPortMax)&&"number"===typeof B[g].y){l=a.axisX.convertValueToPixel(w); -m=a.axisY.convertValueToPixel(B[g].y);l=a.axisX.reversed?l+a.plotType.totalDataSeries*q/2-(a.previousDataSeriesCount+s)*q<<0:l-a.plotType.totalDataSeries*q/2+(a.previousDataSeriesCount+s)*q<<0;var p=a.axisX.reversed?l-q<<0:l+q<<0,t;0<=B[g].y?t=h:(t=m,m=h);c=B[g].color?B[g].color:f._colorSet[g%f._colorSet.length];ea(b,t,l,m,p,c,0,null,k,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g,x1:t,y1:l,x2:m,y2:p};c= -N(c);r&&ea(this._eventManager.ghostCtx,t,l,m,p,c,0,null,!1,!1,!1,!1);(B[g].indexLabel||f.indexLabel||B[g].indexLabelFormatter||f.indexLabelFormatter)&&this._indexLabels.push({chartType:"bar",dataPoint:B[g],dataSeries:f,point:{x:0<=B[g].y?m:t,y:l+(p-l)/2},direction:0>B[g].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(t,m),y1:l,x2:Math.max(t,m),y2:p},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas, -0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:ha.axisY.bounds.x2?a.axisY.bounds.x2: -h}}};p.prototype.renderStackedBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<< -0;var f=a.axisX.dataInfo.minDiff;isFinite(f)||(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&&"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,v=x+f<<0,y;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=t[h].y)w[c]=t[h].y+(w[c]?w[c]:0),s=m[c]? -m[c]:n,m[c]=y=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(t[h].y),0<=t[h].y){var A=g[c]?g[c]:0;y=n+A;s+=A;g[c]=A+(s-y)}else A=m[c]?m[c]:0,y=s-A,s=n-A,m[c]=A+(s-y);c=t[h].color?t[h].color:k._colorSet[h%k._colorSet.length];ea(b,y,x,s,v,c,0,null,u,!1,!1,!1,k.fillOpacity);c=k.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:h,x1:y,y1:x,x2:s,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,y,x,s,v,c,0,null,!1,!1,!1, -!1);(t[h].indexLabel||k.indexLabel||t[h].indexLabelFormatter||k.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar",dataPoint:t[h],dataSeries:k,point:{x:0<=t[h].y?s:y,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(y,s),y1:x,x2:Math.max(y,s),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& -b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderStackedBar100=function(a){var d= -a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=[],m=[],l=[],w=[],h=0,s,q,n=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),h=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;q=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.15*this.height<<0;var f=a.axisX.dataInfo.minDiff;isFinite(f)|| -(f=0.3*Math.abs(a.axisX.range));f=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.height*(a.axisX.logarithmic?Math.log(f)/Math.log(a.axisX.range):Math.abs(f)/Math.abs(a.axisX.range))/a.plotType.plotUnits.length)<<0;this.dataPointMaxWidth&&h>q&&(h=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,q));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&qq&&(f=q);b.save();r&&this._eventManager.ghostCtx.save(); -b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var B=0;Ba.axisX.dataInfo.viewPortMax)&& -"number"===typeof t[h].y){q=a.axisX.convertValueToPixel(c);var x;x=0!==a.dataPointYSums[c]?100*(t[h].y/a.dataPointYSums[c]):0;var v=q-a.plotType.plotUnits.length*f/2+a.index*f<<0,y=v+f<<0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=l[c])continue;x=g[c]?g[c]:n;g[c]=s=a.axisY.convertValueToPixel(l[c])}else if(a.axisY.scaleBreaks&&0=t[h].y)w[c]=x+(w[c]?w[c]:0),s=m[c]?m[c]: -n,m[c]=x=a.axisY.convertValueToPixel(w[c]);else if(s=a.axisY.convertValueToPixel(x),0<=t[h].y){var A=g[c]?g[c]:0;x=n+A;s+=A;a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x2-s)&&(s=e.x2);g[c]=A+(s-x)}else A=m[c]?m[c]:0,x=s-A,s=n-A,a.dataSeriesIndexes.length-1===B&&1>=Math.abs(e.x1-x)&&(x=e.x1),m[c]=A+(s-x);c=t[h].color?t[h].color:p._colorSet[h%p._colorSet.length];ea(b,x,v,s,y,c,0,null,u,!1,!1,!1,p.fillOpacity);c=p.dataPointIds[h];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:k, -dataPointIndex:h,x1:x,y1:v,x2:s,y2:y};c=N(c);r&&ea(this._eventManager.ghostCtx,x,v,s,y,c,0,null,!1,!1,!1,!1);(t[h].indexLabel||p.indexLabel||t[h].indexLabelFormatter||p.indexLabelFormatter)&&this._indexLabels.push({chartType:"stackedBar100",dataPoint:t[h],dataSeries:p,point:{x:0<=t[h].y?s:x,y:q},direction:0>t[h].y===a.axisY.reversed?1:-1,bounds:{x1:Math.min(x,s),y1:v,x2:Math.max(x,s),y2:y},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop", -a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.xScaleAnimation,easingFunction:M.easing.easeOutQuart,animationBase:na.axisY.bounds.x2?a.axisY.bounds.x2:n}}};p.prototype.renderArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!da)))if("number"!==typeof p[k].y)B.connectNullData||(da||d)||c(),da=!0;else{t=a.axisX.convertValueToPixel(x);u=a.axisY.convertValueToPixel(p[k].y);d||da?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||b===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d=t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,b=B.nullDataLineDashType,g.setLineDash(Y)),g.lineTo(t,u),r&&m.lineTo(t, -u)):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),da=d=!1):(g.lineTo(t,u),r&&m.lineTo(t,u),0==k%250&&c());q={x:t,y:u};kp[k].y===a.axisY.reversed?1:-1,color:z})}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas, -0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear, -animationBase:0}}};p.prototype.renderSplineArea=function(a){function d(){var b=v(x,2);if(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum? -t=p:0>a.axisY.viewportMaximum?t=m.y1:0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=a.axisX.lineCoordinates,m=a.axisY.lineCoordinates,l=[],w=this.plotArea;c.save();r&& -e.save();c.beginPath();c.rect(w.x1,w.y1,w.width,w.height);c.clip();r&&(e.beginPath(),e.rect(w.x1,w.y1,w.width,w.height),e.clip());for(var h=0;ha.axisX.dataInfo.viewPortMax&&(!q.connectNullData||!k)))if("number"!==typeof n[f].y)0n[f].y===a.axisY.reversed?1:-1,color:ma});k=!1}d();ia.drawMarkers(l)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(w.x1,w.y1,w.width,w.height), -this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStepArea=function(a){var d,b;function c(){A&&(0=a.axisY.viewportMinimum&&0<=a.axisY.viewportMaximum?y=v:0>a.axisY.viewportMaximum?y=w.y1:0=a.dataSeriesIndexes.length)){var m=this._eventManager.ghostCtx,l=a.axisX.lineCoordinates,w=a.axisY.lineCoordinates,h=[],s=this.plotArea,q;g.save();r&&m.save();g.beginPath();g.rect(s.x1,s.y1,s.width,s.height);g.clip();r&&(m.beginPath(),m.rect(s.x1,s.y1,s.width,s.height),m.clip());for(var n=0;na.axisX.dataInfo.viewPortMax&&(!B.connectNullData||!b))){var Z=u;"number"!==typeof k[p].y?(B.connectNullData||(b||d)||c(),b=!0):(t=a.axisX.convertValueToPixel(x),u=a.axisY.convertValueToPixel(k[p].y),d||b?(!d&&B.connectNullData?(g.setLineDash&&(B.options.nullDataLineDashType||Y===B.lineDashType&&B.lineDashType!==B.nullDataLineDashType)&&(d= -t,b=u,t=q.x,u=q.y,c(),g.moveTo(q.x,q.y),t=d,u=b,A=q,Y=B.nullDataLineDashType,g.setLineDash(ca)),g.lineTo(t,Z),g.lineTo(t,u),r&&(m.lineTo(t,Z),m.lineTo(t,u))):(g.beginPath(),g.moveTo(t,u),r&&(m.beginPath(),m.moveTo(t,u)),A={x:t,y:u}),b=d=!1):(g.lineTo(t,Z),r&&m.lineTo(t,Z),g.lineTo(t,u),r&&m.lineTo(t,u),0==p%250&&c()),q={x:t,y:u},pk[p].y===a.axisY.reversed?1:-1,color:z}))}c();ia.drawMarkers(h)}}r&&(e.drawImage(this._preRenderCanvas,0,0,this.width,this.height),g.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&g.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&g.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas, -0,0,this.width,this.height),g.clearRect(s.x1,s.y1,s.width,s.height),this._eventManager.ghostCtx.restore());g.restore();return{source:e,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea=function(a){function d(){if(!(1>h.length)){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=[],l=this.plotArea,w=[],h=[],s=[],q=[],n=0,f,k,p=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),u=this._eventManager.ghostCtx,t,C,x;r&&u.beginPath();c.save();r&&u.save();c.beginPath();c.rect(l.x1,l.y1,l.width,l.height);c.clip();r&&(u.beginPath(),u.rect(l.x1,l.y1,l.width,l.height),u.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData||!da)))if("number"!==typeof Z.y)A.connectNullData||(da||C)||d(),da=!0;else{f=a.axisX.convertValueToPixel(g);var oa= -w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(Z.y),k-=oa;h.push({x:f,y:p-oa});w[g]=p-k;C||da?(!C&&A.connectNullData?(c.setLineDash&&(A.options.nullDataLineDashType||x===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(C=h.pop(),x=h[h.length-1],d(),c.moveTo(t.x,t.y),h.push(x),h.push(C),x=A.nullDataLineDashType, -c.setLineDash(Y)),c.lineTo(f,k),r&&u.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(u.beginPath(),u.moveTo(f,k))),da=C=!1):(c.lineTo(f,k),r&&u.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&u.moveTo(f,k),h.push({x:f,y:p-oa})));t={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&u.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(m);r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&& -c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(l.x1,l.y1,l.width,l.height),u.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderStackedArea100=function(a){function d(){for(0=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=[],w=[],h=[],s=[],q=[],n=0,f,k,p,u,t,C=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),x=this._eventManager.ghostCtx;c.save();r&&x.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(x.beginPath(), -x.rect(m.x1,m.y1,m.width,m.height),x.clip());for(var e=[],v=0;va.axisX.dataInfo.viewPortMax&&(!A.connectNullData|| -!da)))if("number"!==typeof Z.y)A.connectNullData||(da||u)||d(),da=!0;else{var oa;oa=0!==a.dataPointYSums[g]?100*(Z.y/a.dataPointYSums[g]):0;f=a.axisX.convertValueToPixel(g);var la=w[g]?w[g]:0;if(a.axisY.logarithmic||a.axisY.scaleBreaks&&0=q[g]&&a.axisY.logarithmic)continue;k=a.axisY.convertValueToPixel(q[g])}else k=a.axisY.convertValueToPixel(oa),k-=la;h.push({x:f,y:C-la});w[g]=C-k;u||da?(!u&&A.connectNullData?(c.setLineDash&& -(A.options.nullDataLineDashType||t===A.lineDashType&&A.lineDashType!==A.nullDataLineDashType)&&(u=h.pop(),t=h[h.length-1],d(),c.moveTo(p.x,p.y),h.push(t),h.push(u),t=A.nullDataLineDashType,c.setLineDash(Y)),c.lineTo(f,k),r&&x.lineTo(f,k)):(c.beginPath(),c.moveTo(f,k),r&&(x.beginPath(),x.moveTo(f,k))),da=u=!1):(c.lineTo(f,k),r&&x.lineTo(f,k),0==n%250&&(d(),c.moveTo(f,k),r&&x.moveTo(f,k),h.push({x:f,y:C-la})));p={x:f,y:k};nz[n].y===a.axisY.reversed?1:-1,color:e})}}d();c.moveTo(f,k);r&&x.moveTo(f,k)}delete A.dataPointIndexes}ia.drawMarkers(l);r&&(b.drawImage(this._preRenderCanvas,0, -0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1,m.width,m.height),x.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}}; -p.prototype.renderBubble=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=-Infinity,w=Infinity,h=0;ha.axisX.dataInfo.viewPortMax||"undefined"===typeof n[e].z||(f=n[e].z,f>l&&(l=f),fa.axisX.dataInfo.viewPortMax)&&"number"===typeof n[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(n[e].y);var f=n[e].z,u=2*Math.max(Math.sqrt((l===w?p/2:k+(p-k)/(l-w)*(f-w))/Math.PI)<<0,1),f=q.getMarkerProperties(e,b);f.size=u;b.globalAlpha=q.fillOpacity;ia.drawMarker(g,m,b,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;var t=q.dataPointIds[e];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:s, -dataPointIndex:e,x1:g,y1:m,size:u};u=N(t);r&&ia.drawMarker(g,m,this._eventManager.ghostCtx,f.type,f.size,u,u,f.borderThickness);(n[e].indexLabel||q.indexLabel||n[e].indexLabelFormatter||q.indexLabelFormatter)&&this._indexLabels.push({chartType:"bubble",dataPoint:n[e],dataSeries:q,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/2,x2:g+f.size/2,y2:m+f.size/2},color:null})}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&& -b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderScatter=function(a){var d= -a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d;if(!(0>=a.dataSeriesIndexes.length)){var c=this.plotArea,e=0,g,m;b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(c.x1,c.y1,c.width,c.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.clip());for(var l=0;la.axisX.dataInfo.viewPortMax)&&"number"===typeof s[e].y){g=a.axisX.convertValueToPixel(g);m=a.axisY.convertValueToPixel(s[e].y);var f=h.getMarkerProperties(e,g,m,b);b.globalAlpha=h.fillOpacity;ia.drawMarker(f.x,f.y,f.ctx,f.type,f.size,f.color,f.borderColor,f.borderThickness);b.globalAlpha=1;Math.sqrt((q-g)*(q-g)+(n-m)*(n-m))Math.min(this.plotArea.width,this.plotArea.height)||(q=h.dataPointIds[e],this._eventManager.objectMap[q]={id:q,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:e,x1:g,y1:m},q=N(q),r&&ia.drawMarker(f.x,f.y,this._eventManager.ghostCtx,f.type,f.size,q,q,f.borderThickness),(s[e].indexLabel||h.indexLabel||s[e].indexLabelFormatter||h.indexLabelFormatter)&&this._indexLabels.push({chartType:"scatter",dataPoint:s[e],dataSeries:h,point:{x:g,y:m},direction:1,bounds:{x1:g-f.size/2,y1:m-f.size/ -2,x2:g+f.size/2,y2:m+f.size/2},color:null}),q=g,n=m)}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(c.x1,c.y1,c.width,c.height),this._eventManager.ghostCtx.restore()); -b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderCandlestick=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=null,m=this.plotArea,l=0,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,g=this.options.dataPointMaxWidth? -this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*m.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&&e>g&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,g));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&gg&&(k=g);b.save();r&&c.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(c.beginPath(),c.rect(m.x1,m.y1,m.width,m.height),c.clip());for(var p=0;pa.axisX.dataInfo.viewPortMax)&&!u(C[l].y)&&C[l].y.length&& -"number"===typeof C[l].y[0]&&"number"===typeof C[l].y[1]&&"number"===typeof C[l].y[2]&&"number"===typeof C[l].y[3]){w=a.axisX.convertValueToPixel(f);h=a.axisY.convertValueToPixel(C[l].y[0]);s=a.axisY.convertValueToPixel(C[l].y[1]);q=a.axisY.convertValueToPixel(C[l].y[2]);n=a.axisY.convertValueToPixel(C[l].y[3]);var z=w-k/2<<0,y=z+k<<0,g=t.options.fallingColor?t.fallingColor:t._colorSet[0],e=C[l].color?C[l].color:t._colorSet[0],A=Math.round(Math.max(1,0.15*k)),D=0===A%2?0:0.5,aa=t.dataPointIds[l]; -this._eventManager.objectMap[aa]={id:aa,objectType:"dataPoint",dataSeriesIndex:v,dataPointIndex:l,x1:z,y1:h,x2:y,y2:s,x3:w,y3:q,x4:w,y4:n,borderThickness:A,color:e};b.strokeStyle=e;b.beginPath();b.lineWidth=A;c.lineWidth=Math.max(A,4);"candlestick"===t.type?(b.moveTo(w-D,s),b.lineTo(w-D,Math.min(h,n)),b.stroke(),b.moveTo(w-D,Math.max(h,n)),b.lineTo(w-D,q),b.stroke(),ea(b,z,Math.min(h,n),y,Math.max(h,n),C[l].y[0]<=C[l].y[3]?t.risingColor:g,A,e,x,x,!1,!1,t.fillOpacity),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w- -D,s),c.lineTo(w-D,Math.min(h,n)),c.stroke(),c.moveTo(w-D,Math.max(h,n)),c.lineTo(w-D,q),c.stroke(),ea(c,z,Math.min(h,n),y,Math.max(h,n),e,0,null,!1,!1,!1,!1))):"ohlc"===t.type&&(b.moveTo(w-D,s),b.lineTo(w-D,q),b.stroke(),b.beginPath(),b.moveTo(w,h),b.lineTo(z,h),b.stroke(),b.beginPath(),b.moveTo(w,n),b.lineTo(y,n),b.stroke(),r&&(e=N(aa),c.strokeStyle=e,c.moveTo(w-D,s),c.lineTo(w-D,q),c.stroke(),c.beginPath(),c.moveTo(w,h),c.lineTo(z,h),c.stroke(),c.beginPath(),c.moveTo(w,n),c.lineTo(y,n),c.stroke())); -(C[l].indexLabel||t.indexLabel||C[l].indexLabelFormatter||t.indexLabelFormatter)&&this._indexLabels.push({chartType:t.type,dataPoint:C[l],dataSeries:t,point:{x:z+(y-z)/2,y:a.axisY.reversed?q:s},direction:1,bounds:{x1:z,y1:Math.min(s,q),x2:y,y2:Math.max(s,q)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas, -0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),c.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderBoxAndWhisker=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=this._eventManager.ghostCtx;if(!(0>=a.dataSeriesIndexes.length)){var e= -null,g=this.plotArea,m=0,l,w,h,s,q,n,f,e=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1,m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.015*this.width,k=a.axisX.dataInfo.minDiff;isFinite(k)||(k=0.3*Math.abs(a.axisX.range));k=this.options.dataPointWidth?this.dataPointWidth:0.7*g.width*(a.axisX.logarithmic?Math.log(k)/Math.log(a.axisX.range):Math.abs(k)/Math.abs(a.axisX.range))<<0;this.dataPointMaxWidth&& -e>m&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(k=m);b.save();r&&c.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(c.beginPath(),c.rect(g.x1,g.y1,g.width,g.height),c.clip());for(var p=!1,p=!!a.axisY.reversed,v=0;va.axisX.dataInfo.viewPortMax)&&!u(x[m].y)&&x[m].y.length&&"number"===typeof x[m].y[0]&&"number"===typeof x[m].y[1]&&"number"===typeof x[m].y[2]&&"number"===typeof x[m].y[3]&&"number"===typeof x[m].y[4]&&5===x[m].y.length){l=a.axisX.convertValueToPixel(f);w=a.axisY.convertValueToPixel(x[m].y[0]);h=a.axisY.convertValueToPixel(x[m].y[1]);s=a.axisY.convertValueToPixel(x[m].y[2]); -q=a.axisY.convertValueToPixel(x[m].y[3]);n=a.axisY.convertValueToPixel(x[m].y[4]);var y=l-k/2<<0,A=l+k/2<<0,e=x[m].color?x[m].color:C._colorSet[0],D=Math.round(Math.max(1,0.15*k)),aa=0===D%2?0:0.5,T=x[m].whiskerColor?x[m].whiskerColor:x[m].color?C.whiskerColor?C.whiskerColor:x[m].color:C.whiskerColor?C.whiskerColor:e,Y="number"===typeof x[m].whiskerThickness?x[m].whiskerThickness:"number"===typeof C.options.whiskerThickness?C.whiskerThickness:D,ca=x[m].whiskerDashType?x[m].whiskerDashType:C.whiskerDashType, -da=u(x[m].whiskerLength)?u(C.options.whiskerLength)?k:C.whiskerLength:x[m].whiskerLength,da="number"===typeof da?0>=da?0:da>=k?k:da:"string"===typeof da?parseInt(da)*k/100>k?k:parseInt(da)*k/100:k,Z=1===Math.round(Y)%2?0.5:0,oa=x[m].stemColor?x[m].stemColor:x[m].color?C.stemColor?C.stemColor:x[m].color:C.stemColor?C.stemColor:e,la="number"===typeof x[m].stemThickness?x[m].stemThickness:"number"===typeof C.options.stemThickness?C.stemThickness:D,G=1===Math.round(la)%2?0.5:0,F=x[m].stemDashType?x[m].stemDashType: -C.stemDashType,E=x[m].lineColor?x[m].lineColor:x[m].color?C.lineColor?C.lineColor:x[m].color:C.lineColor?C.lineColor:e,H="number"===typeof x[m].lineThickness?x[m].lineThickness:"number"===typeof C.options.lineThickness?C.lineThickness:D,I=x[m].lineDashType?x[m].lineDashType:C.lineDashType,K=1===Math.round(H)%2?0.5:0,L=C.upperBoxColor,O=C.lowerBoxColor,Q=u(C.options.fillOpacity)?1:C.fillOpacity,P=C.dataPointIds[m];this._eventManager.objectMap[P]={id:P,objectType:"dataPoint",dataSeriesIndex:t,dataPointIndex:m, -x1:y,y1:w,x2:A,y2:h,x3:l,y3:s,x4:l,y4:q,y5:n,borderThickness:D,color:e,stemThickness:la,stemColor:oa,whiskerThickness:Y,whiskerLength:da,whiskerColor:T,lineThickness:H,lineColor:E};b.save();0=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth: -1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:0.03*this.width;var h=a.axisX.dataInfo.minDiff;isFinite(h)||(h=0.3*Math.abs(a.axisX.range));h=this.options.dataPointWidth?this.dataPointWidth:0.9*(e.width*(a.axisX.logarithmic?Math.log(h)/Math.log(a.axisX.range):Math.abs(h)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&& -(this.dataPointMinWidth&&mm&&(h=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var s=0;sa.axisX.dataInfo.viewPortMax)&&!u(f[g].y)&&f[g].y.length&&"number"===typeof f[g].y[0]&&"number"===typeof f[g].y[1]){c=a.axisX.convertValueToPixel(w);m=a.axisY.convertValueToPixel(f[g].y[0]);l=a.axisY.convertValueToPixel(f[g].y[1]);var p=a.axisX.reversed?c+a.plotType.totalDataSeries*h/2-(a.previousDataSeriesCount+s)*h<<0:c-a.plotType.totalDataSeries*h/2+(a.previousDataSeriesCount+ -s)*h<<0,v=a.axisX.reversed?p-h<<0:p+h<<0,c=f[g].color?f[g].color:n._colorSet[g%n._colorSet.length];if(m>l){var t=m;m=l;l=t}t=n.dataPointIds[g];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:q,dataPointIndex:g,x1:p,y1:m,x2:v,y2:l};ea(b,p,m,v,l,c,0,c,k,k,!1,!1,n.fillOpacity);c=N(t);r&&ea(this._eventManager.ghostCtx,p,m,v,l,c,0,null,!1,!1,!1,!1);if(f[g].indexLabel||n.indexLabel||f[g].indexLabelFormatter||n.indexLabelFormatter)this._indexLabels.push({chartType:"rangeColumn", -dataPoint:f[g],dataSeries:n,indexKeyword:0,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?l:m},direction:f[g].y[1]>=f[g].y[0]?-1:1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c}),this._indexLabels.push({chartType:"rangeColumn",dataPoint:f[g],dataSeries:n,indexKeyword:1,point:{x:p+(v-p)/2,y:f[g].y[1]>=f[g].y[0]?m:l},direction:f[g].y[1]>=f[g].y[0]?1:-1,bounds:{x1:p,y1:Math.min(m,l),x2:v,y2:Math.max(m,l)},color:c})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation= -"source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderError= -function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx:d,c=a.axisY._position?"left"===a.axisY._position||"right"===a.axisY._position?!1:!0:!1;if(!(0>=a.dataSeriesIndexes.length)){var e=null,g=!1,m=this.plotArea,l=0,w,h,s,q,n,f,k,p=a.axisX.dataInfo.minDiff;isFinite(p)||(p=0.3*Math.abs(a.axisX.range));b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(m.x1,m.y1,m.width,m.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(m.x1, -m.y1,m.width,m.height),this._eventManager.ghostCtx.clip());for(var v=0,t=0;tl&&(e=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,l));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&ll&&(t=l);if(0=T.length?0:T.length>=t?t:T.length:"string"===typeof T.length?parseInt(T.length)*t/100>t?t:parseInt(T.length)*t/100>t:t;T.thickness="number"===typeof T.thickness?0>T.thickness?0:Math.round(T.thickness):2;var Y={color:y[l].stemColor?y[l].stemColor:y[l].color?z.stemColor?z.stemColor:y[l].color:z.stemColor?z.stemColor:e,thickness:y[l].stemThickness?y[l].stemThickness:z.stemThickness,dashType:y[l].stemDashType? -y[l].stemDashType:z.stemDashType};Y.thickness="number"===typeof Y.thickness?0>Y.thickness?0:Math.round(Y.thickness):2;y[l].getTime?k=y[l].x.getTime():k=y[l].x;if(!(ka.axisX.dataInfo.viewPortMax)&&!u(y[l].y)&&y[l].y.length&&"number"===typeof y[l].y[0]&&"number"===typeof y[l].y[1]){var ca=a.axisX.convertValueToPixel(k);c?h=ca:w=ca;ca=a.axisY.convertValueToPixel(y[l].y[0]);c?s=ca:n=ca;ca=a.axisY.convertValueToPixel(y[l].y[1]);c?q=ca:f=ca;c?(n=a.axisX.reversed?h+(A?v: -1)*t/2-(A?D-1:0)*t<<0:h-(A?v:1)*t/2+(A?D-1:0)*t<<0,f=a.axisX.reversed?n-t<<0:n+t<<0):(s=a.axisX.reversed?w+(A?v:1)*t/2-(A?D-1:0)*t<<0:w-(A?v:1)*t/2+(A?D-1:0)*t<<0,q=a.axisX.reversed?s-t<<0:s+t<<0);!c&&n>f&&(ca=n,n=f,f=ca);c&&s>q&&(ca=s,s=q,q=ca);ca=z.dataPointIds[l];this._eventManager.objectMap[ca]={id:ca,objectType:"dataPoint",dataSeriesIndex:x,dataPointIndex:l,x1:Math.min(s,q),y1:Math.min(n,f),x2:Math.max(q,s),y2:Math.max(f,n),isXYSwapped:c,stemProperties:Y,whiskerProperties:T};E(b,Math.min(s,q), -Math.min(n,f),Math.max(q,s),Math.max(f,n),e,T,Y,c);r&&E(this._eventManager.ghostCtx,s,n,q,f,e,T,Y,c);if(y[l].indexLabel||z.indexLabel||y[l].indexLabelFormatter||z.indexLabelFormatter)this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:0,point:{x:c?y[l].y[1]>=y[l].y[0]?s:q:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?f:n},direction:y[l].y[1]>=y[l].y[0]?-1:1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c}), -this._indexLabels.push({chartType:"error",dataPoint:y[l],dataSeries:z,indexKeyword:1,point:{x:c?y[l].y[1]>=y[l].y[0]?q:s:s+(q-s)/2,y:c?n+(f-n)/2:y[l].y[1]>=y[l].y[0]?n:f},direction:y[l].y[1]>=y[l].y[0]?1:-1,bounds:{x1:c?Math.min(s,q):s,y1:c?n:Math.min(n,f),x2:c?Math.max(s,q):q,y2:c?f:Math.max(n,f)},color:e,axisSwapped:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height), -a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(m.x1,m.y1,m.width,m.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeBar=function(a){var d=a.targetCanvasCtx||this.plotArea.ctx,b=r?this._preRenderCtx: -d;if(!(0>=a.dataSeriesIndexes.length)){var c=null,e=this.plotArea,g=0,m,l,w,h,g=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;m=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.height,0.9*(this.plotArea.height/a.plotType.totalDataSeries))<<0;var s=a.axisX.dataInfo.minDiff;isFinite(s)||(s=0.3*Math.abs(a.axisX.range));s=this.options.dataPointWidth?this.dataPointWidth:0.9* -(e.height*(a.axisX.logarithmic?Math.log(s)/Math.log(a.axisX.range):Math.abs(s)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&g>m&&(g=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,m));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&mm&&(s=m);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(e.x1,e.y1,e.width,e.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(), -this._eventManager.ghostCtx.rect(e.x1,e.y1,e.width,e.height),this._eventManager.ghostCtx.clip());for(var q=0;qa.axisX.dataInfo.viewPortMax)&&!u(k[g].y)&&k[g].y.length&&"number"===typeof k[g].y[0]&&"number"===typeof k[g].y[1]){m=a.axisY.convertValueToPixel(k[g].y[0]); -l=a.axisY.convertValueToPixel(k[g].y[1]);w=a.axisX.convertValueToPixel(h);w=a.axisX.reversed?w+a.plotType.totalDataSeries*s/2-(a.previousDataSeriesCount+q)*s<<0:w-a.plotType.totalDataSeries*s/2+(a.previousDataSeriesCount+q)*s<<0;var v=a.axisX.reversed?w-s<<0:w+s<<0;m>l&&(c=m,m=l,l=c);c=k[g].color?k[g].color:f._colorSet[g%f._colorSet.length];ea(b,m,w,l,v,c,0,null,p,!1,!1,!1,f.fillOpacity);c=f.dataPointIds[g];this._eventManager.objectMap[c]={id:c,objectType:"dataPoint",dataSeriesIndex:n,dataPointIndex:g, -x1:m,y1:w,x2:l,y2:v};c=N(c);r&&ea(this._eventManager.ghostCtx,m,w,l,v,c,0,null,!1,!1,!1,!1);if(k[g].indexLabel||f.indexLabel||k[g].indexLabelFormatter||f.indexLabelFormatter)this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:0,point:{x:k[g].y[1]>=k[g].y[0]?m:l,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?-1:1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c}),this._indexLabels.push({chartType:"rangeBar",dataPoint:k[g],dataSeries:f,indexKeyword:1,point:{x:k[g].y[1]>= -k[g].y[0]?l:m,y:w+(v-w)/2},direction:k[g].y[1]>=k[g].y[0]?1:-1,bounds:{x1:Math.min(m,l),y1:w,x2:Math.max(m,l),y2:v},color:c})}}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.clearRect(e.x1, -e.y1,e.width,e.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};p.prototype.renderRangeArea=function(a){function d(){if(C){var a=null;0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width,m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!s.connectNullData||!T)))if(null!==q[f].y&&q[f].y.length&&"number"===typeof q[f].y[0]&&"number"===typeof q[f].y[1]){k=a.axisX.convertValueToPixel(t);p=a.axisY.convertValueToPixel(q[f].y[0]);u=a.axisY.convertValueToPixel(q[f].y[1]);n||T?(s.connectNullData&&!n?(c.setLineDash&&(s.options.nullDataLineDashType||A===s.lineDashType&&s.lineDashType!==s.nullDataLineDashType)&&(w[w.length- -1].newLineDashArray=D,A=s.nullDataLineDashType,c.setLineDash(z)),c.lineTo(k,p),r&&e.lineTo(k,p),w.push({x:k,y:u})):(c.beginPath(),c.moveTo(k,p),C={x:k,y:p},w=[],w.push({x:k,y:u}),r&&(e.beginPath(),e.moveTo(k,p))),T=n=!1):(c.lineTo(k,p),w.push({x:k,y:u}),r&&e.lineTo(k,p),0==f%250&&d());t=s.dataPointIds[f];this._eventManager.objectMap[t]={id:t,objectType:"dataPoint",dataSeriesIndex:h,dataPointIndex:f,x1:k,y1:p,y2:u};fq[f].y[1]===a.axisY.reversed?-1:1,color:x}),this._indexLabels.push({chartType:"rangeArea",dataPoint:q[f],dataSeries:s,indexKeyword:1,point:{x:k, -y:u},direction:q[f].y[0]>q[f].y[1]===a.axisY.reversed?1:-1,color:x})}else T||n||d(),T=!0;d();ia.drawMarkers(g)}}r&&(b.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&c.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&c.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height),c.clearRect(m.x1,m.y1, -m.width,m.height),this._eventManager.ghostCtx.restore());c.restore();return{source:b,dest:this.plotArea.ctx,animationCallback:M.xClipAnimation,easingFunction:M.easing.linear,animationBase:0}}};p.prototype.renderRangeSplineArea=function(a){function d(a,b){var d=v(u,2);if(0=a.dataSeriesIndexes.length)){var e=this._eventManager.ghostCtx,g=[],m=this.plotArea;c.save();r&&e.save();c.beginPath();c.rect(m.x1,m.y1,m.width,m.height);c.clip();r&&(e.beginPath(),e.rect(m.x1,m.y1,m.width, -m.height),e.clip());for(var l=0;la.axisX.dataInfo.viewPortMax&&(!h.connectNullData||!f)))if(null!==k[q].y&&k[q].y.length&&"number"===typeof k[q].y[0]&&"number"===typeof k[q].y[1]){n=a.axisX.convertValueToPixel(n);f=a.axisY.convertValueToPixel(k[q].y[0]);p=a.axisY.convertValueToPixel(k[q].y[1]);var E=h.dataPointIds[q];this._eventManager.objectMap[E]={id:E,objectType:"dataPoint",dataSeriesIndex:w,dataPointIndex:q, -x1:n,y1:f,y2:p};u[u.length]={x:n,y:f};z[z.length]={x:n,y:p};q=a.dataSeriesIndexes.length)){var c=this._eventManager.ghostCtx,e=null,g=this.plotArea,m=0,l,k,h,s,q=a.axisY.convertValueToPixel(a.axisY.logarithmic?a.axisY.viewportMinimum:0),m=this.options.dataPointMinWidth?this.dataPointMinWidth:this.options.dataPointWidth?this.dataPointWidth:1;k=this.options.dataPointMaxWidth?this.dataPointMaxWidth:this.options.dataPointWidth?this.dataPointWidth:Math.min(0.15*this.width,0.9*(this.plotArea.width/a.plotType.totalDataSeries))<<0;var n= -a.axisX.dataInfo.minDiff;isFinite(n)||(n=0.3*Math.abs(a.axisX.range));n=this.options.dataPointWidth?this.dataPointWidth:0.6*(g.width*(a.axisX.logarithmic?Math.log(n)/Math.log(a.axisX.range):Math.abs(n)/Math.abs(a.axisX.range))/a.plotType.totalDataSeries)<<0;this.dataPointMaxWidth&&m>k&&(m=Math.min(this.options.dataPointWidth?this.dataPointWidth:Infinity,k));!this.dataPointMaxWidth&&(this.dataPointMinWidth&&kk&&(n=k);b.save();r&&this._eventManager.ghostCtx.save();b.beginPath();b.rect(g.x1,g.y1,g.width,g.height);b.clip();r&&(this._eventManager.ghostCtx.beginPath(),this._eventManager.ghostCtx.rect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.clip());for(var f=0;fh&&(e=k,k=h,h=e);a.axisY.reversed&&(e=k,k=h,h=e);e=u.dataPointIds[m];this._eventManager.objectMap[e]={id:e,objectType:"dataPoint",dataSeriesIndex:p,dataPointIndex:m,x1:l,y1:k,x2:F,y2:h}; -var T=v[m].color?v[m].color:0v[m].y===a.axisY.reversed?1:-1,bounds:{x1:l,y1:Math.min(k,h),x2:F,y2:Math.max(k,h)},color:e})}}r&&(d.drawImage(this._preRenderCanvas,0,0,this.width,this.height),b.globalCompositeOperation="source-atop",a.axisX.maskCanvas&&b.drawImage(a.axisX.maskCanvas,0,0,this.width,this.height),a.axisY.maskCanvas&&b.drawImage(a.axisY.maskCanvas,0,0,this.width,this.height),this._breaksCanvasCtx&&this._breaksCanvasCtx.drawImage(this._preRenderCanvas,0,0,this.width,this.height), -b.clearRect(g.x1,g.y1,g.width,g.height),this._eventManager.ghostCtx.restore());b.restore();return{source:d,dest:this.plotArea.ctx,animationCallback:M.fadeInAnimation,easingFunction:M.easing.easeInQuad,animationBase:0}}};var ja=function(a,d,b,c,e,g,m,l,k){if(!(0>b)){"undefined"===typeof l&&(l=1);if(!r){var h=Number((m%(2*Math.PI)).toFixed(8));Number((g%(2*Math.PI)).toFixed(8))===h&&(m-=1E-4)}a.save();a.globalAlpha=l;"pie"===e?(a.beginPath(),a.moveTo(d.x,d.y),a.arc(d.x,d.y,b,g,m,!1),a.fillStyle=c,a.strokeStyle= -"white",a.lineWidth=2,a.closePath(),a.fill()):"doughnut"===e&&(a.beginPath(),a.arc(d.x,d.y,b,g,m,!1),0<=k&&a.arc(d.x,d.y,k*b,m,g,!0),a.closePath(),a.fillStyle=c,a.strokeStyle="white",a.lineWidth=2,a.fill());a.globalAlpha=1;a.restore()}};p.prototype.renderPie=function(a){function d(){if(h&&s){for(var a=0,b=0,c=0,e=0,d=0;dMath.PI/2-t&&m.midAngle -m.midAngle)c=d;a++}else if(m.midAngle>3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t){if(0===b||f[e].midAngle>m.midAngle)e=d;b++}m.hemisphere=g>Math.PI/2&&g<=3*Math.PI/2?"left":"right";m.indexLabelTextBlock=new ka(k.plotArea.ctx,{fontSize:m.indexLabelFontSize,fontFamily:m.indexLabelFontFamily,fontColor:m.indexLabelFontColor,fontStyle:m.indexLabelFontStyle,fontWeight:m.indexLabelFontWeight,horizontalAlign:"left",backgroundColor:m.indexLabelBackgroundColor,maxWidth:m.indexLabelMaxWidth,maxHeight:m.indexLabelWrap? -5*m.indexLabelFontSize:1.5*m.indexLabelFontSize,text:m.indexLabelText,padding:0,textBaseline:"top"});m.indexLabelTextBlock.measureText()}l=g=0;q=!1;for(d=0;dMath.PI/2-t&&m.midAngle3*Math.PI/2-t&&m.midAngle<3*Math.PI/2+t)&&(l<=b/2&&!q?(m.hemisphere="left",l++):(m.hemisphere="right",q=!0))}}function b(a){var b= -k.plotArea.ctx;b.clearRect(n.x1,n.y1,n.width,n.height);b.fillStyle=k.backgroundColor;b.fillRect(n.x1,n.y1,n.width,n.height);for(b=0;bc){var d=0.07*A*Math.cos(f[b].midAngle),g=0.07*A*Math.sin(f[b].midAngle),m=!1;if(s[b].exploded){if(1E-9a.indexLabelTextBlock.y?d-e:c-f}function e(a){for(var b=null,e=1;ec(f[b],f[a])||("right"===f[a].hemisphere?f[b].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y:f[b].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y)))break;else b=null;return b}function g(a,b,d){d=(d||0)+1;if(1E3< -d)return 0;b=b||0;var m=0,h=x.y-1*r,l=x.y+1*r;if(0<=a&&ab&&n.indexLabelTextBlock.yl)return 0;var k=0,q=0,q=k=k=0;0>b?n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2>h&&n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2+bl&&(b=n.indexLabelTextBlock.y+ -n.indexLabelTextBlock.height/2+b-l);b=n.indexLabelTextBlock.y+b;h=0;h="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(b-x.y,2));q=x.x+A*Math.cos(n.midAngle);k=x.y+A*Math.sin(n.midAngle);k=Math.sqrt(Math.pow(h-q,2)+Math.pow(b-k,2));q=Math.acos(A/r);k=Math.acos((r*r+A*A-k*k)/(2*A*r));b=kc(f[h],f[a])||("right"===f[a].hemisphere?f[h].indexLabelTextBlock.y<=f[a].indexLabelTextBlock.y:f[h].indexLabelTextBlock.y>=f[a].indexLabelTextBlock.y)))break;else h=null;q=h;k=e(a);l=h=0;0>b?(l="right"===n.hemisphere?q:k,m=b,null!==l&&(q=-b,b=n.indexLabelTextBlock.y-n.indexLabelTextBlock.height/2-(f[l].indexLabelTextBlock.y+f[l].indexLabelTextBlock.height/2),b-q+h.toFixed(C)&&(m=b>p?-(b-p):-(q-(l-h)))))):0p?b-p:q-(h-l)))));m&&(d=n.indexLabelTextBlock.y+m,b=0,b="right"===n.hemisphere?x.x+Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)):x.x-Math.sqrt(Math.pow(r,2)-Math.pow(d-x.y,2)),n.midAngle>Math.PI/2-t&&n.midAngleh.indexLabelTextBlock.x?b=h.indexLabelTextBlock.x-15:"right"===n.hemisphere&&("left"===a.hemisphere&&b3*Math.PI/2-t&&n.midAngle<3*Math.PI/2+t&&(h=(a-1+f.length)%f.length,h=f[h],a=f[(a+1+f.length)%f.length],"right"===n.hemisphere&&"left"===h.hemisphere&&ba.indexLabelTextBlock.x)&&(b=a.indexLabelTextBlock.x- -15)),n.indexLabelTextBlock.y=d,n.indexLabelTextBlock.x=b,n.indexLabelAngle=Math.atan2(n.indexLabelTextBlock.y-x.y,n.indexLabelTextBlock.x-x.x))}return m}function m(){var a=k.plotArea.ctx;a.fillStyle="grey";a.strokeStyle="grey";a.font="16px Arial";a.textBaseline="middle";for(var b=a=0,d=0,m=!0,b=0;10>b&&(1>b||0z){for(var E=u=0,H=0;Hu?l.indexLabelText="":l.indexLabelTextBlock.maxWidth=0.85*u,0.3*l.indexLabelTextBlock.maxWidthd&&(d=y)),y=y=0,0d&&(d=y)));var K=function(a, -b,c){for(var e=[],d=0;e.push(f[b]),b!==c;b=(b+1+s.length)%s.length);e.sort(function(a,b){return a.y-b.y});for(b=0;bz){n=t.indexLabelTextBlock.x;var k=t.indexLabelTextBlock.y-t.indexLabelTextBlock.height/ -2,w=t.indexLabelTextBlock.y+t.indexLabelTextBlock.height/2,p=h.indexLabelTextBlock.y-h.indexLabelTextBlock.height/2,u=h.indexLabelTextBlock.x+h.indexLabelTextBlock.width,r=h.indexLabelTextBlock.y+h.indexLabelTextBlock.height/2;n=t.indexLabelTextBlock.x+t.indexLabelTextBlock.widthu+q||k>r+q||wa&&(a=l),m!==a&&(b=m,d+=-z),0===l%Math.max(s.length/10,3)&&(g=!0)):g=!0;g&&(0=a.dataSeriesIndexes.length)){var h= -this.data[a.dataSeriesIndexes[0]],s=h.dataPoints,q=10,n=this.plotArea,f=h.dataPointEOs,p=2,r,v=1.3,t=20/180*Math.PI,C=6,x={x:(n.x2+n.x1)/2,y:(n.y2+n.y1)/2},z=0;a=!1;for(var y=0;ya&&(e=a,d=!0);var g=s[b].color?s[b].color:h._colorSet[b%h._colorSet.length];e>c&&ja(k.plotArea.ctx, -f[b].center,f[b].radius,g,h.type,c,e,h.fillOpacity,f[b].percentInnerRadius);if(d)break}l()},function(){k.disableToolTip=!1;k._animator.animate(0,k.animatedRender?500:0,function(a){b(a);l()})})}}};var ra=function(a,d,b,c){"undefined"===typeof b&&(b=1);0>=Math.round(d.y4-d.y1)||(a.save(),a.globalAlpha=b,a.beginPath(),a.moveTo(Math.round(d.x1),Math.round(d.y1)),a.lineTo(Math.round(d.x2),Math.round(d.y2)),a.lineTo(Math.round(d.x3),Math.round(d.y3)),a.lineTo(Math.round(d.x4),Math.round(d.y4)),"undefined"!== -d.x5&&(a.lineTo(Math.round(d.x5),Math.round(d.y5)),a.lineTo(Math.round(d.x6),Math.round(d.y6))),a.closePath(),a.fillStyle=c?c:d.color,a.fill(),a.globalAplha=1,a.restore())};p.prototype.renderFunnel=function(a){function d(){for(var a=0,b=[],c=0;ck?(k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=0==k?0:a/k,h+=a/k,m=!0):(n=(Math.abs(ba)*b-Math.sqrt(k))/2,k=b-2*n/Math.abs(ba),h+=n,h>d&&(h-=n, -k=c,m=(b+k)*(d-h)/2,a-=m,n=d-h,h+=d-h,n+=a/k,h+=a/k,m=!0),b=k)),e.push(n);return e}function c(){if(t&&C){for(var a,b,c,e,d,g,l,h,m,n,k,q,s,w,p=[],B=[],x={percent:null,total:null},v=null,y=0;yp[y]&&(p[y]=y!==fa?t.reversed?P[y].x3-P[y].x4:P[y].x2-P[y].x1:P[y].x2-P[y].x1,p[y]/=2));s=b.indexLabelMaxWidth?b.indexLabelMaxWidth:t.options.indexLabelMaxWidth?t.indexLabelMaxWidth:p[y];if(s>p[y]||0>s)s=p[y];B[y]="inside"===t.indexLabelPlacement?P[y].height:!1;x=z.getPercentAndTotal(t,b);if(t.indexLabelFormatter||b.indexLabelFormatter)v={chart:z.options,dataSeries:t,dataPoint:b,total:x.total,percent:x.percent};b=b.indexLabelFormatter?b.indexLabelFormatter(v):b.indexLabel? -z.replaceKeywordsWithValue(b.indexLabel,b,t,y):t.indexLabelFormatter?t.indexLabelFormatter(v):t.indexLabel?z.replaceKeywordsWithValue(t.indexLabel,b,t,y):b.label?b.label:"";0>=n&&(n=0);1E3>s&&1E3-sl?l:t.indexLabelMaxWidth:l,h=J.length-1;0<=h;h--){g=C[J[h].id];c=J[h];e=c.textBlock;b=(a=n(h)b.y&&(d=!0);c=g.indexLabelMaxWidth||l;if(c>l||0>c)c=l;f.push(c)}if(d)for(h=J.length-1;0<=h;h--)a=P[h],J[h].textBlock.maxWidth= -f[f.length-(h+1)],J[h].textBlock.measureText(),J[h].textBlock.x=L-l,c=J[h].textBlock.heightpa+D&&(J[h].textBlock.y=pa+D-J[h].height),J[h].textBlock.ywa+D&&(J[h].textBlock.y=wa+D-J[h].height))}function g(){var a,b,c,e;if("inside"!==t.indexLabelPlacement)for(var d=0;dDa?f(c).x2+1:(a.x2+a.x3)/2+1:(a.x2+a.x3)/2+1:"undefined"!==typeof a.x5?cpa+D&&(J[d].textBlock.y=pa+D-J[d].height),J[d].textBlock.ywa+D&&(J[d].textBlock.y=wa+D-J[d].height)));else for(d=0;d=c?(b=d!=fa?(a.x4+a.x3)/2-e/2:(a.x5+a.x4)/2-e/2,c=d!=fa?(a.y1+a.y3)/2-c/2:(a.y1+a.y4)/2-c/2,J[d].textBlock.x=b, -J[d].textBlock.y=c):J[d].isDirty=!0)}function m(){function a(b,c){var d;if(0>b||b>=J.length)return 0;var e,f=J[b].textBlock;if(0>c){c*=-1;e=q(b);d=l(e,b);if(d>=c)return f.y-=c,c;if(0==b)return 0=c)return f.y+=c,c;if(b==P.length-1)return 0e)&&(l=n(s),!(l>=J.length-1)&&J[s].textBlock.y+J[s].height+ga>J[l].textBlock.y&&(J[s].textBlock.y=J[s].textBlock.y+J[s].height-e>e-J[s].textBlock.y?e+1:e-J[s].height-1))}for(l=P.length-1;0e&&(e=0,J[e].isDirty))break;if(J[l].textBlock.y=f){f=0;h+=J[f].height;break}e=q(f); -if(0>e){f=0;h+=J[f].height;break}}if(f!=l){g=J[f].textBlock.y;a-=g;a=h-a;g=c(a,d,f);break}}}return g}function c(a,b,d){var e=[],f=0,g=0;for(a=Math.abs(a);d<=b;d++)e.push(P[d]);e.sort(function(a,b){return a.height-b.height});for(d=0;d+m.y.toFixed(6))&&(d=g.y+d+ga-m.y,e=a(w,-d),ea?t.reversed?wa-D:pa-D:J[a].textBlock.y+J[a].height+ga)}function k(a,b,c){var d,e,f,l=[],m=D,n=[];-1!==b&&(0<=W.indexOf(b)?(e=W.indexOf(b),W.splice(e,1)):(W.push(b),W=W.sort(function(a,b){return a-b})));if(0===W.length)l= -ia;else{e=D*(1!=W.length||0!=W[0]&&W[0]!=P.length-1?2:1)/h();for(var q=0;qn&&(n*=-1),c.y1+=b-n[d],c.y2+=b-n[d],c.y3+=b-n[d],c.y4+=b-n[d],c.y5&&(c.y5+=b-n[d],c.y6+=b-n[d]),n[d]=b}};a._animator.animate(0,c,function(c){var d=a.plotArea.ctx||a.ctx;ja=!0;d.clearRect(x.x1,x.y1,x.x2-x.x1,x.y2-x.y1);d.fillStyle=a.backgroundColor;d.fillRect(x.x1,x.y1,x.width,x.height);w.changeSection(c,b);var e={};e.dataSeries=t;e.dataPoint=t.reversed?t.dataPoints[C.length-1-b]:t.dataPoints[b];e.index=t.reversed?C.length-1-b:b;a.toolTip.highlightObjects([e]); -for(e=0;ea){b=P[c];break}return b?(a=b.y6?a>b.y6?b.x3+(b.x4-b.x3)/(b.y4-b.y3)*(a-b.y3):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2):b.x2+(b.x3-b.x2)/(b.y3-b.y2)*(a-b.y2), -{x1:a,x2:a}):-1}function p(a){for(var b=0;b=a.dataSeriesIndexes.length)){for(var t=this.data[a.dataSeriesIndexes[0]],C=t.dataPoints,x=this.plotArea,D=0.025*x.width,y=0.01*x.width,A=0,F=x.height-2*D,E=Math.min(x.width-2*y,2.8*x.height),H=!1,I=0;IF?N=F:0>=N&&(N=0),G>a?G=a-0.5:0>=G&&(G=0)):"pyramid"===t.type&&(G=N=0,t.reversed=t.reversed?!1:!0);var y=I+a/2,$=I,V=I+a,pa=t.reversed?Z:O,K=y-G/2,ea=y+G/2,Da=t.reversed?O+N:Z- -N,wa=t.reversed?O:Z;a=[];var y=[],P=[],E=[],X=O,fa,ba=(Da-pa)/(K-$),ha=-ba,I="area"===(t.valueRepresents?t.valueRepresents:"height")?b():d();if(-1!==I){if(t.reversed)for(E.push(X),G=I.length-1;0a&&(A=a));for(G=0;G\n');c.document.close();setTimeout(function(){c.focus();c.print();setTimeout(function(){b._canvasJSContainer.removeChild(d)},1E3)},500)};p.prototype.getPercentAndTotal=function(a,d){var b=null,c=null, -e=null;if(0<=a.type.indexOf("stacked"))c=0,b=d.x.getTime?d.x.getTime():d.x,b in a.plotUnit.yTotals&&(c=a.plotUnit.yTotals[b],e=isNaN(d.y)?0:100*(d.y/c));else if("pie"===a.type||"doughnut"===a.type||"funnel"===a.type||"pyramid"===a.type){for(b=c=0;b=m||"undefined"=== -typeof m||0>=v||"undefined"===typeof v)){if("horizontal"===this.orientation){n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:v,maxHeight:this.itemWrap?m:this.lineHeight,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"});n.textBlock.measureText();null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"=== -n.chartType?2*0.1*this.lineHeight:0)));if(!q||q.width+Math.round(n.textBlock.width+r+l+(0===q.width?0:this.horizontalSpacing)+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))>g)q={items:[],width:0},h.push(q),this.height+=f,f=0;f=Math.max(f,n.textBlock.height)}else n.textBlock=new ka(this.ctx,{x:0,y:0,maxWidth:x,maxHeight:!0===this.itemWrap?m:1.5*this.fontSize,angle:0,text:n.text,horizontalAlign:"left",fontSize:this.fontSize,fontFamily:this.fontFamily, -fontWeight:this.fontWeight,fontColor:this.fontColor,fontStyle:this.fontStyle,textBaseline:"middle"}),n.textBlock.measureText(),null!==this.itemWidth&&(n.textBlock.width=this.itemWidth-(r+l+("line"===n.chartType||"spline"===n.chartType||"stepLine"===n.chartType?2*0.1*this.lineHeight:0))),this.height>0,0),this.dataPoints.length):0):(s=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,s=0>0,0),this.dataPoints.length):0));for(;;){g=0a?c.x/a:a/c.x: -Math.abs(c.x-a);qs-e&&s+e>=this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}return d||b.dataPoint.x!==a?d&&null!==b.dataPoint?b:null:b};F.prototype.getDataPointAtXY=function(a,d,b){if(!this.dataPoints||0===this.dataPoints.length||athis.chart.plotArea.x2||dthis.chart.plotArea.y2)return null;b=b||!1;var c=[],e=0,g=0,m=1,l=!1,k=Infinity, -h=0,s=0,q=0;if("none"!==this.chart.plotInfo.axisPlacement)if(q=(this.chart.axisX[0]?this.chart.axisX[0]:this.chart.axisX2[0]).getXValueAt({x:a,y:d}),this.axisX.logarithmic)var n=Math.log(this.dataPoints[this.dataPoints.length-1].x/this.dataPoints[0].x),q=1>0,0),this.dataPoints.length):0;else n=this.dataPoints[this.dataPoints.length-1].x-this.dataPoints[0].x,q=0> -0,0),this.dataPoints.length):0;for(;;){g=0=n.x1&&(a<=n.x2&&d>=n.y1&&d<=n.y2)&&(c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1- -a),Math.abs(n.x2-a),Math.abs(n.y1-d),Math.abs(n.y2-d))}),l=!0);break;case "line":case "stepLine":case "spline":case "area":case "stepArea":case "stackedArea":case "stackedArea100":case "splineArea":case "scatter":var u=na("markerSize",f,this)||4,r=b?20:u,p=Math.sqrt(Math.pow(n.x1-a,2)+Math.pow(n.y1-d,2));p<=r&&c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:p});n=Math.abs(n.x1-a);n<=k?k=n:0r&&(p=Math.atan2(d-u.y,a-u.x),0>p&&(p+=2*Math.PI),p=Number(((180*(p/Math.PI)%360+360)%360).toFixed(12)),u=Number(((180*(n.startAngle/Math.PI)%360+360)%360).toFixed(12)),r=Number(((180*(n.endAngle/Math.PI)%360+360)%360).toFixed(12)),0===r&&1=r&&0!==f.y&&(r+=360,pu&&pp.y1&&dp.y6?(g=p.x6+(p.x5-p.x6)/(p.y5-p.y6)*(d-p.y6),p=p.x3+(p.x4-p.x3)/(p.y4-p.y3)*(d-p.y3)):(g=p.x1+(p.x6-p.x1)/(p.y6-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)):(g=p.x1+(p.x4-p.x1)/(p.y4-p.y1)*(d-p.y1),p=p.x2+(p.x3-p.x2)/(p.y3-p.y2)*(d-p.y2)),a>g&&a=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y4-n.borderThickness/2&&d<=n.y1+n.borderThickness/ -2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "candlestick":if(a>=n.x1-n.borderThickness/2&&a<=n.x2+n.borderThickness/2&&d>=n.y2-n.borderThickness/2&&d<=n.y3+n.borderThickness/2||Math.abs(n.x2-a+n.x1-a)=n.y1&&d<=n.y4)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a), -Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0;break;case "ohlc":if(Math.abs(n.x2-a+n.x1-a)=n.y2&&d<=n.y3||a>=n.x1&&a<=(n.x2+n.x1)/2&&d>=n.y1-n.borderThickness/2&&d<=n.y1+n.borderThickness/2||a>=(n.x1+n.x2)/2&&a<=n.x2&&d>=n.y4-n.borderThickness/2&&d<=n.y4+n.borderThickness/2)c.push({dataPoint:f,dataPointIndex:g,dataSeries:this,distance:Math.min(Math.abs(n.x1-a),Math.abs(n.x2-a),Math.abs(n.y2-d),Math.abs(n.y3-d))}),l=!0}if(l||1E3q-e&&q+e>= -this.dataPoints.length)break;-1===m?(e++,m=1):m=-1}a=null;for(d=0;dq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius, -horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle",borderThickness:0}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}f=n;for(b=this.intervalStartPosition;b<=e;b=parseFloat(1E-12>this.interval?this.logarithmic&&this.equidistantInterval?b*Math.pow(this.logarithmBase,this.interval):b+this.interval:(this.logarithmic&&this.equidistantInterval? -b*Math.pow(this.logarithmBase,this.interval):b+this.interval).toFixed(12))){for(;fq[f].endValue;f++);a=f=q[f].startValue&&b<=q[f].endValue;p=b;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:p,label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:ba(p,this.valueFormatString,this.chart._cultureInfo),a=new ka(this.ctx,{x:0,y:0,maxWidth:g,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix, -horizontalAlign:"left",backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null}))}}else for(this.intervalStartPosition=this.getLabelStartPoint(new Date(this.viewportMinimum), -this.intervalType,this.interval),e=Ya(new Date(this.viewportMaximum),this.interval,this.intervalType),f=n,b=this.intervalStartPosition;bq[f].endValue;f++);p=a;a=f=q[f].startValue&&a<=q[f].endValue;a||(a=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.options,value:new Date(p),label:this.labels[p]?this.labels[p]:null}):"axisX"===this.type&&this.labels[p]?this.labels[p]:Ca(p,this.valueFormatString,this.chart._cultureInfo), -a=new ka(this.ctx,{x:0,y:0,maxWidth:g,backgroundColor:this.labelBackgroundColor,borderColor:this.labelBorderColor,borderThickness:this.labelBorderThickness,cornerRadius:this.labelCornerRadius,maxHeight:m,angle:this.labelAngle,text:this.prefix+a+this.suffix,horizontalAlign:"left",fontSize:this.labelFontSize,fontFamily:this.labelFontFamily,fontWeight:this.labelFontWeight,fontColor:this.labelFontColor,fontStyle:this.labelFontStyle,textBaseline:"middle"}),this._labels.push({position:p,textBlock:a,effectiveHeight:null, -breaksLabelType:void 0}))}if("bottom"===this._position||"top"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.width*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length-2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.width/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+ -"Duration"]*this.interval,g="undefined"===typeof this.options.labelMaxWidth?0.5*this.chart.width>>0:this.options.labelMaxWidth,this.chart.panEnabled||(m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.8*this.chart.height>>0:1.5*this.labelFontSize);else if("left"===this._position||"right"===this._position)l=this.logarithmic&&!this.equidistantInterval&&2<=this._labels.length?this.lineCoordinates.height*Math.log(Math.min(this._labels[this._labels.length-1].position/this._labels[this._labels.length- -2].position,this._labels[1].position/this._labels[0].position))/Math.log(this.range):this.lineCoordinates.height/(this.logarithmic&&this.equidistantInterval?Math.log(this.range)/Math.log(this.logarithmBase):Math.abs(this.range))*S[this.intervalType+"Duration"]*this.interval,this.chart.panEnabled||(g="undefined"===typeof this.options.labelMaxWidth?0.3*this.chart.width>>0:this.options.labelMaxWidth),m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize; -for(c=0;cthis.labelAngle?this.labelAngle-=180:270<=this.labelAngle&&360>=this.labelAngle&&(this.labelAngle-=360)),"bottom"===this._position||"top"===this._position)if(g=0.9*l>>0,n=0,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize= -this.labelFontSize;this.sessionVariables.labelMaxWidth=g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=this.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;bn&&(v=b,n=p.width)}b=0;for(b=this.intervalStartPosition< -this.viewportMinimum?1:0;b>0>2*g&&(this.sessionVariables.labelAngle=-25)):(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle):u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelMaxWidth= -g,B.width+d.width>>0>2*g&&(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p)):(this.sessionVariables.labelAngle=this.sessionVariables.labelMaxWidth>g?-25:this.sessionVariables.labelAngle,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=this.labelWrap);else{if(u(this.options.labelWrap))if(!u(this.options.labelMaxWidth))this.options.labelMaxWidth>0,f=this.labelFontSize,nq&&(q=c-2*g,c>=2*g&&c<2.2*g?(this.sessionVariables.labelMaxWidth=g,u(this.options.labelFontSize)&&12=2.2*g&&c<2.8*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=f):c>=2.8*g&&c<3.2*g?(this.sessionVariables.labelMaxWidth=Math.max(g,n),this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12=3.2*g&&c<3.6*g?(this.sessionVariables.labelAngle=-25,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelFontSize=this.labelFontSize):c>3.6*g&&c<5*g?(u(this.options.labelFontSize)&&125*g&&(this.sessionVariables.labelWrap=!0,this.sessionVariables.labelMaxWidth=g,this.sessionVariables.labelFontSize=f,this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelAngle=this.labelAngle));else if(v===b&&(0===v&&n+this._labels[v+1].textBlock.measureText().width-2*g>q||v===this._labels.length-1&&n+this._labels[v-1].textBlock.measureText().width-2*g>q||0q&&n+this._labels[v-1].textBlock.measureText().width- -2*g>q))q=0===v?n+this._labels[v+1].textBlock.measureText().width-2*g:n+this._labels[v-1].textBlock.measureText().width-2*g,this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelAngle=-25,this.sessionVariables.labelMaxWidth=p;else if(0===q)for(this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?f:this.options.labelFontSize,this.sessionVariables.labelWrap=!0,c=0;c>0>2*g&&(this.sessionVariables.labelAngle=-25))}else(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:Math.min((c-g*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/ -Math.sin(Math.PI/180*Math.abs(this.labelAngle)),c),p=0!=this.labelAngle?(h-(k+a.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)))/Math.sin(Math.PI/180*Math.abs(this.labelAngle)):g,this.sessionVariables.labelMaxHeight=m=this.labelWrap?(h-p*Math.sin(Math.PI/180*Math.abs(this.labelAngle)))/Math.cos(Math.PI/180*Math.abs(this.labelAngle)):1.5*this.labelFontSize,u(this.options.labelWrap))?u(this.options.labelWrap)&&(this.labelWrap&&!u(this.options.labelMaxWidth)?(this.sessionVariables.labelWrap= -this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelMaxHeight=m):(this.sessionVariables.labelAngle=this.labelAngle,this.sessionVariables.labelMaxWidth=p,this.sessionVariables.labelMaxHeight=c<0.9*l?0.9*l:c,this.sessionVariables.labelWrap=this.labelWrap)):(this.options.labelWrap?(this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p): -(u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:p,this.sessionVariables.labelWrap=this.labelWrap),this.sessionVariables.labelMaxHeight=m)}for(c=0;c>0:this.options.labelMaxWidth,m="undefined"===typeof this.options.labelWrap||this.labelWrap?0.3*this.chart.height>>0:1.5*this.labelFontSize,!this.chart.panEnabled&&1<=this._labels.length){this.sessionVariables.labelFontSize=this.labelFontSize;this.sessionVariables.labelMaxWidth= -g;this.sessionVariables.labelMaxHeight=m;this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle;this.sessionVariables.labelWrap=this.labelWrap;for(b=0;b>0,l-2*m>n&&(n=l-2*m,l>=2*m&&l<2.4*m?(u(this.options.labelFontSize)&&12=2.4*m&&l<2.8*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelFontSize=this.labelFontSize,this.sessionVariables.labelWrap=!0):l>=2.8*m&&l<3.2*m?(this.sessionVariables.labelMaxHeight=m,this.sessionVariables.labelWrap=!0,u(this.options.labelFontSize)&&12< -this.labelFontSize&&(this.labelFontSize=Math.floor(12/13*this.labelFontSize),a.measureText()),this.sessionVariables.labelFontSize=u(this.options.labelFontSize)?this.labelFontSize:this.options.labelFontSize,this.sessionVariables.labelAngle=u(this.sessionVariables.labelAngle)?0:this.sessionVariables.labelAngle):l>=3.2*m&&l<3.6*m?(this.sessionVariables.labelMaxHeight=c,this.sessionVariables.labelWrap=!0,this.sessionVariables.labelFontSize=this.labelFontSize):l>3.6*m&&l<10*m?(u(this.options.labelFontSize)&& -1210*m&&l<50*m&&(u(this.options.labelFontSize)&&12this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxHeight=c):(this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:g,this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,u(this.options.labelMaxWidth)&& -(this.sessionVariables.labelAngle=this.labelAngle))):this.options.labelWrap?(this.sessionVariables.labelMaxHeight=0===this.labelAngle?m:c,this.sessionVariables.labelWrap=this.labelWrap,this.sessionVariables.labelMaxWidth=g):(this.sessionVariables.labelMaxHeight=m,u(this.options.labelMaxWidth),this.sessionVariables.labelMaxWidth=this.options.labelMaxWidth?this.options.labelMaxWidth:this.sessionVariables.labelMaxWidth,this.sessionVariables.labelWrap=this.labelWrap)}for(c=0;c>0:1.5*this.labelFontSize;if("left"===this._position||"right"===this._position)z=u(g.options.labelWrap)?this.sessionVariables.labelMaxHeight:g.labelWrap?0.8*this.chart.width>>0:1.5*this.labelFontSize;u(g.labelBackgroundColor)&&(g.labelBackgroundColor="#EEEEEE")}else m="bottom"===this._position||"top"===this._position?0.9*this.chart.width>>0:0.9*this.chart.height>> -0,z=u(g.options.labelWrap)||g.labelWrap?"bottom"===this._position||"top"===this._position?0.8*this.chart.width>>0:0.8*this.chart.height>>0:1.5*this.labelFontSize,u(g.labelBackgroundColor)&&(u(g.startValue)&&0!==g.startValue?g.labelBackgroundColor=r?"transparent":null:g.labelBackgroundColor="#EEEEEE");a=new ka(this.ctx,{x:0,y:0,backgroundColor:g.labelBackgroundColor,borderColor:g.labelBorderColor,borderThickness:g.labelBorderThickness,cornerRadius:g.labelCornerRadius,maxWidth:g.options.labelMaxWidth? -g.options.labelMaxWidth:m,maxHeight:z,angle:this.labelAngle,text:g.labelFormatter?g.labelFormatter({chart:this.chart,axis:this,stripLine:g}):g.label,horizontalAlign:"left",fontSize:"outside"===g.labelPlacement?g.options.labelFontSize?g.labelFontSize:this.labelFontSize:g.labelFontSize,fontFamily:"outside"===g.labelPlacement?g.options.labelFontFamily?g.labelFontFamily:this.labelFontFamily:g.labelFontFamily,fontWeight:"outside"===g.labelPlacement?g.options.labelFontWeight?g.labelFontWeight:this.labelFontWeight: -g.labelFontWeight,fontColor:g.labelFontColor||g.color,fontStyle:"outside"===g.labelPlacement?g.options.labelFontStyle?g.labelFontStyle:this.fontWeight:g.labelFontStyle,textBaseline:"middle"});this._stripLineLabels.push({position:g.value,textBlock:a,effectiveHeight:null,stripLine:g})}};z.prototype.createLabelsAndCalculateWidth=function(){var a=0,d=0;this._labels=[];this._stripLineLabels=[];var b=this.chart.isNavigator?0:5;if("left"===this._position||"right"===this._position){this.createLabels();for(d= -0;d=this.viewportMinimum&&this._stripLineLabels[d].stripLine.value<=this.viewportMaximum)&& -(c=this._stripLineLabels[d].textBlock,e=c.measureText(),g=0===this.labelAngle?e.width:e.width*Math.cos(Math.PI/180*Math.abs(this.labelAngle))+(e.height-c.fontSize/2)*Math.sin(Math.PI/180*Math.abs(this.labelAngle)),a=this.viewportMinimum&&this._stripLineLabels[b].stripLine.value<=this.viewportMaximum)&&(d=this._stripLineLabels[b].textBlock,e=d.measureText(),g=0===this.labelAngle?e.height:e.width*Math.sin(Math.PI/180*Math.abs(this.labelAngle))+(e.height-d.fontSize/2)*Math.cos(Math.PI/180*Math.abs(this.labelAngle)),an[f].viewportMaximum);v++)r[v].endValue=n[f].viewPortMinimum&&(n[f].scaleBreaks.lastBreakIndex=v));for(var z=v=0,t=0,C=0,x=0,D=0,y=0,A,E,F=l=0,H,I,L,r=H=I=L=!1,f=0;fv;){var G=0,R=0,S=0,U=0,W=e=0,K=0,$=0,V=0,X=0,P=0,ba=0;if(b&& -0p.width- -q?p.width-q:g.x2-ba-$);if(a&&0p.width-q?p.width-q:g.x2-ba-$),a[f]._labels&&1k&&(l+=0a[f].labelAngle?A-zk&&(l=E+t/2-k-ba),A-za[f].labelAngle&&0p.width-q?p.width-q:g.x2-ba-$),d[f].lineCoordinates.width=Math.abs(k-m),d[f]._labels&&1v;){V=U=R=S=$=K=W=e=Q=O=G=X=0;if(a&&0p.width-10?p.width-10:g.x2-V-W),b[f].labelAutoFit&&!u(C)&&(0b[f].labelAngle?Math.max(m,C):0===b[f].labelAngle? -Math.max(m,C/2):m),0c[f].chart.width-10?c[f].chart.width-10:g.x2-V-W),c[f]&& -c[f].labelAutoFit&&!u(D)&&(0b[f].chart.height-10?b[f].chart.height-10:g.y2),b[f].lineCoordinates.y1=l-(q[f]+b[f].margin+ -X),b[f].lineCoordinates.y2=l-(q[f]+b[f].margin+X),b[f].bounds={x1:m,y1:l-(q[f]+X+b[f].margin),x2:k,y2:h-(X+b[f].margin),width:k-m,height:q[f]},b[f].title&&(b[f]._titleTextBlock.maxWidth=0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0===b[K].labelAngle?k-U:m);if(c&&0p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2-S):g.y2>p.height-Math.max(K,10)?p.height-Math.max(K,10):g.y2;if(b&&0b[K].labelAngle?Math.max(k,C):0===b[K].labelAngle?Math.max(k,C/2):k,m=0>b[K].labelAngle||0=== -b[K].labelAngle?k-V:m);if(c&&0d[g].spacing?0:Math.abs(d[g].spacing/b),this.logarithmic&&(d[g].size=Math.pow(this.logarithmBase,d[g].size))};z.prototype.calculateBreaksInPixels=function(){if(!(this.scaleBreaks&&0>=this.scaleBreaks._appliedBreaks.length)){var a=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];a.length&&(this.scaleBreaks.firstBreakIndex=this.scaleBreaks.lastBreakIndex=null);for(var d=0;dthis.conversionParameters.maximum);d++)a[d].endValue< -this.conversionParameters.minimum||(u(this.scaleBreaks.firstBreakIndex)&&(this.scaleBreaks.firstBreakIndex=d),a[d].startValue>=this.conversionParameters.minimum&&(a[d].startPixel=this.convertValueToPixel(a[d].startValue),this.scaleBreaks.lastBreakIndex=d),a[d].endValue<=this.conversionParameters.maximum&&(a[d].endPixel=this.convertValueToPixel(a[d].endValue)))}};z.prototype.renderLabelsTicksAndTitle=function(){var a=this,d=!1,b=0,c=0,e=1,g=0;0!==this.labelAngle&&360!==this.labelAngle&&(e=1.2);if("undefined"=== -typeof this.options.interval){if("bottom"===this._position||"top"===this._position)if(this.logarithmic&&!this.equidistantInterval&&this.labelAutoFit){for(var b=[],e=0!==this.labelAngle&&360!==this.labelAngle?1:1.2,m,l=this.viewportMaximum,k=this.lineCoordinates.width/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||mthis.lineCoordinates.width*e&&this.labelAutoFit&&(d=!0)}if("left"===this._position||"right"===this._position)if(this.logarithmic&& -!this.equidistantInterval&&this.labelAutoFit){for(var b=[],p,l=this.viewportMaximum,k=this.lineCoordinates.height/Math.log(this.range),h=this._labels.length-1;0<=h;h--){q=this._labels[h];if(q.positionthis.viewportMaximum||!(h===this._labels.length-1||pthis.lineCoordinates.height*e&&this.labelAutoFit&&(d=!0)}}this.logarithmic&&(!this.equidistantInterval&&this.labelAutoFit)&&this._labels.sort(function(a,b){return a.position-b.position});var h=0,q,n;if("bottom"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y+this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? -n.y-(this.tickLength+q.textBlock.fontSize/2):n.y+this.tickLength+q.textBlock.fontSize/2):(n.x="inside"===this.labelPlacement?0>this.labelAngle?n.x:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):n.x-(0>this.labelAngle?q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0),n.y="inside"===this.labelPlacement?0>this.labelAngle?n.y-this.tickLength-5:n.y-this.tickLength-Math.abs(q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle)+5):n.y+this.tickLength+Math.abs(0>this.labelAngle?q.textBlock.width* -Math.sin(Math.PI/180*this.labelAngle)-5:5)),q.textBlock.x=n.x,q.textBlock.y=n.y);"inside"===this.labelPlacement&&this.chart.addEventListener("dataAnimationIterationEnd",function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save(); -a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y-a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y2-this._titleTextBlock.height-3,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("top"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0,this.ctx.beginPath(),this.ctx.moveTo(c,n.y<<0),this.ctx.lineTo(c,n.y-this.tickLength<<0),this.ctx.stroke()),0===q.textBlock.angle?(n.x-=q.textBlock.width/2,n.y="inside"===this.labelPlacement? -n.y+this.labelFontSize/2+this.tickLength+5:n.y-(this.tickLength+q.textBlock.height-q.textBlock.fontSize/2)):(n.x="inside"===this.labelPlacement?0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&& -(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===this.ctx.lineWidth%2?(n.x<<0)+0.5:n.x<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(b,n.y<<0);a.ctx.lineTo(b,n.y+a.tickLength<<0);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.lineCoordinates.x1+this.lineCoordinates.width/2-this._titleTextBlock.width/2,this._titleTextBlock.y=this.bounds.y1+1,this.titleMaxWidth= -this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("left"===this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<< -0,c),this.ctx.lineTo(n.x-this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle?(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5):(q.textBlock.y="inside"===this.labelPlacement?n.y:n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x+this.tickLength+5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness; -a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x+a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x1+1,this._titleTextBlock.y=this.lineCoordinates.height/2+this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}else if("right"=== -this._position){for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||(n=this.getPixelCoordinatesOnAxis(q.position),this.tickThickness&&"inside"!=this.labelPlacement&&(this.ctx.lineWidth=this.tickThickness,this.ctx.strokeStyle=this.tickColor,c=1===this.ctx.lineWidth%2?(n.y<<0)+0.5:n.y<<0,this.ctx.beginPath(),this.ctx.moveTo(n.x<<0,c),this.ctx.lineTo(n.x+this.tickLength<<0,c),this.ctx.stroke()),0===this.labelAngle? -(q.textBlock.y=n.y,q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width-this.tickLength-5:n.x+this.tickLength+5):(q.textBlock.y="inside"===this.labelPlacement?n.y-q.textBlock.width*Math.sin(Math.PI/180*this.labelAngle):0>this.labelAngle?n.y:n.y-(q.textBlock.height-q.textBlock.fontSize/2-5)*Math.cos(Math.PI/180*this.labelAngle),q.textBlock.x="inside"===this.labelPlacement?n.x-q.textBlock.width*Math.cos(Math.PI/180*this.labelAngle)-this.tickLength-5:0a.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)&&(n=a.getPixelCoordinatesOnAxis(q.position),a.tickThickness)){a.ctx.lineWidth=a.tickThickness;a.ctx.strokeStyle=a.tickColor;var b=1===a.ctx.lineWidth%2?(n.y<< -0)+0.5:n.y<<0;a.ctx.save();a.ctx.beginPath();a.ctx.moveTo(n.x<<0,b);a.ctx.lineTo(n.x-a.tickLength<<0,b);a.ctx.stroke();a.ctx.restore()}},this);this.title&&(this._titleTextBlock.measureText(),this._titleTextBlock.x=this.bounds.x2-1,this._titleTextBlock.y=this.lineCoordinates.height/2-this._titleTextBlock.width/2+this.lineCoordinates.y1,this.titleMaxWidth=this._titleTextBlock.maxWidth,this._titleTextBlock.render(!0))}g=0;if("inside"===this.labelPlacement)this.chart.addEventListener("dataAnimationIterationEnd", -function(){for(h=0;ha.viewportMaximum||d&&0!==g++%2&&a.labelAutoFit)||(a.ctx.save(),a.ctx.beginPath(),q.textBlock.render(!0),a.ctx.restore())},this);else for(h=0;hthis.viewportMaximum||d&&0!==g++%2&&this.labelAutoFit)||q.textBlock.render(!0)};z.prototype.renderInterlacedColors=function(){var a=this.chart.plotArea.ctx,d,b,c=this.chart.plotArea, -e=0;d=!0;if(("bottom"===this._position||"top"===this._position)&&this.interlacedColor)for(a.fillStyle=this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(Math.min(b.x,d.x),c.y1,Math.abs(b.x-d.x),Math.abs(c.y1-c.y2)),d=!1):d=!0;else if(("left"===this._position||"right"===this._position)&&this.interlacedColor)for(a.fillStyle= -this.interlacedColor,e=0;ethis._labels.length-1?this.getPixelCoordinatesOnAxis(this.viewportMaximum):this.getPixelCoordinatesOnAxis(this._labels[e+1].position),a.fillRect(c.x1,Math.min(b.y,d.y),Math.abs(c.x1-c.x2),Math.abs(d.y-b.y)),d=!1):d=!0;a.beginPath()};z.prototype.renderStripLinesOfThicknessType=function(a){if(this.stripLines&&0this.viewportMaximum||u(h.value)||isNaN(this.range))||l.push(h))}for(c=0;cthis.viewportMaximum||isNaN(this.range))){a=this.getPixelCoordinatesOnAxis(b.position);if("outside"===b.stripLine.labelPlacement)if(h&&(this.ctx.strokeStyle= -h.color,"pixel"===h._thicknessType&&(this.ctx.lineWidth=h.thickness)),"bottom"===this._position){var p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0;this.ctx.beginPath();this.ctx.moveTo(p,a.y<<0);this.ctx.lineTo(p,a.y+this.tickLength<<0);this.ctx.stroke();0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y+=this.tickLength+b.textBlock.fontSize/2):(a.x-=0>this.labelAngle?b.textBlock.width*Math.cos(Math.PI/180*this.labelAngle):0,a.y+=this.tickLength+Math.abs(0>this.labelAngle?b.textBlock.width*Math.sin(Math.PI/ -180*this.labelAngle)-5:5))}else"top"===this._position?(p=1===this.ctx.lineWidth%2?(a.x<<0)+0.5:a.x<<0,this.ctx.beginPath(),this.ctx.moveTo(p,a.y<<0),this.ctx.lineTo(p,a.y-this.tickLength<<0),this.ctx.stroke(),0===this.labelAngle?(a.x-=b.textBlock.width/2,a.y-=this.tickLength+b.textBlock.height):(a.x+=(b.textBlock.height-this.tickLength-this.labelFontSize/2)*Math.sin(Math.PI/180*this.labelAngle)-(0this.labelAngle?a.y:a.y-(b.textBlock.height-b.textBlock.fontSize/ -2-5)*Math.cos(Math.PI/180*this.labelAngle),a.x=0this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/ -2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+=b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y1+b.textBlock.width+3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y2-b.textBlock.width-3:"center"=== -b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y1+3):"top"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.height-3,b.textBlock.measureText(),a.x-b.textBlock.height>this.chart.plotArea.x1?u(h.startValue)?a.x-=b.textBlock.height-b.textBlock.fontSize/2:a.x-=b.textBlock.height/2-b.textBlock.fontSize/2+3:(b.textBlock.angle=90,u(h.startValue)?a.x+= -b.textBlock.height-b.textBlock.fontSize/2:a.x+=b.textBlock.height/2-b.textBlock.fontSize/2+3),a.y=-90===b.textBlock.angle?"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+b.textBlock.width+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1+b.textBlock.width)/2:this.chart.plotArea.y2-3:"near"===b.stripLine.labelAlign?this.chart.plotArea.y1+3:"center"===b.stripLine.labelAlign?(this.chart.plotArea.y2+this.chart.plotArea.y1-b.textBlock.width)/2:this.chart.plotArea.y2- -b.textBlock.width-3):"left"===this._position?(b.textBlock.maxWidth=this.options.stripLines[c].labelMaxWidth?this.options.stripLines[c].labelMaxWidth:this.chart.plotArea.width-3,b.textBlock.angle=0,b.textBlock.measureText(),a.y-b.textBlock.height>this.chart.plotArea.y1?u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize+3:a.y-b.textBlock.heightthis.chart.plotArea.y1? -u(h.startValue)?a.y-=b.textBlock.height-b.textBlock.fontSize/2:a.y-=b.textBlock.height/2-b.textBlock.fontSize/2-3:a.y-b.textBlock.heightthis.viewportMaximum|| -isNaN(this.range))||a[d].render(this.maskCtx);this.maskCtx.restore()}};z.prototype.renderCrosshair=function(a,d){this.crosshair.render(a,d)};z.prototype.renderGrid=function(){if(this.gridThickness&&0this.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(),d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.x<<0)+0.5:d.x<<0,a.moveTo(d,b.y1<<0),a.lineTo(d,b.y2<<0),a.stroke());else if("left"===this._position||"right"===this._position)for(var c=0;cthis.viewportMaximum||this._labels[c].breaksLabelType)||(a.beginPath(), -d=this.getPixelCoordinatesOnAxis(this._labels[c].position),d=1===a.lineWidth%2?(d.y<<0)+0.5:d.y<<0,a.moveTo(b.x1<<0,d),a.lineTo(b.x2<<0,d),a.stroke());a.restore()}};z.prototype.renderAxisLine=function(){var a=this.chart.ctx,d=r?this.chart._preRenderCtx:a,b=Math.ceil(this.tickThickness/(this.reversed?-2:2)),c=Math.ceil(this.tickThickness/(this.reversed?2:-2)),e,g;d.save();if("bottom"===this._position||"top"===this._position){if(this.lineThickness){this.reversed?(e=this.lineCoordinates.x2,g=this.lineCoordinates.x1): -(e=this.lineCoordinates.x1,g=this.lineCoordinates.x2);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor?this.lineColor:"black";d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));var m=1===this.lineThickness%2?(this.lineCoordinates.y1<<0)+0.5:this.lineCoordinates.y1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+c;else for(var l= -this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(e,m),d.lineTo(this.scaleBreaks._appliedBreaks[l].startPixel+b,m),e=this.scaleBreaks._appliedBreaks[l].endPixel+c;e&&(d.moveTo(e,m),d.lineTo(g,m));d.stroke()}}else if(("left"===this._position||"right"===this._position)&&this.lineThickness){this.reversed?(e=this.lineCoordinates.y1,g=this.lineCoordinates.y2):(e=this.lineCoordinates.y2,g=this.lineCoordinates.y1);d.lineWidth=this.lineThickness;d.strokeStyle=this.lineColor; -d.setLineDash&&d.setLineDash(R(this.lineDashType,this.lineThickness));m=1===this.lineThickness%2?(this.lineCoordinates.x1<<0)+0.5:this.lineCoordinates.x1<<0;d.beginPath();if(this.scaleBreaks&&!u(this.scaleBreaks.firstBreakIndex))if(u(this.scaleBreaks.lastBreakIndex))e=this.scaleBreaks._appliedBreaks[this.scaleBreaks.firstBreakIndex].endPixel+b;else for(l=this.scaleBreaks.firstBreakIndex;l<=this.scaleBreaks.lastBreakIndex;l++)d.moveTo(m,e),d.lineTo(m,this.scaleBreaks._appliedBreaks[l].startPixel+c), -e=this.scaleBreaks._appliedBreaks[l].endPixel+b;e&&(d.moveTo(m,e),d.lineTo(m,g));d.stroke()}r&&(a.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),this.chart._breaksCanvasCtx&&this.chart._breaksCanvasCtx.drawImage(this.chart._preRenderCanvas,0,0,this.chart.width,this.chart.height),d.clearRect(0,0,this.chart.width,this.chart.height));d.restore()};z.prototype.getPixelCoordinatesOnAxis=function(a){var d={};if("bottom"===this._position||"top"===this._position)d.x=this.convertValueToPixel(a), -d.y=this.lineCoordinates.y1;if("left"===this._position||"right"===this._position)d.y=this.convertValueToPixel(a),d.x=this.lineCoordinates.x2;return d};z.prototype.convertPixelToValue=function(a){if("undefined"===typeof a)return null;var d=0,b=0,c,d=!0,e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[],b="number"===typeof a?a:"left"===this._position||"right"===this._position?a.y:a.x;if(this.logarithmic){a=c=Math.pow(this.logarithmBase,(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit); -if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;be[b].startValue/this.conversionParameters.minimum){c/=e[b].startValue/this.conversionParameters.minimum;if(ce[b].startValue/e[b-1].endValue){c/=e[b].startValue/e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum){if(1e[b].startValue){a=Math.pow(e[b].endValue/e[b].startValue,Math.log(c)/Math.log(e[b].size));break}else a*=e[b].startValue/this.conversionParameters.minimum*Math.pow(e[b].size,Math.log(e[b].startValue/this.conversionParameters.minimum)/Math.log(e[b].endValue/e[b].startValue))*c,c*=Math.pow(e[b].size,Math.log(this.conversionParameters.minimum/e[b].startValue)/Math.log(e[b].endValue/e[b].startValue));d=!1}else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size;d=!1}else break;else if(c1/e[b].size){a*=Math.pow(e[b].endValue/e[b].startValue,1>=e[b].size?1:Math.log(c)/Math.log(e[b].size))*c;break}else a/=e[b].endValue/e[b].startValue/e[b].size;c*=e[b].size}else break; -d=a*this.viewportMinimum}else{a=c=(b-this.conversionParameters.reference)/this.conversionParameters.pixelPerUnit;if(b<=this.conversionParameters.reference===("left"===this._position||"right"===this._position)!==this.reversed)for(b=0;b=e[b].size?0:c*(e[b].endValue- -e[b].startValue)/e[b].size;break}else a+=e[b].endValue-this.conversionParameters.minimum-e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue),c-=e[b].size*(e[b].endValue-this.conversionParameters.minimum)/(e[b].endValue-e[b].startValue);d=!1}else if(c>e[b].startValue-this.conversionParameters.minimum){c-=e[b].startValue-this.conversionParameters.minimum;if(ce[b].startValue-e[b-1].endValue){c-=e[b].startValue-e[b-1].endValue;if(cthis.conversionParameters.minimum))if(d)if(e[b].endValue>this.conversionParameters.minimum)if(e[b].size&&this.conversionParameters.minimum+c*(e[b].endValue- -e[b].startValue)/e[b].size>e[b].startValue){a=0>=e[b].size?0:c*(e[b].endValue-e[b].startValue)/e[b].size;break}else a+=e[b].startValue-this.conversionParameters.minimum+e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),c+=e[b].size*(this.conversionParameters.minimum-e[b].startValue)/(e[b].endValue-e[b].startValue),d=!1;else if(c-1*e[b].size){a+=(e[b].endValue- -e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size;d=!1}else break;else if(c-1*e[b].size){a+=(e[b].endValue-e[b].startValue)*(0===e[b].size?1:c/e[b].size)+c;break}else a-=e[b].endValue-e[b].startValue-e[b].size;c+=e[b].size}else break;d=this.conversionParameters.minimum+a}return d};z.prototype.convertValueToPixel=function(a){a=this.getApparentDifference(this.conversionParameters.minimum, -a,a);return this.logarithmic?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*Math.log(a/this.conversionParameters.minimum)/this.conversionParameters.lnLogarithmBase+0.5<<0:"axisX"===this.type?this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5<<0:this.conversionParameters.reference+this.conversionParameters.pixelPerUnit*(a-this.conversionParameters.minimum)+0.5};z.prototype.getApparentDifference=function(a, -d,b,c){var e=this.scaleBreaks?this.scaleBreaks._appliedBreaks:[];if(this.logarithmic){b=u(b)?d/a:b;for(var g=0;ge[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*e[g].startValue*e[g].size:a>=e[g].startValue&&d>=e[g].endValue?b=b/e[g].endValue*a*Math.pow(e[g].size,Math.log(e[g].endValue/a)/Math.log(e[g].endValue/e[g].startValue)):a<=e[g].startValue&&d<=e[g].endValue?b=b/d*e[g].startValue*Math.pow(e[g].size,Math.log(d/e[g].startValue)/Math.log(e[g].endValue/ -e[g].startValue)):!c&&(a>e[g].startValue&&de[g].endValue||(a<=e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+e[g].startValue+e[g].size:a>e[g].startValue&&d>=e[g].endValue?b=b-e[g].endValue+a+e[g].size*(e[g].endValue-a)/(e[g].endValue-e[g].startValue):a<=e[g].startValue&&de[g].startValue&&da[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<= -a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c/a[e].endValue*this.viewportMinimum,b=0a[e].endValue||(this.viewportMinimum>=a[e].startValue&&this.viewportMaximum<=a[e].endValue?b=0:this.viewportMinimum<=a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+a[e].startValue,b=0a[e].startValue&&this.viewportMaximum>=a[e].endValue?(c=c-a[e].endValue+this.viewportMinimum, -b=0this.maxWidth?8:6);var a=Math.max(c,Math.floor(this.maxWidth/a)),e,g,m,c=0;!u(this.options.viewportMinimum)&&(!u(this.options.viewportMaximum)&&this.options.viewportMinimum>=this.options.viewportMaximum)&& -(this.viewportMinimum=this.viewportMaximum=null);if(u(this.options.viewportMinimum)&&!u(this.sessionVariables.newViewportMinimum)&&!isNaN(this.sessionVariables.newViewportMinimum))this.viewportMinimum=this.sessionVariables.newViewportMinimum;else if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(u(this.options.viewportMaximum)&&!u(this.sessionVariables.newViewportMaximum)&&!isNaN(this.sessionVariables.newViewportMaximum))this.viewportMaximum=this.sessionVariables.newViewportMaximum; -else if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(c=0;c=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[c].startValue||!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[c].startValue)&& -(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[c].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[c].endValue)){this.scaleBreaks._appliedBreaks.splice(c,1);break}if("axisX"===this.type){if(this.dataSeries&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g, -null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0));c=this.getApparentDifference(isNaN(this.viewportMinimum)||null===this.viewportMinimum?e:this.viewportMinimum,isNaN(this.viewportMaximum)||null===this.viewportMaximum?g:this.viewportMaximum,null, -!0);if("axisX"===this.type&&b){this.intervalType||(c/1<=a?(this.interval=1,this.intervalType="millisecond"):c/2<=a?(this.interval=2,this.intervalType="millisecond"):c/5<=a?(this.interval=5,this.intervalType="millisecond"):c/10<=a?(this.interval=10,this.intervalType="millisecond"):c/20<=a?(this.interval=20,this.intervalType="millisecond"):c/50<=a?(this.interval=50,this.intervalType="millisecond"):c/100<=a?(this.interval=100,this.intervalType="millisecond"):c/200<=a?(this.interval=200,this.intervalType= -"millisecond"):c/250<=a?(this.interval=250,this.intervalType="millisecond"):c/300<=a?(this.interval=300,this.intervalType="millisecond"):c/400<=a?(this.interval=400,this.intervalType="millisecond"):c/500<=a?(this.interval=500,this.intervalType="millisecond"):c/(1*S.secondDuration)<=a?(this.interval=1,this.intervalType="second"):c/(2*S.secondDuration)<=a?(this.interval=2,this.intervalType="second"):c/(5*S.secondDuration)<=a?(this.interval=5,this.intervalType="second"):c/(10*S.secondDuration)<=a?(this.interval= -10,this.intervalType="second"):c/(15*S.secondDuration)<=a?(this.interval=15,this.intervalType="second"):c/(20*S.secondDuration)<=a?(this.interval=20,this.intervalType="second"):c/(30*S.secondDuration)<=a?(this.interval=30,this.intervalType="second"):c/(1*S.minuteDuration)<=a?(this.interval=1,this.intervalType="minute"):c/(2*S.minuteDuration)<=a?(this.interval=2,this.intervalType="minute"):c/(5*S.minuteDuration)<=a?(this.interval=5,this.intervalType="minute"):c/(10*S.minuteDuration)<=a?(this.interval= -10,this.intervalType="minute"):c/(15*S.minuteDuration)<=a?(this.interval=15,this.intervalType="minute"):c/(20*S.minuteDuration)<=a?(this.interval=20,this.intervalType="minute"):c/(30*S.minuteDuration)<=a?(this.interval=30,this.intervalType="minute"):c/(1*S.hourDuration)<=a?(this.interval=1,this.intervalType="hour"):c/(2*S.hourDuration)<=a?(this.interval=2,this.intervalType="hour"):c/(3*S.hourDuration)<=a?(this.interval=3,this.intervalType="hour"):c/(6*S.hourDuration)<=a?(this.interval=6,this.intervalType= -"hour"):c/(1*S.dayDuration)<=a?(this.interval=1,this.intervalType="day"):c/(2*S.dayDuration)<=a?(this.interval=2,this.intervalType="day"):c/(4*S.dayDuration)<=a?(this.interval=4,this.intervalType="day"):c/(1*S.weekDuration)<=a?(this.interval=1,this.intervalType="week"):c/(2*S.weekDuration)<=a?(this.interval=2,this.intervalType="week"):c/(3*S.weekDuration)<=a?(this.interval=3,this.intervalType="week"):c/(1*S.monthDuration)<=a?(this.interval=1,this.intervalType="month"):c/(2*S.monthDuration)<=a?(this.interval= -2,this.intervalType="month"):c/(3*S.monthDuration)<=a?(this.interval=3,this.intervalType="month"):c/(6*S.monthDuration)<=a?(this.interval=6,this.intervalType="month"):(this.interval=c/(1*S.yearDuration)<=a?1:c/(2*S.yearDuration)<=a?2:c/(4*S.yearDuration)<=a?4:Math.floor(z.getNiceNumber(c/(a-1),!0)/S.yearDuration),this.intervalType="year"));if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=e-m/2;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum= -g+m/2;d?this.autoValueFormatString="MMM DD YYYY HH:mm":"year"===this.intervalType?this.autoValueFormatString="YYYY":"month"===this.intervalType?this.autoValueFormatString="MMM YYYY":"week"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"day"===this.intervalType?this.autoValueFormatString="MMM DD YYYY":"hour"===this.intervalType?this.autoValueFormatString="hh:mm TT":"minute"===this.intervalType?this.autoValueFormatString="hh:mm TT":"second"===this.intervalType?this.autoValueFormatString= -"hh:mm:ss TT":"millisecond"===this.intervalType&&(this.autoValueFormatString="fff'ms'");this.valueFormatString||(this.valueFormatString=this.autoValueFormatString)}else{this.intervalType="number";c=z.getNiceNumber(c,!1);this.interval=this.options&&0g?(c=Math.min(0.01*Math.abs(this.getApparentDifference(g,e,null,!0)),5),0<=g?e=g-c:g=isFinite(e)?e+c:0):(c=Math.min(0.01*Math.abs(this.getApparentDifference(e,g,null,!0)),0.05),0!==g&&(g+=c),0!==e&&(e-=c)):(g="undefined"===typeof this.options.interval?-Infinity:this.options.interval,e="undefined"!==typeof this.options.interval||isFinite(this.dataInfo.minDiff)?0:Infinity),m=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:1g&&(g=0)),Math.abs(this.getApparentDifference(e,g,null,!0)),"axisX"===this.type&&b){this.valueType="dateTime";if(null===this.minimum||isNaN(this.minimum))this.minimum=e-m/2;if(null===this.maximum||isNaN(this.maximum))this.maximum=g+m/2}else this.intervalType=this.valueType="number",null===this.minimum&&(this.minimum="axisX"===this.type?e-m/2:Math.floor(e/this.interval)*this.interval,this.minimum=Math.min(this.minimum, -null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?Infinity:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum="axisX"===this.type?g+m/2:Math.ceil(g/this.interval)*this.interval,this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?-Infinity:this.sessionVariables.viewportMaximum)),0===this.maximum&&0===this.minimum&&(0===this.options.minimum?this.maximum+=10:0=== -this.options.maximum&&(this.minimum-=10));u(this.sessionVariables.newViewportMinimum)&&(this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum));u(this.sessionVariables.newViewportMaximum)&&(this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum));this.range=this.viewportMaximum-this.viewportMinimum;this.intervalStartPosition="axisX"===this.type&&b?this.getLabelStartPoint(new Date(this.viewportMinimum),this.intervalType,this.interval):Math.floor((this.viewportMinimum+0.2*this.interval)/ -this.interval)*this.interval;this.valueFormatString||(this.valueFormatString=z.generateValueFormatString(this.range,2))}};z.prototype.calculateLogarithmicAxisParameters=function(){var a=this.chart.layoutManager.getFreeSpace(),d=Math.log(this.logarithmBase),b;"bottom"===this._position||"top"===this._position?(this.maxWidth=a.width,this.maxHeight=a.height):(this.maxWidth=a.height,this.maxHeight=a.width);var a="axisX"===this.type?500>this.maxWidth?7:Math.max(7,Math.floor(this.maxWidth/100)):Math.max(Math.floor(this.maxWidth/ -50),3),c,e,g,m;m=1;if(null===this.viewportMinimum||isNaN(this.viewportMinimum))this.viewportMinimum=this.minimum;if(null===this.viewportMaximum||isNaN(this.viewportMaximum))this.viewportMaximum=this.maximum;if(this.scaleBreaks)for(m=0;m=this.scaleBreaks._appliedBreaks[m].startValue||!u(this.options.minimum)&&this.options.minimum>=this.scaleBreaks._appliedBreaks[m].startValue|| -!u(this.options.viewportMinimum)&&this.viewportMinimum>=this.scaleBreaks._appliedBreaks[m].startValue)&&(!u(this.sessionVariables.newViewportMaximum)&&this.sessionVariables.newViewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.maximum)&&this.options.maximum<=this.scaleBreaks._appliedBreaks[m].endValue||!u(this.options.viewportMaximum)&&this.viewportMaximum<=this.scaleBreaks._appliedBreaks[m].endValue)){this.scaleBreaks._appliedBreaks.splice(m,1);break}"axisX"===this.type? -(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin,e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,1===e/c&&(m=Math.pow(this.logarithmBase,"undefined"===typeof this.options.interval?0.4:this.options.interval),e*=m,c/=m),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.viewportMinimum?this.viewportMinimum:this.dataInfo.viewPortMin, -e=null!==this.viewportMaximum?this.viewportMaximum:this.dataInfo.viewPortMax,0>=c&&!isFinite(e)?(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1):0>=c?c=e:isFinite(e)||(e=c),1===c&&1===e?(e*=this.logarithmBase-1/this.logarithmBase,c=1):1===e/c?(m=Math.min(e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),e*=m,c/=m):c>e?(m=Math.min(c/e*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,5)),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase, -0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.viewportMinimum||isNaN(this.viewportMinimum))&&1e&&(e=1));m=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)/(isNaN(this.viewportMinimum)||null=== -this.viewportMinimum?c:this.viewportMinimum);var l=(isNaN(this.viewportMaximum)||null===this.viewportMaximum?e:this.viewportMaximum)-(isNaN(this.viewportMinimum)||null===this.viewportMinimum?c:this.viewportMinimum);this.intervalType="number";m=Math.pow(this.logarithmBase,z.getNiceNumber(Math.abs(Math.log(m)/d),!1));this.options&&0this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase):"axisY"===this.type&&(c=null!==this.minimum?this.minimum:this.dataInfo.min,e=null!==this.maximum?this.maximum:this.dataInfo.max,isFinite(c)||isFinite(e)?1===c&&1===e?(e*=this.logarithmBase,c/=this.logarithmBase):1===e/c?(m=Math.pow(this.logarithmBase,this.interval),e*=m,c/=m):c>e?(m= -Math.min(0.01*(c/e),5),1<=e?c=e/m:e=c*m):(m=Math.min(e/c*Math.pow(this.logarithmBase,0.01),Math.pow(this.logarithmBase,0.04)),1!==e&&(e*=m),1!==c&&(c/=m)):(e="undefined"===typeof this.options.interval?0:this.options.interval,c=1),g=Infinity!==this.dataInfo.minDiff?this.dataInfo.minDiff:e/c>this.logarithmBase?e/c*Math.pow(this.logarithmBase,0.5):this.logarithmBase,this.includeZero&&(null===this.minimum||isNaN(this.minimum))&&1e&&(e=1)),this.intervalType="number",null===this.minimum&&(this.minimum="axisX"===this.type?c/Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.floor(Math.log(c)/d/this.interval)),this.minimum=Math.min(this.minimum,null===this.sessionVariables.viewportMinimum||isNaN(this.sessionVariables.viewportMinimum)?"undefined"===typeof this.sessionVariables.newViewportMinimum?Infinity:this.sessionVariables.newViewportMinimum:this.sessionVariables.viewportMinimum)),null===this.maximum&&(this.maximum= -"axisX"===this.type?e*Math.sqrt(g):Math.pow(this.logarithmBase,this.interval*Math.ceil(Math.log(e)/d/this.interval)),this.maximum=Math.max(this.maximum,null===this.sessionVariables.viewportMaximum||isNaN(this.sessionVariables.viewportMaximum)?"undefined"===typeof this.sessionVariables.newViewportMaximum?0:this.sessionVariables.newViewportMaximum:this.sessionVariables.viewportMaximum)),1===this.maximum&&1===this.minimum&&(1===this.options.minimum?this.maximum*=this.logarithmBase-1/this.logarithmBase: -1===this.options.maximum&&(this.minimum/=this.logarithmBase-1/this.logarithmBase));this.viewportMinimum=Math.max(this.viewportMinimum,this.minimum);this.viewportMaximum=Math.min(this.viewportMaximum,this.maximum);this.viewportMinimum>this.viewportMaximum&&(!this.options.viewportMinimum&&!this.options.minimum||this.options.viewportMaximum||this.options.maximum?this.options.viewportMinimum||this.options.minimum||!this.options.viewportMaximum&&!this.options.maximum||(this.viewportMinimum=this.minimum= -(this.options.viewportMaximum||this.options.maximum)/Math.pow(this.logarithmBase,2*Math.ceil(this.interval))):this.viewportMaximum=this.maximum=this.options.viewportMinimum||this.options.minimum);c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval);this.range=this.viewportMaximum/this.viewportMinimum;this.noTicks=a;if(!this.options.interval&&this.rangethis.viewportMaximum||3>a?2:3)){for(d=Math.floor(this.viewportMinimum/ -b+0.5)*b;dthis.interval&&(this.interval=b,c=Math.pow(this.logarithmBase,Math.floor(Math.log(this.viewportMinimum)/(d*this.interval)+0.2)*this.interval))),this.equidistantInterval=!0,this.intervalStartPosition=c;if(!this.valueFormatString&&(this.valueFormatString="#,##0.##",1>this.viewportMinimum)){d=Math.floor(Math.abs(Math.log(this.viewportMinimum)/ -Math.LN10))+2;if(isNaN(d)||!isFinite(d))d=2;if(2a&&(c+=Math.floor(Math.abs(Math.log(a)/Math.LN10)),isNaN(c)||!isFinite(c))&&(c=d);for(var e=0;eb?1>=c?1:5>=c?5:10:Math.max(Math.floor(c),1);return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.getNiceNumber= -function(a,d){var b=Math.floor(Math.log(a)/Math.LN10),c=a/Math.pow(10,b),c=d?1.5>c?1:3>c?2:7>c?5:10:1>=c?1:2>=c?2:5>=c?5:10;return-20>b?Number(c*Math.pow(10,b)):Number((c*Math.pow(10,b)).toFixed(20))};z.prototype.getLabelStartPoint=function(){var a=S[this.intervalType+"Duration"]*this.interval,a=new Date(Math.floor(this.viewportMinimum/a)*a);if("millisecond"!==this.intervalType)if("second"===this.intervalType)0=a||"bottom"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(c,l),this.ctx.lineTo(m,l),this.ctx.lineTo(m,e);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(l-h)/a/3;for(var n=0;n=a||"right"===this.scaleBreaks.parent._position&&0<=a)this.ctx.lineTo(m,e),this.ctx.lineTo(m,l), -this.ctx.lineTo(c,l);else if("wavy"===this.type){k=c;h=e;g=0.5;p=(m-k)/a/3;for(n=0;nthis.parent.range?2:Math.floor(Math.abs(Math.log(this.parent.range)/Math.LN10))+(5>this.parent.range?2:10>this.parent.range? -1:0):50this.parent.range?2:10>this.parent.range?1:0);this.valueFormatString=z.generateValueFormatString(this.parent.range,h)}var l=null===this.opacity?1:this.opacity,h=Math.abs("pixel"===this._thicknessType?this.thickness:this.parent.conversionParameters.pixelPerUnit*this.thickness),p=this.chart.overlaidCanvasCtx,q=p.globalAlpha;p.globalAlpha=l;p.beginPath();p.strokeStyle=this.color;p.lineWidth=h;p.save();this.labelFontSize= -u(this.options.labelFontSize)?this.parent.labelFontSize:this.labelFontSize;if("left"===this.parent._position||"right"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?this.parent.bounds.x2-this.parent.bounds.x1:this.labelMaxWidth,this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?3*this.chart.height:2*this.labelFontSize;else if("top"===this.parent._position||"bottom"===this.parent._position)this.labelMaxWidth=u(this.options.labelMaxWidth)?3*this.chart.width:this.labelMaxWidth, -this.labelMaxHeight=u(this.options.labelWrap)||this.labelWrap?this.parent.bounds.height:2*this.labelFontSize;0this.chart.bounds.x2?l.x=this.chart.bounds.x2-l.width:l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}}else if("bottom"===this.parent._position||"top"===this.parent._position){n=this.parent.convertPixelToValue({x:a});for(r=0;rthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"=== -this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}m=null;("bottom"===this.parent._position||"top"===this.parent._position)&&(b>=this.parent.convertValueToPixel(this.parent.viewportMinimum)&&c<=this.parent.convertValueToPixel(this.parent.viewportMaximum))&&(0=this.parent.convertValueToPixel(this.parent.viewportMaximum)&& -e<=this.parent.convertValueToPixel(this.parent.viewportMinimum))&&(0this.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2);"left"===this.parent._position?l.x=this.parent.lineCoordinates.x1-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2)}else{if("bottom"===this.parent._position||"top"===this.parent._position)l.text=this.labelFormatter?this.labelFormatter({chart:this.chart,axis:this.parent.options,crosshair:this.options,value:this.parent.convertPixelToValue(a)}):u(this.options.label)? -ba(this.parent.convertPixelToValue(a),this.valueFormatString,this.chart._cultureInfo):this.label,l.x=b-l.measureText().width/2,l.x+l.width>this.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width),l.xthis.chart.bounds.x2&&(l.x=this.chart.bounds.x2-l.width);l.xthis.chart.bounds.y2&&(l.y=this.chart.bounds.y2-l.measureText().height+l.fontSize/2),"left"===this.parent._position?l.x=this.parent.lineCoordinates.x2-l.measureText().width:"right"===this.parent._position&&(l.x=this.parent.lineCoordinates.x2);0(new Date).getTime()-this._lastUpdated||(this._lastUpdated=(new Date).getTime(), -this.chart.resetOverlayedCanvas(),this._updateToolTip(a,d))};$.prototype._updateToolTip=function(a,d,b){b="undefined"===typeof b?!0:b;this.container||this._initialize();this.enabled||this.hide();if(!this.chart.disableToolTip){if("undefined"===typeof a||"undefined"===typeof d){if(isNaN(this._prevX)||isNaN(this._prevY))return;a=this._prevX;d=this._prevY}else this._prevX=a,this._prevY=d;var c=null,e=null,g=[],k=0;if(this.shared&&this.enabled&&"none"!==this.chart.plotInfo.axisPlacement){if("xySwapped"=== -this.chart.plotInfo.axisPlacement){var l=[];if(this.chart.axisX)for(var p=0;ph.dataSeries.axisY.viewportMaximum&&b++;b-h.dataPoint.y.length&&g.push(h)}else"column"===e.type||"bar"===e.type?0>h.dataPoint.y?0>h.dataSeries.axisY.viewportMinimum&&h.dataSeries.axisY.viewportMaximum>=h.dataPoint.y&&g.push(h):h.dataSeries.axisY.viewportMinimum<=h.dataPoint.y&&0<=h.dataSeries.axisY.viewportMaximum&&g.push(h):"bubble"===e.type?(b=this.chart._eventManager.objectMap[e.dataPointIds[h.index]].size/2,h.dataPoint.y>= -h.dataSeries.axisY.viewportMinimum-b&&h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum+b&&g.push(h)):"waterfall"===e.type?(b=0,h.cumulativeSumYStartValueh.dataSeries.axisY.viewportMaximum&&b++,h.cumulativeSumh.dataSeries.axisY.viewportMaximum&&b++,2>b&&-2=h.dataSeries.axisY.viewportMinimum&& -h.dataPoint.y<=h.dataSeries.axisY.viewportMaximum)&&g.push(h);else g.push(h)}}if(0a&&(a+=this.container.clientWidth+20);a+this.container.clientWidth> -Math.max(this.chart.container.clientWidth,this.chart.width)&&(a=Math.max(0,Math.max(this.chart.container.clientWidth,this.chart.width)-this.container.clientWidth));d=1!==g.length||this.shared||"line"!==g[0].dataSeries.type&&"stepLine"!==g[0].dataSeries.type&&"spline"!==g[0].dataSeries.type&&"area"!==g[0].dataSeries.type&&"stepArea"!==g[0].dataSeries.type&&"splineArea"!==g[0].dataSeries.type?"bar"===g[0].dataSeries.type||"rangeBar"===g[0].dataSeries.type||"stackedBar"===g[0].dataSeries.type||"stackedBar100"=== -g[0].dataSeries.type?g[0].dataSeries.axisX.convertValueToPixel(g[0].dataPoint.x):d:g[0].dataSeries.axisY.convertValueToPixel(g[0].dataPoint.y);d=-d+10;0":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content? -this.content:"{name}:  {y}",p=b.axisXIndex):"bubble"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y},   {z}"): -"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:  {y[0]}, {y[1]}"):"candlestick"=== -b.type||"ohlc"===b.type?(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Open:   {y[0]}
High:    {y[1]}
Low:   {y[2]}
Close:   {y[3]}"):"boxAndWhisker"=== -b.type&&(this.chart.axisX&&1":"X:{axisXIndex}
":""),g+=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:"{name}:
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"), -null===d&&(d=""),!0===this.reversed?(d=this.chart.replaceKeywordsWithValue(g,c,b,e)+d,l"+d)):(d+=this.chart.replaceKeywordsWithValue(g,c,b,e),l")));null!==d&&(d=h+d)}else{b=a[0].dataSeries;c=a[0].dataPoint;e=a[0].index;if(null===c.toolTipContent||"undefined"===typeof c.toolTipContent&&null===b.options.toolTipContent)return null;"line"===b.type||"stepLine"===b.type||"spline"===b.type||"area"===b.type||"stepArea"===b.type||"splineArea"===b.type||"column"=== -b.type||"bar"===b.type||"scatter"===b.type||"stackedColumn"===b.type||"stackedColumn100"===b.type||"stackedBar"===b.type||"stackedBar100"===b.type||"stackedArea"===b.type||"stackedArea100"===b.type||"waterfall"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y}":"bubble"===b.type?g=c.toolTipContent? -c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+":  {y},   {z}":"pie"===b.type||"doughnut"===b.type||"funnel"===b.type||"pyramid"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.name?"{name}:  ":c.label?"{label}:  ":"")+"{y}":"rangeColumn"===b.type||"rangeBar"===b.type||"rangeArea"===b.type||"rangeSplineArea"===b.type||"error"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+" :  {y[0]},  {y[1]}": -"candlestick"===b.type||"ohlc"===b.type?g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent:this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Open:   {y[0]}
High:    {y[1]}
Low:     {y[2]}
Close:   {y[3]}":"boxAndWhisker"===b.type&&(g=c.toolTipContent?c.toolTipContent:b.toolTipContent?b.toolTipContent: -this.content&&"function"!==typeof this.content?this.content:""+(c.label?"{label}":"{x}")+"
Minimum:   {y[0]}
Q1:               {y[1]}
Q2:               {y[4]}
Q3:               {y[2]}
Maximum:  {y[3]}"); -null===d&&(d="");d+=this.chart.replaceKeywordsWithValue(g,c,b,e)}return d};$.prototype.enableAnimation=function(){if(!this.container.style.WebkitTransition){var a=this.getContainerTransition(this.containerTransitionDuration);this.container.style.WebkitTransition=a;this.container.style.MsTransition=a;this.container.style.transition=a;this.container.style.MozTransition=this.mozContainerTransition}};$.prototype.disableAnimation=function(){this.container.style.WebkitTransition&&(this.container.style.WebkitTransition= -"",this.container.style.MozTransition="",this.container.style.MsTransition="",this.container.style.transition="")};$.prototype.hide=function(a){this.container&&(this.container.style.display="none",this.currentSeriesIndex=-1,this._prevY=this._prevX=NaN,("undefined"===typeof a||a)&&this.chart.resetOverlayedCanvas())};$.prototype.show=function(a,d,b){this._updateToolTip(a,d,"undefined"===typeof b?!1:b)};$.prototype.fixMozTransitionDelay=function(a,d){if(20c&&a.push(d),d.animationCallback(c),1<=c&&d.onComplete)d.onComplete();this.animations=a;0g;g++)for(var e=0;3>e;e++){for(var f=0,d=0;3>d;d++)f+=a[g][d]*b[d][e];c[g][e]=f}return c}function P(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX= -a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha;b.font=a.font;b.textAlign=a.textAlign;b.textBaseline=a.textBaseline;b.arcScaleX_=a.arcScaleX_;b.arcScaleY_=a.arcScaleY_;b.lineScale_=a.lineScale_}function Q(a){var b=a.indexOf("(",3),c=a.indexOf(")",b+1),b=a.substring(b+1,c).split(",");if(4!=b.length||"a"!=a.charAt(3))b[3]=1;return b}function E(a,b,c){return Math.min(c,Math.max(b,a))}function F(a,b,c){0>c&&c++;16*c?a+6*(b-a)*c: -1>2*c?b:2>3*c?a+6*(b-a)*(2/3-c):a}function G(a){if(a in H)return H[a];var b,c=1;a=String(a);if("#"==a.charAt(0))b=a;else if(/^rgb/.test(a)){c=Q(a);b="#";for(var g,e=0;3>e;e++)g=-1!=c[e].indexOf("%")?Math.floor(255*(parseFloat(c[e])/100)):+c[e],b+=v[E(g,0,255)];c=+c[3]}else if(/^hsl/.test(a)){e=c=Q(a);b=parseFloat(e[0])/360%360;0>b&&b++;g=E(parseFloat(e[1])/100,0,1);e=E(parseFloat(e[2])/100,0,1);if(0==g)g=e=b=e;else{var f=0.5>e?e*(1+g):e+g-e*g,d=2*e-f;g=F(d,f,b+1/3);e=F(d,f,b);b=F(d,f,b-1/3)}b="#"+ -v[Math.floor(255*g)]+v[Math.floor(255*e)]+v[Math.floor(255*b)];c=c[3]}else b=Z[a]||a;return H[a]={color:b,alpha:c}}function C(a){this.m_=D();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=1*q;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=a;var b="width:"+a.clientWidth+"px;height:"+a.clientHeight+"px;overflow:hidden;position:absolute", -c=a.ownerDocument.createElement("div");c.style.cssText=b;a.appendChild(c);b=c.cloneNode(!1);b.style.backgroundColor="red";b.style.filter="alpha(opacity=0)";a.appendChild(b);this.element_=c;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}function R(a,b,c,g){a.currentPath_.push({type:"bezierCurveTo",cp1x:b.x,cp1y:b.y,cp2x:c.x,cp2y:c.y,x:g.x,y:g.y});a.currentX_=g.x;a.currentY_=g.y}function S(a,b){var c=G(a.strokeStyle),g=c.color,c=c.alpha*a.globalAlpha,e=a.lineScale_*a.lineWidth;1>e&&(c*=e);b.push("')}function T(a,b,c,g){var e=a.fillStyle,f=a.arcScaleX_,d=a.arcScaleY_,k=g.x-c.x,n=g.y-c.y;if(e instanceof w){var h=0,l=g=0,u=0,m=1;if("gradient"==e.type_){h=e.x1_/f;c=e.y1_/d;var p=s(a,e.x0_/f,e.y0_/d),h=s(a,h,c),h=180*Math.atan2(h.x-p.x,h.y-p.y)/Math.PI;0>h&&(h+=360);1E-6>h&&(h=0)}else p=s(a,e.x0_,e.y0_),g=(p.x-c.x)/k,l=(p.y-c.y)/n,k/=f*q, -n/=d*q,m=x.max(k,n),u=2*e.r0_/m,m=2*e.r1_/m-u;f=e.colors_;f.sort(function(a,b){return a.offset-b.offset});d=f.length;p=f[0].color;c=f[d-1].color;k=f[0].alpha*a.globalAlpha;a=f[d-1].alpha*a.globalAlpha;for(var n=[],r=0;r')}else e instanceof -I?k&&n&&b.push("'):(e=G(a.fillStyle),b.push(''))}function s(a,b,c){a=a.m_;return{x:q*(b*a[0][0]+c*a[1][0]+a[2][0])-r,y:q*(b*a[0][1]+c*a[1][1]+a[2][1])-r}}function z(a,b,c){isFinite(b[0][0])&&(isFinite(b[0][1])&&isFinite(b[1][0])&&isFinite(b[1][1])&&isFinite(b[2][0])&&isFinite(b[2][1]))&&(a.m_=b,c&&(a.lineScale_=aa(ba(b[0][0]*b[1][1]-b[0][1]* -b[1][0]))))}function w(a){this.type_=a;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}function I(a,b){if(!a||1!=a.nodeType||"IMG"!=a.tagName)throw new A("TYPE_MISMATCH_ERR");if("complete"!=a.readyState)throw new A("INVALID_STATE_ERR");switch(b){case "repeat":case null:case "":this.repetition_="repeat";break;case "repeat-x":case "repeat-y":case "no-repeat":this.repetition_=b;break;default:throw new A("SYNTAX_ERR");}this.src_=a.src;this.width_=a.width;this.height_=a.height} -function A(a){this.code=this[a];this.message=a+": DOM Exception "+this.code}var x=Math,k=x.round,J=x.sin,K=x.cos,ba=x.abs,aa=x.sqrt,q=10,r=q/2;navigator.userAgent.match(/MSIE ([\d.]+)?/);var M=Array.prototype.slice;O(document);var U={init:function(a){a=a||document;a.createElement("canvas");a.attachEvent("onreadystatechange",W(this.init_,this,a))},init_:function(a){a=a.getElementsByTagName("canvas");for(var b=0;bd;d++)for(var B=0;16>B;B++)v[16*d+B]=d.toString(16)+B.toString(16);var Z={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC", -bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000", -darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082", -ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA", -mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5", -peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"}, -H={},L={},$={butt:"flat",round:"round"},d=C.prototype;d.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null);this.element_.innerHTML=""};d.beginPath=function(){this.currentPath_=[]};d.moveTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.lineTo=function(a,b){var c=s(this,a,b);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};d.bezierCurveTo= -function(a,b,c,g,e,f){e=s(this,e,f);a=s(this,a,b);c=s(this,c,g);R(this,a,c,e)};d.quadraticCurveTo=function(a,b,c,g){a=s(this,a,b);c=s(this,c,g);g={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)};R(this,g,{x:g.x+(c.x-this.currentX_)/3,y:g.y+(c.y-this.currentY_)/3},c)};d.arc=function(a,b,c,g,e,f){c*=q;var d=f?"at":"wa",k=a+K(g)*c-r,n=b+J(g)*c-r;g=a+K(e)*c-r;e=b+J(e)*c-r;k!=g||f||(k+=0.125);a=s(this,a,b);k=s(this,k,n);g=s(this,g,e);this.currentPath_.push({type:d, -x:a.x,y:a.y,radius:c,xStart:k.x,yStart:k.y,xEnd:g.x,yEnd:g.y})};d.rect=function(a,b,c,g){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath()};d.strokeRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+g);this.lineTo(a,b+g);this.closePath();this.stroke();this.currentPath_=e};d.fillRect=function(a,b,c,g){var e=this.currentPath_;this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+ -c,b+g);this.lineTo(a,b+g);this.closePath();this.fill();this.currentPath_=e};d.createLinearGradient=function(a,b,c,g){var e=new w("gradient");e.x0_=a;e.y0_=b;e.x1_=c;e.y1_=g;return e};d.createRadialGradient=function(a,b,c,g,e,f){var d=new w("gradientradial");d.x0_=a;d.y0_=b;d.r0_=c;d.x1_=g;d.y1_=e;d.r1_=f;return d};d.drawImage=function(a,b){var c,g,e,d,r,y,n,h;e=a.runtimeStyle.width;d=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var l=a.width,u=a.height;a.runtimeStyle.width= -e;a.runtimeStyle.height=d;if(3==arguments.length)c=arguments[1],g=arguments[2],r=y=0,n=e=l,h=d=u;else if(5==arguments.length)c=arguments[1],g=arguments[2],e=arguments[3],d=arguments[4],r=y=0,n=l,h=u;else if(9==arguments.length)r=arguments[1],y=arguments[2],n=arguments[3],h=arguments[4],c=arguments[5],g=arguments[6],e=arguments[7],d=arguments[8];else throw Error("Invalid number of arguments");var m=s(this,c,g),p=[];p.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))};d.stroke=function(a){var b=[];b.push("d.x)d.x=f.x;if(null==c.y||f.yd.y)d.y=f.y}}b.push(' ">');a?T(this,b,c,d):S(this,b);b.push("");this.element_.insertAdjacentHTML("beforeEnd",b.join(""))};d.fill=function(){this.stroke(!0)};d.closePath=function(){this.currentPath_.push({type:"close"})};d.save=function(){var a= -{};P(this,a);this.aStack_.push(a);this.mStack_.push(this.m_);this.m_=t(D(),this.m_)};d.restore=function(){this.aStack_.length&&(P(this.aStack_.pop(),this),this.m_=this.mStack_.pop())};d.translate=function(a,b){z(this,t([[1,0,0],[0,1,0],[a,b,1]],this.m_),!1)};d.rotate=function(a){var b=K(a);a=J(a);z(this,t([[b,a,0],[-a,b,0],[0,0,1]],this.m_),!1)};d.scale=function(a,b){this.arcScaleX_*=a;this.arcScaleY_*=b;z(this,t([[a,0,0],[0,b,0],[0,0,1]],this.m_),!0)};d.transform=function(a,b,c,d,e,f){z(this,t([[a, -b,0],[c,d,0],[e,f,1]],this.m_),!0)};d.setTransform=function(a,b,c,d,e,f){z(this,[[a,b,0],[c,d,0],[e,f,1]],!0)};d.drawText_=function(a,b,c,d,e){var f=this.m_;d=0;var r=1E3,t=0,n=[],h;h=this.font;if(L[h])h=L[h];else{var l=document.createElement("div").style;try{l.font=h}catch(u){}h=L[h]={style:l.fontStyle||"normal",variant:l.fontVariant||"normal",weight:l.fontWeight||"normal",size:l.fontSize||10,family:l.fontFamily||"sans-serif"}}var l=h,m=this.element_;h={};for(var p in l)h[p]=l[p];p=parseFloat(m.currentStyle.fontSize); -m=parseFloat(l.size);"number"==typeof l.size?h.size=l.size:-1!=l.size.indexOf("px")?h.size=m:-1!=l.size.indexOf("em")?h.size=p*m:-1!=l.size.indexOf("%")?h.size=p/100*m:-1!=l.size.indexOf("pt")?h.size=m/0.75:h.size=p;h.size*=0.981;p=h.style+" "+h.variant+" "+h.weight+" "+h.size+"px "+h.family;m=this.element_.currentStyle;l=this.textAlign.toLowerCase();switch(l){case "left":case "center":case "right":break;case "end":l="ltr"==m.direction?"right":"left";break;case "start":l="rtl"==m.direction?"right": -"left";break;default:l="left"}switch(this.textBaseline){case "hanging":case "top":t=h.size/1.75;break;case "middle":break;default:case null:case "alphabetic":case "ideographic":case "bottom":t=-h.size/2.25}switch(l){case "right":d=1E3;r=0.05;break;case "center":d=r=500}b=s(this,b+0,c+t);n.push('');e?S(this,n):T(this,n,{x:-d,y:0}, -{x:r,y:h.size});e=f[0][0].toFixed(3)+","+f[1][0].toFixed(3)+","+f[0][1].toFixed(3)+","+f[1][1].toFixed(3)+",0,0";b=k(b.x/q)+","+k(b.y/q);n.push('','','');this.element_.insertAdjacentHTML("beforeEnd",n.join(""))};d.fillText=function(a,b,c,d){this.drawText_(a,b,c,d,!1)};d.strokeText=function(a, -b,c,d){this.drawText_(a,b,c,d,!0)};d.measureText=function(a){this.textMeasureEl_||(this.element_.insertAdjacentHTML("beforeEnd",''),this.textMeasureEl_=this.element_.lastChild);var b=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(b.createTextNode(a));return{width:this.textMeasureEl_.offsetWidth}};d.clip=function(){}; -d.arcTo=function(){};d.createPattern=function(a,b){return new I(a,b)};w.prototype.addColorStop=function(a,b){b=G(b);this.colors_.push({offset:a,color:b.color,alpha:b.alpha})};d=A.prototype=Error();d.INDEX_SIZE_ERR=1;d.DOMSTRING_SIZE_ERR=2;d.HIERARCHY_REQUEST_ERR=3;d.WRONG_DOCUMENT_ERR=4;d.INVALID_CHARACTER_ERR=5;d.NO_DATA_ALLOWED_ERR=6;d.NO_MODIFICATION_ALLOWED_ERR=7;d.NOT_FOUND_ERR=8;d.NOT_SUPPORTED_ERR=9;d.INUSE_ATTRIBUTE_ERR=10;d.INVALID_STATE_ERR=11;d.SYNTAX_ERR=12;d.INVALID_MODIFICATION_ERR= -13;d.NAMESPACE_ERR=14;d.INVALID_ACCESS_ERR=15;d.VALIDATION_ERR=16;d.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=U;CanvasRenderingContext2D=C;CanvasGradient=w;CanvasPattern=I;DOMException=A}(); - -/* - CanvasJS jQuery Charting Plugin - https://canvasjs.com/ - Copyright 2017 fenopix - - --------------------- License Information -------------------- - CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. - https://canvasjs.com/license/ - -*/ -(function(b,c,d,e){b.fn.CanvasJSChart=function(a){if(a){var b=this.first();a=new CanvasJS.Chart(this[0],a);b.children(".canvasjs-chart-container").data("canvasjsChartRef",a);a.render();return this}return this.first().children(".canvasjs-chart-container").data("canvasjsChartRef")}})(jQuery,window,document); -/*eslint-enable*/ -/*jshint ignore:end*/ \ No newline at end of file diff --git a/SRIP/Libraries/canvasjs-2.3.1/license.txt b/SRIP/Libraries/canvasjs-2.3.1/license.txt deleted file mode 100644 index f9882a14..00000000 --- a/SRIP/Libraries/canvasjs-2.3.1/license.txt +++ /dev/null @@ -1,9 +0,0 @@ -* -* @preserve CanvasJS HTML5 & JavaScript Charts - v2.3.1 GA - https://canvasjs.com/ -* Copyright 2018 fenopix -* -* --------------------- License Information -------------------- -* CanvasJS is a commercial product which requires purchase of license. Without a commercial license you can use it for evaluation purposes for upto 30 days. Please refer to the following link for further details. -* https://canvasjs.com/license/ -* -* \ No newline at end of file From a424bdc98a6ec61a00635684c7b502c0b8699c71 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Fri, 12 Jul 2019 17:54:01 +0530 Subject: [PATCH 153/166] initial ui commit --- SRIP/Codes/exp1.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRIP/Codes/exp1.html b/SRIP/Codes/exp1.html index 8aa8de69..8e31b7b2 100644 --- a/SRIP/Codes/exp1.html +++ b/SRIP/Codes/exp1.html @@ -3,9 +3,9 @@ Pattern Recognition: Feature Representation + - From e508c87e9bf43e89b0e4de1022d060f9f4a8f170 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Fri, 12 Jul 2019 18:04:55 +0530 Subject: [PATCH 154/166] initial ui commit --- SRIP/Codes/exp1.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRIP/Codes/exp1.html b/SRIP/Codes/exp1.html index 8e31b7b2..6ccf7f40 100644 --- a/SRIP/Codes/exp1.html +++ b/SRIP/Codes/exp1.html @@ -3,7 +3,7 @@ Pattern Recognition: Feature Representation - + From e9158b0ebfb3d2c5637d1da27dd1af04bc3d3345 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 13 Jul 2019 12:36:01 +0530 Subject: [PATCH 155/166] quiz added --- SRIP/Codes/exp1.css | 10 +++ SRIP/Codes/exp1.html | 128 +++++++++++++++++++------------------ SRIP/Codes/exp1.js | 18 +++++- SRIP/Quiz/JSONquestions.js | 27 +++++++- 4 files changed, 117 insertions(+), 66 deletions(-) diff --git a/SRIP/Codes/exp1.css b/SRIP/Codes/exp1.css index 6097a79d..4ed552fb 100644 --- a/SRIP/Codes/exp1.css +++ b/SRIP/Codes/exp1.css @@ -42,6 +42,16 @@ padding-left: 20px; } +.card { + +background-color: #f1f1f1; + +padding: 20px; + +margin-top: 25px; + +} + /* Responsive layout - when the screen is less than 800px wide, make the two columns stack on top of each other instead of next to each other */ @media screen and (max-width: 800px) { diff --git a/SRIP/Codes/exp1.html b/SRIP/Codes/exp1.html index 6ccf7f40..5971f0b8 100644 --- a/SRIP/Codes/exp1.html +++ b/SRIP/Codes/exp1.html @@ -3,8 +3,9 @@ Pattern Recognition: Feature Representation - + + @@ -16,78 +17,81 @@

0}Tb+NGhjkKzih=-IFALQnqU zS~3_V?z$KY&+z*Qr63A$9yu*+L9!pYK}`vI@z^YJLUkW?9en2T7(<%qh8WC)uiv^R zmp!&B*nyWmk60T1^GJ?JiWGiaVO!k~R)mI~_Ok4^de(!7o#1sWX)o5A1tHDgS-w0+ O$mh_bOP@Y4AOJgp+4w^M literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/861.gif b/SRIP/Libraries/T1/861.gif new file mode 100644 index 0000000000000000000000000000000000000000..c99e8d55a3d5cf0b579025d6f4c74c1522cd1e8b GIT binary patch literal 1031 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 QXdTJ+sNK7GD+UArJ52z?2mk;8 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/872.gif b/SRIP/Libraries/T1/872.gif new file mode 100644 index 0000000000000000000000000000000000000000..d9f78a0a7960aa9d764c9e7b1caaec74d17050eb GIT binary patch literal 950 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/890.gif b/SRIP/Libraries/T1/890.gif new file mode 100644 index 0000000000000000000000000000000000000000..adadcde1d94e2e03f208b7bc1edeb637a10c61b7 GIT binary patch literal 1050 zcmV+#1m*ijNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R0009UbNU)&6g9sBUT*$DY!-onRv;hT* z4a9;1Olb4Rai61$0xv+~NYdXYkY(s`oMwj3K7YF)Ua-TF-=hZt>-l5%kijXA--Hm< zd9q;-ZX6>eAlTz&mxf?oihEiRmOoVk7>2p$uT}_yN#^;p!mxupf15TKlmN~jECmY{ ztUTDlnOg!39r?Q_!{7y#=14FU5zpV3f&)x+^LH*r!(ogY5bV&2<2e=$eem<=hhULg z|L&2J+^~&5dk_F5uwuxZKYfQEg7QZXz!S(Ez2Ufs&0oKI{Wx+vVgRH{j`*~Z!3h#T UnNObv*=SC^y7lYW1qK8FJ1{NxXaE2J literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/892.gif b/SRIP/Libraries/T1/892.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f204e23b9b9129acc2c0ec23db26eaeef656b27 GIT binary patch literal 954 zcmV;r14aBtNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P=009UbNU)&6g9sBUT*$DY!-olz+*3sX z;=u&;`so8=(IAX|{nT|dXbR-2kpxHN16c#*Ks_MQX>bYPMLm#hXaa!QkDUXWF5va! zmqlkFfBm58tl{q;y(T&l_4AiZCyblpO6aTx5|qwC{Q4m~Kr_g@e*2uzgy0RNC!J_O c!UI7w!MA?%jOb+2&)yN8fCCF2OfVn-JG_+4YXATM literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/9.gif b/SRIP/Libraries/T1/9.gif new file mode 100644 index 0000000000000000000000000000000000000000..1cde334d513e6074f4013d50d2a2ef0f95fdca22 GIT binary patch literal 924 zcmV;N17rM0Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pi009UbNU)&6g9sBUT*$DY!-o(d7Wh#t zB0>uO%we!-5TidB91CLn2QuV9k2y@9^yiO_N`VmG`Fr$IpsblS0oVwGvuGg(1OPkwV7yoW literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/904.gif b/SRIP/Libraries/T1/904.gif new file mode 100644 index 0000000000000000000000000000000000000000..4755212a676eb3bf5af0dce20491efcbc26706db GIT binary patch literal 1051 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/920.gif b/SRIP/Libraries/T1/920.gif new file mode 100644 index 0000000000000000000000000000000000000000..d6759544da4902cda9dcb9751234bfd0650c9961 GIT binary patch literal 958 zcmV;v13~;pNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P^009UbNU)&6g9sBUT*$DY!-ok2l*wlX zBEl8+{4pb7vEYDL{``UISkOp4f8G?399Th@zkDNC3ak|JmP~;+GP)~rlLESsi*5q= z5|SK#X^Q*!eFp^(lN+(hBdUp*sDU4>*Nv`NTw6K+267P5}eJ|UZhl?lXL$Z`*4 g8gLd;-G-Zd`i0zav%s^EbOHz+Ot`S&fdK&kJB%sGGynhq literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/921.gif b/SRIP/Libraries/T1/921.gif new file mode 100644 index 0000000000000000000000000000000000000000..cabd1261e390b0c2b52057f7722948864b0104ee GIT binary patch literal 932 zcmV;V16%w@Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pq009UbNU)&6g9sBUT*$DY!-oYuDEr3; zBEl*C`k6~$(ICc*iaHjQmQi0Gkp%5!B!@EP%9aAJ=z9s1Q^tNQYu?P+(k4xm13umS z22;q*enDXJx;ak=OmjCi!2|%cAHP6TtJa&kXJ)^xFc;kf+fr;svM6P^139&=+qZB7 G0suS7o4w%x literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/928.gif b/SRIP/Libraries/T1/928.gif new file mode 100644 index 0000000000000000000000000000000000000000..75966f82bcd9c1f2a80bc58dc0641db12aa2f063 GIT binary patch literal 1055 zcmV+)1mOEeNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R5009UbNU)&6g9sBUT*$DY!-okIG@69Y zR|bd#7mV5GuVX$A7zHu_)Ujl~4Iv-&D#@yyKYSK2Hn_#lUpOie%K6I&0^)~a9Z7Wn z@F3kzln*O)Tvb3|l#ci$IBZafV>J&0i*!Vmz@Zg;{@e{An5bhjhcM3hs|Lluz!FCN zb#i#AW2Ay5>UE^ku!T8)*m@Fd@U7#dhNe0uG5A8AKYdOZhN+p#EkOch{jGzr@Bq+! zMG6jh((xV-hA%i`>pGA_pVD_3>ZmDgLI^Ts9?k36PmxrHG-{UoHyj_KhZw*P@8}K_ ZXNWOS`O=KaixdYTvuoeZy}Q7G06WhS^^gDn literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/942.gif b/SRIP/Libraries/T1/942.gif new file mode 100644 index 0000000000000000000000000000000000000000..6d6b7a291b7d0b79fee08a10ca04ba866dde1e66 GIT binary patch literal 937 zcmV;a16KS;Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pv009UbNU)&6g9sBUT*$DY!-ontr1JtX zp{0H_Djxiyj+#b;3t;&h^0A6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q&009UbNU)&6g9sBUT*$DYLJab16>zA~ zmA`W*C?<5~j~NGz1{J))=kFN-kOf)!Tgff~N`VDX-OER7C5)E^F!{r`<;O}eC=2-U z*G>|E8~pqM1sQ3j4S_TE`J)0-g*|_v4hU?rl7U78sr;c6F))-rc?u{NFyqf$lYv3z z`EzyBVU%_EoD5{Z%pbB56d54%XLKN?m2WBb@#k)bKp4KH?n&zq%RGEI04S(bZ>1TR z6mj|6l)z26mDz*{(AYq#t74)o literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/950.gif b/SRIP/Libraries/T1/950.gif new file mode 100644 index 0000000000000000000000000000000000000000..1389ac9177a9a85e5bc583213897a90ba155807e GIT binary patch literal 1046 zcmV+x1nK)nNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q{009UbNU)&6g9sBUT*$DY!-ob5{9yKP z93&GE364PJuVcq}e=-VWW3J?o$;@6QLCqVf8kwfv&#kP+3(trTKCFVUQ5BGR1 zG?2qPf2|Zagr%?JvjPJh_4BvvKtm4lI%1^*s{tZ~?WF9y@gq`3GJ}YDNr*6bQzx QKS3&%OP@}?I`x16J4>$brvLx| literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/952.gif b/SRIP/Libraries/T1/952.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f45dd0ced8c98ef2aba489feca06aaba8deb201 GIT binary patch literal 956 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/958.gif b/SRIP/Libraries/T1/958.gif new file mode 100644 index 0000000000000000000000000000000000000000..a9a7daf6fd5109385e682796b891196fd359afed GIT binary patch literal 1040 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/960.gif b/SRIP/Libraries/T1/960.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8d1c2543e34b0f4c0ec5d0a8051a5bd91aff76a GIT binary patch literal 963 zcmV;!13dgkNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P}009UbNU)&6g9sBUT*$DY!-ooO^>gC{ zqCpVF6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P$009UbNU)&6g9sBUT*$DY!-ooq`11l0 zVTEe_XjC+4fYCo{6*d;s(a+xykp(UFdlnLcqzY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/966.gif b/SRIP/Libraries/T1/966.gif new file mode 100644 index 0000000000000000000000000000000000000000..34fa763d7aa053e72f5e9bbf2946a481f8f3fdf5 GIT binary patch literal 1057 zcmV++1m62cNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R7009UbNU)&6g9sBUT*$DY!-oq^1p9Xe zqCpCM;`#Guu7SmYckXTcWQChYiw;O_+-Afwe@1xVv2p}VSi&Dnh77Rzb2io>D}R|9 zg7W80#z7?b{1st11s}XO2Uo=FhpE8A4dvhpFt|f4tO*SL__JjptC?~Bvb|`SN?ucf z1}<&1wxXekcC-`_JP~apEDa8$_|r3RKpb~8IdO1k;hVn!0$U*4xX$iF0_dh0h;b^f bzg8GNW|F6Nqd!Q7KWg93y}NgT0RaFzTN?WG literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/979.gif b/SRIP/Libraries/T1/979.gif new file mode 100644 index 0000000000000000000000000000000000000000..bfa304573b875257683d56d936a193a5ef3a9f08 GIT binary patch literal 924 zcmV;N17rM0Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pi009UbNU)&6g9sBUT*$DY!-o(Zj`&9^ zB0?$s_%*R;FhHDsn>ZR&0S}%Dkp-*u^MR6}%8)GuzKkg_5=fc=g7hmUfM$Vo{R-gZ y)DO$her=9I!da#tHJmk^;@m(k9}b+L`VBf-3TKIZxd`ASRcipwvuGg(1OPh_(YCn& literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/980.gif b/SRIP/Libraries/T1/980.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e582cb533bfc6170d31270202f6cb9e6136da85 GIT binary patch literal 1043 zcmV+u1nm1qNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q^009UbNU)&6g9sBUT*$DY!-okabc#pH z1jK>@c(n7!F_(dh0t0m6$dOMBkN_5V;rQ;DKV}P1w&BQ53j$RBwt)Q7&)>E#0(bfQ zbny#6f7jdyR6uMfL=o9IP8rA{oE z`BMj>VS`v4RTUWcU>HZN4ViE(=U||KNgUHnXvpB3zk7BDGAP3lpC5-@IFcIZ;1S1l zV;-j6MnT|>Vu^P=d{EEdTL*uv{;P!oVi14xu2@<}QqX~m5z>+5h)W5|05W*{v(+R3 N%IDCdOOGB906WUp^Pm6# literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/983.gif b/SRIP/Libraries/T1/983.gif new file mode 100644 index 0000000000000000000000000000000000000000..a8cbc750e631ee14a04df6cd4010b75ed51a83a4 GIT binary patch literal 943 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 U`6GFAOut_Zdg|TFmv2A-JN@CsO#lD@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T1/998.gif b/SRIP/Libraries/T1/998.gif new file mode 100644 index 0000000000000000000000000000000000000000..a3fbca90ed8159a4d79c3238eb3721f6830731c5 GIT binary patch literal 1037 zcmV+o1oHbwNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q;009UbNU)&6g9sBUT*$DY!-ooC#ENGH zqCo+d^!fAG&Vt2(9GGp~NbVzm16t6H+!*h}$1WpTL20+qjYTQ<{L$MY(8)%35TWGL zIbJ3sLJd1i)A@8@03I5_ zX<$ge)W$yrV{F`4qv4#5vj_%=vCbdAGY(Jro91yKo{i;5IIOb~&p;B)`uP)Q;2|b| z>M#g=qSD_k2N2EqYXl$&sEzkPRj??}-#J&c{b`$G(%DLVpXQo$!71J~Q8P>`U(UR_ H^MC+5^knwv literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/108.gif b/SRIP/Libraries/T2/108.gif new file mode 100644 index 0000000000000000000000000000000000000000..cadc488b7f67df4511020a2532c030e451edfd8c GIT binary patch literal 1000 zcmV9Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QZ009UbNU)&6g9sBUT*$DY!-oZ*{QB3g z;tz-dRV0}sk6%B2Al+$#xS`uekS9I*TJW%hM`>(gvH|3g-w}vYrWADf@g_!s6>53x zrQjz)SRmW^GzuV6JCKl=0)Q~FV!ud6H+riH^=F!t*{;Ro7ZoFk34gx9*Rp{CqTg(uSa$Hf^f56U=Z|$83uyKma=$1mU~@ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/11.gif b/SRIP/Libraries/T2/11.gif new file mode 100644 index 0000000000000000000000000000000000000000..b577d77fd48cff1bcb7ed940f539e49a56272608 GIT binary patch literal 990 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 B)*b)= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/112.gif b/SRIP/Libraries/T2/112.gif new file mode 100644 index 0000000000000000000000000000000000000000..711be95863a4a2763819acc156e329458658d51f GIT binary patch literal 1044 zcmV+v1nc`pNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q_009UbNU)&6g9sBUT*$DY!-o(fN)&iv z%Znyk3i;c}@t;4BWk4hpP^X_ZdHqtVT&a>w!U!x`${Q9lApt+!*rim41BWOaGc@!h zr;;I%K*rc0^j5T?j06QQ$S{O2WjBXE77VxPAOJglzwxO6 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/118.gif b/SRIP/Libraries/T2/118.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc64124a37614e521c4e5908035f5e9372719424 GIT binary patch literal 1030 zcmV+h1o`_%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q%009UbNU)&6g9sBUT*$DY!-o(ZYIs4h zVnq@UA4zJ~ucJqg<7zN8bMK?ckMS5H>v+$aJ8Lju;_FCnj>?XL0B9me1YXBq4GW=y zLjXVmff~rz^SCIYKmu@_dE9qNfl~l*K4!CdwNJ@@_F#!{df`Q^eEs5?;~Ei(K9BBx zTm?WSo=0;;5DqXhiUUF->^jEFghOBf2oMfHxRQ!hM`Z|CdF&yu3Y|_JQ=PPh@Sn$U z*s#qz*>T@5PY)1cs`r*O*n0J#WocL?(m0RBBI%BBbwrEb7Ul{cPQ1ABs{sK3JMb6i A*#H0l literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/121.gif b/SRIP/Libraries/T2/121.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4dc719102eb4f99b683bcab06736f79940372e0 GIT binary patch literal 1006 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qf009UbNU)&6g9sBUT*$DY!-o(VCOFWb z&Mzhh3_uhxg-oPxr&{$JxvWs6AO{+%8OgGxKbE*mFnrn4WlKggYmPJ)jOIvM47v52 zx5o>QqZ)bG!7`FviG>+pq)2!G(nv`W55^do%t6+ITl;0J@ReX#RAmPu*x}C~9RXh% zWWhqMC8$UeAX-`Gv*xphS?u-eTl1l|k%U>Aa!95gVwUW%DCGg7VFqt3X$gBb+SjmS8w>~lJ9p6Dd;kCd literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/123.gif b/SRIP/Libraries/T2/123.gif new file mode 100644 index 0000000000000000000000000000000000000000..ed30f176c69eb74138fc23175385b9506f7480c5 GIT binary patch literal 989 zcmV<310wuKNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QO009UbNU)&6g9sBUTnOLntwg(DOnni}uC=A?RRY0!EhL zS?m{#f&qaIL@X1+FxT9_{aihIWX+-*hVd-!yT=$G;C}CBFtkJO(3626GW}&GIjQH* LphJrm9S{IJW;5Ll literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/13.gif b/SRIP/Libraries/T2/13.gif new file mode 100644 index 0000000000000000000000000000000000000000..79e7f21a9c8844021d2c35964eaa11c58cf81b15 GIT binary patch literal 1027 zcmV+e1pNC)Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q!009UbNU)&6g9sBUT*$DY!-o(LG8nVP z(I$JgHfh{6h{i)j{z8fz>5rc@Js}u!6S=OJ%U+gxH50jn;Rq!oMr1J909?pS5e;ey zd9Oy$fd(+y3mN06Kp~z&<~xJHsf~Ri@hK_blo3gP%KEejs-u>=ulyKU2<6{5- literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/131.gif b/SRIP/Libraries/T2/131.gif new file mode 100644 index 0000000000000000000000000000000000000000..149b6c1cff20618408be55f1db32400d213fb772 GIT binary patch literal 991 zcmV<510eiINk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QQ009UbNU)&6g9sBUT*$DY!-o(VvM{zq zLBxZx{Q27li&U2s7X>oHr?KR|XP|yu^wDX|7*_L2u9FaQpo0j{GzO_D(8D8r{_@4B zxd4(pjpl&xT&3~eC=xsYbkk@gsz6O7sa3Q(L!HK39;|}drjbqpt16ahtYQ^_21EYd z9k42)kUx7WLq6z1=V(7T5eYcZ;)-6$e1syxIp*(Q$#-}_LWF|P9KC(NoavDqk&_t! NE-bbkO}cGB06T7X+p+)v literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/136.gif b/SRIP/Libraries/T2/136.gif new file mode 100644 index 0000000000000000000000000000000000000000..bca15864b88e1373bac07d0e36e05cd9527bc04c GIT binary patch literal 1016 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/150.gif b/SRIP/Libraries/T2/150.gif new file mode 100644 index 0000000000000000000000000000000000000000..057daccb81d1a0f51dc4f0091da80fefccda8e54 GIT binary patch literal 1017 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qq009UbNU)&6g9sBUT*$DY!-o(XmVwl- z-@l3#{{hO-Fvloy`S^+KCvqgeGYcn}Qpb-ZKWoE?87XvR9LZq|nb;EARqucty$t} literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/158.gif b/SRIP/Libraries/T2/158.gif new file mode 100644 index 0000000000000000000000000000000000000000..b2b64d15d14738f4e821ee595e14eb9b1f671101 GIT binary patch literal 1016 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qp009UbNU)&6g9sBUT*$DY!-oc&*umxR zpQI5G2W}{4ub)Sc@2+LsaLnVrSkOM|69bWy$82{1WavSyUpo#EJ1isDWZ)8Z{m^9u zzyYT~AMpC^i!`*LE05Hg4jh8-Bc`Sqw9Jy{5gZN#5J@a^w(VoTVkw3SGHbTdf{b;< z$?cP+%SRhh2M(C!5pP}q1a|fP3*f+AhAj|65Yx?LEwBo^l=BoL!H>&7TuJ+=s070i m?`-yB>rvbi0uCvW?uQTEqqGlOaAGT{3gO$hbL$ou5CA(!mgfNg literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/160.gif b/SRIP/Libraries/T2/160.gif new file mode 100644 index 0000000000000000000000000000000000000000..45d57f07bf91aad644290c14aac7f8efd3c73734 GIT binary patch literal 1018 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qr009UbNU)&6g9sBUT*$DY!-o(fN<6p% z4xCHzGETCH;vpGN^7@G!IWn9VhN8&vBgtx$%T3=zw(F?yUq2OAM8N=IfZz#f{meC3 zIISN8gc9h8yv5K$ivb5G)Dk&w$V7o!tch&4O8aMeq%u<*)Im{`HoyngOZ z-MAXYnaFEW4svk8H{pa)_xin4^#H&E6o~(%QngKFI)o9Fja>6+)F@pf`|0b(%@PZQ oeKM0&H?H)fD-7qTQx{TZAT%4Ux^P2#t=HSQbL-yCyJ0{8J4d_h!~g&Q literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/162.gif b/SRIP/Libraries/T2/162.gif new file mode 100644 index 0000000000000000000000000000000000000000..59fe207ab23e93de3e38398e8c3199555a094471 GIT binary patch literal 1031 zcmV+i1o-<$Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q&009UbNU)&6g9sBUT*$DY!-of1q)CGV zVnGX6qLu5{4_&m6L>xF2@PHRbe;iYC+~LrSN|d%#_G8KLSUryLv~=i@L1mx=4c*Xd zr>cj*9=JH>dqm)2m5KwSajcfcB0(FN_VtrS$ErXGNXq$>ckF{#fwE3kJ=*}6KYzf^ z3KVm#;}Z#I16-NcubvRO0IqO+_XDsPzPgGeOt7T!5`;_Oam3NUgJlmNE{`(FaUH^> zDQ~@$$+1!lg#SpVOwCc;C@Kz`B3wkeU9CycpdH(xqTvcOz=IC~OuV@9;|Bu*06UKu B@5BHA literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/17.gif b/SRIP/Libraries/T2/17.gif new file mode 100644 index 0000000000000000000000000000000000000000..791dd379ccf4cafbcd42e0e913dc51a602c410ae GIT binary patch literal 1023 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 aI$R4Cs$7sAe*wA+w6EX4fCDQG2mm`=jKgmL literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/180.gif b/SRIP/Libraries/T2/180.gif new file mode 100644 index 0000000000000000000000000000000000000000..72f80e54d1b4ac2b425f310ff5d6071cfa336fbc GIT binary patch literal 1028 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 bwTspcR-3mM|6QC#CIr#HfCCF&84v(FsqDq; literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/182.gif b/SRIP/Libraries/T2/182.gif new file mode 100644 index 0000000000000000000000000000000000000000..b20f3b2c455e16c74e66a3f142bb0a146e169817 GIT binary patch literal 1015 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qo009UbNU)&6g9sBUT*$DY!-o(fN=*3T zMWBBF`k`y%#!15fNs@TUmJS_1e*I3Olt=8t!U`%;s!Vy3CLo0soW-Pxij7Y;H2L9d z*6h(9iY9w4q(C8IjU?$#vY7|~f)kS|o4Jfw0n)FT(zZJMk+B~}v%jcFgcP*jIVKM# z_Q~ez$Sb!qs1jt$?}%Q35PoGu@)tk}l)V%*d{QfK!3CC3&T{zGZ^2D9!#FJ4uZ?HH lX8Wmi2q@;vbDl;({9yOmHF5mTWwWgJ0~;5GbL$QW06QM4>MQ^N literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/188.gif b/SRIP/Libraries/T2/188.gif new file mode 100644 index 0000000000000000000000000000000000000000..60c8d3600c6e4f38031e8d830f8b30949cdf798b GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!2wVrMm*tg zprTJ0MfuyfaZg2o-8hQeXm85LkRwIDb5hZRh#H7Q$i&An*o2P-rR>}2%L2}U0kX8? z=<%n(DI(D!F{&XKJC2cV7-fNSBdQ`sB}wB*?8<v1;1sD2!O zF)V=)ib!7>67nEKC|g~T>V%OXMXj)5YUehZL-;AB(R}d8?D@PJM8)aKhS&&$F;&%brd9XFvcuXUga# literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/190.gif b/SRIP/Libraries/T2/190.gif new file mode 100644 index 0000000000000000000000000000000000000000..dbaa90ebe08436be5b6c02a31d68568092a5a7a1 GIT binary patch literal 999 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QY009UbNU)&6g9sBUT*$DY!-o(fN>tb) zLkJ+M;;9RDo zPQ}bq8K^?otK4uHFlZu24qL_I zBIGhQTa6BQ@p4I(D(Fg<>=6Eqwd^lT!!EhOk%7?WOvhbk`fBuG;ZI$MVf8$vW`k#~ V4IA9Jq1LJC)2LIcUi~m206Xu&<7@x` literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/191.gif b/SRIP/Libraries/T2/191.gif new file mode 100644 index 0000000000000000000000000000000000000000..8fa05be92a2332b5495fddf5b758c644d1e7bd41 GIT binary patch literal 1017 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qq009UbNU)&6g9sBUTu3lco>;<0FidD* zo487{*rM-h|6Cue*Q3xJXo@hE`M@X7HohHButqFU)hX_bKnL_dTRM& z)6?KDe;SGsH{`8xzvV2p15q7YngOXdJ!{(c=GNT%Mx1~qCV06^f9KX)z) z;u@#00k)6fDkb|!reKkJofO`+`4QCvf(1zVi=@yV;g7pE1W;f=g<^g`6h1P?jvcs8 n`9A&|X3ZJMQ8KlFdz|mkQ<)wXt^Oz~Mb+E5bL-w+H6Q>xm{H_9 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/199.gif b/SRIP/Libraries/T2/199.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d66849bb410395f974a7f407123fb5f74fcfbfc GIT binary patch literal 1012 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Ql009UbNU)&6g9sBUT*$DY!-oLMc>5Gb z4g-h-bBq#~kDteW*O#1 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/200.gif b/SRIP/Libraries/T2/200.gif new file mode 100644 index 0000000000000000000000000000000000000000..6900b9a8b2706e9dbaaff027779fc7ce23d310d4 GIT binary patch literal 1000 zcmV9Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QZ009UbNU)&6g9sBUT*$DY!-o(fN}TAB z!G#MP3Kc46PU8{;5Igl7NzxxlVt@)XWPy)lKXIjEx+7`9;h#aYo>+J=Py(@$H7N=N zq_5wx1VR_Ak=Kvi9HB8}jid);qJSE*{O#)&NToy!t4PWcF|h`#a3g2w7|22hnYUz! zC2RpJ-^gJhGT@;!Zyvs){q&tPgz(5XmoER2jAtxT5`~`-Pm6?T*`+~xZmeiHOrE@S WgS;#ds6eRc)2LIcUd_5;Kma=^`r7jV literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/204.gif b/SRIP/Libraries/T2/204.gif new file mode 100644 index 0000000000000000000000000000000000000000..5dc939bbff624fa054c971e73e7ff30fca607309 GIT binary patch literal 1025 zcmV+c1pfO+Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qy009UbNU)&6g9sBUT*$DY!-o(fN>mu8 zkHw1?bv#5NE?+-?{{DgdCla5=g)BbZ1Ie-_OMDFd#ADg2Ql&o=NL1E#UMFAHe} zM)=~+-?TAt1wMJ_k6eYk0Al&e2PJQUUjE+AU>G43sTBkYp13vGPeVl_{bc~)0DuKR vwEXD{=8zrBP?wlpQYTWM<%jZI`r8-p5tfKI>eM-f58pE?fP)JM91s9I+XUqA literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/208.gif b/SRIP/Libraries/T2/208.gif new file mode 100644 index 0000000000000000000000000000000000000000..7cd811812948cf0bb2e6c5e48cf8932e7fa57cb9 GIT binary patch literal 1008 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qh009UbNU)&6g9sBUT*$DY!-o(fN<>(~ zjzx=PCW?XMt)EAa`@*ew$imyck0?FLTNerj!yxqf{mBq$lb;MRHfj6F&gH@XPo2b5m`!V eAR?YZnGc>bHyf=!W literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/214.gif b/SRIP/Libraries/T2/214.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f045c8d504e80d199cffa2ed466fecf9222c380 GIT binary patch literal 1027 zcmV+e1pNC)Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q!009UbNU)&6g9sBUT*$DYK^~j>N&Mo_ zAOs}j`t93DZ4iQr0wMI;sBz=Iem+0~ShaCluOe>folFVR*S={Z26mgN5|5`l1i$tB z_d}&YFfvgZE%=8d&7}gH?o0I%DgX-2HttZ#gCH1*{eo45u*#P?U%o7Xm}AmQMX4o8 zwsm-l-8x>qcyW`vv5-TXyavKGx$o17g*?plt0wFp*rAXAr31r2p-sN~&V};Ph}_AI xohl=IW3uG77Xv{si|ZC40XMwxqWW;5;DjygHnz43V9U*%yn_oLPCR%(06P=N^3nhR literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/216.gif b/SRIP/Libraries/T2/216.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5d453789e4fc1c8b0fa33f2a70b967835d83853 GIT binary patch literal 1021 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qu009UbNU)&6g9sBUT*$DY!-oQ+q*0S5 z4J?1{(ingUV9C6G{`!d=`N;u9Eh0nmJ4Gm;NKPkHhVvtEmPlw27d(c8$!>Bi z_yE^PGeZX=_%*T_hok`Bz#G}m0#r61MVi||0BXpQ@s2qZr%NOVjhK>UE_*2sVTHr>$6ySH!O0RaFzjgaNc literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/221.gif b/SRIP/Libraries/T2/221.gif new file mode 100644 index 0000000000000000000000000000000000000000..04f41a3ef94c1fbb5e03c6e87ec7ac3c72122e13 GIT binary patch literal 1010 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/251.gif b/SRIP/Libraries/T2/251.gif new file mode 100644 index 0000000000000000000000000000000000000000..9603bdc018985431b2d2720c27510f51553e4bb7 GIT binary patch literal 995 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 NphJruO&UNz06U)o-cA4j literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/254.gif b/SRIP/Libraries/T2/254.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a8441b7a9b4ec2fe8e3e08394fd70d261c35208 GIT binary patch literal 1037 zcmV+o1oHbwNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q;009UbNU)&6g9sBUT*$DYK`;;_VsKcH zh_8P8GVbfw>AB)usONyuU4#f!l$8G}(w z2%?|Sp$KVcM0(KIQl z?kl1Y!XHm4Gh*b0ckcs*t1?dORpf)=Y8p3I`J3?S)DZ=RCGO{A;U=RW1TugqY^>3K z|9&i#Tg=z5VjBD1b4hvhcyZG^j~As669ggv4zlMLDOHmzU(USw H@_+z4zu@v^ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/255.gif b/SRIP/Libraries/T2/255.gif new file mode 100644 index 0000000000000000000000000000000000000000..8ad8eb569972ef76919028b53f6d29c56d346705 GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-oYkgmP62 z)T0Iv2eOF8?i@C3@%#zO2w=!LcTg$_EOL(#NlNW>5LDzZ4#^f02v)+^i2zB01*Xiy zSL7!_QvSA4F*?D?rEdQG?I1ZJ3aN5Yvxe&x!zP(uM6Fd__5E|pP(&(7Gp62$qkY4hf9T`LnLEnN8|>>oT%mH!GKPQ19mfB-w|R_Go8 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/256.gif b/SRIP/Libraries/T2/256.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b4094bb94cfd0ec5e4c4b664a2f9fc6f746085e GIT binary patch literal 1022 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 LphJs37!UwEEA872 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/278.gif b/SRIP/Libraries/T2/278.gif new file mode 100644 index 0000000000000000000000000000000000000000..686e57f24619ec96da6f0294c58fd75e22c6e469 GIT binary patch literal 1039 zcmV+q1n~PuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q=009UbNU)&6g9sBUT*$DYK_dPl{!3-V zA;AX`jF{`kk>jxg76I^p*RdqWQy?8K;^;#Zj+eqZKCrl`Q6K^YRmikx0cSy-9AAVy z2(;gsQ|+UW5SLRb_NW93>}9xTo9^bJC6H$ z4ePj6;gnV!%_)kZNT11mAQmcl*Ut-#69aijEg4whmVU)H6g>5}&ces4ba)V0;}buQ z(z6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-o(ZCV=wn zpTCP?pg>{K@Pwz2sQQTiTq!$I^f)L7-VIvtYi_=pz-AReKp=LiY5dla@R?}RJuq3Xi#Ya+6Sb_&I zjnuc}?LZ&yM)I&L5JWnWmJIMMv23JUg+it&-a&#y1q~!Fd2726%F1ChRd#Ap*(=F* f>rgO^!RemYPn;k?q@&W06DI@s%AQTzU_bynW6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Pv009UbNU)&6g9sBUT*$DY!-o(d0{Ta> z;x8Z&f&8k-k>W3i9sdCux$)n_i53Y0p$PKd#ex+h9xMq+W6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Ql009UbNU)&6g9sBUT*$DY!-oQYxJlQq z-@l3$r+s*sq+LIL=Y)ts#*g1eXB!)W;@9pPAua$a966Hh9zQk?A+YgrFhI7O5D|X7 z7Sv#kO&?tq9SFe*I+MsKEEV{xq{%Q-$5^cRYpTFnCQG983INHqrzP>@0oVc~+R{S+zeH*4XhlKrqIyjbWUgf^=%Qd#)%Ubbvqk|a5l&0AQ0 i(ij#JXVvP*k}ct+T=;>FuhJjS?UYNqwr$%10RTIvGUp%w literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/29.gif b/SRIP/Libraries/T2/29.gif new file mode 100644 index 0000000000000000000000000000000000000000..011a51425d3459c08a8bf6af70feaf2d05faf4f6 GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-o(PLh0r2 zpTCQ)%6yQ);2{)w{X&WiiA|g{WXN$Y} z{<2yJ9KDe5JX|oUBULr9Ppn!IDK8O(uGmC2@`1o=fp;xgiJA-q!2yR*?$s1|Oo+oT f$Hvj*W-i$}h&0BGaV1jEi5wQjbe&Cmc0d3-8fD>p literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/292.gif b/SRIP/Libraries/T2/292.gif new file mode 100644 index 0000000000000000000000000000000000000000..65ab9362889f9e4d8356566fe38e0b4ebc1cb26f GIT binary patch literal 1008 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qh009UbNU)&6g9sBUT*$DY!-oZ%*s;^< zU$+qu2Le%Nub)Scj!I+%kjvvfYqjQi1T)giyjwgx4B)nMta;khJ7C2GzGxLoJUXunoeN$QC$$NUYa!{*Y6z8sQ}*a>-P(-z<6xY z66kZUU!SQA(A@H9qoI*08wx^z_0b0ch8Vu}%Vy_8j~_o;_1pLB&|!uhlzqIm_9Ib< e9gd-^_tB#zraz6)(Z?(krW9^t%bx8vAOJg3iR>Z( literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/299.gif b/SRIP/Libraries/T2/299.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f2c83bdab39cefd6abe2c1d382bede8bb1bdc15 GIT binary patch literal 996 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QV009UbNU)&6g9sBUT*$DY!-o(V#^{5} zpGAM5Ohg1QN?*T^Ap13osD@w2ko%xO6k_kAwn~*?fgA}D(k2xV1k(AqF33iLv0CYNLf9V7~}k_wgPZrUGS{`lt@AKnA}0 z-D~2OWs^GlAox{ S8&7-!X%0=@)2M$21OPi>aNYF) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/309.gif b/SRIP/Libraries/T2/309.gif new file mode 100644 index 0000000000000000000000000000000000000000..7fa86625283c67980be4e664247b127eb722cfcf GIT binary patch literal 1014 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 K^XCZz0suRk4D);d literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/319.gif b/SRIP/Libraries/T2/319.gif new file mode 100644 index 0000000000000000000000000000000000000000..235c7b4deb999e44be59dc6821880fde423a52c2 GIT binary patch literal 1030 zcmV+h1o`_%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q%009UbNU)&6g9sBUT*$DY!-o(f0;pgI z**`@R2S$K$&Y#C)836zh=TVt5f0ZQWptR3lGe8Fj`NIT}$FF|-ia9v|V8*>{7$Bx` zbm|GgSpL{VL}Bnyzgq)B4&)IJoC>J}ZTT~b6#$=oy$p0^kq_Pqfdvj6C=fA1$0Pt) z+$k2#8L}1-1Nn>f$C*8U@T8IRR}O?j8Gk+A>t&<_01J=$O*7H3mdAIBG#G^C4-tZe zV*2T`WdR`pME<-e?D39YorMA*kqde-!Z3erx&ol&?^6KXo`yxxO}w~q00992JEFtn ADgXcg literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/322.gif b/SRIP/Libraries/T2/322.gif new file mode 100644 index 0000000000000000000000000000000000000000..e28a0d4972286025a0131f9b0cc1f2908fb96d6c GIT binary patch literal 1022 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/331.gif b/SRIP/Libraries/T2/331.gif new file mode 100644 index 0000000000000000000000000000000000000000..8e31f6e84e9d8e0c7f29db3665b90e9666475435 GIT binary patch literal 973 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/348.gif b/SRIP/Libraries/T2/348.gif new file mode 100644 index 0000000000000000000000000000000000000000..0d8b67a04257fe8e03f39b98d584e00f9b09f2dd GIT binary patch literal 1043 zcmV+u1nm1qNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q^009UbNU)&6g9sBUT*$B?!YqLL{nO&G zpoVbb!r9};uird694ZQ2!;jpsVahsk3?>qQhHriZDxg9|8^3QY5mw>%?nh38Rr>XV z^RwVic}j{B6n0bTKqm8=It37iW2C77VD%&Sq9Ke);pkMU0z=@%e*7pkv@s4XM}Fms zVd2y<-HL?@6oKOh@0*-4-`sM9cZA`nw~Po1=9ieExPI__3TzPPpHQK|7%&XSZ;ZeW zRcfhx+ppFHg;_RUD`xE4TXK|cY*HEPG(r>6HjYjgsVjh)?f6*>sSryum5oXmlmX`o N*5}ZpOK%wv06Rpb_8b5J literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/357.gif b/SRIP/Libraries/T2/357.gif new file mode 100644 index 0000000000000000000000000000000000000000..21b9a588a4a09cb4c82f1cc127d0a70a67791c2d GIT binary patch literal 976 zcmV;>126nXNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QB009UbNU)&6g9sBUT*$DY!-o(T0{iE$ zqQ6yzK139#uAj$`{nX*w5RpPIbcz%x=+equziS;fa^OG^1EGGSHXa1gFP%<Zt^f}83xrlJTdr== yKI)f;E0%oyGHeVpXO5Q{gX;CuhhbwEX(0RA+p3cRj7sVHWy^xLvgL>Y0RTJNBGlmk literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/361.gif b/SRIP/Libraries/T2/361.gif new file mode 100644 index 0000000000000000000000000000000000000000..26807ddc81b1580d6009172766bdcb12ec72bd71 GIT binary patch literal 990 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/366.gif b/SRIP/Libraries/T2/366.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0b0d7d86445ef5ba96da56692093ad3f07fc7bc GIT binary patch literal 1009 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 L^XJeV1_S^*|Az19 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/382.gif b/SRIP/Libraries/T2/382.gif new file mode 100644 index 0000000000000000000000000000000000000000..c899e54848e9c093deee9dd5ea772266cb100d0c GIT binary patch literal 1042 zcmV+t1nv7rNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q@009UbNU)&6g9sBUT*$Ct!c_enD%=xp z9zStpCP*x(;T*q@{rFwkNbuQ5ko?l&APIp{NPg_#xcW$iB$s~w`jLA9Ku*7YH8-Z> z*Y6t*fpPdHOF**5Fk(jmfbhnT6iI^wGKIWxwO|LL{J3@%sNoq-R9$mafdRnQ$7>-R z9>`&=STS|{$`yn6keMCC;q2lgb-hHtL%^Q8p9*OwokI5gJJm*lcIfBtOLkcmBc zN=yv$NHh>4aQx!Q(x|WsKYPWfe&klj0Dweb#U^x(l3%tG0~Le{2a9z=6WvfY0zS66 M^XJf`j|~U_JJAO9wg3PC literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/386.gif b/SRIP/Libraries/T2/386.gif new file mode 100644 index 0000000000000000000000000000000000000000..2014eed4cadebf9efd42b0e6b72b1867285fa4ac GIT binary patch literal 1030 zcmV+h1o`_%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q%009UbNU)&6g9sBUT*$DYLKWfu$%B%? zVZltEJU#2jv7Zx*00#Jo#jm5uJRlR8{1Yb*td1#7N&;{|5l3$^`xO$@06?COA1w-) zF+;$>X&mPn0cr3CIgXr|7Bt0;qq-GR2hwQQk%v@0r^06I7^{NA7538ZGs#gEfrce2 zonmY9l>~=lI^Od}mr??TDhAc-XHJhbTXg$jU5KV*y=nAJKIMpn!oq)v`&Co4!dXXO zYZUsUTdy1nfh5%FZIf^p+j(3HhU$n)VFuUzyg6A~FoKic6S4{)PQ18rsR021J0HaB AH2?qr literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/391.gif b/SRIP/Libraries/T2/391.gif new file mode 100644 index 0000000000000000000000000000000000000000..f9768758fb39400094b60e2f1995f507153200fd GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-oR{Nbr)V z)wC)BAPyAL$)7)a<~&x?C~%j*e1Cvsu%&Mw5|ZNlog;|O-x`=Q2a14alO(L10wbOD zL6VKXew73WxaMyjNdPcb`P*j%l1Eri0Sx%^#6&uOw_Ic$h{fMOIb#L(Y3EOifwV#3 zq2qHPt$}*}h7GKv4TVMnxcrUt3jmHtjYj=_87RjrwFD1O`0{wnl;uqPJRW%n&7;S6 y(LDQ;SHmF~y#DTCN&z9vJ&&j!PWH!-3c)~4Z9IhHQA$As5gw!+PQ1ABfB-vGNbFGn literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/392.gif b/SRIP/Libraries/T2/392.gif new file mode 100644 index 0000000000000000000000000000000000000000..f07f35d9f296dd2f403b13e2b12e8ebdab997c39 GIT binary patch literal 1055 zcmV+)1mOEeNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R5009UbNU)&6g9sBUT*$B?!%O*eI7|p( z5I=u)CL#>s&tE)3G}N`YSLbu^aEAHJ6}=ykmH;F8Uk3yArf z1Hl42eP~_+C_y8F0#E+pX}ln$>ZoF^a181A%;AMK)L62tht8kADh(|d>xkxv+cshu zHFOfqpF1%Q2G(HtFX=)k&-|gXK~RBDmcJM(^S3JjK@FHXqMPUM9+HLm<_#gZqpUw_ zA*THE_Xcw`3jh!Rxuni4G!OtnjLw7EUo=R#SV}`HkfT3&2NY5k%Wv8Sf+6zxqeobw Z9X|4&@v(BS0iWhdvuoeZy}QDI06Xw1`V0U7 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/393.gif b/SRIP/Libraries/T2/393.gif new file mode 100644 index 0000000000000000000000000000000000000000..f38430a7c4f4f6675fbe5a46805a68469d2ad377 GIT binary patch literal 1026 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/406.gif b/SRIP/Libraries/T2/406.gif new file mode 100644 index 0000000000000000000000000000000000000000..64ec762dc2b53ac19e52539c9145d90fd6bf9c78 GIT binary patch literal 1036 zcmV+n1oQhxNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q-009UbNU)&6g9sBUT*$DY!-ob{sQO0< z-ZDW90ze$F0ui}>An$?f#{l9VkoeXOdXwYLyncZonjvRMNkMk~>_9}==-#jaI}19v zQm-Go0znDR0jZ8gQh`uh$?FHr#?uvD-t|jI=|EBkUD}N-C+DdHWg|hBlkhafjkh-d z^<%c=DM1)oSs6&!LesE?c>59Cix5^mN(&eDv(`bOFn*pAf^d}2nwEtg`oWWgkPyga zB^3sM)Q=xKMifZg-~fk`zJAm+G(4~cBtLrg@D&BQDZ|465&}(1+b^3IjdqhOU(Wns GKma?%qwE?0 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/411.gif b/SRIP/Libraries/T2/411.gif new file mode 100644 index 0000000000000000000000000000000000000000..d856fdbc68d87e6a7e0d854bd143008129dfbd92 GIT binary patch literal 1005 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qe009UbNU)&6g9sBUT*$B?fKvV(lf^M_7{$b%S|`RkYE<-tlbYuYS`ljcsIIe!j> zpz9y80zw5MS!pUM02}32vT%wiqNSt=7VYboO+(TX8uf{BI!j}sgk54VJXWt?s{;T) zEMWz%Ze4r86jCtLww0h+v!-d(nD3huB_9&Pp*FbjOpS%oFeJ0J@nBLY95@irFqq|X b(7f!hxnkTVSJBX@b;`Q6>({UW1Oxy(Q|{xO literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/426.gif b/SRIP/Libraries/T2/426.gif new file mode 100644 index 0000000000000000000000000000000000000000..f47a2db394459efcbe6ebdbd73707635507da9d0 GIT binary patch literal 1033 zcmV+k1orz!Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q)009UbNU)&6g9sBUT*$DY!-obHbkG11 zVFOnD&P}LTut6<;{Q6xhR?HZy91v%Sn+LKV$dLTzEpaHO-@kj|`ji<60b4&`4l%}~ zVz2|qMGhyZ!LgBG7H0f(ec(tCR=a-VR#3grK~ukeVOWkIl!TMiQ8K`A8NXl+4qkGJqhSMH z_xd$zRHH+K7P9*J`;_5frfzNdJqriY5QmBx?w~sBQdeiW04#7A-W0g;Sm literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/433.gif b/SRIP/Libraries/T2/433.gif new file mode 100644 index 0000000000000000000000000000000000000000..5685d7f2a6aa53790152ddd4e67366e90a7289f3 GIT binary patch literal 1026 zcmV+d1pWI*Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qz009UbNU)&6g9sBUT*$B?fCDEEO$s(i z6*evn916toq?o^tz~ z0`#CzqD2cHO{#P#Q-Y`3b$B}P**K~KbMP~=lR_s{gK`YC;!lB1C*D5#+xP4g8+U~S zXdLj&-v|XT{EW-@k%vtv{#GR*n9SclTLU!CX?J4afj{<=aq|aBF}A?~7%=kJD?x`% w{md9}z;KSgQAZRt(>DjgKt=v2Aq%l^!nBX-+Kea&Ve%`iz=I1Pt}!40J0<|>1^@s6 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/434.gif b/SRIP/Libraries/T2/434.gif new file mode 100644 index 0000000000000000000000000000000000000000..0d2600b2403665221b102afa759a7f328f076de1 GIT binary patch literal 1003 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qc009UbNU)&6g9sBUT*$DY!-oR%`TOVZ zm%oeBvOpAwub)RXotSyVH?0Ij6ev+R06+l+E{|X~9*hH1X2A#HYT5*VKuWNF`m&wa zX$6_be!pyvnS^hjM`#!d$n>V~Xg^&Pc6PMd4^sl0Lx_kaGRdQeodgG@>US3Hz&>o< z3M8;AZbK{?4l=N1wjmXKv<@cmI7%wRF#Y0*DJV%@zi&eucE~wz)~ps=W~J-LuMNZ~ ZBDwb4cS)uOLtMw9k;}TZ>(>DR06Y44-Xs73 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/445.gif b/SRIP/Libraries/T2/445.gif new file mode 100644 index 0000000000000000000000000000000000000000..d61cf39ef133e5d9f5547431e7e67e49fed85fd1 GIT binary patch literal 969 zcmV;)12+6eNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q4009UbNU)&6g9sBUT*$DY!-o(TI-rwi zpR5NF35F==ucNWtp3Z&RFJ6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q3009UbNU)&6g9sBUT*$ED!3%vN&T)va zO0<3$`^B?Cv7n!f8RK;%NMM3VHyH1YJh&m{N`o!?seDN=kxQBaiLkp#lR>YHj&L#v zmC@c7nhm^w?8k4)}BdW=pe)-cv86ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P?009UbNU)&6g9sBUT*$DY!-o(fN*p+f z(2R>1XH<~5tRFv*Ao+b;mLlRAN6S*GwAPQ=M1wQ){gsCXr^$^eFk#2g-T=`ensQ6UC7?toSW!3IIt^vQMKlHRG>Z(+VAX e`fSy2RMS!YRv~2t)X~wGGtgZ!LbkBPfB-ugzs^_y literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/453.gif b/SRIP/Libraries/T2/453.gif new file mode 100644 index 0000000000000000000000000000000000000000..acbdc9d636540a234de30a12349816756170b405 GIT binary patch literal 1010 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qj009UbNU)&6g9sBUT*$DY!-o(VR&cbe zq9`d52m0{WkE6$a!Hz^U(~n<2YL|eOEa`|s#1sT4E}Q4C8pezTqm*0*F-3)fNHB4{ z^>EL;ZxxfS6y(w&p^i{L5>fzBfs8F%E?r{9ubN3}dvM0QrLH5ZpJD~hxU{pW!3A6} z4U)LbA1j1j2YG1ds3by;tv)FHFr$@Oye82(GIKM94>M+Nr8CJ7*xrK`ZvE@G`J?B4 gw|X!?sT%KcW!kbzT*8MkR;%brcUw!(k_JD-H*yZ`_I literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/458.gif b/SRIP/Libraries/T2/458.gif new file mode 100644 index 0000000000000000000000000000000000000000..e74c9d45fed5f5349ba6dd787961eaf36b4fc87e GIT binary patch literal 1021 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qu009UbNU)&6g9sBUT*$DY!-oYWtXKiY zRX=}OM{Fp%yZ z%@7xI&BGPCJ~rY2KpVe%k*<|vyU+$Re!qwi*kI}77yuGRG<*OorN9r``rQk&krYTc r52{q-m#s!gU;M;rYxmL+1D&Wr&dU_jrzDWjBsbm7ySHzG0RaFz@~`A+ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/460.gif b/SRIP/Libraries/T2/460.gif new file mode 100644 index 0000000000000000000000000000000000000000..cdf92685a7b5abeeff63bd4c84908a5fd2ee0f66 GIT binary patch literal 1006 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qf009UbNU)&6g9sBUT*$DY!-o(fN;D{7 zM>&80{`o7HMuJ2w{X&WiX({3far{aZ0%4~Tzkd2kLG0D9SwSMs`i;}@a8o~31_^~+ z@i4(11q1_>AlGkLfr$VX#P}2v-x`S#u6TJSlG_=G1H`;)H!`J&h%82mw3lc>LpU_c#cz*WdQdk02H*Uwkrfl>O2I}Ct9w0_qZ^Z9!?&%TgLpfa!`EhIV@ c0V395GK*PAa;|tvq#07v9t@0QLk$Q3J5>1E-~a#s literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/473.gif b/SRIP/Libraries/T2/473.gif new file mode 100644 index 0000000000000000000000000000000000000000..f3cf3db4a4af6e7cd82d51fa1d6224f4b7d88788 GIT binary patch literal 980 zcmV;_11tPTNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QF009UbNU)&6g9sBUT*$DY!-oSAKv{+h z0YrmWwD~iq570$|ESfc=@xT$k7aswfI7cglzybbjq#RXE0l|MVKavYmFlI^x1PH>+ znUdfYpG663(x)OR!DQ#04s7GEj8uV<{Gqs-pc|>H0C@QOa#cXAZY@r1D3G*^zqkJ6 zaU%tY!$lSJ-sZb!58vByJ|0Gx=Fixg4FV@9*+Yub!#n;^HMp7z+hnkqGiy#75CA(6 Ca?=n1 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/477.gif b/SRIP/Libraries/T2/477.gif new file mode 100644 index 0000000000000000000000000000000000000000..189a49b2011a6c148f6ecbcba84bc7462819c926 GIT binary patch literal 999 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QY009UbNU)&6g9sBUT*$DY!-o(fN}L$+ z2OeL-gbmX~Vd9W_{cOpS#j9TyiBcr;CuOKVA%O3L2l6U0EE01sdeY3rwL3qoi9{NV!!PSgjA V23mBnA+)sV)2LIcUac@706VXV+PVM$ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/478.gif b/SRIP/Libraries/T2/478.gif new file mode 100644 index 0000000000000000000000000000000000000000..fbc52d8c213f9e706b4b9c1651ead3f0dbafcc80 GIT binary patch literal 1036 zcmV+n1oQhxNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q-009UbNU)&6g9sBUT*$DY!-oPNfYBp} z5+yJoAQB|SuVcTC?IdXwn1~-WRp{<@d}s6~BJqTtbvkaDkPNszx4c z*RNg-p#>>*q=J;7QhrRE3e;wjgHQ=-JTX%9(T~P1uKNA!M^ojY zuKcwS#HxB7srd;K#8<~ZFDg`EpsG%5U(P&X GKma@RGVBTf literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/480.gif b/SRIP/Libraries/T2/480.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae0f095e304a0119491737ae4683fbb385df2145 GIT binary patch literal 1015 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qo009UbNU)&6g9sBUT*$DY!-o(Zl9=Yt zUpz>VMnn|o<6ggy{yyH@vN20PcA8Rt`$%sU4Tw?VeHnPbM!AoTBAzgK;iJAF8wrj$ z_R*PzpbC~8i}$gf6NnI6#Mu-tWIuhmjyjydYuZPUAKh($Sm^6lXJ4UVc&Omktv7Ev z3_R4&pOK&jt@RuC058F^{j~Z8;OL`Zyjt}2Qy0N615@-qJ_&lDg&uZc*%WXXB~p=1 lo34HQck<;!SZ2S*8iOKY0~L?VA$#N|#NgYwa}x{*06REe>6rik literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/487.gif b/SRIP/Libraries/T2/487.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f2f42dc1b93455f519b6eac03bd27064d4ccd9e GIT binary patch literal 1031 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/494.gif b/SRIP/Libraries/T2/494.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ad9b543664670a49c5a1c07f0e6f35532a7a10b GIT binary patch literal 1008 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qh009UbNU)&6g9sBUT*$DY!-o(b9y3Fs zB837G399Soub;-fWl(;%OI^?DLK zaID`=p#T)1>UR!D&kth6tn&CI;{`m){AvB?uNi`fZJw?47*AikNemi3p(E*Dzi-$2 z!As;piK}L87HVg)PpfQP9DJ92! erKTjv_{}pWBtjXOsiR>6($}zK%bwjZAOJhbpXFQt literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/496.gif b/SRIP/Libraries/T2/496.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b43e61e66ebdc26679dd99af76c22705c22085d GIT binary patch literal 1030 zcmV+h1o`_%Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q%009UbNU)&6g9sBUT*$DY!-oQS{R8Cy zB0_Qf`kA{!f`UbYE6iogm<w!?LJnY3 z$er5(!UYsJJdNwO>Of9{w=zcfE6~a|!G9r)$(B)GP>2j*z$i0qq`M*uTMP#9qsc8~ zHK%zxnb5!{cGi+5+m|(;nF$OffX(lJH)u- AcK`qY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/50.gif b/SRIP/Libraries/T2/50.gif new file mode 100644 index 0000000000000000000000000000000000000000..01ffbfad2e26346dd8a3e6510c51940524810bc7 GIT binary patch literal 1018 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qr009UbNU)&6g9sBUT*$DY!-o(d{*dFY zpT&P0A_5Q-4qiWgAo=wp7fz4~gc=MG90CvI$B-}i!9iFC13?aX^1bWFjv1U@FSC_+ zm|@HhI5IxD<_n%#uVPodv`zpI|4}HZ2$lO literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/501.gif b/SRIP/Libraries/T2/501.gif new file mode 100644 index 0000000000000000000000000000000000000000..44c66bbf8d0d945dd62e4ce8099a90c36025c371 GIT binary patch literal 980 zcmV;_11tPTNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QF009UbNU)&6g9sBUT*$DY!-o(fN)%|~ zmm&-p*eDV)5r7eX{Q7|eDGE!2h%?}Ygm>$fJ(0>B9e`Lu%rs{LRkVo(a@vZB4I~gO zU}F|PZXFA*i1&|6QiA6CIeiL%h`oD5r~)v=&x=+%_>fU;5XKv@1xZbefi})ngs0E= zwZoznin4z6ola5WfI0o($#5*P2<3An9BXD65CA(b CZ_jA} literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/51.gif b/SRIP/Libraries/T2/51.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f3c99d20b5df767332f86e4c9965f7cfe3ecff8 GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-oPH;9%tE z6*4daAPO8|%AG%Z^7`5HH$)=GiEFP+dN}yZo&%ExZ|qAI04Ko(*U(Y$ zIgo-ceLaW*z+lIjKYWhZNWl5yo4>1Aqv53CD$o}QVAbU7qm>c}4}tirWrCmxUjCxRZOA~}zi(KG0O};q-?IxETS&v|@1MV2 XF>s~`^sd~jEf5B@UCp|+#()4j1Uli= literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/510.gif b/SRIP/Libraries/T2/510.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d88d4c1dce512a0bddb1af0ce8c03d049fa42b2 GIT binary patch literal 1022 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qv009UbNU)&6g9sBUT*$DY!-o(fN?bVM z1rlZGF1bIK@3rV zFc69;e*GHRm9Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QZ009UbNU)&6g9sBUT*$DY!-o(X3J`&) zqQ#0?8XS0NqMyf)Ap0@P5TGH1Um;WWli)DIEpNca$doxrpGQa$4^olmF{i-^?|S+q zD99tKp#v?f^OyoDfD6Vvf+OJ2MHgVeJ{8$o%;PsQ3|TD6v{a=>H4Ja0GYgUkRfThw z&ZDHmnpq4B;y}6cm}+A}cxKD-umB(fBA$R0`b$}h2TOt#5KU27Ik_Ud@_eKma?LUD;It literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/531.gif b/SRIP/Libraries/T2/531.gif new file mode 100644 index 0000000000000000000000000000000000000000..43db941cfd13b4a53cf178aa84168ca24c795391 GIT binary patch literal 989 zcmV<310wuKNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QO009UbNU)&6g9sBUT*$DY!-o(Pny5mt zij|5cA_DNnuOq*H9=jPs!s1~+dEdT83YRivxP0l5IE14lp(K9qerP;ste>l$29b0G zS}?~@q5~}*MG9jazg9>ER_P}yDgYDP_)&=p!dp5k6NnzzbFE)Z0v$Rq*^z>gLl~tx z_QS*|(?@=d#w^qjC(gfqfcyO=$B5CBhD^@M^~evEiV6@XluGw8*)TIVh~l6^C4tq? LphJrW9S{IJ=ZDpi literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/541.gif b/SRIP/Libraries/T2/541.gif new file mode 100644 index 0000000000000000000000000000000000000000..54094c21b37c4a278d7a71b5b4362d6f1c998e4b GIT binary patch literal 947 zcmV;k15Er!Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000P(009UbNU)&6g9sBUT*$DY!-o(fN<5fD zj;f3QGX67W1)`OW7cVxlqUxWji3K}|`_~brKsn;XwL}TiWCxd4jQtar!)1q(;^epl zkYi_~n?rTZ9NNfe&!GT*W>ocbXosfakV3U0&KT5za{dYZ3cw`UqK&?)%nCKf%CQht V85=1_C)J5kGa9Q(wlBnh06Xe)$Q1wp literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/547.gif b/SRIP/Libraries/T2/547.gif new file mode 100644 index 0000000000000000000000000000000000000000..b412937d936182e30465e81dca7c8747d0e069d7 GIT binary patch literal 1016 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 VMiY*Z-Bl$Tto7^Ivnvb;06W1*@Q45a literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/550.gif b/SRIP/Libraries/T2/550.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ce209117ef9701fb754952389473661b268144e GIT binary patch literal 1031 zcmV+i1o-<$Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q&009UbNU)&6g9sBUT*$DY!-o(b64|7Q zlRtmFC^mBNut>Ch{X&Wq+3kkIH2ui^;l=AumY1LM^>as}VF5|mcmyz5r=LF?4mY%F zB!D1-HTe1kix81u0xluXvHBv8d5MHxtVQ;J3`BCOmx189-WUo8twaUcNE!VbTF zvlcV-AWNM(e8uF|3;C@DL>%@2DI3WRQiF(a>3xo?$N*J3BEg*@EV;Px;|2o)06QbT B?GFF| literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/552.gif b/SRIP/Libraries/T2/552.gif new file mode 100644 index 0000000000000000000000000000000000000000..6bd28513bbbc4d290afb96807dbf9f57531fd2e5 GIT binary patch literal 1023 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qw009UbNU)&6g9sBUT*$DY!-oWsV8Rs4 zUq5x2Qa}_ar5`_!AoHC7%UjQC=aDn`^YxrJQNPC z^#ixej2S5@;-vGJZrQSi9anWFxOR{Sh93w`#B^9-1&P+SIK;#@UE>trJPxASkPuH+ t08&UCI|$+jbp2SF$;@{1##=96TD(;iVvn``Rt*}Ow72iyz!wGt06QNm<~slY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/556.gif b/SRIP/Libraries/T2/556.gif new file mode 100644 index 0000000000000000000000000000000000000000..09027e659a76578e1536762150c4ae0fa5cb90fe GIT binary patch literal 1040 zcmV+r1n>JtNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q>009UbNU)&6g9sBUT*$DY!-ob3U|>V5 zA3a4TAPS7|!VbTW{QB{0RY9W^c_KlIyjBuo2}}KgffCXp89#VhGzz?cV4zKYVssk( z)z6y~p#`b&>y`oOz$zjuHE=2rRljpOgsM4bP7)n+{iGRqIG}~Me*ONTMJtcWLkmJc zo_p4)+s9=)9BRPS58kaTC5)U=`N*Lme)R?c5Ya{CI8baXMQ8|u9KS;7|_a1pwipRZix)P)ebz!kiYBFiK|N&*!>WJ@fJrOLdy K^XCTx0suQGE9wvc literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/558.gif b/SRIP/Libraries/T2/558.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f9770cd5b3dd83ba7d3214c2f12293dd71bfbec GIT binary patch literal 1033 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 TbeY=)r`@}F^XlE}FdzUs*<;B% literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/562.gif b/SRIP/Libraries/T2/562.gif new file mode 100644 index 0000000000000000000000000000000000000000..54221e45523b5c503c4cca47cd9e4797288fdb55 GIT binary patch literal 1019 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/582.gif b/SRIP/Libraries/T2/582.gif new file mode 100644 index 0000000000000000000000000000000000000000..53e8992c13b57bc5f1e571d072b3e8bf68ef3193 GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-o(fTG@nb z94TC8NJJc%te?k^?l5uK_=MN3O}u!0^Qdj3!4>2@x*UjL4K|OPTp}P5h?~cGybMH) zaHZqNS4JF$S+r=_J9!_+`C%czAp&O~v-Z;!BchpT*_JI!msK8%hz1-8><}Zyjcxtt z%p^#lSHD(s1rjLYQA=I{m^?rZp$>%AQSIVL$*ouFl~j literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/585.gif b/SRIP/Libraries/T2/585.gif new file mode 100644 index 0000000000000000000000000000000000000000..8970caa1d9e06e4ffc8acf1a10ca217bb156c66a GIT binary patch literal 986 zcmV<0110=NNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QL009UbNU)&6g9sBUTqy9?D-aAL;=w0Q zL_~%~?)kdN@JKvA92Wx0$0KAy1kA!|Fo`gWKO!s-4p1g2=D|F{7}zXG$6ubE1nK@iCyF4S%;n?(*kPnIsYm1cvZ;Dr7Trf-qI%w~Y>f7yhP%>}79*KoowI zf$4;fLdZ1!kPZw%PMApol<=`BAn?PsdPi6ifaUKRr%&|kp|L3dO+Ko=q7>cCxwGfb IodW^@JNk{*DF6Tf literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/589.gif b/SRIP/Libraries/T2/589.gif new file mode 100644 index 0000000000000000000000000000000000000000..184a558b7bb56f56ee041d7c2659001222e6d735 GIT binary patch literal 972 zcmV;-12g6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q7009UbNU)&6g9sBUT*$DY!-o(ZUQza~ z);~*|A`)EGuVX)I?cBI|ppnhCA}9|yTG!8p#sVb>Mv&Gokw$}LI@-KBu)!*S!4~iw zSgl{Q2txsAFygNtuA~6E^z+v$L{bn^(g8vMwUEDmb)b4E*AJZvsDnDLfeOG)zikfK uit4vaDAZB@{9Rz%sN-I!B3S+c!FEeWbGwKnJ+OopJzr(mN}hZ(AOJfyrO`?N literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/592.gif b/SRIP/Libraries/T2/592.gif new file mode 100644 index 0000000000000000000000000000000000000000..782e86921add7cc8db0d5757872af20a6f383841 GIT binary patch literal 1039 zcmV+q1n~PuNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q=009UbNU)&6g9sBUT*$DY!-ohlH2dez z-x!DlmuTA8uVX)J8!$G21kdBVcO4HsM6rdL$6Io0+)C*XOFEC-;sg+Qr6VkcCOGl) zct`?4IvyEj@tA4BfPzUnGGZ779yv1y3;60-q#+6d2w`+==K!NYK^-%hEx6-mKObuc z-e}ixk%5Oe;^>WoDo)9c>&_8LD4>KOR{1!3T-;CJvL;Ut4yePpGCy#Vo-72@Q5z{N zSh{HPh|Y>bZ~d+r)xl?L$8s_r`s*hzS+aW`)j+S#m literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/6.gif b/SRIP/Libraries/T2/6.gif new file mode 100644 index 0000000000000000000000000000000000000000..e410e37289597fb801215ffb8d3086de5d1dfd19 GIT binary patch literal 1043 zcmV+u1nm1qNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q^009UbNU)&6g9sBUT*$DY!-o(f3T%*p zjGhA$2Zp!=jh{zJ8Bt)O$FCo_Y5dTkfcOB@JCFRZeJJ6P2ShM1`DN<>fF?hi4{Lek zcFKdmCN&{y0HnhLK{81*66_RJqMJN=@+jjcY(PW>HD>ke_irq@5fBU57{_lOIaTsJ zo~vWPp#diz`|JQ9p(D&I7#9{etB=kXiDH2maYk&r|cNk2RZW}!u^1j2Lt>NUd#laJSk&vMG5LxMoY23;QIxlmWC N^XJf`OLra+06Q!8>iPfx literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/614.gif b/SRIP/Libraries/T2/614.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae2f481311e1705ff0ddec1718f0364b27588bba GIT binary patch literal 1013 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DY!-o(fN>rEw zk*Iq9xK)|>!dkw5{`!f;mnLGBkm^J!!jc5!oQRkFRcRn_#<70nP)H;)@C!A6{>)4i zXrfj~XHka6AXKm4y*d>puJ{vD6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-ob5{HOsj zAr^o6ym`aZp&~&m{z8V_7s8`J7Dy_jDVEP4sRJepq6ujxCcy>O{E4wS@WD2JS$GNz z@hu-6p#aYLtF?ewo||CG+8! literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/630.gif b/SRIP/Libraries/T2/630.gif new file mode 100644 index 0000000000000000000000000000000000000000..331e77e2025313fde23d933393ba7406ded1b441 GIT binary patch literal 1025 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/644.gif b/SRIP/Libraries/T2/644.gif new file mode 100644 index 0000000000000000000000000000000000000000..a65e67dda8288b6f9c75a345ee6a5d94ce4b6ea2 GIT binary patch literal 1019 zcmVNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qs009UbNU)&6g9sBUT*$DY!-o(bI`J0_ zl0`^4L~w`*z)3%U{X&X_wBE7lc zc)*J`kp0}TaS#!Lq-!COD%-TlObLffrmaM}@*4$)b>yx5I5wmxu=D(Z>(;Fm91#K$ zeDe42EW;U14j44RCZxBoHUS6`St>AuPWeItB487QFp+!^xa5%NT*zl#7;uEp=-o$q pY!*bsP-Ig*k;6PdT;L>?w~>y7aGdZ+S4dNeHU!?yyZ6F?06U=Q<`Vz_ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/646.gif b/SRIP/Libraries/T2/646.gif new file mode 100644 index 0000000000000000000000000000000000000000..3de8d4964f9c986c3a2b63178aaf24dc3636c83d GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q#009UbNU)&6g9sBUT*$DY!-o(fN=!Jx zha^eb{>_t=Bfvufk8o-0N3tYIDh>r~BDqf=zL)w+#&Jj_Uq5a=SPZOF^2@^?mmUl} zkSQKXM*<`USP5MCLWRO)!^RSlbr~`kk^=$)f(dc~o;VN%Et2I>Fa}_z9Z7O8COW`FkL0{g yhb7KnR#KXgi3Rv{?uQMG(1;W$+3eR2(13}Yoaz&`mp^IOuYEPfB-wou;p?9 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/647.gif b/SRIP/Libraries/T2/647.gif new file mode 100644 index 0000000000000000000000000000000000000000..af9efffebc47640a52e0fe5b570c96b9905b16b3 GIT binary patch literal 978 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 A)c^nh literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/658.gif b/SRIP/Libraries/T2/658.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f75645aeabf17e797d90ed7d84590119a382496 GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-o(b66iot zQ@@My8nJ+=0T92B{XX&wxeLTYWFbE~Lj^^RtdCk8nrIhq(HRa620no))7^}NTrN6! zxCEi8k7ptpgcXv~2c-o4 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/660.gif b/SRIP/Libraries/T2/660.gif new file mode 100644 index 0000000000000000000000000000000000000000..8edb57dbac9a965223c21903072640d8f741e1b1 GIT binary patch literal 1026 zcmV+d1pWI*Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qz009UbNU)&6g9sBUT*$DY!-o(f3OpeP zn7@AY^c;vt;*76*{P^_?$uG~tB$?ukwCuggyQG9g`q&V2)!WO;xB000AJI`YaJ3Q9uUjP6A literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/665.gif b/SRIP/Libraries/T2/665.gif new file mode 100644 index 0000000000000000000000000000000000000000..c0fa5c4f80b691e1efca319b20925ecabe05ca51 GIT binary patch literal 981 zcmV;`11kJSNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QG009UbNU)&6g9sBUT*$DY!-o(fN}Slx zKnYVNGHQen@kgM2`}%B!-@KOPP$__U8*P=+d=9)tw)2t|TaTT!?QpvKOgSATT-DK%mRVCO>a+oJK}oNNrA zxbfApF35#X&aospQf;^+Ruw)$w^OFNoU~>{Y{F&@pna2?a1~f!go4SKGi%<=IUoQ# DBeU6Z literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/671.gif b/SRIP/Libraries/T2/671.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca681f3377ec883945b104302b1e1f60e9138a98 GIT binary patch literal 1045 zcmV+w1nT=oNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q`009UbNU)&6g9sBUT*$DY!-oLk^y$&3 zVmDA`AkvYCuU|iX9z*hz=I~C)e$|*ba&^+0!vvBlRqEA7;0SObK|vI#K+70K>q34> zu(OJzd?))cQm_+1(4_t9T?4cPqNrC`u?{y(Y-R!AFM=`tx{Zi{&2(2Y8BX@SjIF z8wezf04F5EQzu7RvgCq-YYHeVS@Ss0R6;gx&hdkqlpnk|4b#-A1MZ%2#US(PjGJW- Pk3BE$N}o=hdO!d>5BT+2 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/674.gif b/SRIP/Libraries/T2/674.gif new file mode 100644 index 0000000000000000000000000000000000000000..791c8564d4fcc4d0fc5ef8a9865bf4707df7ed20 GIT binary patch literal 1013 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qm009UbNU)&6g9sBUT*$DYLJ})h5O8>~ zLn2@D`tdtNu^@?X{6cD!H=`p#HrIOf8W*zJ0+RzJ2&5EJ90r&L+x6=g31>l;{M`5) zm_=i+149Ki(zq)r02}r+j`5jcMUS2TF5%1p2&l+49Y2UdXOEx8kY-ISFd#&sfi0=D zg=CiztyzB3eA!A!LR83KlQtQP%I{d7Kxb{KK-lBfPHk8AaKh?MjX+e>JdH>g4K1>> jAyF-+h|I3Wea)o69HLUCFE>q`%AQTTw(Z*k0|Ed$LQ>)6 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/675.gif b/SRIP/Libraries/T2/675.gif new file mode 100644 index 0000000000000000000000000000000000000000..b851b50948cb3eca5e43c109ab9e49b03626bf69 GIT binary patch literal 976 zcmV;>126nXNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QB009UbNU)&6g9sBUT*$DY!-oO`5b0y< zpDrB`2_^ugPuna*>%ck4DDVfL6$8ciD?#$0CvFQ`8jO}qX2A~gve+aD$6tz_1DQ!n z02IIwdOC}Gx@V&3gK@2j0#M@5htyo`E)-R9FKP!EJKI#T;gvXg`z9cVUbF?vSphA0RTIC$IU$e literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/676.gif b/SRIP/Libraries/T2/676.gif new file mode 100644 index 0000000000000000000000000000000000000000..e53889bce0104fe6f215a69f2896913d706e61bc GIT binary patch literal 1009 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qi009UbNU)&6g9sBUT*$DY!-oYi_|fOj zUzr9F2YQfVuAfJbV=@YS(~^CK+;DGHnD61 zXR-}UF7^JI?6*%z#uN4Wm6Z1An#V~QDFkB&?ac%LI4WXGAW{TD93O@36o}TN+O-sqZs?dkNe()j{VQ@eI00d~>dGxzb1GJ^mP7U=)PZe2) f8e}b%>hWG8hy!vwS{;sbs3~h>%brb}U_bynL`mT2 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/685.gif b/SRIP/Libraries/T2/685.gif new file mode 100644 index 0000000000000000000000000000000000000000..010c99ada03e8abf3e996a735e5928ae8c28abfe GIT binary patch literal 933 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/694.gif b/SRIP/Libraries/T2/694.gif new file mode 100644 index 0000000000000000000000000000000000000000..5f72238fc08b9f35af01c36a336010771f87501e GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-o(f3LKK_ zP?ZT12l@$Tk6%B2!5U-)@Q&U&egFFP<1o?$jtQ1N@~bg&U>uo?Y6`r`kDnHu0L1z0 z=S*Zq5IG>t`)Ehv1Xjh$_4LS3-42L;&h?Z@l^?tr4SB@#ckf=mq5S~Kd8Seh!yoGS zMFSMKA3RS90C?&7ELAE<2;aoz$7(RWC<7a;>PiD)qp32LEh(tL38Nq!1|XED@@%v? XMkTr-M%oZdpr});Ud_6->wo||Kjz=t literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/696.gif b/SRIP/Libraries/T2/696.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8a54f9972ebb014ad2ee8efd9e95a1130007eec GIT binary patch literal 1001 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qa009UbNU)&6g9sBUT*$DY!-oYk?BUd} zpFeF}APzh-j-N+<{rKG*qtS-Fkn%wJLFTcSMgX1wQBfffP0N=C*?BC3bKnhj|N2?$ zDeww9keNVe6kx$kFLe7nwkhzEi^q^3kKnxKk)5rNYH%h{6BdAlihPI;wBT`?T7hi& zxqS=6BcrzfR(UMD@YgQ~2hUV=<#3Z+GX;sX^GLIylc@aCW%~2yTD{0*2t2fM4&+CW X=VrX*5GdM5XjVAjUCp}n+kgN&@*U>3 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/697.gif b/SRIP/Libraries/T2/697.gif new file mode 100644 index 0000000000000000000000000000000000000000..22cb68586b8d0a51c95a0c9e041c81f56c2fc67b GIT binary patch literal 995 zcmV<9104KENk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QU009UbNU)&6g9sBUT*$DY!-oTX_?vi6 z6QBbS33}_->(Qff{hEcyDDWMi5&{j>vG=I}Nf;msX6vVhIf&IeKe7pn1V^VNg1eRaO($k#8?*AnXb z6{~^N#>{vr29|)L0Ahw{{p1Y+P@zdNXf*~v6jt<@mM!A2G3uL9S<#~Y1R2;VA``ky RJZuE`O1iY^(*Obj06XjM+w}kd literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/714.gif b/SRIP/Libraries/T2/714.gif new file mode 100644 index 0000000000000000000000000000000000000000..17da7aa21ba7db436aaba73e7d5d7d895c2ed949 GIT binary patch literal 1026 zcmV+d1pWI*Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qz009UbNU)&6g9sBUT*$DY!-ogkkmrC6Y@T$MF}oULl0hp zp#ymmWj}T(7AA3K*X74t!a#mAfe-{AeErs8!9zD3q67{~feeSR5=dm3(t#}3VxR+4 wA2lKT*SFukYAOmgfC7c^LDDGmiF;%e7D#>Y20_h%r#BX;z=I1Po-rT*JO5|mO8@`> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/715.gif b/SRIP/Libraries/T2/715.gif new file mode 100644 index 0000000000000000000000000000000000000000..8e33faaaefc1573f157c0e81fe8120153b87c2fb GIT binary patch literal 997 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QW009UbNU)&6g9sBUT*$B?LK@`0I8=Dz zmp?}n5lUg_&)=zx20d`>*e?o5f(-&9C!*u z@XB8%p#tOh%a;YIg>C*YAw2-fpS~V8Iehpq$f}x`PDttN*pbppFZ_Oz^%tn1fEf(K z`3qNTtuze;sn}yEZ>+z2u|D-%nL*$ScD5M0i1Eb@2!WRR{p&Udj4yv+Y_b{YuU{ph TQK0#&6$7d1)2LG;4F~``E~eqd literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/716.gif b/SRIP/Libraries/T2/716.gif new file mode 100644 index 0000000000000000000000000000000000000000..043a973b74cce6f924069850aceb4f0a289ebf63 GIT binary patch literal 1018 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qr009UbNU)&6g9sBUT*$DY!-ob9Me_I0 zAGZ+#APW33v7g6}Bs2o>!q1<+Z1F&f1Q5j$lLLTMt`x}U<0u6)0oXX_(HMiA3etH5 z_G6|BG2J|_YatSZn`-d-`SU35gGLXZK1%)QsRP7V{=(+NwFekQe?kTVVW`0ouQome zX81^JAdQuCJ=V<$K+Q)o41H)oIAE2>S`irfbA)h_$9H!X=i_AsgAglL5;>b1?}@{y o9?8|y>d%;=hghCz{g^CLT!;s*5SmSh!vX_*bL-yC+h9NdJG=Jh8~^|S literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/717.gif b/SRIP/Libraries/T2/717.gif new file mode 100644 index 0000000000000000000000000000000000000000..d96dc79679fbbf2e6db876354909f53d312e762a GIT binary patch literal 1037 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/733.gif b/SRIP/Libraries/T2/733.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5f9cd4f9ecb519aa2b7290f4544a4ad262a9b52 GIT binary patch literal 1014 zcmV`Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qn009UbNU)&6g9sBUT*$B?02!1frJ0z< zhr@ym%JJLCaUC=`JPurZuyGzoe*HL_7|Bo44MH#p+2R=MqJS|J3NnzgvF1gDPI~@C z2yNq-p$5m~+t>jq!42E^pQc|)ya818|&M!MII9S#z%IKw)L64tEINEl1Iw(Z-v2?hiJJD8K>c>n+a literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/75.gif b/SRIP/Libraries/T2/75.gif new file mode 100644 index 0000000000000000000000000000000000000000..768d2ab6a11012d152bdab2bb25fb45e809efe9e GIT binary patch literal 990 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/768.gif b/SRIP/Libraries/T2/768.gif new file mode 100644 index 0000000000000000000000000000000000000000..6aff5794e434354c7ec507cdde857be2b6ece928 GIT binary patch literal 1010 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 g?b(@>i0G>^|cEf-GJHMRZvH$=8 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/775.gif b/SRIP/Libraries/T2/775.gif new file mode 100644 index 0000000000000000000000000000000000000000..0a295b8b6b4b952f4468bbb598513215ce097d02 GIT binary patch literal 1032 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 XIatd1B+g%}PeKr+UCp|+>wo||2Nl}T literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/8.gif b/SRIP/Libraries/T2/8.gif new file mode 100644 index 0000000000000000000000000000000000000000..195b63519cd6405a71cec6d5541e14bcd9247821 GIT binary patch literal 1017 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qq009UbNU)&6g9sBUT*$DY!-o(bnplzM zU%!hNT^V?|Vi7oT{QB`5Nz#)8hq6e9R7rA&!!{$$5h_H8P%o7(8xrWy0Ruq?Ao;O6 z5V2sDc_SeeC5Ywb$dgOAP`gKxS%QZk`UKl5a-=&m93Hmtrm`!)SP@%%!`ROvMkNtH z?4iM;E{jJa;VvckAn#s+R{S~V`<2Z9o~yc;<$NJD5NCmGsoXjxZY nQygMuIkKO*Ob8yv=)^MHGf6Fq9yqg3=oz1XbL-xXFdzUsb&21M literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/802.gif b/SRIP/Libraries/T2/802.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8d197ba9ab6042e210dd18cffbb1a7a97a7b77b GIT binary patch literal 970 zcmV;*12z0dNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q5009UbNU)&6g9sBUT*$DY!-ohzr1Lij zB0>d&`tciO5h132%Q_y!#4n^sf+_rgJUOt!H;sB&0;r&pqRa}SGy?O$vI3!gDy4|@ zVa7~Oe*LsqOwkIcQ;M1& literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/808.gif b/SRIP/Libraries/T2/808.gif new file mode 100644 index 0000000000000000000000000000000000000000..a150a4ca793de0897afa0038be20fc3c11494497 GIT binary patch literal 992 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 X6>=#;TR%8Xi}726V5(n<0RaFz>&L`Q literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/812.gif b/SRIP/Libraries/T2/812.gif new file mode 100644 index 0000000000000000000000000000000000000000..e2ec79f99a70157f4120f405a4f80be6e5bffe50 GIT binary patch literal 1012 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Ql009UbNU)&6g9sBUT*$DY!-oa~S#tKz zUX%k63vxNvuVcSD84Dt~5J_LZcn(4q)X=VGv( z6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QU009UbNU)&6g9sBUT*$DY!-o(fN=yi$ zM4n{z(6yN`@dh$~AVXH;5HSh0kow5=1BnRYjCvrYjR^t(p1*&)ASPJ#ZVdy0s#f;X zGI1b>bRg9g9XJSNzcNb!Oj+p<*3uQD=!JYYEX2bCDhgTS7qTorIS?3npi~wlyg;DJ zg{)K~VTN8X%i^=;K;QyVA%h`&aILMsT{;RHa0DyU3WUJQ<{Rguz(jH&(ZSjgH3cI- R7@~?EO}ez{(+vXx06W+=)F%J{ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/815.gif b/SRIP/Libraries/T2/815.gif new file mode 100644 index 0000000000000000000000000000000000000000..d49a79d5412d73fa083b4a437557fe447e1be69d GIT binary patch literal 992 zcmV<610VcHNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QR009UbNU)&6g9sBUT*$EDgB1|{@sk9R zL_>lP80p){Z{tRARjP2fxWc2pjvi4?A!!mN$Bn}_G(3<(lA9Dbb29Om?P9_e{DSiH ziLj(cq6aB?goMy5sXhqdFn;NAie;GyX{M;9FQ@06 OYD0@2O}aG0fB-v!2j5)) literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/83.gif b/SRIP/Libraries/T2/83.gif new file mode 100644 index 0000000000000000000000000000000000000000..668f189f220b572444371b3141b5f413868defd9 GIT binary patch literal 1024 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/841.gif b/SRIP/Libraries/T2/841.gif new file mode 100644 index 0000000000000000000000000000000000000000..4b832ad8a87a588b7379e6d639cdc5ffa1f75390 GIT binary patch literal 1006 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qf009UbNU)&6g9sBUT*$DY!-oJ!SnEge zpB{(=DOlUbabG`rZwO!n;Hlp_UL5;zbTiUZIUx`}eCWk)AH69UcX%r3i=&s327gif z0#qP^LBDE#lTs9jCyyLI0L5UdrblLNM2-a0abK_tMFH?IN3q{93}FGhXhhCqvyf>) zFjKj&5sb7Gwpc|61VY*^9sBu63jk2X9}W>PU;qLF2M}C*bxS$8A&^$C_VKDom!lu4 cmZ1h_#)}eYhZwwc#`Fa&;n%QZ!wv`lJF_#_ZvX%Q literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/844.gif b/SRIP/Libraries/T2/844.gif new file mode 100644 index 0000000000000000000000000000000000000000..370c307dec27864660a60e8ee975e217c47fc062 GIT binary patch literal 1014 zcmV`Nk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qn009UbNU)&6g9sBUT*$DY!-ojVc=P9P z*A0jTV?Y~s?HajzJunhvF#!MqUj2HBG$^HCzdtJpKAG3=mV%f79!R12jt9;b*j(DH z60?F7cP^1RS;?VIGk^W?3A%|f1}}Xs{k@~I5(&kx|NL2638B`tPj5K<>gSFH&Vgn6 z<*V^l;HZA~I6!3a><7US_xk;MSfI{4TondVu;ou*k%ube<-;*hO0s_bFhLw3jvux$ kg|hMMhmI8kj6LkRTzzXw%p2WY>QY3tuI<~na|Z+fJLf9ttN;K2 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/845.gif b/SRIP/Libraries/T2/845.gif new file mode 100644 index 0000000000000000000000000000000000000000..f56c52dac156c937adaee27e2acbf524b27af23b GIT binary patch literal 1052 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/857.gif b/SRIP/Libraries/T2/857.gif new file mode 100644 index 0000000000000000000000000000000000000000..60562606fb4afcd843ac8de279d5aaf3198957ad GIT binary patch literal 969 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/862.gif b/SRIP/Libraries/T2/862.gif new file mode 100644 index 0000000000000000000000000000000000000000..fff30ccb99089f4cde9564933fc66005d211de7b GIT binary patch literal 1018 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/864.gif b/SRIP/Libraries/T2/864.gif new file mode 100644 index 0000000000000000000000000000000000000000..319bdcb00cbcc9cdd69e5779fb31c3f564fd2b33 GIT binary patch literal 976 zcmV;>126nXNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QB009UbNU)&6g9sBUT*$DY!-o(fN?hn5 zf`f?#FOc&W&(8pi0#`%|wa?$A1Rw{B@~11MKnu_OQ9=pw03miC_rRc({#}! yNm^xY8Ny!v_Sq6Mfgpi4%AEf5wI&9_01zM~B#=090GE&>OP)-*vgL>Y0RTJL577|- literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/867.gif b/SRIP/Libraries/T2/867.gif new file mode 100644 index 0000000000000000000000000000000000000000..92b3a1365d4ef47b551e34dacb6e9aa5bd5677bb GIT binary patch literal 998 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 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/87.gif b/SRIP/Libraries/T2/87.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ec9699c9c1c71ecabd274dc1caa49ff1ee30fe4 GIT binary patch literal 997 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 L^XJeP1_S^*i%IW3 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/875.gif b/SRIP/Libraries/T2/875.gif new file mode 100644 index 0000000000000000000000000000000000000000..b95464e88a6f3d66c45cffa4373879d0daf09c68 GIT binary patch literal 1016 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qp009UbNU)&6g9sBUT*$DY!-oP@^daXD zT%SHEAOeVC2c5otAVcaS)#72fkSI~w+vM=bynfm$$!wKU-NOqRA`Ens@|MPdN2sAJ zHsmLO4A(+(Gx5M^kZvJgnJ_BQ7RotP1-?Q#uMGyOJ%qtSIqX8#EY(mFvyfGS6Idai zmB|VKLadPaoG644LX*ye4u*xSqtFgWQ*Jg)D41c};KC`pS&~74!W&Z|<*|XBvU9(B m=3p$eQAbri&;9tBEBO${9$)4_e%rGL4c*(gbL$ou5CA*-ROUPY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/876.gif b/SRIP/Libraries/T2/876.gif new file mode 100644 index 0000000000000000000000000000000000000000..15fec916a79e26ee503df565c9ffd9f258e02d77 GIT binary patch literal 1034 zcmV+l1oitzNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q*009UbNU)&6g9sBUT*$DY!-o(X3fLhj z)4zZIE+%<6;tQ@_{X&WiiERhND&E+M{DKw!{7C43@VC5R|6!myEl2vAMI=Gw@9ceFknKuF$Kk?NZD8PIUZ*|%aC z7C<*Ll_EuJo`hNzG98D70irOgbq0cff&z}j>xW1zRf13W^=tFkV7`8lDi^$*S@S^7 z3J0JWO(mg|I}^`n;*A(N5sX3g4E=ZJ4xBG)KH^|m;?6`qqTuN)8n EJGm6>ApigX literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/879.gif b/SRIP/Libraries/T2/879.gif new file mode 100644 index 0000000000000000000000000000000000000000..e986435e02705ff51b1199684eaf0d3d74586ea9 GIT binary patch literal 981 zcmV;`11kJSNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QG009UbNU)&6g9sBUT*$DY!-o(fN;F7i z&>&Bw29?8>g@D8*vK+}9Ig;PB2onn$xQ35I%7F+z`J?nwAO=tVl08U?K!_-G{=i9@ zc;HVifBxpVLOGESQl&d;3W4U&oh1h~0WjzS%-u3A46*`X!pvW(uvufc^S44QfHD3a zxwYf(l-M2j{PoD1VVOTA1!`jOyQ)J?Gx7W#@;LFqon-sSsTuGx)4zX^7`xppF(3dt DKr`5& literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/891.gif b/SRIP/Libraries/T2/891.gif new file mode 100644 index 0000000000000000000000000000000000000000..17f4283126ef2f174abfb37655148d754d7d080d GIT binary patch literal 998 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QX009UbNU)&6g9sBUT*$DY!-o(bE|@{6 zpTB;s6hsu5q7}b>A3w_2Sn(pgW$G*r+6WS46aeW&ZoKG^6@XC}mu&<9=gk%c6~4LL zInW0ti~YEKAX;Hr%$DdJQP^k=DNT#jDnx7D50@;J;z!~ZM z0fSg!EWxL59{TWiX<&tt{g&BfXr>>!6aXrS;@bA1nST~pRi(KlVh^rdS!s+2IOo}o U3bwGKmhR19x2RLA78no!I}b+Owg3PC literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/894.gif b/SRIP/Libraries/T2/894.gif new file mode 100644 index 0000000000000000000000000000000000000000..d6ad3695c21642f5ae9d74dc3546bf6f20a0d921 GIT binary patch literal 1048 zcmV+z1n2ulNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q}009UbNU)&6g9sBUT*$DY!-o(f3gp1a zpTB?pz7cvTfWin(*U2Kt{K@DS^8riSpNN?X*24e`p9?N#t1YMcHfB~(MGZ*r3 z>4t>CSU?$?7~^Qz1A`90Sp*}opstaw5>y@d0o%wcTLoI!RuYhahX}-o;W4Jhhfgh$ zNqE@EqD72$|Bc!qgW(lxE=jU%Ig(uqg?sK1W*NBOt5Z&lCOo3J-?KV9k+`HZ!J(#+ zu`UQClC31L0uIAiTqF>IB6}C*K&&(p6@Ui0;`M7M#{k5b{XEeDHxeESiLwTl941;K S31o~#%?(Svy7hzs0RTJrMe)J_ literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/896.gif b/SRIP/Libraries/T2/896.gif new file mode 100644 index 0000000000000000000000000000000000000000..9a9bd4b0a1b8e88744b1df61955b34ddcf4fba11 GIT binary patch literal 1059 zcmV+;1l;>aNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000R7009UbNU)&6g9sBUT*$DY!-o(fUf6+# z6DMK+{P_doutAVX*2?+oN3!3@e(YK_1Xt2z%ae5&TA+6FTs2K~>Np8Dau@`L3848C zrDMauG5Ac@gAs8co_8Ak9g0|h0v1BnPU_3^0OA;7FG zEF==oWy!WDe=Qu7&tJxMw8V@NL--InjqXS+Bypm#QG=97dUMdUU>1__P*ffW!5&Ft zn*~0~Hd51LgdDPPigJOVgCV*!{v+mLVV{!btWC0Ghh@o21{Sud%QkF3X=ECXKzH}0 dx?46L#?X;ull5Hvt`+(ay1V!91_J>C06SmK{6YW# literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/908.gif b/SRIP/Libraries/T2/908.gif new file mode 100644 index 0000000000000000000000000000000000000000..f0a759409872fe7809986c87cfc332fbf9eac2b9 GIT binary patch literal 1040 zcmV+r1n>JtNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q>009UbNU)&6g9sBUT*$Ct!U;PJg#qF4 zAO}(6`t|d-u8x3;0#{@brct9mjdeikXt%Ls%YNGuRD5OfnI9cGWR=uW5thGIObA{u z=g%KchZ|1FBsc;c%%va;a?)5WszD<5G`6uS5P=5(!%hM#05Sy}VgHI2O-sii0z1g! znRIy)(8q;3nw>1UcW%Fw2?->k*D_o+Sbp4uf& zMbDWK_<~bfe}f#3(&%l)3Ol*hZQNH%fy2HpO&$Wt*l#~?Uj~2#v#Gf8O+g%RUCz9@ K^XJe50suRk!R(v> literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/910.gif b/SRIP/Libraries/T2/910.gif new file mode 100644 index 0000000000000000000000000000000000000000..2054681c9e50146ebfa39212de3f9f9a6fadef10 GIT binary patch literal 1045 zcmV+w1nT=oNk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Q`009UbNU)&6g9sBUT*$DY!-obHl<~6V zlf@(uFT@DLsa(I0Aob~JhycyFkN!Za?ANLxif|zPRf|Ov7R-LZ8us|O4UU8a18so( z)NlbK85jr}@I>$9w+;{oHsFH{WUUiXIpla%Po**y4+rqr!>wORmGFQ(6dH47KX*SI zQu0UF-@jp%zDSZsH;=;`yRNCa!ePL`B_Df5J;)Z^VuLR}7J5uDjJSUCf+Q>uB97-; zaS1+k(-T>eRm P5D=83OP@~tVL$*oO{ei0 literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/918.gif b/SRIP/Libraries/T2/918.gif new file mode 100644 index 0000000000000000000000000000000000000000..e1dc13d04b339511fba4afa6d59c69ea4d51532d GIT binary patch literal 1032 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 SHCy7h6ciK{6%`g178e&67#J8C85tTH8XFrM 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 F06WI5^nL&U literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/967.gif b/SRIP/Libraries/T2/967.gif new file mode 100644 index 0000000000000000000000000000000000000000..dfaccbb523b4b4f1880b02c6e6e408e6b42ad876 GIT binary patch literal 1003 zcmV6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000Qc009UbNU)&6g9sBUT*$DY!-o(N7Fa+r zK*WM5botxps??hl7Xiq#7pA9&XNI|3~*F><89+A0YL$H;Iz>WLqo1RoK&>(`GaQyB7!mMw))ez?MKKB ZSV)B{6$D3G00+>XUd_6->yQBf06TO3-0uJY literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/976.gif b/SRIP/Libraries/T2/976.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5572ae414ab49e3d2ae7e197d8aeac28af83fec GIT binary patch literal 1024 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 F06S3y;Aj8< literal 0 HcmV?d00001 diff --git a/SRIP/Libraries/T2/99.gif b/SRIP/Libraries/T2/99.gif new file mode 100644 index 0000000000000000000000000000000000000000..14d7fbcb97498b24ef5c62aaa3e1b73f3ec72caf GIT binary patch literal 991 zcmV<510eiINk%w1VH^M)0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LVG5`PoEC2ui02}}u000QQ009UbNU)&6g9sBUT*$DY!-o(ZK46os z-#=PqA`T?6ji1MU{Km=9Sj8K^bd8EU8OINlMmqi00T~#orN#w-Bn-4bj~^S22E+8j z1(cwPG5zR?DGH!LCV2e%!7J0C=opVtJzkptR6{pui7tTY#t#rvf=2rFn|T&MhHw1n zv=#U)?py$M<+cTa&+gd*iqzJKSm1>SfdvqG?4%I`KXqD+{PH*sLSw8^*8%DPw81p2 NiFn){O

6eo+k3ak~rdY0(#&wS-YGH#&0s2kHCS@@~JL zXi$L|-7ERT)e!NdNt>AT4&t9)c3^A5%6SpijawKCBM^B-C2oEAt|71VD5glU7d7?} zX?$0@P(h*0z-Vt(kn|MWrzB1+q2)`!l5slmCmat?Yl?yw{7YaU@0`FIZCy4BDG|Y_ zp&1sFVo21-Q*9mDGRB$$!zeGhf7&u`Y4=tAl0Sax?tl(|70$_k6T(n8$LxM|6Z)Oj zyi2eXrPrbfYtfjbW|xB|Yys%_wvVgd2YoP%+>Hc%;u4{f!_mY1B$JNgkqN{?7uthk(Nhr$pnT6h@?eB{9&t>O7UH#3* zCmAtombEAK{?pZe(+PE-u$*+HMK8Sv}Op6E4TxM~;;0DfjB>E8; zV6QT3&K4%i9}mRZkwr^#Byl)5nz(^d47aO2{v;%2^&PjkSw+PF)RX*pbU$Q_9W9#~S#6EN0+PG;#KvpW{H(+>z>S1SJt;WrTAGLk-e9lW zWGeK2vLn^8$ugO6!)z+iQjdw{pfN)l+1keJQivhIi|^ac zy9Zy(t6T?5`hP2LmJIu_rVr(qXA2DywFzxfJv?bk@wglMNJRU4;6nTR!BK$HS4eFh zbzba+(;Jo%-QWkP{At{+Z~x=y^!>k1|HYGkzd-1fk4*hyn0uZQSgTx4PVxrvSEY&l zn)*)+VFG;o)wuERzVe0N>mB>~=09ohKf3gvP3Vu#&dbxq{KJ*>C>OY zpX?ntl)3GEQ}^|wI}x0$WV>%TuqCsLL=N2j0_l%C!#Ie2(AT3?<`6_R1{f7OCmlZUu2Lh)`iRZIR>eQ|!$mUV;ctagGWUhOE9E{^# zFpAD!c>bDiAadM2Zf=4&;VJ}j2?f@}m7m}C&nX|54%a>&Zswb-Ttj_4%h^#LM4*7$ z6*3-H&l_?q%Wd07MCRb(WmZi)r)T-kL0CaH_qNwB5N7r&u9%6`Ce%i3t&Af_UI~u3}ck%6l;!1SF z%lR6AIXMXYBT?~wt{afoKGJ8lA+l+mx}-*HRi%czM8~COm(4qbxU!P)2?;D~I=V#N zelEv0b_Q{H{>q>U+YX+e_48CgYR${nh=k}=T0nA;KGe?A+)X?bd;f2M3?=ADnykF0+u8hrpTXp!j{8K#AhTv*i{lz4Ku&`{5owe5W85^Zk7t zk3n0N64>_mmZn6Hu*gdv^7rBnWR;b9-beIBT3K`mIz7ngJA3)<*p*Zbjpe?~MQV0u zz(dJ{1be|z;Yx>#!QC*$L_2bogVfhah`H2LIW{9!3#08ZJ6N%Tn8x}gHUuW@JIQga zv`;YXN|O!!Um1uUE3z^y+OruWwLeS4k=D1W;$Ko5VtuujO%)Z0`Gg+Z4znV>j5*W> zW-RI3oCI{%Gnx&}q%`_LDlO!)kKZ4cXy$xjvGviaqX?(@I=>&{p?~n}NWg2kg6+dM zlqv;dYjR4zT?7$a;VV?$vu>;KKt3A8%lssUtNOWF~29pb{PiSRo^e6 z_Cng8%Uz`rJ>OERh^D-|q-WEd7zm}}2PQLq3Ed8J5p5kFBQ2{-yWvTP5(Dn6N2Y-} z#a0cr^iaH^^;5mr;a2=o%nl2gFHI>@5*7#&(atZ24tc$@T~i)k^JQ4CZb+I+Socrw z0ctKMYzEovqMrk+b~Sn#v<9fE(U7)2N--9uuWMu7(!qB_o3FTlF^nHT^r*syDu_WQfjJySZje4wswRpTGyZPz+> z1?`SU;8c^?+LwTud1gE%+H{r5X6kT}9(!t(vbF!TU?uu5ES@vhWs zJ>)3+UGc|Eco%W{=ap)+aIc*TLO}nu2XOz4`iVkdeQ|`=Jvh{7=V}RAc1> z&BgrkJp+K(O@U@KKPb;dnaV<>yw^1K!+A~O!8iE>L;ky|wb_g4hvjEWy!Tvn4TX)4 zoKaK5<%-ODmp2FsdfzDHsn*^{{$_FX1hLzOIF=$+Ho7gE{ra|)iw@SLP3T5WWa*Pr zsl|M4Pxj2GS7bhB7a952cw$){3LGTEvwY%Kmd3{%nU0E3YkaTtD=ZHbd?UM$J&@_UJOiJWG{QkZ9^>R{I5pbe;fgfrjL;Yj&7IDyJ?+B7b6r&Vz^Z+w7TnpJvo|sEXyk67NeSZG zb|4B4pi0)=FzorY(Mgmnc48S-$-^g5$w|K|Z8o5wLnzO~aL0RfDh|Yoi2z@LW5KCG zODk1i9(BLMme zw}=TSt7u@9=-^hNJ`|P{nuna?frbTZft(di7S!y@rA`p=5+G;V#58r)$vHp4r5^#H zKI0_enh6pQ-WOi1eQLQF>LFdVAkqn#{KWtQ1&@-Q$oc8Q+g92m&ianToMi45l;ZtL zIUvuiTjdl-wY`~zgE1mq(W>2+^;%oQQg0{_c&0x|ix_~I_%c80ls^B%JBZZ~5w{n0 zmW9yX>~w6uSrKemn>W$F+HU>sb|z&G%fS;l^*{G2&cP>SswdesTcN+c`i;sL?+@&U zRjd~Me{u0YWy~j!@pDQd(ryOEF&pUM_P7dr?%Eqqq{9`R90%N$KVLrpP@45$c{#_f>Buh1RlDuIh6d941E2_TsjhRk_IS3bx;_j! z;fwYQWjtm(35mvn+b}1MYJrDSe33uBGih})QD;gZ0oTXR-=jxvDu@!}?^NCkLoP4h zq~gF6W0c?*i0vHFnDW=|w<7ZnT{$Q|+wKbI*SCLL8%D$}a*zZGzx>7o?#`>#`YtbA z^j>yqvhf*1u&(pnq2yxL^1(ud>Uks~N4mFsB9?Y-Aa* z$9iWgYTj1vTmnr1Mv5%Q*+ph*l|eFGO1B+`TS5$~h!c+ki^s9F#qy~yf8{$W2+Bn< zy!H)IB8!4+84(xczxcOS<6iJ7Bd__C>-y$}``y6&R6?lXQ-_GEYzprdkN^C+6FR#0 zR=^=I`huzXRHDgAB)>CWjn>nKv()pxshO-knfV}0TV=E5TDC`i{>Ddvr~yv+kOVBr zH@>ASOnbj}l=~w~vllp~`ayz@*-i*DuRGN__irA=zn3Ndmr~u(kuaZzqi(jy3 zc7xXFgG{qeTr=}mMU$p-U{zhw?&0PHCd}@u`vZD=w?%8I<%?;jKk!|mB|_Qk#buAx z6x`jBEM@9!A{c`u#WZ%oE^pAj4N*{hX-mqbRSa15w}9`b@2IG3T&JOiXHm><=yYts z&g>@N#LHpW(%8WJ0Lg)c>~xq$7ScatW4 zZfJ%k|I;-xv6+qv!euQ_oLauGi?Q!$&oVaQDnxf#lh#)-e8@?^GCsQ{TiJ z(BdT%tbqK-_1ZTqtBZ?o*P?hGKsCKe-xIJ=5Rf~RjE z9x06|AN)L#lbZfBmj>VuzVhvHOzgx`#*v~t_hH?B>iUlP$Fwhg_~Y`wul#L=D~Y9s zvO<52;rjA;^A57i2s=viS3%1KVCj5k5};ba==@`J1y&r5VXJ|RZUbL3%j!fbs`@|; zDn*{E3qVKXs-L9wAn~Ctd!|CccmT3(?XXYT*2}!T6RpS5#BOBMh!`p<;BO~)v zyezwV)zo;j@oiCd&VhWeM%y0>7uNyO)~V8T{5tL+!E8#ILSyd%Er3fOn9swq^i0YL zf#goCGqUsb@<->vwwC?u5XwoBeE&|EIpsjs)$d|Z4s=mMv(U~nILw|0K2V#Q%LYg6 zg>;4#0o^8K?hH`gxrT2Ai0Kp~hF7(T(b0wP?zHLOnMYbOf^_t-={Cc&=5ghK1idcw z$_$jpWihGVn{ zL=vr`RyIf(pbt}+LtBLXlj)?=8R5PQ+s_I%?`~)HU$^lkMJpT z4q)B%3-dp9`(k-j)K#oC+j5#T+py36mW(lbt`~-9ZhNdoZpVx(O&C3|)J9E25`zCt z3h+fo=x^>GGWsx+#dTAMiVzBQ1N}&z4h%e38lQLsJaAyjq7Y5}V zF?x$Y1KWM1`Q2rcnp+Ni7CD`h^Ix|7$A!YG3GacF1jPYCN^>)%z_SEEr_Sijc9#}i z7H>vg;$&R?+xxAzA^-7bayf52mg@xcyWhsf$GH7~SUl28AtxIb$z6@RcBM$NM7xz$ zOrC*SPE%qsDWurs43Y8EP4Y<%!f)Ho(4yUCkg7(`7958K%GoQs#z{#K7e~r9S1f12 z-uBdvlmtMfoPp*TXoItXCc`_7yAWExFL2xo-xrwcGPUYyNms*@k-1pOVJY#Ibm3q# zX$Hk0t{TEkZ9iU%b^Q0XXP18?pb+C9J%^mV#Za zhBXf`)vQ!Y&RQR)phADPT?sum^W?~3 z#bA{BDvPcdxe#Q7FV-d#`6o8Jb1_izQ#n_yxHokTWIgt|e%Rd?Kzjo=fk2n9D zyLbHAZ!OPqz3#DZM95`4e=u&bImoWhkO-^mai`N7E~yH6nY!hmm<~d=g_fvWY{a~E zCq}E|O`q+~(9TGgU#Z)GkNRH!O1uU26W4Z4-mQmWCtOyZn8o6HG7N8o9Y2)aG*q4x zG6)ZRmxX-;tyibiHtEc(IUg8(;`%sPsCi_cbr zM5^oM$yeZWtrxhKJxTsW6FbE7=pOF;Qe=11DWK-n51$SHp6gZghn4NdA0iN(UkIi& z3nY~o3kcT6%!>fiPe<=w?~#?L^LVw#>8fFF2m~h?R-%H`JVgj>#Ophd;FDYXU3e=! ze``~1`G*@eT0Uiq%S$a8h_NHvz(-^EqS302`o}D4Z1nV44F3#@BtS`UBB0rngX4#P zixpq0dwv(&Htd>!aRB=#0Zbk>94ZD~>GS@sA5v7-Cyo%EN{Cr46)0^z4$%k7%L|{M z)fxA^Z-a6b1e_kiU$Sa_q0aIHaU(OP3aGfy+4yOw(2+bc;Z1*Vta~mb5+T^+A zM6;T1)_0dUfQ;85kVK?Yl8 zli9D@*D(c+^QqZo1)&$kwOjZXoeQdr1PAAvHcNk%7KF24Ha5`Fb=?WtG2S-=v+BAxvUPiG67Du>c%m6c!vdc;ytLig?5~s^ zI64nU9r1Xi3LnteZX%asu6_EcIp*sFlb%1v;g$MaO#d z1ty&(xZKw^7&}^oB9tE3NgjV&W$w;f9_H+IKS46K9AR`&(5ox>Ej3%Y5P}rtzVpOH zGf~nnznM5?8dL#8_SCr$Nlu0WSjr&WkzbzI@#dC|?M_yA6e(iQw(Jn|4sh&B=^))p z9(&M@WE4}3ADVz{G4onTb)BSV#aB~@*uPQ|^{@ELz3 z+BtQ+iQbPkT8eWO+pUHdk_oivqM#wv*;~cq{Wf&CrzQdc1I9ivq4;4B6pr^zR2sFf z0=RH&!_S{Qu4Pm<^1P)*Z&n{Domu*cgPqbtnT-JQS!#dxtWNtC!Mb;mM^dlzi?>L< zl_dr!NipuB(q99T??z5kS}#$k0qh!8&luf2pqVVs;FnD%6x}oW(y3esJ4PFtt@I?x z%KKWmgGYeN?dT0fLT=mu3C=v|pj zdCT@J{V&P?sk!tjY2^$gCM8v>F|pi=!8)?Ttq^6xdvWqEtNl(vtZ<@>)va7C>;w&Y zXDUnQr0`_%D*mHq&!{V)k5O0{iy3l$T45L78D`)zDaxOs~fGsaHVSaV|pic z0*@}_=Kr*~8L|wXeKIgLDHOasJ2iRQ<;2I|S?u#GfAxc(JV$_A5Ih&(A*CZ<8sQlB zwQ`peJw>^%M2DPB$gj$UvBNJ4+E0%;?sfCLdb7XkAR05++ii3wUeY5gJ)&YKu-ii&!0WJTaN+2dYh{QCmdD3#%=^!6+KYG7l9&3n7$dGD-qo6}cTY<`nP{q&6q zO=SG4roB}EEL&H4w|J@=f9D~5yzn#OWMEA1VW+NJ7wC>K@yfX2SHzirzWj6l?4M{C z``Kf)A@a|g{r9f?YzBrl{A>~4V;}2ezrMJ3Ih-cnyAZ&}0!zLck&}~*PITFQg&#($ zTscEjAcZ{8r4pQL=0K4P&W*67&^Vh&z85T}{Z(c~b zt2(_T`F-UG}}KaXp# zOj~(9GO zHP^p8sCS`t9UNKism>eo`;1 zV>^6_J7k$c5CIkyb8A299u4fXt!s#X)@K}84ooh+d7?KjA-2bWB`QdnK_FNiTj5%$ z)w0jwPjzX2V*Oq7&8bXH{CwSedsl=HcgQ?iKxEs$KRo|s zivLId{Qr~_7)>}Sm{}el78bGms{fhhGM96~_L2Ksz_ADST?=d;piS=sMcOIVjJ>oH zWO3}GRC?Ods$TZ5jNHXbvENG_{d~$`2RC(Kq{#8*!|yph*M3=@JZ@C3dLqq(-22Lj zDcwucS8rnxkuCEglI7PQTYAWvQj%K{a*s7KD{4h0Cb$7{g)^QYXeh#t6q5yjf1YSi z7{I5wT5+G!tcygEMh6Fs4!o$6;Do}UYF~YI%FJ{#RH5w=C69O?!}i%3IN#5b$Q8w? zW=J%uJmRFKLf2+F00F%cbEZoy+}Sx>6wd+y?B?aTxwU|P-}jwRmpdzvAb5HJ zN60crTR+2~#J<1B-;l?Oyl8!<*Jk9Q^LZdKH;pRrjw}jo!@mlmOts_ad?)hae)EI! z@~aDZdvD>Upg!aZh^e;`Qdfm8B$_b@_o2|C)oI-#%f1qm-_^(>M4Iite{D&wQK?Q? z^AAt;qZp;neb4qSsD^*y$fHF)GJMyv9<_}v+E~;HIs1k*zJ8Qkek3H>El~G~qtEh1 zW8V8WY_l@>#evb#en7UC&)z2vLmPGkJZ1i#&xwQyb|#>-<5XY7X3gYBanuJ5^DMS2 z;(uxX@0|QmPQJ$NFHh_5wh(cFcAj2R<7c%(nd8~J;y?WJweN2ivd`WYMW!eRwdN0m zsRk!glIJZKMo;Jnw#VBaKuZH zdWc97<8<1tQ?LG_eWS5+t`n{A{-C}sm}a)@-YywLjikh4oS9?mf%Zw^XB+}3({IBKeHFlqWD_ufNWUI#wr0ne@~A+EI;+Uwe`Bz#nYR zTsq7&!9-_S+jIsxBSsi4z8UFSlg>27{C?`mR2zOHv{m}`gFs9mJ35fo!3GGyNWRki za%3$`_w`Y09#U4a&Qw-ui7znO+dbdMVNid*+HVuW%pl>(540{g(jExSApC)R`@;`VrNqqw*@KCu=I zHdCKk2PGDJiyzJVt*?C?}rqFX%tw7l#uEphXMGeRg?H`QR{kf;E+=h7< zwXW(UB(Sxp7Y5$EL&hL@U;v1Vg|T|i$NA9Qi9jF}+`GP*H{{c6h4Kl<+6S!)vt7Nn zYD>cTvv{V;&l-&%s|vc@^R*9_)2on7!dHg~E?5%4@Gu3o_jru1kR{at?~JNd(yfuV zJu~aD6wc)-TTKl~L7j5(lRjgzEJx?TBA>())%}>l%LhnGz}s6+idzShxh^t0RKK#` zAz2Va?j5JZYq*l7L3t7%qWz7Z+ldF2KoDgf$PV@+9KMc0`8-D2Nj!ZXfC^-^q*~p; zFq{gpao5pFZuZbIWOXoLx(VwR3Fn)5#jml9?IH|aH57bONGil3n<&kQ#3YRetkA@L;Ih350`52Kj2CCxKZM)K*YT#ISh2Q6QQsekOT+@1 z4vV&0+h)`VGg<;B94Dcv-7NwnIA6*LaXGkfvu0Fom)U;-5>Sckw-fBBK5>90k7pH^ zG7^@Xou{5aW)Q(YeqNcjaiooit%}`@JjQYDr+@xD{|8t8#G9e}r528EBRl|fKAcQ! z%pyFMFyqs4XL^#|-zta8Ic~*P)z#D%bgn4}U&Bp7j=Lfp@{~ZrEWL?k&S`{p7 z3zz5m^hHNo9qz8evhNFrLjpR6O}%n+Xx0~#&x(aDrK1>$?z??s9v}yn`LS3mD&>Ab z)%(-2n_58{rI@lVHM>D?z}`nk)1TaZQwq*|fXxsux>vR`AN!P@DlydMGLa`Ei-Vwa z1UDb%PWuOQyvU|DE5p6Kde}2ElGEj3XSi*tzH1z|^%2@X>l;4w1;~a$FNW`9dU{+| zy{6U`bXVc#g|#N|P;m6(lc;*wM{1O^DycV2`RKj*Zo-G2i65g*_c`4Co}-VQ3LJ=2 zF&ekF8Y%|}J(7T3VnFr?1o;ikU*`A^3TE8r_3KCCH6LM7`9E3x2MqW(oBo|eLMiAy z4Afpim6?!@-ltd^3L%w}I;W$lfP-o>_NDVT*p{yc!@hH(l!#{;hueCx{Bg zKADYKOD4IXiPhRz_$zAq1V+IDU_l*uiz8oxD zxz))?Uz+hzn4~O63C`pfyPMu`a1?jV!q^zaI+U2qAv$BTNQ{64DV zD`LOPvXn7@Nh}2j;p7DC*3^w_Wbu8Uf#E7n2R2^<$f4 zkI-pyBW^Bv2m^-$2CTs>L&NyNT>Dn2I8IL?*MWqOGe8a8r(fA7C!+QCZP>xe32mz{rySJFS6x!^w8$u%e4xQ%5SEZFaV z8T&bDsuXRzh)m1U2n!1CGnhfa8ae`Vit>u`j3^pu1w=byF9ve^_{+^*pww)@Qr66q zp21EYA7$Ru6P~m_9JVX7xOjmc1WI+My_rGT#Eor0?9Odl247-R8AbvGCd> zE}_(i*X@}Eru^kNEmelQ!y3VQz)ewGq@UzdZe6+o1 zdvX9opD=qwJbK1vvCl{I!p$zl>BrDE|lPoxhAE=htC;cH{3`eQ)*oi(jXN|JV6A%Te^} zltlkJAIJZ{CG^Fc>`fk>G=1@$3N{oqFwy$#c$wv@Vj2r>LYP8+UEjYD89&okuppa1 zG^gMrEl~0FEu+-gegwY|+Ykr}4cXtH+1@!4(6Bq3eZHHg8)UyZ)W6Kx1&DWzba?ak zY)@2x{J%N6ueakYNgp?#i);)It0S{78T^a2=5NE49H)8m!yv)Mj&Jgg77lEwswig` zU`;yWBsOrr7?yacK4sBDwhnxXR0V!4ozdisxF8@mOyvI00jQ{twblWfTAv)67(PiBg!#_jb@R0#*~zU&(b3yaNG{?_!^j+9vZOVDGA z7=A1S=&C&zW-p#cPVZ?owXbyP)fF@RoYA|=BO6|hfS$)7-M(p66OoXh*1oedREAQ- zk`>VPU#Wk)TnBp}66SuDT7;Q&l+HFQ=P?-x`7ZV{dY;j@k4)m`MnuL~S^Mx-0ySbY zO`dcU@dlC@u-VirJ9%LU!~`fGd)@9-&ES>PN5mh)3br=3dm0F-9kODWX>nQJ$0Zn= zhrbfHN?oIH;_VNVWC^9F+Sibo+=Uzw>R(#lh95Zyp4tmEdd4l4*k+zE5A=2@fMW{9y%V+IQ7AkeRX#v8Xt0u)JSiU$xe)E>WT{{rI zxD=a)sXsW-wnBg*>{MrA`w@RPZw9LL`g27ox2K27uee)9bHgXnXY>`u(h*?9wGkT@ zqIdkfAmXF}{~U^WrntlvKk^E({lI#DLOP1|Z;Yo#f zRrOGAL3GZ$m#v=lRwHb;AGb-RRjyMn8?T_>P zP%HI7Z5t<`(FZI{fEzv0Tj_)QRDLtf#Qz<&8pgBZfTLWk{tTKzL&&L&Ch5vYCzjSO3B# zix)uE_AQyR?$hV5F(U!4N|bb{OuS_=%~Koti31Vn$9S8;mnh*X z@nksTd9E<4+AtY_3Aw<|*-Ti641`0+Y+8Z7FQ-CqY2-ZnwVJ=7{Pd}ra_E!i-JE$O zmp)kWQ=mG)VK^%xVb#=O5lx*`y;L>TRQ9ZHgwCE;3%S}t*4wgmXCX>eQ0~|OYNM79 zffPP-rW9i})780hS3MBHy8?EqtnkqT@jvB#6Px%>O6Je^s6Wwx;a`Yrof$ABAM;5% zlE|5N=6S+W@LR-LP4VDh(33Zw2jbqcP_oj+EB=Vkk{dQB%6v-tO%o5`tErqtkKVp? z-okmQtqH(3Je{vdCBkp`%~9=0GjRAU#N^AImw0PZ3gCKVF59Av@9l6s+WU(|spRk| zjKT3m^|N1l`I%$zCyq1YN8}fMZ-4qj%7^dYYXAH@gj7?tl#&bu7BkpN$ZEIyB>wQr zR%{o4T?gA|UhsU1R>TjBM~s!;5j1gkjW;oQXR5->5$y5jlkuN?`}NOQ2Q$f_+hN@y z+#DRC_9DH8^4mipbii|Iim2XogArHAGx*C2@KJwtm^SyYsRNjuH9(-=pFD;Hk|;~B zo4it5Pc#klwUX#T>H|-{x;jnlaeu0t_xL)p-RQ9Puo271^jLA_hc90im#a{z6Z2Z3p}cz>dgI!Cw{AJrt!xu zjBCZ7a^JRrSHOG5*1kb-`RC&pPO&{2)(&$NPoOp;9t`m*3ZSGh8U7k!MjjKGtgQ2P zu@8_f7`u?Fw8Ni)oL~4&U}!h;v+Nc5z0NHBX!Moz~)v@{qfVkebW4uB;okRrSRX#kBnSU%s<5K zd=_y+nAP(hD?e6A3aWVYihOsr?t912AC;HsxEk-tE(y_c-T@sMx3Ba4^pC&u?-S$= zaGWweB1C-{68fzRxmpVPCp`oeO4Rz*Q2a5m*lv-}^a;Dbry$q0F!V^+6NV-2Rw0~u zsuK}^i$bXz89SE|5@Ir9fAf){m)|Hc%f=PiD&yZ&6=9*UFvqxpb{?bH-J24=aC55c z=~cJtAstW6Ob|$;x522*^O9w*Q?XHzeoKws(y}Y}m|`_;`loIf0kk#H3}@C!1E1B< z`T#b3(%fey!NrUkyP6*d1Cwl91$lSBci3BRU5Sm!j!J2;3HUM`wJ>M=u$oAeVDd6y zUPCU05#8w^+j6GhU{ZSq1sHM~sSHxEus=)4Pr0_sxRLOD$;+CYfUu)i@*=uV**QlW zi#`Gg4x*9(?DFVr?CxV^%C-@Kvam<%P#K;tjGhAV_XFEXArzV(lOB_R)EB_A6O;K8 zg@x8F1y)-sl5aW4K0OfxT-!N2)YfWRNEzm{44VJu0lRJ^#PO`e?ypSL{hfm%m_vt3 zYkvF^dgTt>M1@?o&RS zo+KpIj(UE^ zQlA7x*XTJ2A46^ctRuSoJ1obx%_H&aN~j7y)({NYoQAOFnM#P)V{o_8Ap;##HnpK4 zE;}Fpfpl#BHW&L0r(!C*aYBzmW zRodOp2gVMXvI`H#O1kYD4e8Tk3o-Vt`gb}AQ?-1;ed}erFZ9?2Oys(9M#3F)-J??7 zpw=-@-fKNtab=8Lst5&GB64iR3q9HOMF=7c(yYB5MP&N56Qx&!a`-@%GokOi^ixf- z@Mn2eujfk6=j!EJ>I3E6{7bPjEn1RgtJ+1qWmlM`q@b*!g^>%h!vhX}=}UU!Y;+{B z3#p*8LORYFht^OjUL&$lndZ_i5IDOaUW-E3`B@8ZLM!5GM5O;3x0m2Bw+ESwJKHwT z;BzorZJU<>aNDrF45|D^wX+IOQI3IfB2F|h|jhT4x+51y1vbX>4oD5#;)^Mc-(Bku4eS6J;2mNHaMusNk_Gy6rm=} zvh%438(v&AQ(#WB98|I!_U+{^nAY%6<9N? zUk4Kmkz}WEZszRJ+iYN_dF2Bo4c88=FFKV#Quw>Nle){WG2wVHp^5~YucIDmnK9fVU3NQ+SsKduVAIQSlr$F zYDD#&Zm9W_shZh6YmP50{-T_mL?A9(z}lfmW#6m(C>=w)1Qe`=Qp+81#+ytS>pqc(*8^j2~1$m?8vKY}QCpXiWu{IaXkV{Iz%yX4UCFz(~ZRzuEq z=sC9(sW6zckv*3@-jJw;WCJJ`aH2?GI#4`}T~~#*If#NP zH7G6KPO(p>B#Goa3y^}3Kh3n-WsEZ!P!T(Sl5h+_p!pL=Z^erym-k%#>Re^ldp;>D z1#>qSQA=%SzCV;}Q8kq<>WT9<9f`)-RF;qQA>j4j2*%9nQPYxu5-?$5t%7{&#;fgp z8MVa@X(`J3`u4}v42jF}li&Xt=d=ddDH*@>@vj2H!A{BeT}J*OAfK^QGJcnld%p|F z&nX$d%gC3%3&{TvZ4uj{GL_-1@d!J0Aq7r#^=h|e+azupV$HaUfZ9~oOk_l z{G9XhFL&_EglT%UEuFh_WVuwd@h0@8Ykh$erFD-!<9H_X=y>x~>T7^Kr;tz>Cq}1lPp?MSPJ&*L$LMK< zmM0Z2H{ckGRqG*yPaMTF0jEpEZ=stGkl&AVe5GmYGQUIxgd(U9=d_(QFD(oJIIYcd z&Ak0KhrrGupEw2&E|@mEd%9&o$+_nz4bib5CcgTLT96;jlV7BUd>hM1WHOXWX%x%} zPk}sWg$6_Hb)9XaeH8)%-z2I>*0UjCT&*vOp(5ixaQlVXtM+S*%g`}4IF%FbNfwvR zG4$rKhzRLbt$e$-5f7y)h?#%E_Ir;AO>ON^cG=S-Tcst>siIA-z%o%E_YVg?l)R5? zr+*H2Z1Jla9*+GI?wHZxd$cJ3qK$(e@f#EV8_8{-HR6Ye!UOCg7m9uvJU{$K@!$IY zcedcabyw_jBT$svG zXVLbljZIj`^{muYGunvTm8o-x4CAWI6}IUhdVDH6WhEm`avF4>gX^ zE@FmYr`8=|F!6*ZOKCWjMt+7qPRL566=`w!6yxS-&+tJ~FpX>Lu#l);# zK~i3LE@l*I?CUgo!)Dm2z{>&#mz0r*PiM*5BWG9P_OABM<94iS>o*4Og1fpJhO~0_ z;Z~7?V@DV5K7SEG-?qz+=qj#9hRK=NyIHa0B$Lv0e3Fw&g}1R2aVhKREOww|uVWq3 zzV~Wbw0_;9W8Zz;E7e=Z!enyQI>Az!J3>cY;ONbNOiN%km@soV7kG~yzS*kj^^1I` z@k%OyYExdYYF7hxGCWdJc!)5+@SO7oa{bqysQ%iGpL5B7y*uI8TYq8)y58F_Fm&E$ zI{!MR=j=$=ufwty#;?O*AUo)&IE#q=E=94l-V*ddZ9gk}?f6f>kM2);)bcCM8|;YE zznH2B4Tsp4OC$LhB!W=G!sacsPMoOPzhkDIze=-vrhX6Xkd z#YhB+QZ@bdn%=+Hoj>8+AI64{%eUh^V~9#UMCN%ny_$t1HV;pZ{v$X3&9VRW$D}5M z$*vK~J{86lI4OzSyM--OKurAwLAJK-_lKTqi}iOTj`me&pKEa#a!Y&sFIIxT1BDaj zF%17sCC-Grt*^g2UfCxlI@-=deBEd&tVEN+)8TJOq?o~3Gn1U#hC%iDTlo9)w}=Jz ziIUYC)t&`rENxO8WtVzBe*TfLnu9rKb-!(Y-xqTqW6IX1@-4?jNqur`{0`!@IKQ!3 zt1f?WOlE)i#ESo$y`a&$iiIL$*A{fK^`yAgN(yq4Lj56jSovG2+bY%7t$h}DBsc1< zz&Gd|O!yrpjxc-K+54zh1R=(U@=7E+XDf=s_*@cZk(+B!Enw{r);~_~9d#g0`BtoD zcMk#gQHKQqyxRkSu#NU{5z(4izbOC!%GcbU#Rm_A<;hcft1K$P(&@Gu>&Y;)t1wOZmG|CUKG*If}6TbPZ0g6 z?f10~^sQB%+K{|quPI*s{ndsuMol)EQCnUkn74ywT5;L@&S+JmkXB*+)d?a?8>}=P4kc5=_@O|-@{2J9^BSGB| zC>QwDOfp~YNd2tYSKR@VCE~4m+glB}@LeODRtI~kxh6I9ED^vR__W0F!aaC!i}sdT zuX?cVBFFoWH6?;Q9 z$?M}`+6Qlojg{_};$LUPLpFkq8=Jo0yFuxFnl}_@0Uzu!zG^Y-a^EJDPlN6}h$dB; z-l9}qsxl!Ea0I8Ar~l$f`Zq59$p+h^NBnlFNj+@p^cA7XfPk=B-Ro0o1xnENEVuHl!=C?)gLeegeOB!Btc&`7lx^+T?Vl81e|zL;zW^%-J#&MgE#204wm zlQFISCa|}iBGSifCelMu7U-<35YGaXN=ynWHyu~bbN(UyNT*2~(1OO#UWGy&j|K8# zxvQm|k`#x^VJFa8G5}m1U%9Q6YM8-NU{EIs$+T83QD0pT%nKjv0>6|1AQT$UeZh2x z?5^7T<&tZvbIOJ!2Nl!FVm^rqZKRk&y=7H~Cq=HNwAGrwijBC8>Hj(5vM>B$eNr#{ zRgoWYLSL^rygaM8h5dvSuE`C6J2vf7fB1Q9q4o;(I$25V)TVAzt0i>E*_?qjJ%tjZ z7GUw3525DNn~aeCFXNEyLP5#>cAk~dHWUk$L6Zdil}t|YMl30IY?&f?%ET>^r^nuV zpwi|Wck0`b{*E;NKrD3{^2_Tj``mn78*+5pY4COdF&Zzmb1{AJ>k@>qXkJpMKf=X7 zgDUwI@aEFY%%;Q_o$e0FgA)OB>nC^O1CQaBY(_LJm)J+~TH7@hDH(_^1NBwq1 zqGJD6pl$)ygC!+Yg7Rgp3Os~ZD?Nd%hlZL}D>+(+uY`-+QqK(A?U|n}U*_?9dfxs- z=fgF>!UO=oFZK!hES>!J{RW@D6CpW_X6a zLR(Y41zSZWocPX{7Cg3zAS#>2f_M?MdgTT0WUu%b1&v2fvt$t?U zXY*xq74+m@6K2G+skVI}NMa*FU&b`qvb+oIaDEU0?t%iKzO~UpC&&~V+IJO$2yt84 z%47Gx3A7m!^SLh-C`5_Dx0L{W!Bf!f=tYpF=UJm_mjp5wNTn0XjXXbu^rYPB*qnMG zX{CEypS~cdEpgL=P!fK{w4hR}W+bJh$w5zvYgcG-+i1`<47dE1*LkE2Q!6GF zn3*y`8|-K<8!kHOJJ@>c^AGG!bG)mLazx(l9S@Jx_3)G|%*!)+1mbfUrijL}=ahe> z$j(iQ7Ejm`j(HSZ(dQsr+GCevNR~83mI4RgFn*SKPXYn>^NW2_`5CVb2%#y*57A|- zhE?8JnE;SdIcZLzr+5hi2b+{5#(Xn7h!H5qX9xP)hlX+pPDjqwK;?izl>@zL>v*Km zQ~ju?@?fW>qOdeGyVQz0-ZI;ZXrP*;r~dV&`~a-K!FyMK0D94GUOIoxH!Y08%|8}Q zjxA$_N6NO?9C#WKsL3i#i|5jq>;s!7ev*9hFZM6;{KOvR2`-Uj3W`P;H@24L4Lp^! z#pJP}`zh3(L(jlXDDx>v6i008A)x*fhp8Z+TD~9nW1gR`)?-6~=VV;F0Df)*0eQIz zfnV2ZTo3Hs)h09Ye6p5J7D>}jp)q?D)6${oXkrD`{*9UWXQ&)3Xj!}uy;3fXG?u>7 zj8nIv`Ex_9=8Dl|<`aJ?6dDRUVfqnY<`ZXB=3YiMWXN!e;y`igE%ZBC+Pk1SqVe(Q z$s5FE0WW`$_}xB3Nm6pCSP(ZG=M3YY`ZYTQ^CtGe=RH63?w`H>RulWG!BZsYM>Yo8 z!)}A^dn)`_!gCFBsu)*FqQPDsWKqWX7Lb`1<96i*yF_DeC5MI8C!oicaI+zUj}K@; z%?T#UR|I3I4Og!1te{3IyXBpm>WYsnb$OJ?yx!f%8=;D-v+)t%Ox%jFX~^L>HOSHnCx9h_cr%M=awEI1_!PeWBFy~4VIng6p>j3Kc%ie ziRTeRP2k(d*9PET3IzG%V5d9Zn12og>Yf4m-HZV@x4t-G(%Ch!S5dPNx4Z&6JIdw# zvh!|lrOlEhdfD44-(HYEHdUJ^iSJTc$9!vYcX8gH?U#>7RuJVX0w3|3aHeiZ4%n+~ zU?GN-62dJMO}JyXG!G;dj9VWw>B@svNDDclTK1`=(dK zW=BtK8$Bc<3K%2Dy9vwRWJlR4IKq2kwd(PbVS^6Tm!;HYgr!kcZzj|E_Q`V45GK_B zr^DPSG~`v1-p&jYkG^oy+^+u8SUt#73UH)V4`1v&vYQCrNz}_n7z}>mcy!c^^=Ali z$u28(tV!{l2@Rj!kWgT*=p^JLf&4G_V|!w~cb=5A9J-83wu&OC*t>Lv>5U7wUpJG< zC5bTg!9f$ZG2bT}1VWyIt2!T4jW44}?zVb1ORDS6NZqQ+0J;jHd1hP|#V>)cF#;t6 z%-7{o?d=P*=hj2!o0|?!T-9fT1@Uq>24j+Qk@{)LDmk<;vDo+x$5V=tldi)39;LTl zum(-uWyo+#W0}03v$F_Km!bgu`X`l%^@kC!T z)1}E5SN2}_zC&CUxREr92#ARlwo7Aex{XAxspTeWs=a=-wN%a{d8**y8dB$62Ai%E zkgTMdb^a3vt3F9D5T`!lvxP7Ni; z!G>utcC#a9-s{i6Fk}%Dj0_?mPckc*g)Q&9Y?jXifu1w+Roe&Yzs7eK?$rIY3e1i;h)9kF} z&j$kc_yNRu+s*YFW+)$K`)tD@AfdPwsg;Ow!W@sKdCGCK zQKOMkt&(+IU{4VcH@7-BM>^vo$G88=p!{dc+wb51qoY!_En4ypOqBhYhYp8mT#x<1 z{|CgyhBh&m-&}H={MrWDzdDD$DR{I9bm8Cv{_s1+fA&UemhBw|r5H%%Rx6%c3G^Dk zl%l=dOz3%W8KQQX%T;$EkXe)2p2IrVgZs7_1FOVmneU%DVV3Qp~)&EDxmqh}r6@r{xAd2^U| zQlaZhJmgViEKgOKcDO=B1_b6tC71geX$MtK98ds{&*MuI-{a8HL8ZM&A5BoeyW{_dq}HX@B% zLBD`D#3f+U_&QmPY1YodgCF*ZOe4fvD0G-$ZSCm``d9s|%0$q{;2uL4MtxR}HUCPc zz(s6ACbhNdu1zh4M1Q&2-iPB%IL^Z26|P1-OE&(|-ukNLQzPD3m!rXza4fX0t8^rZ z;@XjJ2K;L9pRx5{egAiU($4_EtR25bL#PsW*R2{$We6MrSs!IqGb-k;i z0hb2-?Px*VeIgrh_{>Jg56_Qr9TfEpovtl-pL>_O4QgDMI&$Y}_~N(s9urxNK7>kE zmum4hSuT{IubE<9TQ$3P@AAJI-hX=SAD=b3*^Z2yf!P8qkKfAby&seA zFZlY!`2PTtArXxnC!YP{fBh_v_eI^+pRLXDcSz1Y#48T||Dw{*f7-9VZU1*nLyo!* z79=UPL$4g6xsNz3aC`B!blZT&qkG8#fi=d91I3 z+ZNN9fyTDxN(FJ2=ecb~v52njO6%dxS+f)cZ8ok5#4TTLX@*6ul!)46*E;BU+~}NY ziFWB0w?}^BSTS&l?HfS$0sn+#HHX?Q4dWJaXlSe75ID+{uz3C&z6{%Nn= zW|5r_1(Z-1e0b&^oZm4ZItz%Rfo*3Ywk~<;#pPs>VmE2m^J9<*0a$Ra(@|J*q->5p zYg~KPJq#i%gY~WJN-7*grErCh^DEH(k=ERR_6C@mNpb<9(i|Y@Zv%936&!8W(7-^3 z4O^>kpW z62q&g_S&^G4bmG>Ii%Rl71${q`(Q87bS z9k{wJ(NR-iuo+n2PeN^}QmVay@5%FL)}FVYn>~grULxOe&Xh583z%;r#XgyCz|6@i zV>kXy9HqaN#((nZAM0AgJOAK$TvK_gI4}sz;VkxQUxK}HSt^{DdJ*d=0Z(%%OQp_vL!6fxWdb5HrERq^g&$itJE@$Co7u?<`xD>;_Ob zaN>|zCbsGb`?-x#v;R}<8hbN_Le=(DlR{6L(+Zr${PVzGw+$w$98THYyfS{`d|8h>1p!~7m=_hSxO-Zr+ z?VJvAVj(Q^v!Pc+B}zj2Gu|n=e>CYW-Z>o|_NXvUHE2#%?j<|18_hu3#J<_fNhUOk zP%nHTg>%6hp4F#p=&J(&FhpSLH!Hiq&lapj9R}bXu87MsmPN-mrG^1~Nl*jd ze=|yn=q|%Pq*vU3W8%Ub+c+~r%*x2H$}5d#P4RkV8%;DPXZc(8r7zIxwUIykQYQ)! zW*%11yL{Z6RVvM;9JVyzAm;$~3}+wO*~dK$N*Z2V-_;nkzh!ZP#IE&I#f&gB*@ybR z_=%2WYSr0S-R&-Kt@xnI=fL-(cVkrE4V97FmhNA9J-@;bg!oQhEU6rsYK?&UW;Jy` zKOm-i0A409I+ZNE^U!n)88sB#@%AS~U&0Ui57OXBIfo`N%M4++(eTdp%8jrX`OC(4 zY8qsZS%{9kCcqBfSusP_#Jc7s8s zMATrsrzZu-fN?(9$XSxzGm0Z(RHm*Pu;5IA%#%tcgPt|O*wkV>JT-n+slmv``xuc} zQ0S#<90&BA#aMgtKhDi0p<@P}^h@Dy8BD)=op0heCF1&DmpK^A66y4Gy0v2+$f~5m zP8|Ol&p)FgVgJglV#pJ!2!fcCmJ;`tY6_(LJ;T-7#%ZGbT8>jj=5@Bw#9VAx4CIWmUe)quw-aS*>j@v;l_-mke!~yoHxWPO^f8?RVroskPz%$ocNd!9vG86&+u3eE z2cv>g?`WY&rzUZOQm{xZwGSiA*FdWxZo{DJtJ>A7%NlCA{*FMAJ!;ktU*ki^kLJ`x zvjmt2=cTa&N;Ut8)L9#w4%J-OhaH2S)7AhAI5Wx^Rkt?6xNs@xXLRGbrV9`U&aQ^YlqWi@0^ZV;?nmlr(mQFF;=&U@Gr z7m11#r3$v?qutaK!pfmgj6Kp#i21zAF;s(#gP=b;M`etoC}h+HyTzqjY~jK@?3rpy z&?_gk`s#^>5abgTWX2ONd9CDobG_XZUcI&)U|g2?07#;ly~9#6_!_Y+)>J}~0ci#6 zQ_#EM^X~gtLy!?nUkP)yfG;vZL|Jkaq%J)#u)eI^p_$RzdaOOJl?UN>b_>tW2q8d5bPRR zFWGwh+O)i0ZpO+|ksk%a&MjpZwG9W@iBPt_n=ez<%gp7K)=Pbw(2-7a{?66*CiouB zF>y@422BhRnU-YAU)fmKN=>(SuZ1#U$-E>ZGgR=%c}1W zcvdsHUU_!NLL<%ts_eet6r>ohS1geA&A7T?eLudwh1C&Pmipz;*fZ?V*J}x0w{KB_ z=lS&u)14@D%52{*t_p_lbvm1%4VRv#qag3st*~cTK*NRTJLvw=bbWyjOc`RkY@i5286JPsHtEho+6 z0d#i-hjZVG4qmRq*qapan#sPLPL*(D7934LuNX}iUp0FV6i(8V!(SSsB{5iDK7Q(} zo!Jks?bmnBON4DJjDUKS&Bx(&ZoPC0K< z9y9N2B2hx(JqRUYS#h1j=vE=I)zwUZc;`FO%o0~H%?VTmZ%PZQ6r8$D$+*5ZpWLU@ zTCEvH@kSsxMW{AyDDf;_y?Qr2HZtlU)NfEP7ukq8ugfBch=}+}a!42P0dkzrsO08F zNrZBrv<# zFR)YLf@9ewW}_znh!>fYqYR3saBEc4Ci1W){r|A{-f>MX+uk@9EGQ}>pfr(A5Reii zAfiI(#gK&1*#Z$rsG&-+ptK-SN+_Wyp(hkUY6RSZv>=_(d+$Xlih^(4>b`gHd(Y?d zp7Xos{hWJ#JNz-^$;_IWHEXTsnR(V)-%f{Vp_JIkw2t;3Rb`knVOVzbj2qc64xk@8 z4f6)@V=z2(N*DV{^JHOLSex_cOIcbLA)%1J?Dkd@IX8biX@*)$q$lSDbar4mZ>J8aNVYis3nN|73j2cG)Wm_Zc_nTp6xfj&|>l?ZS<(DhsMKuReSrxpNZIrD}Sxq{~2g{_g& zAU+~N{)ZFq;(C@HrqDT70&G#r3$sAaO?)T+tx6n1ihE7}>{?Q3otqP>bo4X?tY=gg z)Y5~Y$df(cbIY(E^Lu!DF2L+#A6Gnz;CZsVo6#m_$%&EJscDo7Cn+arEIj4dgwV81 zP7L)-L>WTE(=^mDL9JN$XtAv(kE^^#;N*_>p z$;#A$2dw!*33~J*4ka7OIZKXI2^3}h8(S>;^qdXtg3f&PB;gpU!OM21u>tY z1K1MzCqG7w5fnoO2!~5G(@`KCY7HaB|D5Mn1_n6YaeVx^C-78fR}%y(&L1dG9u*i4 zE@7=99l8cJng?d$aJ~s7iuH2sBdaHSako+2s;%SNBpP!)hj0kN|{?mSBc zIQm63H{H1poLb(2XfmX7W~0vQ2-kar%`GRcg_FwZkh+q}&$SsC4jz$WpI`LEsvX}qiy9>|HgkjN7?7y920P_x!kM$*E zX$^AZ;O-lRg=h1;LlAH?9IPSiX6mbKEHAPVYIq?k?M6&_+I}f^5vKk`hE089+4czeS*%E#l)t_~{ z-?e!9BwwvGLwjhiGYaOBa-xQB<{F#j=jp-5NJ$Vn3MDJvZAomU_l{M1>1IYYIa5>I zVa!)ZjoOszsgzWp+2MtHSH)@qL6}rls9jB_Q>K3G#*XY+?!9fP^WQ6(`veApYhAN5 z%o3l;oeYNMMor!v@Lek0t$mh^@}8ENc_}u6nZEhNCpVx?VmsIY0{PFpB|`GO$k6?%@s zEGILk{cXf2`Mrf*M)80p{R|IyVzM4m)iB>S5)}(J(!^QZF0)`Q2TwJ)h zi$w{&EhH}9%EK(ZcsoW}rQSL|a9G*E5j{^r3FfPzw5e}N_+?*E>xu=}N41S9qq1NY zju3u7RXp4h!o~0HlSof}>}!=)1ObV2o%v9|V?RhLu88o=ytnS0&v9<8v=nOIzmK*L+dW)_Izg*Z^XZg~1ecNDzS z{4_ZKIWB>wbv&TP3EyIqh@VKXsmggUY}5YmUAIFm^!nJU$zFa zap25n-rt+cwD%|)1sYy^OhR|w?ozhm1PUa-(@58+PV)r0yrif#v0P@?AGW;D3-r5S zcHY6$QyJ(!u;{nqD&3LhwN}`I#*8~Jev>yEAb~Rs3b!s>L+(+4xrvF(q zXF>wy(!C+uaovnZ)jLjJ*dRL*7-^iZHr*zGcoQfAEcvpBUnplh$ca!@<`L3`z!d?# z(#7GV(N)eC_ef((-xR8VjecOLkc!lBb%N_W*G4raJuPx_c@gK{s6aJY;@5D%Lw(Pp3@ZV{v*zDCot6b++J2}2xgZw~T% zHd_)4V;sy76}3aPr%6PRX+B)d0&$B4j)42P^7IhmNQ}z3UAB=)kIcXnqXtz0fk9G< ziDa=;BwIP${MP&!pVtJ1M~qlfO$^MtZNhWql(eC?afeJpg=bvgn!acPoQe^R&&x0y z7)fII9}#^9hX0zvSL5l_*wlyAZidqe(1+1M02%1-XRv&ky9>X$_^%Rt?nY&P&o1^q zAme|7#2@pr9B8Y%MJ^k1hRd6N6q_v9snlcE6VF5=Y4l*3yvTSekPYJA@MJ%6I@Oz# zFhC{vO&yOaCB!n}Q-W*}iifLO{M^JnA)Yigg^!oA$_`LMo+PTFh0179iJk-=;CP%- zm1y!%8qzTls8_(&?3NcZJtf#~|1w*SFzKF^610YB9mwHN39&Su)*Pra(#elUrEyY7 zw37@&+nX_Bx3!pzOu)Ymg(S(neyR} z9lI(flM2o#gGXuy^LT?t-Lt_tVI8^y1fMP6X!R*~K{WTQ%?Xqw9e&9ou(w3`_HAcN z%Wdl_ODA9q8-gUP0nrgsT*_-jp_N&HL*X*B+^(TH%~S+z4(!<5xT0K^4oAY+e4<7Q z{4BW5fHvn#R*b8*=m}xz2<(1OH3EoR1%8!Eax6`3by3}>w%97;mz|WpS7ciDQk6A5 zbS!ilgKV4{>&aBG-QZM0(cM*{hI;M+o)XG}u%$tbU2;k{%mWu~;#pGe+Hf3`uXA6( zK6O@H?pBpI>rxL=sx_w(X;kGJpqw#S}#wD5XjCo%qPx&e%) zHFNVlY#KGWVUhR3@FY$ew;UrlRhm{6a{#Dz_Y&Ylze!&9aK9 zU}NE}jG)6dmv3Avo|e5V8k(KWaPV))+~0ZmzX{;6|ON~T{;9Q!x9-pM=eM9l0jW;c@$ zQ2)T3cs1?L{XE9lmS>R4+S_f}Bfp4WN4~V{cDdC5a^Z43Q~O_y{$j)*B%&*JyJ_{J z*EcERk`FNYu&?hop*-}2pV9IHY$5mruJx0GLerZANkIyrBi zncv@+aqaIC=YO@zhaxKUS@aXA$?YGedxjpbA3l&dMAQ2<7ZeP;iL0E|C!cOq&({r9O$o-B~`44pZFVLjp(Y0($SJ8!8 z3Wdniap;f_i>!`nT5Fa#)fI7eRaNL`7~<0o%Fm#S3k9lGZF~&&uz!K!|Kmg0m*%AU zLIHlIKhEwL)pbQRnuJf@;^yYgdE*upyPO#B_TIy#QW>@M+<}VEG&;Rir{{>ne z(10yG=e6>CNjKxrz;?y^N6$Ij`ytS`afW-}6EFC*Tv5@2UShDn`7bc!e|!l0((Ly$ zUTF%kV{*N6LFd}|wVRss?f&-&=1DnB+>b@Bw{KtlcbIGlTuJQBtm?~xM`BGiQHP;; z1wQ0YBfU-l{fyn7l$-O;iD!@#{l^*muh6oijxNCuTfJOevjDE?xHDr@2W5UH4)JN> zO*dHmp6cvTN9suazk%NBU&5UEkemz~o7zXa-qd>JoS4e@4M^poCx(09y{UZkzU!^S z|8~8lFDZSpNxzIOd0t>>s!7@x`%_tK>^Fbjksi@%x5@tog4~tls-RT%^h27r5l{i- zEk=XorbF*zuorEAK4z~Glz-Z-ak;hOh1(3w^cN-nn?G`{D|OPzgmP$0n3p^M*_g)d zvv^JFHQO;CZS@H-|BtyJ`B}D<#0x z+;cI@Y#9t~!b6EadOuj^E5i?+7RJ#J6@K%O^ogic@%?ANaQf%-l$l+j@i1QL6{u-2 z__!U2rHEUsMvR);9myYguc~YJTT;rH4qp{I{?oS;_;&O-<=b1ff9eVR|AR@Nfj$mW zxRQkc9m!(2FpLoO0D({3@Xeqm#4ZzO&7{4Z-k`4}Ajmp@e# zuN|OzFfg2;R-VW@SYu-UmBByjH|KdRV)t)=7AkU=(|iArE&rdt5dWMWI0a9f;f1C> zJ#mHs5*=iyj`}9P-{8wO2;#plYXp5+5&s6u$~QLkKJFVIZPRw&KU+5Wlv<^Z?f3>u zl1qmrNwZ__gwQv`q<;>l|6fsU|B#e)E_;3|H!m~e0WdQg|Fk}#-h5WTG-)9u_SIQs z;lw%5233;%ct!Qm%bB3{Y7PK#VbVl_h(U{hV#lBNn({DZcHT+WFJ_g$oW?obixz~b zgP><8b4M_DZqHmfjA!z#I@wN7Qeq}f&ckJC=2#Y@8mGaLbKPDf*L4uc-!AH#s|BF~ ztouAZe#q`OUYq>~uk*g~8u9PJ>kXxv`Ezp4LFWCYQ%2%SQy3{m17}wo*>+fUaCL0a z8C0{LtcW$;>u3hVonXLz^8<&ugQsOAt>+rWXr~uedPNPd+YPh+7|FsqQb`_HGBTQ% z-O!IE6zK%cEr3oRs)`R0YYbg-Q(NQDXZ=-Y>0u^K(Fvgn)Z>Sf45G;<&5v4?GR|1^G#&m}*-LrXzssaxSej6!TcRn(LT z9U3&du*x)|l|?DN78-K$B(F%A4J5K8tg&0|hA`dnYx0+OG?{QVYd1~$cVvlAYVcR&EW@bxPG4%8k=*9NOK}2y%FWU{6k&l1M0XT- zpS_yP&<7J)+AWLV4)Yc@H5-dPaF2#0f;*?-!H34pDEYKr zNj2Sq2z|_vgaqul?5_*~nV*gB8FKa6<2ir-GVskOpooF_fBCN2-kSUV9rAsK!%PgS z66aToe}l*NyAO2ToqNh)f9?O3o&BfubKq+~(%IJC1B1Nf#6-^w3+CjMxphY>aEwZ@~u}zuxT8a$<6TrJ(U%g zkPm3LvezWKGlMx`A=GDb=a58ji?(jm`C(yBC)49enRVNn6t2*RZR%0bmO8u4=QDDl zCqXZ5n1RZ|=uW7lrS+IXN73MEi%IQ1f9)H{ckYR_Pa-E)hTEKm-d=snNhS__iPBEx zgkzWrUtX-9GNf9yQ<%$4PtGEMR+}B9w5Z{o+s}6)hsyFbeyK~=nwjXa8d^LRSn0Ot zQaims=olk1m)Bk}X{Bl{#7Aa?&_J6BdpM-{i>IvbvW;#!6n4t;S(9mPb2rK1us74X1Vl;T$^(9#909L{tK^+p%=ZhyWKu# z4VP!K1acYD^YACAz>gn4N+6;`>4rei55Awdh(^LFng@c3js)EP0UpwBjGw$Q_ z`#`9&vDv&~ES5~X5*ArybnBT?B!;N%8fBOe>*16YH;})q_G@Qp5NiL>3tHwq?Q_{~ zw!NjBoBX&{K8<$B^7HwwYXOY)+txgn(C><65s>>Jo7*Ect0385QclFn9yEo(7|z*$ zRY_*>@e*jEY!oVr*WBY8Zq_)u09cxL`m7kO<4?Gned3hfuN~`$>A4|P9irBciS4C@ z-mjxE33Vqm$z@R>)T~cHA(F2^c<0dvT`}U2mt`^YZn?|ewT5Wpg+04_4<1`zMM4%| zU+Y{sHsw-V{+KTKe^wUR|D-IcF3uiEXAgHiX?glpLp~`zq^-lP8!kS4X7ulu_<$gJ zJ_R{hJ_|mno3}9ZntZaL?-dP^?k=7f8>BnmH>CsncxXU9=nD7SHw{@n*>5UoNLMzx zBGUW#?XtQYpX|5JzhAzIaj}6S>0O)AX{)L8Nx_gl9(+<-PPgokH-40=KT54{128tQ zMj>s!lQNc( z!8p-r{BCm8RAE02jwaH<&fbF$bcy~m)YIDIw*mY%x1Xc=IUOm4gDu@ONy~q$`om7i z%Uo6f{wGWIweRZ~!zpcbEp>){`{+4^=zk1f2N_fu4jp7X#CY(~A;v?84<9KHb2F%@4x{D#)BsgGafp4fIb0+eftj_WMnyXn)S>D>By*#!)*LA z*C9|C+~}5DXBUT|do;dqoL%lgOp$<~>H7&__n^jLy6RjNhy5W7&V;!okzhtk)s8I@TE7Qs2lt zh%6jG!^VF|;D+J4tl-xHhT{k5%~%ewFsLxBae`*VY?JwEB5A~joWI?UU&S$x|!Iv z8mV8!3$fH`?hRP7JGUP16;kvP(xKy0R-1mRtD}B#=y8htggns8MDu<4Bj-}qz{xk! zKqpEh!NMWP!;Z6E_oZRs1+-92W_sw`NV8f=Dqwm@;e=WIhmB&(-qpM-SKFP=#AU=R zKko!kZ&M;5*pV}l>275e`m=C0*PLs()>Est{k&?Gz8l@5kWn20NgQkAoURU-3AC zAi%hRgtd<$Qm+H{bo57dKYIG?7~7E}mog)4-32^a)z+kQ;-uCtr6=egE)R}av&e%q zU3V!nmt+TQ=`aeX@%t}iKSlvSW=VFnlZrP7^Ul9$@76#g(LMN95-Fl1H|9gu1M>n6 zAnQU2+nGGiXD3ZIb|R}Zsv{THo&1uvO0x6);*RuW!V!IsLg!IaBS42taMlwv07RnM zfMl{WQUbMi&ECRTYZlK#xH#}X_Uv};` zMa&2^eB9g}(V^3%kdUQVLdCgTFSQqx0@!q2ViQd|uOdK20=>$;2X%d7TF@{1`vW>n zeU{sMySt2lFCZ$AofqP!(?-Bmlq($8iV00RhFP`TB0v+-p8~8$RR%-{#74$1!pbQ4 z^aldLV#6`LS?L~FIQDe224}4Vh*QNjOoJinvEMaXpc-$jebIRuI2mr zY`EiFnk!p4kRS1djpJ>=X|wvrIzFa6dtnkK7_R|sd;+DgJFPE=^OXV^rXdV+|Mfvy z*=OjyGaDRe)aML@uSVTQz%=$7Fm2~H_bp{TgqK@6u;2zazcMuLuD%b~`{=i*QgYXY z$2kxkQP0F_0nSN=3!szeClc^`{l}$qqo|EUn`h#^@LX#o++Q=~WqWfSBdY{1aM_`x zW`GoD&PUHlrzMN{aweixw}LZC2@k&F6gw`#I6@#2GP)O{(kuWV*5e4_QurO#gZ0uN zHU8Vy5|YQ9>WQT&O;MB}DMZOQ{#`{19ms&Ey<47LdrnAml>cq7I0wZSQ=(j5OEYjw zBa=Eq#av?KPQ!*$a{}|VV{jmTR3@ZIgmIndqrD8M)(|r9Jtj1fBWU``7MsACXDeYu zaxzOf=gk{=wvM*_m4Wy54ZDKZ=M6~J$BV-BP zY-)hd<9OxPBaO_3;SkpPEOg!kY58Wf5h&+TE&mfSZmn^3eiBL8XHu|*nF2K}CXQNI zbz01ag$ zqI6=Or_i}bn8gz+8d9(u-syjDcmM2{SGe%h9nBFlwmOwBA;+Rpr#iU>AQyBmSB)hp zziCGcM79&tUQHQgoxiid0d`rQE*fH`n@hL-)x&1ae&?)ofU+qGDD66DXn!OICf2V% zjS;w@hpdGjNoq*jx!f6J-SAmfQ5q3`uc+oL1G61Mn-I0IUAuc}dZ10~SF8LVTUzvwKH?j8VINd;j9PR}Cq^ui zdSSYK9f-FHhIb%N*YxWN7%Y|`ZHY}e6D9SyP5!=@YD$WN@QY!=Kp@=KIR%J@BS31s z^*#lxE_3w2G zR2UqCe}uZdkvw#C8Q7T7*e77XK5X!vEXUK@M zNa`Hs*{7Bcc#WGvk8^20)a+cn<{Fuefgaaq;l7(Q7c-oHh;i2R!TXbg>?mLz_l) zC>E>dLs;6^zB05rhjM2WSJ8(@0s!nYtO4{i2)|vw`dDtzp?DXc+glGTNo~7YK{;%s z*(962^@^M0Skei@0qf-O4H}y?5%13iSIYKR*|j^dWR{7GIJ?YBHWCqlw~woQNF*K> zbCTAt_jL_>)Zsg2uru+o_3rQ7x-2(;yyIQ(MHv}2G#;C0J`N4csyZy%W%c_SHgser z?G##UNBZBMc|bM$PnxNUwh<@>fTHvF_hg7_5HRqkuo@5#n#^5pCmd>JgpDUwZVH3Hr;Z{&hck zGVyoZVOMzr=X3S^tc%Rg_Ors59dp&_=vgdZpd(HSJW1Rw@c(!qP@VhAptEb0JFl_M z1v_kaSQb9kt}GMiGZXyAxXA{ioUftrrm+INTJ`8v3U+>%)zVaL#lv=tCDzQ0U5a-mQn;9Hgu|92aT*%2733Jp&%b7er1pCmzeia5D7FM2h&qO% zSw3&D%D}cU!I0S%B zH}Ff@_2zd)?HXlCzu%2Xl*msjy;EPRaNcCe#+g9rLSxpS>;u z;%no-OtY}Cxa0Rk^dv0IXKbLHAv{jX+}0vG;ywVEky~FG^61Wx(W;-nSZ#8mbzgtK zl2GBbMJ7)+Jb>%@1_;GnetuQL`*r6_-HpIu_uwi?8Y?|Ix)k6=jVT_;t0%+V>)=#U zScBNa)lSH$oN51^JZx!dbgc!KCl^#l>3JMtVG#&%Yj|3GVN8k5M3Nwq>Di-=%_fPC zs+CANn!qAHtCs@Jw@EXL`BxOHYx}*_NwKkY24tv^&_!DD8m(KMLgqdZ$+DQYXHFcq z7y~!CSQoY%&re}TSqVk2EKO{EtFhWlu&WRv;yljG$M&uF@h1`Ty7+4P>i8xZ>>^|0r-%;CXhL@sot5rRE zT!8pSTYQH+qc0s(tdJ)co5YH>dAj8hi$-$Gg0-B9fnw38i$pnls#Ipw^skVq-svTS zbN#Fiq7HnH`Uv&N8$D@kP^O$m^kgCFZ$Cy)t;skj&t!`8aJ#3o(qzbJD62KtZ#?pB zXm=z%559R$osa8!tbBOJ4EoVZWv@&^>1R)6Jw0V^$0!i*MzjTlie2(Pk`tub(`}l! zDVLb1$0*oMq3%9@TJnyX5BG#iCy_oRq^4&*fZxgr1{#%MbFGC}ixRrkNz-O;K(Y-7UXMO{bN4HQMj&OLv1eG%Gc&6aZ2mDpL(ntq7?5a^r8z`X z-xeQQcR9X38Qp1Lg}mqJ61x~-^rcv)p(w%H(Z&5dr_u@aaZ+~0L}(J5f{)R}F*qd! z-`#%G5Uf9orU>8YDYQtMhOnNa@=rZ&w8ohT+3Gq**;veVgYU8)#jmaL>-2vx6OOSE z=PQD>VY0H#TIAmAsB$}@I>c=dNK$eSXZB;SQlAPC=xD4WTd9`-DF>UW(E_peRIg4G za5sMecwd-JsxY6%RCf)5ol=8|zM=LxX(@MEHR%U`(R&&7h>r<|go7EwQD?WE^irDP zK%iTMImU+jlFaD2(A7OCtBG1Q)TyGH=IU6Wy$EA5iE=n6I4{#vMSbfSnMOY{iEz&) zKUp_RIbs67TYXhb^t_oMG-H5CzMG<80RRiyZ&HEmK=T5Ch{*k&2&Ms_Y$w;@v~=xed>yh} zQ65lb6A9<+wjAePB3E!cL>wJANN;f=5{^D6;8HYidsP-z3zKcVBbpuq*7U7d!g~DB z*{6eg7Jx)B6`IT3PyD#)7IFMRasCT<*rxDw;@V<SD9$D}{?5_3 zj}kUi=oXt5rXX_i7i??_hxDyLQQG7FLesZ;Mgg#Okr(C`pI0}Zv?uTQ%{`BJ4{cFS zwBL*}4f5BA!(l+yYeXWbQ>Y4K9R1zz8|d!4MJ{$&r13COn54uFxngpp zUVzrvlNN_}d;0*MQNo6-qQoaws=2zdfgMJ|^(0iSCx;ha+3oU?%Bq_zQS`-i7 zA$`&<-hE!uVa`T|V*64crYNB{+6am67e>@vQU*lt?h=tz4Hd*0`H{jZdy}B8+fcTZ0FAS!G!>f<9}5jj0qDjm%!IAKtJmV{I$_hn z#+^b>+I*qGu2e%n5I11_5)Me!0Cm30PY?s`+?KEo%c_ftDn7ZN1VKs`1#3tcWI z-yXv%uAKe#N8WDgBJvJG9H-jLjmj)7Wi>n7sxUV7AbSxL zS2CDF27-W<3Rm;`2u>DUMjw-2_k5VN>wa~%^>LBr(0iq?4BeB$xD*B5_YD>UC7Um4 zp|gqE*`KZk3Fi5ds?}^bY3@mtp`i(IfhGYK>?bZaoSbfMlqo5`J}bh!aGZ639LWB@ z4j~V>NbH+Y;`RXmj^@KyTt*Unnz8bms2z9F1neM#s zfELx>1U@!pFk~;P&*Sb#Y9?&9&sk%j%u`ea#wXL#fO#Kz?@;OsE{N4X)T<876Q5=#51r^ z?0L%2(6G9w+5@3+%sfI3g{f$@+^mGiHVkP?%z1U}x@>XT@0ES#Rjf^)#|)Jbd{S{0 z*d1-G@1yKM54Bd#FPACx2&NV2ppv&& z>vX<{4mH?z-8YzcF!n3}kDcLn;x~T(#GF5~RQ6NyoO3%23Nw%?A}FAcnF!4dHMk9} zf;t(;9T;xql(sXvB>!zN7l4pH7z}0!zM))g2WyAwZ>V_`%7E3Tz%cL`)85}YxmEgP z@m}GS)DGO>_N$KeW_F71T&IZ<%;py@-aK^jv;8EccuEu{O3@3Z1=pu~Zx>P2(=1lZ z$H7j>RUM1sduF@A--cYLySd@$_Rd>*<~23wWR}y} zx)1I2dy9r=l@{ZrU4}Z35@?<*T{S&btQHmxqSb;Z(8x@Vuu{;O7fl!8F>TnZyUTb| zk6-VVedvI1twS*#9gUk_<}|AVcaG#1r1_DVA3J$OfbZ>!rKtRB+){3M zM+@|o;rfsAMxdT_QG;_{o~M~1K(UHSPYEF_IGBC~if6UBg9uiLJ7%RG5!8&(BVRre zhZ@rQ%3#2&@~gA#%9#{H{d?`s--{;_^}*+?xM{_OjcQDJQYXI+IS?s-r#IB?#ePww5qfF%}joppT7@e2b^CG@>91^J1u9)6BmqE%3 z)=U7ZNms+)I{9_5?M+!)jp;Qu{b~HF>7JLgZhjO<5ovARldocH+0Fu-HN!mj$5i3F zakf?yAYoLR@?y$Cbka_<|)$>m5ec> zzOpH!_|iis=0@61i_!^{7)^Vhvw}jiDD5|oe9n3!w2IAS;=@}-%_;0K1 zl&|fH$d$l0-Ew21Yn50$;T_7nq16|kSDd@dWFRJ@GWVl^H{8*viWpkp%AFs?`}@o5 zJYKu^sRCNJ=LF3Vj=Tv&$OLr?vaMv`^2DayAp-?HbXZ16^N^APe2V{bUG*OYql%-t zbDoV5RUNVZmBEEo$U_fb;Nja8qhV8nFx_Y!b&a&KWg{$#$9LlnYh&L=zH`LR5Yr$7 zq#XRzM0(5H?yR)VKdx_D**r3{x)fk9m|Q?G;R}1;RrNSZlLnz@QoBSV( ziO0eRo;LOpFWY4ocqFU~aFV==9hjL1z}j*oBhF=Z5_a1&Pg1@DpPM}GUvrKQVdE|)0!&bdqua(R*vIQJ3aV8w$L+Zw~_{}(zX}EgG z9firK;Uhu$f8g11XHphYM{F2!48@z^sJ)?4p&Uld@Z{NvB@!o^;4$qT-766U2hN^% zyXqAK73<<90dwi$7Jrx!4}0c81b^FUar4I*@vet)ksJfn0(r_#5;`MPRJO36(iR=@ z$85D`jYB~451li82Cf8tknr%D??Douc_(%LTaK~<_V5%9o>asu|6`K9V%a#buB?g)RC1d?qOR7d zxOLTXb5E?>YZ-RlRNrGkvE&XLc^Q1eL#o$WDx?NXy>+tWW`F~zE8B~7GEYR&lf|QF zRpOy)K^)en|6f!r&{z?D6_l z#k(T4>SecDs(Q7^Yt<=M%9N_Z-v@Q`2U|o^tcuv{lXz-HliZf-p)oskl+u*R>joxZejPof)0!hmIJ!fZw!`9Njw}l;EBvGL>!Uc( zf*Pi!`|aDh2IKyRe_S2b-Un7zW(WhIBD6!^K4nUys;h)hF+~Hf#`XU?57NEzDL%Bq z{Rh*OzVkoqDYZZTNkoe~0xJ$@V^euBl!$-&=R@cL@5#UBTdC@{$F?2nDG zp=UhyKjLG&QM2ypp7mm2-pW~{BC;8Jl{{la$BR^f=Hr4hOIno$>K)>sP#(pyydOgF zV?t^c?62RXvu_)maSpamDKt0`C(hM{mmS}Z1C)cIDVd=8X$53)&By6;4f4vT{=`U` z!?{n@H*3TR*z&E^u~%YS*Yr+d6-~9hVdj7fk;|}&r~E)q%bamNN2E*=i}rwJ!yj35 zo+o>$t#VFvL1LlNBQW_zg-y0K3g)I34Uugc6#@91%$rM|EE`Z(b@Olxc9=j<2Nh^6 zjbvl{nXs1N2Nl8F$s~-^ep!~Q zl8V1~)?z)GL)S%z8vB)@;$HoYW!)5b5>*KzMXwc&!9IFDFj%zR1pact`z^vk6378c zkT7a9iJj+ZFWRnSR4LHRkadS~zKC%isd)b6dhE|hR;cxfLwGX{Yck3Pp zGlj==wZs;Z4VSG@75?TrXgv<}oIuuqA{gZcw>tUq?V}eAYpeNsES)+ndYvhGJ_+Ce&SzF(~O;A8%w_QGbUWfSK-G1y@s?jFn(A9z z==;I*8>z@wulrkFW7_CIqMV^gEUdq(wZwcXHkvOE6MiMbJOfBvl0pm8)Q}QNrFUv8 zAm+WVx#6DWX8|5w)qzFWd}Uszfnb8^Rz_h|&5%<{gN#u+PThvtR}#)0x_7kBAgc)f z4h4)rnTohYeon71rX-s~;%~+_Xg>cRy=QuG_&JO1`@Lv_9 zt=Pb+;lV&CQ#lpm6UO1hL8&uy&3<0ixS&2#)|Vq@rQfT=*{Q)<5hk@|pTn>8umllU z5Uv6r9$lK{`qoYB2Zu01R*PufvJ;rOR6!^Z*MN>q?fxKcK9`liR#ujX2GHhN6_=r~7?Bu}MDLgdCfC;2A#ko5RS z)+`FF{8r?Q6+`^9eE-k*i;2G_`)@fK)M{{m$hy`h-jFT{HSZISzX{gzVP$_XYi+vlJ zNl)mn%eHel{c%~x;AE+m&}nsCprVH1M8u-vYsd;7GLY*`yo}tm_{t!*#oSf7a&E}G zQfbsXboHCqNo9DmvR)2Y#l!ks#M3BXG%~{KvQzA=!PSv7NHlv%377ozK#Lbi+^-nz zKHk8Z89lezy6&&tzf{IyhF7)ndb%1aZC#MIb$4wytDHzrVzJMF{jK~|d zIH!3w(N0}ADC%$HB8HoZ1<}#%Rm6t!;fNZnp9EdU+`dgf*jfDjZk38B8s&dCOU=2s zCxFFYKIgU*bG0dIFhC&3P%k&^w7^$}5{u{;kNx1DFNa-QVH@m&Krmrjt*|e%+)#oI zCyh_?;NnXsk`#&B0#PedFRO`5CEj{4;!6^cU zAOnuaVoOW!$hTJ%pdF@e_fzuWM&zV!HJFCmM7QoUouBJ7Axx~c0$T%S>-P#Ggu^V) zBR#8P*`Y9q8CfhNSBnmLG*F~nr&iCC7XtDeDngC-O;6-3X3JqnT+1!pPhz{Yl!5%| z#bKwNgse56G{ZS?^8RiOM}y3HN4@X8{LQ+C5AY?Af>Jv^Cwao!0ys-@2}`q*9Z9F{ zW`xF8KZu;S3pwn^oIj7QGP45WyJ{s;2w3f4os-*I`~%{VbNOJHg@>9E+QlW3;&0iEPEZ$v8BAXR}kOZ)iXyMh@}Mf8^$h} z8oAKmnCs%~q7xWl(xOvoc6Rp|frMQ>$}~+xun#V+m@*~C7-S^lySv{*7nf1IQJSl( zJk&D4)L4aDJ&QqZHQthj9_R($f%p)UR_M3dXr;~V-tKvpQ=bMmyebG5*S!KCEb83o z6JtO8uFjMG2<38OC zc7ynf@L_NJc$lu;o2_s5#hon1E-zq%=IowQUsF4>y>rFrv6*uZ=jWPgJYKG=2U>bC zNFeOAV6eQRu6W!-*BtU21l%<|=1R%y8_vZ$AcqX>;Bhv+4hn%OT}wdCG(?fjhC2`5 zvue9iPIRNoWZ!=nn6QGo@NH9J;xqZmesQ^Ad=bokp$lz7&be$F(pB{izZ3d)<^Qnv z9$-ynYri;SZ|E?HNY~ILG%2BjIud#@gb)dBq!X&4H&I6sLK86bBB6zZBvL{z(wl&k z(2Mk5r6YJV&dmAFJ!S6s&U60%d%x$IJP%|iYweY_-}Uab*LutEXF9u!z?Xt+yXf$izY0EoD^835hL%FARrT@WR?}CynnfC` za|zXizNg$YWJeAy)iX?D9&lbGW(8)hYL7~LfC?rmI7UH6FU`)Eku5AO;&#&GrfVtC zTR4>!$1Cwr{~n+4GM~s$)CZ$1S=5TK`&YUbz*n%*ts$(To?WIRPt=`PZo5ipFfT8v z{^0$qS3g1t#a@6AqgY7L$Y&M}q)q3W>Co&1$4wLYx9+@)vx}pJZgBdf(44S@=6>lw zLL_r^#B|k3&S1m>f$ZV!$k3bX7D9%}cj=EOP&{M9Cx=E=|A1UZMwo^t8j=b?}nfoS=PE9Q|G;!8CRQW?;YD}4@K5vzcrUc7) zI*hSQc^zvJF0-*=!}aiD!|jS!940cowJs^UeP8Z`wmqA?J$XAM$v1n;?|wdK-26_o zZ89iZ1<{tgNHM(neNpmImlepkvKs&z0Bh}G{MdEz^ROacrC@|GH6gJd~=u``IZG!xAM@#u+6u{U#XR=XND_K@=yb+%Jtp;{fEU0wH8x;QnCZd%N| z8?gvx&zDP4MoMGgFz+j;c^yE6!m$w?{>VQ&JoW`cqR78w+|$9=2hOnGJAuXLUsYC~ zYDr-+bJERM*VN^vcHd)6s=&_za8|tX?BP}l!YC9_jNw5+y4dCACZ*ujF!VmlC|2M7*h%`(3{)GPX(Y5&e}9HwP!1_vTNT9I(AM(7-)nv^J+gVO zu?dI*Vnwdpe>It|dA_GZgx|j?F{0I!j}$uh#wxV80&c#ft$kG*v6v+%)vqr&X%T%9 zhb}>7|13LOvobnHE}3Tc3bX6)P1Y*!@9qf`;y(8%{iyp&f%CNA*<+quJ@Jjx+j+ei zdR?nzT(B1yPcjw_xwXB!$#yQ7#+P{iv_A)^HVT252jH?WAhWAss-TuheW(&df=yfg zQ5%c$Ojni<)H&NqxUy(~H(ah&rMHL&rfdN{pA&Im2~e)oD<%4l7n{}pHnQ#EpdqhY zVymi%dmI%Ba52@<`bx+6vB#D(3_2=6Vn9rd<)jb(IH%a*;5b#oO28)(J}Jrp0FPvD z+6B#)%&*li+S!Q7L5w^P*WZ2~vJeD>_mE+(*?lF-y@)e{n5CxDX!c0*OaG>{@8amb z%euBU@@O|;Q5`T`{rDA)O+M%5+MpQM1gxoi$fi?7%R52xT@%e5CfmxLU>|VJ@?}6r zSyks1v5uBhlTohT6^%h4=fFg`x)o|7Hw-@~>mQV)zjgUzJGX<8POnZ*C;_rT=u$wA zIy&zttS!11lr~E3E7dA7tRHh-Z$fycvXFbcyo-OF1{>gI6;ny;p+{{M(WAujl^ol;Lk%IrV2Ff6C-fJ^AzAQGWa9 zRPg8Y_zxZ#toBY(O1(d}n=Y|e*SByZb_nng7{i@`2B&0s$R$LDyLUivWXLClBL$o5 zt&_zmhqT-V*rL|_{9HC>vtJFLe4IDA?Qp<8Yiw@84@pc`&r#IW$GB9eDjbUUR&;g>8m`5HG zqtN`0KsWSQTr!xMCGDYPtj*%w}4)|?uZvmn57 zN%CspR%Dr+mxW3mX{}@fW=10;RCr~@x>I8r9>zq2EeGHOTE}GPYWAfWahh8+E;!#FT`#Zlq*E9S{SGaD_nf%X&^gk10 z^xNu-m+3)>14=GXNW>-16a{IJD|=}FNY1;VzC1nBPeB(tu+uWES!Y8eN2oc&@K=aaE1tMWxSD^+`-#V!_Rgdkh!0C-DRfY?3e~ zGikl&SzA~lx*1$i;m@T`uAdXj7Nq^(?2he^vMtT{lo{FnfId&zkJ0M)p$7eB2~3eJHLd92aCZqENT_jJmCQ_1 zpBSo+w3fU2n6yS(MfHuRZ&R4^z>*?i;gh63@Ta5-v=0+yC@TzLCAs3d-d7GQZQT@c zv7%17ZOw9%TjtltFZA~}qQ2ZwBu=`IZjW|Ig&%ax@#_x~(o)oRE~CU+M=kYf01Bm- zu_*`}ZX5Hw)_7%@&Mn&}_@$kuTQLfI{w6XN8*vfQm24Pl?;y-<#jx!wogUkyt<{CE zbWeW8Y@M~ONxV&Ga`%tLz$LewmI04j-7#V8k~Pn&7^SYcTZZ;)JiMOV(^bWEtaQcs z9BEl&Cc9r-x_hh4b9mf=8E&@xxPbbVE|xuoedFZ9A}$#7>6uIx^!2{>qA>rfcYQHk z3;A8W)H+Rt$FRE23S0))_`!*_U zH<_zjP_c@*zz*9k?8*Snd6o^4UE@>F6hMccDg|8;%VKr3?~)7A_cZ8rSiR!QBB`w^ zu4o`gHEEKmgI@>3jBieCeWlBHZ%q6VTVlA(+bs4<_xA}uB8tKmX|M}rh8T>c(AY3mCtp91uT(-@3diR<2H?=!?PZw{? zi+@g5#!ch0ET(-k;qpNAj5>R8l4vl)l{cw~<(8ugAH0+E~@2M|3_9{vNcD`Ka zgOk0<=Z_{FLD&STr3ZEFQ0d4H*Sv@;q3;j18M&1MuMbPyCZbA5*i*Q^(%B+@jDqQd zPn{KPY*XT!3DgBC*QoPyYtU?IA}p<7d{uWgha_C{|CA;1_2jf8kZpzm`UuAE2?bhK?B z--*?X=}+>gbTS)69%(yjXORoc2AfZXNp>gdM0-g01P{dVU z(ZKoyob!jKybqA#cST`&*GJ(4b|ceGz_K$0jQ=9Oy1pn?S@>caMotubVt54#ElV|s zrgvqXrUhv+Nv!DWxhJ&g+IFGYm?UQ1c{$kKAXQ+nPhKbur3nkLIX~IxN9QL2mJDPQ z{USZ@2OY8#1xc$XI%j4Ok#fu*_D#e3TY-QX(Weq~3 zOLW+iN+;c-^Zc`lhT-Z@N=?c33L@F+Bqm|k3Hwq5Nee_@`LUz%p2SQ2lN}!LKsh4M zvf8V3?b_+RGnM@A;L^lQw}L3xa9*H_BSp;!2x}b5H+J z@&5h7zh`^@D3to(qltSLQo(}t+bzC1H8M|nW8@gaiqxPa^MzT$k*c{#mafqer4Kfr zaA(J4y-^YKJ<44E!fiy)2|)EGgc~k>e$~6BH!AGAgowU>CjI(${Aw5zE@2R9-voHv z0T1+jGpUg`l4InWZTV3c%6_Dc$m)^eg?&QLSf0bBaGq`N*Is_Y3=0rR-BvEEIB5YDvX*w4EFoT*pHpR@w8nCpzS>5&6=F8LJmQ|;N3Ht{x3*=?;c)oN5d#PtPC zZyqeq9IxKR!spV22Oyi{CdULOQ7IXlLjvg-DRi85j{nJPtk-c-a@Vi%sS}Pp0r;z0+@vJ(^Ya}Z}xQgCz7={?{b8(amYXG0@3?!S&s zm;CwlpECK+D+Iu3W&I;}_gSjE8Ov~Qi!^_TNn6Ax%|Dp_RETSaYdnzz-#*{>LBH1f zu9^K0PWZQq*o&)ly=(q@6?Io!+`YLanL5lbD>rRCVTps+<3HcS z-3iD%w5IW8Y`XQ(_^aIh!e1pw3kjJts-{XG7(Zm%4cHJKUram_Ir0AA>ewHi^lcZR z&TX)pyZh{Wy0eX`xJ5_?BCy4|LQW+Rc;ID#oKcSbZ*CfHN&OOcr z^x6592@}Hcoo~w^!)uI6DbK62WV%_#sI@3X<533@P(sQGV=EC z2N@qFY;4Fkd=V;V7}yFN&Stf9t$K(QE-XgB$jNqHw415r-#3n=ks?h^HWgOgK|g^W zHuztSj}Q7%ZC6d;w+a)h=voL2wRH+@#=y0QUT9?)Q;IBface-p$4py)s#Hx~d zN6Aq?tBbg5p6be7A-FkNDf=`>^eLM^a!2J5!e!PuUGr0Z9u*lS(r&oMy`GYY@@m z-c=47i;1cHVa;GsPQ#Fm&B}K;*$UR*tE>z*CRC3flbr#4d`FLiGVo6#T{dc8x1EltJACok9&|#%zC+0OADrE~B?cohR)Yp1U zOR{DjsK|U=+Bir4e8+O8aAj&|+gGW@KXR$i{$6G|WPtF9h^TDm&Q$>@uUKlkEBh>g zpwTdRZ1~0U@RXim{BqGC(UWD(Q)X1iWA6vv$Xw)OUyNy}%3gWyp{#Dg=pl!l3H%X0 zk;fqgONmt`VAFDQEoRX1oali*6GvLKze{+n&6_P|P0mPC@_bc7kL|W{cosG)Fu%XD zCu8FXPHEi=Yp%MgY9-_Q*mgaYs~BG(F}fB2CVE;O(u+K=)<{%GrJz}pyR*&>at)^fO7% zds{WKiD0QhJ&_&(0;Lsep9PbcXw+0z?l|759`zoQ+O2%j={@k3PDgmiS=~&yEG0h% zaUoVuzlWMfjFM$*4Z+XoSSc`D6K_-w`rfdmKb^7$S5@~WIVu`ICcxN7GqfjiL+~Z2 zO|Q1gHD$8?U5DXuEl&!y?{Rd@@w!W-D*RwC)>?vGo<^ld*L~W_F&Ru%m5e#c9%6c& zH-7|k^Px3+QD@L)%3GrDGn5-X1|Ygs#>OHSUjY9=>Chghv@0L!>kPt8aS&iJVVa3 zNNvd~rp_}b5FIH9!cHa@DQH?MznXgECDDZ9?zO8@9W(+SSu^Y87c!0OGZ- z=5SK%eyn45IzK2VE`sGq(CYE{t=R?0;o4fwN{&3Qp~zJqc@Pl;i!zJnp8sSn7NH;U z^EPE92puvqr2voSvyVxI7Tf67I_2QbB`cjY5%-;jvr0i$P^yQew4yZ#QWVOdQ-x_c#a! z8c>8+!!vWW`%L^~d6YewYDGXWC@{&zr+?vtnDH$~L3?t-K2(K5xX)S};oxn6#S^+J zyD2U~_$mcX{`_k%3``H1+MK(z8M5=?&Kt0uynJY5{-OvI?1M+A%tm>ng5PDgaTTCj zWnr|**5z4@%L8r!JZ@D#ueawzxQ`&`NU9ILtJ~&}JCAg`~ zRAe{DM+fGr7XFm(#nV4rEBsO6-|r#69Em!z3c8g&5HCBGfsRp?&1-?e+2z5=i6Pt! z*jV(m8O!}>rC2d?m*e?9r06cd+s7rZow6AHDQI<5m&|+o($4RE00(& z{$*8%EwjE$H;?-!s}lukq6~(%h7chMoqg-@lcf?1v9hjseDY#?H0SC2XX1dx5$*&vWO$r3@%VXB=TD^#+9*dPL|n7CK-VlUeoc*iKAw&3+QWo}Kt7nee{j<| z#x1D&r*0KZUY;xAd>~SvTVADa?yiWvF}?}#2u4!Y@2tMY{QGKCq3_xJOm`1RA=Z}o zK$xRS&_Te-6;qIx6yYNq*1IDHiY)bXD-{uS6Y&Q#?zR>!QKd`md+1k9THas$2;a#Y zizF=+PjKXVX4scG?%jQNI>4S|fps&c^`b}X9s*1Eu2+}&C`+C6lswvKG47jkk5cQn(WjtTlQXz^)E5a6jdAh@k zpVRD$w!-69{sg;)FLz!}xUW;&f~eC;<{O_=uRIYgK2c2x-wN~8u0FS7QORx6<6P_N z9rB;Oh(BBV7j)#5kA_vY>MYiql6Nc^`FOSV=8bizQ;{)Lk7 ze%bdW{jvr0y7tqz`gfGt=(!#2u?Nf)*PcV72MBs+Z@>9$Mu{zT^>bPR7u1#l>%Yei z>QeluO2)4oSkWAKr@?~hRBvw|pCMl>Uj3put;K!rUW*JQKuiMDs2~{18KRkc4KE-_ z0#PYqy~ce0+Vl#S>=SlMS+`xOURZlYZw0XDvJ~c^*!|c<9dy8-1?$L0By*PEd8ErB z>7DI)Myw2%dT>b9w8~W2h>?Xyq-w|(c`b$9(72EcZzc_vvnX${(cqVU7``)z7S=AR zcDCpn;=eMA_m)9%oyL8n7r{MOGw&i`Tex9i;Aar=3P$uM8`D=hrpvkm!`!Y-#lptE z(#Y^aet5P%Xz11M!8dzZwaW94G>p7o4QBH*S(bE{(NBMq>S_P+FPfeQS+wGi6IE-+ zyyZvGfXw#~e=GhEzA^k_0BGSsj%}x`1L)|UJ+4F$qj)?8Y2-ubQAb+% z$sWw(rov{B0N^88rmLBx>IV<(6o;^Al?+jekwtJ`Yb26;kq;>ggSfLMG~-K*Z!-6E zc3Ua-%q)F>;H9Lhn#l~J5G{+ZBOhgw$j^Pe2n^9>QaZ%24OydL7*UHG#!7P*cX$c+ zdbY5+mg|`~k+L)06_q!PbC8G}Z8n%hVOV>;u66z+xFN?&*v7RuK_B1N;27RuqILPq zlXR$z)*_+Qza1LpQw_2i=ZE}2OAE%kS{kwzxcGdfi`n>HB)~C9#}b zDp((;ZKVxvicmTsk2OfnN*NMJp`5?e#pCP>TdCX555k4)r-jEL@Cmjy7Is}xd1Pg{ z{4I3+)cXbYgk7(y8X96)EqX<7ubi{Dg*`lMr3gq_@xW6&{BTt#_>jUfO_KGBe1Z!4 zmHh6P3<5T3Z=4zv8C{uGABX)rFu5tVlQ{&3(CD8U%t>${4n3oc1g^JL@F!H*jn>BW z^W+)W>)+FcL0HAlbpaFE%ks)aQC3V0sDU2Aq#4F@1>>e)AYtv^N8@@8Ht5)l)$|up zwsUCNZXxwIU~}>%K0p3;u8eJFwv~7e_i*-cjuQ`*iK`Q8JO;8b8NBT6V_7YrMKpgG z7azr+)z|C@ARV&X&A+OP*d3ow`A^*esIh&;xo^v~({bP0ywce{)RR$M4wmZ~TBW>s z2P70dZZ0cb$MXXMPGq0uvp1pP-#Qf%dbW=w7iEviy2-lzTRphXUb64={;EXKX?K`1 z!>vha#OLMV32Z`W8UTNnti+07z-xo|vI6o8? z#lnao(ZU?S;8q}(_QDG=Y7)0GTawO2%gHcxLwcwM#$}Kpd^Iuk1Oet!b-KpLx^Ogy z#mm=-NmzRpkI3OsmkL%Z=TqfmJWs+$V#!x)@te<_ZM#`7R(3Dk`*DFMW)uLH-*#z0 zZKlJ&&>+T)Q9vLH8~w=Fv=g&P7`1|V zmBN)22F--GMe!NF&P*GWZEb2;?#~8FGb8a~@MQff$``_W`wr^d4$GXQe)>H$X|;wexskirDx%> z>7LzJm4x~F1Y4lenSw%**+A?beBf>dwxkDAqnnrI17@@68^+t551rDlqSMO+`2etb z-4g+OOY7{byO+5}bG%RiPSxL`=(0vvSvpoUQ;W@>wrOfVq`Yf`unSq*u5N;9JmnUP zX*5v9|Iq6nSo&|f!Sk3e%+8H@Mpt;qx@0wvi*6x=?cX)f2M+5E&JS(F8~X?_*3Nyn zY@dWhg!pI4zDf^&kIzXfEZf5!{@e0^9-6o9h-|0(DfPQS-v(|52@chY4wAA z*gMmeYEm(0>B{61jwI*lmbMQnMcw&I*C>4P3*#q=5z#Fl_&~V^vaj7aJqlA6nJa`O z`M&Jyzyn3ylozzXgU*2;vw!zp&c66~e5AdTOY>b0B#V5$LFe&*bUQThY^Y2-L^U>v z0%V)fS@$O@-$-6mCnH=HYX^0ryEP(t^c;sq!&!rHI6OKDVp6A2C6N`wkkkj&)tvCV z7Qsf8^Et@NX7aofGx})v#v^RldRNU=QeR{wg=9Pj3~tbBl1>(b-lecVm1_EgfX=@7f)-6W7jY$|( zJ$-+B7JW@@t;0PjOc^#OW4Aby;%y<*s~QkOo$}(i%oW(x*V7le*&*F1H`PP>yd9)L z$1(OVc<%p!i|Jpwl>b(xzk7nyU-viRx4o9?X)+aU1`qV}-u1eIqk)XO0zS?JgR&4( zLXM57W$=rpSK(LUSoV8V-?XPWRVspebVUWqV$GT#5HSj~mf&l>eGlo&IMa$U)$C(sz-bhY2! z3gmyWPXigq6IqHN!oVBY4e$;ZZ)UaO^6tT_PWN)%k~Ogh_YV~jv$gwXx!b;ptQjTx zb+D3E*9O<<1=fpKzn>2yzKL#!T=)?kt$i`gmkNU!=b`|`f+-h*pYo466~_1oFIIsq z5zE22K0?xNX>%Wi7Ak*mx!h&E)rRRUG~ z%O)*C@h!nU1&=RQb11%WF=<1>RDCwvPe{2nLyQMi>OzIJB?XaSoxwkJ@192XLIedL z_6bAXjoyK&t0ohj-;3TeD>wG%=Gtu8pdXrAxc-$cMmLCN2wLsuQfvB>?|0v$)B^c0pAY3fC1XK|K@?=mtZ=Ns%_a`yj4!7$ zhZpJ?YU^-p^gpRGf8=ijB(HA zneC7f8gyspXU4&Iv^Xxm4TX*?;nYc)FcbEz?CZ52@e8qS&T!+cDRzrniIgD0-QQH@ z=I^SuxP-inOrsPY(`h~ShsZXo^MRqs^#DT-G|52ZU<$q-ld zl}_pPQcm`DnD)?nh6MmFjH{wo%5MtJuxN4A``X9p?mwOM|1X)UB)QL)bsurQ(h~NO zPu0z>pT5!= z33Iuv1>px&r-wgCG3-ly=D35~R0VeVGFSJtsgBA|Dss@La9msV_A6FeQ#XUa<*mU# zmp1L$g#u}7o=E-m!*dmh-r?W}=Uleigc?9tAzQJ2rKSIw$={0X!zu?ZWb~`&T+={}HA zCEeYY9Zp>nZKa1YWOa%dZAoDKwDwe&(N=+l;k^(>4OX|8_HfeB#NN-Ig^O zS!chLb)om)s@fuN)U*sgY|75=sA!ivS@o_@EbGE8Lnp3`^c!@xw6!Pqh+vLzF9GV36PS?9-YAq` z$=d6h6o$0&b3y@pVdqa{GNX0UZSxBYTh!Uc>g*0yZlnP)1-9DK0aG zq}doy008RdXJOW~?n=9HY?Kr=J-oKN$L#ukCKyJ`mw`aKnpy&7VbJ>CRp|Uqj6weB zNvHf8VU+YC{C$H3`x+Y!I*@Vinb4$ak(4ZrQkw=P*nyg0V64sNp}&zHHSwsV>-~{B zQeZkbd_yn+mm0^A%c^bDeL7N@iHI{0i^3yi(RtN!Q6To<+$JQ6JsvsXf>--1O}dvJ z+1EEN;KX!oG0{@LuQ$_80y)tw+YVD%#Luwhgl>uypK#n{%ctrI!FuUmA`=Vjabt7R zrJlfyoD|EGT_@5#s}D5#_uNtyoM`mE>WHs&m!s!smV~geuXGE7W)t0h8|C9iy!Kz@ zbW>Vi>o%ya%h>;9^!(4Z z|CGu9rYFJ9;Z>3W4oEv2SYuXga+gI@QY9^-%KQ)P`F}H)aRPS-B~%@JOjOf7y@5F* z?oMIv(kDL9067s&_E$?|f^sW|#MtLHOhj4MT3Y8tZutDZL-Z>4DWM^Q?u&q0j z+?^;ytc5d>KNv(KZ#Df&_nHK43+?oC-uE47@{YJOKDP3_D`Z9_$}opiG(V>SjNy4* zWsq*5LgtPX#|N*~#*`@Cw5vueC;xoNmA|}1NQRd;od)F{MD;2%!B~j7y()Wf5iP96 zfXc_=uv!zTueWIvoUAW-5%$tZl>q+i`TN77t| zV#Kl!7}f3D+ufs-=4r^+hc=j5(SPEbEqc|sv^5wXcfV#wuG?F#nMmnMLBIhHOcFa$x0Fv69w9 zMqrTFbzhaUh6hn^%QCCD?fE@+R?ocdme~i=Q^1GRdeW{KC*#hx)Xe$;$rK~ERB@Sv!*H6fUg{jB39k_W7s&HzD$wN9~2CS_{%AJ$3A=WpkU zz*e*0^9om&bM&|(}N^b*9Rm4CRYfKq{fol)D)B`JRF=e}3SFn1vQMr^= zOhKpeVsZWAz`$IoxkbUqCIHVT9^4eDo3_JNnZM>xDYgaIboU3k{aIf2f-Vs-(s1Fl^Qkg&AJtg$VONW28^zTh+%C{|AkTYp3KW5#j-1{QC zD3EVC;W`^ygpUd5R?VOJN_Q(UWVpQ5Z){4{O~C2u0|OXr@xBCP#nN&0T@?u0|IxNG z<>$+ev>?L@_qkQ7?B30}Lbw+3O<$`VD>dr;O>E2Va$POnpi~Cv z8}WKCm9fc!AhV=3^|IZd%PfGpHFDzmFAV9JOlGw!F9OL{ykHTLq#mi-jzm9}MeD(w11z+ik_ z>C#j|-CpiuC&TfwvbLv}Q@rZo%$=d)&-Z=8nA3IF-q5n5#@p%VrPq&m=ceiCflukq z8d_KqshBVtx84BCN<8F^nGX=~mG0!bZ!-R?W#+rTiW)xs^j{r;f4Sb@Y)&rV{ke*v zV_D_Ot#8QjAj?Rqt1SDN3^LD*fR8ukyB%-*Qy3h34M+eOP8U;(h&HlzH!&M3+bDdw zVJ^y^M)*$S4-$R4bXDO)!r64a!5l{@VwkroN;x4xfG={mJUY?>=3yAY2>X6E@m`@% z45% z(y9cegLGkf*%KT5D4}J@tFK3>MSj7+jwu8Xka%I$?8Ej?I)}|++F*L&$~O-jjdU6v zhT~I6DpMQ>q~eVZ4Wnx>285V44GiaJGH{qBo(?PHf%wIcST*Vs9#dc`N|aNfLRaN% zyh&^M_H$|g`rO)82$feMSW*NQv_E!QA3a)o|(YJR|kxnAd*++KWL3%_rK%rrwn24-$7YydP1zi_T~Q+JQ613zo)!%2gC0X&Jx=gL&Qj z>0j20|5L?(aDyi$w;l$`)o*K2{2QE@WFNHG?GmGxeQs(yr+1ZIC~nZb6!l|&6`Zy= z+w;nKzLMpk0oH%HM!+asU8u__(Q!!Sk218hVBv{yy&h+8Jfn~F{l2MwGvM9AB65a6 zPMUG;8DHQ2N>^bMm}ECU#qeNTPBoLtoS>@5BaDtW4xe1HaWT$jYzO&f?8faS$Dzqi z4BomH_g{5SyqoSuzltT2bI7qu86!knnrR{XQ03UxSvFlVpz7XE*q4uE<`s9;X|eit zzZ%WIdtR2GFs^ZsFgTT+ZR5`qu0l~@&qlBwXdEcxX;{)eR;`ZLrw!JPMY+teDR7;f zRdsE8<1VSGd+IJ(_)!5n}SVv8N)hM|55m(YZ_u?<$<;js}B;kvqJ69t(yb{k0>3ZG%)9R5o0DkdH_!l|o& zH}0RW{(pLT5o#1<#5mgtQF@bTjQ8e?r~iDe`P($f4LNuQ+?VP2g6?WWW?6wpk>VrM z$>R4daI+95nRVqgm;?qXnniN#DpJ=AN5V}KFDxpqlUlkhUOgrz0l(6H0Iz&V7>l9X zC`#rdmJPc3kT8JZ-n)w-FVs(zeoz5HHuB1j+PaOU(PZvWjE^#<_#)I1!&p;LR`$Fs z`GYy0RAWX+_jc?ss#0Rr?DsJ(~+~5EjnP#>IcWcj}|AUX;$ zbz;-=Ea;d`W;a43KKYUxb=X7us<`rN!DP-Z@&0lcj3I8u!zIb}IlvrQ-U+IY2D4(- zxvvvGxkg?tr{0NumGy$PY;R?Ivvg|-BH5n({Ce~`l5eu;OK%1SCiuY1moXExl_)O0 zw?*r~F5|h^wDKx@L+!@2zJ4us4|DqcQYCcX%g0t4A0T=~`x2{wAGTX) zA2neki$#VYcPKkPq0<89cVW#uz7V_Bc3M~)x}vAAr`J=KMQ<2?DSi{#`C90nb|lt(ft*u&e@($FjZO3u)h zfbN9syqt^^x0vRwvI z*=bvL0Er1fOEyjex$1)dTFw^|!N-9sa1&isog<`5BWd{VJPbCE55{k)^7Fq`;Pvw{ z(rPV#1HW*6eyX^WNwQn8TicGug0r!)k7B%S;(-P5p-Pk?YGJ#tvc_`0R47WaeH*2h zf?N3d-j^PwhL8@Gq9|3_pnh)Sd=Oh)7n2KqOG_Yu>i@P3jPe)y0sBCgS0NE$qnbO* z&jCa6<@-W!fkU+a`ntXGjv^VOw!l?4q2ewBs9X-_hvo)**1mKq*ESq3m?BW)wP~$q zrybvRL2Si7BmU;Yxo7Lm)Q4kRCaM&UhFnzkB@yOeJ9GkgY^m~pYq+#7*VMQ;il2b3rJ3$&bhd+bmIRksOImN!Qi{%&>CUogx4wy zT$4yn4>4J73ucjct8fNcE713i7tb0x30voPmvc6O;E8;v-x5@oge7SyQ<*x0E@gX9 zg!t|VSl5M5Q0|<`lGu#fRyiwzq_l>EX%X-G?~&{RnF+ySu(LzbpYMCMvuByDx&6Aa zoC3{z5?<5E<9~ma{#SOX(1pY5y_mIa?c><*e)_%mm-p|;2m!aAV0nQ$4u@j*XVeIX z^%n9w2XEsE!Uz_C0{UKN9oop0X)tM%W~grrd{|%KDcSSr?pcr5f8ENzcl$I>RG>I6h(xTv! zs~zd*LtA7gtKW6wlyf{2Tqvi0`n2C0a(QP3$UxD$2Tw4aO-Chs@a<}yZnZIKc{6hx zu?5I~PPDP=e#y}PWT;Ap*v1y{-a(KJiY%*Kb#01`)O9)K*fYv!Z7n#q_MNE3A{rMJ zUbbx$ASH9 zXPQESBPfMRR+_uQi%jQBch}lGLg#mF@npSBORB)*T#XEe_~VuzZcR~J@pE4k=3W8$ zWUQPuIQu^CV?;-aaUMmlKIA-^sRU;^Ui|c6=eJMye{b@J*@;)bA9E1XJ_F54ogXm2 zPx}Q}TJNaM=as#!Uu*2DQSa&XTfRp3XZ5R5V`)P}T;iFBG27qyUHH4-x%)3SxS)gsth>@;dERdQ@MaMrH z#OH-lVeoRJpBW>roKMuuy}ckDZsgX}riI^|3HOSu#v@8{pp^2KPrR^YB%R*;Ie z71~A2wX3>jWo08|1PtlH7kV8G1Yq-f{kEef4p{j>IIO~pWzkKg3K55o_sq1?XLc|9 zk?`Y;IiP+%Mq1iF*2RaEFX%P(Jf->K*wNlmq!{Dcrk9}3(@sZ!_7<07{oeXP^LV6V z!ZIcz{xcuJqtqfHUseJG*8OgAHZTjQiS59k-VkqL!4grbLkl6Yr(WMh@p)M_! zF0<(gL==Dmy?~Af-^GATgY{u1oZF=;!wTE4NBGhaR)*JT=?Az$_bvwf{1ghC2Yv-t<~00@JOe@WDGmBe|>?1F#;@hj7;1P3Q4&|n5-ZBTWz?X0U5XNTjGYA zKup4c!7pI4|LM{FPpiwRrKaO6E3|OC%K|r|X(Tad&tuEIc{@O4K3G$ysW`Gd441QN z%)wvuQC}lp_r9i3Nb7EGKW$sUbXUQ5OHaB-YnKWfO*N|KMXKcBx1Jyp5(a9;eo!)A zoNI*l+k(OV-1A8C`4Xvwtb}W->i8X=Ry2A}kjhSMx_ti4%tp#?;ZC&*jjUCqBW=jn zEZsIB*5*N287ESZqpB=?%7s)4uY)Thl&NZV24@N&OfrDV#nKLMjp3BwwE~k_M~@D~ z&?0iL-~z$iPb@E}A0W%rTo!LE2#*lGlv4foZ9}BTf@t}d8(sjdCi3k8)aVc>pcePuX^ zoj|}S8~a{@A^2ftE`bw|%kJ~K+E_-oT@7Jl@4GK)+l!>7tbbVbKvl#wz1T_4rW{DU z+V^n3+%t5rK-}W*gMqjnls}Ngilzg8EBNK zQ^0E%K3v3!Mv(k#g?~;22!lZ4wS(-tfTfnvQugUutRP}+-!;0&R4yRo5ZaD?3Fkni9*}g`wVI@-|M)5Pi;Mj8&%b!fPki`R;|w}w ztV^qvRZ6USQWli5b|Gi-@%tS&3LDZkW4aG1un>^tQtMvO8gNx*JfL8vn%a{yU^f-| zl`izd`0#2~p^-hAN$_-0^5^DYjLIfR0a+2`BjC%m!2Z}iQ^?uW#Go}^k!*ggv5Zk- z-otk)BiaPMM8n5X`tZ|dy^+G>CYLcmY);Ng(&|8{YU9=pGW+CETUcMGk)onNqpY7# zTVv1Oor{@u3rqHm-mVQ}pod?^Wh)U03zk{rXCHeTOH8a6E74wMLpEI<^BFTbx2hzS zD1#R@>px2LzmI%+!TIc0DwQE%11ElZAK;yT`;}^L*!-=i|NR>CT^7V=72QXB-g%%CNw#BP zXxsYXwZKisqBSOkYk+rt?DCf=!WT~7R+gr(RNZCuudF^$0p9ul5Bt9;69ty9RHtRG z=NVv*S=p)8v8Q z)p*PW@&_w9@w(*%_f`)uK!U z76k6NwhWog^;=^fkV%`5WzNAR@DlRgqWwHDwp9l6ZMo?C+e!u9x1MUuu^3*PML4AG zLM@5}2re}(1-8~~%t4t5{!RN1oSDpAr1SZY^@{Tqg(tK&h#+xG*?AH0)zlXgTkf0B z8{7%AG@rqeA|JeXJUs~Dm)eT%;Swz{uGF(wZ$vo_3X>t;a=CoOUuOx+eK5+oI50?9 zS2ORUt#NK*ce`HmOKmy<tvUs19g6`=OkD=0G7m zy3sG_`kuEh{t)-(a^~OBo|K!>X5&z_E?u6Eevr$*^ThA>{GAu__uv1Yp8R7rulTJ4 zNqLZsi{uohoG2+_{a5)Og~-6iyRT1~T#QK6Rn&d!Z+f;1F%`gu zGKQXretDuHapQGc+EQbwwsmq9Dk|zM)U-(-dR9(UsoUtiA2f${XyMN2;sV^N7@w|B z*F0beyL5}9omGoWlcGpp`$*3ntqh4;MwSOH;9Rc%ArNh2tTB-x#@%%oKJRqg*x{J* zCCGBP2K)gfcp=TLsU7pV786l`E%3vp^lQo;J#iqT)m9x;R;X>I1etjH>exNlYT{T# z{AzNaBym-_ZRhpkUWhlvD{K1Gj7QXZbvH6#L*@nGCi-AHSE=wJ-O6ip!O;8!OJUq{ zZn%2tE>;B71oWS7;S3!4Ps6hG$8DNC_3wNRIIrqpzQVe7wuZsNi3o$zUF>7KNcF4D zHdip{sqK9ZG`l}2Y5qaRZNSIzrN1bBmXez3*aYq|ip z!G_CPRgrpfL~RVbh|Tp6&(rtrzNq+}yT735)=!v#KkZ+L>WRH@q6ehAixFq4nx`)& zcJ;}b7ypVJmLDR%4|u2kk++OVFZ8o#=mHd>qc}gT_o{(`zyg60#_F%8_V1DN7n=J6 zZ~9<&?0pM$A>>yo_-0f^avCPQ?&_V?e^kf6$^0L%$*yc&Dhi3}YxC@B;_CQ9enPe= zKHE4ITfg!L%2jhxe88W4Vfs_&+J}}l=>Ekt@ptd00}b|$Wc~*}``?IeMdzFnc z&O20e8wkoy=cmWPKW#x>Xk~eV4hhZl!)|@l&`dnO<Sa z1T8xP4O`u2lrR=cu{D@4@fTq1H7vwvxCd|fO41n21-l8_nyzcWgQN7gb!M%aVu`puA`<7?nmiFT z6E?iK8F22j@Yz(;GJ_`9$~Qe4o9%|+o2?`0DJ5iPlgCQ0b8Kw?C?CI-uXSNYZY(yw zITZWq7?n@@m0rIyVcmL=QS2Q!l-N3H$px?cNDM1T^CNXaeXgiJRa@lgML!fr+A7k$xA1&q}oe_S0!sh``QgTEA?x)<6&mDG4b>FaCK&= zOP&JNO+@$bpcL*Db&-r&_JcZ5^ZkChg4w>tIlkI9j$>Wfkl5h`mLk=969ax5=RP-M z`qT=9NU;7qA&mJux8&J+3O@Qc;w7~SY z|HV-Hk1zez8@83yz;^55Ws{4uQ)MgBF(xQDD=(ug!=l6^Dz*0CUy0(#_?-%c?)ns# zX8XyH8p(fHlzc~f>T>?souQ?2iJMhwPPDy?EpiE6?w5cn1jNs9oLHKz+{r3wkdl$1 zcPY6`2oBco?K%Njw&|vGbaxZ&%d)&e7;hPPm{rlOZ-Nrw!%jqJ#brqo*1A`?I#O);z1~Y=AS5K=T2?lcXwNyHXnCTiN(9eoya3PS^>BQ1FnuUWa{^u1k53j6ibY3S_u-ZlK7s zq)&=WY~4z48VXG|6O4Pe$J;5vJjs^c9)-9d!+9(lSa&~3CcU*;Lj6{gfqVxEc4ve> z<~&t5`~xSh#|RN+@U9)Ip)!PyMeW9CT2&wkw6f_QN|SAoYj1sz6;>rJUKe8YH#YLo zKk0-g_}iiOjv6p<_|Sa18);Oyx%sA7Ss{mBCi9F2+R8mn8V4_kc1yIHplHdPq-Aiu z@F_gjV^rOlHaeM69Q`bARMS{hW7K@<$p>B=sD5~58@&mtCZ+Ys1g7qDVQ#T8|7Chp ze$?CWIy)w<4~7Y^9o$ApKq27R5wK|GRO=J`9)|~7Or17Noy+`8%P?i*$2(E(>xD8+ zoMqZh%%j;ZC@c>$w089}f4>T1@p3?n71qPTSTJLLGO5tJrV*lL>a!Z=A#TLKUyxu*P971yl^a?I^(Lt8oS z?=5?5c|s|cLnS;sO4%}2Kb)6gYNC^>G1JX}qz}{7mseJ%$1vJiqb(#sTIE81TMLsa_~rsRTMqmK!W6zW>sId*!FJGt$&K5~x{f3kDB zeLfbKmor9-qJ-f!`YKx^8fAdWYeWu=@YzR=nNW}>G)H0xlY_M`n|O3x7;7{g^+s7Z zn*gRaJfp00Bn{**4Xvs*LKPXb74ArRlHx55tB63hiz=wY4a$g9ud3PRz8Brsd|YllgWZ6Mv@Ri1U>#*uH0LoDz&SAE04Memy->GY?1sW})i}XfsFaIV$Nw$rpqv+%P$W@iM%2Gj- z(aaSS_ss7BRI_{OE-oy8lr3^bISMIlB_xF1oXJ{B1u3~o12Q#+E=E#7#R+DL-KST! zhcuhYe2*pYgSh4~+tx-kXZZk&FN8pp_YNfp1hPLu1(R>xsD^S%M8HnqbE8A@JPEAL zGH2w$K%PkwraGFw64Dig*gUT`TW`-z%tTBE;PRqV^2XIh5F+98`gW@u)^m}j&{h4T z?Qz@vSxFIAw92Xnm(>>7Ahfr<=(b4XVP74--!PBw(dVp@kqR z9@RT)pAKSmgNv|lsh9bFb|LkV5j98KCWPEY^J=ZCz@|yL@Of+7_xKh;D9%DakhM<) zDvgYW3kX~mxT9WQVi47BZxD4R(O#1Kz7?{$*j9?%Db`ZgTwdCC`}yz^Lyw|kv`tRY zkUG~Eoi0~&1BYNv>|SCFt!NGHm3u}2Q~&h%yOr2`AtjwRf$twx&a*$_X;fWxw`Y(% z%e#HEH7W|k<;5x0jBa@>v^}*LJMWl>7-hqU;Ax0qL-XgKC*lT*(do8Rv5ellb7tSV ziuP63@$%eUXtl8M;E1Z6sDSgRd@hc;FZ;SH;+8n4I=a-YINvJbLD}3YZSL;e0yNNN zrm~|k1D!FoA%tF`g?I*PR8@ta5zSUkn`d)?l9fy_*-%&&lEY<(_kac65u@;^5OJU@ zd8E!o{t0DeH49}OEs-NnDt0E-lPibEw)+EU0|G*_hVK+s7#0mlEShR`n>rRiu-U(X zMQ5{+929ycllSX}+u|9Ew|iJj!^`p-14~rl$#%{Rd{Id$>9mY=&igr^lXL{rO(;-? zPuL4#$)s=z$`ybU#oNKCX$NqY^c7T;Qddn{dHvN{GHvg8yw;thQ(uU5&3NT9&91{h zMz2)kmr+Ud9aJqpXA0?(-d-L$b@A-=!>jwJt~52qSLo~y zJS&-|J5PJw8n6SR(${(uQJR&_#cf# zema$H4<&{aec^EDFb=T3R9rVG(YDq~hEvS3k=~!Fhqp!GaEEMCr-z3=(+(@Q93KjO z+)ziEq;qIiusyZYb}QU1&9lf)n*an&=)5Y|G-?jZ!}Ua21?zum&+UgHct2E+Nw2vo z1U&-x1vVXY8J)^Ok-KNOqEHC4Fd!W2Y-8k8uR+z)A&0@DErPz>?6HFy6l4=~r4Q67 zS#XqgHCJeAwQl@0&`MYRT-5>3uo(E#O5B~$rG>2GCzBI5cx^Nm)MVwi#r?@QRR*{` z$)+3}s*iaHSHX{`h_}D zO+Df+aaPC{ zphfAJ{e-2ZH8U@1^knGK97~#$JDbkw;7ab|92&^JZ-Fq1cmM&C0g0|{tBPRe&?qG( z9i?kLPHI#Kx&G-K_HSJHN3T)T`o*vjNb8mi2fL@)$pntutP_lCSCB`U_Y=e)i42itGX`-MyiH~56-0B)9_i=xU10^*eEQPv3af^9 zpC!$LWbIMBckRy2U^L$Q(_NKI89_Y(UXNYuNA+{J+e#azmsznn=_xX;aYpm~moy#= zd)%>D$MAsC(2cb^(k5;eS(UIMp6BB>mA#~4D+H5EUhJK53#AqI80UwqtYhbp$U9)j z<;zBj*KN^38ED%8tq!-r6LP1L7y71z8^KWeaM$hh3q5{X^N3p*sG*x%b{?|0HQEmh zy@idYjIfR1&Q_Y!W$1jRQZzpttJg!u#gcDXWLny%JE0TtZTh(7fSO1*(q@H@br~sU880*4jjzI+i^esi#s>XFzOwTpxcD4jSw%gZeO>@{>roNj5MV zR(5rF?Qo5I$b!undR!a>6TwZxIf`NC;lh}Ff#mtk<}NT$Jywq-pf1{r_sEOA=pI@@ zRtJ3W2`!f|A86@*W0E9vBrC34oX$|#IUi-9Qq8N<%57;2Ut2k!R3v~Ad|rce&kdTo z?vZN~dDDE3D{i9S;3hP$Cz!+VD#4GP0&#XL*v^3`BlGmb?{8iEE1muazx`cO9hI_1 zeyz##9*EW}w`3eSiWbTU_M7Ec&&t2pxpp-hQw8?Ft$xt)ZJ;XDJ?nk*-+uBWRU=q< z@-j|jVU1?7jEq18B&B@qkMq_{P-@rxUX*-$ZeP}l37W{J zW8?#t6z&{2Cw)%%AvNDasY9Z~aI4(ig>QSW@0hP^ej_QCz9AAONB_J$n-A4Hlbx zs+B;>ng6hzpiw5B{!hT6EsKj>~3(8nJv(S2?q!ouEZ3L!P; zpVTTpim5x!BNBw*<4a}}V{$?x>}TB9;Ef!DR!B_c;P#@df*iWXhPS$Yu3$5F)Fg%M zIoB{WsCJTU;L$ohkGfj!P! z|He6k2Dki5;q&4|JxNEd)?#_)(3lu=ni22bhcf&e@oF}hFrc&KP;{7$1*Vez2>K7qD zk|X>B$Pr4{$m*DlvWii5du$4>P%^Q6DDdvm8EwBN(ZKbMK!~!Q=$X!ViEuQYGjR@m zFsuno>+|kG6=NKt09ha=Dsi0?Y87SNWXhc7N?C;*yZ4{9o_}%wU*zsLOC5fuU!p5` z7G`zru&7p7kR7$uAxql0)E(5f{gfK}6OyYpzj@`oha24=%iY_Tdy|SP7}S}<+}Bep zAkjIk(%U)>nQSp+iR952%wXbqgy0(oIkQ!Pf(iaci&{Ds^$)sNu_ER4>mCuBf~}rbJ(^iPuIz{ zOoc&2k}QNo=(2n&24eLFhiG& zE{kXE!EvBvWvx7@{z+x{J9D~pp#2sj!-i=lN=s6F0n2d}k=P$a2fKP=@{5(pWd@3w zUPA}M*c}HM%t7cL*XZLB-9{|RzRyl=89208^LZaEX9p9&{@h>`A^N;m6<4VImNKo9 z4`kR}4YPyUvt?v_rLrs}^jTlPL|M9}MwY*t?g~D8>@y9;zoeZ!{BY@$iJx<$tH-3@ z?)ek=ZO_U!|FFlh9yG>Q@lZVmq&f@K$0HHgid)k9bP8ji6l=mSoFph5BM}cYpel{+ zGU%7#vj{5$f``b;ND7c)Xhnf`9X}5$*``JXZ5%9TsiAwL%puY8AH5%6XWPXjW`L|t5q^oJE5?rJ`6z<23> zvVAaW>f^Dxu<=+nFJaiGdrr9bP0OX75Pfy-W3u6>GrR(nIL;(cpNbaPd6 zP-akcw3}42XpBC8YetdFt#%2KMs_N2LK1d6Jz&Rzb?p^|4(6zU3!y!WhTua;SY1{Y zu!vBL#nLj;qWa2@wZ3v@=n8hD=@{q?>Rhk|n-(26@;z&8@ug2;=6F^yIs{2@3#OP_ z_rYA6`(Mk{;~mT7S*>T(=-uPc3B|986k^a&>p~miAAJ}IWM6jdM3)r-Eo-2m-@=2*`1)wC% zvQH9!k;pe7oO4178S(QGt^oG(BtjoTYt6+aAC{UX9V_m`=S>h2sstbe7EX<0v&MnCH zmAGY6Xn+I78trX6wxZh_fv&WCZ#j6&KR;1mV})2g-ntt98a4)aOT4=U1Yh-S%iveJ z#d~fRgA;FZU&8a;+O>}I7)qmUA6s90nUsnT#@UP}+S~R4`>4gQ!*AueJ?Y0n8P8G3 zo~|R+$AWj_pS_{s3aEour}tH1l8U!FGxGMVYtHl}YbXg}6zO%)LNc7={RUmfKu<^~ z(csP4W!e>zaJf>o+WQ-raMG%@5&EUSw5g-hxuMPQ=r)6e0QQho@goWGkX&&$2|V?+ zN~f}_*D(g58uViU*9l)06ND4<6~cCkT2I|A=)3DsQBKh3BeNxjpn$@z{V9*Hq51g{ zoOzWa92xjr0*LX1nj2?q=qqKLF54)B{15(26duLQP4^*sg~)DlzrNmUAXS`JEll)M zGz@4I(;$FNe@TBdje}#~sp8H@K=&5UXo}DwOFOuiCv5nwzY9cIbQ3P!*@@W^KvA@^ z@&yEVi=hnyMI7vYithG9A~#CyeJV!KDSe`6pk)kd%%o-(d{kQ9$U1wlJ|C(k{4imx z{_UB$$Ahw(j+q{rF^zheMMFfAnP38v6PcEFmc4heUtTU+xEXA3S{G~Mp?SxOVOg7g68j>WRicOVy>Ufl__<>{rZ?G%@lf(fBknX}eWDL_ikZGNRngd6VDodnS zi4Nhlpnt(-{jjcs3+#x6NJpsLkf90Q0)O%TO-c1YLui+0K=P>)CCYHshI7QZU5b6kYM5D56TVN){*zpKh?X5&ij zJw3YciFH2Q-X^-uSdRY?RCECXN;beuNjpEJ$v8z_x)Bg7%UG{|Il2mH*p!!IrIa4e zff2~M!y2CPN~z`fmVET)4WZM;RWZ&rB(2??bxSCwqM24sE$wq%qfWqMYu5U(EmkM< zBVYRSna}T*)s+XX*DbvJoXC9EuVG?s!p^I1{EL6&rz=2^~+zN|bbs-mqkVxG(s zJ1$U2f)pv|xktq=%4y7zqsfhLRUMfMiOJ3kiVV9kXn~w^&xU2Ug77fXx+s6rB^fnF z))q{T-E?~j83NCSv8KVq?A#?%Qq?(Xwarao`ujB=l?7yQs*5DF--`A+*nkkYubZD@ zZ)#UFWar@8qcb+xt!FYWDm}~t(dgqe4%SkCh;Z$srvW;V-t`gUT=L5<|CmRH-oy(K z3PSLPlS+sgcQ{$47J60)0tfj^O(w|0IXF0YIb8Nvt+^VV5#fZ(sIJ?_o^GoNw`*r)Sk=o!vC$p96_ti;GF^M$?gYpTrUmB^gAXs9YOipM}pV9BL`Vbq^Vh@;s~UxHRl5 zr&YN4qC zZB_7`LRmvdo{AY+qi}4=FcX-~u_?iBo7{NG2~IG<^ouM+ykwMG7jRXavv2i|$xb;K zqHP@2lo(SOUI`z>Bf8fJMkJMNAb20Ayn?KxOg!11Zv_^SjfT(@tj9o_Tb#;D(?Aib ziO|qADAfPxtJl}7do-cPh4b9#yty4-tBYYMy8EZ%`LHd~avF!>GDE(tNowpBs_@Dp zcyWh09icTmVpUNAZ_A{W;k032IeN!w&@N?Jm2j?KmR4Zuq$-?3d}4mUCm_xDZl^Zh za;S6(tzEL!E11m2As>#7#Bk)FmjCwn6G80l%$&Hq+!Y7fJhPeNF0w8S26Q&a8}`Dd zd~VsPFGHm&ab3iaa}4JOGdDEl;9+T{AlJGMPR1NZ4~hxs7^7Rt-Ukm4lV%a5@IrYZ%NEvm=!gbsT2;0?AsLYQrAx zUQkpp|74757ZPv#)*)+>jX96G64D+Ei;oXu#<%E$g)A1pGal*^IGA96&1=oZ8dGJh zwTYU0fY*E1YF1jAXnjhcgUOF#$Yaf6{o2h^3u~d2YHCDoaA`TI^cLHAXe%$41c^96 zxDwYolPyh)^R1+R&vF0CKmX49^Y=T|X}A+foP06}o|Ll$m+vMpcET@nU^s-Yh6x|d zMg>Vf^Ro(9$$m0ZM9r}-uy2Hl>JUVUh&v6CenLntkx>-S#|f`pmmffY{Sz-`VnQ-E@ea0X8PS9FN2;*V$_-glLkFKxQKm(ag|q3?Rs?oy zuI@$3je&qjIjwv9GJy})Uw8aj+tlIR$(eYwQjBb4s-`@&2|kqqZG>OEH4te~-H62$ zwg_0hLfsr)LAH3;6?jO}Xz-&Q-QFk@lDL$I+6g4MFnvf~wSI_5!4m~kIJz}ka0>jD zig~^0&Dw^4Ms2)IP#yX)qSwYLR`hVTFnzZ1eo{+8=%@pHVbPDa@*RD_=GJmg)kh61 z87gbH$Z5?5h3d=0`Fai`tv?n)k*%05WnTeTvm*h5f>TW9Oy`;`&wX0i{MZKgx?(mK zHy^%4)4g4$&#_AEZ=)1;!_fkRAV(#fQHc7PtSo6_;oUPjCmJxek69Id%NLJ>&M6Zd z?LpQ;AZtd*Ys*nVN`ADBjM7_7(Fz#G3U!Uf-#e<^Ev=zYk#=1bKvDb3!ArffkvDDSt(hQ6%f6`j;<8yMgaqLSCpf? z=dCZ3U7ZBk^<+20gjH!IN);$xG@JcVYtYaBxCgVOE+;=PD$&X+JdPrD`EI3!EGvvZ zjdH4p;tvbb0Egk>!3LxXhNJ>7QWBqJiPnwBN(9bX_g|9~i^WiETX}-mk3tKRZJSz%kl2=B5+$GT-@3-A7j8#BQ}+Ijpesk^xik|pP7 z;rchokhMIpzJfSJK9u;rwQ#BY0Vc0PHIH!SRnpAIV{uI`R?C=FhBmslx4J!^_f>k{ zvT!l=qFf1aJeZMR2HGTp=wKWmZfgsu#&#|1te0@qXAWPapmF1oh{jm?Od_U;FDh2H z4)MIE9Dg?k3L8Eb6UV&WCM)1E)E8)pN?))%nkLzRL%#3INlT+2RZo6S^(~g+zc$GJ zF+^Ks=%HK4I%|f_l?AF}`_ov_FAs2EUcI@ymm}ic!)!kGY%fQ|X)XWZynxlWx=8;u z3jWp8e_u^v!(h0udB?Q|e}9uyn)ER-8<87q?T!Z(!eoC-#f0LTrDmB#h2wkm)M4r_ z>SwBgWNe{aB0ERRV4!FxSh#icb{@4y%#BlG;Jl>w5(^)V<62G_-KO*j|d+eH;Gxf&eHp_;L&B?f+5PRcG;;8->K`Zn17a2W}JmpbztH`N-xJE zH~UmEJXk0#CM`UI82oz3&>;`yK;OFMW);Mgi_q8O=V|W1O(nn(k}oRywASNA^!1__ zcUHZgQAhr!Ze1~-7t`XDfTyKthu`5*i7F-)V;Jit^bDV z$iEsQ|IW3)*n(bXO=Hb)m$|oJmBt0>lB=TO{BvCAFpSrJE3h=Wp?j(a0+jiM{yRAS zZ|^xmu3eO$j@zrE>rG2V<@3G((j+gb}XF%0GXYVSB>s=Gul`lvUYB zjCEBnXI_oyLVqrOb%H}-ybYT0w$cfNPpf&5a^j4~;dm1#_l-AoG#`ecT>5Vo+gZ^p zw=iuUy(b`+FsM<5sgs}R@&U{8kOQD=a%^PA<(MS&m$XXbLeq|AR@z`s;|r5rDr!1Z53siwsfaMxdHP& z;4i)I?wXN~W7x9%UVw7XC z$gT0^tC@$2(A8J-2?1l?G%9$TS^eYh( z@Hu<_qznc>j}o4&+RIQQS2u z(zE};JOg3w%D1c)S)@-6%I&BM-|Wp7NbhzD))SbZNL?gLq1zwdH_5l4aqqB}`AW5B zysPFck`1Z`!B+)NauIvjlM*VFb3F)&{VWjtx*sU)`pgD6&Ac+s_=$KKA}heYww zp_yWvv-+6>y3Q>5GvQ?#sMu5qR05{C_Y3Lz^`ONaQJ&N^`Kh8ylRi3Ztw;~OlDfv< zeoK@R7S+4E^Q};o&k5Gt-*aHyWl688m>GUOVZRcC-9kF#K>MnvOFp%LixKtBeVjs< ze;9ORH_`k@-3z9@Jq;T`!@rW0Uk_W{k?LB0@|C4Y9qI@CcC36fK-g;Fj|6g?XuU7r zmF(TY%(n2qfLWJ?d}}GWIZuyw!O~KC*A|fZ2alKjoTSB6e-GHTNk6$I2FzQ(UjDxl z1GChg1^aY%o@AitFvK>bvEB>O_*u7wDVr4bGk!8fT$cR5VBF3(pS+RbR)PWeltD>L z1ACFYKR!V2buawbi*!EvW84b-O3D9v*y8RKo&5l_k*sXdITx6u^zVuG{2Z*>>_6W~ z?@}u6Zn^!>H)I*NXliQDb#`~Bh30%}VTueUF(KULBv?5z;m0z2j9wM}bKc^~V5!x5 zu@8Oi*Q?qC+#O9Zx%TRBc2pNB5^`_b}@)Uito+ zJ=)mZlXs2k&9h%f)~^SBKqXN})C0;SSNYi1+9aLfkRbW6j!})yLo2=8YCuuU?|TXl zx`%!aY1;CKt3Yx0y{=UMgO7b#ElgDF`ChitvMw(pXE`JkgQb+EAu@4XdY5;q0{4oH ztfyT5)_4M_59)iuU-AzX?f<9py)P@=75H3ESeU)YFmX^8Lpk}7FSAt_g4etIL3g_l zsNDaXGU{7F|Gf`M^`ekp???Leq7+x7^3l0RwQmr1pEU7AQ|SE91|sv~Mln0YK!WW| z$Y#p>yK%r+?)jg+Rd7J*e#37>cjUf?do-dzhqR7w_FMAt(OA6l_eKqSdIj(4^?Tox zUoZV%he2G4l{G_e0zhy)A+Sz=7kgD)64h;Vb)5eT`DqFZ$zife1Na(Fy!Puz_-}yB z%+kVnmaB&(@H=-rtaZW_RmHiVciwFU7qD+<)Iu+A_UC^6VFIu!IcfX?oZ$@ zlao`g)-J(CC5ok)LqnCw*J6L4L9&(kzETC`e=-QvW9hU1-=S|-weq%uFlK2%PD6V` zIp-8{ioe}73?z?9)_tqOB-b=Hh0mQ*DLQ-1J%v}}kt&0ZqhjjeCU#6ASsU8IpyUY~ zO3R68+EAKZGQIAQl}YN6>fwqr4Pj&tPgO0*U_f#{Pkxtw@a4u@+(@sR0=Gi&z}pX5 z64fW(p5T8rhT!on5PUu)n2ZXIMAWxdwNi*viBj(reAw|SBwq?p)pQNrd7WNNL=kj; zwR9ZbwV>#Cf-c+q=ef4rRds`F`*QyqCZS)5;>2;qN2fq8R8*7Kj#y{^?1JiY72Ywy2cCvDFM_S);qyf&HE#NdFpbJ+n?48KTUATP1-ren{HB!;p z(Z$)x+R6Qb)P>86&JNBnLLpxS=`Aob^QnEJ@RL;DXLJPKSkJ59Ckz=3@S4<0!}O>_L<;R66; zz@b{25LzF$<)-N6AZGagc5jY@03*_y#RccZ}9e{_4~2!(1C-8_frEGWoZHA`wkvCc#49A^VPO;*bjN+ghlkd0{k#Txohp3JNEbXT~KudL% zip&>!kAs6MG;}}5g(Lq>r>ALYkN$Vz`pMaYgGx7U{P(f=4eiB!w5K0^lkBnSs{Y=g zWilfnPC~}}oK&> zQ|(*;Y3<8bD#_7R#TE3`&}G3c!9w!DgSD>A&(!{4m>}@X|Qtgr$m))8a_P`>#}isVh5~J1~VkQpW&N zQbo5qZxUFU>0llGMlz+`BZ=9>X_=N?)jC^FTPUwocB=wtZHwb z5#Xcy1H&OFJ5Ur8rMd_yGPOJYOPpy0WeaG-k8ha4m%4&SxSR~#q>^NNf zQx?@52X?3TME4y7y+Lyx%(mreXNgH1_2D-82B$-yh3m=iJQix?6*jQ=QiZtWJwD`41d^ zs9W_t@A1?40MT95_`I`7^p5GNm;bo_C(*5L1dMGeEc}iEP|DrJ53BtNYv*(C`u&|! z{=)Wm1vkb4ZGT7bCvE?|KlD5NKiTJxfrs-C ztlv0LI~_pg`9bUNviM!wfZo0ve8x|Mihm!|^Ar$5#&`MsStUP*)avIKtKUb|H{qH9 zg4=uMUkEOC=Z}I@_$D};zghE-@w_MH8EU`QPZ%&Du`k-rH4Fghfjs47G`9dH%%Xe#hbj~H)EsZTdI%7QIZ%Nu=!u}%&!H0d z^QOP)I~&l)=ag~pJss{C{K=B)V|KnA z@{h9&V5Ft_U3GhdW$zjOppu`n%-KH-mhVCb#>z+i@8*%PXMTS+kAIwHcKLtUoj+jM zf3my3m}L?^?0hrm?|S*mS>}gc_J+zH#DCQIA4L~mqWf(!52R!MPIE}&5(qHu-=|!+ zq8>ko=q(iAa-xKfeGUJvF_**3390qg7ZbQ^kOSHd+1dlb-6r-IQ#78`M~JDJob!9J zs=xit*o6x<-ej6Di>SN5p8sweBe7gQgA9$3zWH+*aNwbfVRnwkR3pfdyEcYLhEH5v>OeWYFo%}!>Rts4Y zmpHtri@iHHgkAkIX15$+s2y+H*DPlNPx6Lj=*+i&es*M)D&!Nxysy25!xdE)1wkV! zv;IeYaXyDCnmL)H6dz;L$zpZZV-)D8be`v=1S6w15b^CgN6bCTyW-JH2vvK5QzZc? z=pvgkO!b{wURDUNdjHn&E1zrPQkKa~%S%v+VS+J%y&!<=@>ikf!!v1rFvlPxcA(j`Gz_rS3c-R$RHPj7tM30c|p zb~7w-HhMiKJWlndErpqP=2^6!=78A9$gV=H-ey3^sizG9nuGFFIvhU%A=5dv*L!DrAeO}G#;Od zKP{)?*L88R%VN-dt&DG&#YgG`^oYg5q#iy3mgoMP z6xoCmC*!DPFO;vR_^Eh%eF@$-&zU#vK=KVgY;&bs8yxwLshw>zPCgSN7pD;g4p0`BAl}IMryU26TU2ZR6fylUb>!IdKM6gFMN1le#xcJNXz!82^GQ*yT@90)A-W-$ zb4l*x5xeH22dIbgm<6H6TOKL0!Gu|_w{7%wa?Z<$hrW@^UE0TH!ceH-YI50Es!0)6 z*9)ikYf73bC&%{ZY>Qz{^E^zzuQ%R#ya=^EG;(g^Wzk3P^Vhp9-UKLSrl0#tC6FF0 z6r*czCt0M!wYkX|#TvvX0 z$v)zGn=yx3Q%yTe5v($8t;mR}OanSf)uv=0`|X9R2@2Qap=6}1K{jE(j^f1T+fs;k z`L^76+3um-V$r_Iw}ZFnB=~x^pp{2(J)Y&7xxy#Q-t@fpczI6-Twm3?(Mtbnmen<; zugjiq*#;2;68-m!0gqEpx$=5fJ0#48{J?mAxel_^QqXvj2N`l zCu!Da8lX~`ZDC^mM6Ojz_jTW_J3{59je^Y5O0E>YBOi~hKpoL3DhdWG+AThyD4T9l z@68TE=MbfSDPuux+nONbcn8K^hkyLSNyzDwVSP;-%W##qE32r;P{IG9?5)G1{Jy>6 zK@e0*P)bq(QBu0QL7E|kQt9p%P>>Xcl0gO-kY;EYx^w8xp}RqllJXt>#`8PxIq!L{ z_Yb(%b=~Wpz2dXu-g~dLN?l4Ps_HUkoN`LO1?U1*j~E>Lo__~p^sT)%DN(jFyyC`U?IR5P=D!>^$D1e!yFKmlKp6lkrdIkB5v}KSOw&gQM$62?_TNL~HHajBNCLKj1 zyVUletf&PURKZE#Tm_Ey-gf)DPbnOi&*go?y^U=CfDJUkm%}w(-}O zI|op^KQ}kd+VDviPfh&vowE{H6I7^IFn`0!&84)gv-K_69Z?4B-L;GyFCN-abCF+LmXX__gX+n_o5XTqd{6IB!^lNm*o z+6Zv=TF2_~D#JmIueicfJztE;z#$Jl+)wogUhqP$Yl>5kTKB2&DfpcED~ri0t4o@6 zmD{@{yR(Uz?OG0F{v7|DFNOlkP6XPtwmzM8YOj?ps1`rjaN~1(Q3+fZdSW2AsNn;L za=eDQca>EbwFg2N8V#$7iUO+icy3k<%ridej!QTT&p%&%62L%3727WEc$a_Xpd@P& zBL3+meH;o{6sBDS0!||L#3sPT=Z%MP@^y+dE1QBy#z7H9vA9a(4xRy3=t#f4 zhXD}u3-BOL{M76Nrk@w4SPJ}7D2XZ7@i?_Oc3PXy2=mpgJ^B!{j}SMg)#a19ehLwA zpT&9t%Au(_A~wwY!Xiv@%6+z2M8OG@IzPG-&5h5_F9TMS0mq>u$Z0rr*bdUVQKwgbO&rHiA$;lBF74^!{62M` z#uys9Bxf`Axt$udz0hf&DXN*4itb*W0_C4KKH^b63ZvMYEOR zM)Y|LTL8D4fCymJyX@ z?_|4&T8@qv#!ZUjk|)l0DpT2CPPO|CIU^nL0=)I0+y?sYc7%R8nOw+gGY-n~SDvx+ z+Zrl<=_kS1p(XK4mr6`pTD2qEWi>G(giP#IhOX0UB#L|fHenvo7CeJqyHp!Wl&FDG zRX++0+rl5x^!m>-G7?$K?PiriKv2Hgi2lhFEtBAGWBfHy<$jjO0&l`16z+w6`XnRq zFk`vK zsBrw4l}FzlsI~HikO2&Ll7zw7y8-%|1Yo{c<;?6F(VDnAPZ8QR{vO&afh!<7WQ4Sc zvNg}sZSe>t@-v_gSU-EyP=&FQAq*TBuWcl8Dzv<4Paba*ha3QYtZ~P0J$M@|b&_1u zfXi4&`gQInv&jOkgl&NRqSS1De0%tyU_Eve3(HFIY=WbSeKx0Qb z$`XGVfzyI#saa8ltZJ{4LjH=CnR6*;ks|;=j$xkqX?E5G5h3633lQGQCPBT4k#@d0 zU1{pgCd`>ASJJy_b3f$v*w9x5V}{-{Y5i$E+EHnB01+bE)Q zC~YcLl)_;kW|VixQS$g)n9tr{;q2YhZjTI{mWx%9W-!u2l$J7tvs1H0^ZAR&|}k78~W}R&nZ3qe!XP;+ww) z_yy>@oCtC(%Bj(m2g-`Lj`i{zJrEKN0DE|RAQKPz@V>Xw{F}cH27mPTZZ!Io|n4!eqph$J?ohVtL8@!vCdRi}F zr0f2?<95$UT%AV8o%$$xGmp&iFMK(@(+2A3>V{HFxO&(|^)QDP0V@9wK>jF(LOYys z@z7BXHO8!b7r6b|qG!IjoBv3_y*Y8W#Ct!KU$3Af)1sJ|1i;JPKCW}5pKYbRT}-Gm z7FBGkwMIr{rqcsCDW5E~kfG`xcxhtOKfGA4un`-ByB*B8a!G$NQq682w(irerbMhf zvHF=ptSIsUGs$=se6ZeXLvBw>8bp^VJ)64S56si}yUWFYbiYNep{EAI95%V{4QD^*Z{? zk^;k}bFh(h`NhZ#H7szvfQ6b6hiS`5n0nk&W6S5IrN^m}_;>FfLB{=kvABDll^#A* zx*$YUgqTtW5P2Zi<|h?lk*Fr6IIqFux;pZ#sXw0Jh*xK1y* zoT)Lu>1%M@QppxR?Y|0HjP4yj`352NT&VlDyi% z#neRvPn*;4W?J`zh`j9BLC{1!FLE2a?byk#7=aBk6xACuIQTSZ$tedcco1GQpVy4a z8p*TqN@Ff3WS3Y|V9~sRUuB*?%$`|it$BLNrN~_#@I~SV|3PotOm-B-BaqfMi9s%6 zJ(kR64%Q`rdY+J|U}L>SMPs#ga|V%rUo&Lk+q&czTB+bcU)by_6sZnu_-x+U8YWcoXvz_$R6ok5b->1yPDoz!CAQC+`U9Np3Cde4*L8?sonFi@< z`>_=VMFNy@$Vy_cSQq>F@m%C(uE+1h~8xoK}(gQZ37ELKI8D zZOw6r{gqkF5Aiusz)J-~(+3>z%7fI=L!$WuPI+~2i58RR!hN9on4?}SLy+h5wS@6- zH50B{BExh0{)A^Gd-VpRx}Yj8c~?8)hUF$A%1o?t^A^I<+93O3YZ@iC*9G1i z84w%uc5ae_Q|TTeC)GP=wka7)#GldyrD||kzT7pbW+S=ED1HA_YGAkM9!Df*m)!dt zA2qyaH4mkJR#zzKVs1lW3{snWH_IbvT4yiz+a4P|-4A_F2O*yA0SN~;=UBU%1{hW5 z*R|TF%#P^u`UKfbbfQ#SFIw5*dTSz`p;Ql!#B-_D8HdWx8rIkolil4rRwz?+zBLIp ziiK06PRpXqomyW1Tqr`|;;~Gp!U8?sP*>}|r+B)@iyKCFBPx=ZQEf#$pmSKRErC$i z8WnBk7K2B^$@VO-PI{vzYU|1CvHH8SwM5mG$YHToRHb>r`#n3w=I{}9y~k%NuPX;l z5<^D>egSG96@^-jXh{O!Ge1HGBli69s(B7u-g79V z72xz{!*G*EGToW!`;Y{Tecrl_ZUYl5WhN z#iENkijiRf89ZrN(P`*)PF?G0rzVJ!W6zE)Q=uToUmrh*1X69-ZArauydhx*nBkgcs^RiOm$(r(nVvyVl3|)|p zIylPUU?s2KK}s@@mox`uzW!xIt4S`zvo4ZbvGDCGKFay)=s$Yw~NM zCb{v2=h5y%jvY}A=lU?Qv7wP3bs*I6SIn`Q%@UXDn1V5Xu zq%=B1Ua7VMeQcQ&XoJ7<=in>BltP{%3m&(`g2e5b%IX&dyym%?ZQY>cSdWtYObNph z(l~jNwPM1r=;O{iPYv&UO38QzsPS$wEY8(2OtKtHr2JGnpY!oJMlc0$$?pM)gYuAb znHhRk81JLhuNeqHv2|#EiDDv{_un^t2B-Il*wo zyxC)|nGrZ?z0TYQog-Ha53O`6@=R)!h1bnKpJ-QU=e;u|tbul;f$$2FFoadn{Pf-! zkI4$Snc;>Ix^AH6@C{a6tRsts$E9#ig^j?A(~&^Y6y!|`K|nuolND*+WrfABAz@zE zxvpZZ(}k)rPgdKR#a(rJ)U=2Q3uD1ct24AaOw+;>lGfEgqk}J1yT1H8aAW#6BB5EA zI9!N=9a4EORv|y4vSj%OC|+R_E%WO~;;tKWUSUdlw|O?Yf+VX?Gp`BQHsIon}(2RFZEu-&vcD@E1n7cFqTg{@7&*+G4^klKN zAhNkxVsuAd;Mxk=eOi6$lQ6`czy0+xiJu(M2lH||EwD`nQX2UWG7X}(5gz4wrN*bq z(5Cu?2hm1*$tojTJH5&8rNG5tOco2SM~!vdp=(Qlbqjeo(x23L*eq)^Bj*y$NHFbewy~U%OC6E^c*t5gcIV+R36?innQfPi#;x$ zcWa>v;UQ#%^{2p&{cv%KO7i4oYxyAwTqE(DdWDgONvFLSTPghBqwD z{y#P9VFJOmH#TW)MML=~jw?c(p6j{jO-waD$wD|UEENK;BVQ@V`P#~%dt@vP^8B!O zG52L(o=5CU`pB8HV--$qv3Hyz16`9m&8P&;$30Dv0 z?O<%Bp{sx?F(MX3XSv$bPeN64v>D>#YNeh9l(s&jqV&1OTZTwOI0hKXJ>+{_Hn(6o zEv)kzg3em|JTLZGnf~)y>?XTwcn`x_9MJC@@S_Odp;p=OEFm)9I2FC+c3JF?WVMCu zPop-4?@n9wv|z>W03PibyCrasOi1g>vwX|{xT28d$X7!Zh@ffXp|`RpUO4z3fL9#t z@*>Oe$mvqvx8~6nlASph1&Q~Mogg0T691sRVWS(sB%*)2EiU<>_M{|&=gZ!<{iV&$ z%!@}M>q9&|kO6nIC)FxilU*Pb1YDfKdK9(#_0%I;5*KN*+h_ba1FRhWKH-t$y*H8O zLrBMTXDT(HK?CMVg3%`sK_>4D_Pj87sHwpB_?g+QA(6W|?gU@Uc2G9DM%&K{!A$P4 z!d_ti7&-aOSe=ux!lU<1rki{Nu_Osr{#?v$`}v;RdlvY91sqRM8ZLz)3U)`z6Ixx1 zE2!i9EB;#F3G;j|7H(*cRt7)c6fUA_48Emlk$|(pkev|z@0cZ zU)rU~KU{+EK7!4aWBYvOK%i5i@o9}F(l-vmv7#KT6+M>hajU-o+$cipT=b#kSGFe= ziHa@+d58~Q5teD$t>%b;r%FWxx9}m^8-nUgboL07KJtrl4aL|US0@BAux*og3#GUj zQ(-C3>`-l_-LG~pZ;o@@HTjGrCzO}e#s7}6#h9*#`6OZ4aR^w6C79N~ zMWwt4C7U*1Mx$E^83^(C_~!P@;>GR(+mJnt0kxmE22~W@{VJi_Z^I2|^S$Q1&+L zow5x@2={W_$pXZzO<%C6%yPLy3h{!OWrYB;((aPk%KGJMAe65Y&mPZ|{M8dc3xGAC zg0_n~=u+(_+wN^QtBxj9NWm$q+oim%M)^&m|7NEj3}hf{c(Rma8a`x&DM)8-p%S;v zZ;z=lHCHn4hKOx0Or0~BQd&)&JICn9jD?($z^S-ic?FNzP!3eQ2CWy>3{dlO3vMPy zzrjor3$Ep1i`5u13Uh@R<+3rjNWNZ#DaVrV=YEs5AClB}8z>K1wG1A=v0F*~9!flQ zXG+*N`Wb(KQrQ`%OMcB3`CYSA)BG%VVJhzf{ur@uty-6`^Y^I9oQQ}arL$qJlupVT z-Vfh*8AL-%2{S9LqVDHxpA@HLSB_DmD~c{i^euSRE{xsu>7>@=>UJgapK{pe8{sFA zFq)RB`2B=4jmIQt*e6>9QJU+@))nnU1#wR`7%J|7CW$2gm>sE89^YFIb#^}4Q(Afq z*i19#zeh}z-kIKc*5#@87Uv`F)hY#x%eN9&5_+Rte$zfh5(6X9?COdpj@@PTanZto z|MBr>dr-Nc-uY*@NGvk$e6|JZOyRl56&;TQ(kw4SZVKj=ONE{atC(*TE4Z%n3832i z8h{{a1OMAxuPb>ur=pSHbArJWv7a=VV+b+@s2=k>LN;-Rv*=uwIujE3qKZxR*ob=9 zvz$OqDtqcEOaMovAuq`z>mP~E4(kc-lUC zulF#q)8`j}Vd58{+;c}hgPCm;?pYgGIbe`Lg2#VNxd%f7}MaXdF zX^E_6n{7wjgtnvmD>;$eH_i;lm|?5iT6c$cj2O+vi?iK#0-1BQ#QmRLe;45raK*u- z`@U3S{5ja^P)tRkl+O(G326CPWkY|;2l}JX0=)11ao7NJo`mHIp$?$~VXr3v)5tVJ zwFA8^d**m1e-=@4DL*ncjADI!;)KK^>fI<8Ks}j^8kD#zKApI-F?8E~I|6#Vr=wj< zRb7NMx7U`}de?T5^sy#^NR)%A@iX5^LU7^4+02LItSnZh;VGw^3`F9)0cwWa#mRAX z(~CMf^rnR10qt2KBzo8n^HV#(B*mvS%x1Pmga9hK}e}`W!DWoG8U(mvx z^Jnw51iF+J~p6q^+G(N2m6MQqI>g&ziq>e|$_p7`f)th%;Od@G5lA zt;9~BSwGX0X3X_9xqcqvj~7qHB?cy>x^Tr+-ePmLnIt`^icl?vi`>u8qEnDrPQKm9;3Es87bigd>l`X@*B` zkE?#Pnjgd@el#hjR6xd)Gyz7rV`vUvE@paeDb2i+TJMh{$($^DZc^LKbrle&KLQ<; z;kWJhxL`1=Mk9ac375iIiZ977>Ra;Difi0-`YdZNpXMr4bFlDI8m0Jc4l8c`B2Nq6&hd(`X<*4X3^d9bCZlcYb!Cg}Vt4R4 zovM^@4vz$j7%biAL#LhmK9BDm(YtbU>YYLp>|DRg&Te<~`%=`sCqww^bJ)_u3A4SO zkzEv4r-{6oC&Art(OBk8g+a`N69mIRJ>^8r5>gq^V!YmS>5-4Rz+kuWQPg`h6H1g9N@tAIA1<2ot6s(<6v;XVp>W zs(Cpf^N#Gf)$Xs~Ux=7{TQO!u$8kq`!~mmLXw|#|43-lylp7nD+T;#a#mRgrr_VM= z>pw$~JVkBgN=YxXLlg-Nr_Eg{(>B1E)9}@d)IyzS^WF^}M$~ zMf)cvN0rq*v&|Umi^UTXcv4o>anw-HW-VL5l3oeX!O3cvQg69#G|*Ypy=S zoF751()PCsN@bad=-NkP+_m9Frsx~8yqSO(u(6X!Q1j~{IVV&NIxr{a%XK(lIZbkf zFg@Q_j;Ob%-!}fifq;-t_{(*>k)lD_hPFzcA6nYVDnQDNyznkTdQZL@r>9m2;Od{n zKJPMSwKv6-Z9AMBQf^P=K%yz~d3RB^M)CUYvNKam13-D5?^wmTY#m=)umTCG@SHS7 z2{ZTWgr=?b1LYm-{T0p8-$14m3_i7YO_b#>7j(+4JGmiROKEC=yS zzW}VLfZTwKh5EthfX^U~vx)$#b%v=ru^@dE{kK|05f!sQ9mV??15Q{Tfr7*W;E8E# zWqg|CaxKvQz%v;35}B*>pmKCpoZ@LwR`7fG_~1@F$QRXe3Yo-JdFC5-VXYR{>}rG0 zwr5c~U4k8&om5yfl5>X6zW@(GkX?O}rdcgr^)n7CzuwPjXmn@CB=emMd&1Jb-nIh@Bh(DFp7__RueP^3VrMF)6 z(VMnstn2D+Z;1dJseYMO?nUqixL;1yQV;?7Vur2JU^1RN5nrn-pGu{t)_UJ z^j(xO+`+{`v$)g_gfwf^nA<+!*SE+iP^GQG0BiE%Dn~+AHHGcqcjQ>~yO}|497TLSQ&_Zy zR_TH8;|VMR!@m1xYray$2va1;%uz zzVM&g(kXd2&`9Md6|JcYTKCvxc}83zaIv=(AbEqUux_3i-w_PgwHAFgiqd49C2>@9 zO-S*1&AV7-S~1_8+mscYL&rb%W>3Vv6@x*N4(v$B)sCpL{dF zuwahW6prgmF48A~8GeYa7N+-x)lFRp+i-tl;|pjQm7vH#qpe((CfZvp^x*zZjz9z{ zSeODR``1>0G?7QXLSVK7zWk^idi| zu^3KZRw+`eJbe$|cLg637l|_E+xuiJE?3#aiePkxe!QDo6VyS&{Afj7;TNEw;PTuL zZl39uTA(njC~pxwf~3DhCJNLJdT@56Nf<9HYMG7@iG?&4uqAWrD0zyS0dH3%!akd& z3$(p;2_pcstrG!EsMp9q@OC-H@M)UPGY+y3%Yj^v*~djWrwzf~Z4U#dp;LG6ElF;W zCT*d_kJ%*mc;igBY;5qur;DpW(5(WNy#7Ou_pcxhhcss9xfCM6(44(5AfJ)Dbu;%O zprp&`uA*zOQB_5;1Or8x3v=Ci=lN~YxKR`jes0LMZbr%IYNg@Bu);y?hrfc`zIUH(2IQOmwF)A zBRNCSw}Vb+Y-)MzoFKbX-~>B<1dLy4bqkY)r14a@pkiV2aB^y#%mF;ry?0w)$;N*j z{=`}HT++IkMycAt#t2E)rP+1z2y{2lnP=su7fXKQGenpcr0<&5Mi_B&yZPjPDQ{b z1~ZMA{$%c6-6xBGFwcfR3KfD{V^blk>8Ez7jw_j88gTR{Qzwn+T}rd1U1;VAB>L)} zv52Pbdw@@smptctg$tf2(0_9M_)`@5Q(VsXrI7l*HNxZ0{Knkwc?wRPPr8fuSqM)) z&8UaINe(ryds#_g#acapOc666VPRzP69R)4sH^!waUKYuLzn22S`VEm*u*~E zLmx?533ox{I+-0-Jct;REk}o}hMW5npPAKKSk;izhZi~mMm{uV#vNgJ-*tOmt8)V< z!!mbi60Yn5k4ZC{4;DXAQaEbnImYI!6`)`WC6+kLm(gYGmir-g@@eESy*5fwmh8Jy z;Pg&4=zZvQB5cWv&{%jpF*78CM8_tXYLFcoK6|t&-dVGGLUkL=Q!)jjsRP^CG)kL8 zVLA{o{_(N_^umW?C8JK;uKu-gRxOI7s@sN^A{x6vu*jM&2E#L*Rnc6V&ygh3Akn{5 zsAN?ozZ?>h4=;91@P&M5NgzJ@oEiEHFk>%vGF0ihN-OW(XLX+ASKz9Zw_Y-%YJgkL z7?$DBdE%K;mF8oKg8fTDQ{~zGdsRugA#Y#(FAQ>MhG*dy$dLsXl;3umjn}`FjXPE4 z)r+=T;tmaQ@=M`C1GPr(eZ#+=i=sJGRWl*Y=1dRPlr>};Ot%gN?P>lM(Hbpce*U=2 z)Ltg~Ig!lupXa|-5c!wl6#|29zPvRIHzpJKj~3MaZA;}(1N3*+lpjXsrA7KtZ?fes zB%S5{OXZF42-==$Iu*;5+z)N<9o-t=j%-7=8IQ+r!&OVZ4?Xkm55n^Dl zN=OO!rZ@wxiWeaSL0@UXfH5kx4KX-IIruR9q|{|2UxYQFqvQa8x;B=K1Q{^jZhUH& z(Y&hiX^fpFsd=fan|dTcOmwY88r3koCtR? zF9t*p1KkT*&dduaA2uxP9XD~VDfM<$?hjc=;#Q3Llt^yx^70nX=Cj#n>np; zCAaN`8$Z1BSgVUK`UiC6koD?6s6RfGBQsML$R&An6qR|sf$;4Un?Od|Q_toX(Hsv| z{*5*dnTo%l@_qwx)%OP~e^dWL1)+h4ApfAPT0_OY8aWD0$)kb)HyF{~%_;-Ni9mO^ z=)by~W6ETjwsdzx-87dG7(M-_&27;qTYoJX0nE&@aI_ z|DmASzk4hCb=^jI{|}|2`Ma}`8^yB9K0=QO4I34Ir2m(iU`F?Z-$4H@ z{XZ}Lp?t;vl^*>%<~DU+Cu1C}2lt5AwmJ)GX1{u=Dy|fH;yZFsV`!AO`|cJ;y|?CSJoA>`yV$y0K;+&K=VfjFGY;qO zt-0uTb9qD#s1W~as+X?1EN~37r?ENVx;VD5Tx@Mh z9DGvZX^Bb;^5aP1H9i=sv|>>E!>}jf&CPwdw5YuK=SS53WknD(b?`;=`gqXrpfiJi zcg+3~QZPSrmbmqPrb-krdM{wrPaAa|w|pz+>N1LDDd z{KVCFhpZnF1@lSgi8z^l zITpp;TXI`coo;olt9AfmEm@}7REEkw5f`wznNPF%yk~Os!}ZqB^X#+sYG6ZkQADpb zsyoevMZ?Qci*-ztChT*|&@VtxFl`F2KU!mPoCkluIZQ6Ac!ZxhV4NE1FZ_f17hq{w zekRYR5&fh7_$M%Dpzm)R5{W%Uco&S7{nq~%;Jahie=`8ae;D8w-~w%dcHqI@mDaz! zMS$?X+6g<#>i;c^-*3zOmIeD#P2f+1!}ro2qW-8pYGL^c(ApILucw&)_7v7Xp0ehC zX-{8j>ldUkJfGbFoDc#_vO2rlzu}-N_xgUql8(o&?g~5wR_F-Q3YTb$2==Zw_M&5t zv_Jeuz_T2Xt>BE%v3W=73ZWZOr>mo25yxIs4*1a@s335{lI?T{m0bvn>b;nM*wWV376?J}RxKoW6Ob+f~J+ zwC3L~gg4Hh{q&De6X{N0)xy}&P~Q`==H@fo{GJE(=#MVljtTu4If__f3(Krn5293i|=$CcI-29rS+zM8;V z5|^Rj@7rsQ9)D1SR-|MeJ<%^M%5RdGpydK#kT(C-vFLwW?)H!6u6|qhx8(}{SoaxP zXV>34_avcjDq&xumA?6{^gq16!AXY@EEp?2TKfxEXp8#q{lV4WyuWb;qWY^#{lOL5 z`py4Z|2MDIZ(I@lwi|i`K=*-v1e6|W`iS-;!j%i)h5OGGm^>Z0FBR6XIiYZUxUAu2Xq!g zZ%abY?m(7hs?;tj$4n-^-?nH@80lYkzzQzE&TpuH4(Ci;;6FR< z5%rE?@$dgK*gDh5zcqg_q0C}ua&-D^Aw2|V18yTfKhfW+XD{pO1aLCJ zZ*%y)zq}#~Fox7IFVgE~j6ButUvtXQmF%{D;9@Rb7M^-nG8~LiJZt zl?wU>Xn!ZC{U|{DTRZq)t$(2Xy-q|X^!EQ>0tNNE5+@Z_7aVHB2yG?tHQIO0lG?P& z9LI8LxA9DSEU7fNnPeqU{O|>HK^fV?{|Ujr2iE_S_~3t#l7Oqm`pTxAIoR8hV06Q2%&1oV9FZOyE zvq56}fKRl!3A zV_y^MW3Y8?xCRai(lp_a8%;#1sTqg>dAg%qMF!3mLgrNDYpLcVk_RYNinrX@I}z(f zs(Y1V1}o-_?B@yG?Ks0DvGFspC<$@ZR$g${q|Q~U@weO$n&>L3DjJV1IG_Hs#{^4z zIiIYSX(S7ek{RXfFuyh8iK>|W28P*0zTtXK_#7SB_r)uIK5n(+gZn;gR?)h;RodZW zjHbkJ_v)J#E1*X|&$z;t$Y`x2x{~p668XAZ*{egXeHq#Qum5+vJxH4{qT_)iPd?JK zNiyKfjfdyKKSsG}2&036Ji&(!82bl0SG61ijd}5_+&VDR<%lLM%NyZg+AQbBa?X;s z1hyaOz%m?+W7{}{a|vH+j=q!MM;D43v)MO=2y#z!BUeAp(=B6cgxwQ~c=QQ_tXO{~ zjG#)6Tl~usS+XG&2G&DwBGiZVM=YJAT~n1{U+KjoklLdi3Gb%@xNVC1l*(DYdLyXS z4`BS*uL7=yqMzuP;r2~d5vd?nPT;tskOn3To=NNCQ;!48iWJLrBJkX@0ae?;V`_^0 zZTAlM=<)iquv`+h+#UH(g5R!M!5&V+BBcW7ce9}%1n#`j@tg(sF@_Wy0khuvJ~zF* zg!{Y?#leKtiMTk4DA1H41xK*VILP?vf;vd*B~94y@>%`2TeawCX$lR7TfW53IZioZ ze|w~3=%5*6`t~@-HMPNYCi15Y43lEd0N1PzJ5gFsM!>9EvBl3wftGqPZfwZSGIR`8 zU%(eVcIMj%9GtMu$}Z0DhFHx6N($0>-jP$~jLV|J;oj1joQx3~v5}>8szA?Mtq}c5 zmGCkGsZEv%*6$q>5WQ(Nx=oCPje7#CLvfpUI1nwC;3dYlFYZ^tj;!<5K6Rh%fb9$^ z4g4YVI!)su?L-#40a!%w^8vhcqJ}BFprB5_R*5rW*RmT%^m3>53GDZf`ky0+F_&m8 zqE4Q-h^h~K=eYau-koPh#9d~rgbo)JY(o!46$lw*cOV%rK-8>dU1Qy~Em$~}WRWgh zIyiD?jk%S%Prd2xHPEtiQ}``?9i* z6J+5<)zj^uZL1XyS5xP1yIi*q0&A9GgWgn>GjY881aAqf*W{lyi}^^19@{5si)pS# zlwy0o;r-zMp+ZuFQFv4Vvi>^UHle_WvP41O-h*0PUizIWrNnf5rmw0`i=1cAKKo_@ zF^Xn}rz)tv)3&||ZnKG9r?8!|xbyWu)kEQQ$*g$jU9sz#S~lLN#P`&MkA~1IYP+ik zLWjCsSF!;Sfr>L!+_D-37sqlKZ?T+_J)(`@Onv9h(Z%B7G4&paVkwQoJ1lI}s1aey zZv~Ock3SH___nUxqYET_cF!m-+KQT&AbOOv9-sACTV9rQ(}=FsH=NxW`GygR3C6}& ziXmPA46sWAY1`iL=aL3-ISH!~7{P01s%B3%8k&17zvUKZ7R_ z>a1(96+E`s;=+=-7<2%adhMjys%~(-P@h=JOr|>419xw%0xxSkg>0KpajOc{ zB$;Cjp00PKKL-U^&MKft9&tQ&tDG2*6P&H&P5AinLd4Stc}LE*1J9D4rM0>-!!Av| zJPz&~RaF#adrgy}#mZG7xWon8_(5U4BuTNPbDfbD7y^C(Qb@uVA*yEsVJrD<3F3+8N9`+>JURzU^4wH@0$uz`!DNw-k}@F+;nwbkqO5rA#Iqchudd(+qvkBs&NJRZsfdNfwr<19s>Y%Ab%IZN z0~jD_FT4pD062J&ML4ClR36mv+bEC9K*jB3U3w^I!}j}zG}U`Foq|Q=S;;@aH?kN% z7vD^HPTD_@J7#xRt!b*wKCYAUY>hE{=!K3gVoLmGbr5qYZ|xJUt)ZCNX*j93T{fYm z%a!b6wAx@ub(ToX8HD_xui19Jv%`0;Q*kBH{5q+_SDpNmU4^~=FTmq^LZbumUx2;z zx{OS{ZQqWng44-m6_bb93Q2BU2WDn>^o}vQ1T015eI{?{JnGfb_lXVIxXM+OwTBjx zqn4G%ZWC^ju4BAmBDL#{v3AG1h<#mphW9Irl$X1~t(%PLanA8aS)RGkT;6mXG-3QI zx~>=2=b*Z}B2nBY-6onpm=1qpg$Nv7)GkmgL(cOC=RAJ66*NvxpBU+9R*ea?v$@H0 zX$#OWg4ZT3=}f~nVFFJu4XYBR_IwVhLy{2Vle?~~xe@gB^|5sX-kaOO zCTQIg2@@eJM#oFu_VF?W0@X}ZcnBR$9E;iGUXtHO-cgJ5S{@L~s2*pvr8m_Zp5#sE zO@D(iN9wViY?_;_q<@&sTd6(qE+%z>!z{|REKSlPVBv)i+y2+xWRGEZO5O*;2?xi&s{y@`x;S#LF* ze{i71ca>K(|MsC6lo?#O^i#$Ez;(xEkRx)y<-PsJPi6V^_zxc+);Vz78`wY6o-1+# z9#n81n7u-BTc_J9(z}t>W=QeNsTu{%6|`#=^10@%WqnT$hHbyzYZ60z7wB@jZ~KvA zwS(l6B!>-g<|k}ltsygQou5BLN$>dl!$_;S19Uv{Gte3}=@bXz?>L}pH;KKH#dz15 z@2)e!hkY5vC~RHHulI77;?XBLqp|g{`82xP>|BQEFQP2;J6A?KJ$bt?+*w`t4)0r~ zmiIq*VvM5i#oFv)+h@@@VP@D?k>PG{Hx)STB4HeTy=jk13D}WFkIBS$6w8h9E3Iu$ z_7}z&&DmlH!Fro_AK-># zx>1kxZA;Fi?&F=UJ$*f<#b@FQ-qIFsJKM-)6fv^|HIQmFMJy z$EEK0z@OxjXSq75-a`_#2Ze5dp6`z;OV4aaiN--zoy^F=&!qt&&qi9_4hps)*WmJY zS7wRUIyL)?812&XD(XyNOOYmvC8EeB9!t^GZpHLE?)~Q#M%KN(EVHwWsBt}{T5O|; z0}i3nbvj5=w1L!dTg0{6NJ5ln@#N@bvsAgb2QVUU?5y zl$&$hqzaFo6#YoR?;oHQ! z1&z|{+I4MXX@pK`lul}ynH|0&1_?astZ&CmYU^txeh(y>HT7)khwTCZQ zTK$y3J172tf>xbkr;PCncbXjW@EoQtq>jXh=7v_j!;e{Tr^%SjhE!1oYbTrn=k2xX zMlsW^ITCV3_&qT{(4-428{Kg6N~Die?F*_sXJ(H-9pk54Aun~3=S+m46@J>6vt^!* z=XUM~)NF6$`2Ixqp%>!eHuZK7KE>Yri~DK{^JRS*ruLz#tIOM&#EQZn*m5F|TSOL| zoM8axm5Q^t5d#U-5wxf%e_3QPk9?f1?>W?RGrx2o% z^ZAhzz%O_l&bcs{-=%k1KL+|UoVSHmY9jd#s?b-y^mXq>=iReVH|?(eknXY684%&y zRxA&qIjNkgk*ay75;qca7_MKN(EORQ3d2Yj2#Gjap;GAc3?;bs$SaZYwoR%6p!9kI zmF~}IN_+8%GX$k=h9MDjLI*LZh+SY6?&OWx(KW65)9f9X!31v+Iej!HjN!YnP^PAB zQ3+6T;GbTJlrvBf ztuUR`r;Bz04PWL*+oo*B5MHy{V6tqpcucAoStN~(>@e$_+;clA7aU(MJEDIsg~=Ts z`37dFO{r~gP*o&pB%4Rc!am$rt3G2voO(_8~_PUz1;c=|< zcbD`w?2XpGosTQE>->fy-U{!2-D;prvJMl8!*#**^p)@25EDzN{`?WukMO6^S{hfE zcoV54ZR-5SnGUl*eh4})Oh~)*S>YEzr~MM5vJG;s`do72~4{0 z)N(t;YKvaXJVWIPw^^yuJE#qlR%MGTv3BkMQ`&bxHSulz218Nls7MJA1w=tWdJTd| z@4W^=dhfj#K@dU{P)ekCLhoIqDlPOt=p8~0ARzkkzva94uJ5(=-mEoiX3m;9bIzQz z_nh5+8^Ji8Mj(fEo0#;AviGv#m}Myp4=V55To>;{Z-!&K&%xr`=Tdd^H~e}w`<}=e zvuQ!a(&DuQn7Fse5w4|jAcTk0q-V!SrE`9|Uo&&)rU)jDYIV%V!q-HL9Pe8oaS(x~ zW6|4&n>-!O1>4;Wht_Y42!(G(t6tV2E(5E=%NH&OT~xcI{&r<^-O~}E0ds#e|n^X z+A$-GW{p*+Mc*REyK~SZQu$D9%;)H!OGhWN(xUZ#3mU5Co8Ey{)7}(l4@hYAk9Fk4 z%idbE2v6XP1+(wMU}CQ=+ot;*kyDX}K796S#>W1@_avj&Ke5G&p(wBNF~jKC)CPo| zd?BUon0DL10{=>v^Szd3yl#de%w*uRibP(YeQLUvq7Wc!S;Fgu^NotZjU9tveUqX| zI{1!HI<*w**PJu5=!gX5sw$z+3SNsKM(css*RuyYB2VaIs1?7;-m%a8`cle(J5RlD zzOL!F@gD&8q=Kz{@ly2Zz@>Om2B(A)&UdfOpf*o$tySp{KqC0cSDh*QpRDt5x|4sQ zpgy>)tQ+lvRsC)(|2?;d%`O+HYmc{AI4=tDZ0XlCP;zNf(s-b)aVC6Ft2f@lHY^m~LRmzR3FBTg}_%ibJ!W_0KC7VSa`_nPNS$ zUBByJcMYK_D^@&J#7F~E+Ytdy1NL9;hpdSoDfwPJC=+F~;aE&+e8X{wbyt^Y>b=7X738Ss8@JuDsMVHMWAJ(dWp)L`RW5RqjeQ!(e zNe!uEv0yaRuTE2RM_QM5Ds`x@1x!b{V#}N=0`onT)D{&}wj(XK|IBQWtfryC28BYO zE>gaLbGhEAV7h?7)U$EJw{v;e4OaLtk)9gRrzxIY?@R0j;|$fyCKteS8M1HZpMh#x zMZ5Z20giLCd@$q8_8#*L^?rH=tKj_FL$F}#xI>YqjS?oO!ZitzBtJ`t$K7Wrd?oqj z%e8nL14kV_C$gjlPfCC0$Mlicwy@6?ZzUwcVaAp&*oNPmBbLvoA~8y^5>ad)F`oKM zrAt*+at%hancwO@i=Q5|p;7E%7Rm8(E2uQ`70uwHZ#!INWvI2IxLL`Suxr}jpM z017&u)Kc#HSr9ir>@Pn6hMAU6O)%+B&=Fgu6r>7Gd9KzJ|VmDAqx0tFq|o?S%>Wwm#>&Pw8S${Qd)#Ye8;0@1z+oqxSy z9``eu%d6X9Nb0{61Isk$67gT~X+D4;*y2qO003%ku?N#t_M7tr@KQs;>ClyZ>%%9I zWxwH77jgKHEpd^YC))*o01u)r!_S`QOt}B5E_^wwa;;)GBzPd(wrP;-C%kG|Q z_x0&aym}ev5Qmqu()pD7ARJ~?tl+WF<+CySJ0(EPKK*I>kMP6$X<8A+c|@GbH`6nd6NWo-Mcb%NI+GxbYa4@inlWM2~M|9lqyK6gT}jh@Px(4@{IfGqsm_T8Wr;2nB&6uJwtbbp{=gz;V(Xkzd?_A6H*p%hx!9=8?ZNTbp z){Xcj^3ntUVIU(Sqa{AwbHHJt!7)xPcLi^kM0{Oy2D>;oxw=cP`UrH@#zU4AZwR%m z6(Q-<_DZCr$R1@oZt59|x7Pis58VOgL*V7m1t`phWVpWK4HwcYf@3?PM)qe;UVa<~ za0C=53V`|c7dQoG*%sGD#?~7=BK=JaaCn#PtI5diO?E+5`%n&=@Fs6&awbc|x}JmV*MJl1|>kIa(2oZLX4DxpD>lOThip(weC`MiusO;qO^T)@-u$QaM zv-Mts9;u`Ck)saYW(E7T+M=n#rO^der`Gn;7DN+mcd%jPcGu@yHFPQk>e3o&>L`v4 zX3zjT2&sS0C>9Td@qMHGW^uY+8(1st7-iik7xz-m^WDhmg*v4;FWFbg6NRlG)-gb} zB`o8Qy0hHUEw71GIz@J`!|xnB86jd~!pQ@8-%>!cL1S2}{0`&&mY2#6gDmQFX*ipe zEStG89dV=Z7B7jl_)v~hx{!mvRFm9;E7<8%=Z{Ndk8d*{fsk{dI8bxS^ zQBiuXuI^G94ZViu^h#pw7d=LwgRN+`H40urfTV>=NBmKDX>j4o^H=jmlyTJ#8Hxh! zsXzY!G=F4x&q*N4QSVS46ISI-27KPata zq*Rc*uerQV6dAX&(>*YB>$Toi;o`5jTDy>=;C^@betj91(~>c1o^etLYA;bVq3vdz zU1{;w#|$t?5@%!Gi?IcOVlxk|LA(TeRj0pi*QK2~yezTkNF^hkmze+`7Zv{g!JV{} zb6&IOL2YPnRT#Elv7&s@A#A9y73M98Eg_peS3#^d%@ujJAdc1dEGQ<`R6Y-+goJ^7 z;rOoNM#q zC6IrVSHZzO0;&}~xEp<{2t2T*m&PY64WR7woN!7F8FTG& zU4ubpHygML=jv0>YPIqn+va7%p75sY@{5c?qBw&Ytwly3OK0-(r6jWBbQ);-;(5-} zDHl(u*oSOH{iZCO#X=aTX1ZjtCVIabGOG)L+qCoCvuv>4GbSr~BBjOhN`blGS^rm) z`AoMdx(NF0Fhg!Kjs2N&UA@4m1TD{T1`eZ3|7-JG1$M`{yRc~%d@*j)3%$*sj*@lRNYlXZR!UOnlM zH)fo$ECO78xHSTyt6l3<+WKPf@I=-JtA_S=?G@ibc` z{yzE5Wgg-}RFxP$8&W7J)Ckoo_WCSi-|54GeW<`h|2T%QfB68XKtlkzfHWu3EM6P> zXlAb*FC0n~9Nw#hSK90e^L#zbO(~Gk2K1#;>c2NYX6(jCE_c{ZolFE`@7#BrF>mLAt!;KEjEO(Q2;lH?>+ z*PG0Z8HuckLS)q_;ecg>CiUTD?H%?C2DK+)7L;?13qs7c_8DwLQC*sdeRCxE=I0u(cuOfl`v-)j!Jk!5cX#OL+9G=Ii#%rO z4at|Wawu~-_Pnw%;L7Px$)qp9t8bMh9wuHWM&`^M8~TxGrp(#Jwt~;SU8nj)N*cK3 zPdnV5Cww=4c5!LXv#`|)-fn37EJL4#KMC2q)SfCZica>)+OKaK=%)~NU18rLt*FBk zNiWsieBHy>i@6Sn3;QTA>dRtk?ZL2c?rbh>AY?W(@05Y6NX7V<-f!5oR<`_9JxcmR z4HzyZt^f=XzouZy33bbB;WOMp+bTh1KetF54=^-8wKwjsf*aWXHH2$KM8xCe4WR{f zPRo7or zzwgF76}0%8yGFg7L`J`iomr9MZr}CCjOBcRz7flRN^H{Hbs0WaaZ}A>7dFpF z3;n^6!?E%TwlW9NmXK-N)+|T>U5umU)TR-$@@!S ze+sKd38suYIrzmK69`Dpw+(rPvmj`M#p3WoT)Q&K6>k|AcO+-1cGw6z)cLt|lgb1e zv7}JRvT)i9$!^<+;sS85ARO&A*pN94vZC$}fJ8x#Ig@TiSF1yiN>xJewhcDvR&k5n zFzAATiJyvB-=e74ow28F=9W1QpDBW1qDsZxpi>nyB1EP zgbF_Qs-NObPuS(tik!UtWqGqKIN{~PVE+wsTFlU`DmiykVIq+2XmsWxBis z{ey|>d4wa0>gSHCBca=8!r7cJh{Q<{E~VcImjwNNQiWv>y9)dp={U>+RL;`YT*wt% zbd_iB%G)qNIkic09jvUiMJ1U@fUNTi)i4oBt#+{Bpk8hIyl2g@V^L|7j;tL6s{urd zdC&=HD8-WCvko9~@=-aLL(tYSJXGH&T zG)B=tIRfLCzd|1M;@O$KD4Exj$G~S4jRZU$iCq(}V&o`-mlt&_QV*Rvj8+k~Gg^8Y zgU41y36T8rSlBrF2Uudk>^`@RzsiImF3MVcYG`oR%{-C@%KTlb+qEA+RLNG$QByKQ zXP2hXU1G=0?>f6>8la;Z1Ux;F{Moy38{KyVjv&~?*z ziL;D%mYtm}{sE*IQq!Xw)r}rC&2iZ7*;vt9jCJ}j9&a-z61^9{3#|IemD8=nC#IB9?hyyjaUNpEB4eLPfG^91S`_DWUEsr5zkJW&rJnh)JH{)RHTx!?Y0mA~?LKb(we6D%m}$TfV4u^Uc}RwtahK%Sojc&v|eN z-pCuf!$ecjaA5p!GqNVhw*K9TV&gr&y&~R+?jx5&x7Ox})zHZNJgE`2SMfp!_HT08`dL16D)^HQu&u?*@?u?5v2>jTKHDO^6 zv+ZeK2(yKS{_eaqz=@DhwBh{e$Pzd*&%C7|g$o_4=^UQvtKx3FbQvOPZW8|mroypZ z+W!ltd#KXLL^h5YCBtcI=c$UXBre6?B0pW~1fPo-L4<;b=w9B$>Fq`1J=+fDDV(#s z@(NjF7}ASO?pnPaGyJN?F}Ti7F;2td{^pJzJv+w}a0B5(yihoRA4GCQLu+WAlVNz1 zZlZq#>W4DkX2zkuvA)4*F)+k2frfLUSP_-!Me4HkR6?<%NUp$nB&vXf`a86z=h+@jw+6o23l&Ni{KHUK z#W0)5y2$bo6hfVk5**IIzhBW|NPF)CJ%P0GHn7!Y5YJ2^lf&OCkadsL;lAiWI+50Z zG-)6oF_g*bbe8w_=)Klh*Dgr~Q5lEG8PB3l`^f1jtr;nq>F=t2^*=rzR|yoc5p>Ag zte{iUy`TkV(|%X;MWuF@1(6j<{$YCQO!Vx+afmz<8{~A(xgOjlzrM|MW-(x-bK$~#q433uPUq{E)MukU?$@pYVM-x54cM_0C|3Wp8YxF*TZ#xaYyCYgH za*@`T;-H(5`=0X?dLrwJfM7bztGRdwFG> z16%G!4D`reX@n?>k%u$B5sbd&D6qlU8k1q}kv?+3%(gtOqd;#A2q?%SVN5z;tf_ur zDVu{T>@*FCuV_WHEyTTBe66zT@{%>qNiF-9&RN}^ji{XSEDKZWA4Br%G^3=eI3I34 z!yE|d&T28L-8flxW{|Yhmf01gzs91%#nA6L!kDZ6NGyN5NS+gO6sMxG(%PY?r@UA$ zHlCcx{!rKUM!F`@?Qv28HU)cdPjgxebcaTvXMS54Tz4hK@CT6FWu6pgufkJMkI#Ry zi@JOF(+(rU{gl^2E=j`97A|azYRn5EAG9&t-GWSnjiupkg?3LM38@sM(y(RVCF?J_ zlR$e09KhtMeTIw!pKgbJoIjdV#<(lBuP^@DEGPs>>Wr5)-feU6$?1q8b#8l`4&}$^ z0+T3xa!_4vp~h(g3<1=c`rR6(XK1y%md!_$jPY}qH;cxN5A{u)^;UbvvK;&Y2n)p* z;N|SLaM^}i>^^f!6Glko{ZxKeX(sO5A9^+I6j^vvqmrwN^1aGPsVNwjpU$lDvKIFC z2Q7dYj|X56g$}lyvzdN%YWnjXsbAwF(maAD>PK>u_Pmkxt1Y?$l|0DX>6q~l-_zxg z1-iFqD#ch#&9U?s!pb5`X*_Uh6u?_mOx7jvkyp;EbFsowY~*mcms0ZVE=oUZ#>w?B z0X+3D0emz^W&2VvO340LL?r)wVXU#V-alZD}FRCuJ@aCdUTO2w( zr!?R9@`*N?J3*(+dq86x(xx#GiW$LU4f^;Xrp3BC7UkJiT|pj*U=xpAPGb3Jad8Cj zzjbSR+dHvFDG@*XD6^lr_M$jdsx0v<&iVaBX;?!H-Mq9}e<3~E`{4W4kn?`7{#ETS zoSuG1?mU5RuaL2z$&kOGbV8bAxv2R&xWwH}Xm)ss8S<_5J*I1a#GVnB!8KtdncF<| z#)^BvL$Y%w(UDkMuK@vHG7eyvAD=-jTJ)!cEE`1eU-ME>bIrAg5pxzaLT{r`4boq8 z-)&VSd$WDFB80*KjkK7xUimAYS?)&27dy02*)xPk1AD^kv)9KhZ2a;w(SGg6nE}$@ zY1!&h)ORo~7;@#2S+*AXSXWC}VRQeq@V&*;Xg>IbKXuM5Vg{3;7+IK7w;6V(xL9NO z3bVX@LU>J15}QCK2~G$Zymp`45FD;&C2dIR@LSQ6XE(mgBLSy1H?91d;-5|JshF2U zD!0#|_nsNEe<99^#6@nQ7ggCpMGj0B)4y!pWXBIX{+`;M-;VlOK!n44Q+;WMN3`SY zj`PH0;K|1jD*6LUzMG6^%0DJ`a7}Z6lt)DLxqBa~+UF-OSG=!%fi~CBQBl(!XN53` zkoxB_KRR?JqFt5*ra3?GcC56ya+XG|hF!{$qFS;KC+6Rq*T{VjI+r#icj6lb9BT(; zfg8e0N-gq{bbjd+()#0SO03$6X>MY3q>R&RVL)^vB;1fc@%VZ)ClqO{l&JvuH2N0P@-}hJ zBtw|#r^TCwGdB;>cy~(y{LI6JO&6>$W&DApwwTo{7>1UB_QOVWZZglI@AH&cZYsQ`mVTj|l?Ce5`BOSf+;01M z6rQXx-XXr3MNq8T2-*P%YUB6~*Cyyj&e)uJO?T%%pW@Z($mMG3kVm&1l&=el!@y$r z@Z->d1iP#l2a`sdqhXhla_VaqZXVBJn}DP?GESRO057jv(5*dD`6+E3$25(z1D0Nn z$EG67-Sn>U1@=y`7yZXfc6#RVZsSonVW> zPGN+=fhjF(1l1iN8*W-z9%EHz9vTHTMkz|j4cj&e$_cWGH%T+oylETRKS+>sa-VH5 z00|ctgv;*`Ke+0s>9=ptL~qbfkwplVn?gbYBH=zX1b9*&bts619{GY!p?5bRx@H0N zBTAuzclPvBxSP3=xoHzpRT17>US83;n;sKm?@;+T37#3*VHF#8vPwqiLqd|t2(2GM z=ewfLOSwfJx5$S1E)y=TrZ>yLrlr2z(V>O_Tb-j74 zITK1V`XqHdbXJbcz8vSQ;6xYG3$<;rEiJJrV}3C(ZVyO>ufYQzj*g#N8g?wzwL(`< z?aCUAwi`DBQh*+vgJ6D=^>w&J1mPgT!}seClm2HJLxEAT@51~Pb`0bA>N&DrC*t(j zi}oc2oOngSYmHHyGZyCX+mIY*PnwylC&LH_Si_qVG>iZIxDqWo>0yu-!`xN8&C|Q? zW*J^pFBQiOJUyMeXGEWV<1Egky#K?QFl%M73vgR_ooCns^7#C_&7_~3BS$`)r%OqY z-R@`F-3uD;M*74Ji#n>6F2Yk0;ggc>ob;%4sIh^nu{S;I9d3JnyvLHDK;gUnbDQ1R zk)-T0N2Se{1^Z{~1*r&)=B7a!{bLHIdtkT-*ZvTY!vUWOl&%bC`-;=hcWpR$EHM3y zjK@mrT&-%Uq+@*x#!=Jh*IEIA0Ul27JEr$;NNyd-o9!8Hc6$33G&3bFfG)DZ4EHR`qRd;;mF#J*HuaQuy*d*UwE7Im^MrK} zgAE%2ReN#@6^JzYICw43WR0eYExJ9CnI`C|Eemxci2Skit4VtB+>OLAHm6Q&TET$7 zRx~%)o6iNZPI%;`x{bD%<6A=Iwkpk%WlnpZF6=x>9rw&&J(29%&iC#A_;W<~=#s@E zGc%h_K(tJ5VV`$Od+~X_Zc@Kze3H)+tuuw&owL~I59<2$O9exHf?&3eaZ@bF>WZ#) zp++JSpK!nR`f7AMQU8 zBLq{Wj9rJ(EV9uItcF~lk=7uV#*=dAweIy=N@O``_6av593(0CyRWFFXZy1Ak*!)) zi(GEh>OEo^9LEWL?Fg%jVrR>sXl<>2Ew$(Os%xY; z=T0@SS!p@pQM`KiU0U)_u17=54=B$e~n@J zi{h<~$!mF}p&iQJNoeSykVlJf_UD>G?wmNHct#UFqaJ|oGD`+$36ru>;xiNuuPoww8c4NIY4 zNW&13k5p%*R2k@3KR(UE}r`zEEkK$r9niWaLW$qKX7D>cttSw{_$n>o4 zNmabMt_j*b{d1+`bH}1xY0zeBn%Iz6K+-Z%(Np4CH+`l8zzAA^&Ffk4&Z^OhhLOoE zfnfX8Xy^E%N<*$!ef{%5kx!6e8ylCC`FPd}8m#s7ZGT6U3Dk1@?Tj_fQcj;V2dZ0( zN?|6uHcI}^+B8~V>G*j!W;oOFR_d;)uO|nZ0LlSd`$BtSf+Tyf^20jvR90{MNlJ~@ z&ajYUtw#G{QBG(A&uHIixGb+LN++koS7WgDcL)H zyb+6mlVT2YH_&Wj!o2+GjCXysHFJ?7aX+jj%D1X513NJ?^RFj0dhI-pXP?%feBi61 zTh_57&Sv5OqW27Qj|_mh4o$!diywZDI9JWfly|j3@#*IBx;?IlB%`Sj&KZF-Qqp(v zv?m!%Omcl(eZr53wDhtoTcUDrS_VBFl6G%D>otC!Hk9DhJ_=*bG(D3k@3-da&1zt% zn5!Mmk#<3t|0Yjm)0lZ7#LLSowFrb8Zq}{A@rbeaV@p5S&flI8Mb#L6e4-??DCxab zX!AS;eHfo8kst*rAXp#Hc!i`gj2mo89bcBdVJ$p<4MlJMM8$JzJZVBm`s_J*R}{!d$iWX@9-7 zs!g)%>&a~#vcbOv?cf8Qu5_X1wZy#*NrHnWeRtEGm)2uOfGyN><%`&E09wPq5{V^=NCII!Z6z(mi8L7%g{kJnB9Q~&HoJ3O zV7Q^DL{>ElhfP((J3cK)iAy@?|E9IGedCs~lA$*)thS0lO?o^oaiO!k@b?gFyd5t6 zj`Q!2!L~t>`$exb_pjx8%nOS>wOabs#1E{tjF_9V7KLd5=4>H4;(@fBJw^c>0w)R% zeZ`aXK80vsr*psBCl_2_rQKm`y?CQIw7F93zTgvm4m-|iRFu4Bae=P|ET!#}v2Y{~ z^ss2M6&i*qohx~Mf4W`AH8M?o0#;UD>|$<(su+BFbV|x+mC3YWXbXW1V)gg8G3lr@J>D(%0Iz zYweP#S*_yczWD>!mW|TPD~C(hiE$_Kt4xy>Y+c!@HHxu6dp~TxXs4xtisAXF81l!y zx$gl6OD0_f=Dko6+=9-@kES@1Ua|TmW35rTDHCGCC5=l5V`Dl}IxN>UVSasWBu?fc z;vyX3_SanXj_ea^1OZ5-E;3Cty$}pCG=3qS9>k{rSi=FazAAW$zjM*FM@YGJHKO&p4yF>r&M>&O|X9!=o*nr`u{ps&_4&nr_xyFi}kKU9rIOUW%THLq7o4(cW%!5ewe~(X+ zwUCG&#?!|3I-O7L`~(Hil4AxCh^Rbz7VopzrJCMZ$I7>3j!!nE-6HpnEFHz6(t|~N zMjX8Imnz^eHNW)zRvF|rDTBh>yw7KZk9VFF`%5b$g*QgJ) zo}M3O(fPztjC61vkgBuFIecx2`Q1%Y~UW0yb_(D%DUH*mt)yZIFIR$EC!} zn2DCiNBrcZwgnO(!ofQ~Eq@i^3nSdg0YjX7h56f}-%BGbusxE+`s05!< zWd3Aet(^sN=pTP?d!OMwNfxq4R>fi_m|X7mPtgNlBTC{q#)*+Ue_7aj{o;X@ha;-} z!v%wMVPzu?=Y=S!hqx5lG`Pmb*%RG&G>GrA{-V-R!L)u?>Gk<{G)U*87CDy)k+T`m zC!7l?hlCwh%=uN!OhY*^q^VzD=vc=_#Xi&N1J6}P7P z&UOt=MaD}87%lUoxI@>C1y#Huui`nQBVp)}^>fE2!daq7WS!hzvD4$phZ-Au4##xA1gSe>C-S(SkNhfX z{fx^O17}{L2>KTYsq`J-xL0y_Wy=TfK!6~y&AlT z*OIR9h8_cOHMzbU!2vt`?X`HykHP;)w2SxR-#ry@t@_^rJp7~4;Q#PQ{%2SI-%BHy z{>)iAS-5++S(-WC#hp37wY$qB2z~+n>qJ}}%q?r{;9=>8J35$oSiZJ2cebzub1Pdq zS$o)kh4^^E5)ya+@w89ol)i@ZJsy&v&NqqH`IZglY_JF)nkq;*d$(AXf_#YJ@6HH! z@A(Z}D2RMjjpD>`$Ltr(D1wi~^b2v_o1td`SAq-VDvt#+Lf)o4zR%b}!ekP0SolE( zti{O>-}}=dUt+3_TqrlS`Ens-=I7Hy&*iMybZy)Bnd68Y5Hpw{Y_qhP| zl)`Q8Co5vt3*__(R^$lQ+8qt0nUBI$Q zy#<=ukXt?4?B8!xk05zYRmisT7R)J9@c12x2oBziDc{q}yPlS-lG6lcPC<{S^HgB7?IHLrus9x20s~N*mufz!YZtVOctZM3 zJAZlGZF-=1a6BeM$zc6OR>D(~yJ);K<>RyBmG?j5I6j0y4}B+TtmPBe6(oubAKNJ= zq)H<9Au?RrB20q45{qtDXZhNX=kJf}=zNLuipr1%jDjqaB9XkJIp3nA=`<*Ep0~Xc zSNf@y^ksRJ6yaF7Dd^L9*+9jll53Z7Gc}k>8^KjdW?Ehunp$)5Yhbx7Z#C8w?CGsplv+e$ za(S22(gxgQ$H6kxhSt=0X~SX(%JncV$$phfA*PVi@W|O&6I06K&_z~JW*wq=6f9|5 z?prw3iC0CedDqL5wCPvR>ciiIU*7z88WH+88j*H(^00LBa0l}U<4QHb+$xq9wq~!K zeZWSz>la`F5kaspKOYzh=2kaz!`%ty6Z!j%nwIX)o^Ixr?%=;@O~%JVPRj#FXMekr z;{)U9>#zDGByjYHd&l33W%+&s-a{@xOIumJ8EUl$xvtK%N|i=6+-1^(*G{|y)56?pLhU{`OthOjKUHS+7of|dh&`_g^Q~UW?^QHC zW$d1k?>54F41ZNQ8ZG>6Q?nCNsLKCgK;pxNS?hY{c$JOuXWe4b7)`|D`|hV@N%l7~ zzD&If*t(_1^@ny z^))T6{)>GI^ZqZ`>)+WdZh##BJ};!59XuVK{x($VZn&vs?&0hP=J|{Fg1Pl@BhLfo z!|k})rDf}93Fdu)8}HX(BXO&@e3oy`c-{({3-iAavJx@l7kK+tL_~yNK=1{>5RbXU z|M`x;Cd|M1yZKuHF5Dt=?t=DH2#F0Dg9@U>)8kNMHeB(|M}|y|9@<_cAB|) V__$eG-R0#Gyvxceqb7Uze*k1N`Xm4V delta 29929 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�{UanZGMuY_M2GL2?61w@o& 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

-

Dataset - - -

+
+

Dataset + + +

-

Feature 1 - - -

+

Feature 1 + + +

-

Feature 2 - - -

-
- - -
+

Feature 2 + + +

+
+ + +
+
+
+

+ Target Accuracy: +

-

- Target Accuracy: -

+

+ Current Accuracy: +

-

- Current Accuracy: -

+

+ Maximum Accuracy: +

-

- Maximum Accuracy: -

+

+ hellloooo +

-

- hellloooo -

+

+ Class: +

-

- Class: -

+

+ F1: +

-

- F1: -

- -

- F2: -

+

+ F2: +

+
-
- +
+ table display
\ No newline at end of file diff --git a/SRIP/Codes/exp1.js b/SRIP/Codes/exp1.js index 95afa841..b48ad7cc 100644 --- a/SRIP/Codes/exp1.js +++ b/SRIP/Codes/exp1.js @@ -1,6 +1,7 @@ window.onload = function() { var series1 = []; //stores class 1 points and plots on chart var series2 = []; //stores class 2 points and plots on chart + var dataset = 0; var chart = new CanvasJS.Chart("chartContainer", { title: {text: "Chart"}, axisX:{ @@ -25,7 +26,16 @@ window.onload = function() { }] }); - function plotfunction(){ + function load(){ + dataset = document.getElementById("dataset-button").value; + document.getElementById("select-1-button").disabled = false; + document.getElementById("select-2-button").disabled = false; + document.getElementById("plot-button").disabled = false; + document.getElementById("test-button").disabled = false; + document.getElementById("target").textContent = "Target Accuracy: " + dataset; + } + + function plot(){ var xValue = 1; var yValue = 2; series1.push({ @@ -35,8 +45,10 @@ window.onload = function() { chart.render(); } - var plo = document.getElementById("plot"); - plo.addEventListener("click", plotfunction); + var lo = document.getElementById("load-button"); + lo.addEventListener("click", load); + var plo = document.getElementById("plot-button"); + plo.addEventListener("click", plot); /*var addClass2 = document.getElementById("add-class-2"); addClass2.addEventListener("click", addDataPointsAndRender2); var addClass1 = document.getElementById("add-class-1"); diff --git a/SRIP/Quiz/JSONquestions.js b/SRIP/Quiz/JSONquestions.js index 7c4b6fec..da3fae6f 100644 --- a/SRIP/Quiz/JSONquestions.js +++ b/SRIP/Quiz/JSONquestions.js @@ -1,4 +1,29 @@ -var questions = []; +var questions = [ +["Which of the following distance metric can not be used in k-NN?", "Manhattan", "Tanimoto", "Mahalanobis", "All can be used", "4"], +["Which of the following machine learning algorithm can be used for imputing missing values of both categorical and continuous variables?", "K-NN", "Linear Regression", "Logistic Regression", "SVM", "1"], +["Which of the following distance measure do we use in case of categorical variables in k-NN?", "Euclidean Distance", "Manhattan Distance", "Hamming Distance", "None of the above", "3"], +["The strength (degree) of the correlation between a set of independent variables X and a dependent variable Y is measured by", "Coefficient of Determination", "Standard error of estimate", "Coefficient of Correlation", "All of the above", "4"], +["In k-NN what will happen when you increase/decrease the value of k?", "The boundary becomes smoother with increasing value of K", "The boundary becomes smoother with decreasing value of K", "Smoothness of boundary doesn’t dependent on value of K", "None of these", "1"], +["Which of the following function is used for k-means clustering ?", "k-mean", "heatmap", "k-means", "sklearn", "3"], +["Which of the following clustering requires merging approach ?", "Naive Bayes", "Partitional", "Hierarchical", "None of the Mentioned", "3"], +["What is the minimum no. of variables/ features required to perform clustering?", "0", "1", "2", "3", "2"], +["Is it possible that Assignment of observations to clusters does not change between successive iterations in K-Means", "Yes", "No", "Can't say", "None of these", "1"], +["Feature scaling is an important step before applying K-Mean algorithm. What is reason behind this?", "In distance calculation it will give the same weights for all features", "You always get the same clusters. If you use or don't use feature scaling", "In Manhattan distance it is an important step but in Euclidian it is not", "None of these", "1"], +["Which of the following are the high and low bounds for the existence of F-Score?", "[0, 1]", "(0, 1)", "[-1, 1]", "(-1, 1)", "1"], +["The algorithm that need to access a table several times during execution is", "Nearest neighbor search", "n-table scan algorithm", "Hybrid algorithm", "Zoom scan algorithm", "2"], +["K-nearest neighbor is one of the", "OLAP tool", "Learning technique", "Data warehousing tool", "Purest search technique", "4"], +["The complexity of data mining algorithm is represented by", "log n", "n log n", "2n log n", "n", "2"], +["A trivial result that is obtained by an extremely simple method is called", "Naive prediction", "Correct prediction", "Accurate prediction", "Wrong prediction", "1"], +["In K-nearest neighbor algorithm K stands for", "Number of total records", "Number of neighbors that are investigated", "Number of iterations", "Randon number", "2"], +["The information on two attributes is displayed in ________ in scatter diagram", "Visualization space", "Scatter space", "Cartesian space", "Interactive space", "3"], +["Which of the following option is true about k-NN algorithm?", "It can be used for classification", "It can be used for regression", "It can be used in both classification and regression", "None of the above", "3"], +["Which of the following statement is true about k-NN algorithm?", "k-NN performs much better if all of the data have the same scale", "k-NN works well with a small number of input variables (p), but struggles when the number of inputs is very large", "k-NN makes no assumptions about the functional form of the problem being solved", "All of the above", "4"], +["If you are using Multinomial mixture models with the expectation-maximization algorithm for clustering a set of data points into two clusters, which of the assumptions are important", "All the data points follow two multinomial distribution", "All the data points follow n Gaussian distribution (n>2)", "All the data points follow two Gaussian distribution", "All the data points follow n multinomial distribution (n>2)", "1"], +["Which of the following is/are valid iterative strategy for treating missing values before clustering analysis?", "Nearest Neighbor assignment", "Imputation with mean", "Imputation with Expectation Maximization algorithm", "All of the above", "3"], +["Which of the following algorithm is most sensitive to outliers?", "K-means clustering algorithm", "K-medians clustering algorithm", "K-modes clustering algorithm", "K-medoids clustering algorithm", "1"], +["When you find noise in data which of the following option would you consider in k-NN?", "I will decrease the value of k", "I will increase the value of k", "Noise can not be dependent on value of k", "None of these", "2"], +["Which of the following would be the leave on out cross validation accuracy for k=5?", "11/14", "10/14", "9/14", "8/14", "2"], +["Suppose you want to predict the class of new data point x=1 and y=1 using eucludian distance in 3-NN. In which class this data point belong to?", "+ class", "- class", "Can't say", "None of these", "1"]]; function shuffle(array) { var currentIndex = array.length, temporaryValue, randomIndex; From 4de47510413b5dec2051c5cfbe29f92a87d09aa2 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 13 Jul 2019 16:31:07 +0530 Subject: [PATCH 156/166] code addition --- SRIP/Codes/exp1.html | 15 +++++++------ SRIP/Codes/exp1.js | 50 +++++++++++++++++++++++++++++++------------- 2 files changed, 43 insertions(+), 22 deletions(-) diff --git a/SRIP/Codes/exp1.html b/SRIP/Codes/exp1.html index 5971f0b8..ad4b9403 100644 --- a/SRIP/Codes/exp1.html +++ b/SRIP/Codes/exp1.html @@ -12,12 +12,12 @@
-
+
-
+

Dataset - +

Feature 2 @@ -51,11 +51,11 @@ - +

- - + +
@@ -90,8 +90,7 @@
-
- table display + \ No newline at end of file diff --git a/SRIP/Codes/exp1.js b/SRIP/Codes/exp1.js index b48ad7cc..576f4a2d 100644 --- a/SRIP/Codes/exp1.js +++ b/SRIP/Codes/exp1.js @@ -1,6 +1,12 @@ window.onload = function() { - var series1 = []; //stores class 1 points and plots on chart - var series2 = []; //stores class 2 points and plots on chart + var t1dataset = [["Class", "ImageID", "Contrast Ratio", "Aspect Ratio", "Perimeter", "X-Symmetry", "Y-Symmetry", "Holes"], + [0, 2, 0.19, 0.092, 87, 131, 137, 2], + [0, 22, 0.204, 0.095, 86, 143, 133, 2], + [0, 35, 0.215505761659127, 0.0847880299251871, 77.0, 113.0, 119.0, 2.0], + [0, 38, 0.236594959162299, 0.0897755610972568, 73.0, 132.0, 130.0, 2.0], + [0, 52, 0.278957873167097, 0.0972568578553617, 93.0, 149.0, 125.0, 2.0]]; + var series1 = []; + var series2 = []; var dataset = 0; var chart = new CanvasJS.Chart("chartContainer", { title: {text: "Chart"}, @@ -33,11 +39,37 @@ window.onload = function() { document.getElementById("plot-button").disabled = false; document.getElementById("test-button").disabled = false; document.getElementById("target").textContent = "Target Accuracy: " + dataset; + document.getElementById("table-id").style.visibility = "visible"; + var table = document.createElement("TABLE"); + table.border = "1"; + table.width="100%"; + + //Get the count of columns. + var columnCount = t1dataset[0].length; + + //Add the header row. + var row = table.insertRow(-1); + for (var i = 0; i < columnCount; i++) { + var headerCell = document.createElement("TH"); + headerCell.innerHTML = t1dataset[0][i]; + row.appendChild(headerCell); + } + + //Add the data rows. + for (var i = 1; i < t1dataset.length; i++) { + row = table.insertRow(-1); + for (var j = 0; j < columnCount; j++) { + var cell = row.insertCell(-1); + cell.innerHTML = t1dataset[i][j]; + } + } + + var dvTable = document.getElementById("table-id"); + dvTable.textContent = ""; + dvTable.appendChild(table); } function plot(){ - var xValue = 1; - var yValue = 2; series1.push({ x: xValue, y: yValue @@ -49,14 +81,4 @@ window.onload = function() { lo.addEventListener("click", load); var plo = document.getElementById("plot-button"); plo.addEventListener("click", plot); - /*var addClass2 = document.getElementById("add-class-2"); - addClass2.addEventListener("click", addDataPointsAndRender2); - var addClass1 = document.getElementById("add-class-1"); - addClass1.addEventListener("click", addDataPointsAndRender1); - var addClass2 = document.getElementById("add-class-2"); - addClass2.addEventListener("click", addDataPointsAndRender2); - var addClass1 = document.getElementById("add-class-1"); - addClass1.addEventListener("click", addDataPointsAndRender1); - var addClass2 = document.getElementById("add-class-2"); - addClass2.addEventListener("click", addDataPointsAndRender2);*/ }; \ No newline at end of file From d2a5c8d3d40747749bb701ea07ca4344ed8f3cf1 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 13 Jul 2019 16:35:44 +0530 Subject: [PATCH 157/166] code addition --- SRIP/Codes/exp1.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/SRIP/Codes/exp1.js b/SRIP/Codes/exp1.js index 576f4a2d..3dfe7840 100644 --- a/SRIP/Codes/exp1.js +++ b/SRIP/Codes/exp1.js @@ -1,4 +1,5 @@ window.onload = function() { + var i = 0; var t1dataset = [["Class", "ImageID", "Contrast Ratio", "Aspect Ratio", "Perimeter", "X-Symmetry", "Y-Symmetry", "Holes"], [0, 2, 0.19, 0.092, 87, 131, 137, 2], [0, 22, 0.204, 0.095, 86, 143, 133, 2], @@ -42,25 +43,22 @@ window.onload = function() { document.getElementById("table-id").style.visibility = "visible"; var table = document.createElement("TABLE"); table.border = "1"; - table.width="100%"; + table.width = "100%"; - //Get the count of columns. var columnCount = t1dataset[0].length; - - //Add the header row. + var row = table.insertRow(-1); - for (var i = 0; i < columnCount; i++) { + for (i = 0; i < columnCount; i++) { var headerCell = document.createElement("TH"); - headerCell.innerHTML = t1dataset[0][i]; + headerCell.textContent = t1dataset[0][i]; row.appendChild(headerCell); } - - //Add the data rows. - for (var i = 1; i < t1dataset.length; i++) { + + for (i = 1; i < t1dataset.length; i++) { row = table.insertRow(-1); for (var j = 0; j < columnCount; j++) { var cell = row.insertCell(-1); - cell.innerHTML = t1dataset[i][j]; + cell.textContent = t1dataset[i][j]; } } From fadcc743d7b7d15362d6e022f8efc99f722af610 Mon Sep 17 00:00:00 2001 From: prekshap24 Date: Sat, 13 Jul 2019 22:25:55 +0530 Subject: [PATCH 158/166] code addition --- SRIP/Codes/exp1.html | 36 +++++----- SRIP/Codes/exp1.js | 166 ++++++++++++++++++++++++++++++------------- 2 files changed, 135 insertions(+), 67 deletions(-) diff --git a/SRIP/Codes/exp1.html b/SRIP/Codes/exp1.html index ad4b9403..986d4827 100644 --- a/SRIP/Codes/exp1.html +++ b/SRIP/Codes/exp1.html @@ -29,29 +29,27 @@

Feature 1 - + + + + + + + -

Feature 2 - + + + + + + + -

@@ -90,7 +88,7 @@
-
+ +
+
+
+
+
+
+