(self.webpackChunktradingview = self.webpackChunktradingview || []).push([
    [68208], {
        989897: t => {
            t.exports = {}
        },
        645300: t => {
            t.exports = {}
        },
        129592: (t, e, s) => {
            "use strict";
            s.d(e, {
                createGroup: () => r,
                registerWindow: () => a
            });
            var o = s(163586),
                i = s(764250);
            s(591800);
            const n = new o.ActionManager;
            n.pressedKeys(), n.keyboardPressedKeysState();

            function r(t) {
                return new i.ActionGroup(n, t)
            }

            function a(t) {
                n.listen(t)
            }
        },
        591800: (t, e, s) => {
            "use strict";
            s.d(e, {
                Modifiers: () => n,
                hashFromEvent: () => a,
                humanReadableHash: () => c,
                isMacKeyboard: () => i,
                modifiersFromEvent: () => r
            });
            var o = s(167175);
            const i = o.isMac || o.isIOS;
            var n;

            function r(t) {
                let e = 0;
                return t.shiftKey && (e += 1024), t.altKey && (e += 512), t.ctrlKey && (e += 256), t.metaKey && (e += 2048), e
            }

            function a(t) {
                return r(t) | t.keyCode
            }! function(t) {
                t[t.None = 0] = "None", t[t.Alt = 512] = "Alt", t[t.Shift = 1024] = "Shift", t[t.Mod = i ? 2048 : 256] = "Mod", t[t.Control = 256] = "Control", t[t.Meta = 2048] = "Meta"
            }(n || (n = {}));
            const l = {
                9: "⇥",
                13: "↵",
                27: "Esc",
                8: i ? "⌫" : "Backspace",
                32: "Space",
                35: "End",
                36: "Home",
                37: "←",
                38: "↑",
                39: "→",
                40: "↓",
                45: "Ins",
                46: "Del",
                188: ",",
                191: "/"
            };
            for (let t = 1; t <= 16; t++) l[t + 111] = `F${t}`;

            function c(t) {
                let e = function(t, e = !i) {
                    let s = "";
                    return 256 & t && (s += i ? "^" : "Ctrl", e && (s += " + ")), 512 & t && (s += i ? "⌥" : "Alt", e && (s += " + ")), 1024 & t && (s += i ? "⇧" : "Shift", e && (s += " + ")), 2048 & t && (s += i ? "⌘" : "Win", e && (s += " + ")), s
                }(t);
                const s = 255 & t;
                return e += s in l ? l[s] : String.fromCharCode(s), e
            }
        },
        779527: (t, e, s) => {
            "use strict";
            s.d(e, {
                getDataFromTarget: () => m,
                getTooltip: () => u,
                hideTooltip: () => g,
                setStyle: () => _,
                showTooltip: () => p
            });
            var o = s(529111),
                i = s(499994),
                n = s(604286),
                r = s(571690),
                a = s(31341),
                l = (s(586463), s(777466)),
                c = s(678515),
                h = s(638456),
                d = s(668477);

            function m(t) {
                const e = function(t) {
                        const e = t.hasAttribute("data-tooltip") ? t.getAttribute("data-tooltip") : t.getAttribute("title");
                        return e && ((0, i.setTooltipData)(t, "text", e), t.removeAttribute("title")), (0, i.getTooltipData)(t, "text") || ""
                    }(t),
                    s = t.getBoundingClientRect(),
                    o = {
                        h: s.height,
                        w: s.width,
                        x: s.left,
                        y: s.top
                    },
                    n = t.getAttribute("data-color-theme") || "",
                    r = t.classList.contains("common-tooltip-html"),
                    a = parseInt(t.getAttribute("data-tooltip-delay") || ""),
                    l = parseInt(t.getAttribute("data-tooltip-debounce") || "");
                let c = {
                    type: "none"
                };
                return e && (c = {
                    type: r ? "html" : "text",
                    data: e
                }), {
                    above: t.classList.contains("common-tooltip-above"),
                    below: t.classList.contains("common-tooltip-below"),
                    otl: t.classList.contains("common-tooltip-otl"),
                    otr: t.classList.contains("common-tooltip-otr"),
                    vertical: t.classList.contains("common-tooltip-vertical"),
                    hotkey: t.getAttribute("data-tooltip-hotkey"),
                    narrow: t.classList.contains("common-tooltip-narrow"),
                    wide: t.classList.contains("common-tooltip-wide"),
                    colorTheme: n,
                    tooltipDelay: a,
                    tooltipDebounce: l,
                    rect: o,
                    content: c,
                    target: t
                }
            }

            function u(t) {
                const e = x.cloneNode(!0),
                    s = S(e),
                    {
                        content: o
                    } = t;
                switch (o.type) {
                    case "element":
                        s.innerHTML = "", s.appendChild(o.data);
                        break;
                    case "html":
                        s.innerHTML = o.data;
                        break;
                    case "text":
                        if (t.hotkey) {
                            const t = C.cloneNode(!0);
                            t.innerText = o.data, s.appendChild(t)
                        } else s.innerText = o.data
                }
                if (t.hotkey) {
                    const e = "none" !== o.type,
                        i = N.cloneNode(!0),
                        r = (0,
                            n.hotKeyDeserialize)(t.hotkey),
                        a = r.keys.map((t => `<span class="${d["common-tooltip__hotkey-button"]}">${t}</span>`));
                    i.innerHTML = function(t, e) {
                        const s = /{\d}|{hotkey_\d}/gi;
                        return t.replace(s, (t => {
                            const s = Number(t.match(/\d/));
                            return e[s]
                        }))
                    }(r.text, a).replace(/\s\+\s/g, `<span class="${d["common-tooltip__plus-sign"]}">+</span>`), s.classList.add(d["common-tooltip__body--with-hotkey"]), e && i.classList.add(d["common-tooltip__hotkey-block--divider"]), s.appendChild(i)
                }
                return e.addEventListener("contextmenu", l.preventDefault), e
            }

            function _(t, e) {
                const s = e.rect;
                if (!s) return;
                (0, o.setTooltipColorTheme)(t, e.colorTheme || "default"), e.addClass && t.classList.add(e.addClass);
                const i = S(t),
                    n = t.querySelector(`.${d["common-tooltip__button-container"]}`);
                i.classList.toggle(d["common-tooltip__body--width_wide"], Boolean(e.wide)), i.classList.toggle(d["common-tooltip__body--no-padding"], Boolean(e.noPadding)), i.classList.toggle(d["common-tooltip__body--width_narrow"], Boolean(e.narrow)), i.classList.toggle(d["common-tooltip__body--no-buttons"], !0), i.style.left = f(0), i.style.width = f(i.clientWidth + (Boolean(e.noPadding) ? 0 : 2));
                const r = document.body.clientWidth,
                    l = h.CheckMobile.iOS() || (0, h.supportTouch)() && (0, h.isMac)() ? window.innerHeight : document.body.clientHeight,
                    m = e.vertical,
                    u = e.extendMargin || m && s.w < 20 || !m && s.h < 20;
                t.classList.toggle(d["common-tooltip--farther"], u), t.classList.toggle(d["common-tooltip--vertical"], m), t.classList.toggle(d["common-tooltip--horizontal"], !m);
                const _ = function(t) {
                        return t.querySelector(`.${d["common-tooltip__ear-holder"]}`)
                    }(t),
                    p = t.offsetHeight;
                if (m) {
                    const o = 10,
                        h = l - 10,
                        m = 12,
                        u = o + m,
                        g = h - m,
                        y = (0, c.clamp)(s.y + s.h / 2, u, g) - p / 2,
                        b = y + p;
                    t.style.left = f(s.x + s.w), t.style.top = f(y), y < o ? i.style.top = n.style.top = f(o - y) : b > h && (i.style.top = n.style.top = f(h - b));
                    const {
                        right: v
                    } = (t.querySelector(":last-child") || i).getBoundingClientRect(), x = v + 10 > r;
                    t.classList.toggle(d["common-tooltip--direction_reversed"], x), t.classList.toggle(d["common-tooltip--direction_normal"], !x);
                    let N = x ? "after" : "before";
                    (0, a.isRtl)() ? (N = e.otr ? "after" : N, N = e.otl ? "before" : N) : (N = e.otr ? "before" : N, N = e.otl ? "after" : N), _.classList.toggle(d["common-tooltip__ear-holder--before"], "before" === N), _.classList.toggle(d["common-tooltip__ear-holder--after"], "after" === N), "after" === N && (t.style.left = "auto", t.style.right = f(r - s.x))
                } else {
                    const o = s.x - (i.offsetWidth - s.w) / 2,
                        a = r - 10 - t.offsetWidth,
                        c = Math.max(10, Math.min(o, a));
                    t.style.left = f(c);
                    const h = a < o;
                    t.classList.toggle(d["common-tooltip--direction_reversed"], h), t.classList.toggle(d["common-tooltip--direction_normal"], !h);
                    const m = function(t, e, s, o) {
                        if (t.above) return w(e, o) ? "above" : "below";
                        if (t.below) return function(t, e, s) {
                            return s.y + s.h + e + 10 < t
                        }(e, s, o) ? "below" : "above";
                        return w(s, o) ? "above" : "below"
                    }(e, l, p, s);
                    "above" === m ? t.style.bottom = f(l - s.y) : t.style.top = f(s.y + s.h), _.classList.add("above" === m ? d["common-tooltip__ear-holder--above"] : d["common-tooltip__ear-holder--below"]);
                    const {
                        left: u
                    } = i.getBoundingClientRect();
                    let g = Math.trunc(s.x + s.w / 2 - (u + i.clientWidth / 2));
                    t.style.left = f(c + g), t.style.width = f(i.clientWidth + n.clientWidth), g = h ? Math.max(0, g) : Math.min(0, g),
                        n.style.left = f(-g), i.style.left = f(-g)
                }
            }

            function p(t) {
                t.classList.toggle(d["common-tooltip--hidden"], !1)
            }

            function g(t) {
                t.classList.toggle(d["common-tooltip--hidden"], !0)
            }

            function f(t) {
                return `${Math.floor(t)}px`
            }
            const y = `\n\t<div id="common-tooltip-wrapper" class="${d["common-tooltip"]}">\n\t\t<div class="${d["common-tooltip__ear-holder"]}" >\n\t\t\t<div class="${d["common-tooltip__body"]} js-tooltip-body"></div>\n\t\t</div>\n\t\t<div class="${d["common-tooltip__button-container"]}"></div>\n\t</div>\n`,
                b = `\n\t<div class="${d["common-tooltip__hotkey-block"]}"></div>\n`,
                v = `\n\t<div class="${d["common-tooltip__hotkey-text"]}"></div>\n`,
                x = (0, r.parseHtmlElement)(y),
                N = (0, r.parseHtmlElement)(b),
                C = (0, r.parseHtmlElement)(v);

            function S(t) {
                return t.querySelector(`.${d["common-tooltip__body"]}`)
            }

            function w(t, e) {
                return 10 + t < e.y
            }
        },
        604286: (t, e, s) => {
            "use strict";
            s.d(e, {
                hotKeyDeserialize: () => i
            });
            var o = s(461794);

            function i(t) {
                return JSON.parse((0, o.clean)(t, !0))
            }
        },
        600303: (t, e, s) => {
            "use strict";
            s.d(e, {
                MarketStatusIndicator: () => r
            });
            var o = s(777754),
                i = (s(989897), s(780792));
            const n = {
                classMap: {
                    invalid: "tv-market-status--invalid",
                    market: "tv-market-status--market",
                    out_of_session: "tv-market-status--out-of-session",
                    post_market: "tv-market-status--post-market",
                    pre_market: "tv-market-status--pre-market",
                    loading: "tv-market-status--loading",
                    holiday: "tv-market-status--holiday",
                    replay: "tv-market-status--replay"
                },
                classSuffix: "",
                data: {},
                extraTitle: "",
                labelMap: {
                    invalid: o.t(null, void 0, s(814177)),
                    market: o.t(null, void 0, s(486533)),
                    out_of_session: o.t(null, void 0, s(548979)),
                    post_market: o.t(null, void 0, s(566812)),
                    pre_market: o.t(null, void 0, s(845198)),
                    loading: o.t(null, void 0, s(25911)),
                    holiday: o.t(null, void 0, s(988958)),
                    replay: ""
                },
                short: !1,
                showTooltip: !0,
                tooltipType: "custom"
            };
            class r extends i.AbstractIndicator {
                constructor(t) {
                    super(t), this._quoteSessionPrefix = "market-status-indicator", this._componentClass = "tv-market-status", this._extraTitle = "", this._init(t)
                }
                setStatus(t, e) {
                    const s = {
                        values: {
                            current_session: t
                        }
                    };
                    this.update(s, e)
                }
                getTooltipText() {
                    let t = super.getTooltipText();
                    return "" === t || "" !== this._extraTitle && (t = `${t}, ${this._extraTitle}`), t
                }
                setExtraTitle(t) {
                    this._extraTitle = t
                }
                reset() {
                    this._clearClasses(), this._labelEl.textContent = "", this._extraTitle = "", this._el.setAttribute("title", ""), this._value = ""
                }
                enableShortMode(t = !0) {
                    void 0 !== this._labelEl && this._labelEl.classList.add("i-hidden"), super.enableShortMode()
                }
                disableShortMode() {
                    void 0 !== this._labelEl && this._labelEl.classList.remove("i-hidden"), super.disableShortMode()
                }
                _renderLabel() {
                    this._labelEl.textContent = this.getLabel()
                }
                _getValueFromData(t) {
                    return void 0 !== t.values && void 0 !== t.values.current_session ? t.values.current_session : this.getValue()
                }
                _render() {
                    this._renderLabelElement(), this._renderDotElement(), super._render()
                }
                _init(t) {
                    const e = Object.assign({}, n, t);
                    super._init(e), this.setExtraTitle(e.extraTitle), this._render()
                }
                _renderLabelElement() {
                    void 0 === this._labelEl && (this._labelEl = document.createElement("span"), this._labelEl.classList.add(`${this._componentClass}__label`),
                        this._labelEl.classList.add(`${this._componentClass}__label${this._classSuffix}`), this._el.appendChild(this._labelEl))
                }
                _renderDotElement() {
                    void 0 === this._dotEl && (this._dotEl = document.createElement("span"), this._dotEl.classList.add(`${this._componentClass}__dot`), this._dotEl.classList.add(`${this._componentClass}__dot${this._classSuffix}`), this._el.appendChild(this._dotEl))
                }
            }
        },
        461909: (t, e, s) => {
            "use strict";

            function o(t) {
                if (void 0 === t) return null;
                const e = t.match(/(delayed_streaming)_([\d]{1,4})/);
                return null === e ? null : {
                    mode: e[1],
                    interval: parseInt(e[2])
                }
            }

            function i(t) {
                const e = o(t.update_mode);
                return null === e || (t.update_mode = e.mode, t.update_mode_seconds = e.interval), t
            }
            s.r(e), s.d(e, {
                normalizeUpdateMode: () => i,
                parseUpdateMode: () => o
            })
        },
        799786: (t, e, s) => {
            "use strict";
            s.d(e, {
                createGroup: () => o.createGroup
            });
            var o = s(129592),
                i = s(764250),
                n = s(591800),
                r = s(345848);
            (0, o.registerWindow)(window), i.ActionGroup.setMatchedHotkeyHandler((t => {
                (0, r.trackEvent)("Keyboard Shortcuts", (0, n.humanReadableHash)(t))
            }))
        },
        287102: (t, e, s) => {
            "use strict";
            s.d(e, {
                isMcxQuoteData: () => n
            });
            var o = s(416234);

            function i(t) {
                return t === o.SymbolGroup.McxFlag
            }

            function n(t) {
                var e;
                return !!t && (i(t.symbolname) || "permission_denied" === t.status && i(null === (e = t.values) || void 0 === e ? void 0 : e.alternative))
            }
        },
        113911: (t, e, s) => {
            "use strict";

            function o(t) {
                return t.endsWith("_dly")
            }

            function i(t) {
                return !!t && (!(void 0 === t.symbolname || !o(t.symbolname)) || Boolean("permission_denied" === t.status && t.values && void 0 !== t.values.alternative && o(t.values.alternative)))
            }
            s.d(e, {
                isSfQuoteData: () => i
            })
        },
        416234: (t, e, s) => {
            "use strict";
            s.d(e, {
                SymbolGroup: () => o
            });
            s(586463);
            var o, i = s(777754);
            ! function(t) {
                t.NseFlag = "nse_free", t.McxFlag = "mcx_free"
            }(o || (o = {}));
            o.NseFlag, i.t(null, void 0, s(343857)), i.t(null, void 0, s(552666))
        },
        345848: (t, e, s) => {
            "use strict";
            s.d(e, {
                trackEvent: () => l
            });
            var o = s(251954),
                i = s(244842);
            const n = (0, s(201089).getLogger)("Common.TrackEvent"),
                r = [/Study_(Drawing)_(.*)/, /(Study)_(.*)@tv-basicstudies/, /(Study)_(.*)/, /(Chart Style) (.*)/];
            let a = !1;
            const l = (t, e, s) => {
                if (a) return;
                if (i.enabled("charting_library_base")) return void((t, e, s) => {
                    e = e || t || s || "";
                    let i = "";
                    for (let t = 0; t < r.length; t++) {
                        const s = e.match(r[t]);
                        if (s && 3 === s.length) {
                            e = s[1], i = s[2];
                            break
                        }
                    }(0, o.emit)(e.toLowerCase().replace(" ", "_"), {
                        category: t,
                        label: s,
                        value: i
                    })
                })(t, e, s);
                let l = (t ? t + ":" : "") + e;
                s && (l += " " + s), n.logNormal(l), i.enabled("widget") || !window._UNIT_TESTS && window.gtag && window.gtag("event", e, {
                    event_category: t,
                    event_label: s
                })
            };
            "undefined" != typeof window && (window.TradingView = window.TradingView || {}, window.TradingView.trackEvent = l)
        },
        182436: (t, e, s) => {
            "use strict";
            s.d(e, {
                NumericFormatter: () => n
            });
            var o = s(624444),
                i = s(960521);
            class n {
                constructor(t) {
                    this._precision = t
                }
                format(t) {
                    return (void 0 !== this._precision ? t.toFixed(this._precision) : n.formatNoE(t)).replace(".", o.formatterOptions.decimalSign)
                }
                parse(t) {
                    const e = t.replace(o.formatterOptions.decimalSign, ".");
                    let s = parseFloat(e);
                    return this._precision && (s = +s.toFixed(this._precision)), s
                }
                static formatNoE(t) {
                    if (!Number.isFinite(t)) return String(t);
                    const e = new i.Big(t);
                    return e.lt(1) ? e.toFixed() : e.toString()
                }
            }
        },
        497981: (t, e, s) => {
            "use strict";
            s.d(e, {
                PriceColorer: () => o
            });
            var o, i = s(81979),
                n = s(551238);
            ! function(t) {
                function e(t, e) {
                    return 0 === t ? e && void 0 !== e.neutral ? e.neutral : i.color.black70 : t > 0 ? e && void 0 !== e.up ? e.up : n.colorsPalette["color-success"] : e && void 0 !== e.down ? e.down : n.colorsPalette["color-danger"]
                }
                t.formatSign = e, t.formatDiff = function(t, s) {
                    return e(s - t)
                }, t.domDifference = function(t, e, s = 0, o = "", i = "") {
                    function n(t) {
                        const e = document.createElement("span");
                        return e.innerHTML = t, e
                    }
                    const r = document.createElement("div");
                    if (!s) return r.appendChild(n(t)), r;
                    const a = t + "",
                        l = e + "";
                    let c = null;
                    if (a.length === l.length) {
                        for (let t = 0; t < a.length; t++)
                            if (a.charAt(t) !== l.charAt(t)) {
                                c = t;
                                break
                            }
                    } else c = Number("0");
                    if (null === c) return r.appendChild(n(a)), r;
                    const h = n(a.substring(0, c)),
                        d = document.createElement("span");
                    return d.className = s < 0 ? o : i, d.appendChild(n(a.substring(c))), r.appendChild(h), r.appendChild(d), r
                }
            }(o || (o = {}))
        },
        503344: (t, e, s) => {
            "use strict";
            s.d(e, {
                makeSymbolPageUrl: () => m,
                makeTemplateSymbolUrl: () => h
            });
            var o = s(42398),
                i = s(258621),
                n = s(691239),
                r = (s(889267), s(519073));

            function a(t) {
                const e = {
                    shortName: t.shortName,
                    exchange: t.exchange,
                    proName: t.proName,
                    type: t.type
                };
                return t.proName && t.proName.includes(":") && ([e.exchange, e.shortName] = t.proName.split(":")), e
            }

            function l(t, e) {
                const s = encodeURIComponent(e.shortName || ""),
                    o = encodeURIComponent(e.exchange || ""),
                    i = encodeURIComponent(e.proName || "");
                return t.replace("{tvexchange}", o).replace("{tvsymbol}", s).replace("{tvprosymbol}", i)
            }

            function c(t, e = "") {
                const s = ["UKOIL", "USOIL", "XAGAUD", "XAGCAD", "XAGCHF", "XAGEUR", "XAGGBP", "XAGHKD", "XAGJPY", "XAGUSD", "XAUAUD", "XAUCAD", "XAUCHF", "XAUEUR", "XAUGBP", "XAUHKD", "XAUJPY", "XAUNZD", "XAUUSD", "XPDUSD", "XPTUSD", "SPX"];
                return void 0 === t.shortName && void 0 === t.proName ? (console.warn("Params missed"), "/") : u(t) ? t.exchange ? "/symbols/{tvsymbol}/?exchange={tvexchange}" : `/symbols/{tvsymbol}/${e}` : t.exchange || t.proName ? t.shortName && s.includes(t.shortName) ? `/symbols/{tvsymbol}/${e}` : `/symbols/{tvexchange}-{tvsymbol}/${e}` : `/symbols/{tvsymbol}/${e}`
            }

            function h(t, e) {
                let s = t;
                if (!/{tvsymbol}|{tvexchange}|{tvprosymbol}/.test(t)) {
                    let o = "tvprosymbol";
                    void 0 === e.proName && (o = "tvsymbol"), s = `${t}?tvwidgetsymbol={${o}}`
                }
                const o = l(s, a(e));
                if (!(0, n.isSafeUrl)(o)) throw new Error(`The symbol URL ${o} is not allowed.`);
                return o
            }

            function d(t, e, s, n) {
                const r = (window.locale_domains ? (0, i.determineBaseUrl)(window.locale_domains, n) : window.location.origin) + l(t, a(e));
                return s ? (0, o.addUtmToUrl)(r, s) : r
            }

            function m(t, e, s, o) {
                return d(c(t, o), t, e, s)
            }

            function u(t) {
                const {
                    type: e = "",
                    typespecs: s = []
                } = t, o = "forex" === e, i = (0, r.hasCryptoTypespec)(s);
                return o || i || (0, r.isCommodity)(e, s)
            }
        },
        327034: (t, e, s) => {
            "use strict";
            s.d(e, {
                QuoteTicker: () => v
            });
            var o = s(329806),
                i = s(201089),
                n = s(389137),
                r = s(541346),
                a = s(497981),
                l = s(624444),
                c = s(943994),
                h = s(600303),
                d = s(719240),
                m = s(665570),
                u = s(876332),
                _ = s(287102),
                p = s(113911);
            const g = (0, i.getLogger)("QuoteTicker"),
                f = {
                    addDescriptionTitle: !0,
                    changeDirectionDownClass: "down",
                    changeDirectionUpClass: "up",
                    changeDirectionNeutralClass: "neutral",
                    changeInBrackets: !1,
                    changePercentInBrackets: !1,
                    lastPriceTimeInBrackets: !0,
                    rtcTimeInBrackets: !0,
                    clientName: "quote-ticker",
                    dontDyePrice: !1,
                    fallingBg: null,
                    growingBg: null,
                    lastFallingClass: "falling",
                    lastGrowingClass: "growing",
                    quoteSession: null,
                    signNegative: !0,
                    signPositive: !1,
                    customPriceFormatter: null,
                    customTimeFormatter: null,
                    sessionStatusClassSuffix: "--for-ticker",
                    dataModeClassSuffix: "--for-ticker",
                    showInvalidSymbolStatus: !1,
                    indicatorsTooltipType: "custom",
                    lastPriceLastCharSup: !1,
                    lastPriceHighlightDiffOnly: !1,
                    initedHook: void 0,
                    setStateHook: void 0,
                    permissionDeniedHook: void 0,
                    noSuchSymbolHook: void 0
                },
                y = String.fromCharCode(8198),
                b = /[K,M,B]/;

            function v(t, e, s = {}) {
                this.enabled = !0, this._symbol = t, this._symbolOriginal = null, this._options = (0, o.deepExtend)({}, f, s), !1 !== this._options.signNegative && !0 !== this._options.signNegative && delete this._options.signNegative, s.customPriceFormatter && (this._customPriceFormatter = s.customPriceFormatter), s.customTimeFormatter && (void 0 !== s.customTimeFormatter.lastPrice || void 0 !== s.customTimeFormatter.rtc ? this._timeFormatter = s.customTimeFormatter : this._timeFormatter = {
                    lastPrice: s.customPriceFormatter,
                    rtc: s.customPriceFormatter
                }), this._percentFormatter = new r.PercentageFormatter, this._defaultPriceFormatter = new l.PriceFormatter(100), this._priceFormatter = this._customPriceFormatter || this._defaultPriceFormatter, this._volumeFormatter = new c.VolumeFormatter(2), this._cache = {}, this._lastPrice = null, this._lastPriceFormatted = "", this._elements = {}, this._textNodes = {}, this._changeVolumeLetter = this._getChangeVolumeLetterCallback(), this._setElements(e), this._highlighters = {}, this._initHighlighters(), this._options.setStateHook && this.setStateHook(this._options.setStateHook), this.quoteSession = this._options.quoteSession || (0, u.getQuoteSessionInstance)("simple"), this._quoteSessionEventHandler = this.onData.bind(this), this._connectTimeoutId = setTimeout(this.connect.bind(this), 0)
            }

            function x(t) {
                const e = t.search(b),
                    s = e >= 0 ? `${y}${t.slice(e)}` : "";
                return [e > 0 ? t.substring(e, 0) : 0 === e ? "" : t, s]
            }

            function N(t, e, s, o, i) {
                var n, r = null;

                function a() {
                    if (n && (clearTimeout(n), n = void 0), s || e)
                        for (var r = 0; r < t.length; r++) t[r].style.background = "";
                    if (!s || !e)
                        for (r = 0; r < t.length; r++) o && t[r].classList.remove(o), i && t[r].classList.remove(i)
                }
                return {
                    show: function(l) {
                        var c = 0;
                        if (l !== r) {
                            if (null !== r && null !== l && (c = l - r), a(), n = setTimeout(a, 750), 0 < c) {
                                if (e)
                                    for (var h = 0; h < t.length; h++) t[h].style.background = e;
                                else if (o)
                                    for (h = 0; h < t.length; h++) t[h].classList.add(o)
                            } else if (c < 0)
                                if (s)
                                    for (h = 0; h < t.length; h++) t[h].style.background = s;
                                else if (i)
                                for (h = 0; h < t.length; h++) t[h].classList.add(i);
                            null !== l && (r = l)
                        }
                    },
                    hide: a
                }
            }
            v.prototype._setElements = function(t) {
                this._container = t, this._elements.change = this._findElements(t, ["js-symbol-change", "symbol-change"]), this._elements.changeDirection = this._findElements(t, ["js-symbol-change-direction", "symbol-change-direction"]), this._elements.extHrsChangeDirection = this._findElements(t, ["js-symbol-ext-hrs-change-direction"]), this._elements.changePercent = this._findElements(t, ["js-symbol-change-pt", "symbol-change-pt"]), this._elements.description = this._findElements(t, ["js-symbol-description-name", "symbol-description-name"]),
                    this._elements.extHrsChange = this._findElements(t, "js-symbol-ext-hrs-change"), this._elements.extHrsChangePercent = this._findElements(t, "js-symbol-ext-hrs-change-pt"), this._elements.extHrsClose = this._findElements(t, "js-symbol-ext-hrs-close"), this._elements.industry = this._findElements(t, ["js-symbol-industry", "symbol-industry"]), this._elements.last = this._findElements(t, ["js-symbol-last", "symbol-last"]), this._elements.sector = this._findElements(t, ["js-symbol-sector", "symbol-sector"]), this._elements.sessionStatus = this._findElements(t, "js-symbol-session-status"), this._elements.shortName = this._findElements(t, ["js-symbol-short-name", "symbol-short-name"]), this._elements.updateMode = this._findElements(t, "js-data-mode"), this._elements.updateMode.forEach((t => t.classList.add("i-hidden"))), this._textNodes.change = this._getOrCreateTextNodes(this._elements.change), this._textNodes.changePercent = this._getOrCreateTextNodes(this._elements.changePercent), this._textNodes.extHrsChange = this._getOrCreateTextNodes(this._elements.extHrsChange), this._textNodes.extHrsChangePercent = this._getOrCreateTextNodes(this._elements.extHrsChangePercent), this._textNodes.extHrsClose = this._getOrCreateTextNodes(this._elements.extHrsClose), this._textNodes.last = this._getOrCreateTextNodes(this._elements.last), this._textNodes.open = this._findTextNodes(t, "js-symbol-open"), this._textNodes.eps = this._findTextNodes(t, "js-symbol-eps"), this._textNodes.marketCap = this._findTextNodes(t, "js-symbol-market-cap"), this._textNodes.prevClose = this._findTextNodes(t, "js-symbol-prev-close"), this._textNodes.dividends = this._findTextNodes(t, "js-symbol-dividends"), this._textNodes.priceEarnings = this._findTextNodes(t, "js-symbol-pe"), this._textNodes.volume = this._findTextNodes(t, "js-symbol-volume"), this._textNodes.high = this._findTextNodes(t, "js-symbol-high"), this._textNodes.low = this._findTextNodes(t, "js-symbol-low"), this._textNodes.currency = this._findTextNodes(t, "js-symbol-currency"), this._textNodes.lastPriceTime = this._findTextNodes(t, "js-symbol-lp-time"), this._textNodes.rtcTime = this._findTextNodes(t, "js-symbol-rtc-time"), this._elements.lastHighlight = this._options.lastPriceHighlightDiffOnly ? this._elements.last.map((t => this._appendAndGetNewElement(t, "span"))) : this._elements.last, this._textNodes.lastHighlight = this._getOrCreateTextNodes(this._elements.lastHighlight), this._elements.lastSup = this._options.lastPriceLastCharSup ? this._elements.lastHighlight.map((t => this._appendAndGetNewElement(t, "sup"))) : [], this._textNodes.lastSup = this._getOrCreateTextNodes(this._elements.lastSup)
            }, v.prototype._findElements = function(t, e) {
                var s = (0, n.isArray)(e) ? e : [e];
                return Array.prototype.concat.apply([], s.map((e => Array.prototype.slice.call(t.getElementsByClassName(e)))))
            }, v.prototype._findTextNodes = function(t, e) {
                return this._getOrCreateTextNodes(this._findElements(t, e))
            }, v.prototype._getOrCreateTextNodes = function(t) {
                return t.map((t => {
                    var e = this._getFirstTextNode(t);
                    return e || (e = t.ownerDocument.createTextNode(""), t.appendChild(e)), e
                }))
            }, v.prototype._appendAndGetNewElement = function(t, e) {
                const s = document.createElement(e);
                return t.appendChild(s), s
            }, v.prototype._getFirstTextNode = function(t) {
                for (var e = t.childNodes, s = e.length - 1; s >= 0; s--)
                    if (3 === e.item(s).nodeType) return e.item(s);
                return null
            }, v.prototype.connect = function(t) {
                this._subscribed || (this._subscribedSymbol = t || this._symbol, this.quoteSession.subscribe(this._options.clientName, this._subscribedSymbol, this._quoteSessionEventHandler), this._subscribed = !0)
            }, v.prototype.disconnect = function() {
                clearTimeout(this._connectTimeoutId), this._subscribed && (this.quoteSession.unsubscribe(this._options.clientName, this._subscribedSymbol, this._quoteSessionEventHandler), this._subscribed = !1)
            }, v.prototype.onData = function(t, e) {
                this.enabled && ("ok" === t.status ? this.successData(t, e) : "permission_denied" === t.status ? this.onPermissionDenied(t) : "error" === t.status && this.errorData(t))
            }, v.prototype.successData = function(t, e) {
                t.values && this.setState(t.values, t, e)
            }, v.prototype.onPermissionDenied = function(t) {
                (0, p.isSfQuoteData)(t) || (0, _.isMcxQuoteData)(t) ? this._options.permissionDeniedHook ? this._options.permissionDeniedHook(t, this._symbolOriginal || this._symbol) : this.errorData(t): this.downgradeData(t)
            }, v.prototype.errorData = function(t) {
                this._options.showInvalidSymbolStatus && (this.setShortName(this._symbol), this._elements.sessionStatus.map((t => new h.MarketStatusIndicator({
                    classSuffix: this._options.sessionStatusClassSuffix,
                    el: t,
                    data: {
                        values: {
                            current_session: "invalid"
                        }
                    },
                    tooltipType: this._options.indicatorsTooltipType
                })))), this._options.noSuchSymbolHook ? (this._symbolOriginal && this.setShortName(this._symbolOriginal), this._options.noSuchSymbolHook.call(this, t, this._symbolOriginal || this._symbol)) : g.logWarn("No data for: " + this._symbol)
            }, v.prototype.downgradeData = function(t) {
                {
                    const e = t && t.values && t.values.alternative,
                        s = this._symbol === e;
                    if (!(e && -1 !== e.indexOf(":")) || s) return void this.errorData(t);
                    this._symbolOriginal = this._symbol, this._symbol = e, this._subscribed = !1, this.connect()
                }
            }, v.prototype.setState = function(t, e, s) {
                const o = s.values;
                this._isVolumeFormat = "volume" === t.format, null == o.pricescale && null == o.minmov && null == o.fractional && null == o.minmove2 || (this._priceFormatter = this._customPriceFormatter || this._isVolumeFormat && this._volumeFormatter || new l.PriceFormatter(t.pricescale || 100, t.minmov || 1, t.fractional, t.minmove2));
                const i = this._options,
                    n = this._percentFormatter,
                    r = this._priceFormatter,
                    a = this._defaultPriceFormatter,
                    u = this._volumeFormatter;
                o.timezone && this._timeFormatter && (this._timeFormatter.lastPrice && this._timeFormatter.lastPrice.setTimezone(o.timezone), this._timeFormatter.rtc && this._timeFormatter.rtc.setTimezone(o.timezone));
                const _ = (t, e = !0) => e ? `(${t})` : t,
                    p = void 0 !== i.signPositiveChange ? i.signPositiveChange : i.signPositive,
                    f = t => {
                        const e = r.format(t, p, void 0, i.signNegative);
                        return _(e, i.changeInBrackets)
                    },
                    y = t => {
                        const e = n.format(t, p, void 0, i.signNegative);
                        return _(e, i.changePercentInBrackets)
                    },
                    b = r.format.bind(r),
                    v = a.format.bind(a),
                    x = u.format.bind(u),
                    N = t => null == t ? c.PLACE_HOLDER : v(t);
                i.disableChange || (this._setNodesValue(this._textNodes.change, o.change, f), this._setNodesValue(this._textNodes.changePercent, o.change_percent, y),
                    null != o.change && (i.dontDyePrice || this._setChangeFontColor([].concat(this._elements.change, this._elements.changePercent), o.change, i.changeUpFontColor, i.changeDownFontColor, i.changeNeutralFontColor), this._setChangeDirection(this._elements.changeDirection, o.change)), this._setNodesValue(this._textNodes.extHrsChange, o.rch, f), this._setNodesValue(this._textNodes.extHrsChangePercent, o.rchp, y), null != o.rch && (i.dontDyePrice || this._setChangeFontColor([].concat(this._elements.extHrsChange, this._elements.extHrsChangePercent), o.rch, i.changeUpFontColor, i.changeDownFontColor, i.changeNeutralFontColor), this._setChangeDirection(this._elements.extHrsChangeDirection, o.rch))), this._setNodesValue(this._textNodes.prevClose, o.prev_close_price, b), this._setNodesValue(this._textNodes.dividends, t.dividends_yield, (t => null == t ? c.PLACE_HOLDER : n.format(t, i.signPositive, void 0, i.signNegative)), !0);
                let C = (0, m.getTranslatedSymbolDescription)(o);
                if (C && (C = this._prepareSymbolDescription(C), this._setTextsContent(this._elements.description, C), this._options.addDescriptionTitle))
                    for (var S = 0; S < this._elements.description.length; S++) this._elements.description[S].setAttribute("title", C);
                if ((null != o.short_name || null != o.exchange) && t.short_name) {
                    var w = t.short_name;
                    "QUANDL" === t.exchange && void 0 !== t.short_name.split("/")[1] && (w = t.short_name.split("/")[1] + ", " + t.short_name.split("/")[0]), this.setShortName(w)
                }
                this._setLastValue(o.last_price, b), this._setNodesValue(this._textNodes.extHrsClose, o.rtc, b), o.rtc && this._highlighters.extHrsClose.show(o.rtc), o.industry && this._setTextsContent(this._elements.industry, t.industry, (t => t)), o.sector && this._setTextsContent(this._elements.sector, t.sector), this._elements.sessionStatus && o.current_session && (this._sessionStatusInstances ? this._sessionStatusInstances.forEach((t => t.setStatus(o.current_session))) : this._sessionStatusInstances = this._elements.sessionStatus.map((e => new h.MarketStatusIndicator({
                    classSuffix: this._options.sessionStatusClassSuffix,
                    el: e,
                    short: !0,
                    data: {
                        values: o
                    },
                    quoteSession: this.quoteSession,
                    symbol: t.original_name,
                    manualUpdate: !0,
                    tooltipType: this._options.indicatorsTooltipType
                })))), this._setNodesValue(this._textNodes.open, o.open_price, b), this._setNodesValue(this._textNodes.high, o.high_price, b), this._setNodesValue(this._textNodes.low, o.low_price, b), this._setNodesValue(this._textNodes.eps, t.earnings_per_share_basic_ttm, N, !0), this._setNodesValue(this._textNodes.priceEarnings, t.price_earnings_ttm, N, !0), this._setNodesValue(this._textNodes.marketCap, t.market_cap_basic, x, !0), this._setNodesValue(this._textNodes.volume, t.volume, x, !0);
                const T = o.currency_code || o.value_unit_id;
                if (T && this._setNodesValue(this._textNodes.currency, "PCT" === T ? "%" : T, null, !0), (o.lp_time || o.timezone && t.lp_time) && this._textNodes.lastPriceTime.length && (this._timeFormatter && this._timeFormatter.lastPrice ? this._setNodesValue(this._textNodes.lastPriceTime, _(this._timeFormatter.lastPrice.format(t.lp_time), this._options.lastPriceTimeInBrackets)) : g.logError("last price time field requested with no formatter provided")),
                    (o.rtc_time || o.timezone && t.rtc_time) && this._textNodes.rtcTime.length && (this._timeFormatter && this._timeFormatter.rtc ? this._setNodesValue(this._textNodes.rtcTime, _(this._timeFormatter.rtc.format(t.rtc_time), this._options.rtcTimeInBrackets)) : g.logError("rtc time field requested with no formatter provided")), null != o.last_price)
                    for (S = 0; S < this._elements.updateMode.length; S++) this._elements.updateMode[S].classList.remove("i-hidden");
                this._elements.updateMode && (o.update_mode || o.update_mode_seconds) && (this._updateModeInstances ? this._updateModeInstances.forEach((e => e.update({
                    values: t
                }))) : this._updateModeInstances = this._elements.updateMode.map((e => new d.DataModeIndicator({
                    classSuffix: this._options.dataModeClassSuffix,
                    el: e,
                    data: {
                        values: t
                    },
                    modeInterval: t.update_mode_seconds,
                    short: !0,
                    tooltipType: this._options.indicatorsTooltipType
                })))), this._setStateHook && this._setStateHook(e.values, s.values, e.complete), this._lastPrice ? this._highlighters.last.show(t.last_price) : null === this._lastPrice && (this._container.classList.add("quote-ticker-inited"), "function" == typeof this._options.initedHook && this._options.initedHook("last_price" in t)), this._lastPrice = t.last_price
            }, v.prototype._setNodesValue = function(t, e, s, o) {
                if (null != e || o)
                    for (var i = "function" == typeof s ? s(e) : e, n = 0; n < t.length; n++) t[n].nodeValue = i
            }, v.prototype._setTextsContent = function(t, e, s) {
                if (t && t.length && e)
                    for (var o = "function" == typeof s ? s(e) : e, i = 0; i < t.length; i++) t[i].textContent = o
            }, v.prototype._setLastValue = function(t, e) {
                if (null == t) return;
                const s = "function" == typeof e ? e(t) : String(t);
                if (s === this._lastPriceFormatted) return;
                const [o, i, n] = this._options.lastPriceHighlightDiffOnly ? this._getLastValueStringDiff(this._lastPriceFormatted, s) : ["", s, ""], r = o, [a, l] = this._options.lastPriceLastCharSup ? [i.slice(0, -1), i.slice(-1)] : [i, ""];
                this._options.lastPriceHighlightDiffOnly && (this._isVolumeFormat && this._changeVolumeLetter.call(this, n), this._setNodesValue(this._textNodes.last, r)), this._setNodesValue(this._textNodes.lastHighlight, a), this._setNodesValue(this._textNodes.lastSup, l), this._lastPriceFormatted = s
            }, v.prototype._getChangeVolumeLetterCallback = function() {
                let t;
                return function(e) {
                    e !== t && (t = e, this._elements.last.forEach((e => {
                        3 !== e.childNodes.length ? e.appendChild(document.createTextNode(t)) : e.childNodes[2].nodeValue = t
                    })))
                }
            }, v.prototype._getLastValueStringDiff = function(t, e) {
                if (t === e) {
                    const [t, s] = x(e);
                    return [t, "", s]
                }
                let s = 0;
                for (; t[s] === e[s];) s++;
                const [o, i] = x(e.slice(s));
                return [e.slice(0, s), o, i]
            }, v.prototype._setChangeFontColor = function(t, e, s, o, i) {
                for (var n = a.PriceColorer.formatSign(e, {
                        up: s,
                        down: o,
                        neutral: i
                    }), r = 0; r < t.length; r++) t[r].style.color = n
            }, v.prototype._setChangeDirection = function(t, e) {
                for (var s = 0; s < t.length; s++) {
                    var o = t[s].classList;
                    o.toggle(this._options.changeDirectionUpClass, e > 0), o.toggle(this._options.changeDirectionDownClass, e < 0), o.toggle(this._options.changeDirectionNeutralClass, 0 === e)
                }
            }, v.prototype.setShortName = function(t = "") {
                this._setTextsContent(this._elements.shortName, t)
            }, v.prototype._prepareSymbolDescription = function(t) {
                var e = this._getCache("symbol-description:" + t);
                return e || (e = t,
                    this._setCache("symbol-description:" + t, e), e)
            }, v.prototype._initHighlighters = function() {
                this._highlighters.last = new N(this._elements.lastHighlight, this._options.growingBg, this._options.fallingBg, this._options.lastGrowingClass, this._options.lastFallingClass), this._highlighters.extHrsClose = new N(this._elements.extHrsClose, this._options.growingBg, this._options.fallingBg, this._options.lastGrowingClass, this._options.lastFallingClass)
            }, v.prototype.disable = function() {
                this.enabled = !1, this.disconnect()
            }, v.prototype.enable = function() {
                this.enabled = !0, this.connect()
            }, v.prototype.setStateHook = function(t) {
                null === t && this._setStateHook ? delete this._setStateHook : "function" == typeof t && (this._setStateHook = t)
            }, v.prototype._setCache = function(t, e) {
                null == e ? delete this._cache[t] : this._cache[t] = e
            }, v.prototype._getCache = function(t) {
                return this._cache && this._cache[t]
            }
        },
        665570: (t, e, s) => {
            "use strict";
            s.d(e, {
                getTranslatedSymbolDescription: () => n
            });
            var o = s(777754);

            function i(t) {
                const e = `#${t}-symbol-description`,
                    i = o.t(e, void 0, s(118562));
                return i === e ? null : i
            }

            function n(t) {
                if (void 0 !== t.pro_name) {
                    const e = i(t.pro_name);
                    if (null !== e) return e;
                    if (void 0 !== t.short_name) {
                        const e = i(t.short_name);
                        if (null !== e) return e
                    }
                }
                return "en" !== t.language && void 0 !== t.local_description && t.language === window.language || "en" === t.language && void 0 !== t.local_description && t.language === window.language ? t.local_description : t.description || ""
            }
        }
    }
]);