/*
 Highmaps JS v7.1.3 (2019-08-14)

 (c) 2011-2018 Torstein Honsi

 License: www.highcharts.com/license
*/
(function (O, K) {
    "object" === typeof module && module.exports ? (K["default"] = K, module.exports = O.document ? K(O) : K) : "function" === typeof define && define.amd ? define("highcharts/highmaps", function () {
        return K(O)
    }) : (O.Highcharts && O.Highcharts.error(16, !0), O.Highcharts = K(O))
})("undefined" !== typeof window ? window : this, function (O) {
    function K(c, h, x, E) {
        c.hasOwnProperty(h) || (c[h] = E.apply(null, x))
    }

    var D = {};
    K(D, "parts/Globals.js", [], function () {
        var c = "undefined" === typeof O ? "undefined" !== typeof window ? window : {} : O, h = c.document,
            x = c.navigator && c.navigator.userAgent || "",
            E = h && h.createElementNS && !!h.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGRect,
            G = /(edge|msie|trident)/i.test(x) && !c.opera, B = -1 !== x.indexOf("Firefox"),
            F = -1 !== x.indexOf("Chrome"), I = B && 4 > parseInt(x.split("Firefox/")[1], 10);
        return {
            product: "Highcharts",
            version: "7.1.3",
            deg2rad: 2 * Math.PI / 360,
            doc: h,
            hasBidiBug: I,
            hasTouch: !!O.TouchEvent,
            isMS: G,
            isWebKit: -1 !== x.indexOf("AppleWebKit"),
            isFirefox: B,
            isChrome: F,
            isSafari: !F && -1 !== x.indexOf("Safari"),
            isTouchDevice: /(Mobile|Android|Windows Phone)/.test(x),
            SVG_NS: "http://www.w3.org/2000/svg",
            chartCount: 0,
            seriesTypes: {},
            symbolSizes: {},
            svg: E,
            win: c,
            marginNames: ["plotTop", "marginRight", "marginBottom", "plotLeft"],
            noop: function () {
            },
            charts: [],
            dateFormats: {}
        }
    });
    K(D, "parts/Utilities.js", [D["parts/Globals.js"]], function (c) {
        function h(f, b) {
            return parseInt(f, b || 10)
        }

        function x(f) {
            return "string" === typeof f
        }

        function E(f) {
            f = Object.prototype.toString.call(f);
            return "[object Array]" === f || "[object Array Iterator]" === f
        }

        function G(f, b) {
            return !!f && "object" === typeof f && (!b ||
                !E(f))
        }

        function B(f) {
            return G(f) && "number" === typeof f.nodeType
        }

        function F(f) {
            var b = f && f.constructor;
            return !(!G(f, !0) || B(f) || !b || !b.name || "Object" === b.name)
        }

        function I(f) {
            return "number" === typeof f && !isNaN(f) && Infinity > f && -Infinity < f
        }

        function y(f) {
            return "undefined" !== typeof f && null !== f
        }

        function v(f, b, a) {
            for (var g in f) Object.prototype.hasOwnProperty.call(f, g) && b.call(a || f[g], f[g], g, f)
        }

        c.timers = [];
        var t = c.charts, r = c.doc, l = c.win;
        c.error = function (f, b, a) {
            var g = I(f) ? "Highcharts error #" + f + ": www.highcharts.com/errors/" +
                f : f, e = function () {
                if (b) throw Error(g);
                l.console && console.log(g)
            };
            a ? c.fireEvent(a, "displayError", {code: f, message: g}, e) : e()
        };
        c.Fx = function (f, b, a) {
            this.options = b;
            this.elem = f;
            this.prop = a
        };
        c.Fx.prototype = {
            dSetter: function () {
                var f = this.paths[0], b = this.paths[1], a = [], g = this.now, e = f.length;
                if (1 === g) a = this.toD; else if (e === b.length && 1 > g) for (; e--;) {
                    var d = parseFloat(f[e]);
                    a[e] = isNaN(d) ? b[e] : g * parseFloat("" + (b[e] - d)) + d
                } else a = b;
                this.elem.attr("d", a, null, !0)
            }, update: function () {
                var f = this.elem, b = this.prop, a = this.now,
                    g = this.options.step;
                if (this[b + "Setter"]) this[b + "Setter"](); else f.attr ? f.element && f.attr(b, a, null, !0) : f.style[b] = a + this.unit;
                g && g.call(f, a, this)
            }, run: function (f, b, a) {
                var g = this, e = g.options, d = function (a) {
                    return d.stopped ? !1 : g.step(a)
                }, q = l.requestAnimationFrame || function (a) {
                    setTimeout(a, 13)
                }, m = function () {
                    for (var a = 0; a < c.timers.length; a++) c.timers[a]() || c.timers.splice(a--, 1);
                    c.timers.length && q(m)
                };
                f !== b || this.elem["forceAnimate:" + this.prop] ? (this.startTime = +new Date, this.start = f, this.end = b, this.unit =
                    a, this.now = this.start, this.pos = 0, d.elem = this.elem, d.prop = this.prop, d() && 1 === c.timers.push(d) && q(m)) : (delete e.curAnim[this.prop], e.complete && 0 === Object.keys(e.curAnim).length && e.complete.call(this.elem))
            }, step: function (f) {
                var b = +new Date, a = this.options, g = this.elem, e = a.complete, d = a.duration, c = a.curAnim;
                if (g.attr && !g.element) f = !1; else if (f || b >= d + this.startTime) {
                    this.now = this.end;
                    this.pos = 1;
                    this.update();
                    var m = c[this.prop] = !0;
                    v(c, function (a) {
                        !0 !== a && (m = !1)
                    });
                    m && e && e.call(g);
                    f = !1
                } else this.pos = a.easing((b -
                    this.startTime) / d), this.now = this.start + (this.end - this.start) * this.pos, this.update(), f = !0;
                return f
            }, initPath: function (f, b, a) {
                function g(a) {
                    for (k = a.length; k--;) {
                        var b = "M" === a[k] || "L" === a[k];
                        var d = /[a-zA-Z]/.test(a[k + 3]);
                        b && d && a.splice(k + 1, 0, a[k + 1], a[k + 2], a[k + 1], a[k + 2])
                    }
                }

                function e(a, b) {
                    for (; a.length < p;) {
                        a[0] = b[p - a.length];
                        var d = a.slice(0, n);
                        [].splice.apply(a, [0, 0].concat(d));
                        w && (d = a.slice(a.length - n), [].splice.apply(a, [a.length, 0].concat(d)), k--)
                    }
                    a[0] = "M"
                }

                function d(a, b) {
                    for (var d = (p - a.length) / n; 0 <
                    d && d--;) u = a.slice().splice(a.length / C - n, n * C), u[0] = b[p - n - d * n], z && (u[n - 6] = u[n - 2], u[n - 5] = u[n - 1]), [].splice.apply(a, [a.length / C, 0].concat(u)), w && d--
                }

                b = b || "";
                var c = f.startX, m = f.endX, z = -1 < b.indexOf("C"), n = z ? 7 : 3, u, k;
                b = b.split(" ");
                a = a.slice();
                var w = f.isArea, C = w ? 2 : 1;
                z && (g(b), g(a));
                if (c && m) {
                    for (k = 0; k < c.length; k++) if (c[k] === m[0]) {
                        var H = k;
                        break
                    } else if (c[0] === m[m.length - c.length + k]) {
                        H = k;
                        var A = !0;
                        break
                    } else if (c[c.length - 1] === m[m.length - c.length + k]) {
                        H = c.length - k;
                        break
                    }
                    "undefined" === typeof H && (b = [])
                }
                if (b.length &&
                    I(H)) {
                    var p = a.length + H * C * n;
                    A ? (e(b, a), d(a, b)) : (e(a, b), d(b, a))
                }
                return [b, a]
            }, fillSetter: function () {
                c.Fx.prototype.strokeSetter.apply(this, arguments)
            }, strokeSetter: function () {
                this.elem.attr(this.prop, c.color(this.start).tweenTo(c.color(this.end), this.pos), null, !0)
            }
        };
        c.merge = function () {
            var f, b = arguments, a = {}, g = function (a, b) {
                "object" !== typeof a && (a = {});
                v(b, function (d, e) {
                    !G(d, !0) || F(d) || B(d) ? a[e] = b[e] : a[e] = g(a[e] || {}, d)
                });
                return a
            };
            !0 === b[0] && (a = b[1], b = Array.prototype.slice.call(b, 2));
            var e = b.length;
            for (f =
                     0; f < e; f++) a = g(a, b[f]);
            return a
        };
        c.attr = function (f, b, a) {
            var g;
            x(b) ? y(a) ? f.setAttribute(b, a) : f && f.getAttribute && ((g = f.getAttribute(b)) || "class" !== b || (g = f.getAttribute(b + "Name"))) : y(b) && G(b) && v(b, function (a, b) {
                f.setAttribute(b, a)
            });
            return g
        };
        c.syncTimeout = function (f, b, a) {
            if (b) return setTimeout(f, b, a);
            f.call(0, a)
        };
        c.clearTimeout = function (f) {
            y(f) && clearTimeout(f)
        };
        c.extend = function (f, b) {
            var a;
            f || (f = {});
            for (a in b) f[a] = b[a];
            return f
        };
        c.pick = function () {
            var f = arguments, b, a = f.length;
            for (b = 0; b < a; b++) {
                var g =
                    f[b];
                if ("undefined" !== typeof g && null !== g) return g
            }
        };
        c.css = function (f, b) {
            c.isMS && !c.svg && b && "undefined" !== typeof b.opacity && (b.filter = "alpha(opacity=" + 100 * b.opacity + ")");
            c.extend(f.style, b)
        };
        c.createElement = function (f, b, a, g, e) {
            f = r.createElement(f);
            var d = c.css;
            b && c.extend(f, b);
            e && d(f, {padding: "0", border: "none", margin: "0"});
            a && d(f, a);
            g && g.appendChild(f);
            return f
        };
        c.extendClass = function (f, b) {
            var a = function () {
            };
            a.prototype = new f;
            c.extend(a.prototype, b);
            return a
        };
        c.pad = function (f, b, a) {
            return Array((b ||
                2) + 1 - String(f).replace("-", "").length).join(a || "0") + f
        };
        c.relativeLength = function (f, b, a) {
            return /%$/.test(f) ? b * parseFloat(f) / 100 + (a || 0) : parseFloat(f)
        };
        c.wrap = function (f, b, a) {
            var g = f[b];
            f[b] = function () {
                var b = Array.prototype.slice.call(arguments), d = arguments, f = this;
                f.proceed = function () {
                    g.apply(f, arguments.length ? arguments : d)
                };
                b.unshift(g);
                b = a.apply(this, b);
                f.proceed = null;
                return b
            }
        };
        c.datePropsToTimestamps = function (f) {
            v(f, function (b, a) {
                G(b) && "function" === typeof b.getTime ? f[a] = b.getTime() : (G(b) || E(b)) &&
                    c.datePropsToTimestamps(b)
            })
        };
        c.formatSingle = function (f, b, a) {
            var g = /\.([0-9])/, e = c.defaultOptions.lang;
            /f$/.test(f) ? (a = (a = f.match(g)) ? a[1] : -1, null !== b && (b = c.numberFormat(b, a, e.decimalPoint, -1 < f.indexOf(",") ? e.thousandsSep : ""))) : b = (a || c.time).dateFormat(f, b);
            return b
        };
        c.format = function (f, b, a) {
            for (var g = "{", e = !1, d, q, m, z, n = [], u; f;) {
                g = f.indexOf(g);
                if (-1 === g) break;
                d = f.slice(0, g);
                if (e) {
                    d = d.split(":");
                    q = d.shift().split(".");
                    z = q.length;
                    u = b;
                    for (m = 0; m < z; m++) u && (u = u[q[m]]);
                    d.length && (u = c.formatSingle(d.join(":"),
                        u, a));
                    n.push(u)
                } else n.push(d);
                f = f.slice(g + 1);
                g = (e = !e) ? "}" : "{"
            }
            n.push(f);
            return n.join("")
        };
        c.getMagnitude = function (f) {
            return Math.pow(10, Math.floor(Math.log(f) / Math.LN10))
        };
        c.normalizeTickInterval = function (f, b, a, g, e) {
            var d = f;
            a = c.pick(a, 1);
            var q = f / a;
            b || (b = e ? [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] : [1, 2, 2.5, 5, 10], !1 === g && (1 === a ? b = b.filter(function (a) {
                return 0 === a % 1
            }) : .1 >= a && (b = [1 / a])));
            for (g = 0; g < b.length && !(d = b[g], e && d * a >= f || !e && q <= (b[g] + (b[g + 1] || b[g])) / 2); g++) ;
            return d = c.correctFloat(d * a, -Math.round(Math.log(.001) /
                Math.LN10))
        };
        c.stableSort = function (f, b) {
            var a = f.length, g, e;
            for (e = 0; e < a; e++) f[e].safeI = e;
            f.sort(function (a, e) {
                g = b(a, e);
                return 0 === g ? a.safeI - e.safeI : g
            });
            for (e = 0; e < a; e++) delete f[e].safeI
        };
        c.arrayMin = function (f) {
            for (var b = f.length, a = f[0]; b--;) f[b] < a && (a = f[b]);
            return a
        };
        c.arrayMax = function (f) {
            for (var b = f.length, a = f[0]; b--;) f[b] > a && (a = f[b]);
            return a
        };
        c.destroyObjectProperties = function (f, b) {
            v(f, function (a, g) {
                a && a !== b && a.destroy && a.destroy();
                delete f[g]
            })
        };
        c.discardElement = function (f) {
            var b = c.garbageBin;
            b || (b = c.createElement("div"));
            f && b.appendChild(f);
            b.innerHTML = ""
        };
        c.correctFloat = function (f, b) {
            return parseFloat(f.toPrecision(b || 14))
        };
        c.setAnimation = function (f, b) {
            b.renderer.globalAnimation = c.pick(f, b.options.chart.animation, !0)
        };
        c.animObject = function (f) {
            return G(f) ? c.merge(f) : {duration: f ? 500 : 0}
        };
        c.timeUnits = {
            millisecond: 1,
            second: 1E3,
            minute: 6E4,
            hour: 36E5,
            day: 864E5,
            week: 6048E5,
            month: 24192E5,
            year: 314496E5
        };
        c.numberFormat = function (f, b, a, g) {
            f = +f || 0;
            b = +b;
            var e = c.defaultOptions.lang, d = (f.toString().split(".")[1] ||
                "").split("e")[0].length, q = f.toString().split("e");
            if (-1 === b) b = Math.min(d, 20); else if (!I(b)) b = 2; else if (b && q[1] && 0 > q[1]) {
                var m = b + +q[1];
                0 <= m ? (q[0] = (+q[0]).toExponential(m).split("e")[0], b = m) : (q[0] = q[0].split(".")[0] || 0, f = 20 > b ? (q[0] * Math.pow(10, q[1])).toFixed(b) : 0, q[1] = 0)
            }
            var z = (Math.abs(q[1] ? q[0] : f) + Math.pow(10, -Math.max(b, d) - 1)).toFixed(b);
            d = String(h(z));
            m = 3 < d.length ? d.length % 3 : 0;
            a = c.pick(a, e.decimalPoint);
            g = c.pick(g, e.thousandsSep);
            f = (0 > f ? "-" : "") + (m ? d.substr(0, m) + g : "");
            f += d.substr(m).replace(/(\d{3})(?=\d)/g,
                "$1" + g);
            b && (f += a + z.slice(-b));
            q[1] && 0 !== +f && (f += "e" + q[1]);
            return f
        };
        Math.easeInOutSine = function (f) {
            return -.5 * (Math.cos(Math.PI * f) - 1)
        };
        c.getStyle = function (f, b, a) {
            if ("width" === b) return b = Math.min(f.offsetWidth, f.scrollWidth), a = f.getBoundingClientRect && f.getBoundingClientRect().width, a < b && a >= b - 1 && (b = Math.floor(a)), Math.max(0, b - c.getStyle(f, "padding-left") - c.getStyle(f, "padding-right"));
            if ("height" === b) return Math.max(0, Math.min(f.offsetHeight, f.scrollHeight) - c.getStyle(f, "padding-top") - c.getStyle(f,
                "padding-bottom"));
            l.getComputedStyle || c.error(27, !0);
            if (f = l.getComputedStyle(f, void 0)) f = f.getPropertyValue(b), c.pick(a, "opacity" !== b) && (f = h(f));
            return f
        };
        c.inArray = function (f, b, a) {
            return b.indexOf(f, a)
        };
        c.find = Array.prototype.find ? function (f, b) {
            return f.find(b)
        } : function (f, b) {
            var a, g = f.length;
            for (a = 0; a < g; a++) if (b(f[a], a)) return f[a]
        };
        c.keys = Object.keys;
        c.offset = function (f) {
            var b = r.documentElement;
            f = f.parentElement || f.parentNode ? f.getBoundingClientRect() : {top: 0, left: 0};
            return {
                top: f.top + (l.pageYOffset ||
                    b.scrollTop) - (b.clientTop || 0),
                left: f.left + (l.pageXOffset || b.scrollLeft) - (b.clientLeft || 0)
            }
        };
        c.stop = function (f, b) {
            for (var a = c.timers.length; a--;) c.timers[a].elem !== f || b && b !== c.timers[a].prop || (c.timers[a].stopped = !0)
        };
        v({map: "map", each: "forEach", grep: "filter", reduce: "reduce", some: "some"}, function (f, b) {
            c[b] = function (a) {
                return Array.prototype[f].apply(a, [].slice.call(arguments, 1))
            }
        });
        c.addEvent = function (f, b, a, g) {
            void 0 === g && (g = {});
            var e = f.addEventListener || c.addEventListenerPolyfill;
            var d = "function" ===
            typeof f && f.prototype ? f.prototype.protoEvents = f.prototype.protoEvents || {} : f.hcEvents = f.hcEvents || {};
            c.Point && f instanceof c.Point && f.series && f.series.chart && (f.series.chart.runTrackerClick = !0);
            e && e.call(f, b, a, !1);
            d[b] || (d[b] = []);
            d[b].push({fn: a, order: "number" === typeof g.order ? g.order : Infinity});
            d[b].sort(function (a, b) {
                return a.order - b.order
            });
            return function () {
                c.removeEvent(f, b, a)
            }
        };
        c.removeEvent = function (f, b, a) {
            function g(a, b) {
                var d = f.removeEventListener || c.removeEventListenerPolyfill;
                d && d.call(f,
                    a, b, !1)
            }

            function e(a) {
                var d;
                if (f.nodeName) {
                    if (b) {
                        var e = {};
                        e[b] = !0
                    } else e = a;
                    v(e, function (b, e) {
                        if (a[e]) for (d = a[e].length; d--;) g(e, a[e][d].fn)
                    })
                }
            }

            var d;
            ["protoEvents", "hcEvents"].forEach(function (c) {
                var q = f[c];
                q && (b ? (d = q[b] || [], a ? (q[b] = d.filter(function (b) {
                    return a !== b.fn
                }), g(b, a)) : (e(q), q[b] = [])) : (e(q), f[c] = {}))
            })
        };
        c.fireEvent = function (f, b, a, g) {
            var e;
            a = a || {};
            if (r.createEvent && (f.dispatchEvent || f.fireEvent)) {
                var d = r.createEvent("Events");
                d.initEvent(b, !0, !0);
                c.extend(d, a);
                f.dispatchEvent ? f.dispatchEvent(d) :
                    f.fireEvent(b, d)
            } else a.target || c.extend(a, {
                preventDefault: function () {
                    a.defaultPrevented = !0
                }, target: f, type: b
            }), function (b, d) {
                void 0 === b && (b = []);
                void 0 === d && (d = []);
                var g = 0, c = 0, q = b.length + d.length;
                for (e = 0; e < q; e++) !1 === (b[g] ? d[c] ? b[g].order <= d[c].order ? b[g++] : d[c++] : b[g++] : d[c++]).fn.call(f, a) && a.preventDefault()
            }(f.protoEvents && f.protoEvents[b], f.hcEvents && f.hcEvents[b]);
            g && !a.defaultPrevented && g.call(f, a)
        };
        c.animate = function (f, b, a) {
            var g, e = "", d, q;
            if (!G(a)) {
                var m = arguments;
                a = {
                    duration: m[2], easing: m[3],
                    complete: m[4]
                }
            }
            I(a.duration) || (a.duration = 400);
            a.easing = "function" === typeof a.easing ? a.easing : Math[a.easing] || Math.easeInOutSine;
            a.curAnim = c.merge(b);
            v(b, function (m, n) {
                c.stop(f, n);
                q = new c.Fx(f, a, n);
                d = null;
                "d" === n ? (q.paths = q.initPath(f, f.d, b.d), q.toD = b.d, g = 0, d = 1) : f.attr ? g = f.attr(n) : (g = parseFloat(c.getStyle(f, n)) || 0, "opacity" !== n && (e = "px"));
                d || (d = m);
                d && d.match && d.match("px") && (d = d.replace(/px/g, ""));
                q.run(g, d, e)
            })
        };
        c.seriesType = function (f, b, a, g, e) {
            var d = c.getOptions(), q = c.seriesTypes;
            d.plotOptions[f] =
                c.merge(d.plotOptions[b], a);
            q[f] = c.extendClass(q[b] || function () {
            }, g);
            q[f].prototype.type = f;
            e && (q[f].prototype.pointClass = c.extendClass(c.Point, e));
            return q[f]
        };
        c.uniqueKey = function () {
            var c = Math.random().toString(36).substring(2, 9), b = 0;
            return function () {
                return "highcharts-" + c + "-" + b++
            }
        }();
        c.isFunction = function (c) {
            return "function" === typeof c
        };
        l.jQuery && (l.jQuery.fn.highcharts = function () {
            var f = [].slice.call(arguments);
            if (this[0]) return f[0] ? (new (c[x(f[0]) ? f.shift() : "Chart"])(this[0], f[0], f[1]), this) :
                t[c.attr(this[0], "data-highcharts-chart")]
        });
        return {
            defined: y,
            erase: function (c, b) {
                for (var a = c.length; a--;) if (c[a] === b) {
                    c.splice(a, 1);
                    break
                }
            },
            isArray: E,
            isClass: F,
            isDOMElement: B,
            isNumber: I,
            isObject: G,
            isString: x,
            objectEach: v,
            pInt: h,
            splat: function (c) {
                return E(c) ? c : [c]
            }
        }
    });
    K(D, "parts/Color.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.isNumber, E = h.pInt, G = c.merge;
        c.Color = function (B) {
            if (!(this instanceof c.Color)) return new c.Color(B);
            this.init(B)
        };
        c.Color.prototype = {
            parsers: [{
                regex: /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,
                parse: function (c) {
                    return [E(c[1]), E(c[2]), E(c[3]), parseFloat(c[4], 10)]
                }
            }, {
                regex: /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/, parse: function (c) {
                    return [E(c[1]), E(c[2]), E(c[3]), 1]
                }
            }], names: {white: "#ffffff", black: "#000000"}, init: function (B) {
                var h, x;
                if ((this.input = B = this.names[B && B.toLowerCase ? B.toLowerCase() : ""] || B) && B.stops) this.stops = B.stops.map(function (t) {
                    return new c.Color(t[1])
                }); else {
                    if (B && B.charAt && "#" === B.charAt()) {
                        var y = B.length;
                        B = parseInt(B.substr(1), 16);
                        7 === y ? h = [(B & 16711680) >>
                        16, (B & 65280) >> 8, B & 255, 1] : 4 === y && (h = [(B & 3840) >> 4 | (B & 3840) >> 8, (B & 240) >> 4 | B & 240, (B & 15) << 4 | B & 15, 1])
                    }
                    if (!h) for (x = this.parsers.length; x-- && !h;) {
                        var v = this.parsers[x];
                        (y = v.regex.exec(B)) && (h = v.parse(y))
                    }
                }
                this.rgba = h || []
            }, get: function (c) {
                var B = this.input, h = this.rgba;
                if (this.stops) {
                    var y = G(B);
                    y.stops = [].concat(y.stops);
                    this.stops.forEach(function (v, t) {
                        y.stops[t] = [y.stops[t][0], v.get(c)]
                    })
                } else y = h && x(h[0]) ? "rgb" === c || !c && 1 === h[3] ? "rgb(" + h[0] + "," + h[1] + "," + h[2] + ")" : "a" === c ? h[3] : "rgba(" + h.join(",") + ")" : B;
                return y
            },
            brighten: function (c) {
                var B, h = this.rgba;
                if (this.stops) this.stops.forEach(function (y) {
                    y.brighten(c)
                }); else if (x(c) && 0 !== c) for (B = 0; 3 > B; B++) h[B] += E(255 * c), 0 > h[B] && (h[B] = 0), 255 < h[B] && (h[B] = 255);
                return this
            }, setOpacity: function (c) {
                this.rgba[3] = c;
                return this
            }, tweenTo: function (c, h) {
                var B = this.rgba, y = c.rgba;
                y.length && B && B.length ? (c = 1 !== y[3] || 1 !== B[3], h = (c ? "rgba(" : "rgb(") + Math.round(y[0] + (B[0] - y[0]) * (1 - h)) + "," + Math.round(y[1] + (B[1] - y[1]) * (1 - h)) + "," + Math.round(y[2] + (B[2] - y[2]) * (1 - h)) + (c ? "," + (y[3] + (B[3] - y[3]) *
                    (1 - h)) : "") + ")") : h = c.input || "none";
                return h
            }
        };
        c.color = function (B) {
            return new c.Color(B)
        }
    });
    K(D, "parts/Time.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined, E = h.isObject, G = h.objectEach, B = h.splat, F = c.extend, I = c.merge, y = c.pick,
            v = c.timeUnits, t = c.win;
        c.Time = function (c) {
            this.update(c, !1)
        };
        c.Time.prototype = {
            defaultOptions: {}, update: function (c) {
                var r = y(c && c.useUTC, !0), f = this;
                this.options = c = I(!0, this.options || {}, c);
                this.Date = c.Date || t.Date || Date;
                this.timezoneOffset = (this.useUTC =
                    r) && c.timezoneOffset;
                this.getTimezoneOffset = this.timezoneOffsetFunction();
                (this.variableTimezone = !(r && !c.getTimezoneOffset && !c.timezone)) || this.timezoneOffset ? (this.get = function (b, a) {
                    var g = a.getTime(), e = g - f.getTimezoneOffset(a);
                    a.setTime(e);
                    b = a["getUTC" + b]();
                    a.setTime(g);
                    return b
                }, this.set = function (b, a, g) {
                    if ("Milliseconds" === b || "Seconds" === b || "Minutes" === b && 0 === a.getTimezoneOffset() % 60) a["set" + b](g); else {
                        var e = f.getTimezoneOffset(a);
                        e = a.getTime() - e;
                        a.setTime(e);
                        a["setUTC" + b](g);
                        b = f.getTimezoneOffset(a);
                        e = a.getTime() + b;
                        a.setTime(e)
                    }
                }) : r ? (this.get = function (b, a) {
                    return a["getUTC" + b]()
                }, this.set = function (b, a, g) {
                    return a["setUTC" + b](g)
                }) : (this.get = function (b, a) {
                    return a["get" + b]()
                }, this.set = function (b, a, g) {
                    return a["set" + b](g)
                })
            }, makeTime: function (r, l, f, b, a, g) {
                if (this.useUTC) {
                    var e = this.Date.UTC.apply(0, arguments);
                    var d = this.getTimezoneOffset(e);
                    e += d;
                    var q = this.getTimezoneOffset(e);
                    d !== q ? e += q - d : d - 36E5 !== this.getTimezoneOffset(e - 36E5) || c.isSafari || (e -= 36E5)
                } else e = (new this.Date(r, l, y(f, 1), y(b, 0), y(a,
                    0), y(g, 0))).getTime();
                return e
            }, timezoneOffsetFunction: function () {
                var r = this, l = this.options, f = t.moment;
                if (!this.useUTC) return function (b) {
                    return 6E4 * (new Date(b)).getTimezoneOffset()
                };
                if (l.timezone) {
                    if (f) return function (b) {
                        return 6E4 * -f.tz(b, l.timezone).utcOffset()
                    };
                    c.error(25)
                }
                return this.useUTC && l.getTimezoneOffset ? function (b) {
                    return 6E4 * l.getTimezoneOffset(b)
                } : function () {
                    return 6E4 * (r.timezoneOffset || 0)
                }
            }, dateFormat: function (r, l, f) {
                if (!x(l) || isNaN(l)) return c.defaultOptions.lang.invalidDate || "";
                r = c.pick(r, "%Y-%m-%d %H:%M:%S");
                var b = this, a = new this.Date(l), g = this.get("Hours", a), e = this.get("Day", a),
                    d = this.get("Date", a), q = this.get("Month", a), m = this.get("FullYear", a),
                    z = c.defaultOptions.lang, n = z.weekdays, u = z.shortWeekdays, k = c.pad;
                a = c.extend({
                    a: u ? u[e] : n[e].substr(0, 3),
                    A: n[e],
                    d: k(d),
                    e: k(d, 2, " "),
                    w: e,
                    b: z.shortMonths[q],
                    B: z.months[q],
                    m: k(q + 1),
                    o: q + 1,
                    y: m.toString().substr(2, 2),
                    Y: m,
                    H: k(g),
                    k: g,
                    I: k(g % 12 || 12),
                    l: g % 12 || 12,
                    M: k(b.get("Minutes", a)),
                    p: 12 > g ? "AM" : "PM",
                    P: 12 > g ? "am" : "pm",
                    S: k(a.getSeconds()),
                    L: k(Math.floor(l %
                        1E3), 3)
                }, c.dateFormats);
                G(a, function (a, d) {
                    for (; -1 !== r.indexOf("%" + d);) r = r.replace("%" + d, "function" === typeof a ? a.call(b, l) : a)
                });
                return f ? r.substr(0, 1).toUpperCase() + r.substr(1) : r
            }, resolveDTLFormat: function (c) {
                return E(c, !0) ? c : (c = B(c), {main: c[0], from: c[1], to: c[2]})
            }, getTimeTicks: function (c, l, f, b) {
                var a = this, g = [], e = {};
                var d = new a.Date(l);
                var q = c.unitRange, m = c.count || 1, z;
                b = y(b, 1);
                if (x(l)) {
                    a.set("Milliseconds", d, q >= v.second ? 0 : m * Math.floor(a.get("Milliseconds", d) / m));
                    q >= v.second && a.set("Seconds", d, q >= v.minute ?
                        0 : m * Math.floor(a.get("Seconds", d) / m));
                    q >= v.minute && a.set("Minutes", d, q >= v.hour ? 0 : m * Math.floor(a.get("Minutes", d) / m));
                    q >= v.hour && a.set("Hours", d, q >= v.day ? 0 : m * Math.floor(a.get("Hours", d) / m));
                    q >= v.day && a.set("Date", d, q >= v.month ? 1 : Math.max(1, m * Math.floor(a.get("Date", d) / m)));
                    if (q >= v.month) {
                        a.set("Month", d, q >= v.year ? 0 : m * Math.floor(a.get("Month", d) / m));
                        var n = a.get("FullYear", d)
                    }
                    q >= v.year && a.set("FullYear", d, n - n % m);
                    q === v.week && (n = a.get("Day", d), a.set("Date", d, a.get("Date", d) - n + b + (n < b ? -7 : 0)));
                    n = a.get("FullYear",
                        d);
                    b = a.get("Month", d);
                    var u = a.get("Date", d), k = a.get("Hours", d);
                    l = d.getTime();
                    a.variableTimezone && (z = f - l > 4 * v.month || a.getTimezoneOffset(l) !== a.getTimezoneOffset(f));
                    l = d.getTime();
                    for (d = 1; l < f;) g.push(l), l = q === v.year ? a.makeTime(n + d * m, 0) : q === v.month ? a.makeTime(n, b + d * m) : !z || q !== v.day && q !== v.week ? z && q === v.hour && 1 < m ? a.makeTime(n, b, u, k + d * m) : l + q * m : a.makeTime(n, b, u + d * m * (q === v.day ? 1 : 7)), d++;
                    g.push(l);
                    q <= v.hour && 1E4 > g.length && g.forEach(function (b) {
                        0 === b % 18E5 && "000000000" === a.dateFormat("%H%M%S%L", b) && (e[b] = "day")
                    })
                }
                g.info =
                    F(c, {higherRanks: e, totalRange: q * m});
                return g
            }
        }
    });
    K(D, "parts/Options.js", [D["parts/Globals.js"]], function (c) {
        var h = c.color, x = c.merge;
        c.defaultOptions = {
            colors: "#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "),
            symbols: ["circle", "diamond", "square", "triangle", "triangle-down"],
            lang: {
                loading: "Loading...",
                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(" "),
                weekdays: "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),
                decimalPoint: ".",
                numericSymbols: "kMGTPE".split(""),
                resetZoom: "Reset zoom",
                resetZoomTitle: "Reset zoom level 1:1",
                thousandsSep: " "
            },
            global: {},
            time: c.Time.prototype.defaultOptions,
            chart: {
                styledMode: !1,
                borderRadius: 0,
                colorCount: 10,
                defaultSeriesType: "line",
                ignoreHiddenSeries: !0,
                spacing: [10, 10, 15, 10],
                resetZoomButton: {theme: {zIndex: 6}, position: {align: "right", x: -10, y: 10}},
                width: null,
                height: null,
                borderColor: "#335cad",
                backgroundColor: "#ffffff",
                plotBorderColor: "#cccccc"
            },
            title: {text: "Chart title", align: "center", margin: 15, widthAdjust: -44},
            subtitle: {text: "", align: "center", widthAdjust: -44},
            plotOptions: {},
            labels: {style: {position: "absolute", color: "#333333"}},
            legend: {
                enabled: !0,
                align: "center",
                alignColumns: !0,
                layout: "horizontal",
                labelFormatter: function () {
                    return this.name
                },
                borderColor: "#999999",
                borderRadius: 0,
                navigation: {activeColor: "#003399", inactiveColor: "#cccccc"},
                itemStyle: {
                    color: "#333333", cursor: "pointer", fontSize: "12px", fontWeight: "bold",
                    textOverflow: "ellipsis"
                },
                itemHoverStyle: {color: "#000000"},
                itemHiddenStyle: {color: "#cccccc"},
                shadow: !1,
                itemCheckboxStyle: {position: "absolute", width: "13px", height: "13px"},
                squareSymbol: !0,
                symbolPadding: 5,
                verticalAlign: "bottom",
                x: 0,
                y: 0,
                title: {style: {fontWeight: "bold"}}
            },
            loading: {
                labelStyle: {fontWeight: "bold", position: "relative", top: "45%"},
                style: {position: "absolute", backgroundColor: "#ffffff", opacity: .5, textAlign: "center"}
            },
            tooltip: {
                enabled: !0,
                animation: c.svg,
                borderRadius: 3,
                dateTimeLabelFormats: {
                    millisecond: "%A, %b %e, %H:%M:%S.%L",
                    second: "%A, %b %e, %H:%M:%S",
                    minute: "%A, %b %e, %H:%M",
                    hour: "%A, %b %e, %H:%M",
                    day: "%A, %b %e, %Y",
                    week: "Week from %A, %b %e, %Y",
                    month: "%B %Y",
                    year: "%Y"
                },
                footerFormat: "",
                padding: 8,
                snap: c.isTouchDevice ? 25 : 10,
                headerFormat: '<span style="font-size: 10px">{point.key}</span><br/>',
                pointFormat: '<span style="color:{point.color}">\u25cf</span> {series.name}: <b>{point.y}</b><br/>',
                backgroundColor: h("#f7f7f7").setOpacity(.85).get(),
                borderWidth: 1,
                shadow: !0,
                style: {
                    color: "#333333", cursor: "default", fontSize: "12px",
                    pointerEvents: "none", whiteSpace: "nowrap"
                }
            },
            credits: {
                enabled: !0,
                href: "https://www.highcharts.com?credits",
                position: {align: "right", x: -10, verticalAlign: "bottom", y: -5},
                style: {cursor: "pointer", color: "#999999", fontSize: "9px"},
                text: "Highcharts.com"
            }
        };
        c.setOptions = function (h) {
            c.defaultOptions = x(!0, c.defaultOptions, h);
            c.time.update(x(c.defaultOptions.global, c.defaultOptions.time), !1);
            return c.defaultOptions
        };
        c.getOptions = function () {
            return c.defaultOptions
        };
        c.defaultPlotOptions = c.defaultOptions.plotOptions;
        c.time = new c.Time(x(c.defaultOptions.global, c.defaultOptions.time));
        c.dateFormat = function (h, x, B) {
            return c.time.dateFormat(h, x, B)
        };
        ""
    });
    K(D, "parts/SvgRenderer.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined, E = h.erase, G = h.isArray, B = h.isNumber, F = h.isObject, I = h.isString, y = h.objectEach,
            v = h.pInt, t = h.splat, r = c.addEvent, l = c.animate, f = c.attr, b = c.charts, a = c.color, g = c.css,
            e = c.createElement, d = c.deg2rad, q = c.destroyObjectProperties, m = c.doc, z = c.extend, n = c.hasTouch,
            u = c.isFirefox,
            k = c.isMS, w = c.isWebKit, C = c.merge, H = c.noop, A = c.pick, p = c.removeEvent, J = c.stop, N = c.svg,
            T = c.SVG_NS, P = c.symbolSizes, R = c.win;
        var M = c.SVGElement = function () {
            return this
        };
        z(M.prototype, {
            opacity: 1,
            SVG_NS: T,
            textProps: "direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline cursor".split(" "),
            init: function (a, b) {
                this.element = "span" === b ? e(b) : m.createElementNS(this.SVG_NS, b);
                this.renderer = a;
                c.fireEvent(this, "afterInit")
            },
            animate: function (a, b, d) {
                var e =
                    c.animObject(A(b, this.renderer.globalAnimation, !0));
                A(m.hidden, m.msHidden, m.webkitHidden, !1) && (e.duration = 0);
                0 !== e.duration ? (d && (e.complete = d), l(this, a, e)) : (this.attr(a, void 0, d), y(a, function (a, b) {
                    e.step && e.step.call(this, a, {prop: b, pos: 1})
                }, this));
                return this
            },
            complexColor: function (a, b, d) {
                var e = this.renderer, L, p, A, g, k, f, q, Q, m, w, N, n = [], J;
                c.fireEvent(this.renderer, "complexColor", {args: arguments}, function () {
                    a.radialGradient ? p = "radialGradient" : a.linearGradient && (p = "linearGradient");
                    p && (A = a[p], k = e.gradients,
                        q = a.stops, w = d.radialReference, G(A) && (a[p] = A = {
                        x1: A[0],
                        y1: A[1],
                        x2: A[2],
                        y2: A[3],
                        gradientUnits: "userSpaceOnUse"
                    }), "radialGradient" === p && w && !x(A.gradientUnits) && (g = A, A = C(A, e.getRadialAttr(w, g), {gradientUnits: "userSpaceOnUse"})), y(A, function (a, b) {
                        "id" !== b && n.push(b, a)
                    }), y(q, function (a) {
                        n.push(a)
                    }), n = n.join(","), k[n] ? N = k[n].attr("id") : (A.id = N = c.uniqueKey(), k[n] = f = e.createElement(p).attr(A).add(e.defs), f.radAttr = g, f.stops = [], q.forEach(function (a) {
                        0 === a[1].indexOf("rgba") ? (L = c.color(a[1]), Q = L.get("rgb"), m =
                            L.get("a")) : (Q = a[1], m = 1);
                        a = e.createElement("stop").attr({offset: a[0], "stop-color": Q, "stop-opacity": m}).add(f);
                        f.stops.push(a)
                    })), J = "url(" + e.url + "#" + N + ")", d.setAttribute(b, J), d.gradient = n, a.toString = function () {
                        return J
                    })
                })
            },
            applyTextOutline: function (a) {
                var b = this.element, d;
                -1 !== a.indexOf("contrast") && (a = a.replace(/contrast/g, this.renderer.getContrast(b.style.fill)));
                a = a.split(" ");
                var e = a[a.length - 1];
                if ((d = a[0]) && "none" !== d && c.svg) {
                    this.fakeTS = !0;
                    a = [].slice.call(b.getElementsByTagName("tspan"));
                    this.ySetter =
                        this.xSetter;
                    d = d.replace(/(^[\d\.]+)(.*?)$/g, function (a, b, d) {
                        return 2 * b + d
                    });
                    this.removeTextOutline(a);
                    var L = b.firstChild;
                    a.forEach(function (a, p) {
                        0 === p && (a.setAttribute("x", b.getAttribute("x")), p = b.getAttribute("y"), a.setAttribute("y", p || 0), null === p && b.setAttribute("y", 0));
                        a = a.cloneNode(1);
                        f(a, {
                            "class": "highcharts-text-outline",
                            fill: e,
                            stroke: e,
                            "stroke-width": d,
                            "stroke-linejoin": "round"
                        });
                        b.insertBefore(a, L)
                    })
                }
            },
            removeTextOutline: function (a) {
                for (var b = a.length, d; b--;) d = a[b], "highcharts-text-outline" ===
                d.getAttribute("class") && E(a, this.element.removeChild(d))
            },
            symbolCustomAttribs: "x y width height r start end innerR anchorX anchorY rounded".split(" "),
            attr: function (a, b, d, e) {
                var p = this.element, A, L = this, g, k, f = this.symbolCustomAttribs;
                if ("string" === typeof a && void 0 !== b) {
                    var q = a;
                    a = {};
                    a[q] = b
                }
                "string" === typeof a ? L = (this[a + "Getter"] || this._defaultGetter).call(this, a, p) : (y(a, function (b, d) {
                    g = !1;
                    e || J(this, d);
                    this.symbolName && -1 !== c.inArray(d, f) && (A || (this.symbolAttr(a), A = !0), g = !0);
                    !this.rotation || "x" !== d &&
                    "y" !== d || (this.doTransform = !0);
                    g || (k = this[d + "Setter"] || this._defaultSetter, k.call(this, b, d, p), !this.styledMode && this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(d) && this.updateShadows(d, b, k))
                }, this), this.afterSetters());
                d && d.call(this);
                return L
            },
            afterSetters: function () {
                this.doTransform && (this.updateTransform(), this.doTransform = !1)
            },
            updateShadows: function (a, b, d) {
                for (var e = this.shadows, p = e.length; p--;) d.call(e[p], "height" === a ? Math.max(b - (e[p].cutHeight || 0), 0) : "d" === a ? this.d :
                    b, a, e[p])
            },
            addClass: function (a, b) {
                var d = this.attr("class") || "";
                b || (a = (a || "").split(/ /g).reduce(function (a, b) {
                    -1 === d.indexOf(b) && a.push(b);
                    return a
                }, d ? [d] : []).join(" "));
                a !== d && this.attr("class", a);
                return this
            },
            hasClass: function (a) {
                return -1 !== (this.attr("class") || "").split(" ").indexOf(a)
            },
            removeClass: function (a) {
                return this.attr("class", (this.attr("class") || "").replace(a, ""))
            },
            symbolAttr: function (a) {
                var b = this;
                "x y r start end width height innerR anchorX anchorY clockwise".split(" ").forEach(function (d) {
                    b[d] =
                        A(a[d], b[d])
                });
                b.attr({d: b.renderer.symbols[b.symbolName](b.x, b.y, b.width, b.height, b)})
            },
            clip: function (a) {
                return this.attr("clip-path", a ? "url(" + this.renderer.url + "#" + a.id + ")" : "none")
            },
            crisp: function (a, b) {
                b = b || a.strokeWidth || 0;
                var d = Math.round(b) % 2 / 2;
                a.x = Math.floor(a.x || this.x || 0) + d;
                a.y = Math.floor(a.y || this.y || 0) + d;
                a.width = Math.floor((a.width || this.width || 0) - 2 * d);
                a.height = Math.floor((a.height || this.height || 0) - 2 * d);
                x(a.strokeWidth) && (a.strokeWidth = b);
                return a
            },
            css: function (a) {
                var b = this.styles, d = {},
                    e = this.element, p = "", A = !b, c = ["textOutline", "textOverflow", "width"];
                a && a.color && (a.fill = a.color);
                b && y(a, function (a, e) {
                    a !== b[e] && (d[e] = a, A = !0)
                });
                if (A) {
                    b && (a = z(b, d));
                    if (a) if (null === a.width || "auto" === a.width) delete this.textWidth; else if ("text" === e.nodeName.toLowerCase() && a.width) var L = this.textWidth = v(a.width);
                    this.styles = a;
                    L && !N && this.renderer.forExport && delete a.width;
                    if (e.namespaceURI === this.SVG_NS) {
                        var k = function (a, b) {
                            return "-" + b.toLowerCase()
                        };
                        y(a, function (a, b) {
                            -1 === c.indexOf(b) && (p += b.replace(/([A-Z])/g,
                                k) + ":" + a + ";")
                        });
                        p && f(e, "style", p)
                    } else g(e, a);
                    this.added && ("text" === this.element.nodeName && this.renderer.buildText(this), a && a.textOutline && this.applyTextOutline(a.textOutline))
                }
                return this
            },
            getStyle: function (a) {
                return R.getComputedStyle(this.element || this, "").getPropertyValue(a)
            },
            strokeWidth: function () {
                if (!this.renderer.styledMode) return this["stroke-width"] || 0;
                var a = this.getStyle("stroke-width");
                if (a.indexOf("px") === a.length - 2) a = v(a); else {
                    var b = m.createElementNS(T, "rect");
                    f(b, {width: a, "stroke-width": 0});
                    this.element.parentNode.appendChild(b);
                    a = b.getBBox().width;
                    b.parentNode.removeChild(b)
                }
                return a
            },
            on: function (a, b) {
                var d = this, e = d.element;
                n && "click" === a ? (e.ontouchstart = function (a) {
                    d.touchEventFired = Date.now();
                    a.preventDefault();
                    b.call(e, a)
                }, e.onclick = function (a) {
                    (-1 === R.navigator.userAgent.indexOf("Android") || 1100 < Date.now() - (d.touchEventFired || 0)) && b.call(e, a)
                }) : e["on" + a] = b;
                return this
            },
            setRadialReference: function (a) {
                var b = this.renderer.gradients[this.element.gradient];
                this.element.radialReference =
                    a;
                b && b.radAttr && b.animate(this.renderer.getRadialAttr(a, b.radAttr));
                return this
            },
            translate: function (a, b) {
                return this.attr({translateX: a, translateY: b})
            },
            invert: function (a) {
                this.inverted = a;
                this.updateTransform();
                return this
            },
            updateTransform: function () {
                var a = this.translateX || 0, b = this.translateY || 0, d = this.scaleX, e = this.scaleY,
                    p = this.inverted, g = this.rotation, c = this.matrix, k = this.element;
                p && (a += this.width, b += this.height);
                a = ["translate(" + a + "," + b + ")"];
                x(c) && a.push("matrix(" + c.join(",") + ")");
                p ? a.push("rotate(90) scale(-1,1)") :
                    g && a.push("rotate(" + g + " " + A(this.rotationOriginX, k.getAttribute("x"), 0) + " " + A(this.rotationOriginY, k.getAttribute("y") || 0) + ")");
                (x(d) || x(e)) && a.push("scale(" + A(d, 1) + " " + A(e, 1) + ")");
                a.length && k.setAttribute("transform", a.join(" "))
            },
            toFront: function () {
                var a = this.element;
                a.parentNode.appendChild(a);
                return this
            },
            align: function (a, b, d) {
                var e, p = {};
                var g = this.renderer;
                var c = g.alignedObjects;
                var k, f;
                if (a) {
                    if (this.alignOptions = a, this.alignByTranslate = b, !d || I(d)) this.alignTo = e = d || "renderer", E(c, this), c.push(this),
                        d = null
                } else a = this.alignOptions, b = this.alignByTranslate, e = this.alignTo;
                d = A(d, g[e], g);
                e = a.align;
                g = a.verticalAlign;
                c = (d.x || 0) + (a.x || 0);
                var L = (d.y || 0) + (a.y || 0);
                "right" === e ? k = 1 : "center" === e && (k = 2);
                k && (c += (d.width - (a.width || 0)) / k);
                p[b ? "translateX" : "x"] = Math.round(c);
                "bottom" === g ? f = 1 : "middle" === g && (f = 2);
                f && (L += (d.height - (a.height || 0)) / f);
                p[b ? "translateY" : "y"] = Math.round(L);
                this[this.placed ? "animate" : "attr"](p);
                this.placed = !0;
                this.alignAttr = p;
                return this
            },
            getBBox: function (a, b) {
                var e, p = this.renderer, g = this.element,
                    c = this.styles, k = this.textStr, f, L = p.cache, q = p.cacheKeys,
                    m = g.namespaceURI === this.SVG_NS;
                b = A(b, this.rotation);
                var C = b * d;
                var Q = p.styledMode ? g && M.prototype.getStyle.call(g, "font-size") : c && c.fontSize;
                if (x(k)) {
                    var w = k.toString();
                    -1 === w.indexOf("<") && (w = w.replace(/[0-9]/g, "0"));
                    w += ["", b || 0, Q, this.textWidth, c && c.textOverflow].join()
                }
                w && !a && (e = L[w]);
                if (!e) {
                    if (m || p.forExport) {
                        try {
                            (f = this.fakeTS && function (a) {
                                [].forEach.call(g.querySelectorAll(".highcharts-text-outline"), function (b) {
                                    b.style.display = a
                                })
                            }) && f("none"),
                                e = g.getBBox ? z({}, g.getBBox()) : {
                                    width: g.offsetWidth,
                                    height: g.offsetHeight
                                }, f && f("")
                        } catch (aa) {
                            ""
                        }
                        if (!e || 0 > e.width) e = {width: 0, height: 0}
                    } else e = this.htmlGetBBox();
                    p.isSVG && (a = e.width, p = e.height, m && (e.height = p = {
                        "11px,17": 14,
                        "13px,20": 16
                    }[c && c.fontSize + "," + Math.round(p)] || p), b && (e.width = Math.abs(p * Math.sin(C)) + Math.abs(a * Math.cos(C)), e.height = Math.abs(p * Math.cos(C)) + Math.abs(a * Math.sin(C))));
                    if (w && 0 < e.height) {
                        for (; 250 < q.length;) delete L[q.shift()];
                        L[w] || q.push(w);
                        L[w] = e
                    }
                }
                return e
            },
            show: function (a) {
                return this.attr({
                    visibility: a ?
                        "inherit" : "visible"
                })
            },
            hide: function (a) {
                a ? this.attr({y: -9999}) : this.attr({visibility: "hidden"});
                return this
            },
            fadeOut: function (a) {
                var b = this;
                b.animate({opacity: 0}, {
                    duration: a || 150, complete: function () {
                        b.attr({y: -9999})
                    }
                })
            },
            add: function (a) {
                var b = this.renderer, d = this.element;
                a && (this.parentGroup = a);
                this.parentInverted = a && a.inverted;
                void 0 !== this.textStr && b.buildText(this);
                this.added = !0;
                if (!a || a.handleZ || this.zIndex) var e = this.zIndexSetter();
                e || (a ? a.element : b.box).appendChild(d);
                if (this.onAdd) this.onAdd();
                return this
            },
            safeRemoveChild: function (a) {
                var b = a.parentNode;
                b && b.removeChild(a)
            },
            destroy: function () {
                var a = this, b = a.element || {}, d = a.renderer,
                    e = d.isSVG && "SPAN" === b.nodeName && a.parentGroup, p = b.ownerSVGElement, g = a.clipPath;
                b.onclick = b.onmouseout = b.onmouseover = b.onmousemove = b.point = null;
                J(a);
                g && p && ([].forEach.call(p.querySelectorAll("[clip-path],[CLIP-PATH]"), function (a) {
                    -1 < a.getAttribute("clip-path").indexOf(g.element.id) && a.removeAttribute("clip-path")
                }), a.clipPath = g.destroy());
                if (a.stops) {
                    for (p = 0; p <
                    a.stops.length; p++) a.stops[p] = a.stops[p].destroy();
                    a.stops = null
                }
                a.safeRemoveChild(b);
                for (d.styledMode || a.destroyShadows(); e && e.div && 0 === e.div.childNodes.length;) b = e.parentGroup, a.safeRemoveChild(e.div), delete e.div, e = b;
                a.alignTo && E(d.alignedObjects, a);
                y(a, function (b, d) {
                    a[d] && a[d].parentGroup === a && a[d].destroy && a[d].destroy();
                    delete a[d]
                })
            },
            shadow: function (a, b, d) {
                var e = [], p, g = this.element;
                if (!a) this.destroyShadows(); else if (!this.shadows) {
                    var c = A(a.width, 3);
                    var k = (a.opacity || .15) / c;
                    var L = this.parentInverted ?
                        "(-1,-1)" : "(" + A(a.offsetX, 1) + ", " + A(a.offsetY, 1) + ")";
                    for (p = 1; p <= c; p++) {
                        var q = g.cloneNode(0);
                        var m = 2 * c + 1 - 2 * p;
                        f(q, {
                            stroke: a.color || "#000000",
                            "stroke-opacity": k * p,
                            "stroke-width": m,
                            transform: "translate" + L,
                            fill: "none"
                        });
                        q.setAttribute("class", (q.getAttribute("class") || "") + " highcharts-shadow");
                        d && (f(q, "height", Math.max(f(q, "height") - m, 0)), q.cutHeight = m);
                        b ? b.element.appendChild(q) : g.parentNode && g.parentNode.insertBefore(q, g);
                        e.push(q)
                    }
                    this.shadows = e
                }
                return this
            },
            destroyShadows: function () {
                (this.shadows ||
                    []).forEach(function (a) {
                    this.safeRemoveChild(a)
                }, this);
                this.shadows = void 0
            },
            xGetter: function (a) {
                "circle" === this.element.nodeName && ("x" === a ? a = "cx" : "y" === a && (a = "cy"));
                return this._defaultGetter(a)
            },
            _defaultGetter: function (a) {
                a = A(this[a + "Value"], this[a], this.element ? this.element.getAttribute(a) : null, 0);
                /^[\-0-9\.]+$/.test(a) && (a = parseFloat(a));
                return a
            },
            dSetter: function (a, b, d) {
                a && a.join && (a = a.join(" "));
                /(NaN| {2}|^$)/.test(a) && (a = "M 0 0");
                this[b] !== a && (d.setAttribute(b, a), this[b] = a)
            },
            dashstyleSetter: function (a) {
                var b,
                    d = this["stroke-width"];
                "inherit" === d && (d = 1);
                if (a = a && a.toLowerCase()) {
                    a = a.replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash", "8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(",");
                    for (b = a.length; b--;) a[b] = v(a[b]) * d;
                    a = a.join(",").replace(/NaN/g, "none");
                    this.element.setAttribute("stroke-dasharray", a)
                }
            },
            alignSetter: function (a) {
                var b = {left: "start", center: "middle", right: "end"};
                b[a] &&
                (this.alignValue = a, this.element.setAttribute("text-anchor", b[a]))
            },
            opacitySetter: function (a, b, d) {
                this[b] = a;
                d.setAttribute(b, a)
            },
            titleSetter: function (a) {
                var b = this.element.getElementsByTagName("title")[0];
                b || (b = m.createElementNS(this.SVG_NS, "title"), this.element.appendChild(b));
                b.firstChild && b.removeChild(b.firstChild);
                b.appendChild(m.createTextNode(String(A(a, "")).replace(/<[^>]*>/g, "").replace(/&lt;/g, "<").replace(/&gt;/g, ">")))
            },
            textSetter: function (a) {
                a !== this.textStr && (delete this.bBox, delete this.textPxLength,
                    this.textStr = a, this.added && this.renderer.buildText(this))
            },
            setTextPath: function (a, b) {
                var d = this.element, e = {textAnchor: "text-anchor"}, p = !1, g = this.textPathWrapper, A = !g;
                b = C(!0, {enabled: !0, attributes: {dy: -5, startOffset: "50%", textAnchor: "middle"}}, b);
                var k = b.attributes;
                if (a && b && b.enabled) {
                    this.options && this.options.padding && (k.dx = -this.options.padding);
                    g || (this.textPathWrapper = g = this.renderer.createElement("textPath"), p = !0);
                    var f = g.element;
                    (b = a.element.getAttribute("id")) || a.element.setAttribute("id",
                        b = c.uniqueKey());
                    if (A) for (a = d.getElementsByTagName("tspan"); a.length;) a[0].setAttribute("y", 0), f.appendChild(a[0]);
                    p && g.add({element: this.text ? this.text.element : d});
                    f.setAttributeNS("http://www.w3.org/1999/xlink", "href", this.renderer.url + "#" + b);
                    x(k.dy) && (f.parentNode.setAttribute("dy", k.dy), delete k.dy);
                    x(k.dx) && (f.parentNode.setAttribute("dx", k.dx), delete k.dx);
                    y(k, function (a, b) {
                        f.setAttribute(e[b] || b, a)
                    });
                    d.removeAttribute("transform");
                    this.removeTextOutline.call(g, [].slice.call(d.getElementsByTagName("tspan")));
                    this.text && !this.renderer.styledMode && this.attr({fill: "none", "stroke-width": 0});
                    this.applyTextOutline = this.updateTransform = H
                } else g && (delete this.updateTransform, delete this.applyTextOutline, this.destroyTextPath(d, a));
                return this
            },
            destroyTextPath: function (a, b) {
                var d;
                b.element.setAttribute("id", "");
                for (d = this.textPathWrapper.element.childNodes; d.length;) a.firstChild.appendChild(d[0]);
                a.firstChild.removeChild(this.textPathWrapper.element);
                delete b.textPathWrapper
            },
            fillSetter: function (a, b, d) {
                "string" ===
                typeof a ? d.setAttribute(b, a) : a && this.complexColor(a, b, d)
            },
            visibilitySetter: function (a, b, d) {
                "inherit" === a ? d.removeAttribute(b) : this[b] !== a && d.setAttribute(b, a);
                this[b] = a
            },
            zIndexSetter: function (a, b) {
                var d = this.renderer, e = this.parentGroup, p = (e || d).element || d.box, g = this.element, A = !1;
                d = p === d.box;
                var c = this.added;
                var k;
                x(a) ? (g.setAttribute("data-z-index", a), a = +a, this[b] === a && (c = !1)) : x(this[b]) && g.removeAttribute("data-z-index");
                this[b] = a;
                if (c) {
                    (a = this.zIndex) && e && (e.handleZ = !0);
                    b = p.childNodes;
                    for (k = b.length -
                        1; 0 <= k && !A; k--) {
                        e = b[k];
                        c = e.getAttribute("data-z-index");
                        var f = !x(c);
                        if (e !== g) if (0 > a && f && !d && !k) p.insertBefore(g, b[k]), A = !0; else if (v(c) <= a || f && (!x(a) || 0 <= a)) p.insertBefore(g, b[k + 1] || null), A = !0
                    }
                    A || (p.insertBefore(g, b[d ? 3 : 0] || null), A = !0)
                }
                return A
            },
            _defaultSetter: function (a, b, d) {
                d.setAttribute(b, a)
            }
        });
        M.prototype.yGetter = M.prototype.xGetter;
        M.prototype.translateXSetter = M.prototype.translateYSetter = M.prototype.rotationSetter = M.prototype.verticalAlignSetter = M.prototype.rotationOriginXSetter = M.prototype.rotationOriginYSetter =
            M.prototype.scaleXSetter = M.prototype.scaleYSetter = M.prototype.matrixSetter = function (a, b) {
                this[b] = a;
                this.doTransform = !0
            };
        M.prototype["stroke-widthSetter"] = M.prototype.strokeSetter = function (a, b, d) {
            this[b] = a;
            this.stroke && this["stroke-width"] ? (M.prototype.fillSetter.call(this, this.stroke, "stroke", d), d.setAttribute("stroke-width", this["stroke-width"]), this.hasStroke = !0) : "stroke-width" === b && 0 === a && this.hasStroke ? (d.removeAttribute("stroke"), this.hasStroke = !1) : this.renderer.styledMode && this["stroke-width"] &&
                (d.setAttribute("stroke-width", this["stroke-width"]), this.hasStroke = !0)
        };
        h = c.SVGRenderer = function () {
            this.init.apply(this, arguments)
        };
        z(h.prototype, {
            Element: M, SVG_NS: T, init: function (a, b, d, e, p, A, c) {
                var k = this.createElement("svg").attr({version: "1.1", "class": "highcharts-root"});
                c || k.css(this.getStyle(e));
                e = k.element;
                a.appendChild(e);
                f(a, "dir", "ltr");
                -1 === a.innerHTML.indexOf("xmlns") && f(e, "xmlns", this.SVG_NS);
                this.isSVG = !0;
                this.box = e;
                this.boxWrapper = k;
                this.alignedObjects = [];
                this.url = (u || w) && m.getElementsByTagName("base").length ?
                    R.location.href.split("#")[0].replace(/<[^>]*>/g, "").replace(/([\('\)])/g, "\\$1").replace(/ /g, "%20") : "";
                this.createElement("desc").add().element.appendChild(m.createTextNode("Created with Highcharts 7.1.3"));
                this.defs = this.createElement("defs").add();
                this.allowHTML = A;
                this.forExport = p;
                this.styledMode = c;
                this.gradients = {};
                this.cache = {};
                this.cacheKeys = [];
                this.imgCount = 0;
                this.setSize(b, d, !1);
                var q;
                u && a.getBoundingClientRect && (b = function () {
                    g(a, {left: 0, top: 0});
                    q = a.getBoundingClientRect();
                    g(a, {
                        left: Math.ceil(q.left) -
                            q.left + "px", top: Math.ceil(q.top) - q.top + "px"
                    })
                }, b(), this.unSubPixelFix = r(R, "resize", b))
            }, definition: function (a) {
                function b(a, e) {
                    var p;
                    t(a).forEach(function (a) {
                        var g = d.createElement(a.tagName), A = {};
                        y(a, function (a, b) {
                            "tagName" !== b && "children" !== b && "textContent" !== b && (A[b] = a)
                        });
                        g.attr(A);
                        g.add(e || d.defs);
                        a.textContent && g.element.appendChild(m.createTextNode(a.textContent));
                        b(a.children || [], g);
                        p = g
                    });
                    return p
                }

                var d = this;
                return b(a)
            }, getStyle: function (a) {
                return this.style = z({
                    fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',
                    fontSize: "12px"
                }, a)
            }, setStyle: function (a) {
                this.boxWrapper.css(this.getStyle(a))
            }, isHidden: function () {
                return !this.boxWrapper.getBBox().width
            }, destroy: function () {
                var a = this.defs;
                this.box = null;
                this.boxWrapper = this.boxWrapper.destroy();
                q(this.gradients || {});
                this.gradients = null;
                a && (this.defs = a.destroy());
                this.unSubPixelFix && this.unSubPixelFix();
                return this.alignedObjects = null
            }, createElement: function (a) {
                var b = new this.Element;
                b.init(this, a);
                return b
            }, draw: H, getRadialAttr: function (a, b) {
                return {
                    cx: a[0] - a[2] /
                        2 + b.cx * a[2], cy: a[1] - a[2] / 2 + b.cy * a[2], r: b.r * a[2]
                }
            }, truncate: function (a, b, d, e, p, g, A) {
                var c = this, k = a.rotation, f, q = e ? 1 : 0, C = (d || e).length, w = C, L = [], N = function (a) {
                    b.firstChild && b.removeChild(b.firstChild);
                    a && b.appendChild(m.createTextNode(a))
                }, n = function (g, k) {
                    k = k || g;
                    if (void 0 === L[k]) if (b.getSubStringLength) try {
                        L[k] = p + b.getSubStringLength(0, e ? k + 1 : k)
                    } catch (ba) {
                        ""
                    } else c.getSpanWidth && (N(A(d || e, g)), L[k] = p + c.getSpanWidth(a, b));
                    return L[k]
                }, J;
                a.rotation = 0;
                var u = n(b.textContent.length);
                if (J = p + u > g) {
                    for (; q <= C;) w =
                        Math.ceil((q + C) / 2), e && (f = A(e, w)), u = n(w, f && f.length - 1), q === C ? q = C + 1 : u > g ? C = w - 1 : q = w;
                    0 === C ? N("") : d && C === d.length - 1 || N(f || A(d || e, w))
                }
                e && e.splice(0, w);
                a.actualWidth = u;
                a.rotation = k;
                return J
            }, escapes: {"&": "&amp;", "<": "&lt;", ">": "&gt;", "'": "&#39;", '"': "&quot;"}, buildText: function (a) {
                var b = a.element, d = this, e = d.forExport, p = A(a.textStr, "").toString(),
                    c = -1 !== p.indexOf("<"), k = b.childNodes, q, C = f(b, "x"), w = a.styles, n = a.textWidth,
                    J = w && w.lineHeight, L = w && w.textOutline, u = w && "ellipsis" === w.textOverflow,
                    H = w && "nowrap" ===
                        w.whiteSpace, z = w && w.fontSize, M, r = k.length;
                w = n && !a.added && this.box;
                var l = function (a) {
                    var e;
                    d.styledMode || (e = /(px|em)$/.test(a && a.style.fontSize) ? a.style.fontSize : z || d.style.fontSize || 12);
                    return J ? v(J) : d.fontMetrics(e, a.getAttribute("style") ? a : b).h
                }, t = function (a, b) {
                    y(d.escapes, function (d, e) {
                        b && -1 !== b.indexOf(d) || (a = a.toString().replace(new RegExp(d, "g"), e))
                    });
                    return a
                }, P = function (a, b) {
                    var d = a.indexOf("<");
                    a = a.substring(d, a.indexOf(">") - d);
                    d = a.indexOf(b + "=");
                    if (-1 !== d && (d = d + b.length + 1, b = a.charAt(d),
                    '"' === b || "'" === b)) return a = a.substring(d + 1), a.substring(0, a.indexOf(b))
                }, B = /<br.*?>/g;
                var R = [p, u, H, J, L, z, n].join();
                if (R !== a.textCache) {
                    for (a.textCache = R; r--;) b.removeChild(k[r]);
                    c || L || u || n || -1 !== p.indexOf(" ") && (!H || B.test(p)) ? (w && w.appendChild(b), c ? (p = d.styledMode ? p.replace(/<(b|strong)>/g, '<span class="highcharts-strong">').replace(/<(i|em)>/g, '<span class="highcharts-emphasized">') : p.replace(/<(b|strong)>/g, '<span style="font-weight:bold">').replace(/<(i|em)>/g, '<span style="font-style:italic">'),
                        p = p.replace(/<a/g, "<span").replace(/<\/(b|strong|i|em|a)>/g, "</span>").split(B)) : p = [p], p = p.filter(function (a) {
                        return "" !== a
                    }), p.forEach(function (p, A) {
                        var c = 0, k = 0;
                        p = p.replace(/^\s+|\s+$/g, "").replace(/<span/g, "|||<span").replace(/<\/span>/g, "</span>|||");
                        var w = p.split("|||");
                        w.forEach(function (p) {
                            if ("" !== p || 1 === w.length) {
                                var L = {}, J = m.createElementNS(d.SVG_NS, "tspan"), Q, r;
                                (Q = P(p, "class")) && f(J, "class", Q);
                                if (Q = P(p, "style")) Q = Q.replace(/(;| |^)color([ :])/, "$1fill$2"), f(J, "style", Q);
                                (r = P(p, "href")) && !e &&
                                (f(J, "onclick", 'location.href="' + r + '"'), f(J, "class", "highcharts-anchor"), d.styledMode || g(J, {cursor: "pointer"}));
                                p = t(p.replace(/<[a-zA-Z\/](.|\n)*?>/g, "") || " ");
                                if (" " !== p) {
                                    J.appendChild(m.createTextNode(p));
                                    c ? L.dx = 0 : A && null !== C && (L.x = C);
                                    f(J, L);
                                    b.appendChild(J);
                                    !c && M && (!N && e && g(J, {display: "block"}), f(J, "dy", l(J)));
                                    if (n) {
                                        var S = p.replace(/([^\^])-/g, "$1- ").split(" ");
                                        L = !H && (1 < w.length || A || 1 < S.length);
                                        r = 0;
                                        var v = l(J);
                                        if (u) q = d.truncate(a, J, p, void 0, 0, Math.max(0, n - parseInt(z || 12, 10)), function (a, b) {
                                            return a.substring(0,
                                                b) + "\u2026"
                                        }); else if (L) for (; S.length;) S.length && !H && 0 < r && (J = m.createElementNS(T, "tspan"), f(J, {
                                            dy: v,
                                            x: C
                                        }), Q && f(J, "style", Q), J.appendChild(m.createTextNode(S.join(" ").replace(/- /g, "-"))), b.appendChild(J)), d.truncate(a, J, null, S, 0 === r ? k : 0, n, function (a, b) {
                                            return S.slice(0, b).join(" ").replace(/- /g, "-")
                                        }), k = a.actualWidth, r++
                                    }
                                    c++
                                }
                            }
                        });
                        M = M || b.childNodes.length
                    }), u && q && a.attr("title", t(a.textStr, ["&lt;", "&gt;"])), w && w.removeChild(b), L && a.applyTextOutline && a.applyTextOutline(L)) : b.appendChild(m.createTextNode(t(p)))
                }
            },
            getContrast: function (b) {
                b = a(b).rgba;
                b[0] *= 1;
                b[1] *= 1.2;
                b[2] *= .5;
                return 459 < b[0] + b[1] + b[2] ? "#000000" : "#FFFFFF"
            }, button: function (a, b, d, e, p, g, A, c, f, q) {
                var w = this.label(a, b, d, f, null, null, q, null, "button"), m = 0, J = this.styledMode;
                w.attr(C({padding: 8, r: 2}, p));
                if (!J) {
                    p = C({
                        fill: "#f7f7f7",
                        stroke: "#cccccc",
                        "stroke-width": 1,
                        style: {color: "#333333", cursor: "pointer", fontWeight: "normal"}
                    }, p);
                    var n = p.style;
                    delete p.style;
                    g = C(p, {fill: "#e6e6e6"}, g);
                    var N = g.style;
                    delete g.style;
                    A = C(p, {
                        fill: "#e6ebf5", style: {
                            color: "#000000",
                            fontWeight: "bold"
                        }
                    }, A);
                    var L = A.style;
                    delete A.style;
                    c = C(p, {style: {color: "#cccccc"}}, c);
                    var u = c.style;
                    delete c.style
                }
                r(w.element, k ? "mouseover" : "mouseenter", function () {
                    3 !== m && w.setState(1)
                });
                r(w.element, k ? "mouseout" : "mouseleave", function () {
                    3 !== m && w.setState(m)
                });
                w.setState = function (a) {
                    1 !== a && (w.state = m = a);
                    w.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-" + ["normal", "hover", "pressed", "disabled"][a || 0]);
                    J || w.attr([p, g, A, c][a || 0]).css([n, N, L, u][a || 0])
                };
                J ||
                w.attr(p).css(z({cursor: "default"}, n));
                return w.on("click", function (a) {
                    3 !== m && e.call(w, a)
                })
            }, crispLine: function (a, b) {
                a[1] === a[4] && (a[1] = a[4] = Math.round(a[1]) - b % 2 / 2);
                a[2] === a[5] && (a[2] = a[5] = Math.round(a[2]) + b % 2 / 2);
                return a
            }, path: function (a) {
                var b = this.styledMode ? {} : {fill: "none"};
                G(a) ? b.d = a : F(a) && z(b, a);
                return this.createElement("path").attr(b)
            }, circle: function (a, b, d) {
                a = F(a) ? a : void 0 === a ? {} : {x: a, y: b, r: d};
                b = this.createElement("circle");
                b.xSetter = b.ySetter = function (a, b, d) {
                    d.setAttribute("c" + b, a)
                };
                return b.attr(a)
            },
            arc: function (a, b, d, e, p, g) {
                F(a) ? (e = a, b = e.y, d = e.r, a = e.x) : e = {innerR: e, start: p, end: g};
                a = this.symbol("arc", a, b, d, d, e);
                a.r = d;
                return a
            }, rect: function (a, b, d, e, p, g) {
                p = F(a) ? a.r : p;
                var A = this.createElement("rect");
                a = F(a) ? a : void 0 === a ? {} : {x: a, y: b, width: Math.max(d, 0), height: Math.max(e, 0)};
                this.styledMode || (void 0 !== g && (a.strokeWidth = g, a = A.crisp(a)), a.fill = "none");
                p && (a.r = p);
                A.rSetter = function (a, b, d) {
                    A.r = a;
                    f(d, {rx: a, ry: a})
                };
                A.rGetter = function () {
                    return A.r
                };
                return A.attr(a)
            }, setSize: function (a, b, d) {
                var e = this.alignedObjects,
                    p = e.length;
                this.width = a;
                this.height = b;
                for (this.boxWrapper.animate({width: a, height: b}, {
                    step: function () {
                        this.attr({viewBox: "0 0 " + this.attr("width") + " " + this.attr("height")})
                    }, duration: A(d, !0) ? void 0 : 0
                }); p--;) e[p].align()
            }, g: function (a) {
                var b = this.createElement("g");
                return a ? b.attr({"class": "highcharts-" + a}) : b
            }, image: function (a, b, d, e, p, g) {
                var A = {preserveAspectRatio: "none"}, c = function (a, b) {
                    a.setAttributeNS ? a.setAttributeNS("http://www.w3.org/1999/xlink", "href", b) : a.setAttribute("hc-svg-href", b)
                }, k = function (b) {
                    c(f.element,
                        a);
                    g.call(f, b)
                };
                1 < arguments.length && z(A, {x: b, y: d, width: e, height: p});
                var f = this.createElement("image").attr(A);
                g ? (c(f.element, "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="), A = new R.Image, r(A, "load", k), A.src = a, A.complete && k({})) : c(f.element, a);
                return f
            }, symbol: function (a, d, p, c, k, f) {
                var q = this, w = /^url\((.*?)\)$/, C = w.test(a), J = !C && (this.symbols[a] ? a : "circle"),
                    n = J && this.symbols[J],
                    N = x(d) && n && n.call(this.symbols, Math.round(d), Math.round(p), c, k, f);
                if (n) {
                    var u = this.path(N);
                    q.styledMode || u.attr("fill", "none");
                    z(u, {symbolName: J, x: d, y: p, width: c, height: k});
                    f && z(u, f)
                } else if (C) {
                    var H = a.match(w)[1];
                    u = this.image(H);
                    u.imgwidth = A(P[H] && P[H].width, f && f.width);
                    u.imgheight = A(P[H] && P[H].height, f && f.height);
                    var M = function () {
                        u.attr({width: u.width, height: u.height})
                    };
                    ["width", "height"].forEach(function (a) {
                        u[a + "Setter"] = function (a, b) {
                            var d = {}, e = this["img" + b], p = "width" === b ? "translateX" : "translateY";
                            this[b] = a;
                            x(e) && (f && "within" === f.backgroundSize && this.width && this.height && (e = Math.round(e *
                                Math.min(this.width / this.imgwidth, this.height / this.imgheight))), this.element && this.element.setAttribute(b, e), this.alignByTranslate || (d[p] = ((this[b] || 0) - e) / 2, this.attr(d)))
                        }
                    });
                    x(d) && u.attr({x: d, y: p});
                    u.isImg = !0;
                    x(u.imgwidth) && x(u.imgheight) ? M() : (u.attr({width: 0, height: 0}), e("img", {
                        onload: function () {
                            var a = b[q.chartIndex];
                            0 === this.width && (g(this, {
                                position: "absolute",
                                top: "-999em"
                            }), m.body.appendChild(this));
                            P[H] = {width: this.width, height: this.height};
                            u.imgwidth = this.width;
                            u.imgheight = this.height;
                            u.element &&
                            M();
                            this.parentNode && this.parentNode.removeChild(this);
                            q.imgCount--;
                            if (!q.imgCount && a && a.onload) a.onload()
                        }, src: H
                    }), this.imgCount++)
                }
                return u
            }, symbols: {
                circle: function (a, b, d, e) {
                    return this.arc(a + d / 2, b + e / 2, d / 2, e / 2, {
                        start: .5 * Math.PI,
                        end: 2.5 * Math.PI,
                        open: !1
                    })
                }, square: function (a, b, d, e) {
                    return ["M", a, b, "L", a + d, b, a + d, b + e, a, b + e, "Z"]
                }, triangle: function (a, b, d, e) {
                    return ["M", a + d / 2, b, "L", a + d, b + e, a, b + e, "Z"]
                }, "triangle-down": function (a, b, d, e) {
                    return ["M", a, b, "L", a + d, b, a + d / 2, b + e, "Z"]
                }, diamond: function (a, b, d, e) {
                    return ["M",
                        a + d / 2, b, "L", a + d, b + e / 2, a + d / 2, b + e, a, b + e / 2, "Z"]
                }, arc: function (a, b, d, e, p) {
                    var g = p.start, c = p.r || d, k = p.r || e || d, f = p.end - .001;
                    d = p.innerR;
                    e = A(p.open, .001 > Math.abs(p.end - p.start - 2 * Math.PI));
                    var q = Math.cos(g), w = Math.sin(g), m = Math.cos(f);
                    f = Math.sin(f);
                    g = .001 > p.end - g - Math.PI ? 0 : 1;
                    p = ["M", a + c * q, b + k * w, "A", c, k, 0, g, A(p.clockwise, 1), a + c * m, b + k * f];
                    x(d) && p.push(e ? "M" : "L", a + d * m, b + d * f, "A", d, d, 0, g, 0, a + d * q, b + d * w);
                    p.push(e ? "" : "Z");
                    return p
                }, callout: function (a, b, d, e, p) {
                    var g = Math.min(p && p.r || 0, d, e), A = g + 6, c = p && p.anchorX;
                    p = p &&
                        p.anchorY;
                    var k = ["M", a + g, b, "L", a + d - g, b, "C", a + d, b, a + d, b, a + d, b + g, "L", a + d, b + e - g, "C", a + d, b + e, a + d, b + e, a + d - g, b + e, "L", a + g, b + e, "C", a, b + e, a, b + e, a, b + e - g, "L", a, b + g, "C", a, b, a, b, a + g, b];
                    c && c > d ? p > b + A && p < b + e - A ? k.splice(13, 3, "L", a + d, p - 6, a + d + 6, p, a + d, p + 6, a + d, b + e - g) : k.splice(13, 3, "L", a + d, e / 2, c, p, a + d, e / 2, a + d, b + e - g) : c && 0 > c ? p > b + A && p < b + e - A ? k.splice(33, 3, "L", a, p + 6, a - 6, p, a, p - 6, a, b + g) : k.splice(33, 3, "L", a, e / 2, c, p, a, e / 2, a, b + g) : p && p > e && c > a + A && c < a + d - A ? k.splice(23, 3, "L", c + 6, b + e, c, b + e + 6, c - 6, b + e, a + g, b + e) : p && 0 > p && c > a + A && c < a + d - A && k.splice(3,
                        3, "L", c - 6, b, c, b - 6, c + 6, b, d - g, b);
                    return k
                }
            }, clipRect: function (a, b, d, e) {
                var p = c.uniqueKey() + "-", g = this.createElement("clipPath").attr({id: p}).add(this.defs);
                a = this.rect(a, b, d, e, 0).add(g);
                a.id = p;
                a.clipPath = g;
                a.count = 0;
                return a
            }, text: function (a, b, d, e) {
                var p = {};
                if (e && (this.allowHTML || !this.forExport)) return this.html(a, b, d);
                p.x = Math.round(b || 0);
                d && (p.y = Math.round(d));
                x(a) && (p.text = a);
                a = this.createElement("text").attr(p);
                e || (a.xSetter = function (a, b, d) {
                    var e = d.getElementsByTagName("tspan"), p = d.getAttribute(b),
                        g;
                    for (g = 0; g < e.length; g++) {
                        var A = e[g];
                        A.getAttribute(b) === p && A.setAttribute(b, a)
                    }
                    d.setAttribute(b, a)
                });
                return a
            }, fontMetrics: function (a, b) {
                a = !this.styledMode && /px/.test(a) || !R.getComputedStyle ? a || b && b.style && b.style.fontSize || this.style && this.style.fontSize : b && M.prototype.getStyle.call(b, "font-size");
                a = /px/.test(a) ? v(a) : 12;
                b = 24 > a ? a + 3 : Math.round(1.2 * a);
                return {h: b, b: Math.round(.8 * b), f: a}
            }, rotCorr: function (a, b, e) {
                var p = a;
                b && e && (p = Math.max(p * Math.cos(b * d), 4));
                return {x: -a / 3 * Math.sin(b * d), y: p}
            }, label: function (a,
                                b, d, e, g, A, c, k, f) {
                var q = this, w = q.styledMode, m = q.g("button" !== f && "label"),
                    J = m.text = q.text("", 0, 0, c).attr({zIndex: 1}), n, N, u = 0, H = 3, r = 0, L, T, l, Q, t,
                    v = {}, S, P, y = /^url\((.*?)\)$/.test(e), R = w || y, h = function () {
                        return w ? n.strokeWidth() % 2 / 2 : (S ? parseInt(S, 10) : 0) % 2 / 2
                    };
                f && m.addClass("highcharts-" + f);
                var G = function () {
                    var a = J.element.style, b = {};
                    N = (void 0 === L || void 0 === T || t) && x(J.textStr) && J.getBBox();
                    m.width = (L || N.width || 0) + 2 * H + r;
                    m.height = (T || N.height || 0) + 2 * H;
                    P = H + Math.min(q.fontMetrics(a && a.fontSize, J).b, N ? N.height :
                        Infinity);
                    R && (n || (m.box = n = q.symbols[e] || y ? q.symbol(e) : q.rect(), n.addClass(("button" === f ? "" : "highcharts-label-box") + (f ? " highcharts-" + f + "-box" : "")), n.add(m), a = h(), b.x = a, b.y = (k ? -P : 0) + a), b.width = Math.round(m.width), b.height = Math.round(m.height), n.attr(z(b, v)), v = {})
                };
                var F = function () {
                    var a = r + H;
                    var b = k ? 0 : P;
                    x(L) && N && ("center" === t || "right" === t) && (a += {center: .5, right: 1}[t] * (L - N.width));
                    if (a !== J.x || b !== J.y) J.attr("x", a), J.hasBoxWidthChanged && (N = J.getBBox(!0), G()), void 0 !== b && J.attr("y", b);
                    J.x = a;
                    J.y = b
                };
                var V =
                    function (a, b) {
                        n ? n.attr(a, b) : v[a] = b
                    };
                m.onAdd = function () {
                    J.add(m);
                    m.attr({text: a || 0 === a ? a : "", x: b, y: d});
                    n && x(g) && m.attr({anchorX: g, anchorY: A})
                };
                m.widthSetter = function (a) {
                    L = B(a) ? a : null
                };
                m.heightSetter = function (a) {
                    T = a
                };
                m["text-alignSetter"] = function (a) {
                    t = a
                };
                m.paddingSetter = function (a) {
                    x(a) && a !== H && (H = m.padding = a, F())
                };
                m.paddingLeftSetter = function (a) {
                    x(a) && a !== r && (r = a, F())
                };
                m.alignSetter = function (a) {
                    a = {left: 0, center: .5, right: 1}[a];
                    a !== u && (u = a, N && m.attr({x: l}))
                };
                m.textSetter = function (a) {
                    void 0 !== a && J.attr({text: a});
                    G();
                    F()
                };
                m["stroke-widthSetter"] = function (a, b) {
                    a && (R = !0);
                    S = this["stroke-width"] = a;
                    V(b, a)
                };
                w ? m.rSetter = function (a, b) {
                    V(b, a)
                } : m.strokeSetter = m.fillSetter = m.rSetter = function (a, b) {
                    "r" !== b && ("fill" === b && a && (R = !0), m[b] = a);
                    V(b, a)
                };
                m.anchorXSetter = function (a, b) {
                    g = m.anchorX = a;
                    V(b, Math.round(a) - h() - l)
                };
                m.anchorYSetter = function (a, b) {
                    A = m.anchorY = a;
                    V(b, a - Q)
                };
                m.xSetter = function (a) {
                    m.x = a;
                    u && (a -= u * ((L || N.width) + 2 * H), m["forceAnimate:x"] = !0);
                    l = Math.round(a);
                    m.attr("translateX", l)
                };
                m.ySetter = function (a) {
                    Q = m.y = Math.round(a);
                    m.attr("translateY", Q)
                };
                var U = m.css;
                c = {
                    css: function (a) {
                        if (a) {
                            var b = {};
                            a = C(a);
                            m.textProps.forEach(function (d) {
                                void 0 !== a[d] && (b[d] = a[d], delete a[d])
                            });
                            J.css(b);
                            "width" in b && G();
                            "fontSize" in b && (G(), F())
                        }
                        return U.call(m, a)
                    }, getBBox: function () {
                        return {width: N.width + 2 * H, height: N.height + 2 * H, x: N.x - H, y: N.y - H}
                    }, destroy: function () {
                        p(m.element, "mouseenter");
                        p(m.element, "mouseleave");
                        J && (J = J.destroy());
                        n && (n = n.destroy());
                        M.prototype.destroy.call(m);
                        m = q = G = F = V = null
                    }
                };
                w || (c.shadow = function (a) {
                    a && (G(), n && n.shadow(a));
                    return m
                });
                return z(m, c)
            }
        });
        c.Renderer = h
    });
    K(D, "parts/Html.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined, E = h.pInt, G = c.attr, B = c.createElement, F = c.css, I = c.extend, y = c.isFirefox,
            v = c.isMS, t = c.isWebKit, r = c.pick, l = c.SVGElement;
        h = c.SVGRenderer;
        var f = c.win;
        I(l.prototype, {
            htmlCss: function (b) {
                var a = "SPAN" === this.element.tagName && b && "width" in b, g = r(a && b.width, void 0);
                if (a) {
                    delete b.width;
                    this.textWidth = g;
                    var e = !0
                }
                b && "ellipsis" === b.textOverflow && (b.whiteSpace = "nowrap", b.overflow =
                    "hidden");
                this.styles = I(this.styles, b);
                F(this.element, b);
                e && this.htmlUpdateTransform();
                return this
            }, htmlGetBBox: function () {
                var b = this.element;
                return {x: b.offsetLeft, y: b.offsetTop, width: b.offsetWidth, height: b.offsetHeight}
            }, htmlUpdateTransform: function () {
                if (this.added) {
                    var b = this.renderer, a = this.element, g = this.translateX || 0, e = this.translateY || 0,
                        d = this.x || 0, c = this.y || 0, f = this.textAlign || "left",
                        z = {left: 0, center: .5, right: 1}[f], n = this.styles, u = n && n.whiteSpace;
                    F(a, {marginLeft: g, marginTop: e});
                    !b.styledMode &&
                    this.shadows && this.shadows.forEach(function (a) {
                        F(a, {marginLeft: g + 1, marginTop: e + 1})
                    });
                    this.inverted && [].forEach.call(a.childNodes, function (d) {
                        b.invertChild(d, a)
                    });
                    if ("SPAN" === a.tagName) {
                        n = this.rotation;
                        var k = this.textWidth && E(this.textWidth),
                            w = [n, f, a.innerHTML, this.textWidth, this.textAlign].join(), C;
                        (C = k !== this.oldTextWidth) && !(C = k > this.oldTextWidth) && ((C = this.textPxLength) || (F(a, {
                            width: "",
                            whiteSpace: u || "nowrap"
                        }), C = a.offsetWidth), C = C > k);
                        C && (/[ \-]/.test(a.textContent || a.innerText) || "ellipsis" === a.style.textOverflow) ?
                            (F(a, {
                                width: k + "px",
                                display: "block",
                                whiteSpace: u || "normal"
                            }), this.oldTextWidth = k, this.hasBoxWidthChanged = !0) : this.hasBoxWidthChanged = !1;
                        w !== this.cTT && (u = b.fontMetrics(a.style.fontSize, a).b, !x(n) || n === (this.oldRotation || 0) && f === this.oldAlign || this.setSpanRotation(n, z, u), this.getSpanCorrection(!x(n) && this.textPxLength || a.offsetWidth, u, z, n, f));
                        F(a, {left: d + (this.xCorr || 0) + "px", top: c + (this.yCorr || 0) + "px"});
                        this.cTT = w;
                        this.oldRotation = n;
                        this.oldAlign = f
                    }
                } else this.alignOnAdd = !0
            }, setSpanRotation: function (b,
                                          a, g) {
                var e = {}, d = this.renderer.getTransformKey();
                e[d] = e.transform = "rotate(" + b + "deg)";
                e[d + (y ? "Origin" : "-origin")] = e.transformOrigin = 100 * a + "% " + g + "px";
                F(this.element, e)
            }, getSpanCorrection: function (b, a, g) {
                this.xCorr = -b * g;
                this.yCorr = -a
            }
        });
        I(h.prototype, {
            getTransformKey: function () {
                return v && !/Edge/.test(f.navigator.userAgent) ? "-ms-transform" : t ? "-webkit-transform" : y ? "MozTransform" : f.opera ? "-o-transform" : ""
            }, html: function (b, a, g) {
                var e = this.createElement("span"), d = e.element, f = e.renderer, m = f.isSVG, z = function (a,
                                                                                                              b) {
                    ["opacity", "visibility"].forEach(function (d) {
                        a[d + "Setter"] = function (e, g, A) {
                            var p = a.div ? a.div.style : b;
                            l.prototype[d + "Setter"].call(this, e, g, A);
                            p && (p[g] = e)
                        }
                    });
                    a.addedSetters = !0
                }, n = c.charts[f.chartIndex];
                n = n && n.styledMode;
                e.textSetter = function (a) {
                    a !== d.innerHTML && (delete this.bBox, delete this.oldTextWidth);
                    this.textStr = a;
                    d.innerHTML = r(a, "");
                    e.doTransform = !0
                };
                m && z(e, e.element.style);
                e.xSetter = e.ySetter = e.alignSetter = e.rotationSetter = function (a, b) {
                    "align" === b && (b = "textAlign");
                    e[b] = a;
                    e.doTransform = !0
                };
                e.afterSetters = function () {
                    this.doTransform && (this.htmlUpdateTransform(), this.doTransform = !1)
                };
                e.attr({text: b, x: Math.round(a), y: Math.round(g)}).css({position: "absolute"});
                n || e.css({fontFamily: this.style.fontFamily, fontSize: this.style.fontSize});
                d.style.whiteSpace = "nowrap";
                e.css = e.htmlCss;
                m && (e.add = function (a) {
                    var b = f.box.parentNode, g = [];
                    if (this.parentGroup = a) {
                        var c = a.div;
                        if (!c) {
                            for (; a;) g.push(a), a = a.parentGroup;
                            g.reverse().forEach(function (a) {
                                function d(b, d) {
                                    a[d] = b;
                                    "translateX" === d ? k.left = b + "px" : k.top =
                                        b + "px";
                                    a.doTransform = !0
                                }

                                var p = G(a.element, "class");
                                p && (p = {className: p});
                                c = a.div = a.div || B("div", p, {
                                    position: "absolute",
                                    left: (a.translateX || 0) + "px",
                                    top: (a.translateY || 0) + "px",
                                    display: a.display,
                                    opacity: a.opacity,
                                    pointerEvents: a.styles && a.styles.pointerEvents
                                }, c || b);
                                var k = c.style;
                                I(a, {
                                    classSetter: function (a) {
                                        return function (b) {
                                            this.element.setAttribute("class", b);
                                            a.className = b
                                        }
                                    }(c), on: function () {
                                        g[0].div && e.on.apply({element: g[0].div}, arguments);
                                        return a
                                    }, translateXSetter: d, translateYSetter: d
                                });
                                a.addedSetters ||
                                z(a)
                            })
                        }
                    } else c = b;
                    c.appendChild(d);
                    e.added = !0;
                    e.alignOnAdd && e.htmlUpdateTransform();
                    return e
                });
                return e
            }
        })
    });
    K(D, "parts/Tick.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined, E = h.isNumber, G = c.correctFloat, B = c.destroyObjectProperties, F = c.fireEvent,
            I = c.merge, y = c.pick, v = c.deg2rad;
        c.Tick = function (c, r, l, f, b) {
            this.axis = c;
            this.pos = r;
            this.type = l || "";
            this.isNewLabel = this.isNew = !0;
            this.parameters = b || {};
            this.tickmarkOffset = this.parameters.tickmarkOffset;
            this.options = this.parameters.options;
            l || f || this.addLabel()
        };
        c.Tick.prototype = {
            addLabel: function () {
                var t = this, r = t.axis, l = r.options, f = r.chart, b = r.categories, a = r.names, g = t.pos,
                    e = y(t.options && t.options.labels, l.labels), d = r.tickPositions, q = g === d[0],
                    m = g === d[d.length - 1];
                b = this.parameters.category || (b ? y(b[g], a[g], g) : g);
                var z = t.label;
                d = d.info;
                var n, u;
                if (r.isDatetimeAxis && d) {
                    var k = f.time.resolveDTLFormat(l.dateTimeLabelFormats[!l.grid && d.higherRanks[g] || d.unitName]);
                    var w = k.main
                }
                t.isFirst = q;
                t.isLast = m;
                t.formatCtx = {
                    axis: r, chart: f, isFirst: q, isLast: m,
                    dateTimeLabelFormat: w, tickPositionInfo: d, value: r.isLog ? G(r.lin2log(b)) : b, pos: g
                };
                l = r.labelFormatter.call(t.formatCtx, this.formatCtx);
                if (u = k && k.list) t.shortenLabel = function () {
                    for (n = 0; n < u.length; n++) if (z.attr({text: r.labelFormatter.call(c.extend(t.formatCtx, {dateTimeLabelFormat: u[n]}))}), z.getBBox().width < r.getSlotWidth(t) - 2 * y(e.padding, 5)) return;
                    z.attr({text: ""})
                };
                if (x(z)) z && z.textStr !== l && (!z.textWidth || e.style && e.style.width || z.styles.width || z.css({width: null}), z.attr({text: l}), z.textPxLength = z.getBBox().width);
                else {
                    if (t.label = z = x(l) && e.enabled ? f.renderer.text(l, 0, 0, e.useHTML).add(r.labelGroup) : null) f.styledMode || z.css(I(e.style)), z.textPxLength = z.getBBox().width;
                    t.rotation = 0
                }
            }, getLabelSize: function () {
                return this.label ? this.label.getBBox()[this.axis.horiz ? "height" : "width"] : 0
            }, handleOverflow: function (c) {
                var r = this.axis, l = r.options.labels, f = c.x, b = r.chart.chartWidth, a = r.chart.spacing,
                    g = y(r.labelLeft, Math.min(r.pos, a[3]));
                a = y(r.labelRight, Math.max(r.isRadial ? 0 : r.pos + r.len, b - a[1]));
                var e = this.label, d = this.rotation,
                    q = {left: 0, center: .5, right: 1}[r.labelAlign || e.attr("align")], m = e.getBBox().width,
                    z = r.getSlotWidth(this), n = z, u = 1, k, w = {};
                if (d || "justify" !== y(l.overflow, "justify")) 0 > d && f - q * m < g ? k = Math.round(f / Math.cos(d * v) - g) : 0 < d && f + q * m > a && (k = Math.round((b - f) / Math.cos(d * v))); else if (b = f + (1 - q) * m, f - q * m < g ? n = c.x + n * (1 - q) - g : b > a && (n = a - c.x + n * q, u = -1), n = Math.min(z, n), n < z && "center" === r.labelAlign && (c.x += u * (z - n - q * (z - Math.min(m, n)))), m > n || r.autoRotation && (e.styles || {}).width) k = n;
                k && (this.shortenLabel ? this.shortenLabel() : (w.width =
                    Math.floor(k), (l.style || {}).textOverflow || (w.textOverflow = "ellipsis"), e.css(w)))
            }, getPosition: function (t, r, l, f) {
                var b = this.axis, a = b.chart, g = f && a.oldChartHeight || a.chartHeight;
                t = {
                    x: t ? c.correctFloat(b.translate(r + l, null, null, f) + b.transB) : b.left + b.offset + (b.opposite ? (f && a.oldChartWidth || a.chartWidth) - b.right - b.left : 0),
                    y: t ? g - b.bottom + b.offset - (b.opposite ? b.height : 0) : c.correctFloat(g - b.translate(r + l, null, null, f) - b.transB)
                };
                t.y = Math.max(Math.min(t.y, 1E5), -1E5);
                F(this, "afterGetPosition", {pos: t});
                return t
            },
            getLabelPosition: function (c, r, l, f, b, a, g, e) {
                var d = this.axis, q = d.transA, m = d.reversed, z = d.staggerLines, n = d.tickRotCorr || {x: 0, y: 0},
                    u = b.y, k = f || d.reserveSpaceDefault ? 0 : -d.labelOffset * ("center" === d.labelAlign ? .5 : 1),
                    w = {};
                x(u) || (u = 0 === d.side ? l.rotation ? -8 : -l.getBBox().height : 2 === d.side ? n.y + 8 : Math.cos(l.rotation * v) * (n.y - l.getBBox(!1, 0).height / 2));
                c = c + b.x + k + n.x - (a && f ? a * q * (m ? -1 : 1) : 0);
                r = r + u - (a && !f ? a * q * (m ? 1 : -1) : 0);
                z && (l = g / (e || 1) % z, d.opposite && (l = z - l - 1), r += d.labelOffset / z * l);
                w.x = c;
                w.y = Math.round(r);
                F(this, "afterGetLabelPosition",
                    {pos: w, tickmarkOffset: a, index: g});
                return w
            }, getMarkPath: function (c, r, l, f, b, a) {
                return a.crispLine(["M", c, r, "L", c + (b ? 0 : -l), r + (b ? l : 0)], f)
            }, renderGridLine: function (c, r, l) {
                var f = this.axis, b = f.options, a = this.gridLine, g = {}, e = this.pos, d = this.type,
                    q = y(this.tickmarkOffset, f.tickmarkOffset), m = f.chart.renderer, z = d ? d + "Grid" : "grid",
                    n = b[z + "LineWidth"], u = b[z + "LineColor"];
                b = b[z + "LineDashStyle"];
                a || (f.chart.styledMode || (g.stroke = u, g["stroke-width"] = n, b && (g.dashstyle = b)), d || (g.zIndex = 1), c && (r = 0), this.gridLine = a = m.path().attr(g).addClass("highcharts-" +
                    (d ? d + "-" : "") + "grid-line").add(f.gridGroup));
                if (a && (l = f.getPlotLinePath({
                    value: e + q,
                    lineWidth: a.strokeWidth() * l,
                    force: "pass",
                    old: c
                }))) a[c || this.isNew ? "attr" : "animate"]({d: l, opacity: r})
            }, renderMark: function (c, r, l) {
                var f = this.axis, b = f.options, a = f.chart.renderer, g = this.type, e = g ? g + "Tick" : "tick",
                    d = f.tickSize(e), q = this.mark, m = !q, z = c.x;
                c = c.y;
                var n = y(b[e + "Width"], !g && f.isXAxis ? 1 : 0);
                b = b[e + "Color"];
                d && (f.opposite && (d[0] = -d[0]), m && (this.mark = q = a.path().addClass("highcharts-" + (g ? g + "-" : "") + "tick").add(f.axisGroup),
                f.chart.styledMode || q.attr({
                    stroke: b,
                    "stroke-width": n
                })), q[m ? "attr" : "animate"]({
                    d: this.getMarkPath(z, c, d[0], q.strokeWidth() * l, f.horiz, a),
                    opacity: r
                }))
            }, renderLabel: function (c, r, l, f) {
                var b = this.axis, a = b.horiz, g = b.options, e = this.label, d = g.labels, q = d.step;
                b = y(this.tickmarkOffset, b.tickmarkOffset);
                var m = !0, z = c.x;
                c = c.y;
                e && E(z) && (e.xy = c = this.getLabelPosition(z, c, e, a, d, b, f, q), this.isFirst && !this.isLast && !y(g.showFirstLabel, 1) || this.isLast && !this.isFirst && !y(g.showLastLabel, 1) ? m = !1 : !a || d.step || d.rotation ||
                    r || 0 === l || this.handleOverflow(c), q && f % q && (m = !1), m && E(c.y) ? (c.opacity = l, e[this.isNewLabel ? "attr" : "animate"](c), this.isNewLabel = !1) : (e.attr("y", -9999), this.isNewLabel = !0))
            }, render: function (t, r, l) {
                var f = this.axis, b = f.horiz, a = this.pos, g = y(this.tickmarkOffset, f.tickmarkOffset);
                a = this.getPosition(b, a, g, r);
                g = a.x;
                var e = a.y;
                f = b && g === f.pos + f.len || !b && e === f.pos ? -1 : 1;
                l = y(l, 1);
                this.isActive = !0;
                this.renderGridLine(r, l, f);
                this.renderMark(a, l, f);
                this.renderLabel(a, r, l, t);
                this.isNew = !1;
                c.fireEvent(this, "afterRender")
            },
            destroy: function () {
                B(this, this.axis)
            }
        }
    });
    K(D, "parts/Axis.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined, E = h.isArray, G = h.isNumber, B = h.isString, F = h.objectEach, I = h.splat, y = c.addEvent,
            v = c.animObject, t = c.arrayMax, r = c.arrayMin, l = c.color, f = c.correctFloat, b = c.defaultOptions,
            a = c.deg2rad, g = c.destroyObjectProperties, e = c.extend, d = c.fireEvent, q = c.format,
            m = c.getMagnitude, z = c.merge, n = c.normalizeTickInterval, u = c.pick, k = c.removeEvent,
            w = c.seriesTypes, C = c.syncTimeout, H = c.Tick;
        h = function () {
            this.init.apply(this,
                arguments)
        };
        c.extend(h.prototype, {
            defaultOptions: {
                dateTimeLabelFormats: {
                    millisecond: {main: "%H:%M:%S.%L", range: !1},
                    second: {main: "%H:%M:%S", range: !1},
                    minute: {main: "%H:%M", range: !1},
                    hour: {main: "%H:%M", range: !1},
                    day: {main: "%e. %b"},
                    week: {main: "%e. %b"},
                    month: {main: "%b '%y"},
                    year: {main: "%Y"}
                },
                endOnTick: !1,
                labels: {
                    enabled: !0,
                    indentation: 10,
                    x: 0,
                    style: {color: "#666666", cursor: "default", fontSize: "11px"}
                },
                maxPadding: .01,
                minorTickLength: 2,
                minorTickPosition: "outside",
                minPadding: .01,
                showEmpty: !0,
                startOfWeek: 1,
                startOnTick: !1,
                tickLength: 10,
                tickPixelInterval: 100,
                tickmarkPlacement: "between",
                tickPosition: "outside",
                title: {align: "middle", style: {color: "#666666"}},
                type: "linear",
                minorGridLineColor: "#f2f2f2",
                minorGridLineWidth: 1,
                minorTickColor: "#999999",
                lineColor: "#ccd6eb",
                lineWidth: 1,
                gridLineColor: "#e6e6e6",
                tickColor: "#ccd6eb"
            },
            defaultYAxisOptions: {
                endOnTick: !0,
                maxPadding: .05,
                minPadding: .05,
                tickPixelInterval: 72,
                showLastLabel: !0,
                labels: {x: -8},
                startOnTick: !0,
                title: {rotation: 270, text: "Values"},
                stackLabels: {
                    allowOverlap: !1,
                    enabled: !1, crop: !0, overflow: "justify", formatter: function () {
                        return c.numberFormat(this.total, -1)
                    }, style: {color: "#000000", fontSize: "11px", fontWeight: "bold", textOutline: "1px contrast"}
                },
                gridLineWidth: 1,
                lineWidth: 0
            },
            defaultLeftAxisOptions: {labels: {x: -15}, title: {rotation: 270}},
            defaultRightAxisOptions: {labels: {x: 15}, title: {rotation: 90}},
            defaultBottomAxisOptions: {labels: {autoRotation: [-45], x: 0}, margin: 15, title: {rotation: 0}},
            defaultTopAxisOptions: {labels: {autoRotation: [-45], x: 0}, margin: 15, title: {rotation: 0}},
            init: function (a, b) {
                var e = b.isX, p = this;
                p.chart = a;
                p.horiz = a.inverted && !p.isZAxis ? !e : e;
                p.isXAxis = e;
                p.coll = p.coll || (e ? "xAxis" : "yAxis");
                d(this, "init", {userOptions: b});
                p.opposite = b.opposite;
                p.side = b.side || (p.horiz ? p.opposite ? 0 : 2 : p.opposite ? 1 : 3);
                p.setOptions(b);
                var g = this.options, A = g.type;
                p.labelFormatter = g.labels.formatter || p.defaultLabelFormatter;
                p.userOptions = b;
                p.minPixelPadding = 0;
                p.reversed = g.reversed;
                p.visible = !1 !== g.visible;
                p.zoomEnabled = !1 !== g.zoomEnabled;
                p.hasNames = "category" === A || !0 === g.categories;
                p.categories = g.categories || p.hasNames;
                p.names || (p.names = [], p.names.keys = {});
                p.plotLinesAndBandsGroups = {};
                p.isLog = "logarithmic" === A;
                p.isDatetimeAxis = "datetime" === A;
                p.positiveValuesOnly = p.isLog && !p.allowNegativeLog;
                p.isLinked = x(g.linkedTo);
                p.ticks = {};
                p.labelEdge = [];
                p.minorTicks = {};
                p.plotLinesAndBands = [];
                p.alternateBands = {};
                p.len = 0;
                p.minRange = p.userMinRange = g.minRange || g.maxZoom;
                p.range = g.range;
                p.offset = g.offset || 0;
                p.stacks = {};
                p.oldStacks = {};
                p.stacksTouched = 0;
                p.max = null;
                p.min = null;
                p.crosshair = u(g.crosshair,
                    I(a.options.tooltip.crosshairs)[e ? 0 : 1], !1);
                b = p.options.events;
                -1 === a.axes.indexOf(p) && (e ? a.axes.splice(a.xAxis.length, 0, p) : a.axes.push(p), a[p.coll].push(p));
                p.series = p.series || [];
                a.inverted && !p.isZAxis && e && void 0 === p.reversed && (p.reversed = !0);
                F(b, function (a, b) {
                    c.isFunction(a) && y(p, b, a)
                });
                p.lin2log = g.linearToLogConverter || p.lin2log;
                p.isLog && (p.val2lin = p.log2lin, p.lin2val = p.lin2log);
                d(this, "afterInit")
            },
            setOptions: function (a) {
                this.options = z(this.defaultOptions, "yAxis" === this.coll && this.defaultYAxisOptions,
                    [this.defaultTopAxisOptions, this.defaultRightAxisOptions, this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side], z(b[this.coll], a));
                d(this, "afterSetOptions", {userOptions: a})
            },
            defaultLabelFormatter: function () {
                var a = this.axis, d = this.value, e = a.chart.time, g = a.categories, k = this.dateTimeLabelFormat,
                    f = b.lang, m = f.numericSymbols;
                f = f.numericSymbolMagnitude || 1E3;
                var w = m && m.length, C = a.options.labels.format;
                a = a.isLog ? Math.abs(d) : a.tickInterval;
                if (C) var n = q(C, this, e); else if (g) n = d; else if (k) n = e.dateFormat(k,
                    d); else if (w && 1E3 <= a) for (; w-- && void 0 === n;) e = Math.pow(f, w + 1), a >= e && 0 === 10 * d % e && null !== m[w] && 0 !== d && (n = c.numberFormat(d / e, -1) + m[w]);
                void 0 === n && (n = 1E4 <= Math.abs(d) ? c.numberFormat(d, -1) : c.numberFormat(d, -1, void 0, ""));
                return n
            },
            getSeriesExtremes: function () {
                var a = this, b = a.chart, e;
                d(this, "getSeriesExtremes", null, function () {
                    a.hasVisibleSeries = !1;
                    a.dataMin = a.dataMax = a.threshold = null;
                    a.softThreshold = !a.isXAxis;
                    a.buildStacks && a.buildStacks();
                    a.series.forEach(function (d) {
                        if (d.visible || !b.options.chart.ignoreHiddenSeries) {
                            var p =
                                d.options, g = p.threshold;
                            a.hasVisibleSeries = !0;
                            a.positiveValuesOnly && 0 >= g && (g = null);
                            if (a.isXAxis) {
                                if (p = d.xData, p.length) {
                                    e = d.getXExtremes(p);
                                    var c = e.min;
                                    var A = e.max;
                                    G(c) || c instanceof Date || (p = p.filter(G), e = d.getXExtremes(p), c = e.min, A = e.max);
                                    p.length && (a.dataMin = Math.min(u(a.dataMin, c), c), a.dataMax = Math.max(u(a.dataMax, A), A))
                                }
                            } else if (d.getExtremes(), A = d.dataMax, c = d.dataMin, x(c) && x(A) && (a.dataMin = Math.min(u(a.dataMin, c), c), a.dataMax = Math.max(u(a.dataMax, A), A)), x(g) && (a.threshold = g), !p.softThreshold ||
                            a.positiveValuesOnly) a.softThreshold = !1
                        }
                    })
                });
                d(this, "afterGetSeriesExtremes")
            },
            translate: function (a, b, d, e, g, c) {
                var p = this.linkedParent || this, A = 1, k = 0, f = e ? p.oldTransA : p.transA;
                e = e ? p.oldMin : p.min;
                var q = p.minPixelPadding;
                g = (p.isOrdinal || p.isBroken || p.isLog && g) && p.lin2val;
                f || (f = p.transA);
                d && (A *= -1, k = p.len);
                p.reversed && (A *= -1, k -= A * (p.sector || p.len));
                b ? (a = (a * A + k - q) / f + e, g && (a = p.lin2val(a))) : (g && (a = p.val2lin(a)), a = G(e) ? A * (a - e) * f + k + A * q + (G(c) ? f * c : 0) : void 0);
                return a
            },
            toPixels: function (a, b) {
                return this.translate(a,
                    !1, !this.horiz, null, !0) + (b ? 0 : this.pos)
            },
            toValue: function (a, b) {
                return this.translate(a - (b ? 0 : this.pos), !0, !this.horiz, null, !0)
            },
            getPlotLinePath: function (a) {
                var b = this, e = b.chart, g = b.left, c = b.top, k = a.old, A = a.value, f = a.translatedValue,
                    q = a.lineWidth, m = a.force, w, C, n, H, z = k && e.oldChartHeight || e.chartHeight,
                    r = k && e.oldChartWidth || e.chartWidth, l, t = b.transB, v = function (a, b, d) {
                        if ("pass" !== m && a < b || a > d) m ? a = Math.min(Math.max(b, a), d) : l = !0;
                        return a
                    };
                a = {value: A, lineWidth: q, old: k, force: m, acrossPanes: a.acrossPanes, translatedValue: f};
                d(this, "getPlotLinePath", a, function (a) {
                    f = u(f, b.translate(A, null, null, k));
                    f = Math.min(Math.max(-1E5, f), 1E5);
                    w = n = Math.round(f + t);
                    C = H = Math.round(z - f - t);
                    G(f) ? b.horiz ? (C = c, H = z - b.bottom, w = n = v(w, g, g + b.width)) : (w = g, n = r - b.right, C = H = v(C, c, c + b.height)) : (l = !0, m = !1);
                    a.path = l && !m ? null : e.renderer.crispLine(["M", w, C, "L", n, H], q || 1)
                });
                return a.path
            },
            getLinearTickPositions: function (a, b, d) {
                var e = f(Math.floor(b / a) * a);
                d = f(Math.ceil(d / a) * a);
                var p = [], g;
                f(e + a) === e && (g = 20);
                if (this.single) return [b];
                for (b = e; b <= d;) {
                    p.push(b);
                    b = f(b + a, g);
                    if (b === c) break;
                    var c = b
                }
                return p
            },
            getMinorTickInterval: function () {
                var a = this.options;
                return !0 === a.minorTicks ? u(a.minorTickInterval, "auto") : !1 === a.minorTicks ? null : a.minorTickInterval
            },
            getMinorTickPositions: function () {
                var a = this, b = a.options, d = a.tickPositions, e = a.minorTickInterval, g = [],
                    c = a.pointRangePadding || 0, k = a.min - c;
                c = a.max + c;
                var f = c - k;
                if (f && f / e < a.len / 3) if (a.isLog) this.paddedTicks.forEach(function (b, d, p) {
                    d && g.push.apply(g, a.getLogTickPositions(e, p[d - 1], p[d], !0))
                }); else if (a.isDatetimeAxis &&
                    "auto" === this.getMinorTickInterval()) g = g.concat(a.getTimeTicks(a.normalizeTimeTickInterval(e), k, c, b.startOfWeek)); else for (b = k + (d[0] - k) % e; b <= c && b !== g[0]; b += e) g.push(b);
                0 !== g.length && a.trimTicks(g);
                return g
            },
            adjustForMinRange: function () {
                var a = this.options, b = this.min, d = this.max, e, g, c, k, f;
                this.isXAxis && void 0 === this.minRange && !this.isLog && (x(a.min) || x(a.max) ? this.minRange = null : (this.series.forEach(function (a) {
                    k = a.xData;
                    for (g = f = a.xIncrement ? 1 : k.length - 1; 0 < g; g--) if (c = k[g] - k[g - 1], void 0 === e || c < e) e = c
                }),
                    this.minRange = Math.min(5 * e, this.dataMax - this.dataMin)));
                if (d - b < this.minRange) {
                    var q = this.dataMax - this.dataMin >= this.minRange;
                    var m = this.minRange;
                    var w = (m - d + b) / 2;
                    w = [b - w, u(a.min, b - w)];
                    q && (w[2] = this.isLog ? this.log2lin(this.dataMin) : this.dataMin);
                    b = t(w);
                    d = [b + m, u(a.max, b + m)];
                    q && (d[2] = this.isLog ? this.log2lin(this.dataMax) : this.dataMax);
                    d = r(d);
                    d - b < m && (w[0] = d - m, w[1] = u(a.min, d - m), b = t(w))
                }
                this.min = b;
                this.max = d
            },
            getClosest: function () {
                var a;
                this.categories ? a = 1 : this.series.forEach(function (b) {
                    var d = b.closestPointRange,
                        e = b.visible || !b.chart.options.chart.ignoreHiddenSeries;
                    !b.noSharedTooltip && x(d) && e && (a = x(a) ? Math.min(a, d) : d)
                });
                return a
            },
            nameToX: function (a) {
                var b = E(this.categories), d = b ? this.categories : this.names, e = a.options.x;
                a.series.requireSorting = !1;
                x(e) || (e = !1 === this.options.uniqueNames ? a.series.autoIncrement() : b ? d.indexOf(a.name) : u(d.keys[a.name], -1));
                if (-1 === e) {
                    if (!b) var g = d.length
                } else g = e;
                void 0 !== g && (this.names[g] = a.name, this.names.keys[a.name] = g);
                return g
            },
            updateNames: function () {
                var a = this, b = this.names;
                0 < b.length && (Object.keys(b.keys).forEach(function (a) {
                    delete b.keys[a]
                }), b.length = 0, this.minRange = this.userMinRange, (this.series || []).forEach(function (b) {
                    b.xIncrement = null;
                    if (!b.points || b.isDirtyData) a.max = Math.max(a.max, b.xData.length - 1), b.processData(), b.generatePoints();
                    b.data.forEach(function (d, e) {
                        if (d && d.options && void 0 !== d.name) {
                            var p = a.nameToX(d);
                            void 0 !== p && p !== d.x && (d.x = p, b.xData[e] = p)
                        }
                    })
                }))
            },
            setAxisTranslation: function (a) {
                var b = this, e = b.max - b.min, g = b.axisPointRange || 0, c = 0, k = 0, f = b.linkedParent,
                    A = !!b.categories, q = b.transA, m = b.isXAxis;
                if (m || A || g) {
                    var C = b.getClosest();
                    f ? (c = f.minPointOffset, k = f.pointRangePadding) : b.series.forEach(function (a) {
                        var d = A ? 1 : m ? u(a.options.pointRange, C, 0) : b.axisPointRange || 0,
                            e = a.options.pointPlacement;
                        g = Math.max(g, d);
                        if (!b.single || A) a = w.xrange && a instanceof w.xrange ? !m : m, c = Math.max(c, a && B(e) ? 0 : d / 2), k = Math.max(k, a && "on" === e ? 0 : d)
                    });
                    f = b.ordinalSlope && C ? b.ordinalSlope / C : 1;
                    b.minPointOffset = c *= f;
                    b.pointRangePadding = k *= f;
                    b.pointRange = Math.min(g, e);
                    m && (b.closestPointRange =
                        C)
                }
                a && (b.oldTransA = q);
                b.translationSlope = b.transA = q = b.staticScale || b.len / (e + k || 1);
                b.transB = b.horiz ? b.left : b.bottom;
                b.minPixelPadding = q * c;
                d(this, "afterSetAxisTranslation")
            },
            minFromRange: function () {
                return this.max - this.range
            },
            setTickInterval: function (a) {
                var b = this, e = b.chart, g = b.options, k = b.isLog, A = b.isDatetimeAxis, q = b.isXAxis,
                    w = b.isLinked, C = g.maxPadding, H = g.minPadding, z = g.tickInterval, r = g.tickPixelInterval,
                    l = b.categories, t = G(b.threshold) ? b.threshold : null, v = b.softThreshold;
                A || l || w || this.getTickAmount();
                var y = u(b.userMin, g.min);
                var B = u(b.userMax, g.max);
                if (w) {
                    b.linkedParent = e[b.coll][g.linkedTo];
                    var h = b.linkedParent.getExtremes();
                    b.min = u(h.min, h.dataMin);
                    b.max = u(h.max, h.dataMax);
                    g.type !== b.linkedParent.options.type && c.error(11, 1, e)
                } else {
                    if (!v && x(t)) if (b.dataMin >= t) h = t, H = 0; else if (b.dataMax <= t) {
                        var F = t;
                        C = 0
                    }
                    b.min = u(y, h, b.dataMin);
                    b.max = u(B, F, b.dataMax)
                }
                k && (b.positiveValuesOnly && !a && 0 >= Math.min(b.min, u(b.dataMin, b.min)) && c.error(10, 1, e), b.min = f(b.log2lin(b.min), 15), b.max = f(b.log2lin(b.max), 15));
                b.range &&
                x(b.max) && (b.userMin = b.min = y = Math.max(b.dataMin, b.minFromRange()), b.userMax = B = b.max, b.range = null);
                d(b, "foundExtremes");
                b.beforePadding && b.beforePadding();
                b.adjustForMinRange();
                !(l || b.axisPointRange || b.usePercentage || w) && x(b.min) && x(b.max) && (e = b.max - b.min) && (!x(y) && H && (b.min -= e * H), !x(B) && C && (b.max += e * C));
                G(g.softMin) && !G(b.userMin) && g.softMin < b.min && (b.min = y = g.softMin);
                G(g.softMax) && !G(b.userMax) && g.softMax > b.max && (b.max = B = g.softMax);
                G(g.floor) && (b.min = Math.min(Math.max(b.min, g.floor), Number.MAX_VALUE));
                G(g.ceiling) && (b.max = Math.max(Math.min(b.max, g.ceiling), u(b.userMax, -Number.MAX_VALUE)));
                v && x(b.dataMin) && (t = t || 0, !x(y) && b.min < t && b.dataMin >= t ? b.min = b.options.minRange ? Math.min(t, b.max - b.minRange) : t : !x(B) && b.max > t && b.dataMax <= t && (b.max = b.options.minRange ? Math.max(t, b.min + b.minRange) : t));
                b.tickInterval = b.min === b.max || void 0 === b.min || void 0 === b.max ? 1 : w && !z && r === b.linkedParent.options.tickPixelInterval ? z = b.linkedParent.tickInterval : u(z, this.tickAmount ? (b.max - b.min) / Math.max(this.tickAmount - 1, 1) : void 0,
                    l ? 1 : (b.max - b.min) * r / Math.max(b.len, r));
                q && !a && b.series.forEach(function (a) {
                    a.processData(b.min !== b.oldMin || b.max !== b.oldMax)
                });
                b.setAxisTranslation(!0);
                b.beforeSetTickPositions && b.beforeSetTickPositions();
                b.postProcessTickInterval && (b.tickInterval = b.postProcessTickInterval(b.tickInterval));
                b.pointRange && !z && (b.tickInterval = Math.max(b.pointRange, b.tickInterval));
                a = u(g.minTickInterval, b.isDatetimeAxis && b.closestPointRange);
                !z && b.tickInterval < a && (b.tickInterval = a);
                A || k || z || (b.tickInterval = n(b.tickInterval,
                    null, m(b.tickInterval), u(g.allowDecimals, !(.5 < b.tickInterval && 5 > b.tickInterval && 1E3 < b.max && 9999 > b.max)), !!this.tickAmount));
                this.tickAmount || (b.tickInterval = b.unsquish());
                this.setTickPositions()
            },
            setTickPositions: function () {
                var a = this.options, b = a.tickPositions;
                var e = this.getMinorTickInterval();
                var g = a.tickPositioner, k = a.startOnTick, f = a.endOnTick;
                this.tickmarkOffset = this.categories && "between" === a.tickmarkPlacement && 1 === this.tickInterval ? .5 : 0;
                this.minorTickInterval = "auto" === e && this.tickInterval ? this.tickInterval /
                    5 : e;
                this.single = this.min === this.max && x(this.min) && !this.tickAmount && (parseInt(this.min, 10) === this.min || !1 !== a.allowDecimals);
                this.tickPositions = e = b && b.slice();
                !e && (!this.ordinalPositions && (this.max - this.min) / this.tickInterval > Math.max(2 * this.len, 200) ? (e = [this.min, this.max], c.error(19, !1, this.chart)) : e = this.isDatetimeAxis ? this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval, a.units), this.min, this.max, a.startOfWeek, this.ordinalPositions, this.closestPointRange, !0) : this.isLog ? this.getLogTickPositions(this.tickInterval,
                    this.min, this.max) : this.getLinearTickPositions(this.tickInterval, this.min, this.max), e.length > this.len && (e = [e[0], e.pop()], e[0] === e[1] && (e.length = 1)), this.tickPositions = e, g && (g = g.apply(this, [this.min, this.max]))) && (this.tickPositions = e = g);
                this.paddedTicks = e.slice(0);
                this.trimTicks(e, k, f);
                this.isLinked || (this.single && 2 > e.length && !this.categories && (this.min -= .5, this.max += .5), b || g || this.adjustTickAmount());
                d(this, "afterSetTickPositions")
            },
            trimTicks: function (a, b, e) {
                var g = a[0], c = a[a.length - 1], p = this.minPointOffset ||
                    0;
                d(this, "trimTicks");
                if (!this.isLinked) {
                    if (b && -Infinity !== g) this.min = g; else for (; this.min - p > a[0];) a.shift();
                    if (e) this.max = c; else for (; this.max + p < a[a.length - 1];) a.pop();
                    0 === a.length && x(g) && !this.options.tickPositions && a.push((c + g) / 2)
                }
            },
            alignToOthers: function () {
                var a = {}, b, d = this.options;
                !1 === this.chart.options.chart.alignTicks || !1 === d.alignTicks || !1 === d.startOnTick || !1 === d.endOnTick || this.isLog || this.chart[this.coll].forEach(function (d) {
                    var e = d.options;
                    e = [d.horiz ? e.left : e.top, e.width, e.height, e.pane].join();
                    d.series.length && (a[e] ? b = !0 : a[e] = 1)
                });
                return b
            },
            getTickAmount: function () {
                var a = this.options, b = a.tickAmount, d = a.tickPixelInterval;
                !x(a.tickInterval) && this.len < d && !this.isRadial && !this.isLog && a.startOnTick && a.endOnTick && (b = 2);
                !b && this.alignToOthers() && (b = Math.ceil(this.len / d) + 1);
                4 > b && (this.finalTickAmt = b, b = 5);
                this.tickAmount = b
            },
            adjustTickAmount: function () {
                var a = this.options, b = this.tickInterval, d = this.tickPositions, e = this.tickAmount,
                    g = this.finalTickAmt, c = d && d.length, k = u(this.threshold, this.softThreshold ?
                    0 : null), q;
                if (this.hasData()) {
                    if (c < e) {
                        for (q = this.min; d.length < e;) d.length % 2 || q === k ? d.push(f(d[d.length - 1] + b)) : d.unshift(f(d[0] - b));
                        this.transA *= (c - 1) / (e - 1);
                        this.min = a.startOnTick ? d[0] : Math.min(this.min, d[0]);
                        this.max = a.endOnTick ? d[d.length - 1] : Math.max(this.max, d[d.length - 1])
                    } else c > e && (this.tickInterval *= 2, this.setTickPositions());
                    if (x(g)) {
                        for (b = a = d.length; b--;) (3 === g && 1 === b % 2 || 2 >= g && 0 < b && b < a - 1) && d.splice(b, 1);
                        this.finalTickAmt = void 0
                    }
                }
            },
            setScale: function () {
                var a = this.series.some(function (a) {
                    return a.isDirtyData ||
                        a.isDirty || a.xAxis.isDirty
                }), b;
                this.oldMin = this.min;
                this.oldMax = this.max;
                this.oldAxisLength = this.len;
                this.setAxisSize();
                (b = this.len !== this.oldAxisLength) || a || this.isLinked || this.forceRedraw || this.userMin !== this.oldUserMin || this.userMax !== this.oldUserMax || this.alignToOthers() ? (this.resetStacks && this.resetStacks(), this.forceRedraw = !1, this.getSeriesExtremes(), this.setTickInterval(), this.oldUserMin = this.userMin, this.oldUserMax = this.userMax, this.isDirty || (this.isDirty = b || this.min !== this.oldMin || this.max !==
                    this.oldMax)) : this.cleanStacks && this.cleanStacks();
                d(this, "afterSetScale")
            },
            setExtremes: function (a, b, g, c, k) {
                var p = this, f = p.chart;
                g = u(g, !0);
                p.series.forEach(function (a) {
                    delete a.kdTree
                });
                k = e(k, {min: a, max: b});
                d(p, "setExtremes", k, function () {
                    p.userMin = a;
                    p.userMax = b;
                    p.eventArgs = k;
                    g && f.redraw(c)
                })
            },
            zoom: function (a, b) {
                var e = this.dataMin, g = this.dataMax, c = this.options, k = Math.min(e, u(c.min, e)),
                    p = Math.max(g, u(c.max, g));
                a = {newMin: a, newMax: b};
                d(this, "zoom", a, function (a) {
                    var b = a.newMin, d = a.newMax;
                    if (b !== this.min ||
                        d !== this.max) this.allowZoomOutside || (x(e) && (b < k && (b = k), b > p && (b = p)), x(g) && (d < k && (d = k), d > p && (d = p))), this.displayBtn = void 0 !== b || void 0 !== d, this.setExtremes(b, d, !1, void 0, {trigger: "zoom"});
                    a.zoomed = !0
                });
                return a.zoomed
            },
            setAxisSize: function () {
                var a = this.chart, b = this.options, d = b.offsets || [0, 0, 0, 0], e = this.horiz,
                    g = this.width = Math.round(c.relativeLength(u(b.width, a.plotWidth - d[3] + d[1]), a.plotWidth)),
                    k = this.height = Math.round(c.relativeLength(u(b.height, a.plotHeight - d[0] + d[2]), a.plotHeight)),
                    f = this.top = Math.round(c.relativeLength(u(b.top,
                        a.plotTop + d[0]), a.plotHeight, a.plotTop));
                b = this.left = Math.round(c.relativeLength(u(b.left, a.plotLeft + d[3]), a.plotWidth, a.plotLeft));
                this.bottom = a.chartHeight - k - f;
                this.right = a.chartWidth - g - b;
                this.len = Math.max(e ? g : k, 0);
                this.pos = e ? b : f
            },
            getExtremes: function () {
                var a = this.isLog;
                return {
                    min: a ? f(this.lin2log(this.min)) : this.min,
                    max: a ? f(this.lin2log(this.max)) : this.max,
                    dataMin: this.dataMin,
                    dataMax: this.dataMax,
                    userMin: this.userMin,
                    userMax: this.userMax
                }
            },
            getThreshold: function (a) {
                var b = this.isLog, d = b ? this.lin2log(this.min) :
                    this.min;
                b = b ? this.lin2log(this.max) : this.max;
                null === a || -Infinity === a ? a = d : Infinity === a ? a = b : d > a ? a = d : b < a && (a = b);
                return this.translate(a, 0, 1, 0, 1)
            },
            autoLabelAlign: function (a) {
                var b = (u(a, 0) - 90 * this.side + 720) % 360;
                a = {align: "center"};
                d(this, "autoLabelAlign", a, function (a) {
                    15 < b && 165 > b ? a.align = "right" : 195 < b && 345 > b && (a.align = "left")
                });
                return a.align
            },
            tickSize: function (a) {
                var b = this.options, e = b[a + "Length"],
                    g = u(b[a + "Width"], "tick" === a && this.isXAxis && !this.categories ? 1 : 0);
                if (g && e) {
                    "inside" === b[a + "Position"] && (e =
                        -e);
                    var c = [e, g]
                }
                a = {tickSize: c};
                d(this, "afterTickSize", a);
                return a.tickSize
            },
            labelMetrics: function () {
                var a = this.tickPositions && this.tickPositions[0] || 0;
                return this.chart.renderer.fontMetrics(this.options.labels.style && this.options.labels.style.fontSize, this.ticks[a] && this.ticks[a].label)
            },
            unsquish: function () {
                var b = this.options.labels, d = this.horiz, e = this.tickInterval, g = e,
                    c = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / e), k, q = b.rotation,
                    m = this.labelMetrics(), w, C = Number.MAX_VALUE, n, H = this.max - this.min,
                    z = function (a) {
                        var b = a / (c || 1);
                        b = 1 < b ? Math.ceil(b) : 1;
                        b * e > H && Infinity !== a && Infinity !== c && (b = Math.ceil(H / e));
                        return f(b * e)
                    };
                d ? (n = !b.staggerLines && !b.step && (x(q) ? [q] : c < u(b.autoRotationLimit, 80) && b.autoRotation)) && n.forEach(function (b) {
                    if (b === q || b && -90 <= b && 90 >= b) {
                        w = z(Math.abs(m.h / Math.sin(a * b)));
                        var d = w + Math.abs(b / 360);
                        d < C && (C = d, k = b, g = w)
                    }
                }) : b.step || (g = z(m.h));
                this.autoRotation = n;
                this.labelRotation = u(k, q);
                return g
            },
            getSlotWidth: function (a) {
                var b = this.chart, d = this.horiz, e = this.options.labels, g = Math.max(this.tickPositions.length -
                    (this.categories ? 0 : 1), 1), c = b.margin[3];
                return a && a.slotWidth || d && 2 > (e.step || 0) && !e.rotation && (this.staggerLines || 1) * this.len / g || !d && (e.style && parseInt(e.style.width, 10) || c && c - b.spacing[3] || .33 * b.chartWidth)
            },
            renderUnsquish: function () {
                var a = this.chart, b = a.renderer, d = this.tickPositions, e = this.ticks, g = this.options.labels,
                    c = g && g.style || {}, k = this.horiz, f = this.getSlotWidth(),
                    q = Math.max(1, Math.round(f - 2 * (g.padding || 5))), m = {}, w = this.labelMetrics(),
                    C = g.style && g.style.textOverflow, n = 0;
                B(g.rotation) || (m.rotation =
                    g.rotation || 0);
                d.forEach(function (a) {
                    (a = e[a]) && a.label && a.label.textPxLength > n && (n = a.label.textPxLength)
                });
                this.maxLabelLength = n;
                if (this.autoRotation) n > q && n > w.h ? m.rotation = this.labelRotation : this.labelRotation = 0; else if (f) {
                    var u = q;
                    if (!C) {
                        var H = "clip";
                        for (q = d.length; !k && q--;) {
                            var z = d[q];
                            if (z = e[z].label) z.styles && "ellipsis" === z.styles.textOverflow ? z.css({textOverflow: "clip"}) : z.textPxLength > f && z.css({width: f + "px"}), z.getBBox().height > this.len / d.length - (w.h - w.f) && (z.specificTextOverflow = "ellipsis")
                        }
                    }
                }
                m.rotation &&
                (u = n > .5 * a.chartHeight ? .33 * a.chartHeight : n, C || (H = "ellipsis"));
                if (this.labelAlign = g.align || this.autoLabelAlign(this.labelRotation)) m.align = this.labelAlign;
                d.forEach(function (a) {
                    var b = (a = e[a]) && a.label, d = c.width, g = {};
                    b && (b.attr(m), a.shortenLabel ? a.shortenLabel() : u && !d && "nowrap" !== c.whiteSpace && (u < b.textPxLength || "SPAN" === b.element.tagName) ? (g.width = u, C || (g.textOverflow = b.specificTextOverflow || H), b.css(g)) : b.styles && b.styles.width && !g.width && !d && b.css({width: null}), delete b.specificTextOverflow, a.rotation =
                        m.rotation)
                }, this);
                this.tickRotCorr = b.rotCorr(w.b, this.labelRotation || 0, 0 !== this.side)
            },
            hasData: function () {
                return this.series.some(function (a) {
                    return a.hasData()
                }) || this.options.showEmpty && x(this.min) && x(this.max)
            },
            addTitle: function (a) {
                var b = this.chart.renderer, d = this.horiz, e = this.opposite, g = this.options.title, c,
                    k = this.chart.styledMode;
                this.axisTitle || ((c = g.textAlign) || (c = (d ? {
                    low: "left",
                    middle: "center",
                    high: "right"
                } : {
                    low: e ? "right" : "left",
                    middle: "center",
                    high: e ? "left" : "right"
                })[g.align]), this.axisTitle =
                    b.text(g.text, 0, 0, g.useHTML).attr({
                        zIndex: 7,
                        rotation: g.rotation || 0,
                        align: c
                    }).addClass("highcharts-axis-title"), k || this.axisTitle.css(z(g.style)), this.axisTitle.add(this.axisGroup), this.axisTitle.isNew = !0);
                k || g.style.width || this.isRadial || this.axisTitle.css({width: this.len});
                this.axisTitle[a ? "show" : "hide"](a)
            },
            generateTick: function (a) {
                var b = this.ticks;
                b[a] ? b[a].addLabel() : b[a] = new H(this, a)
            },
            getOffset: function () {
                var a = this, b = a.chart, e = b.renderer, g = a.options, c = a.tickPositions, k = a.ticks, f = a.horiz,
                    q =
                        a.side, m = b.inverted && !a.isZAxis ? [1, 0, 3, 2][q] : q, w, C = 0, n = 0, H = g.title,
                    z = g.labels, r = 0, l = b.axisOffset;
                b = b.clipOffset;
                var t = [-1, 1, 1, -1][q], v = g.className, y = a.axisParent;
                var B = a.hasData();
                a.showAxis = w = B || u(g.showEmpty, !0);
                a.staggerLines = a.horiz && z.staggerLines;
                a.axisGroup || (a.gridGroup = e.g("grid").attr({zIndex: g.gridZIndex || 1}).addClass("highcharts-" + this.coll.toLowerCase() + "-grid " + (v || "")).add(y), a.axisGroup = e.g("axis").attr({zIndex: g.zIndex || 2}).addClass("highcharts-" + this.coll.toLowerCase() + " " + (v || "")).add(y),
                    a.labelGroup = e.g("axis-labels").attr({zIndex: z.zIndex || 7}).addClass("highcharts-" + a.coll.toLowerCase() + "-labels " + (v || "")).add(y));
                B || a.isLinked ? (c.forEach(function (b, d) {
                    a.generateTick(b, d)
                }), a.renderUnsquish(), a.reserveSpaceDefault = 0 === q || 2 === q || {
                    1: "left",
                    3: "right"
                }[q] === a.labelAlign, u(z.reserveSpace, "center" === a.labelAlign ? !0 : null, a.reserveSpaceDefault) && c.forEach(function (a) {
                    r = Math.max(k[a].getLabelSize(), r)
                }), a.staggerLines && (r *= a.staggerLines), a.labelOffset = r * (a.opposite ? -1 : 1)) : F(k, function (a,
                                                                                                                         b) {
                    a.destroy();
                    delete k[b]
                });
                if (H && H.text && !1 !== H.enabled && (a.addTitle(w), w && !1 !== H.reserveSpace)) {
                    a.titleOffset = C = a.axisTitle.getBBox()[f ? "height" : "width"];
                    var h = H.offset;
                    n = x(h) ? 0 : u(H.margin, f ? 5 : 10)
                }
                a.renderLine();
                a.offset = t * u(g.offset, l[q] ? l[q] + (g.margin || 0) : 0);
                a.tickRotCorr = a.tickRotCorr || {x: 0, y: 0};
                e = 0 === q ? -a.labelMetrics().h : 2 === q ? a.tickRotCorr.y : 0;
                n = Math.abs(r) + n;
                r && (n = n - e + t * (f ? u(z.y, a.tickRotCorr.y + 8 * t) : z.x));
                a.axisTitleMargin = u(h, n);
                a.getMaxLabelDimensions && (a.maxLabelDimensions = a.getMaxLabelDimensions(k,
                    c));
                f = this.tickSize("tick");
                l[q] = Math.max(l[q], a.axisTitleMargin + C + t * a.offset, n, c && c.length && f ? f[0] + t * a.offset : 0);
                g = g.offset ? 0 : 2 * Math.floor(a.axisLine.strokeWidth() / 2);
                b[m] = Math.max(b[m], g);
                d(this, "afterGetOffset")
            },
            getLinePath: function (a) {
                var b = this.chart, d = this.opposite, e = this.offset, g = this.horiz,
                    c = this.left + (d ? this.width : 0) + e;
                e = b.chartHeight - this.bottom - (d ? this.height : 0) + e;
                d && (a *= -1);
                return b.renderer.crispLine(["M", g ? this.left : c, g ? e : this.top, "L", g ? b.chartWidth - this.right : c, g ? e : b.chartHeight - this.bottom],
                    a)
            },
            renderLine: function () {
                this.axisLine || (this.axisLine = this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup), this.chart.styledMode || this.axisLine.attr({
                    stroke: this.options.lineColor,
                    "stroke-width": this.options.lineWidth,
                    zIndex: 7
                }))
            },
            getTitlePosition: function () {
                var a = this.horiz, b = this.left, e = this.top, g = this.len, c = this.options.title, k = a ? b : e,
                    f = this.opposite, q = this.offset, m = c.x || 0, w = c.y || 0, C = this.axisTitle,
                    n = this.chart.renderer.fontMetrics(c.style && c.style.fontSize, C);
                C = Math.max(C.getBBox(null,
                    0).height - n.h - 1, 0);
                g = {low: k + (a ? 0 : g), middle: k + g / 2, high: k + (a ? g : 0)}[c.align];
                b = (a ? e + this.height : b) + (a ? 1 : -1) * (f ? -1 : 1) * this.axisTitleMargin + [-C, C, n.f, -C][this.side];
                a = {x: a ? g + m : b + (f ? this.width : 0) + q + m, y: a ? b + w - (f ? this.height : 0) + q : g + w};
                d(this, "afterGetTitlePosition", {titlePosition: a});
                return a
            },
            renderMinorTick: function (a) {
                var b = this.chart.hasRendered && G(this.oldMin), d = this.minorTicks;
                d[a] || (d[a] = new H(this, a, "minor"));
                b && d[a].isNew && d[a].render(null, !0);
                d[a].render(null, !1, 1)
            },
            renderTick: function (a, b) {
                var d =
                    this.isLinked, e = this.ticks, g = this.chart.hasRendered && G(this.oldMin);
                if (!d || a >= this.min && a <= this.max) e[a] || (e[a] = new H(this, a)), g && e[a].isNew && e[a].render(b, !0, -1), e[a].render(b)
            },
            render: function () {
                var a = this, b = a.chart, e = a.options, g = a.isLog, k = a.isLinked, f = a.tickPositions,
                    q = a.axisTitle, m = a.ticks, w = a.minorTicks, n = a.alternateBands, u = e.stackLabels,
                    z = e.alternateGridColor, r = a.tickmarkOffset, l = a.axisLine, t = a.showAxis,
                    y = v(b.renderer.globalAnimation), B, h;
                a.labelEdge.length = 0;
                a.overlap = !1;
                [m, w, n].forEach(function (a) {
                    F(a,
                        function (a) {
                            a.isActive = !1
                        })
                });
                if (a.hasData() || k) a.minorTickInterval && !a.categories && a.getMinorTickPositions().forEach(function (b) {
                    a.renderMinorTick(b)
                }), f.length && (f.forEach(function (b, d) {
                    a.renderTick(b, d)
                }), r && (0 === a.min || a.single) && (m[-1] || (m[-1] = new H(a, -1, null, !0)), m[-1].render(-1))), z && f.forEach(function (d, e) {
                    h = void 0 !== f[e + 1] ? f[e + 1] + r : a.max - r;
                    0 === e % 2 && d < a.max && h <= a.max + (b.polar ? -r : r) && (n[d] || (n[d] = new c.PlotLineOrBand(a)), B = d + r, n[d].options = {
                        from: g ? a.lin2log(B) : B,
                        to: g ? a.lin2log(h) : h,
                        color: z
                    },
                        n[d].render(), n[d].isActive = !0)
                }), a._addedPlotLB || ((e.plotLines || []).concat(e.plotBands || []).forEach(function (b) {
                    a.addPlotBandOrLine(b)
                }), a._addedPlotLB = !0);
                [m, w, n].forEach(function (a) {
                    var d, e = [], g = y.duration;
                    F(a, function (a, b) {
                        a.isActive || (a.render(b, !1, 0), a.isActive = !1, e.push(b))
                    });
                    C(function () {
                        for (d = e.length; d--;) a[e[d]] && !a[e[d]].isActive && (a[e[d]].destroy(), delete a[e[d]])
                    }, a !== n && b.hasRendered && g ? g : 0)
                });
                l && (l[l.isPlaced ? "animate" : "attr"]({d: this.getLinePath(l.strokeWidth())}), l.isPlaced = !0, l[t ?
                    "show" : "hide"](t));
                q && t && (e = a.getTitlePosition(), G(e.y) ? (q[q.isNew ? "attr" : "animate"](e), q.isNew = !1) : (q.attr("y", -9999), q.isNew = !0));
                u && u.enabled && a.renderStackTotals();
                a.isDirty = !1;
                d(this, "afterRender")
            },
            redraw: function () {
                this.visible && (this.render(), this.plotLinesAndBands.forEach(function (a) {
                    a.render()
                }));
                this.series.forEach(function (a) {
                    a.isDirty = !0
                })
            },
            keepProps: "extKey hcEvents names series userMax userMin".split(" "),
            destroy: function (a) {
                var b = this, e = b.stacks, c = b.plotLinesAndBands, f;
                d(this, "destroy",
                    {keepEvents: a});
                a || k(b);
                F(e, function (a, b) {
                    g(a);
                    e[b] = null
                });
                [b.ticks, b.minorTicks, b.alternateBands].forEach(function (a) {
                    g(a)
                });
                if (c) for (a = c.length; a--;) c[a].destroy();
                "stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross scrollbar".split(" ").forEach(function (a) {
                    b[a] && (b[a] = b[a].destroy())
                });
                for (f in b.plotLinesAndBandsGroups) b.plotLinesAndBandsGroups[f] = b.plotLinesAndBandsGroups[f].destroy();
                F(b, function (a, d) {
                    -1 === b.keepProps.indexOf(d) && delete b[d]
                })
            },
            drawCrosshair: function (a,
                                     b) {
                var e, g = this.crosshair, c = u(g.snap, !0), k, f = this.cross;
                d(this, "drawCrosshair", {e: a, point: b});
                a || (a = this.cross && this.cross.e);
                if (this.crosshair && !1 !== (x(b) || !c)) {
                    c ? x(b) && (k = u(b.crosshairPos, this.isXAxis ? b.plotX : this.len - b.plotY)) : k = a && (this.horiz ? a.chartX - this.pos : this.len - a.chartY + this.pos);
                    x(k) && (e = this.getPlotLinePath({
                        value: b && (this.isXAxis ? b.x : u(b.stackY, b.y)),
                        translatedValue: k
                    }) || null);
                    if (!x(e)) {
                        this.hideCrosshair();
                        return
                    }
                    c = this.categories && !this.isRadial;
                    f || (this.cross = f = this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-" +
                        (c ? "category " : "thin ") + g.className).attr({zIndex: u(g.zIndex, 2)}).add(), this.chart.styledMode || (f.attr({
                        stroke: g.color || (c ? l("#ccd6eb").setOpacity(.25).get() : "#cccccc"),
                        "stroke-width": u(g.width, 1)
                    }).css({"pointer-events": "none"}), g.dashStyle && f.attr({dashstyle: g.dashStyle})));
                    f.show().attr({d: e});
                    c && !g.width && f.attr({"stroke-width": this.transA});
                    this.cross.e = a
                } else this.hideCrosshair();
                d(this, "afterDrawCrosshair", {e: a, point: b})
            },
            hideCrosshair: function () {
                this.cross && this.cross.hide();
                d(this, "afterHideCrosshair")
            }
        });
        return c.Axis = h
    });
    K(D, "parts/LogarithmicAxis.js", [D["parts/Globals.js"]], function (c) {
        var h = c.Axis, x = c.getMagnitude, E = c.normalizeTickInterval, G = c.pick;
        h.prototype.getLogTickPositions = function (c, h, I, y) {
            var v = this.options, t = this.len, r = [];
            y || (this._minorAutoInterval = null);
            if (.5 <= c) c = Math.round(c), r = this.getLinearTickPositions(c, h, I); else if (.08 <= c) {
                t = Math.floor(h);
                var l, f;
                for (v = .3 < c ? [1, 2, 4] : .15 < c ? [1, 2, 4, 6, 8] : [1, 2, 3, 4, 5, 6, 7, 8, 9]; t < I + 1 && !f; t++) {
                    var b = v.length;
                    for (l = 0; l < b && !f; l++) {
                        var a = this.log2lin(this.lin2log(t) *
                            v[l]);
                        a > h && (!y || g <= I) && void 0 !== g && r.push(g);
                        g > I && (f = !0);
                        var g = a
                    }
                }
            } else h = this.lin2log(h), I = this.lin2log(I), c = y ? this.getMinorTickInterval() : v.tickInterval, c = G("auto" === c ? null : c, this._minorAutoInterval, v.tickPixelInterval / (y ? 5 : 1) * (I - h) / ((y ? t / this.tickPositions.length : t) || 1)), c = E(c, null, x(c)), r = this.getLinearTickPositions(c, h, I).map(this.log2lin), y || (this._minorAutoInterval = c / 5);
            y || (this.tickInterval = c);
            return r
        };
        h.prototype.log2lin = function (c) {
            return Math.log(c) / Math.LN10
        };
        h.prototype.lin2log = function (c) {
            return Math.pow(10,
                c)
        }
    });
    K(D, "parts/PlotLineOrBand.js", [D["parts/Globals.js"], D["parts/Axis.js"], D["parts/Utilities.js"]], function (c, h, x) {
        var E = x.defined, G = x.erase, B = x.objectEach, F = c.arrayMax, I = c.arrayMin, y = c.destroyObjectProperties,
            v = c.merge, t = c.pick;
        c.PlotLineOrBand = function (c, l) {
            this.axis = c;
            l && (this.options = l, this.id = l.id)
        };
        c.PlotLineOrBand.prototype = {
            render: function () {
                c.fireEvent(this, "render");
                var r = this, l = r.axis, f = l.horiz, b = r.options, a = b.label, g = r.label, e = b.to, d = b.from,
                    q = b.value, m = E(d) && E(e), z = E(q), n = r.svgElem,
                    u = !n, k = [], w = b.color, C = t(b.zIndex, 0), H = b.events;
                k = {"class": "highcharts-plot-" + (m ? "band " : "line ") + (b.className || "")};
                var A = {}, p = l.chart.renderer, J = m ? "bands" : "lines";
                l.isLog && (d = l.log2lin(d), e = l.log2lin(e), q = l.log2lin(q));
                l.chart.styledMode || (z ? (k.stroke = w || "#999999", k["stroke-width"] = t(b.width, 1), b.dashStyle && (k.dashstyle = b.dashStyle)) : m && (k.fill = w || "#e6ebf5", b.borderWidth && (k.stroke = b.borderColor, k["stroke-width"] = b.borderWidth)));
                A.zIndex = C;
                J += "-" + C;
                (w = l.plotLinesAndBandsGroups[J]) || (l.plotLinesAndBandsGroups[J] =
                    w = p.g("plot-" + J).attr(A).add());
                u && (r.svgElem = n = p.path().attr(k).add(w));
                if (z) k = l.getPlotLinePath({
                    value: q,
                    lineWidth: n.strokeWidth(),
                    acrossPanes: b.acrossPanes
                }); else if (m) k = l.getPlotBandPath(d, e, b); else return;
                (u || !n.d) && k && k.length ? (n.attr({d: k}), H && B(H, function (a, b) {
                    n.on(b, function (a) {
                        H[b].apply(r, [a])
                    })
                })) : n && (k ? (n.show(!0), n.animate({d: k})) : n.d && (n.hide(), g && (r.label = g = g.destroy())));
                a && (E(a.text) || E(a.formatter)) && k && k.length && 0 < l.width && 0 < l.height && !k.isFlat ? (a = v({
                    align: f && m && "center",
                    x: f ? !m &&
                        4 : 10,
                    verticalAlign: !f && m && "middle",
                    y: f ? m ? 16 : 10 : m ? 6 : -4,
                    rotation: f && !m && 90
                }, a), this.renderLabel(a, k, m, C)) : g && g.hide();
                return r
            }, renderLabel: function (c, l, f, b) {
                var a = this.label, g = this.axis.chart.renderer;
                a || (a = {
                    align: c.textAlign || c.align,
                    rotation: c.rotation,
                    "class": "highcharts-plot-" + (f ? "band" : "line") + "-label " + (c.className || "")
                }, a.zIndex = b, b = this.getLabelText(c), this.label = a = g.text(b, 0, 0, c.useHTML).attr(a).add(), this.axis.chart.styledMode || a.css(c.style));
                g = l.xBounds || [l[1], l[4], f ? l[6] : l[1]];
                l = l.yBounds ||
                    [l[2], l[5], f ? l[7] : l[2]];
                f = I(g);
                b = I(l);
                a.align(c, !1, {x: f, y: b, width: F(g) - f, height: F(l) - b});
                a.show(!0)
            }, getLabelText: function (c) {
                return E(c.formatter) ? c.formatter.call(this) : c.text
            }, destroy: function () {
                G(this.axis.plotLinesAndBands, this);
                delete this.axis;
                y(this)
            }
        };
        c.extend(h.prototype, {
            getPlotBandPath: function (c, l) {
                var f = this.getPlotLinePath({value: l, force: !0, acrossPanes: this.options.acrossPanes}),
                    b = this.getPlotLinePath({value: c, force: !0, acrossPanes: this.options.acrossPanes}), a = [],
                    g = this.horiz, e = 1;
                c =
                    c < this.min && l < this.min || c > this.max && l > this.max;
                if (b && f) {
                    if (c) {
                        var d = b.toString() === f.toString();
                        e = 0
                    }
                    for (c = 0; c < b.length; c += 6) g && f[c + 1] === b[c + 1] ? (f[c + 1] += e, f[c + 4] += e) : g || f[c + 2] !== b[c + 2] || (f[c + 2] += e, f[c + 5] += e), a.push("M", b[c + 1], b[c + 2], "L", b[c + 4], b[c + 5], f[c + 4], f[c + 5], f[c + 1], f[c + 2], "z"), a.isFlat = d
                }
                return a
            }, addPlotBand: function (c) {
                return this.addPlotBandOrLine(c, "plotBands")
            }, addPlotLine: function (c) {
                return this.addPlotBandOrLine(c, "plotLines")
            }, addPlotBandOrLine: function (r, l) {
                var f = (new c.PlotLineOrBand(this,
                    r)).render(), b = this.userOptions;
                f && (l && (b[l] = b[l] || [], b[l].push(r)), this.plotLinesAndBands.push(f));
                return f
            }, removePlotBandOrLine: function (c) {
                for (var r = this.plotLinesAndBands, f = this.options, b = this.userOptions, a = r.length; a--;) r[a].id === c && r[a].destroy();
                [f.plotLines || [], b.plotLines || [], f.plotBands || [], b.plotBands || []].forEach(function (b) {
                    for (a = b.length; a--;) b[a].id === c && G(b, b[a])
                })
            }, removePlotBand: function (c) {
                this.removePlotBandOrLine(c)
            }, removePlotLine: function (c) {
                this.removePlotBandOrLine(c)
            }
        })
    });
    K(D, "parts/Tooltip.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined, E = h.isNumber, G = h.isString, B = h.splat;
        "";
        var F = c.doc, I = c.extend, y = c.format, v = c.merge, t = c.pick, r = c.syncTimeout, l = c.timeUnits;
        c.Tooltip = function () {
            this.init.apply(this, arguments)
        };
        c.Tooltip.prototype = {
            init: function (c, b) {
                this.chart = c;
                this.options = b;
                this.crosshairs = [];
                this.now = {x: 0, y: 0};
                this.isHidden = !0;
                this.split = b.split && !c.inverted;
                this.shared = b.shared || this.split;
                this.outside = t(b.outside, !(!c.scrollablePixelsX &&
                    !c.scrollablePixelsY)) && !this.split
            }, cleanSplit: function (c) {
                this.chart.series.forEach(function (b) {
                    var a = b && b.tt;
                    a && (!a.isActive || c ? b.tt = a.destroy() : a.isActive = !1)
                })
            }, applyFilter: function () {
                var c = this.chart;
                c.renderer.definition({
                    tagName: "filter",
                    id: "drop-shadow-" + c.index,
                    opacity: .5,
                    children: [{tagName: "feGaussianBlur", "in": "SourceAlpha", stdDeviation: 1}, {
                        tagName: "feOffset",
                        dx: 1,
                        dy: 1
                    }, {tagName: "feComponentTransfer", children: [{tagName: "feFuncA", type: "linear", slope: .3}]}, {
                        tagName: "feMerge", children: [{tagName: "feMergeNode"},
                            {tagName: "feMergeNode", "in": "SourceGraphic"}]
                    }]
                });
                c.renderer.definition({
                    tagName: "style",
                    textContent: ".highcharts-tooltip-" + c.index + "{filter:url(#drop-shadow-" + c.index + ")}"
                })
            }, getLabel: function () {
                var f = this, b = this.chart.renderer, a = this.chart.styledMode, g = this.options,
                    e = "tooltip" + (x(g.className) ? " " + g.className : ""), d;
                if (!this.label) {
                    this.outside && (this.container = d = c.doc.createElement("div"), d.className = "highcharts-tooltip-container", c.css(d, {
                        position: "absolute", top: "1px", pointerEvents: g.style && g.style.pointerEvents,
                        zIndex: 3
                    }), c.doc.body.appendChild(d), this.renderer = b = new c.Renderer(d, 0, 0));
                    this.split ? this.label = b.g(e) : (this.label = b.label("", 0, 0, g.shape || "callout", null, null, g.useHTML, null, e).attr({
                        padding: g.padding,
                        r: g.borderRadius
                    }), a || this.label.attr({
                        fill: g.backgroundColor,
                        "stroke-width": g.borderWidth
                    }).css(g.style).shadow(g.shadow));
                    a && (this.applyFilter(), this.label.addClass("highcharts-tooltip-" + this.chart.index));
                    if (this.outside) {
                        var q = {x: this.label.xSetter, y: this.label.ySetter};
                        this.label.xSetter = function (a,
                                                       b) {
                            q[b].call(this.label, f.distance);
                            d.style.left = a + "px"
                        };
                        this.label.ySetter = function (a, b) {
                            q[b].call(this.label, f.distance);
                            d.style.top = a + "px"
                        }
                    }
                    this.label.attr({zIndex: 8}).add()
                }
                return this.label
            }, update: function (c) {
                this.destroy();
                v(!0, this.chart.options.tooltip.userOptions, c);
                this.init(this.chart, v(!0, this.options, c))
            }, destroy: function () {
                this.label && (this.label = this.label.destroy());
                this.split && this.tt && (this.cleanSplit(this.chart, !0), this.tt = this.tt.destroy());
                this.renderer && (this.renderer = this.renderer.destroy(),
                    c.discardElement(this.container));
                c.clearTimeout(this.hideTimer);
                c.clearTimeout(this.tooltipTimeout)
            }, move: function (f, b, a, g) {
                var e = this, d = e.now,
                    q = !1 !== e.options.animation && !e.isHidden && (1 < Math.abs(f - d.x) || 1 < Math.abs(b - d.y)),
                    m = e.followPointer || 1 < e.len;
                I(d, {
                    x: q ? (2 * d.x + f) / 3 : f,
                    y: q ? (d.y + b) / 2 : b,
                    anchorX: m ? void 0 : q ? (2 * d.anchorX + a) / 3 : a,
                    anchorY: m ? void 0 : q ? (d.anchorY + g) / 2 : g
                });
                e.getLabel().attr(d);
                q && (c.clearTimeout(this.tooltipTimeout), this.tooltipTimeout = setTimeout(function () {
                    e && e.move(f, b, a, g)
                }, 32))
            }, hide: function (f) {
                var b =
                    this;
                c.clearTimeout(this.hideTimer);
                f = t(f, this.options.hideDelay, 500);
                this.isHidden || (this.hideTimer = r(function () {
                    b.getLabel()[f ? "fadeOut" : "hide"]();
                    b.isHidden = !0
                }, f))
            }, getAnchor: function (c, b) {
                var a = this.chart, g = a.pointer, e = a.inverted, d = a.plotTop, f = a.plotLeft, m = 0, z = 0, n, u;
                c = B(c);
                this.followPointer && b ? (void 0 === b.chartX && (b = g.normalize(b)), c = [b.chartX - a.plotLeft, b.chartY - d]) : c[0].tooltipPos ? c = c[0].tooltipPos : (c.forEach(function (a) {
                    n = a.series.yAxis;
                    u = a.series.xAxis;
                    m += a.plotX + (!e && u ? u.left - f : 0);
                    z += (a.plotLow ?
                        (a.plotLow + a.plotHigh) / 2 : a.plotY) + (!e && n ? n.top - d : 0)
                }), m /= c.length, z /= c.length, c = [e ? a.plotWidth - z : m, this.shared && !e && 1 < c.length && b ? b.chartY - d : e ? a.plotHeight - m : z]);
                return c.map(Math.round)
            }, getPosition: function (c, b, a) {
                var g = this.chart, e = this.distance, d = {}, f = g.inverted && a.h || 0, m, z = this.outside,
                    n = z ? F.documentElement.clientWidth - 2 * e : g.chartWidth,
                    u = z ? Math.max(F.body.scrollHeight, F.documentElement.scrollHeight, F.body.offsetHeight, F.documentElement.offsetHeight, F.documentElement.clientHeight) : g.chartHeight,
                    k = g.pointer.chartPosition, w = g.containerScaling, C = function (a) {
                        return w ? a * w.scaleX : a
                    }, H = function (a) {
                        return w ? a * w.scaleY : a
                    }, A = function (d) {
                        var f = "x" === d;
                        return [d, f ? n : u, f ? c : b].concat(z ? [f ? C(c) : H(b), f ? k.left - e + C(a.plotX + g.plotLeft) : k.top - e + H(a.plotY + g.plotTop), 0, f ? n : u] : [f ? c : b, f ? a.plotX + g.plotLeft : a.plotY + g.plotTop, f ? g.plotLeft : g.plotTop, f ? g.plotLeft + g.plotWidth : g.plotTop + g.plotHeight])
                    }, p = A("y"), r = A("x"), l = !this.followPointer && t(a.ttBelow, !g.inverted === !!a.negative),
                    v = function (a, b, c, g, k, p, q) {
                        var m = "y" ===
                        a ? H(e) : C(e), w = (c - g) / 2, n = g < k - e, u = k + e + g < b, A = k - m - c + w;
                        k = k + m - w;
                        if (l && u) d[a] = k; else if (!l && n) d[a] = A; else if (n) d[a] = Math.min(q - g, 0 > A - f ? A : A - f); else if (u) d[a] = Math.max(p, k + f + c > b ? k : k + f); else return !1
                    }, y = function (a, b, c, g, k) {
                        var f;
                        k < e || k > b - e ? f = !1 : d[a] = k < c / 2 ? 1 : k > b - g / 2 ? b - g - 2 : k - c / 2;
                        return f
                    }, h = function (a) {
                        var b = p;
                        p = r;
                        r = b;
                        m = a
                    }, M = function () {
                        !1 !== v.apply(0, p) ? !1 !== y.apply(0, r) || m || (h(!0), M()) : m ? d.x = d.y = 0 : (h(!0), M())
                    };
                (g.inverted || 1 < this.len) && h();
                M();
                return d
            }, defaultFormatter: function (c) {
                var b = this.points || B(this);
                var a = [c.tooltipFooterHeaderFormatter(b[0])];
                a = a.concat(c.bodyFormatter(b));
                a.push(c.tooltipFooterHeaderFormatter(b[0], !0));
                return a
            }, refresh: function (f, b) {
                var a = this.chart, g = this.options, e = f, d = {}, q = [];
                var m = g.formatter || this.defaultFormatter;
                d = this.shared;
                var z = a.styledMode;
                if (g.enabled) {
                    c.clearTimeout(this.hideTimer);
                    this.followPointer = B(e)[0].series.tooltipOptions.followPointer;
                    var n = this.getAnchor(e, b);
                    b = n[0];
                    var u = n[1];
                    !d || e.series && e.series.noSharedTooltip ? d = e.getLabelConfig() : (a.pointer.applyInactiveState(e),
                        e.forEach(function (a) {
                            a.setState("hover");
                            q.push(a.getLabelConfig())
                        }), d = {x: e[0].category, y: e[0].y}, d.points = q, e = e[0]);
                    this.len = q.length;
                    m = m.call(d, this);
                    d = e.series;
                    this.distance = t(d.tooltipOptions.distance, 16);
                    !1 === m ? this.hide() : (a = this.getLabel(), this.isHidden && a.attr({opacity: 1}).show(), this.split ? this.renderSplit(m, B(f)) : (g.style.width && !z || a.css({width: this.chart.spacingBox.width}), a.attr({text: m && m.join ? m.join("") : m}), a.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-" + t(e.colorIndex,
                        d.colorIndex)), z || a.attr({stroke: g.borderColor || e.color || d.color || "#666666"}), this.updatePosition({
                        plotX: b,
                        plotY: u,
                        negative: e.negative,
                        ttBelow: e.ttBelow,
                        h: n[2] || 0
                    })), this.isHidden = !1);
                    c.fireEvent(this, "refresh")
                }
            }, renderSplit: function (f, b) {
                var a = this, g = [], e = this.chart, d = e.renderer, q = !0, m = this.options, z = 0, n,
                    u = this.getLabel(), k = e.plotTop;
                G(f) && (f = [!1, f]);
                f.slice(0, b.length + 1).forEach(function (c, f) {
                    if (!1 !== c && "" !== c) {
                        f = b[f - 1] || {isHeader: !0, plotX: b[0].plotX, plotY: e.plotHeight};
                        var w = f.series || a, C = w.tt,
                            p = f.series || {}, r = "highcharts-color-" + t(f.colorIndex, p.colorIndex, "none");
                        C || (C = {
                            padding: m.padding,
                            r: m.borderRadius
                        }, e.styledMode || (C.fill = m.backgroundColor, C["stroke-width"] = m.borderWidth), w.tt = C = d.label(null, null, null, (f.isHeader ? m.headerShape : m.shape) || "callout", null, null, m.useHTML).addClass("highcharts-tooltip-box " + r).attr(C).add(u));
                        C.isActive = !0;
                        C.attr({text: c});
                        e.styledMode || C.css(m.style).shadow(m.shadow).attr({stroke: m.borderColor || f.color || p.color || "#333333"});
                        c = C.getBBox();
                        r = c.width + C.strokeWidth();
                        f.isHeader ? (z = c.height, e.xAxis[0].opposite && (n = !0, k -= z), c = Math.max(0, Math.min(f.plotX + e.plotLeft - r / 2, e.chartWidth + (e.scrollablePixelsX ? e.scrollablePixelsX - e.marginRight : 0) - r))) : c = f.plotX + e.plotLeft - t(m.distance, 16) - r;
                        0 > c && (q = !1);
                        f.isHeader ? p = n ? -z : e.plotHeight + z : (p = p.yAxis, p = p.pos - k + Math.max(0, Math.min(f.plotY || 0, p.len)));
                        g.push({
                            target: p,
                            rank: f.isHeader ? 1 : 0,
                            size: w.tt.getBBox().height + 1,
                            point: f,
                            x: c,
                            tt: C
                        })
                    }
                });
                this.cleanSplit();
                m.positioner && g.forEach(function (b) {
                    var d = m.positioner.call(a, b.tt.getBBox().width,
                        b.size, b.point);
                    b.x = d.x;
                    b.align = 0;
                    b.target = d.y;
                    b.rank = t(d.rank, b.rank)
                });
                c.distribute(g, e.plotHeight + z);
                g.forEach(function (b) {
                    var d = b.point, c = d.series, g = c && c.yAxis;
                    b.tt.attr({
                        visibility: void 0 === b.pos ? "hidden" : "inherit",
                        x: q || d.isHeader || m.positioner ? b.x : d.plotX + e.plotLeft + a.distance,
                        y: b.pos + k,
                        anchorX: d.isHeader ? d.plotX + e.plotLeft : d.plotX + c.xAxis.pos,
                        anchorY: d.isHeader ? e.plotTop + e.plotHeight / 2 : g.pos + Math.max(0, Math.min(d.plotY, g.len))
                    })
                })
            }, updatePosition: function (f) {
                var b = this.chart, a = this.getLabel(),
                    g = (this.options.positioner || this.getPosition).call(this, a.width, a.height, f),
                    e = f.plotX + b.plotLeft;
                f = f.plotY + b.plotTop;
                if (this.outside) {
                    var d = (this.options.borderWidth || 0) + 2 * this.distance;
                    this.renderer.setSize(a.width + d, a.height + d, !1);
                    if (a = b.containerScaling) c.css(this.container, {transform: "scale(" + a.scaleX + ", " + a.scaleY + ")"}), e *= a.scaleX, f *= a.scaleY;
                    e += b.pointer.chartPosition.left - g.x;
                    f += b.pointer.chartPosition.top - g.y
                }
                this.move(Math.round(g.x), Math.round(g.y || 0), e, f)
            }, getDateFormat: function (c, b, a,
                                        g) {
                var e = this.chart.time, d = e.dateFormat("%m-%d %H:%M:%S.%L", b),
                    f = {millisecond: 15, second: 12, minute: 9, hour: 6, day: 3}, m = "millisecond";
                for (z in l) {
                    if (c === l.week && +e.dateFormat("%w", b) === a && "00:00:00.000" === d.substr(6)) {
                        var z = "week";
                        break
                    }
                    if (l[z] > c) {
                        z = m;
                        break
                    }
                    if (f[z] && d.substr(f[z]) !== "01-01 00:00:00.000".substr(f[z])) break;
                    "week" !== z && (m = z)
                }
                if (z) var n = e.resolveDTLFormat(g[z]).main;
                return n
            }, getXDateFormat: function (c, b, a) {
                b = b.dateTimeLabelFormats;
                var g = a && a.closestPointRange;
                return (g ? this.getDateFormat(g,
                    c.x, a.options.startOfWeek, b) : b.day) || b.year
            }, tooltipFooterHeaderFormatter: function (f, b) {
                var a = b ? "footer" : "header", g = f.series, e = g.tooltipOptions, d = e.xDateFormat, q = g.xAxis,
                    m = q && "datetime" === q.options.type && E(f.key), z = e[a + "Format"];
                b = {isFooter: b, labelConfig: f};
                c.fireEvent(this, "headerFormatter", b, function (a) {
                    m && !d && (d = this.getXDateFormat(f, e, q));
                    m && d && (f.point && f.point.tooltipDateKeys || ["key"]).forEach(function (a) {
                        z = z.replace("{point." + a + "}", "{point." + a + ":" + d + "}")
                    });
                    g.chart.styledMode && (z = this.styledModeFormat(z));
                    a.text = y(z, {point: f, series: g}, this.chart.time)
                });
                return b.text
            }, bodyFormatter: function (c) {
                return c.map(function (b) {
                    var a = b.series.tooltipOptions;
                    return (a[(b.point.formatPrefix || "point") + "Formatter"] || b.point.tooltipFormatter).call(b.point, a[(b.point.formatPrefix || "point") + "Format"] || "")
                })
            }, styledModeFormat: function (c) {
                return c.replace('style="font-size: 10px"', 'class="highcharts-header"').replace(/style="color:{(point|series)\.color}"/g, 'class="highcharts-color-{$1.colorIndex}"')
            }
        }
    });
    K(D, "parts/Pointer.js",
        [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
            var x = h.defined, E = h.isNumber, G = h.isObject, B = h.objectEach, F = h.splat, I = c.addEvent,
                y = c.attr, v = c.charts, t = c.color, r = c.css, l = c.extend, f = c.find, b = c.fireEvent,
                a = c.offset, g = c.pick, e = c.Tooltip;
            c.Pointer = function (a, b) {
                this.init(a, b)
            };
            c.Pointer.prototype = {
                init: function (a, b) {
                    this.options = b;
                    this.chart = a;
                    this.runChartClick = b.chart.events && !!b.chart.events.click;
                    this.pinchDown = [];
                    this.lastValidTouch = {};
                    e && (a.tooltip = new e(a, b.tooltip), this.followTouchMove =
                        g(b.tooltip.followTouchMove, !0));
                    this.setDOMEvents()
                }, zoomOption: function (a) {
                    var b = this.chart, d = b.options.chart, e = d.zoomType || "";
                    b = b.inverted;
                    /touch/.test(a.type) && (e = g(d.pinchType, e));
                    this.zoomX = a = /x/.test(e);
                    this.zoomY = e = /y/.test(e);
                    this.zoomHor = a && !b || e && b;
                    this.zoomVert = e && !b || a && b;
                    this.hasZoom = a || e
                }, normalize: function (b, e) {
                    var d = b.touches ? b.touches.length ? b.touches.item(0) : b.changedTouches[0] : b;
                    e || (this.chartPosition = e = a(this.chart.container));
                    var c = d.pageX - e.left;
                    e = d.pageY - e.top;
                    if (d = this.chart.containerScaling) c /=
                        d.scaleX, e /= d.scaleY;
                    return l(b, {chartX: Math.round(c), chartY: Math.round(e)})
                }, getCoordinates: function (a) {
                    var b = {xAxis: [], yAxis: []};
                    this.chart.axes.forEach(function (d) {
                        b[d.isXAxis ? "xAxis" : "yAxis"].push({
                            axis: d,
                            value: d.toValue(a[d.horiz ? "chartX" : "chartY"])
                        })
                    });
                    return b
                }, findNearestKDPoint: function (a, b, e) {
                    var d;
                    a.forEach(function (a) {
                        var c = !(a.noSharedTooltip && b) && 0 > a.options.findNearestPointBy.indexOf("y");
                        a = a.searchPoint(e, c);
                        if ((c = G(a, !0)) && !(c = !G(d, !0))) {
                            c = d.distX - a.distX;
                            var g = d.dist - a.dist, f = (a.series.group &&
                                a.series.group.zIndex) - (d.series.group && d.series.group.zIndex);
                            c = 0 < (0 !== c && b ? c : 0 !== g ? g : 0 !== f ? f : d.series.index > a.series.index ? -1 : 1)
                        }
                        c && (d = a)
                    });
                    return d
                }, getPointFromEvent: function (a) {
                    a = a.target;
                    for (var b; a && !b;) b = a.point, a = a.parentNode;
                    return b
                }, getChartCoordinatesFromPoint: function (a, b) {
                    var d = a.series, e = d.xAxis;
                    d = d.yAxis;
                    var c = g(a.clientX, a.plotX), f = a.shapeArgs;
                    if (e && d) return b ? {
                        chartX: e.len + e.pos - c,
                        chartY: d.len + d.pos - a.plotY
                    } : {chartX: c + e.pos, chartY: a.plotY + d.pos};
                    if (f && f.x && f.y) return {
                        chartX: f.x,
                        chartY: f.y
                    }
                }, getHoverData: function (a, b, e, c, n, u) {
                    var d, q = [];
                    c = !(!c || !a);
                    var m = b && !b.stickyTracking ? [b] : e.filter(function (a) {
                        return a.visible && !(!n && a.directTouch) && g(a.options.enableMouseTracking, !0) && a.stickyTracking
                    });
                    b = (d = c ? a : this.findNearestKDPoint(m, n, u)) && d.series;
                    d && (n && !b.noSharedTooltip ? (m = e.filter(function (a) {
                        return a.visible && !(!n && a.directTouch) && g(a.options.enableMouseTracking, !0) && !a.noSharedTooltip
                    }), m.forEach(function (a) {
                        var b = f(a.points, function (a) {
                            return a.x === d.x && !a.isNull
                        });
                        G(b) &&
                        (a.chart.isBoosting && (b = a.getPoint(b)), q.push(b))
                    })) : q.push(d));
                    return {hoverPoint: d, hoverSeries: b, hoverPoints: q}
                }, runPointActions: function (a, b) {
                    var d = this.chart, e = d.tooltip && d.tooltip.options.enabled ? d.tooltip : void 0,
                        f = e ? e.shared : !1, q = b || d.hoverPoint, k = q && q.series || d.hoverSeries;
                    k = this.getHoverData(q, k, d.series, "touchmove" !== a.type && (!!b || k && k.directTouch && this.isDirectTouch), f, a);
                    q = k.hoverPoint;
                    var w = k.hoverPoints;
                    b = (k = k.hoverSeries) && k.tooltipOptions.followPointer;
                    f = f && k && !k.noSharedTooltip;
                    if (q &&
                        (q !== d.hoverPoint || e && e.isHidden)) {
                        (d.hoverPoints || []).forEach(function (a) {
                            -1 === w.indexOf(a) && a.setState()
                        });
                        if (d.hoverSeries !== k) k.onMouseOver();
                        this.applyInactiveState(w);
                        (w || []).forEach(function (a) {
                            a.setState("hover")
                        });
                        d.hoverPoint && d.hoverPoint.firePointEvent("mouseOut");
                        if (!q.series) return;
                        q.firePointEvent("mouseOver");
                        d.hoverPoints = w;
                        d.hoverPoint = q;
                        e && e.refresh(f ? w : q, a)
                    } else b && e && !e.isHidden && (q = e.getAnchor([{}], a), e.updatePosition({
                        plotX: q[0],
                        plotY: q[1]
                    }));
                    this.unDocMouseMove || (this.unDocMouseMove =
                        I(d.container.ownerDocument, "mousemove", function (a) {
                            var b = v[c.hoverChartIndex];
                            if (b) b.pointer.onDocumentMouseMove(a)
                        }));
                    d.axes.forEach(function (b) {
                        var d = g(b.crosshair.snap, !0), e = d ? c.find(w, function (a) {
                            return a.series[b.coll] === b
                        }) : void 0;
                        e || !d ? b.drawCrosshair(a, e) : b.hideCrosshair()
                    })
                }, applyInactiveState: function (a) {
                    var b = [], d;
                    (a || []).forEach(function (a) {
                        d = a.series;
                        b.push(d);
                        d.linkedParent && b.push(d.linkedParent);
                        d.linkedSeries && (b = b.concat(d.linkedSeries));
                        d.navigatorSeries && b.push(d.navigatorSeries)
                    });
                    this.chart.series.forEach(function (a) {
                        -1 === b.indexOf(a) ? a.setState("inactive", !0) : a.options.inactiveOtherPoints && a.setAllPointsToState("inactive")
                    })
                }, reset: function (a, b) {
                    var d = this.chart, e = d.hoverSeries, c = d.hoverPoint, g = d.hoverPoints, k = d.tooltip,
                        f = k && k.shared ? g : c;
                    a && f && F(f).forEach(function (b) {
                        b.series.isCartesian && void 0 === b.plotX && (a = !1)
                    });
                    if (a) k && f && F(f).length && (k.refresh(f), k.shared && g ? g.forEach(function (a) {
                        a.setState(a.state, !0);
                        a.series.isCartesian && (a.series.xAxis.crosshair && a.series.xAxis.drawCrosshair(null,
                            a), a.series.yAxis.crosshair && a.series.yAxis.drawCrosshair(null, a))
                    }) : c && (c.setState(c.state, !0), d.axes.forEach(function (a) {
                        a.crosshair && a.drawCrosshair(null, c)
                    }))); else {
                        if (c) c.onMouseOut();
                        g && g.forEach(function (a) {
                            a.setState()
                        });
                        if (e) e.onMouseOut();
                        k && k.hide(b);
                        this.unDocMouseMove && (this.unDocMouseMove = this.unDocMouseMove());
                        d.axes.forEach(function (a) {
                            a.hideCrosshair()
                        });
                        this.hoverX = d.hoverPoints = d.hoverPoint = null
                    }
                }, scaleGroups: function (a, b) {
                    var d = this.chart, e;
                    d.series.forEach(function (c) {
                        e = a || c.getPlotBox();
                        c.xAxis && c.xAxis.zoomEnabled && c.group && (c.group.attr(e), c.markerGroup && (c.markerGroup.attr(e), c.markerGroup.clip(b ? d.clipRect : null)), c.dataLabelsGroup && c.dataLabelsGroup.attr(e))
                    });
                    d.clipRect.attr(b || d.clipBox)
                }, dragStart: function (a) {
                    var b = this.chart;
                    b.mouseIsDown = a.type;
                    b.cancelClick = !1;
                    b.mouseDownX = this.mouseDownX = a.chartX;
                    b.mouseDownY = this.mouseDownY = a.chartY
                }, drag: function (a) {
                    var b = this.chart, d = b.options.chart, e = a.chartX, c = a.chartY, g = this.zoomHor,
                        k = this.zoomVert, f = b.plotLeft, C = b.plotTop, H = b.plotWidth,
                        A = b.plotHeight, p = this.selectionMarker, r = this.mouseDownX, l = this.mouseDownY,
                        v = d.panKey && a[d.panKey + "Key"];
                    if (!p || !p.touch) if (e < f ? e = f : e > f + H && (e = f + H), c < C ? c = C : c > C + A && (c = C + A), this.hasDragged = Math.sqrt(Math.pow(r - e, 2) + Math.pow(l - c, 2)), 10 < this.hasDragged) {
                        var y = b.isInsidePlot(r - f, l - C);
                        b.hasCartesianSeries && (this.zoomX || this.zoomY) && y && !v && !p && (this.selectionMarker = p = b.renderer.rect(f, C, g ? 1 : H, k ? 1 : A, 0).attr({
                            "class": "highcharts-selection-marker",
                            zIndex: 7
                        }).add(), b.styledMode || p.attr({
                            fill: d.selectionMarkerFill ||
                                t("#335cad").setOpacity(.25).get()
                        }));
                        p && g && (e -= r, p.attr({width: Math.abs(e), x: (0 < e ? 0 : e) + r}));
                        p && k && (e = c - l, p.attr({height: Math.abs(e), y: (0 < e ? 0 : e) + l}));
                        y && !p && d.panning && b.pan(a, d.panning)
                    }
                }, drop: function (a) {
                    var d = this, e = this.chart, c = this.hasPinched;
                    if (this.selectionMarker) {
                        var g = {originalEvent: a, xAxis: [], yAxis: []}, f = this.selectionMarker,
                            k = f.attr ? f.attr("x") : f.x, w = f.attr ? f.attr("y") : f.y,
                            C = f.attr ? f.attr("width") : f.width, H = f.attr ? f.attr("height") : f.height, A;
                        if (this.hasDragged || c) e.axes.forEach(function (b) {
                            if (b.zoomEnabled &&
                                x(b.min) && (c || d[{xAxis: "zoomX", yAxis: "zoomY"}[b.coll]])) {
                                var e = b.horiz, f = "touchend" === a.type ? b.minPixelPadding : 0,
                                    p = b.toValue((e ? k : w) + f);
                                e = b.toValue((e ? k + C : w + H) - f);
                                g[b.coll].push({axis: b, min: Math.min(p, e), max: Math.max(p, e)});
                                A = !0
                            }
                        }), A && b(e, "selection", g, function (a) {
                            e.zoom(l(a, c ? {animation: !1} : null))
                        });
                        E(e.index) && (this.selectionMarker = this.selectionMarker.destroy());
                        c && this.scaleGroups()
                    }
                    e && E(e.index) && (r(e.container, {cursor: e._cursor}), e.cancelClick = 10 < this.hasDragged, e.mouseIsDown = this.hasDragged =
                        this.hasPinched = !1, this.pinchDown = [])
                }, onContainerMouseDown: function (a) {
                    a = this.normalize(a);
                    2 !== a.button && (this.zoomOption(a), a.preventDefault && a.preventDefault(), this.dragStart(a))
                }, onDocumentMouseUp: function (a) {
                    v[c.hoverChartIndex] && v[c.hoverChartIndex].pointer.drop(a)
                }, onDocumentMouseMove: function (a) {
                    var b = this.chart, d = this.chartPosition;
                    a = this.normalize(a, d);
                    !d || this.inClass(a.target, "highcharts-tracker") || b.isInsidePlot(a.chartX - b.plotLeft, a.chartY - b.plotTop) || this.reset()
                }, onContainerMouseLeave: function (a) {
                    var b =
                        v[c.hoverChartIndex];
                    b && (a.relatedTarget || a.toElement) && (b.pointer.reset(), b.pointer.chartPosition = null)
                }, onContainerMouseMove: function (a) {
                    var b = this.chart;
                    x(c.hoverChartIndex) && v[c.hoverChartIndex] && v[c.hoverChartIndex].mouseIsDown || (c.hoverChartIndex = b.index);
                    a = this.normalize(a);
                    a.preventDefault || (a.returnValue = !1);
                    "mousedown" === b.mouseIsDown && this.drag(a);
                    !this.inClass(a.target, "highcharts-tracker") && !b.isInsidePlot(a.chartX - b.plotLeft, a.chartY - b.plotTop) || b.openMenu || this.runPointActions(a)
                },
                inClass: function (a, b) {
                    for (var d; a;) {
                        if (d = y(a, "class")) {
                            if (-1 !== d.indexOf(b)) return !0;
                            if (-1 !== d.indexOf("highcharts-container")) return !1
                        }
                        a = a.parentNode
                    }
                }, onTrackerMouseOut: function (a) {
                    var b = this.chart.hoverSeries;
                    a = a.relatedTarget || a.toElement;
                    this.isDirectTouch = !1;
                    if (!(!b || !a || b.stickyTracking || this.inClass(a, "highcharts-tooltip") || this.inClass(a, "highcharts-series-" + b.index) && this.inClass(a, "highcharts-tracker"))) b.onMouseOut()
                }, onContainerClick: function (a) {
                    var e = this.chart, d = e.hoverPoint, c = e.plotLeft,
                        g = e.plotTop;
                    a = this.normalize(a);
                    e.cancelClick || (d && this.inClass(a.target, "highcharts-tracker") ? (b(d.series, "click", l(a, {point: d})), e.hoverPoint && d.firePointEvent("click", a)) : (l(a, this.getCoordinates(a)), e.isInsidePlot(a.chartX - c, a.chartY - g) && b(e, "click", a)))
                }, setDOMEvents: function () {
                    var a = this, b = a.chart.container, e = b.ownerDocument;
                    b.onmousedown = function (b) {
                        a.onContainerMouseDown(b)
                    };
                    b.onmousemove = function (b) {
                        a.onContainerMouseMove(b)
                    };
                    b.onclick = function (b) {
                        a.onContainerClick(b)
                    };
                    this.unbindContainerMouseLeave =
                        I(b, "mouseleave", a.onContainerMouseLeave);
                    c.unbindDocumentMouseUp || (c.unbindDocumentMouseUp = I(e, "mouseup", a.onDocumentMouseUp));
                    c.hasTouch && (I(b, "touchstart", function (b) {
                        a.onContainerTouchStart(b)
                    }), I(b, "touchmove", function (b) {
                        a.onContainerTouchMove(b)
                    }), c.unbindDocumentTouchEnd || (c.unbindDocumentTouchEnd = I(e, "touchend", a.onDocumentTouchEnd)))
                }, destroy: function () {
                    var a = this;
                    a.unDocMouseMove && a.unDocMouseMove();
                    this.unbindContainerMouseLeave();
                    c.chartCount || (c.unbindDocumentMouseUp && (c.unbindDocumentMouseUp =
                        c.unbindDocumentMouseUp()), c.unbindDocumentTouchEnd && (c.unbindDocumentTouchEnd = c.unbindDocumentTouchEnd()));
                    clearInterval(a.tooltipTimeout);
                    B(a, function (b, e) {
                        a[e] = null
                    })
                }
            }
        });
    K(D, "parts/TouchPointer.js", [D["parts/Globals.js"]], function (c) {
        var h = c.charts, x = c.extend, E = c.noop, G = c.pick;
        x(c.Pointer.prototype, {
            pinchTranslate: function (c, h, x, y, v, t) {
                this.zoomHor && this.pinchTranslateDirection(!0, c, h, x, y, v, t);
                this.zoomVert && this.pinchTranslateDirection(!1, c, h, x, y, v, t)
            }, pinchTranslateDirection: function (c, h, x,
                                                  y, v, t, r, l) {
                var f = this.chart, b = c ? "x" : "y", a = c ? "X" : "Y", g = "chart" + a, e = c ? "width" : "height",
                    d = f["plot" + (c ? "Left" : "Top")], q, m, z = l || 1, n = f.inverted, u = f.bounds[c ? "h" : "v"],
                    k = 1 === h.length, w = h[0][g], C = x[0][g], H = !k && h[1][g], A = !k && x[1][g];
                x = function () {
                    !k && 20 < Math.abs(w - H) && (z = l || Math.abs(C - A) / Math.abs(w - H));
                    m = (d - C) / z + w;
                    q = f["plot" + (c ? "Width" : "Height")] / z
                };
                x();
                h = m;
                if (h < u.min) {
                    h = u.min;
                    var p = !0
                } else h + q > u.max && (h = u.max - q, p = !0);
                p ? (C -= .8 * (C - r[b][0]), k || (A -= .8 * (A - r[b][1])), x()) : r[b] = [C, A];
                n || (t[b] = m - d, t[e] = q);
                t = n ? 1 / z : z;
                v[e] = q;
                v[b] = h;
                y[n ? c ? "scaleY" : "scaleX" : "scale" + a] = z;
                y["translate" + a] = t * d + (C - t * w)
            }, pinch: function (c) {
                var h = this, B = h.chart, y = h.pinchDown, v = c.touches, t = v.length, r = h.lastValidTouch,
                    l = h.hasZoom, f = h.selectionMarker, b = {},
                    a = 1 === t && (h.inClass(c.target, "highcharts-tracker") && B.runTrackerClick || h.runChartClick),
                    g = {};
                1 < t && (h.initiated = !0);
                l && h.initiated && !a && c.preventDefault();
                [].map.call(v, function (a) {
                    return h.normalize(a)
                });
                "touchstart" === c.type ? ([].forEach.call(v, function (a, b) {
                    y[b] = {chartX: a.chartX, chartY: a.chartY}
                }),
                    r.x = [y[0].chartX, y[1] && y[1].chartX], r.y = [y[0].chartY, y[1] && y[1].chartY], B.axes.forEach(function (a) {
                    if (a.zoomEnabled) {
                        var b = B.bounds[a.horiz ? "h" : "v"], e = a.minPixelPadding,
                            c = a.toPixels(Math.min(G(a.options.min, a.dataMin), a.dataMin)),
                            g = a.toPixels(Math.max(G(a.options.max, a.dataMax), a.dataMax)), f = Math.max(c, g);
                        b.min = Math.min(a.pos, Math.min(c, g) - e);
                        b.max = Math.max(a.pos + a.len, f + e)
                    }
                }), h.res = !0) : h.followTouchMove && 1 === t ? this.runPointActions(h.normalize(c)) : y.length && (f || (h.selectionMarker = f = x({
                        destroy: E,
                        touch: !0
                    },
                    B.plotBox)), h.pinchTranslate(y, v, b, f, g, r), h.hasPinched = l, h.scaleGroups(b, g), h.res && (h.res = !1, this.reset(!1, 0)))
            }, touch: function (h, x) {
                var B = this.chart, y;
                if (B.index !== c.hoverChartIndex) this.onContainerMouseLeave({relatedTarget: !0});
                c.hoverChartIndex = B.index;
                if (1 === h.touches.length) if (h = this.normalize(h), (y = B.isInsidePlot(h.chartX - B.plotLeft, h.chartY - B.plotTop)) && !B.openMenu) {
                    x && this.runPointActions(h);
                    if ("touchmove" === h.type) {
                        x = this.pinchDown;
                        var v = x[0] ? 4 <= Math.sqrt(Math.pow(x[0].chartX - h.chartX, 2) +
                            Math.pow(x[0].chartY - h.chartY, 2)) : !1
                    }
                    G(v, !0) && this.pinch(h)
                } else x && this.reset(); else 2 === h.touches.length && this.pinch(h)
            }, onContainerTouchStart: function (c) {
                this.zoomOption(c);
                this.touch(c, !0)
            }, onContainerTouchMove: function (c) {
                this.touch(c)
            }, onDocumentTouchEnd: function (B) {
                h[c.hoverChartIndex] && h[c.hoverChartIndex].pointer.drop(B)
            }
        })
    });
    K(D, "parts/MSPointer.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.objectEach, E = c.addEvent, G = c.charts, B = c.css, F = c.doc;
        h = c.extend;
        var I = c.noop,
            y = c.Pointer, v = c.removeEvent, t = c.win, r = c.wrap;
        if (!c.hasTouch && (t.PointerEvent || t.MSPointerEvent)) {
            var l = {}, f = !!t.PointerEvent, b = function () {
                var a = [];
                a.item = function (a) {
                    return this[a]
                };
                x(l, function (b) {
                    a.push({pageX: b.pageX, pageY: b.pageY, target: b.target})
                });
                return a
            }, a = function (a, e, d, f) {
                "touch" !== a.pointerType && a.pointerType !== a.MSPOINTER_TYPE_TOUCH || !G[c.hoverChartIndex] || (f(a), f = G[c.hoverChartIndex].pointer, f[e]({
                    type: d,
                    target: a.currentTarget,
                    preventDefault: I,
                    touches: b()
                }))
            };
            h(y.prototype, {
                onContainerPointerDown: function (b) {
                    a(b,
                        "onContainerTouchStart", "touchstart", function (a) {
                            l[a.pointerId] = {pageX: a.pageX, pageY: a.pageY, target: a.currentTarget}
                        })
                }, onContainerPointerMove: function (b) {
                    a(b, "onContainerTouchMove", "touchmove", function (a) {
                        l[a.pointerId] = {pageX: a.pageX, pageY: a.pageY};
                        l[a.pointerId].target || (l[a.pointerId].target = a.currentTarget)
                    })
                }, onDocumentPointerUp: function (b) {
                    a(b, "onDocumentTouchEnd", "touchend", function (a) {
                        delete l[a.pointerId]
                    })
                }, batchMSEvents: function (a) {
                    a(this.chart.container, f ? "pointerdown" : "MSPointerDown",
                        this.onContainerPointerDown);
                    a(this.chart.container, f ? "pointermove" : "MSPointerMove", this.onContainerPointerMove);
                    a(F, f ? "pointerup" : "MSPointerUp", this.onDocumentPointerUp)
                }
            });
            r(y.prototype, "init", function (a, b, d) {
                a.call(this, b, d);
                this.hasZoom && B(b.container, {"-ms-touch-action": "none", "touch-action": "none"})
            });
            r(y.prototype, "setDOMEvents", function (a) {
                a.apply(this);
                (this.hasZoom || this.followTouchMove) && this.batchMSEvents(E)
            });
            r(y.prototype, "destroy", function (a) {
                this.batchMSEvents(v);
                a.call(this)
            })
        }
    });
    K(D, "parts/Legend.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined, E = h.isNumber, G = c.addEvent, B = c.css, F = c.discardElement, I = c.fireEvent;
        h = c.isFirefox;
        var y = c.marginNames, v = c.merge, t = c.pick, r = c.setAnimation, l = c.stableSort, f = c.win, b = c.wrap;
        c.Legend = function (a, b) {
            this.init(a, b)
        };
        c.Legend.prototype = {
            init: function (a, b) {
                this.chart = a;
                this.setOptions(b);
                b.enabled && (this.render(), G(this.chart, "endResize", function () {
                    this.legend.positionCheckboxes()
                }), this.proximate ? this.unchartrender =
                    G(this.chart, "render", function () {
                        this.legend.proximatePositions();
                        this.legend.positionItems()
                    }) : this.unchartrender && this.unchartrender())
            }, setOptions: function (a) {
                var b = t(a.padding, 8);
                this.options = a;
                this.chart.styledMode || (this.itemStyle = a.itemStyle, this.itemHiddenStyle = v(this.itemStyle, a.itemHiddenStyle));
                this.itemMarginTop = a.itemMarginTop || 0;
                this.padding = b;
                this.initialItemY = b - 5;
                this.symbolWidth = t(a.symbolWidth, 16);
                this.pages = [];
                this.proximate = "proximate" === a.layout && !this.chart.inverted
            }, update: function (a,
                                 b) {
                var e = this.chart;
                this.setOptions(v(!0, this.options, a));
                this.destroy();
                e.isDirtyLegend = e.isDirtyBox = !0;
                t(b, !0) && e.redraw();
                I(this, "afterUpdate")
            }, colorizeItem: function (a, b) {
                a.legendGroup[b ? "removeClass" : "addClass"]("highcharts-legend-item-hidden");
                if (!this.chart.styledMode) {
                    var e = this.options, d = a.legendItem, c = a.legendLine, g = a.legendSymbol,
                        f = this.itemHiddenStyle.color;
                    e = b ? e.itemStyle.color : f;
                    var n = b ? a.color || f : f, u = a.options && a.options.marker, k = {fill: n};
                    d && d.css({fill: e, color: e});
                    c && c.attr({stroke: n});
                    g && (u && g.isMarker && (k = a.pointAttribs(), b || (k.stroke = k.fill = f)), g.attr(k))
                }
                I(this, "afterColorizeItem", {item: a, visible: b})
            }, positionItems: function () {
                this.allItems.forEach(this.positionItem, this);
                this.chart.isResizing || this.positionCheckboxes()
            }, positionItem: function (a) {
                var b = this.options, e = b.symbolPadding;
                b = !b.rtl;
                var d = a._legendItemPos, c = d[0];
                d = d[1];
                var f = a.checkbox;
                if ((a = a.legendGroup) && a.element) a[x(a.translateY) ? "animate" : "attr"]({
                    translateX: b ? c : this.legendWidth - c - 2 * e - 4,
                    translateY: d
                });
                f && (f.x = c,
                    f.y = d)
            }, destroyItem: function (a) {
                var b = a.checkbox;
                ["legendItem", "legendLine", "legendSymbol", "legendGroup"].forEach(function (b) {
                    a[b] && (a[b] = a[b].destroy())
                });
                b && F(a.checkbox)
            }, destroy: function () {
                function a(a) {
                    this[a] && (this[a] = this[a].destroy())
                }

                this.getAllItems().forEach(function (b) {
                    ["legendItem", "legendGroup"].forEach(a, b)
                });
                "clipRect up down pager nav box title group".split(" ").forEach(a, this);
                this.display = null
            }, positionCheckboxes: function () {
                var a = this.group && this.group.alignAttr, b = this.clipHeight ||
                    this.legendHeight, e = this.titleHeight;
                if (a) {
                    var d = a.translateY;
                    this.allItems.forEach(function (c) {
                        var g = c.checkbox;
                        if (g) {
                            var f = d + e + g.y + (this.scrollOffset || 0) + 3;
                            B(g, {
                                left: a.translateX + c.checkboxOffset + g.x - 20 + "px",
                                top: f + "px",
                                display: this.proximate || f > d - 6 && f < d + b - 6 ? "" : "none"
                            })
                        }
                    }, this)
                }
            }, renderTitle: function () {
                var a = this.options, b = this.padding, e = a.title, d = 0;
                e.text && (this.title || (this.title = this.chart.renderer.label(e.text, b - 3, b - 4, null, null, null, a.useHTML, null, "legend-title").attr({zIndex: 1}), this.chart.styledMode ||
                this.title.css(e.style), this.title.add(this.group)), e.width || this.title.css({width: this.maxLegendWidth + "px"}), a = this.title.getBBox(), d = a.height, this.offsetWidth = a.width, this.contentGroup.attr({translateY: d}));
                this.titleHeight = d
            }, setText: function (a) {
                var b = this.options;
                a.legendItem.attr({text: b.labelFormat ? c.format(b.labelFormat, a, this.chart.time) : b.labelFormatter.call(a)})
            }, renderItem: function (a) {
                var b = this.chart, e = b.renderer, d = this.options, c = this.symbolWidth, f = d.symbolPadding,
                    r = this.itemStyle, n = this.itemHiddenStyle,
                    u = "horizontal" === d.layout ? t(d.itemDistance, 20) : 0, k = !d.rtl, w = a.legendItem,
                    C = !a.series, H = !C && a.series.drawLegendSymbol ? a.series : a, A = H.options;
                A = this.createCheckboxForItem && A && A.showCheckbox;
                u = c + f + u + (A ? 20 : 0);
                var p = d.useHTML, l = a.options.className;
                w || (a.legendGroup = e.g("legend-item").addClass("highcharts-" + H.type + "-series highcharts-color-" + a.colorIndex + (l ? " " + l : "") + (C ? " highcharts-series-" + a.index : "")).attr({zIndex: 1}).add(this.scrollGroup), a.legendItem = w = e.text("", k ? c + f : -f, this.baseline || 0, p), b.styledMode ||
                w.css(v(a.visible ? r : n)), w.attr({
                    align: k ? "left" : "right",
                    zIndex: 2
                }).add(a.legendGroup), this.baseline || (this.fontMetrics = e.fontMetrics(b.styledMode ? 12 : r.fontSize, w), this.baseline = this.fontMetrics.f + 3 + this.itemMarginTop, w.attr("y", this.baseline)), this.symbolHeight = d.symbolHeight || this.fontMetrics.f, H.drawLegendSymbol(this, a), this.setItemEvents && this.setItemEvents(a, w, p));
                A && !a.checkbox && this.createCheckboxForItem(a);
                this.colorizeItem(a, a.visible);
                !b.styledMode && r.width || w.css({
                    width: (d.itemWidth || this.widthOption ||
                        b.spacingBox.width) - u
                });
                this.setText(a);
                b = w.getBBox();
                a.itemWidth = a.checkboxOffset = d.itemWidth || a.legendItemWidth || b.width + u;
                this.maxItemWidth = Math.max(this.maxItemWidth, a.itemWidth);
                this.totalItemWidth += a.itemWidth;
                this.itemHeight = a.itemHeight = Math.round(a.legendItemHeight || b.height || this.symbolHeight)
            }, layoutItem: function (a) {
                var b = this.options, e = this.padding, d = "horizontal" === b.layout, c = a.itemHeight,
                    f = b.itemMarginBottom || 0, r = this.itemMarginTop, n = d ? t(b.itemDistance, 20) : 0,
                    u = this.maxLegendWidth;
                b = b.alignColumns &&
                this.totalItemWidth > u ? this.maxItemWidth : a.itemWidth;
                d && this.itemX - e + b > u && (this.itemX = e, this.lastLineHeight && (this.itemY += r + this.lastLineHeight + f), this.lastLineHeight = 0);
                this.lastItemY = r + this.itemY + f;
                this.lastLineHeight = Math.max(c, this.lastLineHeight);
                a._legendItemPos = [this.itemX, this.itemY];
                d ? this.itemX += b : (this.itemY += r + c + f, this.lastLineHeight = c);
                this.offsetWidth = this.widthOption || Math.max((d ? this.itemX - e - (a.checkbox ? 0 : n) : b) + e, this.offsetWidth)
            }, getAllItems: function () {
                var a = [];
                this.chart.series.forEach(function (b) {
                    var e =
                        b && b.options;
                    b && t(e.showInLegend, x(e.linkedTo) ? !1 : void 0, !0) && (a = a.concat(b.legendItems || ("point" === e.legendType ? b.data : b)))
                });
                I(this, "afterGetAllItems", {allItems: a});
                return a
            }, getAlignment: function () {
                var a = this.options;
                return this.proximate ? a.align.charAt(0) + "tv" : a.floating ? "" : a.align.charAt(0) + a.verticalAlign.charAt(0) + a.layout.charAt(0)
            }, adjustMargins: function (a, b) {
                var e = this.chart, d = this.options, c = this.getAlignment(), g = e.options.title.margin,
                    f = void 0 !== g ? e.titleOffset[0] + g : 0, n = void 0 !== g ? e.titleOffset[2] +
                    g : 0;
                c && [/(lth|ct|rth)/, /(rtv|rm|rbv)/, /(rbh|cb|lbh)/, /(lbv|lm|ltv)/].forEach(function (g, k) {
                    g.test(c) && !x(a[k]) && (e[y[k]] = Math.max(e[y[k]], e.legend[(k + 1) % 2 ? "legendHeight" : "legendWidth"] + [1, -1, -1, 1][k] * d[k % 2 ? "x" : "y"] + t(d.margin, 12) + b[k] + (0 === k && (0 === e.titleOffset[0] ? 0 : f)) + (2 === k && (0 === e.titleOffset[2] ? 0 : n))))
                })
            }, proximatePositions: function () {
                var a = this.chart, b = [], e = "left" === this.options.align;
                this.allItems.forEach(function (d) {
                    var g = e;
                    if (d.yAxis && d.points) {
                        d.xAxis.options.reversed && (g = !g);
                        var f = c.find(g ?
                            d.points : d.points.slice(0).reverse(), function (a) {
                            return E(a.plotY)
                        });
                        g = d.legendGroup.getBBox().height;
                        var r = d.yAxis.top - a.plotTop;
                        d.visible ? (f = f ? f.plotY : d.yAxis.height, f += r - .3 * g) : f = r + d.yAxis.height;
                        b.push({target: f, size: g, item: d})
                    }
                }, this);
                c.distribute(b, a.plotHeight);
                b.forEach(function (b) {
                    b.item._legendItemPos[1] = a.plotTop - a.spacing[0] + b.pos
                })
            }, render: function () {
                var a = this.chart, b = a.renderer, e = this.group, d, f = this.box, m = this.options, r = this.padding;
                this.itemX = r;
                this.itemY = this.initialItemY;
                this.lastItemY =
                    this.offsetWidth = 0;
                this.widthOption = c.relativeLength(m.width, a.spacingBox.width - r);
                var n = a.spacingBox.width - 2 * r - m.x;
                -1 < ["rm", "lm"].indexOf(this.getAlignment().substring(0, 2)) && (n /= 2);
                this.maxLegendWidth = this.widthOption || n;
                e || (this.group = e = b.g("legend").attr({zIndex: 7}).add(), this.contentGroup = b.g().attr({zIndex: 1}).add(e), this.scrollGroup = b.g().add(this.contentGroup));
                this.renderTitle();
                n = this.getAllItems();
                l(n, function (a, b) {
                    return (a.options && a.options.legendIndex || 0) - (b.options && b.options.legendIndex ||
                        0)
                });
                m.reversed && n.reverse();
                this.allItems = n;
                this.display = d = !!n.length;
                this.itemHeight = this.totalItemWidth = this.maxItemWidth = this.lastLineHeight = 0;
                n.forEach(this.renderItem, this);
                n.forEach(this.layoutItem, this);
                n = (this.widthOption || this.offsetWidth) + r;
                var u = this.lastItemY + this.lastLineHeight + this.titleHeight;
                u = this.handleOverflow(u);
                u += r;
                f || (this.box = f = b.rect().addClass("highcharts-legend-box").attr({r: m.borderRadius}).add(e), f.isNew = !0);
                a.styledMode || f.attr({
                    stroke: m.borderColor, "stroke-width": m.borderWidth ||
                        0, fill: m.backgroundColor || "none"
                }).shadow(m.shadow);
                0 < n && 0 < u && (f[f.isNew ? "attr" : "animate"](f.crisp.call({}, {
                    x: 0,
                    y: 0,
                    width: n,
                    height: u
                }, f.strokeWidth())), f.isNew = !1);
                f[d ? "show" : "hide"]();
                a.styledMode && "none" === e.getStyle("display") && (n = u = 0);
                this.legendWidth = n;
                this.legendHeight = u;
                d && (b = a.options.title.margin, f = a.spacingBox, r = f.y, /(lth|ct|rth)/.test(this.getAlignment()) && 0 < a.titleOffset[0] ? r += a.titleOffset[0] + b : /(lbh|cb|rbh)/.test(this.getAlignment()) && 0 < a.titleOffset[2] && (r -= a.titleOffset[2] + b), r !==
                f.y && (f = v(f, {y: r})), e.align(v(m, {
                    width: n,
                    height: u,
                    verticalAlign: this.proximate ? "top" : m.verticalAlign
                }), !0, f));
                this.proximate || this.positionItems();
                I(this, "afterRender")
            }, handleOverflow: function (a) {
                var b = this, e = this.chart, d = e.renderer, c = this.options, f = c.y, r = this.padding;
                f = e.spacingBox.height + ("top" === c.verticalAlign ? -f : f) - r;
                var n = c.maxHeight, u, k = this.clipRect, w = c.navigation, C = t(w.animation, !0),
                    H = w.arrowSize || 12, A = this.nav, p = this.pages, l, h = this.allItems, v = function (a) {
                        "number" === typeof a ? k.attr({height: a}) :
                            k && (b.clipRect = k.destroy(), b.contentGroup.clip());
                        b.contentGroup.div && (b.contentGroup.div.style.clip = a ? "rect(" + r + "px,9999px," + (r + a) + "px,0)" : "auto")
                    }, y = function (a) {
                        b[a] = d.circle(0, 0, 1.3 * H).translate(H / 2, H / 2).add(A);
                        e.styledMode || b[a].attr("fill", "rgba(0,0,0,0.0001)");
                        return b[a]
                    };
                "horizontal" !== c.layout || "middle" === c.verticalAlign || c.floating || (f /= 2);
                n && (f = Math.min(f, n));
                p.length = 0;
                a > f && !1 !== w.enabled ? (this.clipHeight = u = Math.max(f - 20 - this.titleHeight - r, 0), this.currentPage = t(this.currentPage, 1), this.fullHeight =
                    a, h.forEach(function (a, b) {
                    var d = a._legendItemPos[1], e = Math.round(a.legendItem.getBBox().height), c = p.length;
                    if (!c || d - p[c - 1] > u && (l || d) !== p[c - 1]) p.push(l || d), c++;
                    a.pageIx = c - 1;
                    l && (h[b - 1].pageIx = c - 1);
                    b === h.length - 1 && d + e - p[c - 1] > u && d !== l && (p.push(d), a.pageIx = c);
                    d !== l && (l = d)
                }), k || (k = b.clipRect = d.clipRect(0, r, 9999, 0), b.contentGroup.clip(k)), v(u), A || (this.nav = A = d.g().attr({zIndex: 1}).add(this.group), this.up = d.symbol("triangle", 0, 0, H, H).add(A), y("upTracker").on("click", function () {
                    b.scroll(-1, C)
                }), this.pager =
                    d.text("", 15, 10).addClass("highcharts-legend-navigation"), e.styledMode || this.pager.css(w.style), this.pager.add(A), this.down = d.symbol("triangle-down", 0, 0, H, H).add(A), y("downTracker").on("click", function () {
                    b.scroll(1, C)
                })), b.scroll(0), a = f) : A && (v(), this.nav = A.destroy(), this.scrollGroup.attr({translateY: 1}), this.clipHeight = 0);
                return a
            }, scroll: function (a, b) {
                var e = this.pages, d = e.length, c = this.currentPage + a;
                a = this.clipHeight;
                var g = this.options.navigation, f = this.pager, n = this.padding;
                c > d && (c = d);
                0 < c && (void 0 !==
                b && r(b, this.chart), this.nav.attr({
                    translateX: n,
                    translateY: a + this.padding + 7 + this.titleHeight,
                    visibility: "visible"
                }), [this.up, this.upTracker].forEach(function (a) {
                    a.attr({"class": 1 === c ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active"})
                }), f.attr({text: c + "/" + d}), [this.down, this.downTracker].forEach(function (a) {
                    a.attr({
                        x: 18 + this.pager.getBBox().width,
                        "class": c === d ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active"
                    })
                }, this), this.chart.styledMode || (this.up.attr({
                    fill: 1 === c ? g.inactiveColor :
                        g.activeColor
                }), this.upTracker.css({cursor: 1 === c ? "default" : "pointer"}), this.down.attr({fill: c === d ? g.inactiveColor : g.activeColor}), this.downTracker.css({cursor: c === d ? "default" : "pointer"})), this.scrollOffset = -e[c - 1] + this.initialItemY, this.scrollGroup.animate({translateY: this.scrollOffset}), this.currentPage = c, this.positionCheckboxes())
            }
        };
        c.LegendSymbolMixin = {
            drawRectangle: function (a, b) {
                var c = a.symbolHeight, d = a.options.squareSymbol;
                b.legendSymbol = this.chart.renderer.rect(d ? (a.symbolWidth - c) / 2 : 0, a.baseline -
                    c + 1, d ? c : a.symbolWidth, c, t(a.options.symbolRadius, c / 2)).addClass("highcharts-point").attr({zIndex: 3}).add(b.legendGroup)
            }, drawLineMarker: function (a) {
                var b = this.options, c = b.marker, d = a.symbolWidth, f = a.symbolHeight, m = f / 2,
                    r = this.chart.renderer, n = this.legendGroup;
                a = a.baseline - Math.round(.3 * a.fontMetrics.b);
                var u = {};
                this.chart.styledMode || (u = {"stroke-width": b.lineWidth || 0}, b.dashStyle && (u.dashstyle = b.dashStyle));
                this.legendLine = r.path(["M", 0, a, "L", d, a]).addClass("highcharts-graph").attr(u).add(n);
                c && !1 !==
                c.enabled && d && (b = Math.min(t(c.radius, m), m), 0 === this.symbol.indexOf("url") && (c = v(c, {
                    width: f,
                    height: f
                }), b = 0), this.legendSymbol = c = r.symbol(this.symbol, d / 2 - b, a - b, 2 * b, 2 * b, c).addClass("highcharts-point").add(n), c.isMarker = !0)
            }
        };
        (/Trident\/7\.0/.test(f.navigator && f.navigator.userAgent) || h) && b(c.Legend.prototype, "positionItem", function (a, b) {
            var c = this, d = function () {
                b._legendItemPos && a.call(c, b)
            };
            d();
            c.bubbleLegend || setTimeout(d)
        })
    });
    K(D, "parts/Chart.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c,
                                                                                       h) {
        var x = h.defined, E = h.erase, G = h.isArray, B = h.isNumber, F = h.isObject, I = h.isString, y = h.objectEach,
            v = h.pInt, t = h.splat, r = c.addEvent, l = c.animate, f = c.animObject, b = c.attr, a = c.doc, g = c.Axis,
            e = c.createElement, d = c.defaultOptions, q = c.discardElement, m = c.charts, z = c.css, n = c.extend,
            u = c.find, k = c.fireEvent, w = c.Legend, C = c.marginNames, H = c.merge, A = c.Pointer, p = c.pick,
            J = c.removeEvent, N = c.seriesTypes, T = c.syncTimeout, P = c.win, R = c.Chart = function () {
                this.getArgs.apply(this, arguments)
            };
        c.chart = function (a, b, c) {
            return new R(a, b,
                c)
        };
        n(R.prototype, {
            callbacks: [], getArgs: function () {
                var a = [].slice.call(arguments);
                if (I(a[0]) || a[0].nodeName) this.renderTo = a.shift();
                this.init(a[0], a[1])
            }, init: function (a, b) {
                var e, g = a.series, f = a.plotOptions || {};
                k(this, "init", {args: arguments}, function () {
                    a.series = null;
                    e = H(d, a);
                    y(e.plotOptions, function (a, b) {
                        F(a) && (a.tooltip = f[b] && H(f[b].tooltip) || void 0)
                    });
                    e.tooltip.userOptions = a.chart && a.chart.forExport && a.tooltip.userOptions || a.tooltip;
                    e.series = a.series = g;
                    this.userOptions = a;
                    var p = e.chart, w = p.events;
                    this.margin = [];
                    this.spacing = [];
                    this.bounds = {h: {}, v: {}};
                    this.labelCollectors = [];
                    this.callback = b;
                    this.isResizing = 0;
                    this.options = e;
                    this.axes = [];
                    this.series = [];
                    this.time = a.time && Object.keys(a.time).length ? new c.Time(a.time) : c.time;
                    this.styledMode = p.styledMode;
                    this.hasCartesianSeries = p.showAxes;
                    var C = this;
                    C.index = m.length;
                    m.push(C);
                    c.chartCount++;
                    w && y(w, function (a, b) {
                        c.isFunction(a) && r(C, b, a)
                    });
                    C.xAxis = [];
                    C.yAxis = [];
                    C.pointCount = C.colorCounter = C.symbolCounter = 0;
                    k(C, "afterInit");
                    C.firstRender()
                })
            }, initSeries: function (a) {
                var b =
                    this.options.chart;
                (b = N[a.type || b.type || b.defaultSeriesType]) || c.error(17, !0, this);
                b = new b;
                b.init(this, a);
                return b
            }, orderSeries: function (a) {
                var b = this.series;
                for (a = a || 0; a < b.length; a++) b[a] && (b[a].index = a, b[a].name = b[a].getName())
            }, isInsidePlot: function (a, b, c) {
                var d = c ? b : a;
                a = c ? a : b;
                return 0 <= d && d <= this.plotWidth && 0 <= a && a <= this.plotHeight
            }, redraw: function (a) {
                k(this, "beforeRedraw");
                var b = this.axes, d = this.series, e = this.pointer, g = this.legend, f = this.userOptions.legend,
                    p = this.isDirtyLegend, w = this.hasCartesianSeries,
                    C = this.isDirtyBox, q = this.renderer, m = q.isHidden(), A = [];
                this.setResponsive && this.setResponsive(!1);
                c.setAnimation(a, this);
                m && this.temporaryDisplay();
                this.layOutTitles();
                for (a = d.length; a--;) {
                    var H = d[a];
                    if (H.options.stacking) {
                        var u = !0;
                        if (H.isDirty) {
                            var r = !0;
                            break
                        }
                    }
                }
                if (r) for (a = d.length; a--;) H = d[a], H.options.stacking && (H.isDirty = !0);
                d.forEach(function (a) {
                    a.isDirty && ("point" === a.options.legendType ? (a.updateTotals && a.updateTotals(), p = !0) : f && (f.labelFormatter || f.labelFormat) && (p = !0));
                    a.isDirtyData && k(a, "updatedData")
                });
                p && g && g.options.enabled && (g.render(), this.isDirtyLegend = !1);
                u && this.getStacks();
                w && b.forEach(function (a) {
                    a.updateNames();
                    a.setScale()
                });
                this.getMargins();
                w && (b.forEach(function (a) {
                    a.isDirty && (C = !0)
                }), b.forEach(function (a) {
                    var b = a.min + "," + a.max;
                    a.extKey !== b && (a.extKey = b, A.push(function () {
                        k(a, "afterSetExtremes", n(a.eventArgs, a.getExtremes()));
                        delete a.eventArgs
                    }));
                    (C || u) && a.redraw()
                }));
                C && this.drawChartBox();
                k(this, "predraw");
                d.forEach(function (a) {
                    (C || a.isDirty) && a.visible && a.redraw();
                    a.isDirtyData =
                        !1
                });
                e && e.reset(!0);
                q.draw();
                k(this, "redraw");
                k(this, "render");
                m && this.temporaryDisplay(!0);
                A.forEach(function (a) {
                    a.call()
                })
            }, get: function (a) {
                function b(b) {
                    return b.id === a || b.options && b.options.id === a
                }

                var c = this.series, d;
                var e = u(this.axes, b) || u(this.series, b);
                for (d = 0; !e && d < c.length; d++) e = u(c[d].points || [], b);
                return e
            }, getAxes: function () {
                var a = this, b = this.options, c = b.xAxis = t(b.xAxis || {});
                b = b.yAxis = t(b.yAxis || {});
                k(this, "getAxes");
                c.forEach(function (a, b) {
                    a.index = b;
                    a.isX = !0
                });
                b.forEach(function (a, b) {
                    a.index =
                        b
                });
                c.concat(b).forEach(function (b) {
                    new g(a, b)
                });
                k(this, "afterGetAxes")
            }, getSelectedPoints: function () {
                var a = [];
                this.series.forEach(function (b) {
                    a = a.concat((b[b.hasGroupedData ? "points" : "data"] || []).filter(function (a) {
                        return p(a.selectedStaging, a.selected)
                    }))
                });
                return a
            }, getSelectedSeries: function () {
                return this.series.filter(function (a) {
                    return a.selected
                })
            }, setTitle: function (a, b, c) {
                var d = this, e = d.options, g = d.styledMode;
                var f = e.title = H(!g && {style: {color: "#333333", fontSize: e.isStock ? "16px" : "18px"}}, e.title,
                    a);
                e = e.subtitle = H(!g && {style: {color: "#666666"}}, e.subtitle, b);
                [["title", a, f], ["subtitle", b, e]].forEach(function (a, b) {
                    var c = a[0], e = d[c], f = a[1];
                    a = a[2];
                    e && f && (d[c] = e = e.destroy());
                    a && !e && (d[c] = d.renderer.text(a.text, 0, 0, a.useHTML).attr({
                        align: a.align,
                        "class": "highcharts-" + c,
                        zIndex: a.zIndex || 4
                    }).add(), d[c].update = function (a) {
                        d.setTitle(!b && a, b && a)
                    }, g || d[c].css(a.style))
                });
                d.layOutTitles(c)
            }, layOutTitles: function (a) {
                var b = [0, 0, 0], c = this.renderer, d = this.spacingBox;
                ["title", "subtitle"].forEach(function (a) {
                    var e =
                        this[a], g = this.options[a], f = "title" === a ? -3 : g.verticalAlign ? 0 : b[0] + 2;
                    a = "subtitle" === a && "bottom" === g.verticalAlign;
                    if (e) {
                        if (!this.styledMode) var k = g.style.fontSize;
                        k = c.fontMetrics(k, e).b;
                        e.css({width: (g.width || d.width + g.widthAdjust) + "px"});
                        var p = e.getBBox(g.useHTML).height;
                        e.align(n({y: a ? k : f + k, height: p}, g), !1, "spacingBox");
                        g.floating || (g.verticalAlign ? a && (b[2] = p) : b[0] = Math.ceil(b[0] + p))
                    }
                }, this);
                var e = !this.titleOffset || this.titleOffset.join(",") !== b.join(",");
                this.titleOffset = b;
                !this.isDirtyBox && e &&
                (this.isDirtyBox = this.isDirtyLegend = e, this.hasRendered && p(a, !0) && this.isDirtyBox && this.redraw())
            }, getChartSize: function () {
                var a = this.options.chart, b = a.width;
                a = a.height;
                var d = this.renderTo;
                x(b) || (this.containerWidth = c.getStyle(d, "width"));
                x(a) || (this.containerHeight = c.getStyle(d, "height"));
                this.chartWidth = Math.max(0, b || this.containerWidth || 600);
                this.chartHeight = Math.max(0, c.relativeLength(a, this.chartWidth) || (1 < this.containerHeight ? this.containerHeight : 400))
            }, temporaryDisplay: function (b) {
                var d = this.renderTo;
                if (b) for (; d && d.style;) d.hcOrigStyle && (c.css(d, d.hcOrigStyle), delete d.hcOrigStyle), d.hcOrigDetached && (a.body.removeChild(d), d.hcOrigDetached = !1), d = d.parentNode; else for (; d && d.style;) {
                    a.body.contains(d) || d.parentNode || (d.hcOrigDetached = !0, a.body.appendChild(d));
                    if ("none" === c.getStyle(d, "display", !1) || d.hcOricDetached) d.hcOrigStyle = {
                        display: d.style.display,
                        height: d.style.height,
                        overflow: d.style.overflow
                    }, b = {
                        display: "block",
                        overflow: "hidden"
                    }, d !== this.renderTo && (b.height = 0), c.css(d, b), d.offsetWidth ||
                    d.style.setProperty("display", "block", "important");
                    d = d.parentNode;
                    if (d === a.body) break
                }
            }, setClassName: function (a) {
                this.container.className = "highcharts-container " + (a || "")
            }, getContainer: function () {
                var d = this.options, g = d.chart;
                var f = this.renderTo;
                var p = c.uniqueKey(), w, C;
                f || (this.renderTo = f = g.renderTo);
                I(f) && (this.renderTo = f = a.getElementById(f));
                f || c.error(13, !0, this);
                var q = v(b(f, "data-highcharts-chart"));
                B(q) && m[q] && m[q].hasRendered && m[q].destroy();
                b(f, "data-highcharts-chart", this.index);
                f.innerHTML =
                    "";
                g.skipClone || f.offsetWidth || this.temporaryDisplay();
                this.getChartSize();
                q = this.chartWidth;
                var A = this.chartHeight;
                z(f, {overflow: "hidden"});
                this.styledMode || (w = n({
                    position: "relative",
                    overflow: "hidden",
                    width: q + "px",
                    height: A + "px",
                    textAlign: "left",
                    lineHeight: "normal",
                    zIndex: 0,
                    "-webkit-tap-highlight-color": "rgba(0,0,0,0)"
                }, g.style));
                this.container = f = e("div", {id: p}, w, f);
                this._cursor = f.style.cursor;
                this.renderer = new (c[g.renderer] || c.Renderer)(f, q, A, null, g.forExport, d.exporting && d.exporting.allowHTML,
                    this.styledMode);
                this.setClassName(g.className);
                if (this.styledMode) for (C in d.defs) this.renderer.definition(d.defs[C]); else this.renderer.setStyle(g.style);
                this.renderer.chartIndex = this.index;
                k(this, "afterGetContainer")
            }, getMargins: function (a) {
                var b = this.spacing, d = this.margin, c = this.titleOffset;
                this.resetMargins();
                c[0] && !x(d[0]) && (this.plotTop = Math.max(this.plotTop, c[0] + this.options.title.margin + b[0]));
                c[2] && !x(d[2]) && (this.marginBottom = Math.max(this.marginBottom, c[2] + this.options.title.margin + b[2]));
                this.legend && this.legend.display && this.legend.adjustMargins(d, b);
                k(this, "getMargins");
                a || this.getAxisMargins()
            }, getAxisMargins: function () {
                var a = this, b = a.axisOffset = [0, 0, 0, 0], d = a.margin;
                a.hasCartesianSeries && a.axes.forEach(function (a) {
                    a.visible && a.getOffset()
                });
                C.forEach(function (c, e) {
                    x(d[e]) || (a[c] += b[e])
                });
                a.setChartSize()
            }, reflow: function (b) {
                var d = this, e = d.options.chart, g = d.renderTo, f = x(e.width) && x(e.height),
                    k = e.width || c.getStyle(g, "width");
                e = e.height || c.getStyle(g, "height");
                g = b ? b.target : P;
                if (!f &&
                    !d.isPrinting && k && e && (g === P || g === a)) {
                    if (k !== d.containerWidth || e !== d.containerHeight) c.clearTimeout(d.reflowTimeout), d.reflowTimeout = T(function () {
                        d.container && d.setSize(void 0, void 0, !1)
                    }, b ? 100 : 0);
                    d.containerWidth = k;
                    d.containerHeight = e
                }
            }, setReflow: function (a) {
                var b = this;
                !1 === a || this.unbindReflow ? !1 === a && this.unbindReflow && (this.unbindReflow = this.unbindReflow()) : (this.unbindReflow = r(P, "resize", function (a) {
                    b.reflow(a)
                }), r(this, "destroy", this.unbindReflow))
            }, setSize: function (a, b, d) {
                var e = this, g = e.renderer;
                e.isResizing += 1;
                c.setAnimation(d, e);
                e.oldChartHeight = e.chartHeight;
                e.oldChartWidth = e.chartWidth;
                void 0 !== a && (e.options.chart.width = a);
                void 0 !== b && (e.options.chart.height = b);
                e.getChartSize();
                if (!e.styledMode) {
                    var p = g.globalAnimation;
                    (p ? l : z)(e.container, {width: e.chartWidth + "px", height: e.chartHeight + "px"}, p)
                }
                e.setChartSize(!0);
                g.setSize(e.chartWidth, e.chartHeight, d);
                e.axes.forEach(function (a) {
                    a.isDirty = !0;
                    a.setScale()
                });
                e.isDirtyLegend = !0;
                e.isDirtyBox = !0;
                e.layOutTitles();
                e.getMargins();
                e.redraw(d);
                e.oldChartHeight =
                    null;
                k(e, "resize");
                T(function () {
                    e && k(e, "endResize", null, function () {
                        --e.isResizing
                    })
                }, f(p).duration)
            }, setChartSize: function (a) {
                var b = this.inverted, d = this.renderer, e = this.chartWidth, c = this.chartHeight,
                    g = this.options.chart, f = this.spacing, p = this.clipOffset, w, C, q, n;
                this.plotLeft = w = Math.round(this.plotLeft);
                this.plotTop = C = Math.round(this.plotTop);
                this.plotWidth = q = Math.max(0, Math.round(e - w - this.marginRight));
                this.plotHeight = n = Math.max(0, Math.round(c - C - this.marginBottom));
                this.plotSizeX = b ? n : q;
                this.plotSizeY =
                    b ? q : n;
                this.plotBorderWidth = g.plotBorderWidth || 0;
                this.spacingBox = d.spacingBox = {x: f[3], y: f[0], width: e - f[3] - f[1], height: c - f[0] - f[2]};
                this.plotBox = d.plotBox = {x: w, y: C, width: q, height: n};
                e = 2 * Math.floor(this.plotBorderWidth / 2);
                b = Math.ceil(Math.max(e, p[3]) / 2);
                d = Math.ceil(Math.max(e, p[0]) / 2);
                this.clipBox = {
                    x: b,
                    y: d,
                    width: Math.floor(this.plotSizeX - Math.max(e, p[1]) / 2 - b),
                    height: Math.max(0, Math.floor(this.plotSizeY - Math.max(e, p[2]) / 2 - d))
                };
                a || this.axes.forEach(function (a) {
                    a.setAxisSize();
                    a.setAxisTranslation()
                });
                k(this, "afterSetChartSize", {skipAxes: a})
            }, resetMargins: function () {
                k(this, "resetMargins");
                var a = this, b = a.options.chart;
                ["margin", "spacing"].forEach(function (d) {
                    var e = b[d], c = F(e) ? e : [e, e, e, e];
                    ["Top", "Right", "Bottom", "Left"].forEach(function (e, g) {
                        a[d][g] = p(b[d + e], c[g])
                    })
                });
                C.forEach(function (b, d) {
                    a[b] = p(a.margin[d], a.spacing[d])
                });
                a.axisOffset = [0, 0, 0, 0];
                a.clipOffset = [0, 0, 0, 0]
            }, drawChartBox: function () {
                var a = this.options.chart, b = this.renderer, d = this.chartWidth, e = this.chartHeight,
                    c = this.chartBackground,
                    g = this.plotBackground, f = this.plotBorder, p = this.styledMode, w = this.plotBGImage,
                    C = a.backgroundColor, q = a.plotBackgroundColor, n = a.plotBackgroundImage, m, A = this.plotLeft,
                    H = this.plotTop, u = this.plotWidth, r = this.plotHeight, l = this.plotBox, z = this.clipRect,
                    J = this.clipBox, h = "animate";
                c || (this.chartBackground = c = b.rect().addClass("highcharts-background").add(), h = "attr");
                if (p) var t = m = c.strokeWidth(); else {
                    t = a.borderWidth || 0;
                    m = t + (a.shadow ? 8 : 0);
                    C = {fill: C || "none"};
                    if (t || c["stroke-width"]) C.stroke = a.borderColor, C["stroke-width"] =
                        t;
                    c.attr(C).shadow(a.shadow)
                }
                c[h]({x: m / 2, y: m / 2, width: d - m - t % 2, height: e - m - t % 2, r: a.borderRadius});
                h = "animate";
                g || (h = "attr", this.plotBackground = g = b.rect().addClass("highcharts-plot-background").add());
                g[h](l);
                p || (g.attr({fill: q || "none"}).shadow(a.plotShadow), n && (w ? w.animate(l) : this.plotBGImage = b.image(n, A, H, u, r).add()));
                z ? z.animate({width: J.width, height: J.height}) : this.clipRect = b.clipRect(J);
                h = "animate";
                f || (h = "attr", this.plotBorder = f = b.rect().addClass("highcharts-plot-border").attr({zIndex: 1}).add());
                p || f.attr({stroke: a.plotBorderColor, "stroke-width": a.plotBorderWidth || 0, fill: "none"});
                f[h](f.crisp({x: A, y: H, width: u, height: r}, -f.strokeWidth()));
                this.isDirtyBox = !1;
                k(this, "afterDrawChartBox")
            }, propFromSeries: function () {
                var a = this, b = a.options.chart, d, e = a.options.series, c, g;
                ["inverted", "angular", "polar"].forEach(function (f) {
                    d = N[b.type || b.defaultSeriesType];
                    g = b[f] || d && d.prototype[f];
                    for (c = e && e.length; !g && c--;) (d = N[e[c].type]) && d.prototype[f] && (g = !0);
                    a[f] = g
                })
            }, linkSeries: function () {
                var a = this, b = a.series;
                b.forEach(function (a) {
                    a.linkedSeries.length = 0
                });
                b.forEach(function (b) {
                    var d = b.options.linkedTo;
                    I(d) && (d = ":previous" === d ? a.series[b.index - 1] : a.get(d)) && d.linkedParent !== b && (d.linkedSeries.push(b), b.linkedParent = d, b.visible = p(b.options.visible, d.options.visible, b.visible))
                });
                k(this, "afterLinkSeries")
            }, renderSeries: function () {
                this.series.forEach(function (a) {
                    a.translate();
                    a.render()
                })
            }, renderLabels: function () {
                var a = this, b = a.options.labels;
                b.items && b.items.forEach(function (d) {
                    var e = n(b.style, d.style),
                        c = v(e.left) + a.plotLeft, g = v(e.top) + a.plotTop + 12;
                    delete e.left;
                    delete e.top;
                    a.renderer.text(d.html, c, g).attr({zIndex: 2}).css(e).add()
                })
            }, render: function () {
                var a = this.axes, b = this.renderer, d = this.options, e = 0;
                this.setTitle();
                this.legend = new w(this, d.legend);
                this.getStacks && this.getStacks();
                this.getMargins(!0);
                this.setChartSize();
                d = this.plotWidth;
                a.some(function (a) {
                    if (a.horiz && a.visible && a.options.labels.enabled && a.series.length) return e = 21, !0
                });
                var c = this.plotHeight = Math.max(this.plotHeight - e, 0);
                a.forEach(function (a) {
                    a.setScale()
                });
                this.getAxisMargins();
                var g = 1.1 < d / this.plotWidth;
                var f = 1.05 < c / this.plotHeight;
                if (g || f) a.forEach(function (a) {
                    (a.horiz && g || !a.horiz && f) && a.setTickInterval(!0)
                }), this.getMargins();
                this.drawChartBox();
                this.hasCartesianSeries && a.forEach(function (a) {
                    a.visible && a.render()
                });
                this.seriesGroup || (this.seriesGroup = b.g("series-group").attr({zIndex: 3}).add());
                this.renderSeries();
                this.renderLabels();
                this.addCredits();
                this.setResponsive && this.setResponsive();
                this.updateContainerScaling();
                this.hasRendered = !0
            }, addCredits: function (a) {
                var b =
                    this;
                a = H(!0, this.options.credits, a);
                a.enabled && !this.credits && (this.credits = this.renderer.text(a.text + (this.mapCredits || ""), 0, 0).addClass("highcharts-credits").on("click", function () {
                    a.href && (P.location.href = a.href)
                }).attr({
                    align: a.position.align,
                    zIndex: 8
                }), b.styledMode || this.credits.css(a.style), this.credits.add().align(a.position), this.credits.update = function (a) {
                    b.credits = b.credits.destroy();
                    b.addCredits(a)
                })
            }, updateContainerScaling: function () {
                var a = this.container;
                if (a.offsetWidth && a.offsetHeight &&
                    a.getBoundingClientRect) {
                    var b = a.getBoundingClientRect(), d = b.width / a.offsetWidth;
                    a = b.height / a.offsetHeight;
                    1 !== d || 1 !== a ? this.containerScaling = {scaleX: d, scaleY: a} : delete this.containerScaling
                }
            }, destroy: function () {
                var a = this, b = a.axes, d = a.series, e = a.container, g, f = e && e.parentNode;
                k(a, "destroy");
                a.renderer.forExport ? E(m, a) : m[a.index] = void 0;
                c.chartCount--;
                a.renderTo.removeAttribute("data-highcharts-chart");
                J(a);
                for (g = b.length; g--;) b[g] = b[g].destroy();
                this.scroller && this.scroller.destroy && this.scroller.destroy();
                for (g = d.length; g--;) d[g] = d[g].destroy();
                "title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" ").forEach(function (b) {
                    var d = a[b];
                    d && d.destroy && (a[b] = d.destroy())
                });
                e && (e.innerHTML = "", J(e), f && q(e));
                y(a, function (b, d) {
                    delete a[d]
                })
            }, firstRender: function () {
                var a = this, b = a.options;
                if (!a.isReadyToRender || a.isReadyToRender()) {
                    a.getContainer();
                    a.resetMargins();
                    a.setChartSize();
                    a.propFromSeries();
                    a.getAxes();
                    (G(b.series) ? b.series : []).forEach(function (b) {
                        a.initSeries(b)
                    });
                    a.linkSeries();
                    k(a, "beforeRender");
                    A && (a.pointer = new A(a, b));
                    a.render();
                    if (!a.renderer.imgCount && a.onload) a.onload();
                    a.temporaryDisplay(!0)
                }
            }, onload: function () {
                this.callbacks.concat([this.callback]).forEach(function (a) {
                    a && void 0 !== this.index && a.apply(this, [this])
                }, this);
                k(this, "load");
                k(this, "render");
                x(this.index) && this.setReflow(this.options.chart.reflow);
                this.onload = null
            }
        })
    });
    K(D, "parts/Point.js", [D["parts/Globals.js"],
        D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined, E = h.erase, G = h.isArray, B = h.isNumber, F = h.isObject, I, y = c.extend, v = c.fireEvent,
            t = c.format, r = c.pick, l = c.uniqueKey, f = c.removeEvent;
        c.Point = I = function () {
        };
        c.Point.prototype = {
            init: function (b, a, c) {
                this.series = b;
                this.applyOptions(a, c);
                this.id = x(this.id) ? this.id : l();
                this.resolveColor();
                b.chart.pointCount++;
                v(this, "afterInit");
                return this
            }, resolveColor: function () {
                var b = this.series;
                var a = b.chart.options.chart.colorCount;
                var c = b.chart.styledMode;
                c || this.options.color ||
                (this.color = b.color);
                b.options.colorByPoint ? (c || (a = b.options.colors || b.chart.options.colors, this.color = this.color || a[b.colorCounter], a = a.length), c = b.colorCounter, b.colorCounter++, b.colorCounter === a && (b.colorCounter = 0)) : c = b.colorIndex;
                this.colorIndex = r(this.colorIndex, c)
            }, applyOptions: function (b, a) {
                var c = this.series, e = c.options.pointValKey || c.pointValKey;
                b = I.prototype.optionsToObject.call(this, b);
                y(this, b);
                this.options = this.options ? y(this.options, b) : b;
                b.group && delete this.group;
                b.dataLabels && delete this.dataLabels;
                e && (this.y = this[e]);
                this.formatPrefix = (this.isNull = r(this.isValid && !this.isValid(), null === this.x || !B(this.y))) ? "null" : "point";
                this.selected && (this.state = "select");
                "name" in this && void 0 === a && c.xAxis && c.xAxis.hasNames && (this.x = c.xAxis.nameToX(this));
                void 0 === this.x && c && (this.x = void 0 === a ? c.autoIncrement(this) : a);
                return this
            }, setNestedProperty: function (b, a, c) {
                c.split(".").reduce(function (b, d, c, g) {
                    b[d] = g.length - 1 === c ? a : F(b[d], !0) ? b[d] : {};
                    return b[d]
                }, b);
                return b
            }, optionsToObject: function (b) {
                var a = {},
                    g = this.series, e = g.options.keys, d = e || g.pointArrayMap || ["y"], f = d.length, m = 0, r = 0;
                if (B(b) || null === b) a[d[0]] = b; else if (G(b)) for (!e && b.length > f && (g = typeof b[0], "string" === g ? a.name = b[0] : "number" === g && (a.x = b[0]), m++); r < f;) e && void 0 === b[m] || (0 < d[r].indexOf(".") ? c.Point.prototype.setNestedProperty(a, b[m], d[r]) : a[d[r]] = b[m]), m++, r++; else "object" === typeof b && (a = b, b.dataLabels && (g._hasPointLabels = !0), b.marker && (g._hasPointMarkers = !0));
                return a
            }, getClassName: function () {
                return "highcharts-point" + (this.selected ? " highcharts-point-select" :
                    "") + (this.negative ? " highcharts-negative" : "") + (this.isNull ? " highcharts-null-point" : "") + (void 0 !== this.colorIndex ? " highcharts-color-" + this.colorIndex : "") + (this.options.className ? " " + this.options.className : "") + (this.zone && this.zone.className ? " " + this.zone.className.replace("highcharts-negative", "") : "")
            }, getZone: function () {
                var b = this.series, a = b.zones;
                b = b.zoneAxis || "y";
                var c = 0, e;
                for (e = a[c]; this[b] >= e.value;) e = a[++c];
                this.nonZonedColor || (this.nonZonedColor = this.color);
                this.color = e && e.color && !this.options.color ?
                    e.color : this.nonZonedColor;
                return e
            }, destroy: function () {
                var b = this.series.chart, a = b.hoverPoints, c;
                b.pointCount--;
                a && (this.setState(), E(a, this), a.length || (b.hoverPoints = null));
                if (this === b.hoverPoint) this.onMouseOut();
                if (this.graphic || this.dataLabel || this.dataLabels) f(this), this.destroyElements();
                this.legendItem && b.legend.destroyItem(this);
                for (c in this) this[c] = null
            }, destroyElements: function (b) {
                var a = this, c = [], e;
                b = b || {graphic: 1, dataLabel: 1};
                b.graphic && c.push("graphic", "shadowGroup");
                b.dataLabel && c.push("dataLabel",
                    "dataLabelUpper", "connector");
                for (e = c.length; e--;) {
                    var d = c[e];
                    a[d] && (a[d] = a[d].destroy())
                }
                ["dataLabel", "connector"].forEach(function (d) {
                    var c = d + "s";
                    b[d] && a[c] && (a[c].forEach(function (a) {
                        a.element && a.destroy()
                    }), delete a[c])
                })
            }, getLabelConfig: function () {
                return {
                    x: this.category,
                    y: this.y,
                    color: this.color,
                    colorIndex: this.colorIndex,
                    key: this.name || this.category,
                    series: this.series,
                    point: this,
                    percentage: this.percentage,
                    total: this.total || this.stackTotal
                }
            }, tooltipFormatter: function (b) {
                var a = this.series, c = a.tooltipOptions,
                    e = r(c.valueDecimals, ""), d = c.valuePrefix || "", f = c.valueSuffix || "";
                a.chart.styledMode && (b = a.chart.tooltip.styledModeFormat(b));
                (a.pointArrayMap || ["y"]).forEach(function (a) {
                    a = "{point." + a;
                    if (d || f) b = b.replace(RegExp(a + "}", "g"), d + a + "}" + f);
                    b = b.replace(RegExp(a + "}", "g"), a + ":,." + e + "f}")
                });
                return t(b, {point: this, series: this.series}, a.chart.time)
            }, firePointEvent: function (b, a, c) {
                var e = this, d = this.series.options;
                (d.point.events[b] || e.options && e.options.events && e.options.events[b]) && this.importEvents();
                "click" ===
                b && d.allowPointSelect && (c = function (a) {
                    e.select && e.select(null, a.ctrlKey || a.metaKey || a.shiftKey)
                });
                v(this, b, a, c)
            }, visible: !0
        }
    });
    K(D, "parts/Series.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined, E = h.erase, G = h.isArray, B = h.isNumber, F = h.isString, I = h.objectEach, y = h.splat,
            v = c.addEvent, t = c.animObject, r = c.arrayMax, l = c.arrayMin, f = c.correctFloat, b = c.defaultOptions,
            a = c.defaultPlotOptions, g = c.extend, e = c.fireEvent, d = c.merge, q = c.pick, m = c.removeEvent,
            z = c.SVGElement, n = c.syncTimeout,
            u = c.win;
        c.Series = c.seriesType("line", null, {
            lineWidth: 2,
            allowPointSelect: !1,
            showCheckbox: !1,
            animation: {duration: 1E3},
            events: {},
            marker: {
                lineWidth: 0,
                lineColor: "#ffffff",
                enabledThreshold: 2,
                radius: 4,
                states: {
                    normal: {animation: !0},
                    hover: {animation: {duration: 50}, enabled: !0, radiusPlus: 2, lineWidthPlus: 1},
                    select: {fillColor: "#cccccc", lineColor: "#000000", lineWidth: 2}
                }
            },
            point: {events: {}},
            dataLabels: {
                align: "center", formatter: function () {
                    return null === this.y ? "" : c.numberFormat(this.y, -1)
                }, padding: 5, style: {
                    fontSize: "11px",
                    fontWeight: "bold", color: "contrast", textOutline: "1px contrast"
                }, verticalAlign: "bottom", x: 0, y: 0
            },
            cropThreshold: 300,
            opacity: 1,
            pointRange: 0,
            softThreshold: !0,
            states: {
                normal: {animation: !0},
                hover: {animation: {duration: 50}, lineWidthPlus: 1, marker: {}, halo: {size: 10, opacity: .25}},
                select: {animation: {duration: 0}},
                inactive: {animation: {duration: 50}, opacity: .2}
            },
            stickyTracking: !0,
            turboThreshold: 1E3,
            findNearestPointBy: "x"
        }, {
            axisTypes: ["xAxis", "yAxis"],
            coll: "series",
            colorCounter: 0,
            cropShoulder: 1,
            directTouch: !1,
            isCartesian: !0,
            parallelArrays: ["x", "y"],
            pointClass: c.Point,
            requireSorting: !0,
            sorted: !0,
            init: function (a, b) {
                e(this, "init", {options: b});
                var d = this, f = a.series, k;
                this.eventOptions = this.eventOptions || {};
                d.chart = a;
                d.options = b = d.setOptions(b);
                d.linkedSeries = [];
                d.bindAxes();
                g(d, {name: b.name, state: "", visible: !1 !== b.visible, selected: !0 === b.selected});
                var p = b.events;
                I(p, function (a, b) {
                    c.isFunction(a) && d.eventOptions[b] !== a && (c.isFunction(d.eventOptions[b]) && m(d, b, d.eventOptions[b]), d.eventOptions[b] = a, v(d, b, a))
                });
                if (p && p.click ||
                    b.point && b.point.events && b.point.events.click || b.allowPointSelect) a.runTrackerClick = !0;
                d.getColor();
                d.getSymbol();
                d.parallelArrays.forEach(function (a) {
                    d[a + "Data"] || (d[a + "Data"] = [])
                });
                d.points || d.data || d.setData(b.data, !1);
                d.isCartesian && (a.hasCartesianSeries = !0);
                f.length && (k = f[f.length - 1]);
                d._i = q(k && k._i, -1) + 1;
                a.orderSeries(this.insert(f));
                e(this, "afterInit")
            },
            insert: function (a) {
                var b = this.options.index, d;
                if (B(b)) {
                    for (d = a.length; d--;) if (b >= q(a[d].options.index, a[d]._i)) {
                        a.splice(d + 1, 0, this);
                        break
                    }
                    -1 ===
                    d && a.unshift(this);
                    d += 1
                } else a.push(this);
                return q(d, a.length - 1)
            },
            bindAxes: function () {
                var a = this, b = a.options, d = a.chart, g;
                e(this, "bindAxes", null, function () {
                    (a.axisTypes || []).forEach(function (e) {
                        d[e].forEach(function (d) {
                            g = d.options;
                            if (b[e] === g.index || void 0 !== b[e] && b[e] === g.id || void 0 === b[e] && 0 === g.index) a.insert(d.series), a[e] = d, d.isDirty = !0
                        });
                        a[e] || a.optionalAxis === e || c.error(18, !0, d)
                    })
                })
            },
            updateParallelArrays: function (a, b) {
                var d = a.series, c = arguments, e = B(b) ? function (c) {
                    var e = "y" === c && d.toYData ? d.toYData(a) :
                        a[c];
                    d[c + "Data"][b] = e
                } : function (a) {
                    Array.prototype[b].apply(d[a + "Data"], Array.prototype.slice.call(c, 2))
                };
                d.parallelArrays.forEach(e)
            },
            hasData: function () {
                return this.visible && void 0 !== this.dataMax && void 0 !== this.dataMin || this.visible && this.yData && 0 < this.yData.length
            },
            autoIncrement: function () {
                var a = this.options, b = this.xIncrement, d, c = a.pointIntervalUnit, e = this.chart.time;
                b = q(b, a.pointStart, 0);
                this.pointInterval = d = q(this.pointInterval, a.pointInterval, 1);
                c && (a = new e.Date(b), "day" === c ? e.set("Date", a, e.get("Date",
                    a) + d) : "month" === c ? e.set("Month", a, e.get("Month", a) + d) : "year" === c && e.set("FullYear", a, e.get("FullYear", a) + d), d = a.getTime() - b);
                this.xIncrement = b + d;
                return b
            },
            setOptions: function (a) {
                var c = this.chart, g = c.options, f = g.plotOptions, k = c.userOptions || {};
                a = d(a);
                c = c.styledMode;
                var p = {plotOptions: f, userOptions: a};
                e(this, "setOptions", p);
                var n = p.plotOptions[this.type], m = k.plotOptions || {};
                this.userOptions = p.userOptions;
                k = d(n, f.series, k.plotOptions && k.plotOptions[this.type], a);
                this.tooltipOptions = d(b.tooltip, b.plotOptions.series &&
                    b.plotOptions.series.tooltip, b.plotOptions[this.type].tooltip, g.tooltip.userOptions, f.series && f.series.tooltip, f[this.type].tooltip, a.tooltip);
                this.stickyTracking = q(a.stickyTracking, m[this.type] && m[this.type].stickyTracking, m.series && m.series.stickyTracking, this.tooltipOptions.shared && !this.noSharedTooltip ? !0 : k.stickyTracking);
                null === n.marker && delete k.marker;
                this.zoneAxis = k.zoneAxis;
                g = this.zones = (k.zones || []).slice();
                !k.negativeColor && !k.negativeFillColor || k.zones || (f = {
                    value: k[this.zoneAxis + "Threshold"] ||
                        k.threshold || 0, className: "highcharts-negative"
                }, c || (f.color = k.negativeColor, f.fillColor = k.negativeFillColor), g.push(f));
                g.length && x(g[g.length - 1].value) && g.push(c ? {} : {color: this.color, fillColor: this.fillColor});
                e(this, "afterSetOptions", {options: k});
                return k
            },
            getName: function () {
                return q(this.options.name, "Series " + (this.index + 1))
            },
            getCyclic: function (a, b, d) {
                var c = this.chart, e = this.userOptions, g = a + "Index", f = a + "Counter",
                    k = d ? d.length : q(c.options.chart[a + "Count"], c[a + "Count"]);
                if (!b) {
                    var w = q(e[g], e["_" +
                    g]);
                    x(w) || (c.series.length || (c[f] = 0), e["_" + g] = w = c[f] % k, c[f] += 1);
                    d && (b = d[w])
                }
                void 0 !== w && (this[g] = w);
                this[a] = b
            },
            getColor: function () {
                this.chart.styledMode ? this.getCyclic("color") : this.options.colorByPoint ? this.options.color = null : this.getCyclic("color", this.options.color || a[this.type].color, this.chart.options.colors)
            },
            getSymbol: function () {
                this.getCyclic("symbol", this.options.marker.symbol, this.chart.options.symbols)
            },
            findPointIndex: function (a, b) {
                var d = a.id;
                a = a.x;
                var c = this.points, e;
                if (d) {
                    var g = (d = this.chart.get(d)) &&
                        d.index;
                    void 0 !== g && (e = !0)
                }
                void 0 === g && B(a) && (g = this.xData.indexOf(a, b));
                -1 !== g && void 0 !== g && this.cropped && (g = g >= this.cropStart ? g - this.cropStart : g);
                !e && c[g] && c[g].touched && (g = void 0);
                return g
            },
            drawLegendSymbol: c.LegendSymbolMixin.drawLineMarker,
            updateData: function (a) {
                var b = this.options, d = this.points, c = [], e, g, f, k = this.requireSorting,
                    n = a.length === d.length, q = !0;
                this.xIncrement = null;
                a.forEach(function (a, g) {
                    var p = x(a) && this.pointClass.prototype.optionsToObject.call({series: this}, a) || {};
                    var w = p.x;
                    if (p.id ||
                        B(w)) if (w = this.findPointIndex(p, f), -1 === w || void 0 === w ? c.push(a) : d[w] && a !== b.data[w] ? (d[w].update(a, !1, null, !1), d[w].touched = !0, k && (f = w + 1)) : d[w] && (d[w].touched = !0), !n || g !== w || this.hasDerivedData) e = !0
                }, this);
                if (e) for (a = d.length; a--;) (g = d[a]) && !g.touched && g.remove(!1); else n ? a.forEach(function (a, b) {
                    d[b].update && a !== d[b].y && d[b].update(a, !1, null, !1)
                }) : q = !1;
                d.forEach(function (a) {
                    a && (a.touched = !1)
                });
                if (!q) return !1;
                c.forEach(function (a) {
                    this.addPoint(a, !1, null, null, !1)
                }, this);
                return !0
            },
            setData: function (a,
                               b, d, e) {
                var g = this, f = g.points, k = f && f.length || 0, w, n = g.options, m = g.chart, u = null,
                    C = g.xAxis, H = n.turboThreshold, r = this.xData, l = this.yData,
                    z = (w = g.pointArrayMap) && w.length, h = n.keys, t = 0, v = 1, y;
                a = a || [];
                w = a.length;
                b = q(b, !0);
                !1 !== e && w && k && !g.cropped && !g.hasGroupedData && g.visible && !g.isSeriesBoosting && (y = this.updateData(a));
                if (!y) {
                    g.xIncrement = null;
                    g.colorCounter = 0;
                    this.parallelArrays.forEach(function (a) {
                        g[a + "Data"].length = 0
                    });
                    if (H && w > H) {
                        for (d = 0; null === u && d < w;) u = a[d], d++;
                        if (B(u)) for (d = 0; d < w; d++) r[d] = this.autoIncrement(),
                            l[d] = a[d]; else if (G(u)) if (z) for (d = 0; d < w; d++) u = a[d], r[d] = u[0], l[d] = u.slice(1, z + 1); else for (h && (t = h.indexOf("x"), v = h.indexOf("y"), t = 0 <= t ? t : 0, v = 0 <= v ? v : 1), d = 0; d < w; d++) u = a[d], r[d] = u[t], l[d] = u[v]; else c.error(12, !1, m)
                    } else for (d = 0; d < w; d++) void 0 !== a[d] && (u = {series: g}, g.pointClass.prototype.applyOptions.apply(u, [a[d]]), g.updateParallelArrays(u, d));
                    l && F(l[0]) && c.error(14, !0, m);
                    g.data = [];
                    g.options.data = g.userOptions.data = a;
                    for (d = k; d--;) f[d] && f[d].destroy && f[d].destroy();
                    C && (C.minRange = C.userMinRange);
                    g.isDirty =
                        m.isDirtyBox = !0;
                    g.isDirtyData = !!f;
                    d = !1
                }
                "point" === n.legendType && (this.processData(), this.generatePoints());
                b && m.redraw(d)
            },
            processData: function (a) {
                var b = this.xData, d = this.yData, e = b.length;
                var g = 0;
                var f = this.xAxis, k = this.options;
                var n = k.cropThreshold;
                var q = this.getExtremesFromAll || k.getExtremesFromAll, m = this.isCartesian;
                k = f && f.val2lin;
                var u = f && f.isLog, r = this.requireSorting;
                if (m && !this.isDirty && !f.isDirty && !this.yAxis.isDirty && !a) return !1;
                if (f) {
                    a = f.getExtremes();
                    var l = a.min;
                    var z = a.max
                }
                if (m && this.sorted &&
                    !q && (!n || e > n || this.forceCrop)) if (b[e - 1] < l || b[0] > z) b = [], d = []; else if (this.yData && (b[0] < l || b[e - 1] > z)) {
                    g = this.cropData(this.xData, this.yData, l, z);
                    b = g.xData;
                    d = g.yData;
                    g = g.start;
                    var h = !0
                }
                for (n = b.length || 1; --n;) if (e = u ? k(b[n]) - k(b[n - 1]) : b[n] - b[n - 1], 0 < e && (void 0 === t || e < t)) var t = e; else 0 > e && r && (c.error(15, !1, this.chart), r = !1);
                this.cropped = h;
                this.cropStart = g;
                this.processedXData = b;
                this.processedYData = d;
                this.closestPointRange = this.basePointRange = t
            },
            cropData: function (a, b, d, c, e) {
                var g = a.length, f = 0, k = g, w;
                e = q(e,
                    this.cropShoulder);
                for (w = 0; w < g; w++) if (a[w] >= d) {
                    f = Math.max(0, w - e);
                    break
                }
                for (d = w; d < g; d++) if (a[d] > c) {
                    k = d + e;
                    break
                }
                return {xData: a.slice(f, k), yData: b.slice(f, k), start: f, end: k}
            },
            generatePoints: function () {
                var a = this.options, b = a.data, d = this.data, c, f = this.processedXData, p = this.processedYData,
                    n = this.pointClass, q = f.length, m = this.cropStart || 0, u = this.hasGroupedData;
                a = a.keys;
                var r = [], l;
                d || u || (d = [], d.length = b.length, d = this.data = d);
                a && u && (this.options.keys = !1);
                for (l = 0; l < q; l++) {
                    var z = m + l;
                    if (u) {
                        var h = (new n).init(this,
                            [f[l]].concat(y(p[l])));
                        h.dataGroup = this.groupMap[l];
                        h.dataGroup.options && (h.options = h.dataGroup.options, g(h, h.dataGroup.options), delete h.dataLabels)
                    } else (h = d[z]) || void 0 === b[z] || (d[z] = h = (new n).init(this, b[z], f[l]));
                    h && (h.index = z, r[l] = h)
                }
                this.options.keys = a;
                if (d && (q !== (c = d.length) || u)) for (l = 0; l < c; l++) l !== m || u || (l += q), d[l] && (d[l].destroyElements(), d[l].plotX = void 0);
                this.data = d;
                this.points = r;
                e(this, "afterGeneratePoints")
            },
            getXExtremes: function (a) {
                return {min: l(a), max: r(a)}
            },
            getExtremes: function (a) {
                var b =
                    this.yAxis, d = this.processedXData, c = [], g = 0;
                var f = this.xAxis.getExtremes();
                var k = f.min, n = f.max, q = this.requireSorting ? this.cropShoulder : 0, m;
                a = a || this.stackedYData || this.processedYData || [];
                f = a.length;
                for (m = 0; m < f; m++) {
                    var u = d[m];
                    var z = a[m];
                    var h = (B(z) || G(z)) && (!b.positiveValuesOnly || z.length || 0 < z);
                    u = this.getExtremesFromAll || this.options.getExtremesFromAll || this.cropped || (d[m + q] || u) >= k && (d[m - q] || u) <= n;
                    if (h && u) if (h = z.length) for (; h--;) B(z[h]) && (c[g++] = z[h]); else c[g++] = z
                }
                this.dataMin = l(c);
                this.dataMax = r(c);
                e(this, "afterGetExtremes")
            },
            translate: function () {
                this.processedXData || this.processData();
                this.generatePoints();
                var a = this.options, b = a.stacking, d = this.xAxis, c = d.categories, g = this.yAxis, p = this.points,
                    n = p.length, m = !!this.modifyValue, u, r = this.pointPlacementToXValue(), l = B(r),
                    z = a.threshold, h = a.startFromThreshold ? z : 0, t, v = this.zoneAxis || "y",
                    y = Number.MAX_VALUE;
                for (u = 0; u < n; u++) {
                    var F = p[u], I = F.x;
                    var E = F.y;
                    var D = F.low, K = b && g.stacks[(this.negStacks && E < (h ? 0 : z) ? "-" : "") + this.stackKey];
                    g.positiveValuesOnly && null !==
                    E && 0 >= E && (F.isNull = !0);
                    F.plotX = t = f(Math.min(Math.max(-1E5, d.translate(I, 0, 0, 0, 1, r, "flags" === this.type)), 1E5));
                    if (b && this.visible && K && K[I]) {
                        var X = this.getStackIndicator(X, I, this.index);
                        if (!F.isNull) {
                            var O = K[I];
                            var Y = O.points[X.key]
                        }
                    }
                    G(Y) && (D = Y[0], E = Y[1], D === h && X.key === K[I].base && (D = q(B(z) && z, g.min)), g.positiveValuesOnly && 0 >= D && (D = null), F.total = F.stackTotal = O.total, F.percentage = O.total && F.y / O.total * 100, F.stackY = E, O.setOffset(this.pointXOffset || 0, this.barW || 0));
                    F.yBottom = x(D) ? Math.min(Math.max(-1E5,
                        g.translate(D, 0, 1, 0, 1)), 1E5) : null;
                    m && (E = this.modifyValue(E, F));
                    F.plotY = E = "number" === typeof E && Infinity !== E ? Math.min(Math.max(-1E5, g.translate(E, 0, 1, 0, 1)), 1E5) : void 0;
                    F.isInside = void 0 !== E && 0 <= E && E <= g.len && 0 <= t && t <= d.len;
                    F.clientX = l ? f(d.translate(I, 0, 0, 0, 1, r)) : t;
                    F.negative = F[v] < (a[v + "Threshold"] || z || 0);
                    F.category = c && void 0 !== c[F.x] ? c[F.x] : F.x;
                    if (!F.isNull) {
                        void 0 !== Z && (y = Math.min(y, Math.abs(t - Z)));
                        var Z = t
                    }
                    F.zone = this.zones.length && F.getZone()
                }
                this.closestPointRangePx = y;
                e(this, "afterTranslate")
            },
            getValidPoints: function (a,
                                      b, d) {
                var c = this.chart;
                return (a || this.points || []).filter(function (a) {
                    return b && !c.isInsidePlot(a.plotX, a.plotY, c.inverted) ? !1 : d || !a.isNull
                })
            },
            getClipBox: function (a, b) {
                var d = this.options, c = this.chart, e = c.inverted, g = this.xAxis, f = g && this.yAxis;
                a && !1 === d.clip && f ? a = e ? {
                    y: -c.chartWidth + f.len + f.pos,
                    height: c.chartWidth,
                    width: c.chartHeight,
                    x: -c.chartHeight + g.len + g.pos
                } : {
                    y: -f.pos,
                    height: c.chartHeight,
                    width: c.chartWidth,
                    x: -g.pos
                } : (a = this.clipBox || c.clipBox, b && (a.width = c.plotSizeX, a.x = 0));
                return b ? {
                    width: a.width,
                    x: a.x
                } : a
            },
            setClip: function (a) {
                var b = this.chart, d = this.options, c = b.renderer, e = b.inverted, g = this.clipBox,
                    f = this.getClipBox(a),
                    k = this.sharedClipKey || ["_sharedClip", a && a.duration, a && a.easing, f.height, d.xAxis, d.yAxis].join(),
                    n = b[k], m = b[k + "m"];
                n || (a && (f.width = 0, e && (f.x = b.plotSizeX + (!1 !== d.clip ? 0 : b.plotTop)), b[k + "m"] = m = c.clipRect(e ? b.plotSizeX + 99 : -99, e ? -b.plotLeft : -b.plotTop, 99, e ? b.chartWidth : b.chartHeight)), b[k] = n = c.clipRect(f), n.count = {length: 0});
                a && !n.count[this.index] && (n.count[this.index] = !0, n.count.length +=
                    1);
                if (!1 !== d.clip || a) this.group.clip(a || g ? n : b.clipRect), this.markerGroup.clip(m), this.sharedClipKey = k;
                a || (n.count[this.index] && (delete n.count[this.index], --n.count.length), 0 === n.count.length && k && b[k] && (g || (b[k] = b[k].destroy()), b[k + "m"] && (b[k + "m"] = b[k + "m"].destroy())))
            },
            animate: function (a) {
                var b = this.chart, d = t(this.options.animation);
                if (a) this.setClip(d); else {
                    var c = this.sharedClipKey;
                    a = b[c];
                    var e = this.getClipBox(d, !0);
                    a && a.animate(e, d);
                    b[c + "m"] && b[c + "m"].animate({
                        width: e.width + 99, x: e.x - (b.inverted ?
                            0 : 99)
                    }, d);
                    this.animate = null
                }
            },
            afterAnimate: function () {
                this.setClip();
                e(this, "afterAnimate");
                this.finishedAnimating = !0
            },
            drawPoints: function () {
                var a = this.points, b = this.chart, d, c = this.options.marker,
                    e = this[this.specialGroup] || this.markerGroup;
                var g = this.xAxis;
                var f = q(c.enabled, !g || g.isRadial ? !0 : null, this.closestPointRangePx >= c.enabledThreshold * c.radius);
                if (!1 !== c.enabled || this._hasPointMarkers) for (g = 0; g < a.length; g++) {
                    var n = a[g];
                    var m = (d = n.graphic) ? "animate" : "attr";
                    var u = n.marker || {};
                    var r = !!n.marker;
                    var l = f && void 0 === u.enabled || u.enabled;
                    var z = !1 !== n.isInside;
                    if (l && !n.isNull) {
                        l = q(u.symbol, this.symbol);
                        var h = this.markerAttribs(n, n.selected && "select");
                        d ? d[z ? "show" : "hide"](z).animate(h) : z && (0 < h.width || n.hasImage) && (n.graphic = d = b.renderer.symbol(l, h.x, h.y, h.width, h.height, r ? u : c).add(e));
                        if (d && !b.styledMode) d[m](this.pointAttribs(n, n.selected && "select"));
                        d && d.addClass(n.getClassName(), !0)
                    } else d && (n.graphic = d.destroy())
                }
            },
            markerAttribs: function (a, b) {
                var d = this.options.marker, c = a.marker || {}, e = c.symbol ||
                    d.symbol, g = q(c.radius, d.radius);
                b && (d = d.states[b], b = c.states && c.states[b], g = q(b && b.radius, d && d.radius, g + (d && d.radiusPlus || 0)));
                a.hasImage = e && 0 === e.indexOf("url");
                a.hasImage && (g = 0);
                a = {x: Math.floor(a.plotX) - g, y: a.plotY - g};
                g && (a.width = a.height = 2 * g);
                return a
            },
            pointAttribs: function (a, b) {
                var d = this.options.marker, c = a && a.options, e = c && c.marker || {}, g = this.color,
                    f = c && c.color, k = a && a.color;
                c = q(e.lineWidth, d.lineWidth);
                var n = a && a.zone && a.zone.color;
                a = 1;
                g = f || n || k || g;
                f = e.fillColor || d.fillColor || g;
                g = e.lineColor ||
                    d.lineColor || g;
                b = b || "normal";
                d = d.states[b];
                b = e.states && e.states[b] || {};
                c = q(b.lineWidth, d.lineWidth, c + q(b.lineWidthPlus, d.lineWidthPlus, 0));
                f = b.fillColor || d.fillColor || f;
                g = b.lineColor || d.lineColor || g;
                a = q(b.opacity, d.opacity, a);
                return {stroke: g, "stroke-width": c, fill: f, opacity: a}
            },
            destroy: function (a) {
                var b = this, d = b.chart, g = /AppleWebKit\/533/.test(u.navigator.userAgent), f, k, n = b.data || [],
                    q, r;
                e(b, "destroy");
                a || m(b);
                (b.axisTypes || []).forEach(function (a) {
                    (r = b[a]) && r.series && (E(r.series, b), r.isDirty = r.forceRedraw =
                        !0)
                });
                b.legendItem && b.chart.legend.destroyItem(b);
                for (k = n.length; k--;) (q = n[k]) && q.destroy && q.destroy();
                b.points = null;
                c.clearTimeout(b.animationTimeout);
                I(b, function (a, b) {
                    a instanceof z && !a.survive && (f = g && "group" === b ? "hide" : "destroy", a[f]())
                });
                d.hoverSeries === b && (d.hoverSeries = null);
                E(d.series, b);
                d.orderSeries();
                I(b, function (d, c) {
                    a && "hcEvents" === c || delete b[c]
                })
            },
            getGraphPath: function (a, b, d) {
                var c = this, e = c.options, g = e.step, f, k = [], n = [], m;
                a = a || c.points;
                (f = a.reversed) && a.reverse();
                (g = {right: 1, center: 2}[g] ||
                    g && 3) && f && (g = 4 - g);
                !e.connectNulls || b || d || (a = this.getValidPoints(a));
                a.forEach(function (f, p) {
                    var q = f.plotX, w = f.plotY, u = a[p - 1];
                    (f.leftCliff || u && u.rightCliff) && !d && (m = !0);
                    f.isNull && !x(b) && 0 < p ? m = !e.connectNulls : f.isNull && !b ? m = !0 : (0 === p || m ? p = ["M", f.plotX, f.plotY] : c.getPointSpline ? p = c.getPointSpline(a, f, p) : g ? (p = 1 === g ? ["L", u.plotX, w] : 2 === g ? ["L", (u.plotX + q) / 2, u.plotY, "L", (u.plotX + q) / 2, w] : ["L", q, u.plotY], p.push("L", q, w)) : p = ["L", q, w], n.push(f.x), g && (n.push(f.x), 2 === g && n.push(f.x)), k.push.apply(k, p), m = !1)
                });
                k.xMap = n;
                return c.graphPath = k
            },
            drawGraph: function () {
                var a = this, b = this.options, d = (this.gappedPath || this.getGraphPath).call(this),
                    c = this.chart.styledMode, e = [["graph", "highcharts-graph"]];
                c || e[0].push(b.lineColor || this.color || "#cccccc", b.dashStyle);
                e = a.getZonesGraphs(e);
                e.forEach(function (e, g) {
                    var f = e[0], k = a[f], p = k ? "animate" : "attr";
                    k ? (k.endX = a.preventGraphAnimation ? null : d.xMap, k.animate({d: d})) : d.length && (a[f] = k = a.chart.renderer.path(d).addClass(e[1]).attr({zIndex: 1}).add(a.group));
                    k && !c && (f = {
                        stroke: e[2],
                        "stroke-width": b.lineWidth, fill: a.fillGraph && a.color || "none"
                    }, e[3] ? f.dashstyle = e[3] : "square" !== b.linecap && (f["stroke-linecap"] = f["stroke-linejoin"] = "round"), k[p](f).shadow(2 > g && b.shadow));
                    k && (k.startX = d.xMap, k.isArea = d.isArea)
                })
            },
            getZonesGraphs: function (a) {
                this.zones.forEach(function (b, d) {
                    d = ["zone-graph-" + d, "highcharts-graph highcharts-zone-graph-" + d + " " + (b.className || "")];
                    this.chart.styledMode || d.push(b.color || this.color, b.dashStyle || this.options.dashStyle);
                    a.push(d)
                }, this);
                return a
            },
            applyZones: function () {
                var a =
                        this, b = this.chart, d = b.renderer, c = this.zones, e, g, f = this.clips || [], n, m = this.graph,
                    u = this.area, r = Math.max(b.chartWidth, b.chartHeight), l = this[(this.zoneAxis || "y") + "Axis"],
                    z = b.inverted, h, t, v, y = !1;
                if (c.length && (m || u) && l && void 0 !== l.min) {
                    var B = l.reversed;
                    var x = l.horiz;
                    m && !this.showLine && m.hide();
                    u && u.hide();
                    var G = l.getExtremes();
                    c.forEach(function (c, k) {
                        e = B ? x ? b.plotWidth : 0 : x ? 0 : l.toPixels(G.min) || 0;
                        e = Math.min(Math.max(q(g, e), 0), r);
                        g = Math.min(Math.max(Math.round(l.toPixels(q(c.value, G.max), !0) || 0), 0), r);
                        y &&
                        (e = g = l.toPixels(G.max));
                        h = Math.abs(e - g);
                        t = Math.min(e, g);
                        v = Math.max(e, g);
                        l.isXAxis ? (n = {
                            x: z ? v : t,
                            y: 0,
                            width: h,
                            height: r
                        }, x || (n.x = b.plotHeight - n.x)) : (n = {
                            x: 0,
                            y: z ? v : t,
                            width: r,
                            height: h
                        }, x && (n.y = b.plotWidth - n.y));
                        z && d.isVML && (n = l.isXAxis ? {
                            x: 0,
                            y: B ? t : v,
                            height: n.width,
                            width: b.chartWidth
                        } : {x: n.y - b.plotLeft - b.spacingBox.x, y: 0, width: n.height, height: b.chartHeight});
                        f[k] ? f[k].animate(n) : f[k] = d.clipRect(n);
                        m && a["zone-graph-" + k].clip(f[k]);
                        u && a["zone-area-" + k].clip(f[k]);
                        y = c.value > G.max;
                        a.resetZones && 0 === g && (g = void 0)
                    });
                    this.clips = f
                } else a.visible && (m && m.show(!0), u && u.show(!0))
            },
            invertGroups: function (a) {
                function b() {
                    ["group", "markerGroup"].forEach(function (b) {
                        d[b] && (c.renderer.isVML && d[b].attr({
                            width: d.yAxis.len,
                            height: d.xAxis.len
                        }), d[b].width = d.yAxis.len, d[b].height = d.xAxis.len, d[b].invert(a))
                    })
                }

                var d = this, c = d.chart;
                if (d.xAxis) {
                    var e = v(c, "resize", b);
                    v(d, "destroy", e);
                    b(a);
                    d.invertGroups = b
                }
            },
            plotGroup: function (a, b, d, c, e) {
                var g = this[a], f = !g;
                f && (this[a] = g = this.chart.renderer.g().attr({zIndex: c || .1}).add(e));
                g.addClass("highcharts-" +
                    b + " highcharts-series-" + this.index + " highcharts-" + this.type + "-series " + (x(this.colorIndex) ? "highcharts-color-" + this.colorIndex + " " : "") + (this.options.className || "") + (g.hasClass("highcharts-tracker") ? " highcharts-tracker" : ""), !0);
                g.attr({visibility: d})[f ? "attr" : "animate"](this.getPlotBox());
                return g
            },
            getPlotBox: function () {
                var a = this.chart, b = this.xAxis, d = this.yAxis;
                a.inverted && (b = d, d = this.xAxis);
                return {translateX: b ? b.left : a.plotLeft, translateY: d ? d.top : a.plotTop, scaleX: 1, scaleY: 1}
            },
            render: function () {
                var a =
                        this, b = a.chart, d = a.options, c = !!a.animate && b.renderer.isSVG && t(d.animation).duration,
                    g = a.visible ? "inherit" : "hidden", f = d.zIndex, m = a.hasRendered, q = b.seriesGroup,
                    u = b.inverted;
                e(this, "render");
                var r = a.plotGroup("group", "series", g, f, q);
                a.markerGroup = a.plotGroup("markerGroup", "markers", g, f, q);
                c && a.animate(!0);
                r.inverted = a.isCartesian || a.invertable ? u : !1;
                a.drawGraph && (a.drawGraph(), a.applyZones());
                a.visible && a.drawPoints();
                a.drawDataLabels && a.drawDataLabels();
                a.redrawPoints && a.redrawPoints();
                a.drawTracker &&
                !1 !== a.options.enableMouseTracking && a.drawTracker();
                a.invertGroups(u);
                !1 === d.clip || a.sharedClipKey || m || r.clip(b.clipRect);
                c && a.animate();
                m || (a.animationTimeout = n(function () {
                    a.afterAnimate()
                }, c));
                a.isDirty = !1;
                a.hasRendered = !0;
                e(a, "afterRender")
            },
            redraw: function () {
                var a = this.chart, b = this.isDirty || this.isDirtyData, d = this.group, c = this.xAxis,
                    e = this.yAxis;
                d && (a.inverted && d.attr({
                    width: a.plotWidth,
                    height: a.plotHeight
                }), d.animate({translateX: q(c && c.left, a.plotLeft), translateY: q(e && e.top, a.plotTop)}));
                this.translate();
                this.render();
                b && delete this.kdTree
            },
            kdAxisArray: ["clientX", "plotY"],
            searchPoint: function (a, b) {
                var d = this.xAxis, c = this.yAxis, e = this.chart.inverted;
                return this.searchKDTree({
                    clientX: e ? d.len - a.chartY + d.pos : a.chartX - d.pos,
                    plotY: e ? c.len - a.chartX + c.pos : a.chartY - c.pos
                }, b, a)
            },
            buildKDTree: function (a) {
                function b(a, c, e) {
                    var g;
                    if (g = a && a.length) {
                        var f = d.kdAxisArray[c % e];
                        a.sort(function (a, b) {
                            return a[f] - b[f]
                        });
                        g = Math.floor(g / 2);
                        return {point: a[g], left: b(a.slice(0, g), c + 1, e), right: b(a.slice(g + 1), c + 1, e)}
                    }
                }

                this.buildingKdTree =
                    !0;
                var d = this, c = -1 < d.options.findNearestPointBy.indexOf("y") ? 2 : 1;
                delete d.kdTree;
                n(function () {
                    d.kdTree = b(d.getValidPoints(null, !d.directTouch), c, c);
                    d.buildingKdTree = !1
                }, d.options.kdNow || a && "touchstart" === a.type ? 0 : 1)
            },
            searchKDTree: function (a, b, d) {
                function c(a, b, d, n) {
                    var p = b.point, m = e.kdAxisArray[d % n], q = p;
                    var u = x(a[g]) && x(p[g]) ? Math.pow(a[g] - p[g], 2) : null;
                    var w = x(a[f]) && x(p[f]) ? Math.pow(a[f] - p[f], 2) : null;
                    w = (u || 0) + (w || 0);
                    p.dist = x(w) ? Math.sqrt(w) : Number.MAX_VALUE;
                    p.distX = x(u) ? Math.sqrt(u) : Number.MAX_VALUE;
                    m = a[m] - p[m];
                    w = 0 > m ? "left" : "right";
                    u = 0 > m ? "right" : "left";
                    b[w] && (w = c(a, b[w], d + 1, n), q = w[k] < q[k] ? w : p);
                    b[u] && Math.sqrt(m * m) < q[k] && (a = c(a, b[u], d + 1, n), q = a[k] < q[k] ? a : q);
                    return q
                }

                var e = this, g = this.kdAxisArray[0], f = this.kdAxisArray[1], k = b ? "distX" : "dist";
                b = -1 < e.options.findNearestPointBy.indexOf("y") ? 2 : 1;
                this.kdTree || this.buildingKdTree || this.buildKDTree(d);
                if (this.kdTree) return c(a, this.kdTree, b, b)
            },
            pointPlacementToXValue: function () {
                var a = this.options.pointPlacement;
                "between" === a && (a = .5);
                B(a) && (a *= q(this.options.pointRange ||
                    this.xAxis.pointRange));
                return a
            }
        });
        ""
    });
    K(D, "parts/Dynamics.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined, E = h.erase, G = h.isArray, B = h.isNumber, F = h.isObject, I = h.isString, y = h.objectEach,
            v = h.splat, t = c.addEvent, r = c.animate, l = c.Axis;
        h = c.Chart;
        var f = c.createElement, b = c.css, a = c.extend, g = c.fireEvent, e = c.merge, d = c.pick, q = c.Point,
            m = c.Series, z = c.seriesTypes, n = c.setAnimation;
        c.cleanRecursively = function (a, b) {
            var d = {};
            y(a, function (e, g) {
                if (F(a[g], !0) && !a.nodeType && b[g]) e = c.cleanRecursively(a[g],
                    b[g]), Object.keys(e).length && (d[g] = e); else if (F(a[g]) || a[g] !== b[g]) d[g] = a[g]
            });
            return d
        };
        a(h.prototype, {
            addSeries: function (a, b, c) {
                var e, f = this;
                a && (b = d(b, !0), g(f, "addSeries", {options: a}, function () {
                    e = f.initSeries(a);
                    f.isDirtyLegend = !0;
                    f.linkSeries();
                    g(f, "afterAddSeries", {series: e});
                    b && f.redraw(c)
                }));
                return e
            },
            addAxis: function (a, b, c, g) {
                var f = b ? "xAxis" : "yAxis", k = this.options;
                a = e(a, {index: this[f].length, isX: b});
                b = new l(this, a);
                k[f] = v(k[f] || {});
                k[f].push(a);
                d(c, !0) && this.redraw(g);
                return b
            },
            showLoading: function (c) {
                var e =
                    this, g = e.options, n = e.loadingDiv, m = g.loading, q = function () {
                    n && b(n, {
                        left: e.plotLeft + "px",
                        top: e.plotTop + "px",
                        width: e.plotWidth + "px",
                        height: e.plotHeight + "px"
                    })
                };
                n || (e.loadingDiv = n = f("div", {className: "highcharts-loading highcharts-loading-hidden"}, null, e.container), e.loadingSpan = f("span", {className: "highcharts-loading-inner"}, null, n), t(e, "redraw", q));
                n.className = "highcharts-loading";
                e.loadingSpan.innerHTML = d(c, g.lang.loading, "");
                e.styledMode || (b(n, a(m.style, {zIndex: 10})), b(e.loadingSpan, m.labelStyle), e.loadingShown ||
                (b(n, {
                    opacity: 0,
                    display: ""
                }), r(n, {opacity: m.style.opacity || .5}, {duration: m.showDuration || 0})));
                e.loadingShown = !0;
                q()
            },
            hideLoading: function () {
                var a = this.options, d = this.loadingDiv;
                d && (d.className = "highcharts-loading highcharts-loading-hidden", this.styledMode || r(d, {opacity: 0}, {
                    duration: a.loading.hideDuration || 100,
                    complete: function () {
                        b(d, {display: "none"})
                    }
                }));
                this.loadingShown = !1
            },
            propsRequireDirtyBox: "backgroundColor borderColor borderWidth borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
            propsRequireReflow: "margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft".split(" "),
            propsRequireUpdateSeries: "chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip".split(" "),
            collectionsWithUpdate: "xAxis yAxis zAxis series colorAxis pane".split(" "),
            update: function (a, b, f, n) {
                var k = this, m = {credits: "addCredits", title: "setTitle", subtitle: "setSubtitle"}, p, q, u,
                    r = a.isResponsiveOptions, w = [];
                g(k, "update", {options: a});
                r || k.setResponsive(!1, !0);
                a = c.cleanRecursively(a, k.options);
                e(!0, k.userOptions, a);
                if (p = a.chart) {
                    e(!0, k.options.chart, p);
                    "className" in p && k.setClassName(p.className);
                    "reflow" in p && k.setReflow(p.reflow);
                    if ("inverted" in p || "polar" in p || "type" in p) {
                        k.propFromSeries();
                        var l = !0
                    }
                    "alignTicks" in p && (l = !0);
                    y(p, function (a, b) {
                        -1 !== k.propsRequireUpdateSeries.indexOf("chart." + b) && (q = !0);
                        -1 !== k.propsRequireDirtyBox.indexOf(b) && (k.isDirtyBox = !0);
                        r || -1 === k.propsRequireReflow.indexOf(b) || (u = !0)
                    });
                    !k.styledMode && "style" in
                    p && k.renderer.setStyle(p.style)
                }
                !k.styledMode && a.colors && (this.options.colors = a.colors);
                a.plotOptions && e(!0, this.options.plotOptions, a.plotOptions);
                a.time && this.time === c.time && (this.time = new c.Time(a.time));
                y(a, function (a, b) {
                    if (k[b] && "function" === typeof k[b].update) k[b].update(a, !1); else if ("function" === typeof k[m[b]]) k[m[b]](a);
                    "chart" !== b && -1 !== k.propsRequireUpdateSeries.indexOf(b) && (q = !0)
                });
                this.collectionsWithUpdate.forEach(function (b) {
                    if (a[b]) {
                        if ("series" === b) {
                            var c = [];
                            k[b].forEach(function (a,
                                                   b) {
                                a.options.isInternal || c.push(d(a.options.index, b))
                            })
                        }
                        v(a[b]).forEach(function (a, d) {
                            (d = x(a.id) && k.get(a.id) || k[b][c ? c[d] : d]) && d.coll === b && (d.update(a, !1), f && (d.touched = !0));
                            !d && f && k.collectionsWithInit[b] && (k.collectionsWithInit[b][0].apply(k, [a].concat(k.collectionsWithInit[b][1] || []).concat([!1])).touched = !0)
                        });
                        f && k[b].forEach(function (a) {
                            a.touched || a.options.isInternal ? delete a.touched : w.push(a)
                        })
                    }
                });
                w.forEach(function (a) {
                    a.remove && a.remove(!1)
                });
                l && k.axes.forEach(function (a) {
                    a.update({}, !1)
                });
                q && k.series.forEach(function (a) {
                    a.update({}, !1)
                });
                a.loading && e(!0, k.options.loading, a.loading);
                l = p && p.width;
                p = p && p.height;
                I(p) && (p = c.relativeLength(p, l || k.chartWidth));
                u || B(l) && l !== k.chartWidth || B(p) && p !== k.chartHeight ? k.setSize(l, p, n) : d(b, !0) && k.redraw(n);
                g(k, "afterUpdate", {options: a, redraw: b, animation: n})
            },
            setSubtitle: function (a) {
                this.setTitle(void 0, a)
            }
        });
        h.prototype.collectionsWithInit = {
            xAxis: [h.prototype.addAxis, [!0]],
            yAxis: [h.prototype.addAxis, [!1]],
            series: [h.prototype.addSeries]
        };
        a(q.prototype,
            {
                update: function (a, b, c, e) {
                    function g() {
                        f.applyOptions(a);
                        null === f.y && n && (f.graphic = n.destroy());
                        F(a, !0) && (n && n.element && a && a.marker && void 0 !== a.marker.symbol && (f.graphic = n.destroy()), a && a.dataLabels && f.dataLabel && (f.dataLabel = f.dataLabel.destroy()), f.connector && (f.connector = f.connector.destroy()));
                        m = f.index;
                        k.updateParallelArrays(f, m);
                        u.data[m] = F(u.data[m], !0) || F(a, !0) ? f.options : d(a, u.data[m]);
                        k.isDirty = k.isDirtyData = !0;
                        !k.fixedBox && k.hasCartesianSeries && (q.isDirtyBox = !0);
                        "point" === u.legendType &&
                        (q.isDirtyLegend = !0);
                        b && q.redraw(c)
                    }

                    var f = this, k = f.series, n = f.graphic, m, q = k.chart, u = k.options;
                    b = d(b, !0);
                    !1 === e ? g() : f.firePointEvent("update", {options: a}, g)
                }, remove: function (a, b) {
                    this.series.removePoint(this.series.data.indexOf(this), a, b)
                }
            });
        a(m.prototype, {
            addPoint: function (a, b, c, e, f) {
                var k = this.options, n = this.data, m = this.chart, q = this.xAxis;
                q = q && q.hasNames && q.names;
                var u = k.data, r = this.xData, w;
                b = d(b, !0);
                var l = {series: this};
                this.pointClass.prototype.applyOptions.apply(l, [a]);
                var z = l.x;
                var h = r.length;
                if (this.requireSorting && z < r[h - 1]) for (w = !0; h && r[h - 1] > z;) h--;
                this.updateParallelArrays(l, "splice", h, 0, 0);
                this.updateParallelArrays(l, h);
                q && l.name && (q[z] = l.name);
                u.splice(h, 0, a);
                w && (this.data.splice(h, 0, null), this.processData());
                "point" === k.legendType && this.generatePoints();
                c && (n[0] && n[0].remove ? n[0].remove(!1) : (n.shift(), this.updateParallelArrays(l, "shift"), u.shift()));
                !1 !== f && g(this, "addPoint", {point: l});
                this.isDirtyData = this.isDirty = !0;
                b && m.redraw(e)
            }, removePoint: function (a, b, c) {
                var e = this, g = e.data,
                    f = g[a], k = e.points, m = e.chart, q = function () {
                        k && k.length === g.length && k.splice(a, 1);
                        g.splice(a, 1);
                        e.options.data.splice(a, 1);
                        e.updateParallelArrays(f || {series: e}, "splice", a, 1);
                        f && f.destroy();
                        e.isDirty = !0;
                        e.isDirtyData = !0;
                        b && m.redraw()
                    };
                n(c, m);
                b = d(b, !0);
                f ? f.firePointEvent("remove", null, q) : q()
            }, remove: function (a, b, c, e) {
                function f() {
                    k.destroy(e);
                    k.remove = null;
                    n.isDirtyLegend = n.isDirtyBox = !0;
                    n.linkSeries();
                    d(a, !0) && n.redraw(b)
                }

                var k = this, n = k.chart;
                !1 !== c ? g(k, "remove", null, f) : f()
            }, update: function (b, f) {
                b = c.cleanRecursively(b,
                    this.userOptions);
                g(this, "update", {options: b});
                var k = this, n = k.chart, m = k.userOptions, q = k.initialType || k.type,
                    p = b.type || m.type || n.options.chart.type,
                    r = !(this.hasDerivedData || b.dataGrouping || p && p !== this.type || void 0 !== b.pointStart || b.pointInterval || b.pointIntervalUnit || b.keys),
                    u = z[q].prototype, l, h = ["group", "markerGroup", "dataLabelsGroup", "transformGroup"],
                    t = ["eventOptions", "navigatorSeries", "baseSeries"], v = k.finishedAnimating && {animation: !1},
                    y = {};
                r && (t.push("data", "isDirtyData", "points", "processedXData",
                    "processedYData", "xIncrement", "_hasPointMarkers", "_hasPointLabels", "mapMap", "mapData", "minY", "maxY", "minX", "maxX"), !1 !== b.visible && t.push("area", "graph"), k.parallelArrays.forEach(function (a) {
                    t.push(a + "Data")
                }), b.data && this.setData(b.data, !1));
                b = e(m, v, {
                    index: void 0 === m.index ? k.index : m.index,
                    pointStart: d(m.pointStart, k.xData[0])
                }, !r && {data: k.options.data}, b);
                r && b.data && (b.data = k.options.data);
                t = h.concat(t);
                t.forEach(function (a) {
                    t[a] = k[a];
                    delete k[a]
                });
                k.remove(!1, null, !1, !0);
                for (l in u) k[l] = void 0;
                z[p || q] ? a(k, z[p || q].prototype) : c.error(17, !0, n);
                t.forEach(function (a) {
                    k[a] = t[a]
                });
                k.init(n, b);
                if (r && this.points) {
                    var B = k.options;
                    !1 === B.visible ? (y.graphic = 1, y.dataLabel = 1) : k._hasPointLabels || (p = B.marker, u = B.dataLabels, p && (!1 === p.enabled || "symbol" in p) && (y.graphic = 1), u && !1 === u.enabled && (y.dataLabel = 1));
                    this.points.forEach(function (a) {
                        a && a.series && (a.resolveColor(), Object.keys(y).length && a.destroyElements(y), !1 === B.showInLegend && a.legendItem && n.legend.destroyItem(a))
                    }, this)
                }
                b.zIndex !== m.zIndex && h.forEach(function (a) {
                    k[a] &&
                    k[a].attr({zIndex: b.zIndex})
                });
                k.initialType = q;
                n.linkSeries();
                g(this, "afterUpdate");
                d(f, !0) && n.redraw(r ? void 0 : !1)
            }, setName: function (a) {
                this.name = this.options.name = this.userOptions.name = a;
                this.chart.isDirtyLegend = !0
            }
        });
        a(l.prototype, {
            update: function (b, c) {
                var g = this.chart, f = b && b.events || {};
                b = e(this.userOptions, b);
                g.options[this.coll].indexOf && (g.options[this.coll][g.options[this.coll].indexOf(this.userOptions)] = b);
                y(g.options[this.coll].events, function (a, b) {
                    "undefined" === typeof f[b] && (f[b] = void 0)
                });
                this.destroy(!0);
                this.init(g, a(b, {events: f}));
                g.isDirtyBox = !0;
                d(c, !0) && g.redraw()
            }, remove: function (a) {
                for (var b = this.chart, c = this.coll, e = this.series, g = e.length; g--;) e[g] && e[g].remove(!1);
                E(b.axes, this);
                E(b[c], this);
                G(b.options[c]) ? b.options[c].splice(this.options.index, 1) : delete b.options[c];
                b[c].forEach(function (a, b) {
                    a.options.index = a.userOptions.index = b
                });
                this.destroy();
                b.isDirtyBox = !0;
                d(a, !0) && b.redraw()
            }, setTitle: function (a, b) {
                this.update({title: a}, b)
            }, setCategories: function (a, b) {
                this.update({categories: a},
                    b)
            }
        })
    });
    K(D, "parts/ColumnSeries.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined, E = h.isNumber, G = c.animObject, B = c.color, F = c.extend, I = c.merge, y = c.pick,
            v = c.Series;
        h = c.seriesType;
        var t = c.svg;
        h("column", "line", {
            borderRadius: 0,
            crisp: !0,
            groupPadding: .2,
            marker: null,
            pointPadding: .1,
            minPointLength: 0,
            cropThreshold: 50,
            pointRange: null,
            states: {hover: {halo: !1, brightness: .1}, select: {color: "#cccccc", borderColor: "#000000"}},
            dataLabels: {align: null, verticalAlign: null, y: null},
            softThreshold: !1,
            startFromThreshold: !0,
            stickyTracking: !1,
            tooltip: {distance: 6},
            threshold: 0,
            borderColor: "#ffffff"
        }, {
            cropShoulder: 0,
            directTouch: !0,
            trackerGroups: ["group", "dataLabelsGroup"],
            negStacks: !0,
            init: function () {
                v.prototype.init.apply(this, arguments);
                var c = this, l = c.chart;
                l.hasRendered && l.series.forEach(function (f) {
                    f.type === c.type && (f.isDirty = !0)
                })
            },
            getColumnMetrics: function () {
                var c = this, l = c.options, f = c.xAxis, b = c.yAxis, a = f.options.reversedStacks;
                a = f.reversed && !a || !f.reversed && a;
                var g, e = {}, d = 0;
                !1 === l.grouping ? d =
                    1 : c.chart.series.forEach(function (a) {
                    var f = a.yAxis, k = a.options;
                    if (a.type === c.type && (a.visible || !c.chart.options.chart.ignoreHiddenSeries) && b.len === f.len && b.pos === f.pos) {
                        if (k.stacking) {
                            g = a.stackKey;
                            void 0 === e[g] && (e[g] = d++);
                            var n = e[g]
                        } else !1 !== k.grouping && (n = d++);
                        a.columnIndex = n
                    }
                });
                var q = Math.min(Math.abs(f.transA) * (f.ordinalSlope || l.pointRange || f.closestPointRange || f.tickInterval || 1), f.len),
                    m = q * l.groupPadding, z = (q - 2 * m) / (d || 1);
                l = Math.min(l.maxPointWidth || f.len, y(l.pointWidth, z * (1 - 2 * l.pointPadding)));
                c.columnMetrics = {
                    width: l,
                    offset: (z - l) / 2 + (m + ((c.columnIndex || 0) + (a ? 1 : 0)) * z - q / 2) * (a ? -1 : 1)
                };
                return c.columnMetrics
            },
            crispCol: function (c, l, f, b) {
                var a = this.chart, g = this.borderWidth, e = -(g % 2 ? .5 : 0);
                g = g % 2 ? .5 : 1;
                a.inverted && a.renderer.isVML && (g += 1);
                this.options.crisp && (f = Math.round(c + f) + e, c = Math.round(c) + e, f -= c);
                b = Math.round(l + b) + g;
                e = .5 >= Math.abs(l) && .5 < b;
                l = Math.round(l) + g;
                b -= l;
                e && b && (--l, b += 1);
                return {x: c, y: l, width: f, height: b}
            },
            translate: function () {
                var c = this, l = c.chart, f = c.options, b = c.dense = 2 > c.closestPointRange *
                    c.xAxis.transA;
                b = c.borderWidth = y(f.borderWidth, b ? 0 : 1);
                var a = c.yAxis, g = f.threshold, e = c.translatedThreshold = a.getThreshold(g),
                    d = y(f.minPointLength, 5), q = c.getColumnMetrics(), m = q.width,
                    z = c.barW = Math.max(m, 1 + 2 * b), n = c.pointXOffset = q.offset, u = c.dataMin, k = c.dataMax;
                l.inverted && (e -= .5);
                f.pointPadding && (z = Math.ceil(z));
                v.prototype.translate.apply(c);
                c.points.forEach(function (b) {
                    var f = y(b.yBottom, e), q = 999 + Math.abs(f), r = m;
                    q = Math.min(Math.max(-q, b.plotY), a.len + q);
                    var p = b.plotX + n, w = z, h = Math.min(q, f), t = Math.max(q,
                        f) - h;
                    if (d && Math.abs(t) < d) {
                        t = d;
                        var v = !a.reversed && !b.negative || a.reversed && b.negative;
                        b.y === g && c.dataMax <= g && a.min < g && u !== k && (v = !v);
                        h = Math.abs(h - e) > d ? f - d : e - (v ? d : 0)
                    }
                    x(b.options.pointWidth) && (r = w = Math.ceil(b.options.pointWidth), p -= Math.round((r - m) / 2));
                    b.barX = p;
                    b.pointWidth = r;
                    b.tooltipPos = l.inverted ? [a.len + a.pos - l.plotLeft - q, c.xAxis.len - p - w / 2, t] : [p + w / 2, q + a.pos - l.plotTop, t];
                    b.shapeType = c.pointClass.prototype.shapeType || "rect";
                    b.shapeArgs = c.crispCol.apply(c, b.isNull ? [p, e, w, 0] : [p, h, w, t])
                })
            },
            getSymbol: c.noop,
            drawLegendSymbol: c.LegendSymbolMixin.drawRectangle,
            drawGraph: function () {
                this.group[this.dense ? "addClass" : "removeClass"]("highcharts-dense-data")
            },
            pointAttribs: function (c, l) {
                var f = this.options, b = this.pointAttrToOptions || {};
                var a = b.stroke || "borderColor";
                var g = b["stroke-width"] || "borderWidth", e = c && c.color || this.color,
                    d = c && c[a] || f[a] || this.color || e, q = c && c[g] || f[g] || this[g] || 0;
                b = c && c.options.dashStyle || f.dashStyle;
                var m = y(f.opacity, 1);
                if (c && this.zones.length) {
                    var r = c.getZone();
                    e = c.options.color || r && (r.color ||
                        c.nonZonedColor) || this.color;
                    r && (d = r.borderColor || d, b = r.dashStyle || b, q = r.borderWidth || q)
                }
                l && (c = I(f.states[l], c.options.states && c.options.states[l] || {}), l = c.brightness, e = c.color || void 0 !== l && B(e).brighten(c.brightness).get() || e, d = c[a] || d, q = c[g] || q, b = c.dashStyle || b, m = y(c.opacity, m));
                a = {fill: e, stroke: d, "stroke-width": q, opacity: m};
                b && (a.dashstyle = b);
                return a
            },
            drawPoints: function () {
                var c = this, l = this.chart, f = c.options, b = l.renderer, a = f.animationLimit || 250, g;
                c.points.forEach(function (e) {
                    var d = e.graphic, q =
                        d && l.pointCount < a ? "animate" : "attr";
                    if (E(e.plotY) && null !== e.y) {
                        g = e.shapeArgs;
                        d && d.element.nodeName !== e.shapeType && (d = d.destroy());
                        if (d) d[q](I(g)); else e.graphic = d = b[e.shapeType](g).add(e.group || c.group);
                        if (f.borderRadius) d[q]({r: f.borderRadius});
                        l.styledMode || d[q](c.pointAttribs(e, e.selected && "select")).shadow(!1 !== e.allowShadow && f.shadow, null, f.stacking && !f.borderRadius);
                        d.addClass(e.getClassName(), !0)
                    } else d && (e.graphic = d.destroy())
                })
            },
            animate: function (c) {
                var l = this, f = this.yAxis, b = l.options, a = this.chart.inverted,
                    g = {}, e = a ? "translateX" : "translateY";
                if (t) if (c) g.scaleY = .001, c = Math.min(f.pos + f.len, Math.max(f.pos, f.toPixels(b.threshold))), a ? g.translateX = c - f.len : g.translateY = c, l.clipBox && l.setClip(), l.group.attr(g); else {
                    var d = l.group.attr(e);
                    l.group.animate({scaleY: 1}, F(G(l.options.animation), {
                        step: function (a, b) {
                            g[e] = d + b.pos * (f.pos - d);
                            l.group.attr(g)
                        }
                    }));
                    l.animate = null
                }
            },
            remove: function () {
                var c = this, l = c.chart;
                l.hasRendered && l.series.forEach(function (f) {
                    f.type === c.type && (f.isDirty = !0)
                });
                v.prototype.remove.apply(c,
                    arguments)
            }
        });
        ""
    });
    K(D, "parts/ScatterSeries.js", [D["parts/Globals.js"]], function (c) {
        var h = c.Series, x = c.seriesType;
        x("scatter", "line", {
            lineWidth: 0,
            findNearestPointBy: "xy",
            jitter: {x: 0, y: 0},
            marker: {enabled: !0},
            tooltip: {
                headerFormat: '<span style="color:{point.color}">\u25cf</span> <span style="font-size: 10px"> {series.name}</span><br/>',
                pointFormat: "x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>"
            }
        }, {
            sorted: !1,
            requireSorting: !1,
            noSharedTooltip: !0,
            trackerGroups: ["group", "markerGroup", "dataLabelsGroup"],
            takeOrdinalPosition: !1,
            drawGraph: function () {
                this.options.lineWidth && h.prototype.drawGraph.call(this)
            },
            applyJitter: function () {
                var c = this, h = this.options.jitter, B = this.points.length;
                h && this.points.forEach(function (x, G) {
                    ["x", "y"].forEach(function (y, v) {
                        var t = "plot" + y.toUpperCase();
                        if (h[y] && !x.isNull) {
                            var r = c[y + "Axis"];
                            var l = h[y] * r.transA;
                            if (r && !r.isLog) {
                                var f = Math.max(0, x[t] - l);
                                r = Math.min(r.len, x[t] + l);
                                v = 1E4 * Math.sin(G + v * B);
                                x[t] = f + (r - f) * (v - Math.floor(v));
                                "x" === y && (x.clientX = x.plotX)
                            }
                        }
                    })
                })
            }
        });
        c.addEvent(h,
            "afterTranslate", function () {
                this.applyJitter && this.applyJitter()
            });
        ""
    });
    K(D, "parts/DataLabels.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined, E = h.isArray, G = h.objectEach, B = h.splat, F = c.arrayMax, I = c.extend, y = c.format,
            v = c.merge;
        h = c.noop;
        var t = c.pick, r = c.relativeLength, l = c.Series, f = c.seriesTypes, b = c.stableSort;
        c.distribute = function (a, g, e) {
            function d(a, b) {
                return a.target - b.target
            }

            var f, m = !0, l = a, n = [];
            var u = 0;
            var k = l.reducedLen || g;
            for (f = a.length; f--;) u += a[f].size;
            if (u > k) {
                b(a,
                    function (a, b) {
                        return (b.rank || 0) - (a.rank || 0)
                    });
                for (u = f = 0; u <= k;) u += a[f].size, f++;
                n = a.splice(f - 1, a.length)
            }
            b(a, d);
            for (a = a.map(function (a) {
                return {size: a.size, targets: [a.target], align: t(a.align, .5)}
            }); m;) {
                for (f = a.length; f--;) m = a[f], u = (Math.min.apply(0, m.targets) + Math.max.apply(0, m.targets)) / 2, m.pos = Math.min(Math.max(0, u - m.size * m.align), g - m.size);
                f = a.length;
                for (m = !1; f--;) 0 < f && a[f - 1].pos + a[f - 1].size > a[f].pos && (a[f - 1].size += a[f].size, a[f - 1].targets = a[f - 1].targets.concat(a[f].targets), a[f - 1].align = .5, a[f -
                1].pos + a[f - 1].size > g && (a[f - 1].pos = g - a[f - 1].size), a.splice(f, 1), m = !0)
            }
            l.push.apply(l, n);
            f = 0;
            a.some(function (a) {
                var b = 0;
                if (a.targets.some(function () {
                    l[f].pos = a.pos + b;
                    if (Math.abs(l[f].pos - l[f].target) > e) return l.slice(0, f + 1).forEach(function (a) {
                        delete a.pos
                    }), l.reducedLen = (l.reducedLen || g) - .1 * g, l.reducedLen > .1 * g && c.distribute(l, g, e), !0;
                    b += l[f].size;
                    f++
                })) return !0
            });
            b(l, d)
        };
        l.prototype.drawDataLabels = function () {
            function a(a, b) {
                var d = b.filter;
                return d ? (b = d.operator, a = a[d.property], d = d.value, ">" === b && a >
                d || "<" === b && a < d || ">=" === b && a >= d || "<=" === b && a <= d || "==" === b && a == d || "===" === b && a === d ? !0 : !1) : !0
            }

            function b(a, b) {
                var d = [], c;
                if (E(a) && !E(b)) d = a.map(function (a) {
                    return v(a, b)
                }); else if (E(b) && !E(a)) d = b.map(function (b) {
                    return v(a, b)
                }); else if (E(a) || E(b)) for (c = Math.max(a.length, b.length); c--;) d[c] = v(a[c], b[c]); else d = v(a, b);
                return d
            }

            var e = this, d = e.chart, f = e.options, m = f.dataLabels, l = e.points, n, u = e.hasRendered || 0,
                k = c.animObject(f.animation).duration, r = Math.min(k, 200),
                h = !d.renderer.forExport && t(m.defer, 0 < r), H =
                    d.renderer;
            m = b(b(d.options.plotOptions && d.options.plotOptions.series && d.options.plotOptions.series.dataLabels, d.options.plotOptions && d.options.plotOptions[e.type] && d.options.plotOptions[e.type].dataLabels), m);
            c.fireEvent(this, "drawDataLabels");
            if (E(m) || m.enabled || e._hasPointLabels) {
                var A = e.plotGroup("dataLabelsGroup", "data-labels", h && !u ? "hidden" : "inherit", m.zIndex || 6);
                h && (A.attr({opacity: +u}), u || setTimeout(function () {
                    var a = e.dataLabelsGroup;
                    a && (e.visible && A.show(!0), a[f.animation ? "animate" : "attr"]({opacity: 1},
                        {duration: r}))
                }, k - r));
                l.forEach(function (c) {
                    n = B(b(m, c.dlOptions || c.options && c.options.dataLabels));
                    n.forEach(function (b, g) {
                        var k = b.enabled && (!c.isNull || c.dataLabelOnNull) && a(c, b),
                            n = c.dataLabels ? c.dataLabels[g] : c.dataLabel,
                            m = c.connectors ? c.connectors[g] : c.connector, q = t(b.distance, c.labelDistance),
                            p = !n;
                        if (k) {
                            var l = c.getLabelConfig();
                            var u = t(b[c.formatPrefix + "Format"], b.format);
                            l = x(u) ? y(u, l, d.time) : (b[c.formatPrefix + "Formatter"] || b.formatter).call(l, b);
                            u = b.style;
                            var r = b.rotation;
                            d.styledMode || (u.color =
                                t(b.color, u.color, e.color, "#000000"), "contrast" === u.color && (c.contrastColor = H.getContrast(c.color || e.color), u.color = !x(q) && b.inside || 0 > q || f.stacking ? c.contrastColor : "#000000"), f.cursor && (u.cursor = f.cursor));
                            var w = {r: b.borderRadius || 0, rotation: r, padding: b.padding, zIndex: 1};
                            d.styledMode || (w.fill = b.backgroundColor, w.stroke = b.borderColor, w["stroke-width"] = b.borderWidth);
                            G(w, function (a, b) {
                                void 0 === a && delete w[b]
                            })
                        }
                        !n || k && x(l) ? k && x(l) && (n ? w.text = l : (c.dataLabels = c.dataLabels || [], n = c.dataLabels[g] = r ? H.text(l,
                            0, -9999).addClass("highcharts-data-label") : H.label(l, 0, -9999, b.shape, null, null, b.useHTML, null, "data-label"), g || (c.dataLabel = n), n.addClass(" highcharts-data-label-color-" + c.colorIndex + " " + (b.className || "") + (b.useHTML ? " highcharts-tracker" : ""))), n.options = b, n.attr(w), d.styledMode || n.css(u).shadow(b.shadow), n.added || n.add(A), b.textPath && !b.useHTML && n.setTextPath(c.getDataLabelPath && c.getDataLabelPath(n) || c.graphic, b.textPath), e.alignDataLabel(c, n, b, null, p)) : (c.dataLabel = c.dataLabel && c.dataLabel.destroy(),
                        c.dataLabels && (1 === c.dataLabels.length ? delete c.dataLabels : delete c.dataLabels[g]), g || delete c.dataLabel, m && (c.connector = c.connector.destroy(), c.connectors && (1 === c.connectors.length ? delete c.connectors : delete c.connectors[g])))
                    })
                })
            }
            c.fireEvent(this, "afterDrawDataLabels")
        };
        l.prototype.alignDataLabel = function (a, b, c, d, f) {
            var e = this.chart, g = this.isCartesian && e.inverted, n = t(a.dlBox && a.dlBox.centerX, a.plotX, -9999),
                q = t(a.plotY, -9999), k = b.getBBox(), l = c.rotation, r = c.align,
                h = this.visible && (a.series.forceDL ||
                    e.isInsidePlot(n, Math.round(q), g) || d && e.isInsidePlot(n, g ? d.x + 1 : d.y + d.height - 1, g)),
                v = "justify" === t(c.overflow, "justify");
            if (h) {
                var p = e.renderer.fontMetrics(e.styledMode ? void 0 : c.style.fontSize, b).b;
                d = I({
                    x: g ? this.yAxis.len - q : n,
                    y: Math.round(g ? this.xAxis.len - n : q),
                    width: 0,
                    height: 0
                }, d);
                I(c, {width: k.width, height: k.height});
                l ? (v = !1, n = e.renderer.rotCorr(p, l), n = {
                    x: d.x + c.x + d.width / 2 + n.x,
                    y: d.y + c.y + {top: 0, middle: .5, bottom: 1}[c.verticalAlign] * d.height
                }, b[f ? "attr" : "animate"](n).attr({align: r}), q = (l + 720) % 360, q = 180 <
                    q && 360 > q, "left" === r ? n.y -= q ? k.height : 0 : "center" === r ? (n.x -= k.width / 2, n.y -= k.height / 2) : "right" === r && (n.x -= k.width, n.y -= q ? 0 : k.height), b.placed = !0, b.alignAttr = n) : (b.align(c, null, d), n = b.alignAttr);
                v && 0 <= d.height ? this.justifyDataLabel(b, c, n, k, d, f) : t(c.crop, !0) && (h = e.isInsidePlot(n.x, n.y) && e.isInsidePlot(n.x + k.width, n.y + k.height));
                if (c.shape && !l) b[f ? "attr" : "animate"]({
                    anchorX: g ? e.plotWidth - a.plotY : a.plotX,
                    anchorY: g ? e.plotHeight - a.plotX : a.plotY
                })
            }
            h || (b.hide(!0), b.placed = !1)
        };
        l.prototype.justifyDataLabel = function (a,
                                                 b, c, d, f, m) {
            var e = this.chart, g = b.align, q = b.verticalAlign, k = a.box ? 0 : a.padding || 0;
            var l = c.x + k;
            if (0 > l) {
                "right" === g ? (b.align = "left", b.inside = !0) : b.x = -l;
                var r = !0
            }
            l = c.x + d.width - k;
            l > e.plotWidth && ("left" === g ? (b.align = "right", b.inside = !0) : b.x = e.plotWidth - l, r = !0);
            l = c.y + k;
            0 > l && ("bottom" === q ? (b.verticalAlign = "top", b.inside = !0) : b.y = -l, r = !0);
            l = c.y + d.height - k;
            l > e.plotHeight && ("top" === q ? (b.verticalAlign = "bottom", b.inside = !0) : b.y = e.plotHeight - l, r = !0);
            r && (a.placed = !m, a.align(b, null, f));
            return r
        };
        f.pie && (f.pie.prototype.dataLabelPositioners =
            {
                radialDistributionY: function (a) {
                    return a.top + a.distributeBox.pos
                }, radialDistributionX: function (a, b, c, d) {
                    return a.getX(c < b.top + 2 || c > b.bottom - 2 ? d : c, b.half, b)
                }, justify: function (a, b, c) {
                    return c[0] + (a.half ? -1 : 1) * (b + a.labelDistance)
                }, alignToPlotEdges: function (a, b, c, d) {
                    a = a.getBBox().width;
                    return b ? a + d : c - a - d
                }, alignToConnectors: function (a, b, c, d) {
                    var e = 0, f;
                    a.forEach(function (a) {
                        f = a.dataLabel.getBBox().width;
                        f > e && (e = f)
                    });
                    return b ? e + d : c - e - d
                }
            }, f.pie.prototype.drawDataLabels = function () {
            var a = this, b = a.data, e, d =
                    a.chart, f = a.options.dataLabels, m = f.connectorPadding, r, n = d.plotWidth, u = d.plotHeight,
                k = d.plotLeft, h = Math.round(d.chartWidth / 3), y, H = a.center, A = H[2] / 2, p = H[1], B, G, E, I,
                D = [[], []], M, L, K, S, O = [0, 0, 0, 0], U = a.dataLabelPositioners, W;
            a.visible && (f.enabled || a._hasPointLabels) && (b.forEach(function (a) {
                a.dataLabel && a.visible && a.dataLabel.shortened && (a.dataLabel.attr({width: "auto"}).css({
                    width: "auto",
                    textOverflow: "clip"
                }), a.dataLabel.shortened = !1)
            }), l.prototype.drawDataLabels.apply(a), b.forEach(function (a) {
                a.dataLabel &&
                (a.visible ? (D[a.half].push(a), a.dataLabel._pos = null, !x(f.style.width) && !x(a.options.dataLabels && a.options.dataLabels.style && a.options.dataLabels.style.width) && a.dataLabel.getBBox().width > h && (a.dataLabel.css({width: .7 * h}), a.dataLabel.shortened = !0)) : (a.dataLabel = a.dataLabel.destroy(), a.dataLabels && 1 === a.dataLabels.length && delete a.dataLabels))
            }), D.forEach(function (b, g) {
                var q = b.length, l = [], r;
                if (q) {
                    a.sortByAngle(b, g - .5);
                    if (0 < a.maxLabelDistance) {
                        var h = Math.max(0, p - A - a.maxLabelDistance);
                        var w = Math.min(p +
                            A + a.maxLabelDistance, d.plotHeight);
                        b.forEach(function (a) {
                            0 < a.labelDistance && a.dataLabel && (a.top = Math.max(0, p - A - a.labelDistance), a.bottom = Math.min(p + A + a.labelDistance, d.plotHeight), r = a.dataLabel.getBBox().height || 21, a.distributeBox = {
                                target: a.labelPosition.natural.y - a.top + r / 2,
                                size: r,
                                rank: a.y
                            }, l.push(a.distributeBox))
                        });
                        h = w + r - h;
                        c.distribute(l, h, h / 5)
                    }
                    for (S = 0; S < q; S++) {
                        e = b[S];
                        E = e.labelPosition;
                        B = e.dataLabel;
                        K = !1 === e.visible ? "hidden" : "inherit";
                        L = h = E.natural.y;
                        l && x(e.distributeBox) && (void 0 === e.distributeBox.pos ?
                            K = "hidden" : (I = e.distributeBox.size, L = U.radialDistributionY(e)));
                        delete e.positionIndex;
                        if (f.justify) M = U.justify(e, A, H); else switch (f.alignTo) {
                            case "connectors":
                                M = U.alignToConnectors(b, g, n, k);
                                break;
                            case "plotEdges":
                                M = U.alignToPlotEdges(B, g, n, k);
                                break;
                            default:
                                M = U.radialDistributionX(a, e, L, h)
                        }
                        B._attr = {visibility: K, align: E.alignment};
                        B._pos = {x: M + f.x + ({left: m, right: -m}[E.alignment] || 0), y: L + f.y - 10};
                        E.final.x = M;
                        E.final.y = L;
                        t(f.crop, !0) && (G = B.getBBox().width, h = null, M - G < m && 1 === g ? (h = Math.round(G - M + m), O[3] =
                            Math.max(h, O[3])) : M + G > n - m && 0 === g && (h = Math.round(M + G - n + m), O[1] = Math.max(h, O[1])), 0 > L - I / 2 ? O[0] = Math.max(Math.round(-L + I / 2), O[0]) : L + I / 2 > u && (O[2] = Math.max(Math.round(L + I / 2 - u), O[2])), B.sideOverflow = h)
                    }
                }
            }), 0 === F(O) || this.verifyDataLabelOverflow(O)) && (this.placeDataLabels(), this.points.forEach(function (b) {
                W = v(f, b.options.dataLabels);
                if (r = t(W.connectorWidth, 1)) {
                    var c;
                    y = b.connector;
                    if ((B = b.dataLabel) && B._pos && b.visible && 0 < b.labelDistance) {
                        K = B._attr.visibility;
                        if (c = !y) b.connector = y = d.renderer.path().addClass("highcharts-data-label-connector  highcharts-color-" +
                            b.colorIndex + (b.className ? " " + b.className : "")).add(a.dataLabelsGroup), d.styledMode || y.attr({
                            "stroke-width": r,
                            stroke: W.connectorColor || b.color || "#666666"
                        });
                        y[c ? "attr" : "animate"]({d: b.getConnectorPath()});
                        y.attr("visibility", K)
                    } else y && (b.connector = y.destroy())
                }
            }))
        }, f.pie.prototype.placeDataLabels = function () {
            this.points.forEach(function (a) {
                var b = a.dataLabel, c;
                b && a.visible && ((c = b._pos) ? (b.sideOverflow && (b._attr.width = Math.max(b.getBBox().width - b.sideOverflow, 0), b.css({
                    width: b._attr.width + "px", textOverflow: (this.options.dataLabels.style ||
                        {}).textOverflow || "ellipsis"
                }), b.shortened = !0), b.attr(b._attr), b[b.moved ? "animate" : "attr"](c), b.moved = !0) : b && b.attr({y: -9999}));
                delete a.distributeBox
            }, this)
        }, f.pie.prototype.alignDataLabel = h, f.pie.prototype.verifyDataLabelOverflow = function (a) {
            var b = this.center, c = this.options, d = c.center, f = c.minSize || 80, m = null !== c.size;
            if (!m) {
                if (null !== d[0]) var l = Math.max(b[2] - Math.max(a[1], a[3]), f); else l = Math.max(b[2] - a[1] - a[3], f), b[0] += (a[3] - a[1]) / 2;
                null !== d[1] ? l = Math.max(Math.min(l, b[2] - Math.max(a[0], a[2])), f) :
                    (l = Math.max(Math.min(l, b[2] - a[0] - a[2]), f), b[1] += (a[0] - a[2]) / 2);
                l < b[2] ? (b[2] = l, b[3] = Math.min(r(c.innerSize || 0, l), l), this.translate(b), this.drawDataLabels && this.drawDataLabels()) : m = !0
            }
            return m
        });
        f.column && (f.column.prototype.alignDataLabel = function (a, b, c, d, f) {
            var e = this.chart.inverted, g = a.series, n = a.dlBox || a.shapeArgs,
                q = t(a.below, a.plotY > t(this.translatedThreshold, g.yAxis.len)),
                k = t(c.inside, !!this.options.stacking);
            n && (d = v(n), 0 > d.y && (d.height += d.y, d.y = 0), n = d.y + d.height - g.yAxis.len, 0 < n && (d.height -= n),
            e && (d = {
                x: g.yAxis.len - d.y - d.height,
                y: g.xAxis.len - d.x - d.width,
                width: d.height,
                height: d.width
            }), k || (e ? (d.x += q ? 0 : d.width, d.width = 0) : (d.y += q ? d.height : 0, d.height = 0)));
            c.align = t(c.align, !e || k ? "center" : q ? "right" : "left");
            c.verticalAlign = t(c.verticalAlign, e || k ? "middle" : q ? "top" : "bottom");
            l.prototype.alignDataLabel.call(this, a, b, c, d, f);
            c.inside && a.contrastColor && b.css({color: a.contrastColor})
        })
    });
    K(D, "modules/overlapping-datalabels.src.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.isArray,
            E = h.objectEach;
        h = c.Chart;
        var G = c.pick, B = c.addEvent, F = c.fireEvent;
        B(h, "render", function () {
            var c = [];
            (this.labelCollectors || []).forEach(function (h) {
                c = c.concat(h())
            });
            (this.yAxis || []).forEach(function (h) {
                h.options.stackLabels && !h.options.stackLabels.allowOverlap && E(h.stacks, function (h) {
                    E(h, function (h) {
                        c.push(h.label)
                    })
                })
            });
            (this.series || []).forEach(function (h) {
                var v = h.options.dataLabels;
                h.visible && (!1 !== v.enabled || h._hasPointLabels) && h.points.forEach(function (h) {
                    h.visible && (x(h.dataLabels) ? h.dataLabels :
                        h.dataLabel ? [h.dataLabel] : []).forEach(function (r) {
                        var l = r.options;
                        r.labelrank = G(l.labelrank, h.labelrank, h.shapeArgs && h.shapeArgs.height);
                        l.allowOverlap || c.push(r)
                    })
                })
            });
            this.hideOverlappingLabels(c)
        });
        h.prototype.hideOverlappingLabels = function (c) {
            var h = this, v = c.length, t = h.renderer, r, l, f;
            var b = function (a) {
                var b = a.box ? 0 : a.padding || 0;
                var c = 0;
                if (a && (!a.alignAttr || a.placed)) {
                    var e = a.alignAttr || {x: a.attr("x"), y: a.attr("y")};
                    var f = a.parentGroup;
                    a.width || (c = a.getBBox(), a.width = c.width, a.height = c.height, c =
                        t.fontMetrics(null, a.element).h);
                    return {
                        x: e.x + (f.translateX || 0) + b,
                        y: e.y + (f.translateY || 0) + b - c,
                        width: a.width - 2 * b,
                        height: a.height - 2 * b
                    }
                }
            };
            for (l = 0; l < v; l++) if (r = c[l]) r.oldOpacity = r.opacity, r.newOpacity = 1, r.absoluteBox = b(r);
            c.sort(function (a, b) {
                return (b.labelrank || 0) - (a.labelrank || 0)
            });
            for (l = 0; l < v; l++) {
                var a = (b = c[l]) && b.absoluteBox;
                for (r = l + 1; r < v; ++r) {
                    var g = (f = c[r]) && f.absoluteBox;
                    !a || !g || b === f || 0 === b.newOpacity || 0 === f.newOpacity || g.x > a.x + a.width || g.x + g.width < a.x || g.y > a.y + a.height || g.y + g.height < a.y || ((b.labelrank <
                    f.labelrank ? b : f).newOpacity = 0)
                }
            }
            c.forEach(function (a) {
                var b;
                if (a) {
                    var c = a.newOpacity;
                    a.oldOpacity !== c && (a.alignAttr && a.placed ? (c ? a.show(!0) : b = function () {
                        a.hide(!0);
                        a.placed = !1
                    }, a.alignAttr.opacity = c, a[a.isOld ? "animate" : "attr"](a.alignAttr, null, b), F(h, "afterHideOverlappingLabels")) : a.attr({opacity: c}));
                    a.isOld = !0
                }
            })
        }
    });
    K(D, "parts/Interaction.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined, E = h.isArray, G = h.isObject, B = h.objectEach, F = c.addEvent;
        h = c.Chart;
        var I = c.createElement,
            y = c.css, v = c.defaultOptions, t = c.defaultPlotOptions, r = c.extend, l = c.fireEvent, f = c.hasTouch,
            b = c.Legend, a = c.merge, g = c.pick, e = c.Point, d = c.Series, q = c.seriesTypes, m = c.svg;
        var z = c.TrackerMixin = {
            drawTrackerPoint: function () {
                var a = this, b = a.chart, c = b.pointer, d = function (a) {
                    var b = c.getPointFromEvent(a);
                    void 0 !== b && (c.isDirectTouch = !0, b.onMouseOver(a))
                }, e;
                a.points.forEach(function (a) {
                    e = E(a.dataLabels) ? a.dataLabels : a.dataLabel ? [a.dataLabel] : [];
                    a.graphic && (a.graphic.element.point = a);
                    e.forEach(function (b) {
                        b.div ? b.div.point =
                            a : b.element.point = a
                    })
                });
                a._hasTracking || (a.trackerGroups.forEach(function (e) {
                    if (a[e]) {
                        a[e].addClass("highcharts-tracker").on("mouseover", d).on("mouseout", function (a) {
                            c.onTrackerMouseOut(a)
                        });
                        if (f) a[e].on("touchstart", d);
                        !b.styledMode && a.options.cursor && a[e].css(y).css({cursor: a.options.cursor})
                    }
                }), a._hasTracking = !0);
                l(this, "afterDrawTracker")
            }, drawTrackerGraph: function () {
                var a = this, b = a.options, c = b.trackByArea, d = [].concat(c ? a.areaPath : a.graphPath),
                    e = d.length, g = a.chart, q = g.pointer, p = g.renderer, h = g.options.tooltip.snap,
                    r = a.tracker, t, z = function () {
                        if (g.hoverSeries !== a) a.onMouseOver()
                    }, v = "rgba(192,192,192," + (m ? .0001 : .002) + ")";
                if (e && !c) for (t = e + 1; t--;) "M" === d[t] && d.splice(t + 1, 0, d[t + 1] - h, d[t + 2], "L"), (t && "M" === d[t] || t === e) && d.splice(t, 0, "L", d[t - 2] + h, d[t - 1]);
                r ? r.attr({d: d}) : a.graph && (a.tracker = p.path(d).attr({
                    visibility: a.visible ? "visible" : "hidden",
                    zIndex: 2
                }).addClass(c ? "highcharts-tracker-area" : "highcharts-tracker-line").add(a.group), g.styledMode || a.tracker.attr({
                    "stroke-linejoin": "round", stroke: v, fill: c ? v : "none", "stroke-width": a.graph.strokeWidth() +
                        (c ? 0 : 2 * h)
                }), [a.tracker, a.markerGroup].forEach(function (a) {
                    a.addClass("highcharts-tracker").on("mouseover", z).on("mouseout", function (a) {
                        q.onTrackerMouseOut(a)
                    });
                    b.cursor && !g.styledMode && a.css({cursor: b.cursor});
                    if (f) a.on("touchstart", z)
                }));
                l(this, "afterDrawTracker")
            }
        };
        q.column && (q.column.prototype.drawTracker = z.drawTrackerPoint);
        q.pie && (q.pie.prototype.drawTracker = z.drawTrackerPoint);
        q.scatter && (q.scatter.prototype.drawTracker = z.drawTrackerPoint);
        r(b.prototype, {
            setItemEvents: function (b, c, d) {
                var f =
                        this, g = f.chart.renderer.boxWrapper, k = b instanceof e,
                    n = "highcharts-legend-" + (k ? "point" : "series") + "-active", m = f.chart.styledMode;
                (d ? c : b.legendGroup).on("mouseover", function () {
                    b.visible && f.allItems.forEach(function (a) {
                        b !== a && a.setState("inactive", !k)
                    });
                    b.setState("hover");
                    b.visible && g.addClass(n);
                    m || c.css(f.options.itemHoverStyle)
                }).on("mouseout", function () {
                    f.chart.styledMode || c.css(a(b.visible ? f.itemStyle : f.itemHiddenStyle));
                    f.allItems.forEach(function (a) {
                        b !== a && a.setState("", !k)
                    });
                    g.removeClass(n);
                    b.setState()
                }).on("click", function (a) {
                    var c = function () {
                        b.setVisible && b.setVisible();
                        f.allItems.forEach(function (a) {
                            b !== a && a.setState(b.visible ? "inactive" : "", !k)
                        })
                    };
                    g.removeClass(n);
                    a = {browserEvent: a};
                    b.firePointEvent ? b.firePointEvent("legendItemClick", a, c) : l(b, "legendItemClick", a, c)
                })
            }, createCheckboxForItem: function (a) {
                a.checkbox = I("input", {
                    type: "checkbox",
                    className: "highcharts-legend-checkbox",
                    checked: a.selected,
                    defaultChecked: a.selected
                }, this.options.itemCheckboxStyle, this.chart.container);
                F(a.checkbox,
                    "click", function (b) {
                        l(a.series || a, "checkboxClick", {checked: b.target.checked, item: a}, function () {
                            a.select()
                        })
                    })
            }
        });
        r(h.prototype, {
            showResetZoom: function () {
                function a() {
                    b.zoomOut()
                }

                var b = this, c = v.lang, d = b.options.chart.resetZoomButton, e = d.theme, f = e.states,
                    g = "chart" === d.relativeTo || "spaceBox" === d.relativeTo ? null : "plotBox";
                l(this, "beforeShowResetZoom", null, function () {
                    b.resetZoomButton = b.renderer.button(c.resetZoom, null, null, a, e, f && f.hover).attr({
                        align: d.position.align,
                        title: c.resetZoomTitle
                    }).addClass("highcharts-reset-zoom").add().align(d.position,
                        !1, g)
                });
                l(this, "afterShowResetZoom")
            }, zoomOut: function () {
                l(this, "selection", {resetSelection: !0}, this.zoom)
            }, zoom: function (a) {
                var b = this, c, d = b.pointer, e = !1, f = b.inverted ? d.mouseDownX : d.mouseDownY;
                !a || a.resetSelection ? (b.axes.forEach(function (a) {
                    c = a.zoom()
                }), d.initiated = !1) : a.xAxis.concat(a.yAxis).forEach(function (a) {
                    var g = a.axis, k = b.inverted ? g.left : g.top, n = b.inverted ? k + g.width : k + g.height,
                        m = g.isXAxis, q = !1;
                    if (!m && f >= k && f <= n || m || !x(f)) q = !0;
                    d[m ? "zoomX" : "zoomY"] && q && (c = g.zoom(a.min, a.max), g.displayBtn &&
                    (e = !0))
                });
                var n = b.resetZoomButton;
                e && !n ? b.showResetZoom() : !e && G(n) && (b.resetZoomButton = n.destroy());
                c && b.redraw(g(b.options.chart.animation, a && a.animation, 100 > b.pointCount))
            }, pan: function (a, b) {
                var c = this, d = c.hoverPoints, e;
                l(this, "pan", {originalEvent: a}, function () {
                    d && d.forEach(function (a) {
                        a.setState()
                    });
                    ("xy" === b ? [1, 0] : [1]).forEach(function (b) {
                        b = c[b ? "xAxis" : "yAxis"][0];
                        var d = b.horiz, f = a[d ? "chartX" : "chartY"];
                        d = d ? "mouseDownX" : "mouseDownY";
                        var g = c[d], k = (b.pointRange || 0) / 2, n = b.reversed && !c.inverted || !b.reversed &&
                        c.inverted ? -1 : 1, m = b.getExtremes(), q = b.toValue(g - f, !0) + k * n;
                        n = b.toValue(g + b.len - f, !0) - k * n;
                        var l = n < q;
                        g = l ? n : q;
                        q = l ? q : n;
                        n = Math.min(m.dataMin, k ? m.min : b.toValue(b.toPixels(m.min) - b.minPixelPadding));
                        k = Math.max(m.dataMax, k ? m.max : b.toValue(b.toPixels(m.max) + b.minPixelPadding));
                        l = n - g;
                        0 < l && (q += l, g = n);
                        l = q - k;
                        0 < l && (q = k, g -= l);
                        b.series.length && g !== m.min && q !== m.max && (b.setExtremes(g, q, !1, !1, {trigger: "pan"}), e = !0);
                        c[d] = f
                    });
                    e && c.redraw(!1);
                    y(c.container, {cursor: "move"})
                })
            }
        });
        r(e.prototype, {
            select: function (a, b) {
                var c =
                    this, d = c.series, e = d.chart;
                this.selectedStaging = a = g(a, !c.selected);
                c.firePointEvent(a ? "select" : "unselect", {accumulate: b}, function () {
                    c.selected = c.options.selected = a;
                    d.options.data[d.data.indexOf(c)] = c.options;
                    c.setState(a && "select");
                    b || e.getSelectedPoints().forEach(function (a) {
                        var b = a.series;
                        a.selected && a !== c && (a.selected = a.options.selected = !1, b.options.data[b.data.indexOf(a)] = a.options, a.setState(e.hoverPoints && b.options.inactiveOtherPoints ? "inactive" : ""), a.firePointEvent("unselect"))
                    })
                });
                delete this.selectedStaging
            },
            onMouseOver: function (a) {
                var b = this.series.chart, c = b.pointer;
                a = a ? c.normalize(a) : c.getChartCoordinatesFromPoint(this, b.inverted);
                c.runPointActions(a, this)
            }, onMouseOut: function () {
                var a = this.series.chart;
                this.firePointEvent("mouseOut");
                this.series.options.inactiveOtherPoints || (a.hoverPoints || []).forEach(function (a) {
                    a.setState()
                });
                a.hoverPoints = a.hoverPoint = null
            }, importEvents: function () {
                if (!this.hasImportedEvents) {
                    var b = this, d = a(b.series.options.point, b.options).events;
                    b.events = d;
                    B(d, function (a, d) {
                        c.isFunction(a) &&
                        F(b, d, a)
                    });
                    this.hasImportedEvents = !0
                }
            }, setState: function (a, b) {
                var c = this.series, d = this.state, e = c.options.states[a || "normal"] || {},
                    f = t[c.type].marker && c.options.marker, m = f && !1 === f.enabled,
                    n = f && f.states && f.states[a || "normal"] || {}, q = !1 === n.enabled, h = c.stateMarkerGraphic,
                    u = this.marker || {}, z = c.chart, v = c.halo, y, B = f && c.markerAttribs;
                a = a || "";
                if (!(a === this.state && !b || this.selected && "select" !== a || !1 === e.enabled || a && (q || m && !1 === n.enabled) || a && u.states && u.states[a] && !1 === u.states[a].enabled)) {
                    this.state = a;
                    B &&
                    (y = c.markerAttribs(this, a));
                    if (this.graphic) {
                        d && this.graphic.removeClass("highcharts-point-" + d);
                        a && this.graphic.addClass("highcharts-point-" + a);
                        if (!z.styledMode) {
                            var x = c.pointAttribs(this, a);
                            var G = g(z.options.chart.animation, e.animation);
                            c.options.inactiveOtherPoints && ((this.dataLabels || []).forEach(function (a) {
                                a && a.animate({opacity: x.opacity}, G)
                            }), this.connector && this.connector.animate({opacity: x.opacity}, G));
                            this.graphic.animate(x, G)
                        }
                        y && this.graphic.animate(y, g(z.options.chart.animation, n.animation,
                            f.animation));
                        h && h.hide()
                    } else {
                        if (a && n) {
                            d = u.symbol || c.symbol;
                            h && h.currentSymbol !== d && (h = h.destroy());
                            if (h) h[b ? "animate" : "attr"]({
                                x: y.x,
                                y: y.y
                            }); else d && (c.stateMarkerGraphic = h = z.renderer.symbol(d, y.x, y.y, y.width, y.height).add(c.markerGroup), h.currentSymbol = d);
                            !z.styledMode && h && h.attr(c.pointAttribs(this, a))
                        }
                        h && (h[a && this.isInside ? "show" : "hide"](), h.element.point = this)
                    }
                    a = e.halo;
                    e = (h = this.graphic || h) && h.visibility || "inherit";
                    a && a.size && "hidden" !== e ? (v || (c.halo = v = z.renderer.path().add(h.parentGroup)),
                        v.show()[b ? "animate" : "attr"]({d: this.haloPath(a.size)}), v.attr({
                        "class": "highcharts-halo highcharts-color-" + g(this.colorIndex, c.colorIndex) + (this.className ? " " + this.className : ""),
                        visibility: e,
                        zIndex: -1
                    }), v.point = this, z.styledMode || v.attr(r({
                        fill: this.color || c.color,
                        "fill-opacity": a.opacity
                    }, a.attributes))) : v && v.point && v.point.haloPath && v.animate({d: v.point.haloPath(0)}, null, v.hide);
                    l(this, "afterSetState")
                }
            }, haloPath: function (a) {
                return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX) -
                    a, this.plotY - a, 2 * a, 2 * a)
            }
        });
        r(d.prototype, {
            onMouseOver: function () {
                var a = this.chart, b = a.hoverSeries;
                if (b && b !== this) b.onMouseOut();
                this.options.events.mouseOver && l(this, "mouseOver");
                this.setState("hover");
                a.hoverSeries = this
            }, onMouseOut: function () {
                var a = this.options, b = this.chart, c = b.tooltip, d = b.hoverPoint;
                b.hoverSeries = null;
                if (d) d.onMouseOut();
                this && a.events.mouseOut && l(this, "mouseOut");
                !c || this.stickyTracking || c.shared && !this.noSharedTooltip || c.hide();
                b.series.forEach(function (a) {
                    a.setState("", !0)
                })
            },
            setState: function (a, b) {
                var c = this, d = c.options, e = c.graph, f = d.inactiveOtherPoints, m = d.states, q = d.lineWidth,
                    n = d.opacity,
                    l = g(m[a || "normal"] && m[a || "normal"].animation, c.chart.options.chart.animation);
                d = 0;
                a = a || "";
                if (c.state !== a && ([c.group, c.markerGroup, c.dataLabelsGroup].forEach(function (b) {
                    b && (c.state && b.removeClass("highcharts-series-" + c.state), a && b.addClass("highcharts-series-" + a))
                }), c.state = a, !c.chart.styledMode)) {
                    if (m[a] && !1 === m[a].enabled) return;
                    a && (q = m[a].lineWidth || q + (m[a].lineWidthPlus || 0), n = g(m[a].opacity,
                        n));
                    if (e && !e.dashstyle) for (m = {"stroke-width": q}, e.animate(m, l); c["zone-graph-" + d];) c["zone-graph-" + d].attr(m), d += 1;
                    f || [c.group, c.markerGroup, c.dataLabelsGroup, c.labelBySeries].forEach(function (a) {
                        a && a.animate({opacity: n}, l)
                    })
                }
                b && f && c.points && c.setAllPointsToState(a)
            }, setAllPointsToState: function (a) {
                this.points.forEach(function (b) {
                    b.setState && b.setState(a)
                })
            }, setVisible: function (a, b) {
                var c = this, d = c.chart, e = c.legendItem, f = d.options.chart.ignoreHiddenSeries, g = c.visible;
                var m = (c.visible = a = c.options.visible =
                    c.userOptions.visible = void 0 === a ? !g : a) ? "show" : "hide";
                ["group", "dataLabelsGroup", "markerGroup", "tracker", "tt"].forEach(function (a) {
                    if (c[a]) c[a][m]()
                });
                if (d.hoverSeries === c || (d.hoverPoint && d.hoverPoint.series) === c) c.onMouseOut();
                e && d.legend.colorizeItem(c, a);
                c.isDirty = !0;
                c.options.stacking && d.series.forEach(function (a) {
                    a.options.stacking && a.visible && (a.isDirty = !0)
                });
                c.linkedSeries.forEach(function (b) {
                    b.setVisible(a, !1)
                });
                f && (d.isDirtyBox = !0);
                l(c, m);
                !1 !== b && d.redraw()
            }, show: function () {
                this.setVisible(!0)
            },
            hide: function () {
                this.setVisible(!1)
            }, select: function (a) {
                this.selected = a = this.options.selected = void 0 === a ? !this.selected : a;
                this.checkbox && (this.checkbox.checked = a);
                l(this, a ? "select" : "unselect")
            }, drawTracker: z.drawTrackerGraph
        })
    });
    K(D, "parts/Responsive.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.isArray, E = h.isObject, G = h.objectEach, B = h.splat;
        h = c.Chart;
        var F = c.pick;
        h.prototype.setResponsive = function (h, y) {
            var v = this.options.responsive, t = [], r = this.currentResponsive;
            !y && v &&
            v.rules && v.rules.forEach(function (l) {
                void 0 === l._id && (l._id = c.uniqueKey());
                this.matchResponsiveRule(l, t)
            }, this);
            y = c.merge.apply(0, t.map(function (l) {
                return c.find(v.rules, function (c) {
                    return c._id === l
                }).chartOptions
            }));
            y.isResponsiveOptions = !0;
            t = t.toString() || void 0;
            t !== (r && r.ruleIds) && (r && this.update(r.undoOptions, h, !0), t ? (r = this.currentOptions(y), r.isResponsiveOptions = !0, this.currentResponsive = {
                ruleIds: t,
                mergedOptions: y,
                undoOptions: r
            }, this.update(y, h, !0)) : this.currentResponsive = void 0)
        };
        h.prototype.matchResponsiveRule =
            function (c, h) {
                var v = c.condition;
                (v.callback || function () {
                    return this.chartWidth <= F(v.maxWidth, Number.MAX_VALUE) && this.chartHeight <= F(v.maxHeight, Number.MAX_VALUE) && this.chartWidth >= F(v.minWidth, 0) && this.chartHeight >= F(v.minHeight, 0)
                }).call(this) && h.push(c._id)
            };
        h.prototype.currentOptions = function (c) {
            function h(c, l, f, b) {
                var a;
                G(c, function (c, e) {
                    if (!b && -1 < v.collectionsWithUpdate.indexOf(e)) for (c = B(c), f[e] = [], a = 0; a < c.length; a++) l[e][a] && (f[e][a] = {}, h(c[a], l[e][a], f[e][a], b + 1)); else E(c) ? (f[e] = x(c) ? [] :
                        {}, h(c, l[e] || {}, f[e], b + 1)) : f[e] = void 0 === l[e] ? null : l[e]
                })
            }

            var v = this, t = {};
            h(c, this.options, t, 0);
            return t
        }
    });
    K(D, "parts-map/MapAxis.js", [D["parts/Globals.js"]], function (c) {
        var h = c.addEvent, x = c.Axis, E = c.pick;
        h(x, "getSeriesExtremes", function () {
            var c = [];
            this.isXAxis && (this.series.forEach(function (h, x) {
                h.useMapGeometry && (c[x] = h.xData, h.xData = [])
            }), this.seriesXData = c)
        });
        h(x, "afterGetSeriesExtremes", function () {
            var c = this.seriesXData, h;
            if (this.isXAxis) {
                var x = E(this.dataMin, Number.MAX_VALUE);
                var I = E(this.dataMax,
                    -Number.MAX_VALUE);
                this.series.forEach(function (y, v) {
                    y.useMapGeometry && (x = Math.min(x, E(y.minX, x)), I = Math.max(I, E(y.maxX, I)), y.xData = c[v], h = !0)
                });
                h && (this.dataMin = x, this.dataMax = I);
                delete this.seriesXData
            }
        });
        h(x, "afterSetAxisTranslation", function () {
            var c = this.chart;
            var h = c.plotWidth / c.plotHeight;
            c = c.xAxis[0];
            var x;
            "yAxis" === this.coll && void 0 !== c.transA && this.series.forEach(function (c) {
                c.preserveAspectRatio && (x = !0)
            });
            if (x && (this.transA = c.transA = Math.min(this.transA, c.transA), h /= (c.max - c.min) / (this.max -
                this.min), h = 1 > h ? this : c, c = (h.max - h.min) * h.transA, h.pixelPadding = h.len - c, h.minPixelPadding = h.pixelPadding / 2, c = h.fixTo)) {
                c = c[1] - h.toValue(c[0], !0);
                c *= h.transA;
                if (Math.abs(c) > h.minPixelPadding || h.min === h.dataMin && h.max === h.dataMax) c = 0;
                h.minPixelPadding -= c
            }
        });
        h(x, "render", function () {
            this.fixTo = null
        })
    });
    K(D, "parts-map/ColorAxis.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.erase, E = h.isNumber;
        h = c.addEvent;
        var G = c.Axis, B = c.Chart, F = c.color, D = c.extend, y = c.Legend, v = c.LegendSymbolMixin,
            t = c.noop, r = c.merge, l = c.pick;
        var f = c.ColorAxis = function () {
            this.init.apply(this, arguments)
        };
        D(f.prototype, G.prototype);
        D(f.prototype, {
            defaultColorAxisOptions: {
                lineWidth: 0,
                minPadding: 0,
                maxPadding: 0,
                gridLineWidth: 1,
                tickPixelInterval: 72,
                startOnTick: !0,
                endOnTick: !0,
                offset: 0,
                marker: {animation: {duration: 50}, width: .01, color: "#999999"},
                labels: {overflow: "justify", rotation: 0},
                minColor: "#e6ebf5",
                maxColor: "#003399",
                tickLength: 5,
                showInLegend: !0
            }, keepProps: ["legendGroup", "legendItemHeight", "legendItemWidth", "legendItem",
                "legendSymbol"].concat(G.prototype.keepProps), init: function (b, a) {
                var c = "vertical" !== b.options.legend.layout;
                this.coll = "colorAxis";
                var e = this.buildOptions.call(b, this.defaultColorAxisOptions, a);
                G.prototype.init.call(this, b, e);
                a.dataClasses && this.initDataClasses(a);
                this.initStops();
                this.horiz = c;
                this.zoomEnabled = !1;
                this.defaultLegendLength = 200
            }, initDataClasses: function (b) {
                var a = this.chart, c, e = 0, d = a.options.chart.colorCount, f = this.options,
                    m = b.dataClasses.length;
                this.dataClasses = c = [];
                this.legendItems =
                    [];
                b.dataClasses.forEach(function (b, g) {
                    b = r(b);
                    c.push(b);
                    if (a.styledMode || !b.color) "category" === f.dataClassColor ? (a.styledMode || (g = a.options.colors, d = g.length, b.color = g[e]), b.colorIndex = e, e++, e === d && (e = 0)) : b.color = F(f.minColor).tweenTo(F(f.maxColor), 2 > m ? .5 : g / (m - 1))
                })
            }, hasData: function () {
                return !(!this.tickPositions || !this.tickPositions.length)
            }, setTickPositions: function () {
                if (!this.dataClasses) return G.prototype.setTickPositions.call(this)
            }, initStops: function () {
                this.stops = this.options.stops || [[0, this.options.minColor],
                    [1, this.options.maxColor]];
                this.stops.forEach(function (b) {
                    b.color = F(b[1])
                })
            }, buildOptions: function (b, a) {
                var c = this.options.legend, e = "vertical" !== c.layout;
                return r(b, {side: e ? 2 : 1, reversed: !e}, a, {
                    opposite: !e,
                    showEmpty: !1,
                    title: null,
                    visible: c.enabled
                })
            }, setOptions: function (b) {
                G.prototype.setOptions.call(this, b);
                this.options.crosshair = this.options.marker
            }, setAxisSize: function () {
                var b = this.legendSymbol, a = this.chart, c = a.options.legend || {}, e, d;
                b ? (this.left = c = b.attr("x"), this.top = e = b.attr("y"), this.width =
                    d = b.attr("width"), this.height = b = b.attr("height"), this.right = a.chartWidth - c - d, this.bottom = a.chartHeight - e - b, this.len = this.horiz ? d : b, this.pos = this.horiz ? c : e) : this.len = (this.horiz ? c.symbolWidth : c.symbolHeight) || this.defaultLegendLength
            }, normalizedValue: function (b) {
                this.isLog && (b = this.val2lin(b));
                return 1 - (this.max - b) / (this.max - this.min || 1)
            }, toColor: function (b, a) {
                var c = this.stops, e = this.dataClasses, d;
                if (e) for (d = e.length; d--;) {
                    var f = e[d];
                    var m = f.from;
                    c = f.to;
                    if ((void 0 === m || b >= m) && (void 0 === c || b <= c)) {
                        var l =
                            f.color;
                        a && (a.dataClass = d, a.colorIndex = f.colorIndex);
                        break
                    }
                } else {
                    b = this.normalizedValue(b);
                    for (d = c.length; d-- && !(b > c[d][0]);) ;
                    m = c[d] || c[d + 1];
                    c = c[d + 1] || m;
                    b = 1 - (c[0] - b) / (c[0] - m[0] || 1);
                    l = m.color.tweenTo(c.color, b)
                }
                return l
            }, getOffset: function () {
                var b = this.legendGroup, a = this.chart.axisOffset[this.side];
                b && (this.axisParent = b, G.prototype.getOffset.call(this), this.added || (this.added = !0, this.labelLeft = 0, this.labelRight = this.width), this.chart.axisOffset[this.side] = a)
            }, setLegendColor: function () {
                var b = this.reversed;
                var a = b ? 1 : 0;
                b = b ? 0 : 1;
                a = this.horiz ? [a, 0, b, 0] : [0, b, 0, a];
                this.legendColor = {linearGradient: {x1: a[0], y1: a[1], x2: a[2], y2: a[3]}, stops: this.stops}
            }, drawLegendSymbol: function (b, a) {
                var c = b.padding, e = b.options, d = this.horiz,
                    f = l(e.symbolWidth, d ? this.defaultLegendLength : 12),
                    m = l(e.symbolHeight, d ? 12 : this.defaultLegendLength), h = l(e.labelPadding, d ? 16 : 30);
                e = l(e.itemDistance, 10);
                this.setLegendColor();
                a.legendSymbol = this.chart.renderer.rect(0, b.baseline - 11, f, m).attr({zIndex: 1}).add(a.legendGroup);
                this.legendItemWidth =
                    f + c + (d ? e : h);
                this.legendItemHeight = m + c + (d ? h : 0)
            }, setState: function (b) {
                this.series.forEach(function (a) {
                    a.setState(b)
                })
            }, visible: !0, setVisible: t, getSeriesExtremes: function () {
                var b = this.series, a = b.length;
                this.dataMin = Infinity;
                for (this.dataMax = -Infinity; a--;) b[a].getExtremes(), void 0 !== b[a].valueMin && (this.dataMin = Math.min(this.dataMin, b[a].valueMin), this.dataMax = Math.max(this.dataMax, b[a].valueMax))
            }, drawCrosshair: function (b, a) {
                var c = a && a.plotX, e = a && a.plotY, d = this.pos, f = this.len;
                if (a) {
                    var m = this.toPixels(a[a.series.colorKey]);
                    m < d ? m = d - 2 : m > d + f && (m = d + f + 2);
                    a.plotX = m;
                    a.plotY = this.len - m;
                    G.prototype.drawCrosshair.call(this, b, a);
                    a.plotX = c;
                    a.plotY = e;
                    this.cross && !this.cross.addedToColorAxis && this.legendGroup && (this.cross.addClass("highcharts-coloraxis-marker").add(this.legendGroup), this.cross.addedToColorAxis = !0, this.chart.styledMode || this.cross.attr({fill: this.crosshair.color}))
                }
            }, getPlotLinePath: function (b) {
                var a = b.translatedValue;
                return E(a) ? this.horiz ? ["M", a - 4, this.top - 6, "L", a + 4, this.top - 6, a, this.top, "Z"] : ["M", this.left, a, "L",
                    this.left - 6, a + 6, this.left - 6, a - 6, "Z"] : G.prototype.getPlotLinePath.apply(this, arguments)
            }, update: function (b, a) {
                var c = this.chart, e = c.legend, d = this.buildOptions.call(c, {}, b);
                this.series.forEach(function (a) {
                    a.isDirtyData = !0
                });
                b.dataClasses && e.allItems && (e.allItems.forEach(function (a) {
                    a.isDataClass && a.legendGroup && a.legendGroup.destroy()
                }), c.isDirtyLegend = !0);
                c.options[this.coll] = r(this.userOptions, d);
                G.prototype.update.call(this, d, a);
                this.legendItem && (this.setLegendColor(), e.colorizeItem(this, !0))
            }, remove: function () {
                this.legendItem &&
                this.chart.legend.destroyItem(this);
                G.prototype.remove.call(this)
            }, getDataClassLegendSymbols: function () {
                var b = this, a = this.chart, f = this.legendItems, e = a.options.legend, d = e.valueDecimals,
                    q = e.valueSuffix || "", m;
                f.length || this.dataClasses.forEach(function (e, g) {
                    var n = !0, k = e.from, l = e.to;
                    m = "";
                    void 0 === k ? m = "< " : void 0 === l && (m = "> ");
                    void 0 !== k && (m += c.numberFormat(k, d) + q);
                    void 0 !== k && void 0 !== l && (m += " - ");
                    void 0 !== l && (m += c.numberFormat(l, d) + q);
                    f.push(D({
                        chart: a, name: m, options: {}, drawLegendSymbol: v.drawRectangle,
                        visible: !0, setState: t, isDataClass: !0, setVisible: function () {
                            n = this.visible = !n;
                            b.series.forEach(function (a) {
                                a.points.forEach(function (a) {
                                    a.dataClass === g && a.setVisible(n)
                                })
                            });
                            a.legend.colorizeItem(this, n)
                        }
                    }, e))
                });
                return f
            }, name: ""
        });
        ["fill", "stroke"].forEach(function (b) {
            c.Fx.prototype[b + "Setter"] = function () {
                this.elem.attr(b, F(this.start).tweenTo(F(this.end), this.pos), null, !0)
            }
        });
        h(B, "afterGetAxes", function () {
            var b = this.options.colorAxis;
            this.colorAxis = [];
            b && new f(this, b)
        });
        h(y, "afterGetAllItems", function (b) {
            var a =
                [], c = this.chart.colorAxis[0];
            c && c.options && c.options.showInLegend && (c.options.dataClasses ? a = c.getDataClassLegendSymbols() : a.push(c), c.series.forEach(function (a) {
                x(b.allItems, a)
            }));
            for (c = a.length; c--;) b.allItems.unshift(a[c])
        });
        h(y, "afterColorizeItem", function (b) {
            b.visible && b.item.legendColor && b.item.legendSymbol.attr({fill: b.item.legendColor})
        });
        h(y, "afterUpdate", function (b, a, c) {
            this.chart.colorAxis[0] && this.chart.colorAxis[0].update({}, c)
        })
    });
    K(D, "parts-map/ColorSeriesMixin.js", [D["parts/Globals.js"],
        D["parts/Utilities.js"]], function (c, h) {
        var x = h.defined;
        h = c.noop;
        var E = c.seriesTypes;
        c.colorPointMixin = {
            dataLabelOnNull: !0, isValid: function () {
                return null !== this.value && Infinity !== this.value && -Infinity !== this.value
            }, setVisible: function (c) {
                var h = this, x = c ? "show" : "hide";
                h.visible = !!c;
                ["graphic", "dataLabel"].forEach(function (c) {
                    if (h[c]) h[c][x]()
                })
            }, setState: function (h) {
                c.Point.prototype.setState.call(this, h);
                this.graphic && this.graphic.attr({zIndex: "hover" === h ? 1 : 0})
            }
        };
        c.colorSeriesMixin = {
            pointArrayMap: ["value"],
            axisTypes: ["xAxis", "yAxis", "colorAxis"],
            optionalAxis: "colorAxis",
            trackerGroups: ["group", "markerGroup", "dataLabelsGroup"],
            getSymbol: h,
            parallelArrays: ["x", "y", "value"],
            colorKey: "value",
            pointAttribs: E.column.prototype.pointAttribs,
            translateColors: function () {
                var c = this, h = this.options.nullColor, x = this.colorAxis, E = this.colorKey;
                this.data.forEach(function (y) {
                    var v = y[E];
                    if (v = y.options.color || (y.isNull ? h : x && void 0 !== v ? x.toColor(v, y) : y.color || c.color)) y.color = v
                })
            },
            colorAttribs: function (c) {
                var h = {};
                x(c.color) &&
                (h[this.colorProp || "fill"] = c.color);
                return h
            }
        }
    });
    K(D, "parts-map/MapNavigation.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        function x(c) {
            c && (c.preventDefault && c.preventDefault(), c.stopPropagation && c.stopPropagation(), c.cancelBubble = !0)
        }

        function E(c) {
            this.init(c)
        }

        var G = h.objectEach, B = c.addEvent;
        h = c.Chart;
        var F = c.doc, D = c.extend, y = c.merge, v = c.pick;
        E.prototype.init = function (c) {
            this.chart = c;
            c.mapNavButtons = []
        };
        E.prototype.update = function (c) {
            var h = this.chart, l = h.options.mapNavigation,
                f, b, a, g, e, d = function (a) {
                    this.handler.call(h, a);
                    x(a)
                }, q = h.mapNavButtons;
            c && (l = h.options.mapNavigation = y(h.options.mapNavigation, c));
            for (; q.length;) q.pop().destroy();
            v(l.enableButtons, l.enabled) && !h.renderer.forExport && G(l.buttons, function (c, r) {
                f = y(l.buttonOptions, c);
                h.styledMode || (b = f.theme, b.style = y(f.theme.style, f.style), g = (a = b.states) && a.hover, e = a && a.select);
                c = h.renderer.button(f.text, 0, 0, d, b, g, e, 0, "zoomIn" === r ? "topbutton" : "bottombutton").addClass("highcharts-map-navigation highcharts-" + {
                    zoomIn: "zoom-in",
                    zoomOut: "zoom-out"
                }[r]).attr({
                    width: f.width,
                    height: f.height,
                    title: h.options.lang[r],
                    padding: f.padding,
                    zIndex: 5
                }).add();
                c.handler = f.onclick;
                c.align(D(f, {width: c.width, height: 2 * c.height}), null, f.alignTo);
                B(c.element, "dblclick", x);
                q.push(c)
            });
            this.updateEvents(l)
        };
        E.prototype.updateEvents = function (c) {
            var h = this.chart;
            v(c.enableDoubleClickZoom, c.enabled) || c.enableDoubleClickZoomTo ? this.unbindDblClick = this.unbindDblClick || B(h.container, "dblclick", function (c) {
                h.pointer.onContainerDblClick(c)
            }) : this.unbindDblClick &&
                (this.unbindDblClick = this.unbindDblClick());
            v(c.enableMouseWheelZoom, c.enabled) ? this.unbindMouseWheel = this.unbindMouseWheel || B(h.container, void 0 === F.onmousewheel ? "DOMMouseScroll" : "mousewheel", function (c) {
                h.pointer.onContainerMouseWheel(c);
                x(c);
                return !1
            }) : this.unbindMouseWheel && (this.unbindMouseWheel = this.unbindMouseWheel())
        };
        D(h.prototype, {
            fitToBox: function (c, h) {
                [["x", "width"], ["y", "height"]].forEach(function (l) {
                    var f = l[0];
                    l = l[1];
                    c[f] + c[l] > h[f] + h[l] && (c[l] > h[l] ? (c[l] = h[l], c[f] = h[f]) : c[f] = h[f] + h[l] -
                        c[l]);
                    c[l] > h[l] && (c[l] = h[l]);
                    c[f] < h[f] && (c[f] = h[f])
                });
                return c
            }, mapZoom: function (c, h, l, f, b) {
                var a = this.xAxis[0], g = a.max - a.min, e = v(h, a.min + g / 2), d = g * c;
                g = this.yAxis[0];
                var q = g.max - g.min, m = v(l, g.min + q / 2);
                q *= c;
                e = this.fitToBox({
                    x: e - d * (f ? (f - a.pos) / a.len : .5),
                    y: m - q * (b ? (b - g.pos) / g.len : .5),
                    width: d,
                    height: q
                }, {x: a.dataMin, y: g.dataMin, width: a.dataMax - a.dataMin, height: g.dataMax - g.dataMin});
                d = e.x <= a.dataMin && e.width >= a.dataMax - a.dataMin && e.y <= g.dataMin && e.height >= g.dataMax - g.dataMin;
                f && (a.fixTo = [f - a.pos, h]);
                b && (g.fixTo =
                    [b - g.pos, l]);
                void 0 === c || d ? (a.setExtremes(void 0, void 0, !1), g.setExtremes(void 0, void 0, !1)) : (a.setExtremes(e.x, e.x + e.width, !1), g.setExtremes(e.y, e.y + e.height, !1));
                this.redraw()
            }
        });
        B(h, "beforeRender", function () {
            this.mapNavigation = new E(this);
            this.mapNavigation.update()
        });
        c.MapNavigation = E
    });
    K(D, "parts-map/MapPointer.js", [D["parts/Globals.js"]], function (c) {
        var h = c.extend, x = c.pick, E = c.Pointer;
        c = c.wrap;
        h(E.prototype, {
            onContainerDblClick: function (c) {
                var h = this.chart;
                c = this.normalize(c);
                h.options.mapNavigation.enableDoubleClickZoomTo ?
                    h.pointer.inClass(c.target, "highcharts-tracker") && h.hoverPoint && h.hoverPoint.zoomTo() : h.isInsidePlot(c.chartX - h.plotLeft, c.chartY - h.plotTop) && h.mapZoom(.5, h.xAxis[0].toValue(c.chartX), h.yAxis[0].toValue(c.chartY), c.chartX, c.chartY)
            }, onContainerMouseWheel: function (c) {
                var h = this.chart;
                c = this.normalize(c);
                var x = c.detail || -(c.wheelDelta / 120);
                h.isInsidePlot(c.chartX - h.plotLeft, c.chartY - h.plotTop) && h.mapZoom(Math.pow(h.options.mapNavigation.mouseWheelSensitivity, x), h.xAxis[0].toValue(c.chartX), h.yAxis[0].toValue(c.chartY),
                    c.chartX, c.chartY)
            }
        });
        c(E.prototype, "zoomOption", function (c) {
            var h = this.chart.options.mapNavigation;
            x(h.enableTouchZoom, h.enabled) && (this.chart.options.chart.pinchType = "xy");
            c.apply(this, [].slice.call(arguments, 1))
        });
        c(E.prototype, "pinchTranslate", function (c, h, x, E, y, v, t) {
            c.call(this, h, x, E, y, v, t);
            "map" === this.chart.options.chart.type && this.hasZoom && (c = E.scaleX > E.scaleY, this.pinchTranslateDirection(!c, h, x, E, y, v, t, c ? E.scaleX : E.scaleY))
        })
    });
    K(D, "parts-map/MapSeries.js", [D["parts/Globals.js"], D["parts/Utilities.js"]],
        function (c, h) {
            var x = h.isArray, E = h.isNumber, G = h.objectEach, B = h.splat;
            h = c.colorPointMixin;
            var F = c.extend, D = c.merge, y = c.noop, v = c.pick, t = c.Point, r = c.Series, l = c.seriesType,
                f = c.seriesTypes;
            l("map", "scatter", {
                animation: !1,
                dataLabels: {
                    crop: !1, formatter: function () {
                        return this.point.value
                    }, inside: !0, overflow: !1, padding: 0, verticalAlign: "middle"
                },
                marker: null,
                nullColor: "#f7f7f7",
                stickyTracking: !1,
                tooltip: {followPointer: !0, pointFormat: "{point.name}: {point.value}<br/>"},
                turboThreshold: 0,
                allAreas: !0,
                borderColor: "#cccccc",
                borderWidth: 1,
                joinBy: "hc-key",
                states: {
                    hover: {halo: null, brightness: .2},
                    normal: {animation: !0},
                    select: {color: "#cccccc"},
                    inactive: {opacity: 1}
                }
            }, D(c.colorSeriesMixin, {
                type: "map",
                getExtremesFromAll: !0,
                useMapGeometry: !0,
                forceDL: !0,
                searchPoint: y,
                directTouch: !0,
                preserveAspectRatio: !0,
                pointArrayMap: ["value"],
                setOptions: function (b) {
                    b = r.prototype.setOptions.call(this, b);
                    var a = b.joinBy;
                    null === a && (a = "_i");
                    a = this.joinBy = B(a);
                    a[1] || (a[1] = a[0]);
                    return b
                },
                getBox: function (b) {
                    var a = Number.MAX_VALUE, f = -a, e = a, d = -a, h = a,
                        m = a, l = this.xAxis, n = this.yAxis, r;
                    (b || []).forEach(function (b) {
                        if (b.path) {
                            "string" === typeof b.path && (b.path = c.splitPath(b.path));
                            var g = b.path || [], k = g.length, n = !1, q = -a, l = a, u = -a, t = a, z = b.properties;
                            if (!b._foundBox) {
                                for (; k--;) E(g[k]) && (n ? (q = Math.max(q, g[k]), l = Math.min(l, g[k])) : (u = Math.max(u, g[k]), t = Math.min(t, g[k])), n = !n);
                                b._midX = l + (q - l) * v(b.middleX, z && z["hc-middle-x"], .5);
                                b._midY = t + (u - t) * v(b.middleY, z && z["hc-middle-y"], .5);
                                b._maxX = q;
                                b._minX = l;
                                b._maxY = u;
                                b._minY = t;
                                b.labelrank = v(b.labelrank, (q - l) * (u - t));
                                b._foundBox =
                                    !0
                            }
                            f = Math.max(f, b._maxX);
                            e = Math.min(e, b._minX);
                            d = Math.max(d, b._maxY);
                            h = Math.min(h, b._minY);
                            m = Math.min(b._maxX - b._minX, b._maxY - b._minY, m);
                            r = !0
                        }
                    });
                    r && (this.minY = Math.min(h, v(this.minY, a)), this.maxY = Math.max(d, v(this.maxY, -a)), this.minX = Math.min(e, v(this.minX, a)), this.maxX = Math.max(f, v(this.maxX, -a)), l && void 0 === l.options.minRange && (l.minRange = Math.min(5 * m, (this.maxX - this.minX) / 5, l.minRange || a)), n && void 0 === n.options.minRange && (n.minRange = Math.min(5 * m, (this.maxY - this.minY) / 5, n.minRange || a)))
                },
                hasData: function () {
                    return !!this.processedXData.length
                },
                getExtremes: function () {
                    r.prototype.getExtremes.call(this, this.valueData);
                    this.chart.hasRendered && this.isDirtyData && this.getBox(this.options.data);
                    this.valueMin = this.dataMin;
                    this.valueMax = this.dataMax;
                    this.dataMin = this.minY;
                    this.dataMax = this.maxY
                },
                translatePath: function (b) {
                    var a = !1, c = this.xAxis, e = this.yAxis, d = c.min, f = c.transA;
                    c = c.minPixelPadding;
                    var m = e.min, h = e.transA;
                    e = e.minPixelPadding;
                    var n, l = [];
                    if (b) for (n = b.length; n--;) E(b[n]) ? (l[n] = a ? (b[n] - d) * f + c : (b[n] - m) * h + e, a = !a) : l[n] = b[n];
                    return l
                },
                setData: function (b,
                                   a, f, e) {
                    var d = this.options, g = this.chart.options.chart, m = g && g.map, h = d.mapData, n = this.joinBy,
                        l = d.keys || this.pointArrayMap, k = [], v = {}, t = this.chart.mapTransforms;
                    !h && m && (h = "string" === typeof m ? c.maps[m] : m);
                    b && b.forEach(function (a, e) {
                        var f = 0;
                        if (E(a)) b[e] = {value: a}; else if (x(a)) {
                            b[e] = {};
                            !d.keys && a.length > l.length && "string" === typeof a[0] && (b[e]["hc-key"] = a[0], ++f);
                            for (var g = 0; g < l.length; ++g, ++f) l[g] && void 0 !== a[f] && (0 < l[g].indexOf(".") ? c.Point.prototype.setNestedProperty(b[e], a[f], l[g]) : b[e][l[g]] = a[f])
                        }
                        n &&
                        "_i" === n[0] && (b[e]._i = e)
                    });
                    this.getBox(b);
                    (this.chart.mapTransforms = t = g && g.mapTransforms || h && h["hc-transform"] || t) && G(t, function (a) {
                        a.rotation && (a.cosAngle = Math.cos(a.rotation), a.sinAngle = Math.sin(a.rotation))
                    });
                    if (h) {
                        "FeatureCollection" === h.type && (this.mapTitle = h.title, h = c.geojson(h, this.type, this));
                        this.mapData = h;
                        this.mapMap = {};
                        for (t = 0; t < h.length; t++) g = h[t], m = g.properties, g._i = t, n[0] && m && m[n[0]] && (g[n[0]] = m[n[0]]), v[g[n[0]]] = g;
                        this.mapMap = v;
                        b && n[1] && b.forEach(function (a) {
                            v[a[n[1]]] && k.push(v[a[n[1]]])
                        });
                        d.allAreas ? (this.getBox(h), b = b || [], n[1] && b.forEach(function (a) {
                            k.push(a[n[1]])
                        }), k = "|" + k.map(function (a) {
                            return a && a[n[0]]
                        }).join("|") + "|", h.forEach(function (a) {
                            n[0] && -1 !== k.indexOf("|" + a[n[0]] + "|") || (b.push(D(a, {value: null})), e = !1)
                        })) : this.getBox(k)
                    }
                    r.prototype.setData.call(this, b, a, f, e)
                },
                drawGraph: y,
                drawDataLabels: y,
                doFullTranslate: function () {
                    return this.isDirtyData || this.chart.isResizing || this.chart.renderer.isVML || !this.baseTrans
                },
                translate: function () {
                    var b = this, a = b.xAxis, c = b.yAxis, e = b.doFullTranslate();
                    b.generatePoints();
                    b.data.forEach(function (d) {
                        d.plotX = a.toPixels(d._midX, !0);
                        d.plotY = c.toPixels(d._midY, !0);
                        e && (d.shapeType = "path", d.shapeArgs = {d: b.translatePath(d.path)})
                    });
                    b.translateColors()
                },
                pointAttribs: function (b, a) {
                    a = b.series.chart.styledMode ? this.colorAttribs(b) : f.column.prototype.pointAttribs.call(this, b, a);
                    a["stroke-width"] = v(b.options[this.pointAttrToOptions && this.pointAttrToOptions["stroke-width"] || "borderWidth"], "inherit");
                    return a
                },
                drawPoints: function () {
                    var b = this, a = b.xAxis, c = b.yAxis,
                        e = b.group, d = b.chart, h = d.renderer, m = this.baseTrans;
                    b.transformGroup || (b.transformGroup = h.g().attr({
                        scaleX: 1,
                        scaleY: 1
                    }).add(e), b.transformGroup.survive = !0);
                    if (b.doFullTranslate()) d.hasRendered && !d.styledMode && b.points.forEach(function (a) {
                        a.shapeArgs && (a.shapeArgs.fill = b.pointAttribs(a, a.state).fill)
                    }), b.group = b.transformGroup, f.column.prototype.drawPoints.apply(b), b.group = e, b.points.forEach(function (a) {
                        if (a.graphic) {
                            var c = "";
                            a.name && (c += "highcharts-name-" + a.name.replace(/ /g, "-").toLowerCase());
                            a.properties &&
                            a.properties["hc-key"] && (c += " highcharts-key-" + a.properties["hc-key"].toLowerCase());
                            c && a.graphic.addClass(c);
                            d.styledMode && a.graphic.css(b.pointAttribs(a, a.selected && "select"))
                        }
                    }), this.baseTrans = {
                        originX: a.min - a.minPixelPadding / a.transA,
                        originY: c.min - c.minPixelPadding / c.transA + (c.reversed ? 0 : c.len / c.transA),
                        transAX: a.transA,
                        transAY: c.transA
                    }, this.transformGroup.animate({translateX: 0, translateY: 0, scaleX: 1, scaleY: 1}); else {
                        var l = a.transA / m.transAX;
                        var n = c.transA / m.transAY;
                        var r = a.toPixels(m.originX,
                            !0);
                        var k = c.toPixels(m.originY, !0);
                        .99 < l && 1.01 > l && .99 < n && 1.01 > n && (n = l = 1, r = Math.round(r), k = Math.round(k));
                        var t = this.transformGroup;
                        if (d.renderer.globalAnimation) {
                            var y = t.attr("translateX");
                            var x = t.attr("translateY");
                            var A = t.attr("scaleX");
                            var p = t.attr("scaleY");
                            t.attr({animator: 0}).animate({animator: 1}, {
                                step: function (a, b) {
                                    t.attr({
                                        translateX: y + (r - y) * b.pos,
                                        translateY: x + (k - x) * b.pos,
                                        scaleX: A + (l - A) * b.pos,
                                        scaleY: p + (n - p) * b.pos
                                    })
                                }
                            })
                        } else t.attr({translateX: r, translateY: k, scaleX: l, scaleY: n})
                    }
                    d.styledMode ||
                    e.element.setAttribute("stroke-width", v(b.options[b.pointAttrToOptions && b.pointAttrToOptions["stroke-width"] || "borderWidth"], 1) / (l || 1));
                    this.drawMapDataLabels()
                },
                drawMapDataLabels: function () {
                    r.prototype.drawDataLabels.call(this);
                    this.dataLabelsGroup && this.dataLabelsGroup.clip(this.chart.clipRect)
                },
                render: function () {
                    var b = this, a = r.prototype.render;
                    b.chart.renderer.isVML && 3E3 < b.data.length ? setTimeout(function () {
                        a.call(b)
                    }) : a.call(b)
                },
                animate: function (b) {
                    var a = this.options.animation, c = this.group, e = this.xAxis,
                        d = this.yAxis, f = e.pos, m = d.pos;
                    this.chart.renderer.isSVG && (!0 === a && (a = {duration: 1E3}), b ? c.attr({
                        translateX: f + e.len / 2,
                        translateY: m + d.len / 2,
                        scaleX: .001,
                        scaleY: .001
                    }) : (c.animate({translateX: f, translateY: m, scaleX: 1, scaleY: 1}, a), this.animate = null))
                },
                animateDrilldown: function (b) {
                    var a = this.chart.plotBox, c = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],
                        e = c.bBox, d = this.chart.options.drilldown.animation;
                    b || (b = Math.min(e.width / a.width, e.height / a.height), c.shapeArgs = {
                        scaleX: b, scaleY: b, translateX: e.x,
                        translateY: e.y
                    }, this.points.forEach(function (a) {
                        a.graphic && a.graphic.attr(c.shapeArgs).animate({
                            scaleX: 1,
                            scaleY: 1,
                            translateX: 0,
                            translateY: 0
                        }, d)
                    }), this.animate = null)
                },
                drawLegendSymbol: c.LegendSymbolMixin.drawRectangle,
                animateDrillupFrom: function (b) {
                    f.column.prototype.animateDrillupFrom.call(this, b)
                },
                animateDrillupTo: function (b) {
                    f.column.prototype.animateDrillupTo.call(this, b)
                }
            }), F({
                applyOptions: function (b, a) {
                    var c = this.series;
                    b = t.prototype.applyOptions.call(this, b, a);
                    a = c.joinBy;
                    c.mapData && ((a = void 0 !==
                        b[a[1]] && c.mapMap[b[a[1]]]) ? (c.xyFromShape && (b.x = a._midX, b.y = a._midY), F(b, a)) : b.value = b.value || null);
                    return b
                }, onMouseOver: function (b) {
                    c.clearTimeout(this.colorInterval);
                    if (null !== this.value || this.series.options.nullInteraction) t.prototype.onMouseOver.call(this, b); else this.series.onMouseOut(b)
                }, zoomTo: function () {
                    var b = this.series;
                    b.xAxis.setExtremes(this._minX, this._maxX, !1);
                    b.yAxis.setExtremes(this._minY, this._maxY, !1);
                    b.chart.redraw()
                }
            }, h));
            ""
        });
    K(D, "parts-map/MapLineSeries.js", [D["parts/Globals.js"]],
        function (c) {
            var h = c.seriesType, x = c.seriesTypes;
            h("mapline", "map", {lineWidth: 1, fillColor: "none"}, {
                type: "mapline",
                colorProp: "stroke",
                pointAttrToOptions: {stroke: "color", "stroke-width": "lineWidth"},
                pointAttribs: function (c, h) {
                    c = x.map.prototype.pointAttribs.call(this, c, h);
                    c.fill = this.options.fillColor;
                    return c
                },
                drawLegendSymbol: x.line.prototype.drawLegendSymbol
            });
            ""
        });
    K(D, "parts-map/MapPointSeries.js", [D["parts/Globals.js"]], function (c) {
        var h = c.merge, x = c.Point;
        c = c.seriesType;
        c("mappoint", "scatter", {
            dataLabels: {
                crop: !1,
                defer: !1, enabled: !0, formatter: function () {
                    return this.point.name
                }, overflow: !1, style: {color: "#000000"}
            }
        }, {type: "mappoint", forceDL: !0}, {
            applyOptions: function (c, G) {
                c = void 0 !== c.lat && void 0 !== c.lon ? h(c, this.series.chart.fromLatLonToPoint(c)) : c;
                return x.prototype.applyOptions.call(this, c, G)
            }
        });
        ""
    });
    K(D, "parts-more/BubbleLegend.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.isNumber, E = h.objectEach;
        h = c.Series;
        var G = c.Legend, B = c.Chart, F = c.addEvent, D = c.wrap, y = c.color, v = c.numberFormat,
            t = c.merge, r = c.noop, l = c.pick, f = c.stableSort, b = c.setOptions, a = c.arrayMin, g = c.arrayMax;
        b({
            legend: {
                bubbleLegend: {
                    borderColor: void 0,
                    borderWidth: 2,
                    className: void 0,
                    color: void 0,
                    connectorClassName: void 0,
                    connectorColor: void 0,
                    connectorDistance: 60,
                    connectorWidth: 1,
                    enabled: !1,
                    labels: {
                        className: void 0,
                        allowOverlap: !1,
                        format: "",
                        formatter: void 0,
                        align: "right",
                        style: {fontSize: 10, color: void 0},
                        x: 0,
                        y: 0
                    },
                    maxSize: 60,
                    minSize: 10,
                    legendIndex: 0,
                    ranges: {value: void 0, borderColor: void 0, color: void 0, connectorColor: void 0},
                    sizeBy: "area",
                    sizeByAbsoluteValue: !1,
                    zIndex: 1,
                    zThreshold: 0
                }
            }
        });
        c.BubbleLegend = function (a, b) {
            this.init(a, b)
        };
        c.BubbleLegend.prototype = {
            init: function (a, b) {
                this.options = a;
                this.visible = !0;
                this.chart = b.chart;
                this.legend = b
            }, setState: r, addToLegend: function (a) {
                a.splice(this.options.legendIndex, 0, this)
            }, drawLegendSymbol: function (a) {
                var b = this.chart, c = this.options, e = l(a.options.itemDistance, 20), g = c.ranges;
                var h = c.connectorDistance;
                this.fontMetrics = b.renderer.fontMetrics(c.labels.style.fontSize.toString() + "px");
                g && g.length && x(g[0].value) ? (f(g, function (a, b) {
                    return b.value - a.value
                }), this.ranges = g, this.setOptions(), this.render(), b = this.getMaxLabelSize(), g = this.ranges[0].radius, a = 2 * g, h = h - g + b.width, h = 0 < h ? h : 0, this.maxLabel = b, this.movementX = "left" === c.labels.align ? h : 0, this.legendItemWidth = a + h + e, this.legendItemHeight = a + this.fontMetrics.h / 2) : a.options.bubbleLegend.autoRanges = !0
            }, setOptions: function () {
                var a = this.ranges, b = this.options, c = this.chart.series[b.seriesIndex], f = this.legend.baseline,
                    g = {
                        "z-index": b.zIndex,
                        "stroke-width": b.borderWidth
                    }, h = {"z-index": b.zIndex, "stroke-width": b.connectorWidth}, r = this.getLabelStyles(),
                    k = c.options.marker.fillOpacity, v = this.chart.styledMode;
                a.forEach(function (d, e) {
                    v || (g.stroke = l(d.borderColor, b.borderColor, c.color), g.fill = l(d.color, b.color, 1 !== k ? y(c.color).setOpacity(k).get("rgba") : c.color), h.stroke = l(d.connectorColor, b.connectorColor, c.color));
                    a[e].radius = this.getRangeRadius(d.value);
                    a[e] = t(a[e], {center: a[0].radius - a[e].radius + f});
                    v || t(!0, a[e], {
                        bubbleStyle: t(!1, g), connectorStyle: t(!1,
                            h), labelStyle: r
                    })
                }, this)
            }, getLabelStyles: function () {
                var a = this.options, b = {}, c = "left" === a.labels.align, f = this.legend.options.rtl;
                E(a.labels.style, function (a, c) {
                    "color" !== c && "fontSize" !== c && "z-index" !== c && (b[c] = a)
                });
                return t(!1, b, {
                    "font-size": a.labels.style.fontSize,
                    fill: l(a.labels.style.color, "#000000"),
                    "z-index": a.zIndex,
                    align: f || c ? "right" : "left"
                })
            }, getRangeRadius: function (a) {
                var b = this.options;
                return this.chart.series[this.options.seriesIndex].getRadius.call(this, b.ranges[b.ranges.length - 1].value,
                    b.ranges[0].value, b.minSize, b.maxSize, a)
            }, render: function () {
                var a = this.chart.renderer, b = this.options.zThreshold;
                this.symbols || (this.symbols = {connectors: [], bubbleItems: [], labels: []});
                this.legendSymbol = a.g("bubble-legend");
                this.legendItem = a.g("bubble-legend-item");
                this.legendSymbol.translateX = 0;
                this.legendSymbol.translateY = 0;
                this.ranges.forEach(function (a) {
                    a.value >= b && this.renderRange(a)
                }, this);
                this.legendSymbol.add(this.legendItem);
                this.legendItem.add(this.legendGroup);
                this.hideOverlappingLabels()
            },
            renderRange: function (a) {
                var b = this.options, c = b.labels, e = this.chart.renderer, f = this.symbols, g = f.labels,
                    h = a.center, k = Math.abs(a.radius), l = b.connectorDistance, r = c.align, t = c.style.fontSize;
                l = this.legend.options.rtl || "left" === r ? -l : l;
                c = b.connectorWidth;
                var v = this.ranges[0].radius, p = h - k - b.borderWidth / 2 + c / 2;
                t = t / 2 - (this.fontMetrics.h - t) / 2;
                var y = e.styledMode;
                "center" === r && (l = 0, b.connectorDistance = 0, a.labelStyle.align = "center");
                r = p + b.labels.y;
                var x = v + l + b.labels.x;
                f.bubbleItems.push(e.circle(v, h + ((p % 1 ? 1 : .5) -
                    (c % 2 ? 0 : .5)), k).attr(y ? {} : a.bubbleStyle).addClass((y ? "highcharts-color-" + this.options.seriesIndex + " " : "") + "highcharts-bubble-legend-symbol " + (b.className || "")).add(this.legendSymbol));
                f.connectors.push(e.path(e.crispLine(["M", v, p, "L", v + l, p], b.connectorWidth)).attr(y ? {} : a.connectorStyle).addClass((y ? "highcharts-color-" + this.options.seriesIndex + " " : "") + "highcharts-bubble-legend-connectors " + (b.connectorClassName || "")).add(this.legendSymbol));
                a = e.text(this.formatLabel(a), x, r + t).attr(y ? {} : a.labelStyle).addClass("highcharts-bubble-legend-labels " +
                    (b.labels.className || "")).add(this.legendSymbol);
                g.push(a);
                a.placed = !0;
                a.alignAttr = {x: x, y: r + t}
            }, getMaxLabelSize: function () {
                var a, b;
                this.symbols.labels.forEach(function (c) {
                    b = c.getBBox(!0);
                    a = a ? b.width > a.width ? b : a : b
                });
                return a || {}
            }, formatLabel: function (a) {
                var b = this.options, e = b.labels.formatter;
                return (b = b.labels.format) ? c.format(b, a) : e ? e.call(a) : v(a.value, 1)
            }, hideOverlappingLabels: function () {
                var a = this.chart, b = this.symbols;
                !this.options.labels.allowOverlap && b && (a.hideOverlappingLabels(b.labels), b.labels.forEach(function (a,
                                                                                                                         c) {
                    a.newOpacity ? a.newOpacity !== a.oldOpacity && b.connectors[c].show() : b.connectors[c].hide()
                }))
            }, getRanges: function () {
                var b = this.legend.bubbleLegend, c = b.options.ranges, f, h = Number.MAX_VALUE, r = -Number.MAX_VALUE;
                b.chart.series.forEach(function (b) {
                    b.isBubble && !b.ignoreSeries && (f = b.zData.filter(x), f.length && (h = l(b.options.zMin, Math.min(h, Math.max(a(f), !1 === b.options.displayNegative ? b.options.zThreshold : -Number.MAX_VALUE))), r = l(b.options.zMax, Math.max(r, g(f)))))
                });
                var n = h === r ? [{value: r}] : [{value: h}, {
                    value: (h +
                        r) / 2
                }, {value: r, autoRanges: !0}];
                c.length && c[0].radius && n.reverse();
                n.forEach(function (a, b) {
                    c && c[b] && (n[b] = t(!1, c[b], a))
                });
                return n
            }, predictBubbleSizes: function () {
                var a = this.chart, b = this.fontMetrics, c = a.legend.options, f = "horizontal" === c.layout,
                    g = f ? a.legend.lastLineHeight : 0, h = a.plotSizeX, l = a.plotSizeY,
                    k = a.series[this.options.seriesIndex];
                a = Math.ceil(k.minPxSize);
                var r = Math.ceil(k.maxPxSize);
                k = k.options.maxSize;
                var t = Math.min(l, h);
                if (c.floating || !/%$/.test(k)) b = r; else if (k = parseFloat(k), b = (t + g - b.h / 2) *
                    k / 100 / (k / 100 + 1), f && l - b >= h || !f && h - b >= l) b = r;
                return [a, Math.ceil(b)]
            }, updateRanges: function (a, b) {
                var c = this.legend.options.bubbleLegend;
                c.minSize = a;
                c.maxSize = b;
                c.ranges = this.getRanges()
            }, correctSizes: function () {
                var a = this.legend, b = this.chart.series[this.options.seriesIndex];
                1 < Math.abs(Math.ceil(b.maxPxSize) - this.options.maxSize) && (this.updateRanges(this.options.minSize, b.maxPxSize), a.render())
            }
        };
        F(c.Legend, "afterGetAllItems", function (a) {
            var b = this.bubbleLegend, e = this.options, f = e.bubbleLegend,
                g = this.chart.getVisibleBubbleSeriesIndex();
            b && b.ranges && b.ranges.length && (f.ranges.length && (f.autoRanges = !!f.ranges[0].autoRanges), this.destroyItem(b));
            0 <= g && e.enabled && f.enabled && (f.seriesIndex = g, this.bubbleLegend = new c.BubbleLegend(f, this), this.bubbleLegend.addToLegend(a.allItems))
        });
        B.prototype.getVisibleBubbleSeriesIndex = function () {
            for (var a = this.series, b = 0; b < a.length;) {
                if (a[b] && a[b].isBubble && a[b].visible && a[b].zData.length) return b;
                b++
            }
            return -1
        };
        G.prototype.getLinesHeights = function () {
            var a = this.allItems, b = [], c = a.length, f, g = 0;
            for (f = 0; f <
            c; f++) if (a[f].legendItemHeight && (a[f].itemHeight = a[f].legendItemHeight), a[f] === a[c - 1] || a[f + 1] && a[f]._legendItemPos[1] !== a[f + 1]._legendItemPos[1]) {
                b.push({height: 0});
                var h = b[b.length - 1];
                for (g; g <= f; g++) a[g].itemHeight > h.height && (h.height = a[g].itemHeight);
                h.step = f
            }
            return b
        };
        G.prototype.retranslateItems = function (a) {
            var b, c, e, f = this.options.rtl, g = 0;
            this.allItems.forEach(function (d, h) {
                b = d.legendGroup.translateX;
                c = d._legendItemPos[1];
                if ((e = d.movementX) || f && d.ranges) e = f ? b - d.options.maxSize / 2 : b + e, d.legendGroup.attr({translateX: e});
                h > a[g].step && g++;
                d.legendGroup.attr({translateY: Math.round(c + a[g].height / 2)});
                d._legendItemPos[1] = c + a[g].height / 2
            })
        };
        F(h, "legendItemClick", function () {
            var a = this.chart, b = this.visible, c = this.chart.legend;
            c && c.bubbleLegend && (this.visible = !b, this.ignoreSeries = b, a = 0 <= a.getVisibleBubbleSeriesIndex(), c.bubbleLegend.visible !== a && (c.update({bubbleLegend: {enabled: a}}), c.bubbleLegend.visible = a), this.visible = b)
        });
        D(B.prototype, "drawChartBox", function (a, b, c) {
            var d = this.legend, e = 0 <= this.getVisibleBubbleSeriesIndex();
            if (d && d.options.enabled && d.bubbleLegend && d.options.bubbleLegend.autoRanges && e) {
                var f = d.bubbleLegend.options;
                e = d.bubbleLegend.predictBubbleSizes();
                d.bubbleLegend.updateRanges(e[0], e[1]);
                f.placed || (d.group.placed = !1, d.allItems.forEach(function (a) {
                    a.legendGroup.translateY = null
                }));
                d.render();
                this.getMargins();
                this.axes.forEach(function (a) {
                    a.render();
                    f.placed || (a.setScale(), a.updateNames(), E(a.ticks, function (a) {
                        a.isNew = !0;
                        a.isNewLabel = !0
                    }))
                });
                f.placed = !0;
                this.getMargins();
                a.call(this, b, c);
                d.bubbleLegend.correctSizes();
                d.retranslateItems(d.getLinesHeights())
            } else a.call(this, b, c), d && d.options.enabled && d.bubbleLegend && (d.render(), d.retranslateItems(d.getLinesHeights()))
        })
    });
    K(D, "parts-more/BubbleSeries.js", [D["parts/Globals.js"], D["parts/Utilities.js"]], function (c, h) {
        var x = h.isNumber, E = h.pInt, G = c.arrayMax, B = c.arrayMin;
        h = c.Axis;
        var F = c.color, D = c.noop, y = c.pick, v = c.Point, t = c.Series, r = c.seriesType, l = c.seriesTypes;
        r("bubble", "scatter", {
            dataLabels: {
                formatter: function () {
                    return this.point.z
                }, inside: !0, verticalAlign: "middle"
            },
            animationLimit: 250,
            marker: {
                lineColor: null,
                lineWidth: 1,
                fillOpacity: .5,
                radius: null,
                states: {hover: {radiusPlus: 0}},
                symbol: "circle"
            },
            minSize: 8,
            maxSize: "20%",
            softThreshold: !1,
            states: {hover: {halo: {size: 5}}},
            tooltip: {pointFormat: "({point.x}, {point.y}), Size: {point.z}"},
            turboThreshold: 0,
            zThreshold: 0,
            zoneAxis: "z"
        }, {
            pointArrayMap: ["y", "z"],
            parallelArrays: ["x", "y", "z"],
            trackerGroups: ["group", "dataLabelsGroup"],
            specialGroup: "group",
            bubblePadding: !0,
            zoneAxis: "z",
            directTouch: !0,
            isBubble: !0,
            pointAttribs: function (c,
                                    b) {
                var a = this.options.marker.fillOpacity;
                c = t.prototype.pointAttribs.call(this, c, b);
                1 !== a && (c.fill = F(c.fill).setOpacity(a).get("rgba"));
                return c
            },
            getRadii: function (c, b, a) {
                var f = this.zData, e = this.yData, d = a.minPxSize, h = a.maxPxSize, l = [];
                var r = 0;
                for (a = f.length; r < a; r++) {
                    var n = f[r];
                    l.push(this.getRadius(c, b, d, h, n, e[r]))
                }
                this.radii = l
            },
            getRadius: function (c, b, a, g, e, d) {
                var f = this.options, h = "width" !== f.sizeBy, l = f.zThreshold, n = b - c, r = .5;
                if (null === d || null === e) return null;
                if (x(e)) {
                    f.sizeByAbsoluteValue && (e = Math.abs(e -
                        l), n = Math.max(b - l, Math.abs(c - l)), c = 0);
                    if (e < c) return a / 2 - 1;
                    0 < n && (r = (e - c) / n)
                }
                h && 0 <= r && (r = Math.sqrt(r));
                return Math.ceil(a + r * (g - a)) / 2
            },
            animate: function (c) {
                !c && this.points.length < this.options.animationLimit && (this.points.forEach(function (b) {
                    var a = b.graphic;
                    if (a && a.width) {
                        var c = {x: a.x, y: a.y, width: a.width, height: a.height};
                        a.attr({x: b.plotX, y: b.plotY, width: 1, height: 1});
                        a.animate(c, this.options.animation)
                    }
                }, this), this.animate = null)
            },
            hasData: function () {
                return !!this.processedXData.length
            },
            translate: function () {
                var f,
                    b = this.data, a = this.radii;
                l.scatter.prototype.translate.call(this);
                for (f = b.length; f--;) {
                    var g = b[f];
                    var e = a ? a[f] : 0;
                    x(e) && e >= this.minPxSize / 2 ? (g.marker = c.extend(g.marker, {
                        radius: e,
                        width: 2 * e,
                        height: 2 * e
                    }), g.dlBox = {
                        x: g.plotX - e,
                        y: g.plotY - e,
                        width: 2 * e,
                        height: 2 * e
                    }) : g.shapeArgs = g.plotY = g.dlBox = void 0
                }
            },
            alignDataLabel: l.column.prototype.alignDataLabel,
            buildKDTree: D,
            applyZones: D
        }, {
            haloPath: function (c) {
                return v.prototype.haloPath.call(this, 0 === c ? 0 : (this.marker ? this.marker.radius || 0 : 0) + c)
            }, ttBelow: !1
        });
        h.prototype.beforePadding =
            function () {
                var c = this, b = this.len, a = this.chart, g = 0, e = b, d = this.isXAxis, h = d ? "xData" : "yData",
                    l = this.min, r = {}, n = Math.min(a.plotWidth, a.plotHeight), t = Number.MAX_VALUE,
                    k = -Number.MAX_VALUE, v = this.max - l, C = b / v, D = [];
                this.series.forEach(function (b) {
                    var e = b.options;
                    !b.bubblePadding || !b.visible && a.options.chart.ignoreHiddenSeries || (c.allowZoomOutside = !0, D.push(b), d && (["minSize", "maxSize"].forEach(function (a) {
                        var b = e[a], c = /%$/.test(b);
                        b = E(b);
                        r[a] = c ? n * b / 100 : b
                    }), b.minPxSize = r.minSize, b.maxPxSize = Math.max(r.maxSize,
                        r.minSize), b = b.zData.filter(x), b.length && (t = y(e.zMin, Math.min(t, Math.max(B(b), !1 === e.displayNegative ? e.zThreshold : -Number.MAX_VALUE))), k = y(e.zMax, Math.max(k, G(b))))))
                });
                D.forEach(function (a) {
                    var b = a[h], f = b.length;
                    d && a.getRadii(t, k, a);
                    if (0 < v) for (; f--;) if (x(b[f]) && c.dataMin <= b[f] && b[f] <= c.dataMax) {
                        var m = a.radii[f];
                        g = Math.min((b[f] - l) * C - m, g);
                        e = Math.max((b[f] - l) * C + m, e)
                    }
                });
                D.length && 0 < v && !this.isLog && (e -= b, C *= (b + Math.max(0, g) - Math.min(e, b)) / b, [["min", "userMin", g], ["max", "userMax", e]].forEach(function (a) {
                    void 0 ===
                    y(c.options[a[0]], c[a[1]]) && (c[a[0]] += a[2] / C)
                }))
            };
        ""
    });
    K(D, "parts-map/MapBubbleSeries.js", [D["parts/Globals.js"]], function (c) {
        var h = c.merge, x = c.Point, E = c.seriesType, D = c.seriesTypes;
        D.bubble && E("mapbubble", "bubble", {
            animationLimit: 500,
            tooltip: {pointFormat: "{point.name}: {point.z}"}
        }, {
            xyFromShape: !0,
            type: "mapbubble",
            pointArrayMap: ["z"],
            getMapData: D.map.prototype.getMapData,
            getBox: D.map.prototype.getBox,
            setData: D.map.prototype.setData,
            setOptions: D.map.prototype.setOptions
        }, {
            applyOptions: function (c, E) {
                return c &&
                void 0 !== c.lat && void 0 !== c.lon ? x.prototype.applyOptions.call(this, h(c, this.series.chart.fromLatLonToPoint(c)), E) : D.map.prototype.pointClass.prototype.applyOptions.call(this, c, E)
            }, isValid: function () {
                return "number" === typeof this.z
            }, ttBelow: !1
        });
        ""
    });
    K(D, "parts-map/HeatmapSeries.js", [D["parts/Globals.js"]], function (c) {
        var h = c.colorPointMixin, x = c.merge, D = c.noop, G = c.pick, B = c.Series, F = c.seriesType,
            I = c.seriesTypes;
        F("heatmap", "scatter", {
            animation: !1,
            borderWidth: 0,
            nullColor: "#f7f7f7",
            dataLabels: {
                formatter: function () {
                    return this.point.value
                },
                inside: !0, verticalAlign: "middle", crop: !1, overflow: !1, padding: 0
            },
            marker: null,
            pointRange: null,
            tooltip: {pointFormat: "{point.x}, {point.y}: {point.value}<br/>"},
            states: {hover: {halo: !1, brightness: .2}}
        }, x(c.colorSeriesMixin, {
            pointArrayMap: ["y", "value"],
            hasPointSpecificOptions: !0,
            getExtremesFromAll: !0,
            directTouch: !0,
            init: function () {
                I.scatter.prototype.init.apply(this, arguments);
                var c = this.options;
                c.pointRange = G(c.pointRange, c.colsize || 1);
                this.yAxis.axisPointRange = c.rowsize || 1
            },
            translate: function () {
                var c =
                    this.options, h = this.xAxis, t = this.yAxis, r = c.pointPadding || 0, l = function (b, a, c) {
                    return Math.min(Math.max(a, b), c)
                }, f = this.pointPlacementToXValue();
                this.generatePoints();
                this.points.forEach(function (b) {
                    var a = (c.colsize || 1) / 2, g = (c.rowsize || 1) / 2,
                        e = l(Math.round(h.len - h.translate(b.x - a, 0, 1, 0, 1, -f)), -h.len, 2 * h.len);
                    a = l(Math.round(h.len - h.translate(b.x + a, 0, 1, 0, 1, -f)), -h.len, 2 * h.len);
                    var d = l(Math.round(t.translate(b.y - g, 0, 1, 0, 1)), -t.len, 2 * t.len);
                    g = l(Math.round(t.translate(b.y + g, 0, 1, 0, 1)), -t.len, 2 * t.len);
                    var q =
                        G(b.pointPadding, r);
                    b.plotX = b.clientX = (e + a) / 2;
                    b.plotY = (d + g) / 2;
                    b.shapeType = "rect";
                    b.shapeArgs = {
                        x: Math.min(e, a) + q,
                        y: Math.min(d, g) + q,
                        width: Math.max(Math.abs(a - e) - 2 * q, 0),
                        height: Math.max(Math.abs(g - d) - 2 * q, 0)
                    }
                });
                this.translateColors()
            },
            drawPoints: function () {
                var c = this.chart.styledMode ? "css" : "animate";
                I.column.prototype.drawPoints.call(this);
                this.points.forEach(function (h) {
                    h.graphic[c](this.colorAttribs(h))
                }, this)
            },
            hasData: function () {
                return !!this.processedXData.length
            },
            getValidPoints: function (c, h) {
                return B.prototype.getValidPoints.call(this,
                    c, h, !0)
            },
            animate: D,
            getBox: D,
            drawLegendSymbol: c.LegendSymbolMixin.drawRectangle,
            alignDataLabel: I.column.prototype.alignDataLabel,
            getExtremes: function () {
                B.prototype.getExtremes.call(this, this.valueData);
                this.valueMin = this.dataMin;
                this.valueMax = this.dataMax;
                B.prototype.getExtremes.call(this)
            }
        }), c.extend({
            haloPath: function (c) {
                if (!c) return [];
                var h = this.shapeArgs;
                return ["M", h.x - c, h.y - c, "L", h.x - c, h.y + h.height + c, h.x + h.width + c, h.y + h.height + c, h.x + h.width + c, h.y - c, "Z"]
            }
        }, h));
        ""
    });
    K(D, "parts-map/GeoJSON.js", [D["parts/Globals.js"]],
        function (c) {
            function h(c, h) {
                var t, r = !1, l = c.x, f = c.y;
                c = 0;
                for (t = h.length - 1; c < h.length; t = c++) {
                    var b = h[c][1] > f;
                    var a = h[t][1] > f;
                    b !== a && l < (h[t][0] - h[c][0]) * (f - h[c][1]) / (h[t][1] - h[c][1]) + h[c][0] && (r = !r)
                }
                return r
            }

            var x = c.Chart, D = c.extend, G = c.format, B = c.merge, F = c.win, I = c.wrap;
            x.prototype.transformFromLatLon = function (h, v) {
                if (void 0 === F.proj4) return c.error(21, !1, this), {x: 0, y: null};
                h = F.proj4(v.crs, [h.lon, h.lat]);
                var t = v.cosAngle || v.rotation && Math.cos(v.rotation),
                    r = v.sinAngle || v.rotation && Math.sin(v.rotation);
                h = v.rotation ? [h[0] * t + h[1] * r, -h[0] * r + h[1] * t] : h;
                return {
                    x: ((h[0] - (v.xoffset || 0)) * (v.scale || 1) + (v.xpan || 0)) * (v.jsonres || 1) + (v.jsonmarginX || 0),
                    y: (((v.yoffset || 0) - h[1]) * (v.scale || 1) + (v.ypan || 0)) * (v.jsonres || 1) - (v.jsonmarginY || 0)
                }
            };
            x.prototype.transformToLatLon = function (h, v) {
                if (void 0 === F.proj4) c.error(21, !1, this); else {
                    h = {
                        x: ((h.x - (v.jsonmarginX || 0)) / (v.jsonres || 1) - (v.xpan || 0)) / (v.scale || 1) + (v.xoffset || 0),
                        y: ((-h.y - (v.jsonmarginY || 0)) / (v.jsonres || 1) + (v.ypan || 0)) / (v.scale || 1) + (v.yoffset || 0)
                    };
                    var t = v.cosAngle ||
                        v.rotation && Math.cos(v.rotation), r = v.sinAngle || v.rotation && Math.sin(v.rotation);
                    v = F.proj4(v.crs, "WGS84", v.rotation ? {x: h.x * t + h.y * -r, y: h.x * r + h.y * t} : h);
                    return {lat: v.y, lon: v.x}
                }
            };
            x.prototype.fromPointToLatLon = function (y) {
                var v = this.mapTransforms, t;
                if (v) {
                    for (t in v) if (Object.prototype.hasOwnProperty.call(v, t) && v[t].hitZone && h({
                        x: y.x,
                        y: -y.y
                    }, v[t].hitZone.coordinates[0])) return this.transformToLatLon(y, v[t]);
                    return this.transformToLatLon(y, v["default"])
                }
                c.error(22, !1, this)
            };
            x.prototype.fromLatLonToPoint =
                function (y) {
                    var v = this.mapTransforms, t;
                    if (!v) return c.error(22, !1, this), {x: 0, y: null};
                    for (t in v) if (Object.prototype.hasOwnProperty.call(v, t) && v[t].hitZone) {
                        var r = this.transformFromLatLon(y, v[t]);
                        if (h({x: r.x, y: -r.y}, v[t].hitZone.coordinates[0])) return r
                    }
                    return this.transformFromLatLon(y, v["default"])
                };
            c.geojson = function (c, h, t) {
                var r = [], l = [], f = function (b) {
                    var a, c = b.length;
                    l.push("M");
                    for (a = 0; a < c; a++) 1 === a && l.push("L"), l.push(b[a][0], -b[a][1])
                };
                h = h || "map";
                c.features.forEach(function (b) {
                    var a = b.geometry,
                        c = a.type;
                    a = a.coordinates;
                    b = b.properties;
                    var e;
                    l = [];
                    "map" === h || "mapbubble" === h ? ("Polygon" === c ? (a.forEach(f), l.push("Z")) : "MultiPolygon" === c && (a.forEach(function (a) {
                        a.forEach(f)
                    }), l.push("Z")), l.length && (e = {path: l})) : "mapline" === h ? ("LineString" === c ? f(a) : "MultiLineString" === c && a.forEach(f), l.length && (e = {path: l})) : "mappoint" === h && "Point" === c && (e = {
                        x: a[0],
                        y: -a[1]
                    });
                    e && r.push(D(e, {name: b.name || b.NAME, properties: b}))
                });
                t && c.copyrightShort && (t.chart.mapCredits = G(t.chart.options.credits.mapText, {geojson: c}),
                    t.chart.mapCreditsFull = G(t.chart.options.credits.mapTextFull, {geojson: c}));
                return r
            };
            I(x.prototype, "addCredits", function (c, h) {
                h = B(!0, this.options.credits, h);
                this.mapCredits && (h.href = null);
                c.call(this, h);
                this.credits && this.mapCreditsFull && this.credits.attr({title: this.mapCreditsFull})
            })
        });
    K(D, "parts-map/Map.js", [D["parts/Globals.js"]], function (c) {
        function h(c, h, l, f, b, a, g, e) {
            return ["M", c + b, h, "L", c + l - a, h, "C", c + l - a / 2, h, c + l, h + a / 2, c + l, h + a, "L", c + l, h + f - g, "C", c + l, h + f - g / 2, c + l - g / 2, h + f, c + l - g, h + f, "L", c + e, h + f,
                "C", c + e / 2, h + f, c, h + f - e / 2, c, h + f - e, "L", c, h + b, "C", c, h + b / 2, c + b / 2, h, c + b, h, "Z"]
        }

        var x = c.Chart, D = c.defaultOptions, G = c.extend, B = c.merge, F = c.pick, I = c.Renderer, y = c.SVGRenderer,
            v = c.VMLRenderer;
        G(D.lang, {zoomIn: "Zoom in", zoomOut: "Zoom out"});
        D.mapNavigation = {
            buttonOptions: {
                alignTo: "plotBox",
                align: "left",
                verticalAlign: "top",
                x: 0,
                width: 18,
                height: 18,
                padding: 5,
                style: {fontSize: "15px", fontWeight: "bold"},
                theme: {"stroke-width": 1, "text-align": "center"}
            }, buttons: {
                zoomIn: {
                    onclick: function () {
                        this.mapZoom(.5)
                    }, text: "+", y: 0
                },
                zoomOut: {
                    onclick: function () {
                        this.mapZoom(2)
                    }, text: "-", y: 28
                }
            }, mouseWheelSensitivity: 1.1
        };
        c.splitPath = function (c) {
            var h;
            c = c.replace(/([A-Za-z])/g, " $1 ");
            c = c.replace(/^\s*/, "").replace(/\s*$/, "");
            c = c.split(/[ ,]+/);
            for (h = 0; h < c.length; h++) /[a-zA-Z]/.test(c[h]) || (c[h] = parseFloat(c[h]));
            return c
        };
        c.maps = {};
        y.prototype.symbols.topbutton = function (c, r, l, f, b) {
            return h(c - 1, r - 1, l, f, b.r, b.r, 0, 0)
        };
        y.prototype.symbols.bottombutton = function (c, r, l, f, b) {
            return h(c - 1, r - 1, l, f, 0, 0, b.r, b.r)
        };
        I === v && ["topbutton", "bottombutton"].forEach(function (c) {
            v.prototype.symbols[c] =
                y.prototype.symbols[c]
        });
        c.Map = c.mapChart = function (h, r, l) {
            var f = "string" === typeof h || h.nodeName, b = arguments[f ? 1 : 0], a = b,
                g = {endOnTick: !1, visible: !1, minPadding: 0, maxPadding: 0, startOnTick: !1},
                e = c.getOptions().credits;
            var d = b.series;
            b.series = null;
            b = B({
                chart: {panning: "xy", type: "map"},
                credits: {
                    mapText: F(e.mapText, ' \u00a9 <a href="{geojson.copyrightUrl}">{geojson.copyrightShort}</a>'),
                    mapTextFull: F(e.mapTextFull, "{geojson.copyright}")
                },
                tooltip: {followTouchMove: !1},
                xAxis: g,
                yAxis: B(g, {reversed: !0})
            }, b, {
                chart: {
                    inverted: !1,
                    alignTicks: !1
                }
            });
            b.series = a.series = d;
            return f ? new x(h, b, l) : new x(b, r)
        }
    });
    K(D, "masters/modules/map.src.js", [], function () {
    });
    K(D, "masters/highmaps.src.js", [D["parts/Globals.js"]], function (c) {
        c.product = "Highmaps";
        return c
    });
    D["masters/highmaps.src.js"]._modules = D;
    return D["masters/highmaps.src.js"]
});
//# sourceMappingURL=highmaps.js.map